我们已经预训练了词向量,接下来考虑设计神经网络解决更具体的问题。
自然语言不同于图像信息,例如子结构并不具有连续性等等。诸多困难使得CNN难以沿用,一个代替的方法是RNN。
循环神经网络(RNN)
一个单隐藏层的MLP形如:$$\bm H=\phi(\bm{XW}+\bm{b})$$
即输入 \(\bm{X}\),经过全连接的线性操作 \(\bm{XW}+\bm{b}\) 和激活函数 \(\phi\) 得到输出 \(\bm{H}\)。
在一些例子中,例如文本预测。我们如果简单的让 \(\mathbf{X}\) 是上一个单词(或者之前的若干个单词,但复杂度骤升),期望输出是下一个单词,难以体现出更之前的单词之间的关系,已经训练好的参数也被浪费了。
RNN主要思想就是,按时间顺序,将之前的输出同时作为下一次的输入(即 \(\bm{H}_{t-1}\bm{W}_{hh}\) 一项):
\[\bm H_t=\phi(\bm{X}_t\bm{W}_{xh}+\bm{H}_{t-1}\bm{W}_{hh}+\bm{b}_h) \]注意 \(\bm{W}_{xh},\bm{W}_{hh},\bm{b}_h\) 使用的是一套参数。
在RNN中,当需更新梯度的位置距离当前过久,容易出现梯度消失或梯度爆炸。为此,GRU和LSTM是两个优秀的解决方案。
门控循环单元(GRU)
GRU引入了重置门(reset gate)\(\bm{R}\) 和更新门(update gate) \(\bm{Z}\)。(\(\sigma\) 是 sigmoid函数)
\[\bm{R}_t=\sigma(\bm{X}_t\bm{W}_{xr}+\bm{H}_{t-1}\bm{W}_{hr}+\bm{b}_r) \]\[\bm{Z}_t=\sigma(\bm{X}_t\bm{W}_{xz}+\bm{H}_{t-1}\bm{W}_{hz}+\bm{b}_z) \]计算候选隐藏状态
\[\bm{\tilde{H}}_t=\tanh(\bm{X}_t\bm{W}_{xh}+(\bm{R}_t\odot\bm{H}_{t-1})\bm{W}_{hh}+\bm{b}_h) \]可以通过将 \(\bm{R}_t\) 某些位置变为较小的值,遗忘之前的信息。
\[\bm{H}_t=\bm{Z}_t\odot\bm{H}_{t-1}+(1-\bm{Z}_t)\odot\bm{\tilde{H}}_t \]可以通过将 \(\bm{Z}_t\) 某些位置变为较大的值,继承之前的信息。
长短期记忆(LSTM)
LSTM引入了输入门(input gate)\(\bm{I}\)、遗忘门(forget gate)\(\bm{F}\) 和输出门(output gate)\(\bm{O}\),以及与隐藏状态形状相同的记忆细胞 \(\bm{C}\)。
\[\bm{I}_t=\sigma(\bm{X}_t\bm{W}_{xi}+\bm{H}_{t-1}\bm{W}_{hi}+\bm{b}_i) \]\[\bm{F}_t=\sigma(\bm{X}_t\bm{W}_{xf}+\bm{H}_{t-1}\bm{W}_{hf}+\bm{b}_f) \]\[\bm{O}_t=\sigma(\bm{X}_t\bm{W}_{xo}+\bm{H}_{t-1}\bm{W}_{ho}+\bm{b}_o) \]计算候选记忆细胞
\[\bm{\tilde{C}}_t=\tanh(\bm{X}_t\bm{W}_{xc}+\bm{H}_{t-1}\bm{W}_{hc}+\bm{b}_c) \]计算记忆细胞
\[\bm{C}_t=\bm{F}_t\odot\bm{C}_{t-1}+\bm{I}_t\odot\bm{\tilde{C}}_t \]计算隐藏状态
\[\bm{H}_t=\bm{O}_t\odot\tanh(\bm{C}_t) \]感觉GRU和LSTM很玄学,只能把公式罗列在这里