Recurrent Neural Network
在复习时,老师提到了ResNet的优点:添加了L2范数之后,会使得所有参数趋于0,从而使模型舍弃不需要的层;反向传播时可以通过残差网络使模型更快收敛。
Recurrent Neural Network的基本类别
one to one模型是一种基本的模型,之前使用的卷积神经网络也可以归到这一类模型上,slides中称其为Vanilla Neural Network。
one to many模型可用在Image captioning,当输入一张图片之后,我们希望输出一个该图片的描述。
many to one模型可用在Sentiment Classification,根据输入的句子,判断作者的感情。
many to many模型(第一个many to many模型)可用在machine translation,输入一种语言翻译成另一只语言。
最后一个many to many模型可用在对输入video按帧分类。
Recurrent Neural Network分析
对于RNN的状态更新我们可以用一个 recurrence formula来表示
h
t
=
f
W
(
h
t
−
1
,
x
t
)
h_t = f_W(h_{t-1}, x_t)
ht=fW(ht−1,xt)
由式子可知,虽然输入和每次计算的状态不同,但权重
W
W
W 和计算式子
f
f
f 都是不变的。
h
t
=
tanh
(
W
h
h
h
t
−
1
+
W
x
h
x
t
)
h_t = \text{tanh}(W_{hh}h_{t-1} + W_{xh}x_t)
ht=tanh(Whhht−1+Wxhxt)
y
t
=
W
h
y
h
t
y_t = W_{hy}h_t
yt=Whyht
由图可知,在RNN中,我们对每个状态计算梯度时,都需要对
W
W
W 进行更新,所以
d
W
dW
dW 为所有状态的梯度之和。
根据RNN的流程图,我们可以知道在forewards中,loss function需要计算每一个状态的loss,那么在backwards中,我们也需要计算所有的状态得到梯度,但是这样计算需要极高的损耗,因此在训练时我们针对整个时间序列只计算一个子序列的loss,极大减少了梯度计算的复杂度。
文中给出一个基于numpy实现的rnn网络: https://gist.github.com/karpathy/d4dee566867f8291f086
Image Captioning
在Image Captioning中,我们将卷积卷积神经网络最后一层全连接层(产生类别数的向量)和soft Max层去除,将剩余层的输出作为RNN网络的输入,即RNN网络的formula 从
h
=
tanh
(
W
x
h
∗
x
+
W
h
h
∗
h
)
h=\text{tanh}(W_{xh} * x + W_{hh} * h)
h=tanh(Wxh∗x+Whh∗h) 变为
h
=
tanh
(
W
x
h
∗
x
+
W
h
h
∗
h
+
W
i
h
∗
v
)
h = \text{tanh}(W_{xh} *x + W_{hh} * h + W_{ih} * v)
h=tanh(Wxh∗x+Whh∗h+Wih∗v)。
取RNN网络的输出作为下一个状态的输入。当RNN网络中输出
<END>
\text{<END> }
<END> 标记时,停止采样。因此在训练时需要对每个图片的captioning添加
<ENF>
\text{<ENF>}
<ENF>。
15年提出了Attention机制来进行Image Captioning,这里实际上是说在不同时刻对图片中的不同区域进行识别,从而形成更准确的信息。
梯度消失和梯度爆炸
RNN网络由于backward时,梯度流很长,每次更新时要乘以相同的
W
W
W,因此在这个过程中很容易发生梯度的消失和爆炸。
对于梯度爆炸,我们可以在梯度超过某个阈值之后,对梯度进行切割,即
grad
∗
=
(
threshold
/
grad
_
norm
)
\text{grad} *= (\text{threshold} / \text{grad}\_\text{norm})
grad∗=(threshold/grad_norm)
对于梯度消失问题,可以使用LSTM,在一定程度上缓解。
LSTM的介绍,可以参考:https://blog.csdn.net/qq_33669204/article/details/83986047
视频中提出LSTM的关键在于遗忘门,遗忘门在不同的时间会有不同遗忘位置,而且遗忘门是sigmoid,数值在(0,1)之间,数值性质更好。
在初始遗忘门的参数时,尽量使其在训练的出世时值接近1。