Recurrent neural network

语言模型

语言模型就是计算一个单词序列(句子)的概率(P(w1,…,wm))的模型。听上去很简单,做起来很难;听上去没什么用处,但用处非常多。比如在机器翻译中,判断译文序列中一种词序的自然程度高于另一种,判断一种用词选择优于另一种。

传统语言模型

为了简化问题,必须引入马尔科夫假设,句子的概率通常是通过待预测单词之前长度为n的窗口建立条件概率来预测:

为了估计此条件概率,常用极大似然估计,比如对于BiGram和TriGram模型,有:

在数据量足够的情况下,n-gram中的n越大,模型效果越好。但实际上,数据量总是不如人意,这时候一些平滑方法就不可或缺。另外,这些ngram可能会占用上G的内存,在最新的研究中,一个1260亿的语料在140G内存的单机上花了2.8天才得到结果。

Bengio et al提出了第一个大规模深度学习自然语言处理模型,只不过是用前n个单词的词向量来做同样的事情(上文建模)而已,其网络结构如下:

公式如下:

RNN

RNN的说明及推导

完全抄录的该篇博客,并对感觉不对的地方进行修正,对难以理解的地方加以补充:https://zybuluo.com/hanbingtao/note/541458

在全连接神经网络和卷积神经网络中,只能单独的去处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。这时,就需要用到深度学习领域中另一类非常重要神经网络:循环神经网络(Recurrent Neural Network)。RNN种类很多,也比较绕脑子。

上图修正:
N-Gram的含义是,假设一个词出现的概率只与前面N - 1个词相关。

对上述的推导过程进行解释

$$\begin{bmatrix}
{s_1^{t-1}}\\
{s_2^{t-1}}\\
{\vdots}\\
{s_n^{t-1}}\\
\end{bmatrix} = f(
\begin{bmatrix}
{u_{11}}&{u_{12}}&{\cdots}&{u_{1m}}\\
{u_{21}}&{u_{22}}&{\cdots}&{u_{2m}}\\
{\vdots}&{\vdots}&{\ddots}&{\vdots}\\
{u_{n1}}&{u_{n2}}&{\cdots}&{u_{nm}}\\
\end{bmatrix}\begin{bmatrix}
{x_1}\\
{x_2}\\
{\vdots}\\
{x_m}\\
\end{bmatrix} + \begin{bmatrix}
{w_{11}}&{w_{12}}&{\cdots}&{w_{1n}}\\
{w_{21}}&{w_{22}}&{\cdots}&{w_{2n}}\\
{\vdots}&{\vdots}&{\ddots}&{\vdots}\\
{w_{n1}}&{w_{n2}}&{\cdots}&{w_{nn}}\\
\end{bmatrix}\begin{bmatrix}
{s_1^{t-2}}\\
{s_2^{t-3}}\\
{\vdots}\\
{s_n^{t-2}}\\
\end{bmatrix})$$

$$=f(\begin{bmatrix}
{u_1}\\
{u_2}\\
{\vdots}\\
{u_n}\end{bmatrix}x+ \begin{bmatrix}
{w_1}\\
{w_2}\\
{\vdots}\\
{w_n}\end{bmatrix}s^{t-2})$$

$$=f(\begin{bmatrix}
{u_1x + w_1s^{t-2}}\\
{u_2x + w_2s^{t-2}}\\
{\vdots}\\
{u_nx + w_ns^{t-2}}\end{bmatrix})$$
在这里面 $u_i 和 w_i 是待优化的参数,x 和 s^{t-2} 都是实数组成的矩阵,$

$所以参数是 u_i 和 w_i,u_i组成U是输入层到隐藏层的权重矩阵,w_i组成W是上一次的s^{t-2}值作为这一次的输入的权重矩阵$

$\frac{\partial{s_2^{t-1}}}{\partial{net_1^{t-1}}} = \frac{\partial{f(u_2x + w_2s^{t-2})}}{\partial{u_1x + w_1s^{t-2}}}$

由于上式中的变量为 $u_2 和 w_2$,而下式的变量为 $u1 和 w_1$,所以求导为 0

其中 $(δ_t^l)^T$ 表示 $\frac{\partial{E}}{\partial{net_t}}$

这里的 $a_t^{l-1}$ 表示得是第 l - 1 层神经元的输出,式(22) ,式(39) 求得偏导实际上是对深度神经网络的图进行求的偏导(即下图),式 (22) 是横向求得,式(39) 是竖向求得,本片博客的作者在标记神经元的输入时,除了最底层使用 $x$ 进行标记,其他的输入层都是用的 $a$ 进行标记的,可以查看后向传播算法

感觉这里的推导过程有错误,具体的提到过程应该如下

按照乘法法则乘进去和最后的结果一样

注意

第二张图、第三张图都是实数与矩阵相乘再相加

梯度爆炸和梯度消失

防止梯度爆炸

一种暴力的方法是,当梯度的长度大于某个阈值的时候,将其缩放到某个阈值。虽然在数学上非常丑陋,但实践效果挺好。

其直观解释是,在一个只有一个隐藏节点的网络中,损失函数和权值w偏置b构成error surface,其中有一堵墙:

每次迭代梯度本来是正常的,一次一小步,但遇到这堵墙之后突然梯度爆炸到非常大,可能指向一个莫名其妙的地方(实线长箭头)。但缩放之后,能够把这种误导控制在可接受的范围内(虚线短箭头)。

但这种trick无法推广到梯度消失,因为你不想设置一个最低值硬性规定之前的单词都相同重要地影响当前单词。

减缓梯度消失

与其随机初始化参数矩阵,不如初始化为单位矩阵。这样初始效果就是上下文向量和词向量的平均。然后用ReLU激活函数。这样可以在step多了之后,依然使得模型可训练。

困惑度结果

相较于NGram,RNN的困惑度要小一些。

最后的实现技巧

记录每个t的误差不要丢,反向传播的时候将其累加起来。

序列模型的应用

可以把每个词分类到NER、实体级别的情感分析(饭菜味道不错,但环境不太卫生)、意见表达。

其中,意见挖掘任务就是将每个词语归类为:

DSE:直接主观描述(明确表达观点等)

ESE:间接主观描述(间接地表达情感等)

语料标注采用经典的BIO标注:

实现这个任务的朴素网络结构就是一个裸的RNN:

但是这个网络无法利用当前词语的下文辅助分类决策,解决方法是使用一些更复杂的RNN变种。

Bidirectional RNNs

Deep Bidirectional RNNs

评测

评测方法是标准的F1(因为标签样本不均衡),在不同规模的语料上试验不同层数的影响:

可见层数不是越多越好。

应用:RNN机器翻译模型

传统机器翻译模型在不同的阶段用到大量不同的机器学习算法,这里讨论用RNN统一整个流水线。

比如将3个单词的德语翻译为2个单词的英语,用到如下RNN:

回顾

RNN是最好的DeepNLP模型之一
因为梯度消失和梯度爆炸,训练很难
可以用很多技巧来训练
下次课将介绍更强大的RNN拓展:LSTM和GRU
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信