基于 RNN 的语言模型

基于 RNN 的语言模型

循环神经网络(Recurrent Neural Network, RNN)是一类网络连接中包含环路的
神经网络的总称。
给定一个序列,RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度,历史状态被循环累积,并作为预测未来状态的依据。RNN 可以基于历史规律,对未来进行预测。
基于 RNN 的语言模型,以词序列作为输入,基于被循环编码的上文和当前词来预测下一个词出现的概率。

循环神经网络 RNN

按照推理过程中信号流转的方向,神经网络的正向传播范式可分为两大类:前馈传播范式和循环传播范式。
采用前馈传播范式的神经网络可以统称为前馈神经网络(Feed-forward Neural Network,FNN),
而采用循环传播范式的神经网络被统称为循环神经网络(Recurrent Neural Network, RNN)
在这里插入图片描述

前馈神经网络(FNN)

  • 计算是逐层向前的,没有反馈连接。
  • 输出仅依赖于当前输入,不考虑历史信息
计算公式
  1. 输入层

    • 假设输入向量为 x = [ x 1 , x 2 , . . . , x n ] \mathbf{x} = [x_1, x_2, ..., x_n] x=[x1,x2,...,xn]
  2. 隐藏层(如果有多个隐藏层,这个过程会重复):

    • 每个神经元的加权输入计算为 z = w 1 x 1 + w 2 x 2 + . . . + w n x n + b z = w_1x_1 + w_2x_2 + ... + w_nx_n + b z=w1x1+w2x2+...+wnxn+b,其中 w i w_i wi是权重, b b b是偏置项。
    • 激活函数 g ( z ) g(z) g(z)被应用于加权输入,以产生神经元的输出。常见的激活函数包括 Sigmoid、Tanh、ReLU 等。
    • 因此,隐藏层的输出 h h h可以表示为 h = g ( z ) = g ( w 1 x 1 + w 2 x 2 + . . . + w n x n + b ) h = g(z) = g(w_1x_1 + w_2x_2 + ... + w_nx_n + b) h=g(z)=g(w1x1+w2x2+...+wnxn+b)
  3. 输出层

    • 输出层的计算与隐藏层类似,但是输出层的输出通常不经过非线性激活函数(如果是分类问题,最后一层可能使用 Softmax 函数)。
    • 输出 o \mathbf{o} o可以表示为 o = f ( V h + b ) \mathbf{o} = f(Vh + b) o=f(Vh+b),其中 V V V是从隐藏层到输出层的权重矩阵, h h h是隐藏层的输出向量, b b b是输出层的偏置项, f f f是输出层的激活函数(对于回归问题, f f f可以是恒等函数)。

以一个具体的数学表达式来表示一个简单的FNN模型的前向传播过程:

假设有一个输入向量 x \mathbf{x} x,一个隐藏层,其权重矩阵为 W \mathbf{W} W,偏置向量为 b \mathbf{b} b,激活函数为 g g g,以及一个输出层,其权重矩阵为 V \mathbf{V} V,偏置向量为 b ′ \mathbf{b}' b,输出层激活函数为 f f f

  1. 计算隐藏层的加权输入和输出:
    z = W x + b \mathbf{z} = \mathbf{W}\mathbf{x} + \mathbf{b} z=Wx+b
    h = g ( z ) \mathbf{h} = g(\mathbf{z}) h=g(z)
  2. 计算输出层的加权输入和输出:
    o = V h + b ′ \mathbf{o} = \mathbf{V}\mathbf{h} + \mathbf{b}' o=Vh+b
    y = f ( o ) \mathbf{y} = f(\mathbf{o}) y=f(o)
    其中, y \mathbf{y} y是网络的最终输出。这个过程是逐层向前的,每一层的输出仅依赖于当前层的输入和权重,而不依赖于网络中其他层的历史信息。

循环神经网络(RNN)

RNN 的工作方式:

  • 输入序列被逐个元素地串行输入。具有循环连接,可以将之前的状态信息传递到后续的计算中。
  • 每个时间步的隐状态是前一个隐状态和当前输入的函数。输出不仅依赖于当前输入,还依赖于之前的所有输入,因为它们被编码在隐状态中。
  • 输出是当前隐状态的函数。
