文章目录
1.LSTM
1.1 三个门
-
forget gate 遗忘门 决定了上一个时刻的单元状态 c t − 1 c_{t-1} ct−1有多少保留到当前状态 c t c_t ct
-
input gate 输入门 决定当前时刻网格的输入 x t x_t xt有多少可以保存到单元状态 c t \displaystyle c_t ct
-
output gate 输出门 控制单元状态 c t c_t ct有多少输出到 L S T M LSTM LSTM的当前输出值 h t h_t ht
1.2 LSTM单元细节
符号介绍
-
c t c_t ct为时刻 t t t时的单元状态
-
forget gate
f = σ ( w f [ h t − 1 , x t ] ) f=\sigma(w_f[h_{t-1},x_t]) f=σ(wf[ht−1,xt]) t-1时刻 c t − 1 \displaystyle c_{t-1} ct−1在t时刻保留 f ∗ c t − 1 f*c_{t-1} f∗ct−1
-
input gate
i = σ ( w i [ h t − 1 , x t ] ) i=\sigma(w_i[h_{t-1},x_t]) i=σ(wi[ht−1,xt])
z = tanh ( w z [ h t − 1 , x t ] ) z=\tanh(w_z[h_{t-1},x_t]) z=tanh(wz[ht−1,xt])
t − 1 t-1 t−1时刻在 t t t时刻输入 x t x_t xt保留 i ∗ z i*z i∗z
-
output gate
c t = f ∗ c t − 1 + i ∗ z c_t=f*c_{t-1}+i*z ct=f∗ct−1+i∗z
o = σ ( w o [ h t − 1 , x t ] ) o=\sigma(w_o[h_{t-1},x_t]) o=σ(wo[ht−1,xt])
输出为 h ( t ) = tanh ( c t ) ∗ o h(t)=\tanh(c_t) * o h(t)=tanh(ct)∗o
2.LSTM变种
2.1 GRU
- GRU对LSTM做了两个比较大的改动
- update gate 更新门 z t \displaystyle z_t zt
- reset gate 重置门 r t \displaystyle r_t rt
- 将单元状态合并为一个状态 h t \displaystyle h_t ht
- GRU的前向计算公式为
z t = σ ( W z [ h t − 1 , x t ] ) z_t=\sigma(W_z[h_{t-1},x_t]) zt=σ(Wz[ht−1,xt])
r t = σ ( W r [ h t − 1 , x t ] ) r_t=\sigma(W_r[h_{t-1},x_t]) rt=σ(Wr[ht−1,xt])
h ~ t = tanh ( W [ r t ∗ h t − 1 , x t ] ) \widetilde h_t=\tanh(W[r_t*h_{t-1},x_t]) h t=tanh(W[rt∗ht−1,xt])
h = ( 1 − z t ) h t − 1 + z t ∗ h ~ t h=(1-z_t)h_{t-1}+z_t*\tilde h_t h=(1−zt)ht−1+zt∗h~t
2.2 Bi-RNN (Bidirectional Recurrent Neural Network)
-
RNN无法利用未来信息,Bi-RNN可以同时输入历史和未来的数据信息,时序相反时两个循环神经网络连接统一输出,输出层可以同时获取历史未来信息。
-
双向循环神经网络的基本思想是: 每一个训练序列向前和向后分别是两个RNN,而且这两个都连接着一个输出层。这个结构提供给输出层输入序列中每一个点完整的过去和未来的上下文信息。6个独特的权值在每一时步被重复利用,六个权值分别对应着输入层到前向层隐含层和反向层隐藏层 ( w 1 , w 5 ) (w_1,w_5) (w1,w5)、前向/后向隐含层到前向/后向隐含层 ( w 2 , w 5 ) (w_2,w_5) (w2,w5)、向前和向后隐含层到输出层 ( w 4 , w 6 ) (w_4,w_6) (w4,w6)
3.RNN使用场景
RNN网络适合处理序列数据1,序列长度一般不是固定的。
上图最下层为输入向量,中间层为RNN的状态,最上层为输出向量
RNN的五个应用场景,一次对应上面的5个图
- 没有使用RNN的Vanilla模型,从固定的大小的输入得到固定大小的输出
- 序列输出(比如图片字幕,输入一张图片输出一段文字序列)
- 序列输入(比如情感分析,输入一段文字,然后将它分类为积极或者消极情感)
- 序列输入和序列输出(比如机器翻译:一个RNN读取一条英文语句,然后将它以法语形式输出)
- 同步序列输入输出(比如视频分类,为视频中每一帧打标签)
与使用固定计算步骤的固定网络相比,使用序列进行操作要更加强大。RNN将输入向量与状态向量用一个固定函数绑定起来,用来产生一个新的状态向量。在编程层面上,在运行一个程序时可以用特定的输入和一些内部变量对其进行解释。从这个角度上讲,RNN本质上可以描述程序。事实上,RNN是图灵完备的,即他们可以模拟任意程序。 ↩︎