赞
踩
神经网络只能一个个的输入,前一个输入和后一个输入是没有关系的。但某些任务需要能够更好的处理序列的信息,即前面和后面的输入是有关系的。
x为一个向量,代表输入层和输出层的值;s是一向量,代表着隐藏层的值;U是输入层的权重矩阵,o也为一个向量,它表示输出层的值,V是隐藏层到输出层的权重矩阵。
循环神经网络的隐藏层s的值不仅仅取决于当前输入的x,还取决于上一次隐藏层的值h。权重矩阵W就是隐藏层上一次的值作为这一次输入的权重。
L为损失函数
y代表着序列的真实输出
首先我们要先了解下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
W、U、b就容易了,这里给出表达式:
参考博客:https://www.cnblogs.com/pinard/p/6509630.html
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∗[ht−1,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∗[ht−1],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∗[ht−1,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∗[ht−1,x]+bo)
输出门:
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
h_t = o_t*tanh(C_t)
ht=ot∗tanh(Ct)
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+Urht−1+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+Uzht−1+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+rtUht−1+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(1−zt)+zt∗h^t
在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向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
embedding layer—>Bi-LSTM layer—>concat output—>FC layer —> softmax层
https://github.com/brightmart/text_classification/tree/master/a03_TextRNN
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。