深度学习之循环神经网络
前言
卷积神经网络CNN在图象处理领域起到了重要的作用,在自然语言处理中还要看循环神经网络RNN,RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息.
为什么要发明循环神经网络
我们先来看一个NLP很常见的问题,命名实体识别,举个例子,现在有两句话:
-
第一句话:I like eating apple!(我喜欢吃苹果!)
-
第二句话:The Apple is a great company!(苹果真是一家很棒的公司!)
现在的任务是要给apple打Label,我们都知道第一个apple是一种水果,第二个apple是苹果公司,假设我们现在有大量的已经标记好的数据以供训练模型,当我们使用全连接的神经网络时,我们做法是把apple这个单词的特征向量输入到我们的模型中(如下图),在输出结果时,让我们的label里,正确的label概率最大,来训练模型,但我们的语料库中,有的apple的label是水果,有的label是公司,这将导致,模型在训练的过程中,预测的准确程度,取决于训练集中哪个label多一些,这样的模型对于我们来说完全没有作用。
问题就出在了我们没有结合上下文去训练模型,而是单独的在训练apple这个单词的label,这也是全连接神经网络模型所不能做到的,于是就有了我们的循环神经网络。
序列特性
上下文即序列特性,就是符合时间顺序,逻辑顺序,或者其他顺序就叫序列特性,举几个例子:
- 拿人类的某句话来说,也就是人类的自然语言,是不是符合某个逻辑或规则的字词拼凑排列起来的,这就是符合序列特性。
- 语音,我们发出的声音,每一帧每一帧的衔接起来,才凑成了我们听到的话,这也具有序列特性、
- 股票,随着时间的推移,会产生具有顺序的一系列数字,这些数字也是具有序列特性
循环神经网络
如下左图则为RNN,其中X是一个向量,也就是某个字或词的特征向量,作为输入层;U是输入层到隐藏层的参数矩阵;S是隐藏层的向量;V是隐藏层到输出层的参数矩阵;O是输出层的向量;不要管W,只看X,U,S,V,O就是我们的全连接神经网络结构.
W到底是什么?把左边的图按照时间线展开得到右边的图.
举个例子,有一句话是,I love you.上图中的
- x t − 1 x_{t-1} xt−1 代表的就是I这个单词的向量,
- x t x_{t} xt 代表的是love这个单词的向量,
- x t + 1 x_{t+1} xt+1 代表的是you这个单词的向量
W一直没有变,W其实是每个时间点之间的权重矩阵
RNN之所以可以解决序列问题,是因为它可以记住每一时刻的信息,每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定.公式如下
其中 O t O_t Ot代表t时刻的输出, S t S_t St代表t时刻的隐藏层的值.值得注意的一点是,在整个训练过程中,每一时刻所用的都是同样的W.
举个例子,方便理解
假设现在我们已经训练好了一个RNN,如图,我们假设每个单词的特征向量是二维的,也就是输入层的维度是二维,且隐藏层也假设是二维,输出也假设是二维,所有权重的值都为1且没有偏差且所有激活函数都是线性函数,现在输入一个序列,到该模型中,我们来一步步求解出输出序列:
初始时 a 1 a_1 a1, a 2 a_2 a2是没有存值的,因此初始值为0





至此,一个完整的RNN结构我们已经经历了一遍,我们注意到,每一时刻的输出结果都与上一时刻的输入有着非常大的关系,如果我们将输入序列换个顺序,那么我们得到的结果也将是截然不同,这就是RNN的特性,可以处理序列数据,同时对序列也很敏感。
RNN梯度消失
假设在t=3时刻,损失函数为 L 3 = 1 2 ( Y 3 − O 3 ) 2 L_3={1 \over 2}(Y_3-O_3)^2 L3=21(Y3−O3)2
激活函数tanh导数小于1,即k时刻距离t时刻越远,则影响越小.对与“中华人民共和国”等长词的识别是很不利的
LSTM
残差网络的思路是一种解决梯度消失的方法.但在循环网络中有些词受前面影响,有些又不受前面影响.所以是一种动态残差.LSTM是RNN的一种变体,.有挑选的能力的RNN.其结构如下
对比RNN的公式 y t = O t , w ′ = V , h t = S t y_t=O_t,w'=V,h^t=S_t yt=Ot,w′=V,ht=St你会发现LSTM主是相同的.区别在