基本计算公式:
  1. 隐藏状态更新公式
    h t = f ( W h h h t − 1 + W x h x t + b h ) h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b_h) ht=f(Whhht1+Wxhxt+bh)

    • h t h_t ht是时间步 t t t的隐藏状态。
    • h t − 1 h_{t-1} ht1是时间步 t − 1 t-1 t1的隐藏状态。
    • x t x_t xt是时间步 t t t的输入。
    • W h h W_{hh} Whh是隐藏状态到隐藏状态的权重矩阵。
    • W x h W_{xh} Wxh是输入到隐藏状态的权重矩阵。
    • b h b_h bh是隐藏状态的偏置项。
    • f f f是激活函数,常用的激活函数包括tanh、ReLU等。
  2. 输出计算公式
    y t = g ( W h y h t + b y ) y_t = g(W_{hy}h_t + b_y) yt=g(Whyht+by)

    • y t y_t yt是时间步 t t t的输出。
    • W h y W_{hy} Why是隐藏状态到输出的权重矩阵。
    • b y b_y by是输出的偏置项。
    • g g g是输出层的激活函数,对于分类问题可能是softmax函数,对于回归问题可能是线性函数。

梯度衰减

问题描述
在RNN中,梯度需要通过时间反向传播,每一步的梯度计算都会涉及到前一步的权重。如果权重的导数(梯度)是小于1的正数,那么随着时间步的增加,梯度会指数级减少。这意味着对于较早时间步的输入,网络很难学习到它们对最终输出的影响。

解决方案

  1. 使用ReLU激活函数:相比于tanh或sigmoid,ReLU激活函数可以减轻梯度衰减问题,因为它的导数在正区间内是常数。
  2. 权重初始化:使用如Glorot初始化(Xavier初始化)或He初始化等方法,可以更好地控制梯度的大小。
  3. 梯度裁剪(Gradient Clipping):通过限制梯度的大小来防止梯度爆炸,间接缓解梯度衰减。
  4. 使用LSTM或GRU:这两种RNN的变体通过引入门控机制来减少梯度衰减的影响。

梯度爆炸

问题描述
与梯度衰减相反,梯度爆炸是指在反向传播过程中,梯度值随着时间步的增加而变得非常大,导致权重更新过大,从而使学习过程变得不稳定。

解决方案

  1. 梯度裁剪:在每次更新前,将梯度限制在一个合理的范围内,以防止梯度爆炸。
  2. 使用LSTM或GRU:这两种结构通过门控机制来控制信息流,从而减少梯度爆炸的风险。
  3. 正则化:如L1、L2正则化,可以限制权重的大小,间接控制梯度的大小。
  4. 使用批量归一化(Batch Normalization):在RNN中应用批量归一化可以帮助稳定梯度。
其他注意事项
  • 截断反向传播(Truncated Backpropagation Through Time, TBPTT):这种方法不是在整个序列上进行反向传播,而是在序列的一个小片段上进行,可以减少计算量并减轻梯度问题。
  • 调整学习率:使用自适应学习率算法,如Adam,可以帮助更好地控制学习过程。

基于循环神经网络(RNN)的语言模型

基于循环神经网络(RNN)的语言模型是一种序列生成模型,它能够根据当前词和之前的隐藏状态来预测下一个词的概率。

  1. 条件概率

    • 给定词序列 { w 1 , w 2 , … , w N } \{w_1, w_2, \ldots, w_N\} {w1,w2,,wN},RNN语言模型预测下一个词 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)
  2. 序列的整体概率

    • 整个词序列 { w 1 , w 2 , … , w N } \{w_1, w_2, \ldots, w_N\} {w1,w2,,wN} 出现的概率可以表示为:
      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)
  3. 输出向量

    • RNN的输出是一个向量,其中每一维代表词典中对应词的概率。如果词典 D D D 中有 ∣ D ∣ |D| D 个词,那么输出向量 o i o_i oi 可以表示为:
      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 出现的概率。
  4. 序列的整体概率计算

    • 利用输出向量,整个序列的概率可以表示为:
      P ( w 1 : N ) = ∏ i = 1 N o i [ w i + 1 ] P(w_1:N) = \prod_{i=1}^{N} o_i[w_{i+1}] P(w1:N)=i=1Noi[wi+1]
    • 这里 o i [ w i + 1 ] o_i[w_{i+1}] oi[wi+1] 是在第 i i i 步输出中,词 w i + 1 w_{i+1} wi+1 的概率。

