基于 Transformer 的语言模型

news2024/11/27 16:39:19

基于 Transformer 的语言模型

Transformer 是一类基于注意力机制(Attention)的模块化构建的神经网络结构。给定一个序列,Transformer 将一定数量的历史状态和当前状态同时输入,然后进行加权相加。对历史状态和当前状态进行“通盘考虑”,然后对未来状态进行预测。

基于 Transformer 的语言模型,以词序列作为输入,基于一定长度的上文和当前词来预测下一个词出现的概率。

Transformer

Transformer 模型是由这两种核心模块构建的模块化网络结构,它们共同构成了模型的主体。下面我将详细介绍这两种模块:

1. 注意力(Attention)模块

注意力模块是 Transformer 中的核心,它允许模型在序列的不同位置之间动态地分配不同的注意力权重,从而捕捉序列内部的依赖关系。

  • 自注意力层(Self-Attention Layer)

  • 残差连接(Residual Connections)

  • 层正则化(Layer Normalization)

2. 全连接前馈(Fully-connected Feedforward)模块

全连接前馈模块对自注意力层的输出进行进一步的处理。

  • 全连接前馈层

  • 残差连接

  • 层正则化

Transformer 模型通过堆叠多个这样的注意力模块和全连接前馈模块来构建深层网络,每个模块都可以并行处理序列中的所有位置,这使得 Transformer 模型在处理序列数据时非常高效。此外,Transformer 模型不依赖于循环或卷积结构,这使得它在处理长距离依赖问题时比传统的RNN更加有效。

注意力模块与全连接前馈模块在这里插入图片描述
注意力机制示意图
在这里插入图片描述

自注意力层的工作原理

  1. 输入编码
    • 输入序列被编码为 Query(Q)、Key(K)和 Value(V)三部分。这些编码通常是通过与权重矩阵相乘得到的。
  2. 计算注意力权重
    • 通过计算 Query(Q)和 Key(K)之间的相似度来确定注意力权重 α \alpha α。这个相似度通常使用点积(dot product)来计算,即 sim ( q t , k i ) = q t ⋅ k i \text{sim}(q_t, k_i) = q_t \cdot k_i sim(qt,ki)=qtki
  3. 应用 softmax 函数
    • 计算得到的相似度分数通过 softmax 函数转换为概率分布,确保所有权重的和为1。这允许模型在不同位置之间动态地分配注意力。
  4. 加权求和
    • 使用得到的注意力权重 α \alpha α 对 Value(V)进行加权求和,得到最终的输出。
自注意力层的计算公式

自注意力层的计算可以表示为:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
其中:

  • Q Q Q 是 Query 矩阵。
  • K K K 是 Key 矩阵。
  • V V V 是 Value 矩阵。
  • d k d_k dk 是 Key 向量的维度。
  • d k \sqrt{d_k} dk 是为了稳定梯度,避免点积结果过大。
具体步骤
  1. 计算相似度
    sim ( q t , k i ) = q t ⋅ k i \text{sim}(q_t, k_i) = q_t \cdot k_i sim(qt,ki)=qtki
  2. 应用 softmax
    α t , i = exp ⁡ ( sim ( q t , k i ) ) ∑ i = 1 t exp ⁡ ( sim ( q t , k i ) ) \alpha_{t,i} = \frac{\exp(\text{sim}(q_t, k_i))}{\sum_{i=1}^{t} \exp(\text{sim}(q_t, k_i))} αt,i=i=1texp(sim(qt,ki))exp(sim(qt,ki))
  3. 加权求和
    Attention ( x t ) = ∑ i = 1 t α t , i v i \text{Attention}(x_t) = \sum_{i=1}^{t} \alpha_{t,i} v_i Attention(xt)=i=1tαt,ivi

全连接前馈层的工作原理

全连接前馈层通常包含两个线性变换,中间夹着一个非线性激活函数。这种结构使得模型能够学习输入数据的非线性表示。

  1. 第一层线性变换
    • 输入向量首先通过一个线性变换,通常表示为 W 1 v + b 1 W_1v + b_1 W1v+b1,其中 W 1 W_1 W1是权重矩阵, b 1 b_1 b1是偏置项。
  2. 非线性激活函数
    • 第一层线性变换的输出通过一个非线性激活函数,常用的激活函数是ReLU(Rectified Linear Unit),即 max ⁡ ( 0 , x ) \max(0, x) max(0,x)。这使得模型能够引入非线性,增加模型的表达能力。
  3. 第二层线性变换
    • 经过激活函数处理的输出再通过另一个线性变换,通常表示为 W 2 W_2 W2 乘以激活函数的输出加上偏置项 b 2 b_2 b2
全连接前馈层的计算公式

