语言模型和 RNN 笔记 (CS224N-4)

语言模型定义

(1)语言模型任务是根据给定的单词序列计算下一个单词的概率分布,完成这样的任务的系统就被称作语言模型

(2)也可以认为语言模型是一个为文本分配概率的系统,例如文本 \(x^{(1)},\cdots,x^{(T)}\) 的概率是
image-20230910171935861

n-gram语言模型

(1)一个n-gram是由n个连续单词组成的一块文本,收集不同n-gram的频率统计数据,并使用这些数据预测下一个单词

(2)思路

①首先我们做一个Markov假设, \(x^{(t+1)}\) 仅取决于其前面的n-1个单词
image-20230910173349467

②如何得到这些n-gram和(n-1)-gram的概率:

在大型文本语料库计算它们,统计概率近似

\[\approx\frac{count(x^{(t+1),x{(t)},\cdots,x^{(t-n+2)}})}{count(x^{(t)},\cdots,x^{(t-n+2)})} \]

(3)存在的问题:

  • 稀疏性问题:当我们需要的预测条件文本根本没有出现在语料库中,解决方法如下
    ①添加小的\(\sigma\)扰动因子给每一个语料库中的单词(smoothing)
    ②以需要文本的前一部分作为预测条件(backoff)

  • 存储问题:需要存储语料库中所有n-gram的数量,增加n或增加语料库都会增加模型大小

  • 当生成长文本时,文本虽然语法连贯但会变得牛头不对马嘴

基于固定窗口的神经网络语言模型

image-20230910180111928

①改进:没有稀疏性问题,不需要存储所有的n-gram
②问题:窗口太小,需要放大,但是放大窗口也会放大模型

RNN

(1)RNN全称:Recurrent Neural NetWorks(递归神经网络)

(2)核心思路:反复的应用相同的权重

(3)优缺点:

①优点:可以处理任何长度的输入,对于较长的输入上下文,模型大小不会增加
②缺点:递归计算很慢,很难从许多步骤后访问信息

(4)前向传播:

image-20230911151645445

①获取一个大的文本语料库,它是一个单词序列
②将单词序列输入RNN模型,计算每一个步骤t的输出分布,上一步的输出是下一步的输入
③步骤t上的损失函数是预测的概率分布 \(\widehat y^{(t)}\) 和真正的下一个单词的概率分布 \(y^{(t)}\)\(x^{(t+1)}\) 的one-hot编码)之间的交叉熵

\[J^{(t)}(\theta)=CE(y^{(t)},\widehat y^{(t)})=-\displaystyle\sum_{w \in V}y_w^{(t)}log\widehat y_w^{(t)}=-logy_{x_{t+1}}^{(t)} \]

④将其平均化,已获得整个训练集的整体损失

image-20230911141359691

然而,一次计算整个语料库的损失梯度和代价太昂贵了,在实践中,我们将 \(x^{(1)},\cdots,x^{(T)}\) 作为句子或文章。计算一个句子(实际上是一批句子)的损失,计算梯度并更新权重,对新一批句子重复。

(5)反向传播

多变量链式法则:
image-20230911142231272

image-20230911143810303

(6)RNN中的梯度消失和梯度爆炸:

  • 梯度消失:如果权重很小,由推导得梯度为权重的距离数指数,所以距离一长就会导致无法预测类似的长距离依赖关系(即无法在长距离保存信息)image-20230911152125342

  • 梯度爆炸:同理,如果权重很大会导致梯度很大,进而会导致糟糕的更新,梯度下降时会走很大的一步

    解决方案:梯度裁剪,当梯度大于某一个阈值,就在应用SGD更新之前缩小它

语言模型的评估

(1)困惑度(perplexity)

\[perplexity=\displaystyle\prod_{t=1}^T(\frac{1}{P_{LM}(x^{(t+1)}|x^{(t)},\cdots,x^{(1)})})^{\frac{1}{T}} \]

(这其实就等于交叉熵损失的指数)

posted @ 2025-03-08 22:38  绵满  阅读(282)  评论(0)    收藏  举报