损失函数和训练

  1. 交叉熵损失

    • 使用交叉熵损失函数来衡量模型预测的概率分布与真实词的概率分布之间的差异:
      l C E ( o i ) = − ∑ d = 1 ∣ D ∣ I ( w ^ d = w i + 1 ) log ⁡ o i [ w ^ d ] l_{CE}(o_i) = -\sum_{d=1}^{|D|} I(\hat{w}_d = w_{i+1}) \log o_i[\hat{w}_d] lCE(oi)=d=1DI(w^d=wi+1)logoi[w^d]
    • 其中 I ( ⋅ ) I(\cdot) I() 是指示函数,当 w ^ d = w i + 1 \hat{w}_d = w_{i+1} w^d=wi+1 时为1,否则为0。
  2. 总损失

    • 训练集 S S S 的总损失是所有样本损失的平均值:
      L ( S , W I , W H , W O ) = 1 ∣ S ∣ ∑ s = 1 ∣ S ∣ ∑ i = 1 N l C E ( o i , s ) L(S, W_I, W_H, W_O) = \frac{1}{|S|} \sum_{s=1}^{|S|} \sum_{i=1}^{N} l_{CE}(o_{i,s}) L(S,WI,WH,WO)=S1s=1Si=1NlCE(oi,s)
    • 这里 o i , s o_{i,s} oi,s 是第 s s s 个样本在第 i i i 步的输出。

文本生成和训练策略

  1. 自回归(Autoregressive)

    • 在文本生成中,模型通过迭代预测下一个词来生成文本。
      (1) 错误级联放大
      选用模型自己生成的词作为输入可能会有错误,这样的错误循环输入,将会不断的放大错误,导致模型不能很好拟合训练集;
      (2) 串行计算效率低
      因为下一个要预测的词依赖上一次的预测,每次预测之间是串行的,难以进行并行加速。
  2. Teacher Forcing

    • 在训练过程中,使用真实的下一个词作为输入,而不是模型预测的词,以提高训练效率和效果。
    • 在 TeacherForcing 中,每轮都仅将输出结果与“标准答案”(Ground Truth)进行拼接作为下一轮的输入。
  3. 曝光偏差(Exposure Bias)

    • 由于训练和推理过程中的差异导致的偏差。
    • Teacher Forcing 的训练方式将导致曝光偏差(Exposure Bias)的问题。
    • 曝光偏差是指 Teacher Forcing 训练模型的过程和模型在推理过程存在差异
    • TeacherForcing 在训练中,模型将依赖于“标准答案”进行下一次的预测,但是在推理预测中,模型“自回归”的产生文本,没有“标准答案”可参考。
      Scheduled Sampling
      一种减少曝光偏差的方法,通过在训练过程中逐渐引入模型自己生成的词。
      循序渐进的使用一小部分模型自己生成的词代替“标准答案”,在训练过程中对推理中无“标准答案”的情况进行预演。

RNN语言模型通过这些机制来学习序列数据的模式,并能够用于文本生成等任务。然而,由于RNN的循环迭代本质,它在处理长序列时训练较慢,且不易进行并行计算。因此,后续的研究中出现了基于Transformer的模型,它能够更有效地处理这些问题。

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

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

相关文章

第二十九篇——线性代数:“矩阵”到底怎么用?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 数学中的线性代数,再生活中的落地和应用,是我这个…

nodejs:下载,安装,系统环境配置,更换镜像

​​​​下载 地址:https://nodejs.org/zh-cn/download/prebuilt-installer 安装包 开始安装 安装完成 给文件夹添加权限 创建两个文件夹 node_cache node_global 更新环境变量 修改环境变量,新的全局模块路径,这样在任何位置运行命令时都…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

2024.11.9更新 开关mpo ulps 感觉有用但是还是掉驱动,现在确定是window顶驱动问题 按网上的改注册表和组策略会让自己也打不上驱动 目前感觉最好的办法就是,重置此电脑,然后你就摆着电脑挂个十分钟半小时别动,一开始他是不显示…

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构,肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权,负责对犯罪行为提起公诉,并监督整个诉讼过程,同时积极参与社会治理,保护公民权益,推动法…

【论文阅读】火星语义分割的半监督学习

【论文阅读】火星语义分割的半监督学习 文章目录 【论文阅读】火星语义分割的半监督学习一、介绍二、联系工作3.1Deep Learning for Mars3.2 数据集可以分为三类:3.3 半监督学习 三、提出的火星图像分割数据集四、方法四、实验 S 5Mars: Semi-Supervised Learning …

蓝桥杯 懒洋洋字符串--字符串读入

题目 代码 #include <iostream>using namespace std;int main(){int n;cin>>n;char s[210][4];int ans0;for(int i0;i<n;i){scanf("%s",s[i]);}for(int i0;i<n;i){char as[i][0];char bs[i][1];char cs[i][2];// cout<<a<< <<b…

免费送源码:Java+ssm+MySQL 在线购票影城 计算机毕业设计原创定制

