RNN————循环神经网络
RNN————循环神经网络(Recurrent Neural Network)
在零时刻通常使用零向量来初始化\(a^{<0>}\)
Teddy Roosevelt was a great President.
Teddy bears are on sale!
如果只给定前三个单词,是不可能确切地知道Teddy是否是人名的一部分,所以在某一时刻的预测需要该时刻之后的输入信息,因此需要双向循环神经网络
。
RNN的计算:
RNN前向传播示意图:
损失函数:
计算每个时间步的损失函数,再将所有的损失函数都加起来
RNN 反向传播示意图:
RNN的不同结构:
多对一:情感分类(对一句话进行1~5的类别分类)
一对多:音乐生成
多对多:
输入与输出长度相等:上面的例子
输入与输出的长度不等:机器翻译(英语与法语一句话的长度不同,但是表达的意思是一样的)
使用RNN生成语言模型
例子:Cats average 15 hours of sleep a day.
1.首先在句子的结尾加上\(<EOS>\)标志表示句子的结尾。
2.其次将句子中的单词使用one—hot向量
进行表示,并与自己的语料数据库进行比对,如果句子中存在单词是语料库中没有的,那么将这个词使用UNK
进行替换。
3.开始建立RNN模型。
开始的第一个输入\(x^{<1>}\)为零向量,而按照之前介绍的普通的初始化方法,\(a^{<0>}\)也为一个零向量,于是\(a^{<1>}\)要做的就是它会通过 softmax 进行一些预测来 计算出第一个词可能会是什么
,其结果就是\(\widehat{y}^{<1>}\),这一步其实就是通过一个 softmax 层来预测字典中的任意单词会是第一个词的概率,比如说第一个词是𝑎的概率 有多少,第一个词是 Aaron 的概率有多少,第一个词是 cats 的概率又有多少,就这样一直到 Zulu 是第一个词的概率是多少,还有第一个词是 UNK(未知词)的概率有多少,还有第一个词是句子结尾标志的概率有多少,表示不必阅读.
之后RNN进入下个时间步,在下一时间步中,仍然使用激活项\(a{<1>}\),在这步要做的是 计算出第二个词会是什么。现在我们依然传给它正确的第一个词,我们会告诉它第一个词就是Cats,也就是\(\widehat{y}^{<1>}\),这也是\(y^{<1>}=x^{<2>}\)的原因。然后在第二个时间步中,输出结果同样经过 softmax 层进行预测,RNN 的职责就是 预测这些词的概率(下图编号 3 所示),而不会去管结果是什么,可能是 b 或者 arron,可能是 Cats 或者 Zulu 或者 UNK(未知词)或者 EOS 或者其他词,它只会考虑之前得到的词。
以此类推,RNN中的每一步都会考虑前面得到的单词,接下来为了训练这个网络,我们要定义代价函数
。如果在某个时间步t真正的词是\(y^{<t>}\),而softmax函数预测的结果是\(\widehat{y}^{<t>}\),那么softmax的损失函数就是\(L(\widehat{y}^{<t>},y^{<t>})\),也就是把所有单个预测的损失函数都相加起来。
最后该句子的概率就是句子中所有预测的单词出现的机率的乘积。
对新序列采样
在你训练一个序列模型之后,要想了解到这个模型学到了什么
,一种非正式的方法就是进行一次新序列采样
,来看看到底应该怎么做。
同样还是在\(x^{<1>}\)使用零向量,将第一个预测值输入\(x^{<2>}\),直到出现\(<EOS>\)标志或者达到你固定的步数。每次预测出的单词进行随机的选取。
这就是你如何从你的 RNN 语言模型中生成一个随机选择的句子。
循环神经网络的梯度消失
例如
The cat, which already ate ……, was full.
The cats, which ate ……, were full.
单数后面要用was,复数后面要用were,也就是说前面的词语对后面的词语有影响,而且后面的词语对前面的词语也有一定的影响
。但是当模型很深的时候,在进行后向传播的时候,后面的输出误差很难影响到前面层的计算,也就是说很难让一个神经网络能够意识到它要记住看到的是单数名词还是复数名词,然后在序列后面生成依赖单复数形式的 was 或者 were。
于是我们知道RNN不擅长处理长期依赖
的问题。
GRU门控循环单元(Gated Recurrent Unit(GRU))
原来的RNN隐藏层单元的可视化呈现:
记忆细胞
在GRU单元当中,会有个新的变量称为𝑐,代表细胞(cell),即记忆细胞,在时间t的时候,有记忆细胞\(c^{<t>}\)。而GRU实际上输出了激活值\(a^{<t>}\),即\(c^{<t>}=a^{<t>}\)
候选值重写记忆细胞
在GRU单元中,每个时间步,我们将用一个候选值重写记忆细胞
,即\(\widetilde{c}^{<t>}\)的值,它成为一个候选值来替代\(c^{<t>}\)的值。之后使用tanh激活函数来计算:
更新门思想
在GRU中的重点是一个门的思想,这么门暂且称为\(\digamma_u\),这个\(\digamma_u\)的值在0到1之间:
其中\(\sigma\)表示为sigmoid激活函数,当值为很大负数的时候,结果为0.
门\(\digamma_u\)的作用就是用来决定你什么时候来更新记忆细胞
\(c^{<t>}\)。假设当\(\digamma_u\)为1的时候表示进行更新,而为0的时候表示不更新,那么记忆细胞的计算公式就变为:
当门\(\digamma_u\)为0的时候,\(c^{<t>}\)的值一直为\(c^{<t-1>}\),仍然是旧值没有发生改变;当门\(\digamma_u\)为1的时候,\(c^{<t>}\)的值变为\(\widetilde{c}^{<t>}\),表示进行值的更新。
具体步骤
1.首先GRU输入\(c^{<t-1>}\)并假设它等于\(a^{<t-1>}\)。
2.输入\(x^{<t>}\),将\(c^{<t-1>}\)与\(x^{<t>}\)用合适的权值进行结合,来计算\(\widetilde{c}^{<t>}\):
3.再用一个不同的参数集,通过sigmoid激活函数算出更新门\(\digamma_u\):
4.对记忆细胞进行值的更新(如果设定同上面门部分的表述的话就是\(c^{<t>}=\digamma_u*\widetilde{c}^{<t>}+(1-\digamma_u)*c^{<t-1>}\))
相关门思想
在计算记忆细胞的新候选值的时候加上一个新的项:相关门\(\digamma_r\),这个相关门的作用就是告诉候选值\(\widetilde{c}^{<t>}\)与\(c^{<t-1>}\)之间有多大的相关性
。
计算这个相关门需要新的参数矩阵\(W_r\),计算公式为:
因此在步骤的第二步,计算\(\widetilde{c}^{<t>}\)的时候公式变为:
长短期记忆(LSTM)
在LSTM中,\(c^{<t>}\)不再等于\(a^{<t>}\),也没有相关门。
LSTM 前向传播图
双向循环神经网络(Bidirectional RNN)
有正向的\(a^{<1>}、a^{<2>}、a^{<3>}\)和反向的\(a^{<1>}、a^{<2>}、a^{<3>}\)
深层循环神经网络(Deep RNNs)
往往深度为数层,但不会达到100层。而且图中1号位置可能还会扩展相应的深度模型
(但不再是有时间序列的模型)用来更好的预测\(y^{<1>}\)的内容。