全连接前馈层的计算可以表示为:
FFN ( v ) = W 2 max ⁡ ( 0 , W 1 v + b 1 ) + b 2 \text{FFN}(v) = W_2 \max(0, W_1v + b_1) + b_2 FFN(v)=W2max(0,W1v+b1)+b2
其中:
- v v v 是输入向量。
- W 1 W_1 W1 W 2 W_2 W2 是权重矩阵。
- b 1 b_1 b1 b 2 b_2 b2 是偏置项。
- max ⁡ ( 0 , x ) \max(0, x) max(0,x) 是ReLU激活函数,它将所有负值置为0。

具体步骤
  1. 第一层线性变换
    z 1 = W 1 v + b 1 z_1 = W_1v + b_1 z1=W1v+b1
  2. 应用ReLU激活函数
    a 1 = max ⁡ ( 0 , z 1 ) a_1 = \max(0, z_1) a1=max(0,z1)
  3. 第二层线性变换
    FFN ( v ) = W 2 a 1 + b 2 \text{FFN}(v) = W_2a_1 + b_2 FFN(v)=W2a1+b2
    这种全连接前馈层的设计使得 Transformer 模型能够对序列中的每个位置进

层正则化的工作原理

层正则化通过对每个子层的输出进行归一化处理,使得每个样本的隐藏状态具有相同的均值和标准差,从而减少不同层之间的差异,使得训练更加稳定。

  1. 计算均值和标准差
    • 对于每个子层的输出,计算其均值 μ \mu μ 和标准差 δ \delta δ
  2. 归一化处理
    • 使用均值和标准差对输出进行归一化处理,使得归一化后的输出具有零均值和单位标准差。
  3. 缩放和平移
    • 通过两个可学习的参数 α \alpha α β \beta β 对归一化后的输出进行缩放和平移,以恢复模型的表达能力。
层正则化的计算公式

层正则化的计算可以表示为:
LN ( v i ) = α ( v i − μ δ ) + β \text{LN}(v_i) = \alpha \left( \frac{v_i - \mu}{\delta} \right) + \beta LN(vi)=α(δviμ)+β
其中:
- v i v_i vi 是子层的输出。
- μ \mu μ v i v_i vi 的均值。
- δ \delta δ v i v_i vi 的标准差。
- α \alpha α β \beta β 是可学习的参数,用于缩放和平移归一化后的输出。

