为什么需要RNN

神经网络只能一个个的输入,前一个输入和后一个输入是没有关系的。但某些任务需要能够更好的处理序列的信息,即前面和后面的输入是有关系的。

RNN结构

x为一个向量,代表输入层和输出层的值;s是一向量,代表着隐藏层的值;U是输入层的权重矩阵,o也为一个向量,它表示输出层的值,V是隐藏层到输出层的权重矩阵。
循环神经网络的隐藏层s的值不仅仅取决于当前输入的x,还取决于上一次隐藏层的值h。权重矩阵W就是隐藏层上一次的值作为这一次输入的权重。
L为损失函数
y代表着序列的真实输出
循环和递归神经网络

RNN反向传播

首先我们要先了解下RNN的前向传播算法:
对于索引为t,h(t)的计算公式如下:
循环和递归神经网络
b为偏置项,σ\sigma为**函数,一般为tanhtanh
o(t)o^{(t)}的表达式比较简单:
o(t)=Vh(t)+co^{(t)} = Vh^{(t)} + c
最终在序列中我们的预测输出是:
y^(t)=σ(o(t))\hat y^{(t)} =\sigma(o{(t)})
通常由于RNN是分类模型,所以上面的**扎个**函数为softmax
通过损失函数L(t)L^{(t)}我们可以比较y^y\hat y和 y的差距

但是W,U,b的梯度计算就比较的复杂了。从RNN的模型可以看出,在反向传播时,在在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置t+1时的梯度损失两部分共同决定。对于W在某一序列位置t的梯度损失需要反向传播一步步的计算。我们定义序列索引t位置的隐藏状态的梯度为:

循环和递归神经网络
从t+1推t:
循环和递归神经网络
对于在T时刻,由于他后面没有其他的序列索引,因此:
循环和递归神经网络
有了δ(t)\delta^{(t)}计算WUbW、U、b就容易了,这里给出表达式:
循环和递归神经网络
参考博客:https://www.cnblogs.com/pinard/p/6509630.html

LSTM

Long Short Term Memory(长短期记忆网络),为一种特殊的RNN类型,可以学习长期依赖信息。LSTM由Hochreiter & Schmidhuber (1997)提出。
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。LSTM是一种拥有三个“门”结构的特殊网络结构。
循环和递归神经网络
LSTM 靠一些“门”的结构让信息有选择性地影响RNN中每个时刻的状态。所谓“门”的结构就是一个使用sigmod神经网络和一个按位做乘法的操作,这两个操作合在一起就是一个“门”结构。之所以该结构叫做门是因为使用sigmod作为**函数的全连接神经网络层会输出一个0到1之间的值,描述当前输入有多少信息量可以通过这个结构,于是这个结构的功能就类似于一扇门,当门打开时(sigmod输出为1时),全部信息都可以通过;当门关上时(sigmod输出为0),任何信息都无法通过。
输入门:it=σ(Wi[ht1,xt]+bi)i_{t} = \sigma(W_i*[h_{t-1},x_t]+b_i)
遗忘门:ft=σ(Wf[ht1],xt+bf)f_t=\sigma(W_f*[h_{t-1}],x_t+b_f)
候选记忆单元:C~t=tanh(Wc[ht1,xt]+bc)\tilde C_t = tanh(W_c*[h_{t-1},x_t]+b_c)
当前时刻记忆单元ot=σ(Wo[ht1,x]+bo)o_t=\sigma(W_o*[h_{t-1},x]+b_o)
输出门:ht=ottanh(Ct)h_t = o_t*tanh(C_t)

GRU网络

gru可以看做LSTM的变种,GRU把LSTM中的遗忘门和输入门用更新门来代替。把cell state和隐状态和hth_t合并,在计算当前时刻新信息的方法和LSTM有所不同。下图是GRU更新hth_t的过程
循环和递归神经网络
重置门:rt=σ(WrXt+Urht1+br)r_t = \sigma (W_rX_t + U_r h_{t-1} + b_r)
更新门:zt=σ(WzXt+Uzht1+bz)z_t = \sigma(W_z X_t + U_z h_{t-1} + b_z)
候选记忆门:h^t=tanh(WXt+rtUht1+b)\hat h_t =tanh(WX_t + r_tUh_{t-1} + b)
当前时刻记忆单元:ht=rtxt(1zt)+zth^th_t = r_t x_t(1-z_t)+z_t*\hat h_t

双向RNN

在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向RNN(BiRNN)来解决这类问题。例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。
双向RNN是由两个RNN上下叠加在一起组成的。输出由这两个RNN的状态共同决定。
循环和递归神经网络
从上图可以看出,双向RNN的主题结构就是两个单向RNN的结合。在每一个时刻t,输入会同时提供给这两个方向相反的RNN,而输出则是由这两个单向RNN共同决定(可以拼接或者求和等)。
参考博客:https://blog.csdn.net/mpk_no1/article/details/72875185

梯度消失和梯度爆炸

主要原因就是矩阵的高次幂导致的,在多层神经网络里,影响因素主要是权值和**函数的偏导数。
如果**函数求导小于1,经过多次相乘后就会导致梯度消失
同理如果大于1,就会导致梯度爆炸

解决方法

对于RNN可以通过梯度截断来避免梯度爆炸
循环和递归神经网络
添加正则项
使用LSTM自循环和门控制机制,避免梯度消失
优化**函数,例如将sigmoid改成relu
参考博客:http://www.mamicode.com/info-detail-1010318.html

textRNN

embedding layer—>Bi-LSTM layer—>concat output—>FC layer —> softmax层
https://github.com/brightmart/text_classification/tree/master/a03_TextRNN

相关文章:

  • 2021-11-02
  • 2021-09-09
  • 2021-12-08
  • 2021-07-20
  • 2021-12-04
猜你喜欢
  • 2021-08-08
  • 2021-08-15
  • 2021-09-17
  • 2021-07-14
  • 2021-12-23
  • 2021-09-05
  • 2021-04-15
相关资源
相似解决方案