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

news/2025/3/10 9:35:37/文章来源:https://www.cnblogs.com/mianmaner/p/18760044

语言模型定义

(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}} \]

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895681.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 线程池 ThreadPoolExecutor 的状态控制变量 ctrl

如下是源代码。线程池的主要控制状态 ctl 是一个原子整数,它打包了两个概念字段:workerCount:表示当前有效运行的线程数。 runState:表示线程池的状态(如是否正在运行、关闭等)。为了将这两个字段打包成一个 int,我们将 workerCount 限制为 (2^{29} - 1)(约5亿),而不…

go 方法和函数的区别

图片中的内容总结了Go语言中方法和函数的区别,主要分为三个方面:调用方式不同:函数的调用方式:函数名(实参列表) 方法的调用方式:变量.方法名(实参列表)普通函数的接收者类型限制:对于普通函数,如果接收者是值类型,则不能将指针类型的数据直接传递给它;反之亦然。方法…

德里克昆什肯《量子战争》目录

机翻未校对是机翻的,而且没有经过校对,只能作为SFW编辑部的懒狗开工前的替代品 第一章 第二章 第三章 Chap 4 Chap 5~6 Chap 7~8 Chap 9~10 Chap 11~14 Chap 15~18 Chap 19~22 Chap 23~26 Chap 27~30 Chap 31~34 Chap 35~38 Chap 39~42 Chap 43~46 Chap 47~50 Chap 51~61本文…

ios调试(safari)

一、打开ios safari开发者模式在手机设备的“设置”中找到“safari浏览器”,点击进入 在safari设置中,找到“高级”选项,点击进入 在高级设置页面中,找到“网页(web)检查器”选项,打开开关 二、使用mac的safari开发者模式进行调试将ios设备通过usb连接到电脑上 打开mac中…

粒子群算法改进--自动退出迭代循环

前言当粒子已经找到最佳位置后,再增加迭代次数只会浪费计算时间,那么我们能否设计一个策略,能够自动退出迭代呢?循环跳出策略(1)初始化最大迭代次数、计数器以及最大计数值(例如分别取100, 0, 20) (2)定义“函数变化量容忍度”,一般取非常小的正数; (3)在迭代的过…

粒子群算法改进--线性递减惯性权重

惯性权重回顾 惯性权重w体现的是粒子继承先前的速度的能力 Shi,Y最先将惯性权重w引入到粒子群算法中,并且分析指出一个较大的惯性权值有利于全局搜索一个较小的权值则更利于局部搜索线性递减惯性权重在搜索初期,增强全局搜索能力可以更大可能遍历解空间,避免陷入局部最优解 &…

粒子群算法改进--压缩因子法

前言概述 粒子速度更新公式如下: vid = wvid-1 + c1r1(pbestid-xid)+ c2r2(gbestd-xid) 在研究完粒子群算法中有关惯性权重的优化之后,我们把目光转向速度更新公式的后两项,根据之前所学可知:个体学习因子c1和社会学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒…

Mybatis-Plus异常处理

返回结果为2 ,我从Controller层中写的返回是一个floor实体,到Mapper层中返回的也是floor实体,但是Mapper返回是2条数据。 把controller层的返回值改为List。

关于sqlserver空间占用问题(.bak文件占用)

sqlserver跑项目的时候很可能涉及到较大的数据量(一开始占我c盘70GB!!!然后删了,然后就出事儿了,二次安装恶心至极,需要二次安装的话建议看我的上一篇文章)先打开ssms(SQL Server Management Studio)并连接,然后右击服务器找到属性 点击数据库设置,建议!!!直接改…

最近发现git bash运行很慢?

最近发现git bash打开运行后,键入命令,通常要五六秒,甚至十几秒才会响应。 打开上面这个后,比如输入git status要好久才会响应。 我的是双显卡导致的,解决办法:打开设备管理器,禁用其中一个显示适配器,速度就会快很多。 具体步骤截图: 1.搜索设备管理器 2.找到显示适…