【大模型基础_毛玉仁】1.2 基于RNN的语言模型


【大模型基础_毛玉仁】1.2 基于RNN的语言模型

    • 1.2 基于RNN的语言模型
      • 1.2.1 循环神经网络RNN
      • 1.2.2 基于RNN的语言模型
        • 1)概率说明:
        • 2)损失函数
        • 3)问题


1.2 基于RNN的语言模型

循环神经网络(RecurrentNeuralNetwork,RNN)是一类网络连接中包含环路的神经网络的总称。

给定一个序列,RNN的环路用于将历史状态叠加到当前状态上。 沿着时间维度,历史状态被循环累积,并作为预测未来状态的依据。

基于RNN的语言模型,以词序列作为输入,基于被循环编码的上文和当前词来预测下一个词出现的概率。

本节将先对原始RNN 的基本原理进行介绍,然后讲解如何利用RNN构建语言模型。

1.2.1 循环神经网络RNN

按推理过程中信号流转的方向,神经网络正向传播范式分为两类:前馈传播范式和循环传播范式,对应网络如下:

  • 前馈神经网络(Feed-forward Neural Network,FNN):计算逐层向前“不走回头路”。

  • 循环神经网络(RecurrentNeuralNetwork, RNN):某些层计算结果会通过环路反向引回前面层中,形成“螺旋式前进”。

FNN和RNN:

以包含输入层、隐藏层、输出层的神经网络为例。图1.2中展示了最简单的FNN和RNN的网络结构示意图:

图1.2: 前馈传播范式与循环传播范式的对比。
在这里插入图片描述

设输入序列为 { x 1 , x 2 , x 3 , . . . , x t } \{x_1,x_2,x_3,...,x_t\} {x1,x2,x3,...,xt},隐状态为 { h 1 , h 2 , h 3 , . . . , h t } \{h_1,h_2,h_3,...,h_t\} {h1,h2,h3,...,ht},对应输出为 { o 1 , o 2 , o 3 , . . . , o t } \{o_1, o_2,o_3,..., o_t\} {o1,o2,o3,...,ot}

输入层、隐藏层、输出层对应的网络参数分别为 W I W_I WI, W H W_H WH, W O W_O WO。 g(·) 为激活函数,f(·)为输出函数。

将输入序列一个元素接着一个元素地串行输入时,

对于FNN,当前的输出只与当前的输入有关,即: (此处为方便对比,省去了偏置项)

o t = f ( W O g ( W I x t ) ) o_t = f(W_Og(W_I x_t)) ot=f(WOg(WIxt))

RNN在串行输入的过程中,前面的元素会被循环编码成隐状态,并叠 加到当前的输入上面。其在t时刻的输出如下:

h t = g ( W H h t − 1 + W I x t ) = g ( W H g ( W H h t − 2 + W I x t − 1 ) + W I x t ) = ⋯ ⋯ h_t = g(W_H h_{t-1} + W_I x_t) = g(W_H g(W_H h_{t-2} + W_I x_{t-1}) + W_I x_t) = \cdots \cdots ht=g(WHht1+WIxt)=g(WHg(WHht2+WIxt1)+WIxt)=⋯⋯

o t = f ( W O h t ) o_t = f(W_O h_t) ot=f(WOht)

其中, t > 0, h0 = 0。将此过程按照时间维度展开,可得到RNN的推理过程,如 图1.3所示。

图1.3: RNN推理过程从时间维度拆解示意图。
在这里插入图片描述

FNN和RNN总结:

可以发现,在这样一个元素一个元素依次串行输入的设定下,

RNN: 可以将历史状态以隐变量的形式循环叠加到当前状态上,对历史信息进行考虑,呈现出螺旋式前进的模式。

FNN: 缺乏环路,仅对当前状态进行考虑,无法兼顾历史状态。

FNN和RNN问题:

如果FNN想要做到对历史信息进行考虑,则需要将所有元素同时输入到模型中去,这将导致模型参数量的激增。

