初学Transformer架构和注意力机制

文章目录

  • 说明
  • 一 LLM 简介
  • 二 Transformer 架构
    • 2.1 Transformer的架构组成
      • 2.1.1 输入嵌入 (Input Embedding)
      • 2.1.2 编码器 (Encoder) 的结构
      • 解码器 (Decoder) 的结构
      • 2.1.3 输出层 (Output Layer)结构
    • 2.2 编码和解码器的独立输入理解
  • 三 注意力机制

说明

  • 本文适合初学者,大佬请路过。

一 LLM 简介

  • 大预言模型(Large Language Models、LLM)是一种由包含数百亿以上参数的深度神经网络构建的语言模型,使用自监督学习方法通过大量无标注文本进行训练。
  • GPT(GenerativePre-trainedTransformer)是一种大语言模型,是生成式人工智能的重要框架。GPT模型是基于Transformer架构的人工神经网络,在未标记文本的大型数据集上进行预训练,能够生成新颖的类人内容。
  • 大语言模型的应用领域非常广泛,涵盖机器翻译、摘要生成、对话系统、文本自动生成等诸多领域。然而,大语言模型的使用也存在一些挑战和问题。首先,虽然大语言模型能够生成高度连贯和自然的文本,但没有自我意识和理解能力。其次,大语言模型的大规模训练数据集也使得其模型庞大而复杂,对计算资源要求较高,导致训练和部署成本相对较高。

二 Transformer 架构

  • 自然语言处理(Natural Language Processing,NLP)技术的发展是一个逐步迭代和优化的过程。Transformer的出现标志着自然语言处理进入一个新时代,特别是随着BERT和GPT等模型的推出,大幅提升了自然语言的理解和生成能力。
  • Transformer架构是一种基于注意力机制的深度学习模型,由谷歌的研究人员在2017年提出,被广泛应用于自然语言处理任务,如机器翻译、文本分类、情感分析等。
  • 目前的聊天模型都是基于Transformer架构开发的。ChatGPT的后端是基于GPT模型的,GPT模型通过在大规模文本数据上进行无监督预训练来学习语言的统计特征和语义。它使用自回归的方式,即基于前面已经生成的词来预测下一个词,来学习词之间的语义和语法关系,以及句子和文本的整体上下文信息。

  • Transformer架构由编码器(Encoder)和解码器(Decoder)组成,其中编码器用于学习输入序列的表示,解码器用于生成输出序列。GPT主要采用了Transformer的解码器部分,用于构建语言模型。

2.1 Transformer的架构组成

在这里插入图片描述

2.1.1 输入嵌入 (Input Embedding)

  • 在Transformer模型中,首先对输入文本进行处理以得到合适的文本表示。因为计算机无法直接处理自然语言,它需要将我们的输入转换为它能理解的数学形式,换言之,他会把每个词或字符编码成一个特定的向量形式。
  • 输入嵌入(input Embedding):文本中的每个单词都被转换为一个高维向量,这个转换通常是通过预训练的词嵌入模型(如Word2Vec、GloVe等)完成的。
  • 位置嵌入(Positional Embedding):标准的Transformer模型没有内置序列顺序感知能力,因此需要添加位置信息。这是通过位置嵌入完成的,它与词嵌入具有相同的维度,并且与词嵌入相加。

  • 输入序列:模型接收一个 token 序列作为输入,例如 “I love NLP”。
  • 嵌入查找
    • 每个 token 通过查找嵌入矩阵被转换为一个 d_model 维的向量。
    • 嵌入矩阵的维度为 (vocab_size, d_model),其中 vocab_size 是词汇表大小。
  • 位置编码添加
    • 生成与输入序列长度相同的位置编码矩阵,维度为 (seq_len, d_model)。
    • 位置编码与 token 嵌入逐元素相加,得到最终的输入表示。

数学表示 X = Embedding ( i n p u t ) + PositionalEncoding X = \text{Embedding}(input) + \text{PositionalEncoding} X=Embedding(input)+PositionalEncoding

