循环和递归神经网络

    xiaoxiao2025-05-25  11

    为什么需要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

    最新回复(0)