LSTM 和RNN

原始的RNN被设计为用于处理序列数据,但是由于他保留了每一个时间步的信息,使得其存在梯度消失和爆炸的困难而训练困难。
LSTM(Long Short-Term Memory )长短期记忆网络。一开始用于解决RNN结构中梯度消失问题而提出来的。其他解决梯度消失问题的方案有二阶优化算法Martens, James,RNN权重的正则化Pascanu,小心设计RNN参数的初始化Sutskever,梯度爆炸的问题可以通过直接对梯度的范数设置一个限制来解决Pascanu ,Mikolov。消失的梯度问题不仅会让梯度自身很小,同时会使得RNNs更容易学习短期的依赖而不是长期的。

LSTM设计了输入门(i),遗忘门(f),输出门(o)消除或者增加细胞状态的能力,最终使得LSTM具有记忆长期信息的能力。
要真正理解lstm在做什么需要理解这三个门的工作。
lstm
i,f,o都是sigmoid函数运算,取值范围在0,1之间。
遗忘门: f t f_t ft 门对上一层 h t − 1 h_{t-1} ht1(上一时刻)的输出和本层的输入 x t x_t xt 序列作用,实际上也就是在进行这样的sigmoid运算 f t = σ ( W i f x t + b i f + W h f h t − 1 + b h f ) f_t=\sigma (W_{if} x_t +b_{if} + W_{hf} h_{t-1} +b_{hf}) ft=σ(Wifxt+bif+Whfht1+bhf) ,输出的值可以作为被遗忘的概率。因为 f t f_t ft 会和上一层的状态 c t − 1 c_{t-1} ct1 进行元素之间的点乘,以sigmoid函数的两个极限取值来看,1表示完全保留,0表示完全舍弃,用来表示对信息的取舍,可导,比阶越函数好。

输入门:输入门也类似,是对上一层 h t − 1 h_{t-1} ht1的输出和本层的输入 x t x_t xt 序列作用,有选择性的更新本细胞状态的值。即 i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i ) i_t = \sigma (W_{ii} x_t +b_{ii} + W_{hi} h_{t-1} +b_{hi}) it=σ(Wiixt+bii+Whiht1+bhi)

输出门:输出门是同样使用sigmoid激活函数得到【0,1】之间的值,可以理解为控制该层的信息有多少被过滤, o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o ) o_t = \sigma (W_{io} x_t +b_{io} + W_{ho} h_{t-1} +b_{ho}) ot=σ(Wioxt+bio+Whoht1+bho)

g t g_t gt:这部分使用双曲正切函数进行运算,g仅表示对输入进行一个变换。即 g t = tanh ⁡ ( W i g x t + b i g + W h g h t − 1 + b h g ) g_t = \tanh (W_{ig} x_t +b_{ig} + W_{hg} h_{t-1} +b_{hg}) gt=tanh(Wigxt+big+Whght1+bhg),注意此时输出的值在-1和1之间。

输出本层细胞状态 c t c_t ct:t时刻细胞状态既能够保留上一时刻的细胞状态,又能够添加这一层的信息。 c t c_t ct表示输入和上一层信息的汇集。所以在lstm中, c t = f t ⊙ c t − 1 + i t ⊙ g t c_t = f_t \odot c_{t-1} + i_t \odot g_t ct=ftct1+itgt

本层的输出 h t h_t ht :本层输出既使用了输出门后的结果 o t o_t ot,同时也使用本层的状态 c t c_t ct . h t = o t ⊙ tanh ⁡ c t h_t=o_t \odot \tanh c_t ht=ottanhct
本层的输出来自于输出门 o t o_t ot c t c_t ct共同作用后的结果。其中
tanh ⁡ ( x ) = 1 − exp ⁡ ( − 2 x ) 1 + exp ⁡ ( − 2 x ) \tanh (x)=\frac{1-\exp (-2 x)}{1+\exp (-2 x)} tanh(x)=1+exp(2x)1exp(2x)

LSTM如何避免梯度爆炸