2.1.2 编码器 (Encoder) 的结构

  • 每个编码器层包含以下子层:多头自注意力机制 (Multi-Head Self-Attention)、前馈神经网络 (Feed-Forward Network)

  1. 多头自注意力机制 (Multi-Head Self-Attention)
  • 线性变换:输入 X 通过三个不同的线性层生成 Q (查询)、K (键)、V (值) 矩阵。每个头的维度为 d k = d m o d e l / h d_k = d_model / h dk=dmodel/h,其中 h 是头数。

  • 注意力计算:计算缩放点积注意力: Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V。并行计算 h 个注意力头,将结果拼接后通过线性层投影。

  • 残差连接和层归一化 X attention = LayerNorm ( X + Attention ( X ) ) X_{\text{attention}} = \text{LayerNorm}(X + \text{Attention}(X)) Xattention=LayerNorm(X+Attention(X))

  1. 前馈神经网络 (Feed-Forward Network)
  • 两层线性变换:第一层将维度从 d_model 扩展到 d_ff (通常 2048 或 4096)。第二层将维度压缩回 d_model。之间使用 ReLU 激活函数。
  • 残差连接和层归一化 X out = LayerNorm ( X attention + FFN ( X attention ) ) X_{\text{out}} = \text{LayerNorm}(X_{\text{attention}} + \text{FFN}(X_{\text{attention}})) Xout=LayerNorm(Xattention+FFN(Xattention))

解码器 (Decoder) 的结构

  • 每个解码器层包含三个子层:掩码多头自注意力 (Masked Multi-Head Self-Attention)、编码器-解码器注意力 (Encoder-Decoder Attention)

  1. 掩码多头自注意力 (Masked Multi-Head Self-Attention)的掩码机制:防止解码器在训练时"偷看"未来的 token;通过将未来位置的注意力分数设置为 -∞ 实现。
  • 计算过程:与编码器自注意力类似,但增加了掩码。
  1. 编码器-解码器注意力 (Encoder-Decoder Attention):Q 来自解码器,K 和 V 来自编码器的最终输出;允许解码器关注输入序列的相关部分。
  2. 前馈神经网络:结构与编码器中的前馈网络相同。

2.1.3 输出层 (Output Layer)结构

  • 线性投影:将解码器输出投影到词汇表大小的维度。
  • Softmax 激活:生成每个 token 的概率分布。 P ( w ) = softmax ( W o X decoder + b o ) P(w) = \text{softmax}(W_o X_{\text{decoder}} + b_o) P(w)=softmax(WoXdecoder+bo)

2.2 编码和解码器的独立输入理解

  • 对于Transformer的输入处理部分,从架构图上编码器和解码器部分都有输入,因为在Transformer模型中,编码器(Encoder)和解码器(Decoder)各自有独立的输入。通常,在有监督学习的场景下,编码器负责处理输入样本,而解码器负责处理与之对应的标签,这些标签在进入解码器之前同样需要经过适当的预处理,这样的设置允许模型在特定任务上进行有针对性的训练。

