Recurrent networks
继多层感知机面世后,在语言模型方面诞生了RNN模型。该模型所做的事情其实很简单:
输入:句子中前面出现过的词
输出:预测下一个新的词是什么
比如说:
输入:Hello
输出:预测==>World
简而言之,就是在已有的一条时序信息中,预测下一个时刻的信息是什么。
当然,我们也可以通过MLP来做这件事情,即通过输入已有的语言信息,把所有词元进行one-hot处理,每个词元(样本)就有得到一个输出,在下一个词元(样本)又会得到另外一个输出。如下图所示~
MLP in Sequence
单纯的MLP虽然也能处理该类问题,但是,每次我们进行预测只是基于上一个时刻的词元信息,并不能往前看更多时刻的词元信息。如预测"play"下个时刻的输出,仅能依赖于"play"这个词元,并不能看得到"play"之前的时序词元信息。
当然,你也可以将"I"和"like"这两个词元的信息与"play"做个信息的sum pooling,但是这样会缺乏时序信息的表示,因为" I like play"和"like play I"在pooling后表达的信息是一样的。
RNN in Sequence
对于RNN来说,每个样本(词元)的预测,不仅以来于当前时刻的样本时序信息,还有部分来自于上一时刻的样本隐藏状态的信息。如下图所示。
对于一个Simple RNN,根据以下公式:
h
t
=
a
c
t
i
v
a
t
i
o
n
(
W
h
h
h
t
−
1
+
W
h
x
x
t
+
b
h
)
\mathbf{h}_{t}=activation\left(\mathbf{W}_{h h} \mathbf{h}_{t-1}+\mathbf{W}_{h x} \mathbf{x}_{t}+\mathbf{b}_{h}\right)
ht=activation(Whhht−1+Whxxt+bh)
可以看到,简单的一个RNN只是在MLP的基础上加了一个 W h h h t − 1 W_{hh}h_{t-1} Whhht−1,表示每个样本不仅仅学习到当前 t 时刻的输入,还可以学习到 t-1 时刻的过去输出。注意,这里 t-1时刻的 h t − 1 h_{t-1} ht−1和 O t − 1 O_{t-1} Ot−1是同一个东西; W h h W_{hh} Whh和 W h x W_{hx} Whx也是同一个权重矩阵,只是在将不同时刻时把他们区别分开。
LSTM
拓展一下,对于后来面世的LSTM和GRU,增加了阀门gate概念,通过阀门gate控制输入单元Xt、记忆单元Ct、输出值ht的留存,来使得在信息流过程中避免出现RNN的梯度消失和爆炸:
-
输入阀门:用于控制网络当前输入数据xt流入记忆单元的多少,即有多少可以保存到ct。
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i t ∈ [ 0 , 1 ] \begin{gathered} i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right) \\ i_{t} \in[0,1] \end{gathered} it=σ(Wi⋅[ht−1,xt]+bi)it∈[0,1] -
遗忘阀门:遗忘门是LSTM单元的关键组成部分,可以控制哪些信息要保留哪些要遗忘,并且以某种方式避免当梯度随时间反向传播时引发的梯度消失和爆炸问题。遗忘门控制自连接单元 ,可以决定历史信息中的哪些部分会被丢弃。即上一时刻记忆单元Ct-1中的信息对当前记忆单元Ct 的影响。
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f t ∈ [ 0 , 1 ] \begin{gathered} f_{t}=\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right) \\ f_{t} \in[0,1] \end{gathered} ft=σ(Wf⋅[ht−1,xt]+bf)ft∈[0,1] -
通过上述的输入阀门和遗忘阀门,来控制当前记忆单元C_t的输出。
C t = f t ⋅ C t − 1 + i t ⋅ tanh ( W c ⋅ [ h t − 1 , , x t ] + b c ) C_{t}=f_{t} \cdot C_{t-1}+i_{t} \cdot \tanh \left(W_{c} \cdot\left[h_{t-1,}, x_{t}\right]+b_{c}\right) Ct=ft⋅Ct−1+it⋅tanh(Wc⋅[ht−1,,xt]+bc) -
输出阀门:控制记忆单元ct对当前隐藏层输出值ht的影响。
O t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) h t = O t ⋅ tanh ( C t ) h t ∈ [ − 1 , 1 ] \begin{gathered} O_{t}=\sigma\left(W_{o} \cdot\left[h_{t-1}, x_{t}\right]+b_{o}\right) \\ h_{t}=O_{t} \cdot \tanh \left(C_{t}\right) \end{gathered}\\ h_{t} \in[-1,1] Ot=σ(Wo⋅[ht−1,xt]+bo)ht=Ot⋅tanh(Ct)ht∈[−1,1]