13.6 深度循环神经网络

之前我们讲的不论是RNN,GRU,LSTM,它们都只有一层循环层,一层普通层。 1335.png 我们再来复习一下对于一个循环层,一个普通层的RNN来说,对于时间步t,隐状态hth_t就是将上一时间步的隐状态与当前时间步的输入拼接,通过循环层的线性变化,以tanh激活作为输出。

ht=tanh([ht1xt]wh+bh)h_t=tanh([h_{t-1}|x_t]w_h+b_h)

yt=softmax(htwy+by)y_t=softmax(h_tw_y+b_y)

上边假设是分类任务,所以yty_t应用的是softmax激活函数。 具体对于第二个时间步公式为:

h2=tanh([h1x2]wh+bh)h_2=tanh([h_1|x_2]w_h+b_h)

y2=softmax(h2wy+by)y_2=softmax(h_2w_y+b_y)

但是在实际中RNN可以有多个循环层,和多个普通层的。

13.6.1 增加更多的循环层

1336.png

上图中我们增加了第二个循环层,用上标表示层数。比如h12h_1^2表示的是第二个循环层在第一个时间步输出的隐状态。对于第二个循环层来说,和第一个循环层是完全一样的,只不过第一个循环层当前时间步的输入是xtx_t,而第二个循环层当前时间步的输入是第一个循环层在当前时间步输出的隐状态。

所以对于多循环层的某一时间步的输入就等于当前层上一时刻的隐状态与上一层当前时刻的隐状态拼接,然后经过当前循环层的线性变化,以tanh作为激活。

ht2=tanh([ht12ht1]wh2+bh2)h_t^2=tanh([h_{t-1}^2|h_t^1]w_h^2+b_h^2)

以第二个时间步第二层隐藏层为例,它的隐状态为:

h22=tanh([h12h21]wh2+bh2)h_2^2=tanh([h_1^2|h_2^1]w_h^2+b_h^2)

13.6.2 增加更多的普通层

1337.png 增加更多的普通层,就是增加普通的全连接神经网络,除了最后一个普通层会根据具体任务选择激活函数,其他的普通层一般以ReLU作为激活函数。具体细节我们就不再讨论了。

13.6.3 总结

上边我们是以RNN举例,但是实际对于GRU,LSTM,或者双向RNN,双向GRU,双向LSTM也都是一样的道理。 另外因为循环层比较复杂,即使是深度循环神经网络,循环层大家一般也都取2-5层,我了解到最深的也就8层。建议你一般2-3层就可以。对于普通层你可以适当增加深度。

results matching ""

    No results matching ""