循环和递归神经网络

为什么需要RNN

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

RNN结构

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

RNN反向传播

首先我们要先了解下RNN的前向传播算法:
对于索引为t,h(t)的计算公式如下:
在这里插入图片描述
b为偏置项, σ \sigma σ为激活函数,一般为 t a n h tanh tanh
o ( t ) o^{(t)} o(t)的表达式比较简单:
o ( t ) = V h ( t ) + c o^{(t)} = Vh^{(t)} + c o(t)=Vh(t)+c
最终在序列中我们的预测输出是:
y ^ ( t ) = σ ( o ( t ) ) \hat y^{(t)} =\sigma(o{(t)}) y^(t)=σ(o(t))
通常由于RNN是分类模型,所以上面的激活扎个激活函数为softmax
通过损失函数 L ( t ) L^{(t)} L(t)我们可以比较 y ^ 和 y \hat y和 y y^y的差距

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

在这里插入图片描述
从t+1推t:
在这里插入图片描述
对于在T时刻,由于他后面没有其他的序列索引,因此:
在这里插入图片描述
有了 δ ( t ) \delta^{(t)} δ(t)计算 W 、 U 、 b W、U、b WUb就容易了,这里给出表达式:
在这里插入图片描述
参考博客: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),任何信息都无法通过。
输入门: i t = σ ( W i ∗ [ h t − 1 , x t ] + b i ) i_{t} = \sigma(W_i*[h_{t-1},x_t]+b_i) it=σ(Wi[ht1,xt]+bi)
遗忘门: f t = σ ( W f ∗ [ h t − 1 ] , x t + b f ) f_t=\sigma(W_f*[h_{t-1}],x_t+b_f) ft=σ(Wf[ht1],xt+bf)
候选记忆单元: C ~ t = t a n h ( W c ∗ [ h t − 1 , x t ] + b c ) \tilde C_t = tanh(W_c*[h_{t-1},x_t]+b_c) C~t=tanh(Wc[ht1,xt]+bc)
当前时刻记忆单元 o t = σ ( W o ∗ [ h t − 1 , x ] + b o ) o_t=\sigma(W_o*[h_{t-1},x]+b_o) ot=σ(Wo[ht1,x]+bo)
输出门: h t = o t ∗ t a n h ( C t ) h_t = o_t*tanh(C_t) ht=ottanh(Ct)

GRU网络

gru可以看做LSTM的变种,GRU把LSTM中的遗忘门和输入门用更新门来代替。把cell state和隐状态和 h t h_t ht合并,在计算当前时刻新信息的方法和LSTM有所不同。下图是GRU更新 h t h_t ht的过程
在这里插入图片描述
重置门: r t = σ ( W r X t + U r h t − 1 + b r ) r_t = \sigma (W_rX_t + U_r h_{t-1} + b_r) rt=σ(WrXt+Urht1+br)
更新门: z t = σ ( W z X t + U z h t − 1 + b z ) z_t = \sigma(W_z X_t + U_z h_{t-1} + b_z) zt=σ(WzXt+Uzht1+bz)
候选记忆门: h ^ t = t a n h ( W X t + r t U h t − 1 + b ) \hat h_t =tanh(WX_t + r_tUh_{t-1} + b) h^t=tanh(WXt+rtUht1+b)
当前时刻记忆单元: h t = r t x t ( 1 − z t ) + z t ∗ h ^ t h_t = r_t x_t(1-z_t)+z_t*\hat h_t ht=rtxt(1zt)+zth^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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值