其中 Z 是最为普通的输入,可以从上图中看到, Z 是通过该时刻的输入 X t X_t Xt 和上一时刻存的隐藏层信息 h t − 1 h_{t-1} ht−1 向量拼接,再与权重参数向量 W 点积,得到的值经过激活函数tanh最终会得到一个数值,也就是 Z ,注意只有 Z 的激活函数是tanh,因为 Z 是真正作为输入的,其他三个都是门控装置 Z i , Z f , Z o Z_i,Z_f,Z_o Zi,Zf,Zo都是在0到1之间的数值,1表示该门完全打开,0表示该门完全关闭.
Seq2Seq
目前Seq2Seq模型在机器翻译,语音识别,文本摘要,问答系统等领域取得了巨大的成功。
Seq2Seq其实就是Encoder-Decoder结构的网络,它的输入是一个序列,输出也是一个序列
如图所示,Encoder和Decoder一般都是RNN,通常为LSTM或者GRU,图中每一个方格都为一个RNN单元。
- embedding: 将词映射到向量空间
- projection:将向量映射到对应的词 (图中没展示, 应在welcome等输出词之前)
Encoder
- 欢迎/来/北京”这些词转换成词向量,也就是Embedding,我们用 v i v_i vi来表示
- 上一时刻的隐状态 h i − 1 h_{i-1} hi−1按照时间顺序进行输入,每一个时刻输出一个隐状态 h i h_i hi , 即用函数 f f f 表达RNN隐藏层的变换 h i = f ( h i − 1 , v i ) h_i=f(h_{i-1}, v_i) hi=f(hi−1,vi)
- 假设有t个词,最终通过Encoder自定义函数 q q q,将各时刻的隐状态变换为向量 c c c: c = q ( h 0 , h 1 , . . . , h t ) c=q(h_0,h_1,...,h_t) c=q(h0,h1,...,ht)
这个 c c c 就相当于从“欢迎/来/北京”这几个单词中提炼出来的大概意思一样,包含了这句话的含义。
Decoder
- 每一时刻的输入为Eecoder输出的 c c c和Decoder上一时刻的隐状态的输出 s i − 1 s_{i-1} si−1,还有前一时刻预测的词的向量 E i − 1 E_{i-1} Ei−1
E 0 E_0 E0:图中输入的词向量为“_GO”的词向量,标志着解码的开始
- 我们可以用函数 g g g表达解码器隐藏层变换: s i = g ( c , s i − 1 , E i − 1 ) s_i=g(c,s_{i-1}, E_{i-1}) si=g(c,si−1,Ei−1)
直到解码解出“_EOS”,标志着解码的结束 - 再通过projection过程(图中没展示), 将预测的词的向量映射到对应的词
Teacher Forcing
在基础的模型中,Decoder的每一次解码又会作为下一次解码的输入[free running],这样就会导致一个问题就是错误累计,如果其中一个RNN单元解码出现误差了,那么这个误差就会传递到下一个RNN单元,使训练结果误差越来越大。这个时候,如果我们能够在每一步的预测时,让老师来指导一下,即提示一下上一个词的正确答案,decoder就可以快速步入正轨,训练过程也可以更快收敛。因此大家把这种方法称为teacher forcing。所以,这种操作的目的就是为了使得训练过程更容易。即在训练过程中,使用要解码的序列作为输入(替换 E i E_i Ei)进行训练
但是训练时完全依靠老师来指导一下, 则无法完全评估预测时没了“老师的指导”能力.因此可采用「计划采样」(scheduled sampling ) 即设置一个概率p,每一步,以概率p靠自己上一步的输入来预测,以概率1-p根据老师的提示来预测
Seq2Seq的损失函数
Seq2Seq使用交叉熵作为损失函数(详情见附录), 当使用一个词向量一个词向量的方式预测时,即真实 X X X只有一只有一种情况即 n = 1 , y 1 = 1 n=1,y_1=1 n=1,y1=1, 得出损失函数为 L o s s = − l o g P ( y ^ ) Loss = -logP(\hat{y}) Loss=−logP(y^)
总体的损失函数
其中T代表Decoder有多少步,[EOS]代表‘end of sentence’这个特殊标记.
附录
信息量
信息量的基本想法是:一个不太可能发生的事件居然发生了,我们收到的信息要多于一个非常可能发生的事情发生。用一个例子来理解一下,假设我们收到了如下两条消息:
- A:今天早上太阳升起
- B:今天早上有日食
我们认为消息 A 的信息量是如此之少,甚至于没有必要发送,而消息 B 的信息量就很丰富。
利用这个例子,我们来细化一下信息量的基本想法:
- 非常可能发生的事件信息量比较少,在极端情况下,确保能够发生的事件应该没有信息量;
- 不太可能发生的事件有更高的信息量。事件包含的信息量应与其发生的概率负相关

熵
熵来对整个事件的平均信息量进行描述.即可理解为求上述信息量函数关于概率分布 P P P 的期望:
交叉熵
真实概率分布为 P ( X ) P(X) P(X), 但我们在处理实际问题, 使用了一个近似的分布 Q ( X ) Q(X) Q(X) 来进行拟合,此时传达信息所需的信息量为:
KL散度(相对熵)
KL散度(Kullback-Leibler Divergence)描述的就是当我们用 Q ( X ) Q(X) Q(X) 来拟合 P ( X ) P(X) P(X) 时,传递信息所需的额外的信息量,公式也很简单,用交叉熵减去熵即可
交叉熵损失函数

假设真实分布为 Y Y Y,网络输出的分布为 Y ^ \hat{Y} Y^ ,总的类别数为 n,则在这种情况下,交叉熵损失函数的计算方法为:交叉熵损失函数的计算方法为:
主要参考
《史上最详细循环神经网络讲解》
《从反向传播推导到梯度消失and爆炸的原因及解决方案》
《人人都能看懂的LSTM》
《人人都能看懂的GRU》
《简说Seq2Seq原理及实现》
《清晰理解 Seq2seq》
《交叉熵损失函数(Cross Entropy Loss)》
更多推荐



所有评论(0)