三 注意力机制

  • 注意力机制就如字面含义一样,就像我们生活中一样,当开始做某一个事情时,通常会集中注意力在某些关键信息上,从而忽略其他不太相关的信息。对于计算机来说,transformer就是通过注意力机制解析上下文和理解不同语义之间的关系。
    在这里插入图片描述
  • 原始句子:The Animal didn’t cross the street because it was too tired。
  • 译为:因为动物太累了所以没有过马路。

  • it指代的是The Animal,然而,如果改变句子中的一个词,将tired替换为narrow,得到的新句子是The Animal didn't cross the street because it was too narrow(由于街道太窄,动物没有过马路),在这个新的句子中,itthe street。因此,模型需要能够理解当输入的句子改变时,句子中的词义也可能会随之改变。这种灵活性和准确性在Transformer模型中得到了体现。

  • Attention机制的工作原理可以这样形象化地描述:模型把每个词编码成一个向量,然后把这些向量送入模型中。在这里,每个词都会像发送条“询问”一样,去问其他词:“咱们之间的关系紧密吗?”,如果关系紧密,模型就会采取一种行动,反之则会采取另一种行动。不仅每个词都会发出这样的“询问”,而且也会回应其他词的“询问”。通过这样的一问一答互动,模型能够识别出每两个词之间的紧密关系。一旦这种关系被确定,模型就会把与该词关系更紧密的词的信息“吸收”进来,与其进行更多的信息融合。这样,比如在翻译任务中,模型就能准确地识别it应该翻译为animal,因为它的向量已经融合了与animal这个词紧密相关的信息。

  • 所以,注意力机制的核心就是要做重构词向量这样一件事。对于上面形象化的描述中,可以抽取出注意力机制的三要素:

    • Q:即Query,可以理解为某个单词像其他单词发出询问。
    • K:即Key,可以理解为某个单词回答其他单词的提问。
    • V:即Value,可以理解为某个单词的实际值,表示根据两个词之间的亲密关系,决定提取出多少信息出来融入自身。

  • T r a n s f o r m e r Transformer Transformer模型中, Q 、 K Q、K QK V V V是通过输入向量表示Transformer(x)与相应的权重矩阵 W q 、 W k 、 W v W_q、W_k、W_v WqWkWv进行矩阵运算得到的。这些权重矩阵最初是通过数学方法进行初始化的,然后在模型多轮训练的过程中逐渐更新和优化。目标是使得传入的数据与这些权重矩阵相乘后,能够得到最优化的Q、K和V矩阵。以Q为例,其第一个元素是通过输入向量x的第一行与权重矩阵W的第一列进行点乘和求和运算得到的。
  • 因此,在Q矩阵中的第一行实际上有这样的意义:它包含第一个词(与输入x的第一行对应)在查询其他词时所需的关键信息。同样地,K和V矩阵的计算逻辑与此相似。在K矩阵的第一行中存储的是第一个词在回应其他词的查询时所需的信息。而V矩阵的第一行所包含的是第一个词自身携带的信息。在通过Q和K确定了与其他词的关系后,这些存储在V中的信息被用来重构该词的词向量。
  • 在获取到Q、K、V之后,Attention执行如下操作: Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V。公式中除以 d k d_k dk是为了避免在计算向量的内积时,因为向量矩阵过大,计算出来的数值比较大。
    而非单纯的因为词之间的紧密程度这一问题。
  • 计算词的紧密程度
    在这里插入图片描述
  • 为什么 Q K T QK^T QKT矩阵就能表达词与词之间关系的紧密程度?
  • 这种计算方式在数学上叫向量的内积。向量的内积在向量的几何含义上表达的是:**内积越大,两个向量就更趋向于平行的关系,也就表示两个向量更加相似,当内积为0时,两个向量就会呈现垂直的关系,表示两个向量毫不相关。**对于Attention机制中这种Q和K一问一答的形式,问的就是两个词之间的紧密程度,所以可以通过内积的方式来衡量两个词之间的相似性。
  • 在这个过程中,可能都注意到了,它对自己也进行了提问,并且自己也给出了回答,为什么要这样做呢?
  • 例如The Animal didn’t cross the street because it was too tired(因为动物太累了,所以没有过马路),it正常来说作为代词,指代“它”,但在这个句子中,我们希望它指代是The Animal,所以它不把自己在这个句子中的重要性表现出来,不对自己的信息进行重构的话,它可能就没有办法改变自己原有的意思,也就无法从原本的意思“它”改为指代The Animal。也就是因为这种操作,所以在Transformer中的注意力机制被叫作Self-Attention(自注意力机制)。
  • 当衡量句子之间的紧密关系的结果出来之后,那么如何重构V?
  • 为解决如何量化决定哪些词贡献了多少信息。我们可以使用softmax函数对每一行进行归一化处理,softmax操作实质上是在量化地均衡各个词的信息贡献度。
  • 当得到了每个词之间的信息贡献度概率之后,重构V的过程转换成计算过程。从每个词中都会拿出部分信息,最终得到Z,通过这种计算形式得到的Z矩阵,每个位置就包含所有与之有关系的信息。这就是Transformer中自注意力机制中的计算过程。
    在这里插入图片描述

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

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

