堆叠RNN
在下面,我们介绍了如何为RNN添加“深度”,以及如何展开RNN以处理时间。观察到RNN的输出被馈送到更深的层,而状态则被馈送到处理过去的状态。
机器学习-递归神经网络(2)

简单回归示例
在这里,我们给出一个简单的情况,我们希望RNN完成该单词,我们给网络赋予字符h,e,l,l,这里的词汇是[h,e,l,o]。 观察到,在我们输入第一个“ h”之后,网络希望输出错误的答案(右边为绿色),但是在结尾处,在第二个“ l”之后,它想要输出正确的答案“ o”。 在这里字符的顺序很重要。
机器学习-递归神经网络(2)

描述图像
如果连接卷积神经网络,则具有预训练的RNN。 RNN将能够描述它在图像上“看到”的内容。
机器学习-递归神经网络(2)

基本上,我们得到了预训练的CNN(即VGG),并连接倒数第二个FC层并连接到RNN。 在此之后,您将端到端训练整个事情。
机器学习-递归神经网络(2)
长短期记忆网络(LSTM)
LSTM提供了一个不同的递归公式,它比香草RNN更强大,因为它很复杂,会向下一个状态添加“残差信息”,而不仅仅是转换每个状态。 想象一下LSTM是RNN的“残留”版本。换句话说,与常规RNN相比,LSTM消失的梯度要少得多。 请记住,正门分布梯度。
因此,通过减少逐渐消失的梯度,LSTM可以记住更多。 因此,从现在开始,当您考虑RNN时,请使用LSTM。换句话说,LSTM更好地记住长期依赖性。
机器学习-递归神经网络(2)
消失的问题可以用LSTM解决,但是所有递归神经网络可能发生的另一个问题是爆炸梯度问题。为了解决爆炸性梯度问题,人们通常会进行梯度修剪,这只会允许最大梯度值。这种用于梯度的高速公路称为“单元状态”,因此与仅具有状态流动的RNN相比,存在一个差异,在LSTM上,我们具有状态和单元状态。

机器学习-递归神经网络(2)

LSTM门
在LSTM门上进行缩放。 这也改善了如何进行反向传播。
机器学习-递归神经网络(2)
一个时间步的lstm正向传播代码:
def lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b):
N,H = prev_c.shape

#forward pass in steps
#step 1: calculate activation vector
a = np.dot(x, Wx) + np.dot(prev_h,Wh) + b.T

#step 2: input gate
a_i = sigmoid(a[:,0:H])

#step 3: forget gate
a_f = sigmoid(a[:,H:2*H])

#step 4: output gate
a_o = sigmoid(a[:,2H:3H])

#step 5: block input gate
a_g= np.tanh(a[:,3H:4H])

#step 6: next cell state
next_c = a_f * prev_c + a_i * a_g

#step 7: next hidden state
next_h = a_o * np.tanh(next_c)

#we are having *.copy() since python params are pass by reference.
cache = (x, prev_h.copy(), prev_c.copy(), a, a_i, a_f, a_o, a_g, next_h, next_c, Wx, Wh)

return next_h, next_c, cache

现在向后传播一个时间步:
def lstm_step_backward(dnext_h, dnext_c, cache):
(x, prev_h, prev_c, a, a_i, a_f, a_o, a_g, next_h, next_c, Wx, Wh) = cache
N,H = dnext_h.shape
da = np.zeros(a.shape)

#step 7:
dnext_c = dnext_c.copy()
dnext_c += dnext_h * a_o * (1 - np.tanh(next_c) ** 2)
da_o = np.tanh(next_c) * dnext_h

#step 6:
da_f = dnext_c * prev_c
dprev_c = dnext_c * a_f
da_i = dnext_c * a_g
da_g = dnext_c * a_i

#step 5:
da[:,3H:4H] = (1 - np.square(a_g)) * da_g

#step 4:
da[:,2H:3H] = (1 - a_o) * a_o * da_o

#step 3:
da[:,H:2*H] = (1 - a_f) * a_f * da_f

#step 2:
da[:,0:H] = (1 - a_i) * a_i * da_i

#step 1:
db = np.sum(da, axis=0)
dx = da.dot(Wx.T)
dWx = x.T.dot(da)
dprev_h = da.dot(Wh.T)
dWh = prev_h.T.dot(da)

return dx, dprev_h, dprev_c, dWx, dWh, db

GRU(门控循环单位)单元:
Gru单元格可以视为LSTM(也希望与逐渐消失的梯度)单元格的变体,但计算效率更高。 在此单元上,忘记和输入门被合并(更新门)。
机器学习-递归神经网络(2)

相关文章:

  • 2022-12-23
  • 2021-05-12
  • 2021-04-03
  • 2021-09-09
  • 2021-10-16
猜你喜欢
  • 2021-08-17
  • 2021-12-09
  • 2021-08-25
  • 2021-05-24
  • 2021-04-06
  • 2021-04-15
  • 2022-12-23
相关资源
相似解决方案