虽然,RNN的结构可以让其在参数量不扩张的情况下实现对历史信息的考虑,但是这样的环路结构给RNN的训练带来了挑战。 在训练RNN时,涉及大量的矩阵联乘操作,容易引发梯度消失梯度爆炸问题。

RNN梯度问题:

  • 梯度消失:

    • 训练过程中,由于连续乘积中包含大量小于1的梯度,导致网络中较早时间步的梯度变得非常小,几乎接近于零。这使得网络难以学习到长距离的依赖关系。
  • 梯度爆炸:

    • 训练过程中,由于连续乘积中包含大量大于1的梯度,导致网络中较早时间步的梯度变得非常大,以至于更新权重时会导致模型不稳定。

RNN具体分析如下:
设 RNN 语言模型的训练损失为:

L = L ( x , o , W I , W H , W O ) = ∑ i = 1 t l ( o i , y i ) L = L(x, o, W_I, W_H, W_O) = \sum_{i=1}^{t} l(o_i, y_i) L=L(x,o,WI,WH,WO)=i=1tl(oi,yi)

其中, l ( ⋅ ) l(\cdot) l() 为损失函数,$y_i $ 为标签。

损失L关于参数 W H W_H WH的梯度为:

∂ L ∂ W H = ∑ i = 1 t ∂ l t ∂ o t ⋅ ∂ o t ∂ h t ⋅ ∂ h t ∂ h i ⋅ ∂ h i ∂ W H \frac{\partial L}{\partial W_H} = \sum_{i=1}^{t} \frac{\partial l_t}{\partial o_t} \cdot \frac{\partial o_t}{\partial h_t} \cdot \frac{\partial h_t}{\partial h_i} \cdot \frac{\partial h_i}{\partial W_H} WHL=i=1totlthtothihtWHhi

其中,

∂ h t ∂ h i = ∂ h t ∂ h t − 1 ∂ h t − 1 ∂ h t − 2 ⋯ ∂ h i + 1 ∂ h i = ∏ k = i + 1 t ∂ h k ∂ h k − 1 \frac{\partial h_t}{\partial h_i} = \frac{\partial h_t}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial h_{t-2}} \cdots \frac{\partial h_{i+1}}{\partial h_i} = \prod_{k=i+1}^{t} \frac{\partial h_k}{\partial h_{k-1}} hiht=ht1htht2ht1hihi+1=k=i+1thk1hk

并且,

∂ h k ∂ h k − 1 = ∂ g ( z k ) ∂ z k W H \frac{\partial h_k}{\partial h_{k-1}} = \frac{\partial g(z_k)}{\partial z_k} W_H hk1hk=zkg(zk)WH

其中,$ z_k = W_H h_{k-1} + W_I x_k$ 。综上,有

∂ L ∂ W H = ∑ i = 1 t ∂ l t ∂ o t ⋅ ∂ o t ∂ h t ⋅ ∏ k = i t ∂ g ( z k ) ∂ z k W H ⋅ ∂ h i ∂ W H \frac{\partial L}{\partial W_H} = \sum_{i=1}^{t} \frac{\partial l_t}{\partial o_t} \cdot \frac{\partial o_t}{\partial h_t} \cdot \prod_{k=i}^{t} \frac{\partial g(z_k)}{\partial z_k} W_H \cdot \frac{\partial h_i}{\partial W_H} WHL=i=1totlthtotk=itzkg(zk)WHWHhi

从上式中可以看出,求解 W H W_H WH的梯度时涉及大量的矩阵级联相乘。这会导致其数值被级联放大或缩小。

  • W H W_H WH的最大特征值小于1时,会发生梯度消失;

  • W H W_H WH的最大特征值大于1时,会发生梯度爆炸。

梯度消失和爆炸导致训练上述RNN非常困难。为了解决梯度消失和爆炸问题,GRU和LSTM引入门控结构,取得了良好效果,成为主流的RNN网络架构。

1.2.2 基于RNN的语言模型

1)概率说明:

对词序列 { x 1 , x 2 , x 3 , . . . , x t } \{x_1,x_2,x_3,...,x_t\} {x1,x2,x3,...,xt},基于RNN的语言模型每次根据当前词 w i w_i wi和循环输入的隐藏状态 h i − 1 h_{i−1} hi1,来预测下一个词 w i + 1 w_{i+1} wi+1出现的概率,即:

P ( w i + 1 ∣ w 1 : i ) = P ( w i + 1 ∣ w i , h i − 1 ) P(w_{i+1} ∣w_{1:i} )=P(w_{i+1} ∣w_i ,h_{i−1} ) P(wi+1w1:i)=P(wi+1wi,hi1)

说明:给定前面的词序列 w 1 : i w_{1:i} w1:i​,下一个词 w i + 1 w_{i+1} wi+1​ 的概率,可简化为只依赖于当前词 w i w_i wi​ 和前一个隐藏状态 h i − 1 h_{i−1} hi1​。

整个句子序列的概率:(整个句子)

P ( w 1 : N ) = ∏ i = 1 N − 1 P ( w i + 1 ∣ w i , h i − 1 ) P(w_{1:N}) = \prod_{i=1}^{N-1} P(w_{i+1} | w_i, h_{i-1}) P(w1:N)=i=1N1P(wi+1wi,hi1)

RNN的语言模型中,输出为一个向量,其中每一维代表着词典中对应 词的概率。

设词典D中共有|D|个词 { w ^ 1 , w ^ 2 , w ^ 3 , . . . , w ^ ∣ D ∣ } \{\hat{w}_1, \hat{w}_2, \hat{w}_3, ..., \hat{w}_{|D|}\} {w^1,w^2,w^3,...,w^D},基于RNN的语言模型 的输出可表示为 o i = { o i [ w ^ d ] } d = 1 ∣ D ∣ o_i = \{o_i[\hat{w}_d]\}_{d=1}^{|D|} oi={oi[w^d]}d=1D,其中, o i [ w ^ d ] o_i[\hat{w}_d] oi[w^d] 表示词典中的词 w ^ d \hat{w}_d w^d 出现的概率。因此,对基于RNN的语言模型有:

P ( w 1 : N ) = ∏ i = 1 N − 1 P ( w i + 1 ∣ w 1 : i ) = ∏ i = 1 N o i [ w i + 1 ] P(w_{1:N}) = \prod_{i=1}^{N-1} P(w_{i+1} | w_{1:i}) = \prod_{i=1}^{N} o_i[w_{i+1}] P(w1:N)=i=1N1P(wi+1w1:i)=i=1Noi[wi+1]

示例: 设有词典 D={我,喜欢,吃,苹果},并且有一个句子“我喜欢吃苹果”。我们用RNN来建模这个句子的概率。

首先,我们初始化隐藏状态 h0​,然后逐个词输入到RNN中。

  1. 输入第一个词“我”,计算隐藏状态 h1​ 和输出向量 o1​。

  2. 输入第二个词“喜欢”,基于 h1​ 计算 h2​ 和 o2​。

  3. 输入第三个词“吃”,基于 h2​ 计算 h3​ 和 o3​。

  4. 输入第四个词“苹果”,基于 h3​ 计算 h4​ 和 o4​。

每一步的输出向量 oi​ 都是一个4维的概率分布,对应词典中的每个词。

例如,假设 o1​=[0.1,0.2,0.3,0.4]=[(我)的概率, (喜欢)的概率, (吃)的概率, (苹果)的概率],那么 o1​[苹果]=0.4。

根据公式,整个句子的概率就是:

  • P(我, 喜欢, 吃, 苹果)=o1​[喜欢]×o2​[吃]×o3​[苹果]

假设 o1​[喜欢]=0.2,o2​[吃]=0.3,o3​[苹果]=0.4,那么:

  • P(我, 喜欢, 吃, 苹果)=0.2×0.3×0.4=0.024

所以,这个句子的概率就是0.024。

2)损失函数

基于以上预训练任务,对RNN语言模型进行训练时,可选用如下交叉熵函数作为损失函数。

