RNN————循环神经网络(Recurrent Neural Network)
文章目录
在零时刻通常使用零向量来初始化 a < 0 > a^{<0>} a<0>
Teddy Roosevelt was a great President.
Teddy bears are on sale!
如果只给定前三个单词,是不可能确切地知道Teddy是否是人名的一部分,所以在某一时刻的预测需要该时刻之后的输入信息,因此需要双向循环神经网络
。
RNN的计算:
激 活 项 : a < t > = g 1 ( W a a a < t − 1 > + W a x x < t > + b a ) y ^ < t > = g 2 ( W y a a < t > + b y ) 激活项:a^{<t>}=g_1(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a)\\ \hat{y}^{<t>}=g_2(W_{ya}a^{<t>}+b_y) 激活项:a<t>=g1(Waaa<t−1>+Waxx<t>+ba)y^<t>=g2(Wyaa<t>+by)
RNN前向传播示意图:
损失函数:
计算每个时间步的损失函数,再将所有的损失函数都加起来
RNN 反向传播示意图:
RNN的不同结构:
多对一:情感分类(对一句话进行1~5的类别分类)
一对多:音乐生成
多对多:
输入与输出长度相等:上面的例子
输入与输出的长度不等:机器翻译(英语与法语一句话的长度不同,但是表达的意思是一样的)
使用RNN生成语言模型
例子:Cats average 15 hours of sleep a day.
1.首先在句子的结尾加上 < E O S > <EOS> <EOS>标志表示句子的结尾。
2.其次将句子中的单词使用one—hot向量
进行表示,并与自己的语料数据库进行比对,如果句子中存在单词是语料库中没有的,那么将这个词使用UNK
进行替换。
3.开始建立RNN模型。
开始的第一个输入 x < 1 > x^{<1>} x<1>为零向量,而按照之前介绍的普通的初始化方法, a < 0 > a^{<0>} a<0>也为一个零向量,于是 a < 1 > a^{<1>} a<1>要做的就是它会通过 softmax 进行一些预测来 计算出第一个词可能会是什么
,其结果就是 y ^ < 1 > \widehat{y}^{<1>} y
<1>,这一步其实就是通过一个 softmax 层来预测字典中的任意单词会是第一个词的概率,比如说第一个词是𝑎的概率 有多少,第一个词是 Aaron 的概率有多少,第一个词是 cats 的概率又有多少,就这样一直到 Zulu 是第一个词的概率是多少,还有第一个词是 UNK(未知词)的概率有多少,还有第一个词是句子结尾标志的概率有多少,表示不必阅读.
之后RNN进入下个时间步,在下一时间步中,仍然使用激活项 a < 1 > a{<1>} a<1>,在这步要做的是 计算出第二个词会是什么。现在我们依然传给它正确的第一个词,我们会告诉它第一个词就是Cats,也就是 y ^ < 1 > \widehat{y}^{<1>} y <1>,这也是** y < 1 > = x < 2 > y^{<1>}=x^{<2>} y<1>=x<2>**的原因。然后在第二个时间步中,输出结果同样经过 softmax 层进行预测,RNN 的职责就是 预测这些词的概率(下图编号 3 所示),而不会去管结果是什么,可能是 b 或者 arron,可能是 Cats 或者 Zulu 或者 UNK(未知词)或者 EOS 或者其他词,它只会考虑之前得到的词。
以此类推,RNN中的每一步都会考虑前面得到的单词,接下来为了训练这个网络,我们要定义代价函数
。如果在某个时间步t真正的词是 y < t > y^{<t>} y<t>,而softmax函数预测的结果是 y ^ < t > \widehat{y}^{<t>} y
<t>,那么softmax的损失函数就是 L ( y ^ < t > , y < t > ) L(\widehat{y}^{<t>},y^{<t>}) L(y
<t>,y<t>