循环神经网络——序列模型

循环神经网络 Recurrent Neural Networks

前向传播

many-to-many 结构
y^<1>y^<2>y^<3>y^<T>a<0>a<1>a<2>x<1>x<2>x<3>x<T> \begin{array}{ccccccccc} & \hat{y}^{<1>} && \hat{y}^{<2>} && \hat{y}^{<3>} & & \hat{y}^{<T>} \\ & \uparrow && \uparrow && \uparrow && \uparrow\\ a^{<0>} \rightarrow & \boxed{\begin{matrix} \bigcirc \\ \bigcirc \\ \bigcirc \\ \bigcirc \end{matrix}} & \xrightarrow{a^{<1>}} & \boxed{\begin{matrix} \bigcirc \\ \bigcirc \\ \bigcirc \\ \bigcirc \end{matrix}} & \xrightarrow{a^{<2>}} & \boxed{\begin{matrix} \bigcirc \\ \bigcirc \\ \bigcirc \\ \bigcirc \end{matrix}} & \rightarrow \cdots \rightarrow & \boxed{\begin{matrix} \bigcirc \\ \bigcirc \\ \bigcirc \\ \bigcirc \end{matrix}} \\ & \uparrow && \uparrow && \uparrow && \uparrow\\ & x^{<1>} && x^{<2>} && x^{<3>} & & x^{<T>} \\ \end{array}

或者表示成:

