深度学习之LSTM篇

CSDN数学公式显示真烦人,已排好版见我的网站 —> 循环神经网络

RNN

1. 基本结构

$NLP$ 问题中,通常句子都是由 $n$ 个词组成,可看做一串序列,$RNN$ 正是可以处理序列类型数据的深度学习模型。如下图所示,$RNN$ 由多个相同的神经网络单元,即图中的方块,连接而成,输入可看做一句话的每个单词,上一个单元的计算结果传递给下一个单元。经过串行计算后,每一个单元总是包含有之前所有单元的一些信息。

[latex]t[/latex] 时刻网络单元的计算包括两个元素,[latex]t-1[/latex] 时刻的输出 [latex]h_{t-1}[/latex] 和 [latex]t[/latex] 时刻的输入 [latex]x_{t}[/latex] 。计算后的结果 [latex] h_{t} [/latex] 则传递给下一个单元,作为 [latex]t+1[/latex] 时刻的一个输入。假设输入序列为 [latex]x_{1},x_{2},x_{3},…,x_{n}[/latex] ,对应的中间状态为 [latex] h_{1},h_{2},h_{3},…,h_{n} [/latex] ,输出为 [latex] y_{1},y_{2},y_{3},…,y_{n} [/latex] 。

计算过程为:

h t = f ( U x t + W h t − 1 + b ) y t = S o f t m a x ( V h t + c ) \begin{aligned} h_{t} = f(Ux_{t} + Wh_{t-1} + b) \\ y_{t} = Softmax(Vh_{t} + c) \end{aligned} ht=f(Uxt+Wht1+b)yt=Softmax(Vht+c)

其中,(U,W,V,b,c) 为需要更新的参数,激活函数 ( f ) 一般为 (tanh) 函数。

2. 其他结构

Many to One

当处理文本分类时,输入是一个文本序列,而输出可能只是一个类别,那么只需要对最后一个中间状态做计算并输出结果就可以了。如下图所示:

计算过程:

h t = f ( U x t + W h t − 1 + b ) y = S o f t m a x ( V h 4 + c ) \begin{aligned} h_{t} = f(Ux_{t} + Wh_{t-1} + b) \\ y = Softmax(Vh_{4} + c) \end{aligned} ht=f(Uxt+Wht1+b)y=Softmax(Vh4+c)

One to Many

当处理 Image Caption 任务时,输入可能是一个向量,输出则是一个文本序列,如下图所示:
计算过程: $$ \begin{aligned} h_{t} = f(Ux + Wh_{t-1} + b) \\ y_{t} = Softmax(Vh_{t} + c) \end{aligned} $$

Many to Many

当处理机器翻译时,输入一串文本序列,输出一串文本序列。如下图所示:

该模型称为 Sequence to Sequence 模型,又称为 Encoder-Decoder 模型。

3. 梯度消失(爆炸)

假设有三个时间段的 \(RNN\) 模型,如下图所示:

前向传播:

h 1 = f ( W h 0 + U x 1 ) a m p ; y 1 = g ( V h 1 ) h 2 = f ( W h 1 + U x 2 ) a m p ; y 2 = g ( V h 2 ) h 3 = f ( W h 2 + U x 3 ) a m p ; y 3 = g ( V h 3 ) \begin{array}{ll} {h_{1}=f\left(W h_{0}+U x_{1}\right)} & {y_{1}=g\left(V h_{1}\right)} \\ {h_{2}=f\left(W h_{1}+U x_{2}\right)} & {y_{2}=g\left(V h_{2}\right)} \\ {h_{3}=f\left(W h_{2}+U x_{3}\right)} & {y_{3}=g\left(V h_{3}\right)} \end{array} h1=f(Wh0+Ux1)h2=f(Wh1+Ux2)h3=f(Wh2+Ux3)amp;y1=g(Vh1)amp;y2=g(Vh2)amp;y3=g(Vh3)

(t_3) 时刻的损失函数为 (L_3),对共享参数 (W、U、V) 求导:

∂ L 3 ∂ V = ∂ L 3 ∂ y 3 ∂ L 3 ∂ V ∂ L 3 ∂ U = ∂ L 3 ∂ y 3 ∂ L 3 ∂ h 3 ∂ h 3 ∂ U + ∂ L 3 ∂ y 3 ∂ L 3 ∂ h 3 ∂ h 2 ∂ U + ∂ L 3 ∂ y 3 ∂ L 3 ∂ h 3 ∂ h 3 ∂ h 1 ∂ h 1 ∂ U = ∑ i = 1 t ∂ L t ∂ y t ∂ L t ∂ h t ( ∏ j = i + 1 t ∂ h j ∂ h j − 1 ) ∂ h j ∂ U ∂ L 3 ∂ W = ∂ L 3 ∂ y 3 ∂ L 3 ∂ h 3 ∂ h 3 ∂ W + ∂ L 3 ∂ y 3 ∂ L 3 ∂ h 3 ∂ h 3 ∂ h 3 ∂ L 3 ∂ h 3 ∂ h 3 ∂ h 1 ∂ h 1 ∂ W = ∑ i = 1 t ∂ L t ∂ y t ∂ L t ∂ h t ( ∏ j = i + 1 t ∂ h j ∂ h j − 1 ) ∂ h j ∂ W \begin{array}{c} {\frac{\partial L_{3}}{\partial V}=\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial V}} \\ {\frac{\partial L_{3}}{\partial U}=\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial U}+\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{2}}{\partial U}+\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{1}} \frac{\partial h_{1}}{\partial U}=\sum_{i=1}^{t} \frac{\partial L_{t}}{\partial y_{t}} \frac{\partial L_{t}}{\partial h_{t}}\left(\prod_{j=i+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}\right) \frac{\partial h_{j}}{\partial U}} \\ {\frac{\partial L_{3}}{\partial W}=\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial W}+\frac{\partial L_{3}}{\partial y_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{3}} \frac{\partial L_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{1}} \frac{\partial h_{1}}{\partial W}=\sum_{i=1}^{t} \frac{\partial L_{t}}{\partial y_{t}} \frac{\partial L_{t}}{\partial h_{t}}\left(\prod_{j=i+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}\right) \frac{\partial h_{j}}{\partial W}} \end{array} VL3=y3L3VL3UL3=y3L3h3L3Uh3+y3L3h3L3Uh2+y3L3h3L3h1h3Uh1=i=1tytLthtLt(j=i+1thj1hj)UhjWL3=y3L3h3L3Wh3+y3L3h3L3h3h3h3L3h1h3Wh1=i=1tytLthtLt(j=i+1thj1hj)Whj

可见,共享参数 (W、U) 的每次求导计算会涉及到整个序列。而 RNN 的神经单元只有一个 (tanh) 激活函数,如下图所示:

即:
a m p ; h j = tanh ⁡ ( W h j − 1 + U x x ) a m p ; ∑ j = i + 1 t ∂ h j ∂ h j − 1 = ∑ j = i + 1 t W tanh ⁡ ′ \begin{aligned}& h_{j}=\tanh \left(W h_{j-1}+U x_{x}\right)\\ &\sum_{j=i+1}^{t} \frac{\partial h_{j}}{\partial h_{j-1}}=\sum_{j=i+1}^{t} W \tanh ^{\prime} \end{aligned} amp;hj=tanh(Whj1+Uxx)amp;j=i+1thj1hj=j=i+1tWtanh

反向传播求导过程会包含每一步求导的连乘,假如参数 (W) 也是一个比较小的数 (0.02) ,当 (t) 很大时,上式就会趋于零,(RNN) 的梯度就会消失。反之,会梯度爆炸。

LSTM

1. 长期依赖问题

若梯度消失,那么最前面的输入所蕴含的信息就无法传达到后面。比如要推测 I grew up in France… I speak fluent French. 的最后一个词 French 。那么肯定就要知道很靠前的 France 这个词的信息,但是它们相互相隔非常远,有可能获取不到,如下图所示:

2. 基本结构

和 \(RNN\) 的神经网络单元不同的是,\(LSTM\) 每个单元输的出包括两部分:\(C_t\) 和 \(h_t\) ,同时引入了遗忘门、输入门和输出门。

单元状态 (C_{t−1}) 通过累加的方式记录了 (t) 时刻需要保存的信息,作用在整个神经单元,因此可以长距离传输信息,如下图所示:

遗忘门

遗忘门用来丢弃上一时刻 \(C_{t−1}\) 的部分信息,上一时刻的隐状态 \(h_{t−1}\) 和当前时刻的输入 \(x_t\) 通过一个 \(sigmoid\) 层,输出 \(f_t\) 介于 \(0\) 到 \(1\) 之间,\(1\) 代表信息全部保留,\(0\) 代表全部丢弃。

输入门

  • 为了更新单元状态 $C_t$ ,将 $h_{t−1}$ 和 $x_t$ 传递给 $sigmoid$ 函数,输出 $i_t$ 同样介于 $0$ 到 $1$ 之间,决定将更新临时单元状态中的哪些值。
  • 为了协调神经单元,将 $h_{t−1}$ 和 $x_t$ 传递给 $tanh$ 函数,输出的临时单元状态 $C_t$ 介于 $-1$ 到 $1$ 之间。
  • 将 $i_t$ 和 $C_t$ 逐点相乘。

单元状态

  • 将 $C_{t−1}$ 与 $f_t$ 逐点相乘,和接近 $0$ 的值相乘,表示该词的作用不太大,会逐渐被遗忘;反之,该词的权重会变大,表示比较重要。
  • 将结果和输入门的输出逐点相加,将单词的向量加加减减,更新为新的值,构成当前时刻神经单元的所有信息 $C_t$ 。

输出门

  • 将 $h_{t−1}$ 和 $x_t$ 传递给 $sigmoid$ 函数,输出 $o_t$ 同样介于 $0$ 到 $1$ 之间,决定 $C_t$ 的哪些部分需要输出。
  • 将 $C_t$ 传递给 $tanh$ 函数,与 $o_t$ 逐点相乘得到输出,该输出作为当前隐状态 $h_t$ 参与下一个神经单元进行计算。

References

Understanding LSTM Networks

The Unreasonable Effectiveness of Recurrent Neural Networks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值