l C E ( o i ) = − ∑ d = 1 ∣ D ∣ I ( w ^ d = w i + 1 ) log ⁡ o i [ w i + 1 ] = − log ⁡ o i [ w i + 1 ] l_{CE}(o_i) = -\sum_{d=1}^{|D|} I(\hat{w}_d = w_{i+1}) \log o_i[w_{i+1}] = -\log o_i[w_{i+1}] lCE(oi)=d=1DI(w^d=wi+1)logoi[wi+1]=logoi[wi+1]

其中,$ I(\cdot) $ 为指示函数,当 $ \hat{w}d = w{i+1} $ 时等于 1,当 $ \hat{w}d \neq w{i+1} $ 时等于 0。

设训练集为 S ,RNN 语言模型的损失可以构造为:

L ( S , W I , W H , W O ) = 1 N ∣ S ∣ ∑ s = 1 ∣ S ∣ ∑ i = 1 N l C E ( o i , s ) L(S, W_I, W_H, W_O) = \frac{1}{N|S|} \sum_{s=1}^{|S|} \sum_{i=1}^{N} l_{CE}(o_{i,s}) L(S,WI,WH,WO)=NS1s=1Si=1NlCE(oi,s)

其中, o i , s o_{i,s} oi,s 为 RNN 语言模型输入第s个样本的第i个词时的输出。

3)问题

“自回归”过程存在着两个问题:

  • 错误级联放大: 错误循环输入,将会不断的放大错误,导致模型不能很好拟合训练集;

  • 串行计算效率低:因为下一个要预测的词依赖上一次的预测,每次预测之间是串行的,难以进行并行加速。

为解决上述问题,有以下方法:

  • Teacher Forcing: 每轮都仅将输出结果与“标准答案”(GroundTruth)进行拼接作为下 一轮的输入。将导致曝光偏差(ExposureBias)的问题。

    • 曝光偏差:是指Teacher Forcing 训练模型的过程和模型在推理过程存在差异。

    • Teacher Forcing 在训练中,模型将依赖于“标准答案”进行下一次的预测,但是在推理预测中,模型“自回归”的产生文本,没有“标准答案”可参考。所以模型在训练过 程中和推理过程中存在偏差,可能推理效果较差。

  • ScheduledSampling: 其在TeacherForcing的 训练过程中循序渐进的使用一小部分模型自己生成的词代替“标准答案”,在训练 过程中对推理中无“标准答案”的情况进行预演。

.


其他参考:【大模型基础_毛玉仁】系列文章


声明:资源可能存在第三方来源,若有侵权请联系删除!

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

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

相关文章

三参数水质在线分析仪:从源头保障饮用水安全

【TH-ZS03】饮用水安全是人类健康的重要保障,其质量直接关系到人们的生命健康。随着工业化、城市化的快速发展,水体污染问题日益严峻,饮用水安全面临着前所未有的挑战。为了从源头保障饮用水安全,科学、高效的水质监测手段必不可少…

MiniMind用极低的成本训练属于自己的大模型

本篇文章主要讲解,如何通过极低的成本训练自己的大模型的方法和教程,通过MiniMind快速实现普通家用电脑的模型训练。 日期:2025年3月5日 作者:任聪聪 一、MiniMind 介绍 基本信息 在2小时,训练出属于自己的28M大模型。…

后验概率估计

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、基本定义 🧮 …

错误: 加载主类时出现 LinkageError,java.lang.UnsupportedClassVersionError 解决方案

分析: 可能就是我们在配置完jdk的path时候,电脑没有重启idea还没有更新path环境jdk版本. 解决办法: 1.重启电脑 2.seting设置对应的jdk版本 Project Structure中设置jdk版本 运行就解决了 一键三连 一起学习 一起进步. 推动科技发展, 为科技赋能.

学习记录-用例设计编写

黑马测试视频记录 目录 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法​编辑 5、错误推荐法 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法 5、错误推荐法 时间紧任务重…

软件测试(三)——Bug篇

