从循环神经网络(RNN)到LSTM网络

通常,数据的存在形式有语音、文本、图像、视频等。因为我的研究方向主要是图像识别,所以很少用有“记忆性”的深度网络。怀着对循环神经网络的兴趣,在看懂了有关它的理论后,我又看了Github上提供的tensorflow实现,觉得收获很大,故在这里把我的理解记录下来,也希望对大家能有所帮助。本文将主要介绍RNN相关的理论,并引出LSTM网络结构(关于对tensorflow实现细节的理解,有时间的话,在下一篇博文中做介绍)。

循环神经网络

RNN,也称作循环神经网络(还有一种深度网络,称作递归神经网络,读者要区别对待)。因为这种网络有“记忆性”,所以主要是应用在自然语言处理(NLP)和语音领域。与传统的Neural network不同,RNN能利用上"序列信息"。从理论上讲,它可以利用任意长序列的信息,但由于该网络结构存在“消失梯度”问题,所以在实际应用中,它只能回溯利用与它接近的time steps上的信息。

1. 网络结构

常见的神经网络结构有卷积网络、循环网络和递归网络,栈式自编码器和玻尔兹曼机也可以看做是特殊的卷积网络,区别是它们的损失函数定义成均方误差函数。递归网络类似于数据结构中的树形结构,且其每层之间会有共享参数。而最为常用的循环神经网络,它的每层的结构相同,且每层之间参数完全共享。RNN的缩略图和展开图如下,

尽管RNN的网络结构看上去与常见的前馈网络不同,但是它的展开图中信息流向也是确定的,没有环流,所以也属于forward network,故也可以使用反向传播(back propagation)算法来求解参数的梯度。另外,在RNN网络中,可以有单输入、多输入、单输出、多输出,视具体任务而定。

2. 损失函数

在输出层为二分类或者softmax多分类的深度网络中,代价函数通常选择交叉熵(cross entropy)损失函数,前面的博文中证明过,在分类问题中,交叉熵函数的本质就是似然损失函数。尽管RNN的网络结构与分类网络不同,但是损失函数也是有相似之处的。
  假设我们采用RNN网络构建“语言模型”,“语言模型”其实就是看“一句话说出来是不是顺口”,可以应用在机器翻译、语音识别领域,从若干候选结果中挑一个更加靠谱的结果。通常每个sentence长度不一样,每一个word作为一个训练样例,一个sentence作为一个Minibatch,记sentence的长度为T。为了更好地理解语言模型中损失函数的定义形式,这里做一些推导,根据全概率公式,则一句话是“自然化的语句”的概率为 p ( w 1 , w 2 , . . . , w T ) = p ( w 1 ) × p ( w 2 ∣ w 1 ) × . . . × p ( w T ∣ w 1 , w 2 , . . . , w T − 1 ) p(w_{1}, w_{2}, ..., w_{T})=p(w_{1})\times p(w_{2}|w_{1})\times ...\times p(w_{T}|w_{1},w_{2},...,w_{T-1}) p(w1,w2,...,wT)=p(w1)×p(w2w1)×...×p(wTw1,w2,...,wT1)  所以语言模型的目标就是最大化 P ( w 1 , w 2 , . . . , w T ) P(w_{1}, w_{2}, ..., w_{T}) P(w1,w2,...,wT)。而损失函数通常为最小化问题,所以可以定义 L o s s ( w 1 , w 2 , . . . , w T ∣ θ ) = − l o g P ( w 1 , w 2 , . . . , w T ∣ θ ) Loss(w_{1}, w_{2},...,w_{T}|\theta )=-logP(w_{1}, w_{2},...,w_{T}|\theta) Loss(w1,w2,...,wTθ)=logP(w1,w2,...,wTθ)  那么公式展开可得 L o s s ( w 1 , w 2 , . . . , w T ∣ θ ) = − ( l o g p ( w 1 ) + l o g p ( w 2 ∣ w 1 ) + . . . + l o g p ( w T ∣ w 1 , w 2 , . . . , w T − 1 ) ) Loss(w_{1}, w_{2},...,w_{T}|\theta )=-(logp(w_{1})+logp(w_{2}|w_{1})+ ...+logp(w_{T}|w_{1},w_{2},...,w_{T-1})) Loss(w1,w2,...,wTθ)=(logp(w1)+logp(w2w1)+...+logp(wTw1,w2,...,wT1))  展开式中的每一项为一个softmax分类模型,类别数为所采用的词库大小(vocabulary size),相信大家此刻应该就明白了,为什么使用RNN网络解决语言模型时,输入序列和输出序列错了一个位置了。

3. 梯度求解

在训练任何深度网络模型时,求解损失函数关于模型参数的梯度,应该算是最为核心的一步了。在RNN模型训练时,采用的是BPTT(back propagation through time)算法,这个算法其实实质上就是朴素的BP算法,也是采用的“链式法则”求解参数梯度,唯一的不同在于每一个time step上参数共享。从数学的角度来讲,BP算法就是一个单变量求导过程,而BPTT算法就是一个复合函数求导过程。接下来以损失函数展开式中的第3项为例,推导其关于网络参数U、W、V的梯度表达式(总损失的梯度则是各项相加的过程而已)。
  为了简化符号表示,记 E 3 = − l o g p ( w 3 ∣ w 1 , w 2 ) E_{3}=-logp(w_{3}|w_{1},w_{2}) E3=logp(w3w1,w2),则根据RNN的展开图可得,

(1) s 3 = t a n h ( U × x 3 + W × s 2 ) ;     s 2 = t a n h ( U × x 2 + W × s 1 ) s 1 = t a n h ( U × x 1 + W × s 0 ) ;     s 0 = t a n h ( U × x 0 + W × s − 1 ) s_{3}=tanh(U\times x_{3}+W\times s_{2});  s_{2}=tanh(U\times x_{2}+W\times s_{1})\\ s_{1}=tanh(U\times x_{1}+W\times s_{0});  s_{0}=tanh(U\times x_{0}+W\times s_{-1}) \\\tag{1} s3=tanh(U×x3+W×s2)  s2=tanh(U×x2+W×s1)s1=tanh(U×x1+W×s0)  s0=tanh(U×x0+W×s1)(1)

所以,

(2) ∂ s 3 W = ∂ s 3 W 1 + ∂ s 3 ∂ s 2 × ∂ s 2 W ∂ s 2 W = ∂ s 2 W 1 + ∂ s 2 ∂ s 1 × ∂ s 1 W ∂ s 1 W = ∂ s 1 W 0 + ∂ s 1 ∂ s 0 × ∂ s 0 W

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值