自学内容网 自学内容网

深度学习基础—序列采样

引言

深度学习基础—循环神经网络(RNN)icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143417972?fromshare=blogdetail&sharetype=blogdetail&sharerId=143417972&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

深度学习基础—语言模型和序列生成icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143418185?fromshare=blogdetail&sharetype=blogdetail&sharerId=143418185&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

        当训练了一个序列模型后,如果我想要了解模型学习到的内容,就需要进行序列采样,序列采样最终会得到一个生成的序列,我们就可以知道模型学到的内容。

1.基于词汇的RNN模型的序列采样

        假设我们已经训练好了一个序列模型,序列采样和训练RNN不同的是:输入的数据不同,训练RNN我们要在每一个时间步输入这个时间步对应的词向量;序列采样在每一个时间步输入的是上一个时间步预测的结果。

        在第1个时间步,输入a0=0和x1=0,则第1个时间步可能会输出一个经过softmax层的概率向量,向量的每个元素表示是词典中某个词的概率,我们可以对概率向量随机采样,比如使用Python中numpy库的np.random.choice语句,获得一个词,这个词就是采样的第一个词。

        在第2个时间步,就把上一个时间步的输出y1作为输入,即x2=y1,然后经过softmax层,对y2进行采样。比如第1个时间步的采样结果是“The”,那么就把这个词输入到第2个时间步,让RNN在“The”的基础上预测下一个词是什么,依次类推。

        如何知道一个句子是否结束?如果词典中有EOS标识(结尾标志),那么就可以采样直到遇到这个符号,就意味着句子结束。如果没有这个词,那就预设时间步,让其达到预设的时间步就算结束。

        注意:采样过程中可能遇到UNK标识,如果不在意这样的结果可以忽视。如果在意这样的结果,那就认为此次采样无效,重新采样直到不再遇到UNK标识。

        上述序列采样是在词汇字典的RNN网络基础上,实际中我们也可能用到基于字符字典的RNN网络,那如何进行序列采样呢?

2.基于字符的RNN模型的序列采样

        基于字符的RNN模型采用的字典是字符表,比如26个字母大小写和一些标点符号组成。如下图所示:

        如果对这样的RNN进行序列采样,那么我们每一个时间步的输入不再是词,而是字符。比如“Cats average 15 hours of sleep a day.”这样的序列,y1就是C,y2就是a,y3就是t等等。

        基于字符的RNN模型的优点是:不用担心出现UNK这样的未知符号。缺点是:最终的输出将是非常长的序列,因为一个英文句子的序列可能只有10-20个词,但是拆成字符将会很多。并且因为序列过长,句子前后相距较远的词之间的依赖关系很难捕捉,训练成本高。


原文地址:https://blog.csdn.net/sniper_fandc/article/details/143457214

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!