具体步骤
  1. 计算均值和标准差
    μ = 1 N ∑ i = 1 N v i \mu = \frac{1}{N} \sum_{i=1}^{N} v_i μ=N1i=1Nvi
    δ = 1 N ∑ i = 1 N ( v i − μ ) 2 + ϵ \delta = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (v_i - \mu)^2 + \epsilon} δ=N1i=1N(viμ)2+ϵ
    其中 N N N 是样本数量,( \epsilon$ 是一个很小的常数,用于防止除以零。
  2. 归一化处理
    v i ^ = v i − μ δ \hat{v_i} = \frac{v_i - \mu}{\delta} vi^=δviμ
  3. 缩放和平移
    LN ( v i ) = α v i ^ + β \text{LN}(v_i) = \alpha \hat{v_i} + \beta LN(vi)=αvi^+β

残差连接的工作原理

残差连接(Residual Connection)是深度学习中用于解决梯度消失问题的一种技术,它通过将每个子层的输入直接添加到该子层的输出上来实现。

这种结构允许梯度在网络中更直接地流动,从而减轻了梯度消失的问题,并且有助于训练更深的网络。

在 Transformer 模型中,残差连接被广泛用于自注意力层和全连接前馈层。

  1. 子层输入和输出

    • 每个子层(例如自注意力层或全连接前馈层)接收输入 x x x 并产生输出 y y y
  2. 残差添加

    • 子层的输出 y y y 与输入 x x x 相加,形成残差连接的中间结果: x + y x + y x+y
  3. 层正则化

    • 将残差连接的结果 x + y x + y x+y 通过层正则化(Layer Normalization),以进一步稳定训练过程。

残差连接的计算公式

残差连接的计算可以表示为:
Output = LN ( x + Sublayer ( x ) ) \text{Output} = \text{LN}(x + \text{Sublayer}(x)) Output=LN(x+Sublayer(x))
其中:
- x x x 是子层的输入。
- Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是子层的输出,例如自注意力层或全连接前馈层的输出。
- LN \text{LN} LN 表示层正则化操作。

具体步骤
  1. 子层计算
    • 计算子层的输出: y = Sublayer ( x ) y = \text{Sublayer}(x) y=Sublayer(x)
  2. 残差添加
    • 将子层的输入和输出相加: x + y x + y x+y
  3. 层正则化
    • 对残差连接的结果进行层正则化: Output = LN ( x + y ) \text{Output} = \text{LN}(x + y) Output=LN(x+y)
优点
  • 梯度流动:残差连接允许梯度更直接地从网络的末端流向开始,有助于解决梯度消失问题。
  • 训练深度网络:它使得训练更深的网络成为可能,因为梯度可以更有效地传递。
  • 网络稳定性:层正则化进一步稳定了训练过程,提高了模型的泛化能力。

Transfomer 结构示意图

在这里插入图片描述
原始的 Transformer 采用 Encoder-Decoder 架构,其包含 Encoder 和 Decoder 两部分。这两部分都是由自注意力模块和全连接前馈模块重复连接构建而成。

其中,Encoder 部分由六个级联的 encoder layer 组成,每个encoder layer 包含一个注意力模块和一个全连接前馈模块。其中的注意力模块为自注意力模块(query,key,value 的输入是相同的)。

Decoder 部分由六个级联的decoder layer 组成,每个 decoder layer 包含两个注意力模块和一个全连接前馈模块。其中,第一个注意力模块为自注意力模块,第二个注意力模块为交叉注意力模块(query,key,value 的输入不同)。

Decoder 中第一个 decoder layer 的自注意力模块的输入为模型的输出。**其后的 decoder layer 的自注意力模块的输入为上一个 decoderlayer 的输出。**Decoder 交叉注意力模块的输入分别是自注意力模块的输出(query)和最后一个 encoder layer 的输出(key,value)。

基于 Transformer 的语言模型

预训练任务和模型类型

  1. Encoder-Only 模型
    • 如 BERT(Bidirectional Encoder Representations from Transformers),它使用 Transformer 的 Encoder 部分,通过掩词补全(Masked Language Model, MLM)等任务进行预训练。
  2. Encoder-Decoder 模型
    • 如 T5(Text-to-Text Transfer Transformer),它结合了 Transformer 的 Encoder 和 Decoder 部分,通过截断补全、顺序恢复等多个有监督和自监督任务进行预训练。
  3. Decoder-Only 模型
    • 如 GPT-3(Generative Pre-trained Transformer 3),它使用 Transformer 的 Decoder 部分,通过下一词预测任务进行预训练。

训练流程和损失函数

  1. 下一词预测

    • 基于 Transformer 的语言模型根据当前和历史的词序列 { w 1 , w 2 , . . . , w i } \{w_1, w_2, ..., w_i\} {w1,w2,...,wi} 来预测下一个词 w i + 1 w_{i+1} wi+1 的概率。
  2. 输出表示

    • 模型的输出是一个概率分布向量,每一维代表词典中一个词的概率。
  3. 序列概率

    • 整个词序列 { w 1 , w 2 , . . . , w N } \{w_1, w_2, ..., w_N\} {w1,w2,...,wN} 出现的概率是序列中每个词条件概率的乘积:
      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]
  4. 交叉熵损失函数

    • 用于衡量模型预测的概率分布与真实词的概率分布之间的差异:
      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。
  5. 总损失

    • 训练集 S S S 的总损失是所有样本损失的平均值:
      L ( S , W ) = 1 ∣ S ∣ ∑ s = 1 ∣ S ∣ ∑ i = 1 N l C E ( o i , s ) L(S, W) = \frac{1}{|S|} \sum_{s=1}^{|S|} \sum_{i=1}^{N} l_{CE}(o_{i,s}) L(S,W)=S1s=1Si=1NlCE(oi,s)

文本生成和自回归

  1. 自回归文本生成
    • 在自回归过程中,模型通过迭代预测下一个词来生成文本。
  2. Teacher Forcing
    • 在训练过程中,使用真实的下一个词作为输入,而不是模型预测的词,以提高训练效率和效果。

并行计算和长序列挑战

  1. 并行计算
    • Transformer 的并行输入特性使其能够高效地进行并行计算,这与 RNN 的串行计算形成对比。
  2. 长序列挑战
    • Transformer 的模型规模随着输入序列长度的增长而平方次增长,这为处理长序列带来了挑战。

Transformer 模型的这些特性使其在处理长序列时比 RNN 更高效,但也带来了计算资源的需求增加。为了解决长序列的问题,研究者们提出了一些策略,如使用更长的上下文窗口、改进的注意力机制(如局部注意力或稀疏注意力),以及更高效的训练技术。这些方法有助于扩展 Transformer 模型的应用范围,并提高其在处理长序列数据时的性能和效率。

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

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

相关文章

【天线&运输】冲浪者检测系统源码&数据集全套:改进yolo11-DySnakeConv

改进yolo11-SCConv等200全套创新点大全:冲浪者检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…

计算机毕业设计Hadoop+Spark大模型微博情感分析 微博舆情分析 微博爬虫 微博可视化 微博大数据分析 微博大数据 大数据毕业设计 Hive数据仓库

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

