0
点赞
收藏
分享

微信扫一扫

自然语言处理之——循环神经网络

穆风1818 2022-01-26 阅读 52

一. 概述

在之前介绍过的卷积神经网络计算中,前一个输入和后一个输入之间是没有关联关系的。但很多任务需要利用序列关系做处理。例如在自然语言处理中,需要理解一句话的时候,单独的只理解每一个词语是不行的,我们需要处理的是这些词连接起来的整体序列。为了解决这一问题,就诞生了循环神经网络(Recurrent Neural Network,RNN)。

二. 语言模型

首先回顾一下之前分享过的语言模型内容,语言模型(Language model)是自然语言处理的重要技术。自然语言处理中最常见的数据是文本数据。我们可以把一段自然语言文本看作一段离散的时间序列。假设一段长度为T的文本中的词依次为w1,w2,...,wT,那么在离散的时间序列中,wt(1≤t≤T)可看作在时间步(time step)t的输出或标签。给定一个长度为T的词的序列w1, w2,...,wT,语言模型将计算该序列的概率:

P(w1, w2,...,wT)

公式1:语言模型表达式

语言模型可用于提升机器翻译的性能。如果对英文“you go first”逐词翻 译成中文的话,可能得到“你走先”“你先走”等排列方式的文本序列。如果语言模型判断出“你先走”的概率大于其他排列方式的文本序列的概率,我们就可以把“you go first”翻译成“你先走”。

既然语言模型很有用,那该如何计算它呢?假设序列w1, w2,...,wT中的每个词是依次生成的,我们有:

P(w1, w2, . . . , wT )=∏ T t=1 P(wt | w1, . . . , wt−1).

公式2:语言模型展开式

例如,一段含有4个词的文本序列的概率 P(w1, w2, w3, w4) = P(w1)P(w2 | w1)P(w3 | w1, w2)P(w4 | w1, w2, w3). 为了计算语言模型,我们需要计算词的概率,以及一个词在给定前几个词的情况下的条件概率,即语言模型参数。设训练数据集为一个大型文本语料库,如维基百科的所有条目。词的概率可以通 过该词在训练数据集中的相对词频来计算。例如,P(w1)可以计算为w1在训练数据集中的词频(词出现的次数)与训练数据集的总词数之比。因此,根据条件概率定义,一个词在给定前几个词的情况下的条件概率也可以通过训练数据集中的相对词频计算。例如,P(w2|w1)可以计算为w1,w2两词相邻的频率与w1词频的⽐值,因为该比值即P(w1,w2)与P(w1)之比;而P(w3|w1,w2)同理可以计算为w1、w2和w3这3个词相邻的频率与w1和w2这2个词相邻的频率的比值。以此类推。

当序列⻓度增加时,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。n元语法通过马尔可夫假设(虽然并不一定成立)简化了语言模型的计算。这里的马尔可夫假设是指一个词的出现只与前面n个词相关,即n阶马尔可夫链(Markov chain of order )。如果n = 1,那么有P(w3 | w1, w2) = P(w3 | w2)。如果基于n-1阶马尔可夫链,我们可以将语言模型改写为:

P(w1,w2,...,wT)≈∏T t=1 P(wt|wt-(n-1),...,wt-1).

公式3:马尔可夫语言模型表达式

以上也叫n元语法(n-grams)。它是基于n−1阶马尔可夫链的概率语言模型。当n分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。例如,长度为4的序列w1, w2, w3, w4在一元语法、二元语法和三元语法中的概率分别为:

P(w1, w2, w3, w4) = P(w1)P(w2)P(w3)P(w4),

P(w1, w2, w3, w4) = P(w1)P(w2 | w1)P(w3 | w2)P(w4 | w3),

P(w1, w2, w3, w4) = P(w1)P(w2 | w1)P(w3 | w1, w2)P(w4 | w2, w3).

当n较小时,n元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当n较大时,n元语法需要计算并存储大量的词频和多词相邻频率。

三. 循环神经网络

上面介绍的n元语法中,时间步t的词wt基于前面所有词的条件概率只考虑了最近时间步的n-1个词。如果要考虑比t-(n-1)更早时间步的词对wt的可能影响,我们需要增大n。但这样模型参数的数量将随之呈指数级增长。

