引言
深度学习基础—循环神经网络(RNN)https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshare=blogdetail&sharetype=blogdetail&sharerId=143417972&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
深度学习基础—语言模型和序列生成https://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个词,但是拆成字符将会很多。并且因为序列过长,句子前后相距较远的词之间的依赖关系很难捕捉,训练成本高。