摘要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设在线购票影城。 本设计…

Qt 软键盘设计

最近有客户用的电脑是触屏的&#xff0c;所以不用键盘与鼠标&#xff0c;系统的键盘不好看&#xff0c;所以自己设计一个键盘显示&#xff0c;先看下效果图&#xff1b; 设计思路&#xff0c;构建一个软键盘设计界面并重写输入框&#xff0c;然后做界面提升,直接上代码 class …

94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删

目录 1.双向链表 2.结构体的定义 3.示意图 3.代码示例 1.双向链表的尾插 示意图 代码 main.c List.h List.c 详细分析代码的执行过程 双向链表的初始化 2.双向链表的打印 代码 3.双向链表的尾删 1.双向链表 以一种典型的双向链表为例:带头双向循环链表(带头:带…

区块链技术入门:以太坊智能合约详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太…

Mybatis Plus 集成 PgSQL 指南

“哲学家们只是用不同的方式解释世界&#xff0c;而问题在于改变世界。” ——卡尔马克思 (Karl Marx) 解读&#xff1a;马克思强调了实践的重要性&#xff0c;主张哲学不仅要理解世界&#xff0c;更要致力于改造世界。 本文我们引入 Mybatis Plus 作为 ORM &#xff0c;并且使…

苍穹外卖day09超出配送范围前端不提示问题

同学们在写苍穹外卖项目day09时调用了百度地图api来判断用户地址是否超出配送范围&#xff0c; 但是在黑马官方的课程或资料中&#xff0c;出现这样的问题时只会向用户端的控制台报错并不会提醒用户 如下图&#xff1a; 解决方法&#xff1a; 其实解决方法很简单只需要找到向…

【Linux系列】命令行中的文本处理:从中划线到下划线与大写转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件

文章目录 一、MyBatis介绍1、MyBatis简介2、MyBatis特性3、和其它持久化层技术对比 二、搭建MyBatis基本步骤1、创建Maven工程2、添加log4j2的配置文件3、创建MyBatis的核心配置文件4、创建Mapper接口5、创建MyBatis映射文件&#xff08;增删改查&#xff09;6、创建Junit测试功…

推动企业数字化转型的三驾马车:DataOps与DevOps、MLOps的关系及其重要性

在当今快速发展的技术领域&#xff0c;DevOps、DataOps和MLOps成为了推动企业数字化转型的三大核心实践。它们各自关注不同的领域&#xff0c;但又相互关联&#xff0c;共同推动着软件和数据的高效开发与运营。 DevOps&#xff1a;软件开发的加速器 DevOps是一种将开发&#…

下载 AndroidStudio 旧版本方法

1.打开官网&#xff1a; 点击Read release notes 然后就是各个历史版本了&#xff1a; 直接点链接好像也行&#xff1a;https://developer.android.com/studio/archive

ONLYOFFICE 8.2深度测评:集成PDF编辑、数据可视化与AI功能的强大办公套件

本文 一、文档编辑与PDF支持主要功能概述 二、数据可视化和增强的表格工具数据可视化功能亮点 三、AI驱动的摘要功能AI摘要功能优势 四、演示文稿的增强功能主要更新 五、协同办公能力的提升协同功能更新 六、跨平台兼容与开放文档格式跨平台与兼容性 七、安全性与隐私保护安全…

彻底理解ARXML中的PDU

文章目录 一、DBC报文信号的发送二、ARXML报文信号的发送2.1 什么是PDU2.2 PDU的类型2.3 Container-I-PDU的发送 三、小结 在CANFD支持可变速率和更大的数据长度&#xff08;64字节&#xff09;的情况下&#xff0c;可以使用DBC和ARXML两种数据库格式来进行报文通信&#xff0c…

el-scrollbar 动态更新内容 鼠标滚轮无效

有以下功能逻辑&#xff0c;实现了一个时间轴组件&#xff0c;点击、-号后像地图那样放大组件以显示不同的UI。 默认显示年月&#xff1a; 当点击一下加号时切换为年&#xff1a; 当点击减号时切换为日&#xff1a; 即加号、减号点击就是在年月日显示进行切换。给Scrollvie…

LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)

点阵字模提取&#xff1a; https://pan.baidu.com/s/1DZSeLyD_SUkaHRgTm26o-A 提取码: 1111 一、LED点阵显示器结构 点亮点阵中一个发光二极管条件&#xff1a;对应行为高电平&#xff0c;对应列为低电平。如在很短时间内依次点亮很多个发光二极管&#xff0c;LED点阵就可显示…