相关文章

基于PySide6与pycatia的CATIA几何阵列生成器开发实践

引言:参数化设计的工业价值 在航空航天、汽车制造等领域,复杂几何图案的批量生成是模具设计与机械加工的核心需求。传统手动建模方式存在效率低下、参数调整困难等问题。本文基于PySide6+pycatia技术栈,实现了一套支持​​动态参数配置​​、​​智能几何阵列生成​​的自动…

PDF 编辑批量拆分合并OCR 识别

各位办公小能手们!你们有没有过被PDF文件折磨得死去活来的经历?反正我是有,每次要编辑PDF,那叫一个费劲啊!不过呢,今天我要给大家介绍一款神器——WPS PDF to Word,有了它,PDF编辑那…

棒球比赛暗号百科·棒球1号位

关于棒球比赛暗号百科介绍,涵盖基本概念、历史演变、常见类型及经典案例: 棒球比赛暗号百科 一、定义与作用 棒球暗号是球员、教练团队通过手势、动作、语言或道具传递战术指令的密码系统,旨在隐蔽沟通攻防策略,避免对手破解。其…

Python实现基于线性回归的空气质量预测系统并达到目标指标

为了实现基于线性回归的空气质量预测系统并达到目标指标,以下是完整的Python代码实现: import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScal…

236.二叉树的最近公共祖先

在树结构中,祖先指的是一个节点的父节点或更高层级的父节点。公共祖先是指同时为节点p和q的祖先的节点。最近公共祖先(LCA)则是指在所有公共祖先中,距离p和q最近的那个节点。寻找LCA的方法可以按以下情况进行分析: 当…

面试题总结一