文章目录 Bug篇软件测试的生命周期BugBug的概念Bug的要素Bug的级别Bug的生命周期 与开发发生争执怎么办 Bug篇 大部分的Bug都是测试人员提出的,因此在Bug篇的开始会先介绍软件测试的生命周期。同时,了解软件测试的生命周期能帮助我们了解测试的工作&…

Source插件之GstBaseSrc源码剖析

gst插件流程分析先看init构造函数gst_base_src_init(本文流程主要基于filesrc插件讲解) static void gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class) {GstPad *pad;GstPadTemplate *pad_template;basesrc->priv gst_base_src_get_ins…

React:Redux

Redux引入 Redux感觉像组件通信的中介 state存放被管理的状态 action是申请改哪些数据,传入什么参数 reducer是怎么修改数据 我的理解更像是action像一个储存方法的对象,reducer是具体的方法的实现,不同的方法实现也不一样 store是个仓库…

CoDrivingLLM

CoDrivingLLM 思路 1.输入和输出 输入 算法的输入包括车辆当前时刻的状态 S t S_t St​ ,这个状态包含了车辆的位置、速度、行驶方向等信息;以及参与协同驾驶的联网自动驾驶汽车列表C,用于确定需要进行决策的车辆集合。 输出 输出为车辆…

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

xxxxx

从别人blog偷的~,自己复习用 爱奇艺 一面 介绍项目项目中用到的设计模式项目中如何处理高并发Redis集群Redis RDB 和 AOF原理Redis除了缓存和分布式锁还能干什么&#xff1f;数据库如何优化&#xff0c;索引的数据结构&#xff0c;多表联合如何优化RedissonAOP逻辑&#xff…

Yocto + 树莓派摄像头驱动完整指南

—— 从驱动配置、Yocto 构建&#xff0c;到 OpenCV 实战 在树莓派上运行摄像头&#xff0c;在官方的 Raspberry Pi OS 可能很简单&#xff0c;但在 Yocto 项目中&#xff0c;需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键…

总结(尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程)

1.Vue简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece 1.1.性能的提升 打包大小减少41%。 初次渲染快55%, 更新渲染快133%。 内存减少54%。 1.2.源码的升级 使用Proxy代替defineProperty实现响应式。 重写虚拟DOM的实现和Tree-Shak…

【五.LangChain技术与应用】【8.LangChain提示词模板基础:从入门到精通】

早上八点,你端着咖啡打开IDE,老板刚甩来需求:“做个能自动生成产品描述的AI工具”。你自信满满地打开ChatGPT的API文档,结果半小时后对着满屏的"输出结果不稳定"、"格式总出错"抓耳挠腮——这时候你真需要好好认识下LangChain里的提示词模板了。 一、…

基于编程语言的建筑行业施工图设计系统开发可行性研究————从参数化建模到全流程自动化的技术路径分析

基于编程语言的建筑行业施工图设计系统开发可行性研究————从参数化建模到全流程自动化的技术路径分析 文章目录 **基于编程语言的建筑行业施工图设计系统开发可行性研究————从参数化建模到全流程自动化的技术路径分析** 摘要引言一、技术可行性深度剖析1.1 现有编程语言…

【Linux文件操作篇】IO基础——被打开的文件,引入文件描述符

--------------------------------------------------------------------------------------------------------------------------------- 每日鸡汤&#xff1a;现实会告诉你&#xff0c;不努力就会被生活给踩死。无需找什么借口&#xff0c;一无所有&#xff0c;就是拼的理由…

Docker 学习(三)——数据管理、端口映射、容器互联

一、数据管理 容器中的管理数据主要有两种方式&#xff1a; 数据卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器内数据直接映射到本地主机环境&#xff1b; 数据 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器维护数据卷 1.…

3月5日作业

代码作业&#xff1a; #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在&#xff0c;请选择操作&#xff1a; 1) 清空目录内容 2) 保留目…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999&#xff1a;GPU 的诞生&#xff1a;光栅化&#xff08;Rasterization&#xff09;3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现&#xff1a;OpenGL 3D 渲染管线设计1. 顶点处理&#xff…