循环神经网络并非刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息。首先我们介绍下多层感知机,然后描述如何添加隐藏状态来将它变成循环神经网络。

图1:多层感知机结构

考虑一个含单隐藏层的多层感知机。给定样本数为n输⼊个数(特征数或特征向量维度)为d的小批量数据样本X∈Rn×d。设隐藏层的激活函数为ϕ,那么隐藏层的输出H ∈ R n×h计算为:

图2:基础单层网络结构

H=ϕ(XWxh+bh)

公式4:rnn隐藏层表达式

其中隐藏层权重参数Wxh∈Rd×h,隐藏层偏差参数bh∈R1×h,h为隐藏单元个数。上式相加的两项形状不同,因此将按照广播机制相加。把隐藏变量H作为输出层的输⼊,且设输出个数为q(如分类问题中的类别数),输出层的输出为:

O=HWhq+bq

公式5:rnn输出层表达式

其中输出变量O∈Rn×q,输出层权重参数Whq∈Rh×q , 输出层偏差参数bq ∈R1×q。如果是分类问题,我们可以使用softmax(O)来计算输出类别的概率分布。

现在我们考虑输⼊数据存在时间相关性的情况。假设Xt∈Rn×d是序列中时间步t的小批量输⼊,Ht∈Rn×h是该时间步的隐藏变量。与多层感知机不同的是,这里我们保存上一时间步的隐藏变量Ht-1,并引⼊一个新的权重参数Whh∈ Rh×h,该参数用来描述在当前时间步如何使用上一时间步的隐藏变量。具体来说,时间步t的隐藏变量的计算由当前时间步的输⼊和上一时间步的隐藏变量共同决定:

Ht=ϕ(XtWxh+Ht-1Whh+bh).

公式6:rnn表达式

与多层感知机相比,我们在这里添加了Ht-1Whh一项。由上式中相邻时间步的隐藏变量Ht和Ht-1之间的关系可知,这里的隐藏变量能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。因此,该隐藏变量也称为隐藏状态。由于隐藏状态在当前时间步的定义使用了上一时间步的隐藏状态,上式的计算是循环的。使用循环计算的网络即循环神经网络(recurrent neural network)。

循环神经网络有很多种不同的构造方法。含上式所定义的隐藏状态的循环神经网络是极为常见的一种。本次内容中的循环神经网络均基于上式中隐藏状态的循环计算。在时间步t输出层的输出和多层感知机中的计算类似:

图3:t时刻示意图

通过图1的示意图,我们可以很清楚的看到上一时刻的隐藏层是如何影响当前时刻的隐藏层的,还可以将图1进行展开,循环神经网络还可以按照时间线规则展开表示。

图4:RNN时间线展开图

Ot=HtWhq+bq.

公式7:rnn第t步输出表达式

循环神经网络的参数包括隐藏层的权重Wxh∈Rd×h、Whh∈Rh×h和偏差bh ∈R1×h,以及输出层的权重Whq∈Rh×q和偏差bq∈R1×q。值得一提的是,即便在不同时间步,循环神经网络也始终使用这些模型参数。因此,循环神经网络模型参数的数量不随时间步的增加而增长。

图5:rnn模型图

图1展示了循环神经网络在3个相邻时间步的计算逻辑。在时间步t,隐藏状态的计算可以看成是将输⼊Xt和前一时间步隐藏状态Ht-1连结后输⼊一个激活函数为ϕ的全连接层。该全连接层的输出就是当前时间步的隐藏状态Ht,且模型参数为Wxh与Whh的连结,偏差为bh。当前时间步t的隐藏状态Ht将参与下一个时间步t+1的隐藏状态Ht+1的计算,并输⼊到当前时间步的全连接输出层。

四. 总结

本次的分享内容主要就是以上的两个部分,首先我们从语言模型开始切入,分析到n元语法的局限性,就是对前后时刻的不准确性和计算量大的问题。后面部分我们开始从基础展开RNN(循环神经网络),分析在t时刻状态受到t-1时刻的影响和对t+1时刻的影响,按照时间线构成的RNN。

举报

相关推荐

0 条评论