第一天 1. 快速排序 public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (low < high) {// 分区操作&#xff0c;获取基准元素的最终位置int pivotIndex partition(arr, low, high);// 递归排序基准元素左边的部分quickSort(arr, …

Stable Diffusion底模对应的VAE推荐

以下是主流Stable Diffusion底模对应的VAE推荐表格&#xff1a; 底模版本推荐VAE类型说明SD1.5SD1.5专用VAE通常使用vae-ft-mse-840000-ema-pruned.safetensorsSD2.0SD1.5兼容VAE或SD2专用VAE部分SD2模型需配套512-ema-only.vae.ptSD3内置VAESD3系列模型通常自带集成VAE无需额…

北斗导航 | 基于matlab的多波束技术的卫星通信系统性能仿真

基于多波束技术的低轨(LEO)卫星通信系统 **1. 仿真场景建模**1.1 LEO卫星轨道参数设置1.2 地面终端分布**2. 多波束天线模型**2.1 波束方向图生成2.2 频率复用方案**3. 链路预算与干扰分析**3.1 自由空间路径损耗3.2 信噪比(SNR)计算**4. 动态资源调度算法**4.1 基于流量需…

uni-app学习笔记十--vu3 computed的运用(一)

vue官方推荐使用计算属性来描述依赖响应式状态的复杂逻辑&#xff0c;computed具有缓存的作用&#xff0c;一个计算属性仅会在其响应式依赖更新时才重新计算&#xff0c;这意味着只要 相关值 不改变&#xff0c;无论多少次访问 都会立即返回先前的计算结果&#xff0c;从而在一…

多模态大模型详解

首先&#xff0c;得明确多模态大模型的定义和核心能力&#xff0c;比如处理文本、图像、音频、视频等多种数据模态。 其次是技术架构&#xff0c;可能需要分模块描述&#xff0c;比如感知层、特征提取、融合策略等&#xff0c;还有技术趋势如模型轻量化、开源生态。 应用场景…

如何通过UI设计提高用户留存率?

在竞争激烈的移动应用市场中&#xff0c;提高用户留存率是开发者的关键目标。UI 设计在实现这一目标中起着举足轻重的作用。精心设计的 UI 不仅能够吸引新用户&#xff0c;还能促使现有用户持续使用。以下是通过 UI 设计提升用户留存率的几种关键方法。 优化用户体验 用户体验…

Linux(6)——第一个小程序(进度条)

目录 一、行缓冲区的概念 二、\r与\n 三、进度条代码书写与展示 1.如何表示进度条是在加载的 2.整体框架 3.书写 3.1makefile: 3.2process.h: 3.3process.c: 3.4main.c&#xff1a; 3.5美化 一、行缓冲区的概念 首先&#xff0c;我们来见一见行缓冲区&#xff0c;…

51页 @《人工智能生命体 新启点》中國龍 原创连载

《 人工智能生命体 新启点 》一书&#xff0c;以建立意识来建立起生命体&#xff0c;让其成为独立、自主的活动个体&#xff1b;也就可以理解为建立生命体的思想指导。 让我们能够赋予他灵魂&#xff01;

微软全新开源命令行文本编辑器:Edit — 致敬经典,拥抱现代

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言:命令行的新利器二、Edit:致敬经典,拥抱现代1. 命令行的“新升级”2. 为什么要有 Edit?三、核心功能与特性一览1. 完全开源、MIT 许可证…

使用MybatisPlus实现sql日志打印优化

背景&#xff1a; 在排查无忧行后台服务日志时&#xff0c;一个请求可能会包含多个执行的sql&#xff0c;经常会遇到SQL语句与对应参数不连续显示&#xff0c;或者参数较多需要逐个匹配的情况。这种情况下&#xff0c;如果需要还原完整SQL语句就会比较耗时。因此&#xff0c;我…

go多线程压测监控

实现了 go多协程压力测试实现了Monitor&#xff0c;异步统计qps、时延、cpu(client端)等指标&#xff0c;周期printStat。只需要把单条执行func传给Monitor即可命令行传参ctrlc之后正常退出(mock cpu 占用) 代码见 https://gitee.com/bbjg001/golearning/tree/master/others/…

安卓无障碍脚本开发全教程

文章目录 第一部分&#xff1a;无障碍服务基础1.1 无障碍服务概述核心功能&#xff1a; 1.2 基本原理与架构1.3 开发环境配置所需工具&#xff1a;关键依赖&#xff1a; 第二部分&#xff1a;创建基础无障碍服务2.1 服务声明配置2.2 服务配置文件关键属性说明&#xff1a; 2.3 …

闲时处理技术---CAD C#二次开发

在CAD C#二次开发中&#xff0c;使用闲时处理技术可以提高程序的响应性能和资源利用率。以下是一般的实现步骤&#xff1a; 1. 了解CAD的事件机制 CAD提供了一些事件&#xff0c;如 Idle 事件&#xff0c;当CAD应用程序处于空闲状态时会触发该事件。你可以订阅这个事件来执行闲…

Git研究

以下命令在CentOS系统下执行 创建Git仓库 git init git-example 监控.git目录的变化情况&#xff1a; watch -n .5 tree .git 写入文件内容&#xff0c;并把文件添加到Stage暂存区 echo 1 > t.txtgit add 1.txt 观察结果如下&#xff1a;objects下多出了一个d00491fd…

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2

RKNN Toolkit Lite2 是瑞芯微专为RK系列芯片开发的NPU加速推理API。若不使用该工具&#xff0c;计算任务将仅依赖CPU处理&#xff0c;无法充分发挥芯片高达6TOPS的NPU算力优势。 按照官方文档先拉一下官方代码库&#xff0c;然后通过whl文件安装&#xff0c;因为我是python3.1…