引言
深度学习基础—循环神经网络(RNN)https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshare=blogdetail&sharetype=blogdetail&sharerId=143417972&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
上篇文章,我们介绍了RNN的基本结构,本篇博客,我们就来一起看一下语言模型和序列生成,这是对RNN的一个基本应用。
1.语言模型
在NLP中,构建语言模型是最重要最基础的工作之一,什么是语言模型?简而言之语言模型就是预测一个特定的句子出现的概率是多少。
比如语音识别系统,我们听到一个人说了一个句子,“the apple and pear(pair) salad was delicious.”,所以那个人究竟说了什么?是 “the apple and pair salad”,还是“the apple and pear salad”?(pear和pair是近音词)。一个语音识别模型可能算出第一句话的概率是10^(-13),而第二句话的概率是10^(-10),比较这两个概率值,显然那个人说的是第二句话,因为第二句话的概率比第一句高出1000倍。
2.序列生成
假设训练集有一句话:“Cats average 15 hours of sleep a day.”(猫一天睡15小时),将这个句子序列化,先建立一个字典,然后将每个单词都转换成对应的one-hot向量,也就是字典中的索引。
可能某些场景我们需要定义句子的结尾,一般的做法就是增加一个额外的标记EOS(上图编号1所示),表示句子的结尾。如果想要模型能够准确识别句子结尾的话,EOS标记可以被附加到训练集中每一个句子的结尾。如果加了EOS标记,这句话就会有9个输入:有8个词和一个EOS标记(忽略标点符号)。
如果训练集中有一些词并不在字典里,比如“The Egyptian Mau is a bread of cat.”,其中有一个词Mau并不是字典中的词,在这种情况下,可以把Mau替换成UNK标志,代表未知词。然后只针对UNK建立概率模型,而不是针对这个具体的词Mau(就是所有没有出现在字典中的词都识别为UNK)。
构建语言模型的核心就是让模型在已经学习到某些词的基础上预测其他的词出现的概率。在第0个时间步,输入激活值a0和x1,其中x1=0向量(因为此时模型还未学到任何词,它要做的事就是针对词典每个词,预测第一个词是Cats的概率),最终会得到第一个词是Cats。在第1个时间步,由于已经预测出第一个词是Cats,因此我们令x2=y1,即输入x2=Cats和激活值a1,最终第1个时间步得到的结果应该是average,以此类推。最后一个时间步中,我们需要把上一时间步的正确结果输入,并希望预测结果为EOS。
定义代价函数:
总损失等于每一个时间步的预测损失求和,每一时间步的损失等于softmax层预测结果之和(长度为词典的长度)。
3.概率计算
如果用很大的训练集来训练这个RNN,可以通过一系列开头单词像是Cars average 15或Cars average 15 hours of来预测之后单词的概率。比如现在有一个新句子,它是y1 y2 y3,现在要计算出整个句子中各个单词的概率:
第一个softmax层会告诉我们y1的概率为p(y1),然后第二个softmax层会告诉我们考虑y1出现的情况下的概率为p(y2|y1),然后第三个softmax层告诉我们考虑y1和y2出现的情况下的概率p(y3|y1,y2),把这三个概率相乘,最后得到这个含3个词的整个句子的概率。
这个概率计算公式也是语言模型背后的概率原理,即在已经学习到某些词(已经发生的事件)的基础上预测其他词(还未发生的事件的可能)。