引:具体的来说,传统的RNN是用覆盖的的方式计算状态: S t = f ( S t − 1 , x t ) S_t=f(S_{t-1}, x_t) St=f(St1,xt),其中 S t − 1 S_{t-1} St1是RNN结构中任意一个隐藏层的状态也就是说,这有点类似于复合函数,那么根据链式求导的法则,复合函数求导:则 ( f ∘ g ) ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) \left(f \circ g\right)\prime(x)=f^{\prime} (g(x))g\prime (x) (fg)(x)=f(g(x))g(x),他们是一种乘积的方式,那么如果导数都是小数或者都是大于1的数的话,就会使得总的梯度发生vanishing或explosion的情况,当然梯度爆炸(gradient explosion)不是个严重的问题,一般靠裁剪后的优化算法即可解决,比如gradient clipping(如果梯度的范数大于某个给定值,将梯度同比收缩),但是梯度消失做不到,这个时候就要用lstm了。

在lstm中,我们发现,状态S是通过累加的方式来计算的, S t = Σ τ = 1 t Δ S τ S_t=\Sigma_{\tau=1}^t \Delta S_{\tau} St=Στ=1tΔSτ。那这样的话,就不是一直复合函数的形式了,它的的导数也不是乘积的形式,这样就不会发生梯度消失的情况了。

LSTM的变种gru

GRU(Gated Recurrent Unit)GRU_Cho,它组合了遗忘门和输入门到同一个单独的更新门(update gate z t z_t zt)中。合并了细胞状态和隐藏层的状态,以及一些别的改变。
gru
上面的公式中 r t r_t rt(reset gate)重置门, z t z_t zt(update gate)更新门,*表示元素之间的点乘。重置门接近0,这个单元计算就会忘掉先前的计算态。更新门和重置门的计算跟LSTM的门计算很像。 h ~ t \tilde{h}_t h~t表示新的门(new gates), h t h_t ht表示新的状态。可以看出GRU的更新策略是将上一时刻的状态 h t − 1 h_{t-1} ht1和新的状态 h ~ t \tilde{h}_t h~t之间线性插值从而得到。
LSTM与GRU的对比。Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

相似性:相加的特性使得每个单元更容易记住长序列的的特征。(即解决RNN梯度消失的问题)
GRU绕过了多个时间步,创建了快捷路径 (shortcut paths),允许误差通过反向传播更加容易而不会很快的消失

不同:LSTm的单元中,被网络中其他单元使用记忆内容经过了输出门的控制,而GRU直接传递所有的内容。
输入门的位置不同,相应的GRU中的重置门。The LSTM
unit computes the new memory content without any separate control of the amount of information
flowing from the previous time step. Rather, the LSTM unit controls the amount of the new memory
content being added to the memory cell independently from the forget gate. On the other hand, the
GRU controls the information flow from the previous activation when computing the new, candidate
activation, but does not independently control the amount of the candidate activation being added
(the control is tied via the update gate).

torch.nn.LSTM

pytorch中,LSTM的类,初始化参数有下面几个:

  • input_size – The number of expected features in the input x
  • hidden_size – The number of features in the hidden state
  • num_layers – Number of recurrent layers. E.g., setting num_layers=2 would mean stacking two LSTMs together to form a stacked LSTM, with the second LSTM taking in outputs of the first LSTM and computing the final results. Default: 1
  • bias – If False, then the layer does not use bias weights b_ih and b_hh. Default: True
  • batch_first – If True, then the input and output tensors are provided as (batch, seq, feature). Default: False
  • dropout – If non-zero, introduces a Dropout layer on the outputs of each LSTM layer except the last layer, with dropout probability equal to dropout. Default: 0
  • bidirectional – If True, becomes a bidirectional LSTM. Default: False

对象的输入为:

input, (h_0,c_0)

分别表示每一个batch中每个元素隐藏层的初始状态和出事的细胞状态。
张量input的形状为 (seq_len, batch, input_size).
张量h_0的形状为(num_layers * num_directions, batch, hidden_size)
张量c_0的形状为(num_layers * num_directions, batch, hidden_size)

输出为:

output, (h_n, c_n)

  • output of shape (seq_len, batch, num_directions * hidden_size): tensor containing the output features (h_t) from the last layer of the LSTM, for each t. If a torch.nn.utils.rnn.PackedSequence has been given as the input, the output will also be a packed sequence.
  • h_n of shape (num_layers * num_directions, batch, hidden_size): tensor containing the hidden state for t = seq_len.
  • c_n of shape (num_layers * num_directions, batch, hidden_size): tensor containing the cell state for t = seq_len.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值