y^<1>y^<2>y^<T>a<0>a<1>a<2>a<T>x<1>x<2>x<T> \begin{array}{ccccccccc} & \hat{y}^{<1>} && \hat{y}^{<2>} & & \hat{y}^{<T>} \\ & \uparrow && \uparrow & & \uparrow\\ a^{<0>} \rightarrow & \boxed{a^{<1>}} & \rightarrow & \boxed{a^{<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{<T>}} \\ & \uparrow && \uparrow && \uparrow \\ & x^{<1>} && x^{<2>} & & x^{<T>} \\ \end{array}

数学表达式:
a<0>=0a<1>=g1(Waaa<0>+Waxx<1>+ba)=g1(Wa[a<0>,x<1>]+ba)y<1>=g2(Wya<1>+by)a<T>=g1(Waaa<T1>+Waxx<T1>+ba)=g1(Wa[a<T1>,x<t>]+ba)y<T>=g2(Wya<T>+by) \begin{aligned} a^{<0>} &= \vec{0} \\ a^{<1>} &= g_{1}(W_{aa}a^{<0>} + W_{ax}x^{<1>} + b_{a}) = g_{1}(W_{a}[a^{<0>},x^{<1>}] + b_{a})\\ y^{<1>} &= g_{2}(W_{y}a^{<1>} + b_{y}) \\ \vdots \\ a^{<T>} &= g_{1}(W_{aa}a^{<T-1>} + W_{ax}x^{<T-1>} + b_{a}) = g_{1}(W_{a}[a^{<T-1>},x^{<t>}] + b_{a})\\ y^{<T>} &= g_{2}(W_{y}a^{<T>} + b_{y}) \\ \end{aligned} 其中,**函数 g1g_{1} 通常取 tanh 或 relu,g2g_{2} 取 sigmoid.

many-to-one 结构
例:输入一部影片,进行用户情感分析(喜欢/不喜欢)
y^<T>a<0>a<1>a<2>a<T>x<1>x<2>x<T> \begin{array}{ccccccccc} &&&& & \hat{y}^{<T>} \\ &&&& & \uparrow\\ a^{<0>} \rightarrow & \boxed{a^{<1>}} & \rightarrow & \boxed{a^{<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{<T>}} \\ & \uparrow && \uparrow && \uparrow \\ & x^{<1>} && x^{<2>} & & x^{<T>} \\ \end{array}

one-to-one 结构
y^a<0>a<1>x \begin{array}{ccc} & \hat{y} \\ & \uparrow\\ a^{<0>} \rightarrow & \boxed{a^{<1>}} \\ & \uparrow \\ & x \\ \end{array}

one-to-many 结构:如音乐生成器
y^<1>y^<2>y^<T>a<0>a<1>a<2>a<T>xϕ \begin{array}{cccccc} & \hat{y}^{<1>} && \hat{y}^{<2>} & & \hat{y}^{<T>} \\ & \uparrow && \uparrow & & \uparrow\\ a^{<0>} \rightarrow & \boxed{a^{<1>}} & \rightarrow & \boxed{a^{<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{<T>}} \\ & \uparrow\\ & x或\phi \\ \end{array}

其他many-to-many结构
y^<1>y^<Ty>a<0>a<1>a<Tx>a<Tx+1>a<Tx+Ty>x<1>x<Tx> \begin{array}{ccccccccc} &&&&& \hat{y}^{<1>} && \hat{y}^{<T_{y}>} \\ &&&&& \uparrow && \uparrow\\ a^{<0>} \rightarrow & \boxed{a^{<1>}} & \rightarrow \cdots \rightarrow & \boxed{a^{<T_{x}>}} & \rightarrow & \boxed{a^{<T_{x}+1>}} & \rightarrow \cdots \rightarrow & \boxed{a^{<T_{x}+T_{y}>}} \\ & \uparrow && \uparrow\\ & x^{<1>} && x^{<T_{x}>} \\ \end{array}

代价函数

L(y^,y)=t=1TL<t>(y^<t>,y<t>) L(\hat{y}, y) = \sum_{t=1}^{T} L^{<t>}(\hat{y}^{<t>}, y^{<t>}) 其中,L<t>(y^<t>,y<t>)=y<t>logy^<t>(1y<t>)log(1y^<t>) L^{<t>}(\hat{y}^{<t>}, y^{<t>}) = -y^{<t>}\log\hat{y}^{<t>} - (1-y^{<t>})\log(1-\hat{y}^{<t>})

反向传播

仅以 many-to-many 为例:
循环神经网络——序列模型

门控循环单元 GRU (gated recurrent units)

解决梯度消失问题
c:memory cell
c~<t>=tanh(Wc[Γr×c<t1>,x<t>]+bc)Γr=σ(Wr[c<t1>,x<t>]+br)Γu=σ(Wu[c<t1>,x<t>]+bu)c<t>=Γu×c~<t>+(1Γu)×c<t1>a<t>=c<t> \begin{aligned} \tilde c^{<t>} &= \tanh(W_{c}[\Gamma_{r} \times c^{<t-1>},x^{<t>}] + b_{c}) \\ 相关门:\Gamma_{r} &= \sigma(W_{r}[c^{<t-1>},x^{<t>}] + b_{r}) \\ 更新门:\Gamma_{u} &= \sigma(W_{u}[c^{<t-1>},x^{<t>}] + b_{u}) \\ c^{<t>} &= \Gamma_{u}\times \tilde c^{<t>} + (1-\Gamma_{u}) \times c^{<t-1>} \\ a^{<t>} &= c^{<t>}\\ \end{aligned} Γu1\Gamma_{u} \approx 1 时,c<t>c<t1>c^{<t>} \approx c^{<t-1>}.

长短时记忆单元 LSTM (long short time memory)

c~<t>=tanh(Wc[a<t1>,x<t>]+bc)Γu=σ(Wu[a<t1>,x<t>]+bu)Γf=σ(Wf[a<t1>,x<t>]+bf)Γo=σ(Wo[a<t1>,x<t>]+bo)c<t>=Γu×c~<t>+Γf×c<t1>a<t>=Γo×c<t> \begin{aligned} \tilde c^{<t>} &= \tanh(W_{c}[a^{<t-1>},x^{<t>}] + b_{c}) \\ 更新门:\Gamma_{u} &= \sigma(W_{u}[a^{<t-1>},x^{<t>}] + b_{u}) \\ 遗忘门:\Gamma_{f} &= \sigma(W_{f}[a^{<t-1>},x^{<t>}] + b_{f}) \\ 输出门:\Gamma_{o} &= \sigma(W_{o}[a^{<t-1>},x^{<t>}] + b_{o}) \\ c^{<t>} &= \Gamma_{u}\times \tilde c^{<t>} + \Gamma_{f} \times c^{<t-1>} \\ a^{<t>} &= \Gamma_{o} \times c^{<t>} \end{aligned}
循环神经网络——序列模型
GRU or LSTM ?
GRU 只有两个门控,更简单,可以看成是LSTM的简化;
LSTM 有三个门控,更强大和灵活。

双向RNN (bidirectional RNN)

循环神经网络——序列模型
如对于输出 y^<3>\hat{y}^{<3>},即收到了来自过去 x<1>,x<2>x^{<1>}, x^{<2>} 的信息,又收到了来自现在 x<3>x^{<3>},也收到了来自未来 x<4>x^{<4>} 的信息。
在处理NLP问题中,带有LSTM的双向RNN是非常常用的。

深层RNN

y^<1>y^<2>y^<T>a[3]<0>a[3]<1>a[3]<2>a[3]<T>a[2]<0>a[2]<1>a[2]<2>a[2]<T>a[1]<0>a[1]<1>a[1]<2>a[1]<T>x<1>x<2>x<T> \begin{array}{ccccccccc} & \hat{y}^{<1>} && \hat{y}^{<2>} & & \hat{y}^{<T>} \\ & \uparrow && \uparrow & & \uparrow\\ a^{[3]<0>} \rightarrow & \boxed{a^{[3]<1>}} & \rightarrow & \boxed{a^{[3]<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{[3]<T>}} \\ & \uparrow && \uparrow & & \uparrow\\ a^{[2]<0>} \rightarrow & \boxed{a^{[2]<1>}} & \rightarrow & \boxed{a^{[2]<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{[2]<T>}} \\ & \uparrow && \uparrow & & \uparrow\\ a^{[1]<0>} \rightarrow & \boxed{a^{[1]<1>}} & \rightarrow & \boxed{a^{[1]<2>}} & \rightarrow \cdots \rightarrow & \boxed{a^{[1]<T>}} \\ & \uparrow && \uparrow && \uparrow \\ & x^{<1>} && x^{<2>} & & x^{<T>} \\ \end{array}

如:其中 a[2]<2>=g(Wa[2][a[2]<1>],a[1]<2>]+b[2])a^{[2]<2>} = g(W_{a}^{[2]}[a^{[2]<1>]}, a^{[1]<2>}]+b^{[2]})
当然,也可以把其中某些箭头去掉;每一个块不一定是标准的RNN,可以是LSTM或GRU;可以建立双向RNN.