主体内容:
这节课主要讲解什么语言模型?如何构建语言模型,传统的方法有哪些缺陷?从而引入神经网络方法,讲解RNN\GRU\LSTM的架构原理。
1.语言模型(Language Model)
1.1 语言模型定义
语言模型的任务是基于现有的单词序列预测下一个单词是什么。更正式的说法是:给定一个单词序列,,...,,计算下一个单词的概率分布
其中可以是词表中的任意单词,词表V={,....,};这样的系统称为语言模型。
如何衡量它的概率呢?让我们假设,每一个单词wi都要依赖于从第一个单词w1到它之前一个单词wi−1 的影响
是不是很简单?是的,不过这个衡量方法有两个缺陷:参数空间过大和数据稀疏严重。引入马尔科夫假设(Markov Assumption):一个词的出现仅与它之前的若干个词有关,也就是下文的n-gram。
1.2 n-gram Language Models
N-gram本身也指一个由N个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。例如uni-gram(N=1),Bi-gram (N=2) ,Tri-gram (N=3)等。为了计算这些概率,每个 n-gram 的计数将与每个单词的频率进行比较,这个称为 n-gram 语言模型。例如,如果选择 bi-gram 模型,每一个 bi-gram 的频率,通过将单词与其前一个单词相结合进行计算,然后除以对应的 uni-gram 的频率。下面的两个公式展示了 bi-gram 模型和 tri-gram 模型的区别。
n-gram 模型主要是基于一个固定的上下文窗口(即前n个单词)预测下一个单词。一般 n 的取值为多大才好呢?在某些情况下,前面的连续的 n 个单词的窗口可能不足以捕获足够的上下文信息。例如,“Asthe proctor started the clock, the students opened their ____”。如果窗口只是基于前面的三个单词“the students opened their”,那么基于这些语料计算的下划线中最有可能出现的单词就是为“books”,但是如果 n 足够大,能包括全部的上下文,考虑到“proctor”这个单词,那么下划线中最优可能出现的单词会是“exam”。
这引出了 n-gram 语言模型的两个主要问题:稀疏性和存储。
1)稀疏性问题(Sparsity problems)
首先,注意公式中的分子。如果 w1,w2.w3 在语料中从未出现过,那么 w3 的概率就是 0。为了解决这个问题,在每个单词计数后面加上一个很小的 δ ,这就是平滑操作。
然后,考虑公式中的分母。 如果 w1,w2 在语料中从未出现过,那么 w3 的概率将会无法计算。为了解决这个问题,这里可以只是单独考虑 w2 ,这就是“backoff”操作。
增加 n 会让稀疏问题更加严重,所以一般 n≤5 。
2)存储性问题(Storage problems)
我们知道需要存储在语料库中看到的所有 n-gram 的统计数。随着 n 的增加(或语料库大小的增加),模型的大小也会增加。
1.3 Window-based Neural Language Model
使用和第三讲NER问题中同样网络结构
超越 n-gram 语言模型的 改进
- 没有稀疏性问题
- 不需要观察到所有的n-grams
存在的问题
- 固定窗口太小
- 扩大窗口就需要扩大权重矩阵 W
- 窗口再大也不够用
- x(1) 和 x(2) 乘以完全不同的权重。输入的处理 不对称。
我们需要一个神经结构,可以处理任何长度的输入
2.Recurrent Neural Networks (RNN)
核心想法:重复使用 相同 的权重矩阵 W
传统的翻译模型只能以有限窗口大小的前 n 个单词作为条件进行语言模型建模,循环神经网络与其不同,RNN 有能力以语料库中所有前面的单词为条件进行语言模型建模。
每个这样的隐藏层都有若干个神经元,每个神经元对输入向量用一个线性矩阵运算然后通过非线性变化(例如 tanh 函数)得到输出。在每一个时间步,隐藏层都有两个输入:前一个时间步的隐藏层 和当前时间步的输入 ,前一个时间步的隐藏层 通过和权重矩阵 相乘和当前时间步的输入 和权重矩阵 相乘得到当前时间步的隐藏层 ,然后再将 和权重矩阵 相乘,接着对整个词表通过 softmax 计算得到下一个单词的预测结果 ^y ,如下面公式所示:
RNN的 优点:
- 它可以处理任意长度的序列
- 对更长的输入序列不会增加模型的参数大小
- 对时间步 t 的计算理论上可以利用前面很多时间步的信息 对输入的每个时间步都应用相同的权重,因此在处理输入时具有对称性
RNN 的缺点:
- 计算速度很慢——因为它每一个时间步需要依赖上一个时间步,所以不能并行化
- 在实际中因为梯度消失和梯度爆炸,很难利用到前面时间步的信息。
3 Gated Recurrent Units(GRU)
虽然理论上 RNN 能捕获长距离信息,但实际上很难训练网络做到这一点。门控制单元可以让 RNN 具有更多的持久性内存,从而更容易捕获长距离信息。
GRU 的基本结构和计算流程:
数学角度上:
- New memory generation:一个新的记忆 是由一个新的输入单词和过去的隐藏状态 共同计算所得。这个阶段是将新输入的单词与过去的隐藏状态 相结合,根据过去的上下文来总结得到向量 。
- Reset Gate:复位信号 是负责确定对总结的重要程度。如果确定与新的记忆的计算无关,则复位门能够完全消除过去的隐藏状态(即忽略之前隐藏的信息)。
- Update Gate:更新信号负责确定有多少可以向前传递到下一个状态。例如,如果 ≈1 ,然后几乎是完全向前传递到下一个隐藏状态。反过来,如果 ≈0 ,然后大部分的新的记忆 向前传递到下一个隐藏状态。
- Hidden state:利用更新门的建议,使用过去的隐藏输入和新生成的记忆生成隐藏状态 。
需要注意的是,为了训练 GRU,我们需要学习所有不同的参数:W,U,W(r),U(r),W(z),U(z)。这些参数同样是通过反向传播算法学习所得。
4.Long-Short-Term-Memories(LSTM)
LSTM是和 GRU 有一点不同的另外一种类型的复杂激活神经元。它的作用与 GRU 类似,但是神经元的结构有一点区别。
LSTM 的基本结构和计算流程:
数学角度:
- New memory generation:这个阶段是类似于 GRU 生成新的记忆的阶段。我们基本上是用输入单词 和过去的隐藏状态来生成一个包括新单词 的新的记忆。
- Input Gate:我们看到在生成新的记忆之前,新的记忆的生成阶段不会检查新单词是否重要——这需要输入门函数来做这个判断。输入门使用输入词和过去的隐藏状态来决定输入值是否值得保存,从而用来进入新内存。因此,它产生它作为这个信息的指示器。
- Forget Gate:这个门与输入门类似,只是它不确定输入单词的有用性——而是评估过去的记忆是否对当前记忆的计算有用。因此,遗忘门查看输入单词和过去的隐藏状态,并生成。
- Final memory generation:这个阶段首先根据忘记门的判断,相应地忘记过去的记忆 。类似地,根据输入门的判断,相应地输入新的记忆 。然后将上面的两个结果相加生成最终的记忆 。
- Output/Exposure Gate:这是 GRU 中没有明确存在的门。这个门的目的是从隐藏状态中分离最终的记忆。最终的记忆 包含很多不需要存储在隐藏状态的信息。隐藏状态用于 LSTM 的每个单个门,因此,该门是要评估关于记忆单元 的哪些部分需要显露在隐藏状态 中。用于评估的信号是 ,然后与 通过 ∘tanh() 运算得到最终的 。