WPF中如何简单的使用MvvmLight创建一个项目并进行 增删改查

第一步:创建项目后下载如下两个NuGet程序包,然后删除删掉using Microsoft.Practices.ServiceLocation; 并且引入using CommonServiceLocator; 第二步:删除原来的XAML文件并创建如下的包结构然后创建一个在View文件夹中创建一个Main窗体 再将…

java项目之校园资料分享平台(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园资料分享平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 校园资料分享平台的主要…

Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案

Lison <dreamlison163.com>, v1.0.0, 2024.06.01 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案 文章目录 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、…

2-9 存储管理

9.1 传统磁盘管理 1.添加磁盘 在关闭虚拟机情况下添加磁盘(SATA) 别忘记点确定&#xff01;&#xff01;&#xff01; 重启虚拟机&#xff0c;并查看磁盘情况 [rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 20G…

word及Excel常见功能使用

最近一直在整理需规文档及表格&#xff0c;Word及Excel需要熟练使用。 Word文档 清除复制过来的样式 当复制文字时&#xff0c;一般会带着字体样式&#xff0c;此时可选中该文字 并使用 ctrlshiftN 快捷键进行清除。 批注 插入->批注&#xff0c;选中文本 点击“批注”…

【Linux 27】HTTP 协议中的 cookie 和 session

文章目录 &#x1f308;一、Cookie 的相关概念⭐ 1. Cookie 的概念⭐ 2. Cookie 的工作原理⭐ 3. Cookie 的分类⭐ 4. Cookie 的用途⭐ 5. Cookie 设置的基本格式⭐ 6. Cookie 设置时的注意事项⭐ 7. Cookie 的生命周期⭐ 8. Cookie 的安全性问题 &#x1f308; 二、Session 的…

SQL用一个字段查询出数据的交集

出个SQL查询的题吧&#xff0c;有兴趣的可以看看 1、问题 下面有一份数据&#xff08;图1&#xff09;&#xff0c;由两部分组成&#xff1a;分析数据和基准数据 分析数据标识列为1&#xff0c;基准数据标识列为1&#xff0c;两字段0,1互斥 要求&#xff1a;按找出两部分数据…

后端java——如何为你的网页设置一个验证码

目录 1、工具的准备 2.基本方法 3.实现类 4.实践 HTML文件&#xff1a; Java文件1:创建验证码 Java文件2:验证验证码 本文通过HUTOOL实现&#xff1a;Hutool参考文档Hutool&#xff0c;Java工具集https://hutool.cn/docs/#/ 1、工具的准备 如果我们通过hutool来实现这个…

【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率

单元测试&#xff08;unit test&#xff09;&#xff0c;简称UT。本文将介绍在Python项目中&#xff0c;pytest测试框架的安装&#xff0c;配置&#xff0c;执行&#xff0c;测试报告与覆盖率 pytest简介 pytest是一款流行的&#xff0c;简单易上手的单元测试框架&#xff0c;…

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

练习LabVIEW第三十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十八题&#xff1a; 创建一个VI&#xff0c;实现对按钮状态的指示和按钮“按下”持续时间简单计算功能&#xff0c;按…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA&#xff0c;现在准备写窗帘控制组件&#xff0c;构想的东西会比较多&#xff0c;估计有些难度&#xff0c;过程会比较长&#xff0c;边写边记录吧&#xff01; #设备和场景环境# 使用的是Novo的电机&#xf…

Linux脚本数组与字符串

文章目录 打印数组与长度数组遍历数组赋值下标索引访问切片追加()删除关联数组(像map)字符串字符拼接截取子串字符串长度字符串替换模式匹配截取分割字符串大小写转换 打印数组与长度 ${arrayName[*]} 打印数组${arrayName[]} 打印数组${#arrayName[*]} 打印数组长度${#arrayN…

闯关leetcode——3289. The Two Sneaky Numbers of Digitville

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/the-two-sneaky-numbers-of-digitville/description/ 内容 In the town of Digitville, there was a list of numbers called nums containing integers from 0 to n - 1. Each number was suppos…

#Jest进阶知识:整合 webpack 综合练习

这一小节&#xff0c;我们来做一个综合的练习&#xff0c;该练习会整合&#xff1a; typescriptwebpackjest 准备工作 首先创建项目目录&#xff0c;通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发&#xff0c;因此需要安装 typescript npm i t…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验

文章目录 引言一、鸿蒙原生应用的高效开发二、用户隐私保护&#xff1a;安全访问管理三、开发者实用工具&#xff1a;应用分析与A/B测试四、应用审核与分发&#xff1a;快速上线4.1 应用加密&#xff1a;保护代码安全4.2 自动化测试与检测前移&#xff1a;提升应用质量 五、结语…

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…