首页 > 其他分享 >Transformer 学习与解读

Transformer 学习与解读

时间:2025-01-22 11:32:33浏览次数:1  
标签:学习 Transformer 模型 生成 解读 key query 注意力 输入

LLM学习笔记

注意力机制

sequence to sequence (seq2seq)输入N个向量,输出任意可能数量的向量(由机器决定);如果输出N个向量的任务就叫做Sequence Labeling

李沐课程讲义:https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.html

image-20250118131939176

在注意力机制的背景下,自主性提示被称为查询(query)。 给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。 在注意力机制中,这些感官输入被称为(value)。 更通俗的解释,每个值都与一个(key)配对, 这可以想象为感官输入的非自主提示。 如 图10.1.3所示,可以通过设计注意力汇聚的方式, 便于给定的查询(自主性提示)与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。

image-20250118133040764

注意力分数是衡量 querykey 之间相似度的值。它表示在注意力机制中,模型应该“关注”哪些部分的信息。注意力分数越高,表示 query 和 key 之间的相关性越强。

注意力权重是注意力分数经过 softmax 函数归一化后的结果。softmax 将分数转换为概率分布,确保所有权重的总和为 1。注意力权重决定了每个 key 对最终输出的贡献程度。

两种常见的注意力分数计算方法

使用单层 MLP(多层感知机) (查询和键是不同长度的矢量时)

  • querykey 拼接起来,输入到一个单隐藏层的 MLP 中。
  • MLP 输出一个标量值,作为 query 和 key 的注意力分数。
  • 这种方法可以捕捉 query 和 key 之间的非线性关系

直接计算内积 (查询和键具有相同的长度)

  • 直接计算 querykey 的内积(点积),作为注意力分数。
  • 这种方法假设 query 和 key 在同一个向量空间中,内积越大表示相似度越高。
  • 内积计算简单高效,常用于 Transformer 等模型中。

自注意力机制

有了注意力机制之后,我们将词元序列输入注意力池化中, 以便同一组词元同时充当查询 query、键key和值value(而将a变为q k v则需要Wq Wk Wv矩阵进行变换)。 具体来说,每个查询都会关注所有的键-值对并生成一个注意力输出。 由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention)

下图:首先使用q2和ki计算注意力分数(dot product点积或者加性),接着可以对注意力分数进行softmax归一化,得到α'。通过注意力权重α'和值向量vi进行加权求和,得到输出向量b2。表示模型在生成第 2 个位置的输出时,对所有输入位置的信息的加权整合。

image-20250118162253648

image-20250118163454812

image-20250118165006864

image-20250118165237789

只有Wq Wk Wv 未知,需要通过训练数据计算

多头自注意力机制(Multi-head Self-attention)

  • 多头机制是指并行地使用多个自注意力机制(称为“头”),每个头学习不同的表示子空间。
  • 不同的头可以关注输入序列中不同的部分,例如一个头关注局部信息,另一个头关注全局信息。
  • 通过并行计算多个注意力头,模型可以学习到更丰富的特征表示。

image-20250118210204317

得到b(i,1)和b(i,2)再进行矩阵连接传入到下一层。

位置编码 positional encoding

在处理词元序列时,循环神经网络是逐个的重复地处理词元的, 而自注意力则因为并行计算而放弃了顺序操作(对所有的输入操作,从而位置信息不重要了)。 为了使用序列的顺序信息,通过在输入表示中添加 位置编码(positional encoding)来注入绝对的或相对的位置信息。

自注意力机制失去了位置信息,如果位置信息比较重要,可以加入位置信息,只需要为每个位置添加一个位置向量e^i,输入变为:

\[e^{i}+a^{i} \]

image-20250118213754184

在图像识别中,训练资料较少时CNN效果比较好,因为采用接受域,相较于全局计算的自注意力训练量较大;训练资料较大时自注意力效果更好

Transformer

基于编码器-解码器架构来处理序列对,纯基于self-attention的(没有RNN的)

Encoder:输入一个vector sequence,输出另外一个vector sequence

image-20250119140810873

residual 残差(原输入加到输出上)

不能用Batch Norm 要用Layer Norm。

Batch Norm:对不同样本的同一维度特征进行正则化 ,不适合序列长度会变得NLP应用

Layter Norm:对同一样本的不同维度特征进行正则化

image-20250119141123612

残差网络

  1. 残差网络(避免梯度消失w3(w2(w1x+b1)+b2)+b3,如果 w1,w2,w3 特别小,0.000000……1,x 就没了,所以改为【w3(w2(w1x+b1)+b2)+b3+x】)
  2. x1作为残差结构的直连向量,直接和 z1 相加,之后进行 Layer Norm 操作,得到浅粉色向量 z1,z1 经过前馈神经网络(Feed Forward)层,经过残差结构与自身z1相加,之后经过 LN 层,得到一个输出向量 r1;
  3. Add & Norm 就是 Residual残差网络和标准化
  4. 残差结构的作用:避免出现梯度消失的情况
  5. Layer Norm 的作用:为了保证数据特征分布的稳定性,并且可以加速模型的收敛

image-20250119142945222

Decoder

Auto-Aggressive(自回归)

输入时加一个特殊的标志BEGIN符号。

V 是 中文词汇表,3000常用汉字,根绝Encoder中KQ输出的softmax函数的概率值,选择分数最高的对应汉字

image-20250119143233933

Decoder接着会把自己的输出当做下一个输入。

image-20250119143618989

Decoder中的Masked,即在算bi时,不考虑i之后的aj。这样更接近于decoder的运作方式。(在解码时候是a1 a2……一个一个产生的,要计算b2时,没有a3 a4)

image-20250119144129584

Decoder如何决定输出序列的长度?

用特殊符号END表示"断"。让机器产生END的概率最大时表示结束。

image-20250119144545944

AT VS NAT

Non-Auto-Aggressive(非自回归)

不依赖于之前生成的步骤,所有步骤可以并行生成。

NAT会给多个BEGIN,一次性生成完成完整的句子(注意位置嵌入的作用)。要由特殊方法判断终止。

NAT可以并行化,可以控制输出长度(在语音中可以据此控制说话速度)。但NAT质量通常不如AT。

  • 自回归模型
    • 文本生成(如 GPT)、对话系统、长文本翻译。
  • 非自回归模型
    • 实时翻译、语音合成、图像生成。

image-20250119145130059

Decoder架构相较于Encoder就加了一块Cross attention模块。

Decoder中间的 Cross attention (交叉注意力机制)三个input,K和V来自于Encoder,Q来自于Decoder

image-20250119150526600

如下图 Cross attention :可以理解为 Decoder 产生的Q 查询 从Encoder KV 键值对 里查询信息

image-20250119150809655

How to train?

每产生一个字就是从几千个字中进行的分类问题。训练时希望所有的字(含END)的交叉熵 之和(cross entropy)最小。

训练的时候有正确答案ground truth

测试的时候没有正确答案

image-20250119152249011

训练和测试不一致(Exposure Bias):

Exposure Bias 的定义

  • 训练阶段
    • 自回归模型在训练时,通常使用 Teacher Forcing 方法,即每一步生成时,模型的输入是真实的上一时刻的目标词(Ground Truth)。
    • 例如,生成句子 "I love you" 时,模型在生成 "love" 时,输入是真实的 "I"。
  • 推理阶段
    • 在推理时,模型没有真实的目标词作为输入,只能使用自己生成的上一时刻的词作为输入。
    • 例如,生成句子 "I love you" 时,模型在生成 "love" 时,输入是自己生成的 "I"。
  • 问题
    • 如果模型在生成过程中出现错误(如生成一个不准确的词),这个错误会作为输入传递给下一步,导致错误累积,最终影响生成结果。

在训练的时候,给 Decoder 一些错误的信息,反倒会提升模型精确度。

这个方法叫 “Scheduled Sampling” 计划采样

  • 在训练过程中,逐渐从使用真实数据(Ground Truth)过渡到使用模型生成的数据作为输入。
  • 例如,训练初期使用 100% 的真实数据,后期逐渐增加使用模型生成数据的比例。

标签:学习,Transformer,模型,生成,解读,key,query,注意力,输入
From: https://www.cnblogs.com/mercurystraw/p/18685332

相关文章

  • 自学网络安全(黑客技术)2025年 —100天学习计划
    前言什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。如何成为一名黑客很多朋友在学习安全方面都会半路转行,因为不知如何去学,在这里,我将这个整......
  • 下降幂、斯特林数学习笔记
    下降幂注:这里其实还有上升幂。定义下降幂:\(x^\underline{k}=\prod\limits_{i=x-k+1}^xi=\frac{x!}{(x-k)!}\)上升幂:\(x^\overline{k}=\prod\limits_{i=x}^{x+k-1}i=\frac{(x+k-1)!}{(x-1)!}\)性质幂相加:\[n^\underline{a+b}=n^\underlinea(n-a)^\underlineb\]\[n^\overl......
  • 文档图像矫正任务的前沿进展:引入Transformer框架、极坐标的思路
    在《文档数字化采集与智能处理:图像弯曲矫正技术概述》一文中,我们介绍了文档图像矫正技术的发展沿革与代表性方案。随着文档智能处理的需求逐步升级,文档图像去畸变技术也在不断探索新的可能性。今天,我们将讨论近年来文档图像矫正任务的前沿进展,分享一些我们正在关注的方向,欢迎与我......
  • 前端学习思路(从0基础到大神,超详细)
    从零开始学习前端开发并成为高手,是一个需要时间、耐心和持续实践的过程。下面提供一个超详细的前端学习思路,帮助你规划学习路径:1.基础知识(深入)HTML语义化标签:学习HTML5新引入的语义化标签如<article>,<section>,<aside>等,了解它们如何提升网页结构的可读性和SEO。表单......
  • Java 大视界 -- Java 大数据中的强化学习算法实践与优化 (57)
           ......
  • 细说机器学习算法之XGBoost及代码实现
    系列文章目录第一章:Pyhton机器学习算法之KNN第二章:Pyhton机器学习算法之K—Means第三章:Pyhton机器学习算法之随机森林第四章:Pyhton机器学习算法之线性回归第五章:Pyhton机器学习算法之有监督学习与无监督学习第六章:Pyhton机器学习算法之朴素贝叶斯第七章:Pyhton机器学习算......
  • 论文解读:YOLO-Pose(姿态估计)
    论文原文:https://arxiv.org/abs/2204.06806 1、摘要 这篇文章介绍了YoLoPose,基于流行的YOLO框架,实现了一种新颖的无热力图的关节检测与2D多人姿态估计。当前,基于热力图的方法是两个阶段,这个方法并不是最优的,因为他们不是端到端训练的,并且训练依赖于可替代的L1损失......
  • 基于YOLOv5、YOLOv8和YOLOv10的机场安检行李检测:深度学习应用与实现
    引言随着全球航空运输业的持续增长,机场的安全性变得越来越重要。机场安检作为航空安全的重要组成部分,主要负责对乘客和行李进行检查,防止危险物品进入机场或飞行器。传统的安检方式多依赖人工检查,效率低下且容易出错。因此,基于深度学习的自动化行李检测系统应运而生,通过计算......
  • 2025/1/21学习
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;intMax,Min,n,t;inta[N],b[N];boolcheck(intx){intlim=Max-x;intL=-1,R;for(inti=1;i<=n;++i){b[i]=a[i];if(a[i]<li......
  • Android Systrace 基础知识 - Triple Buffer 解读
    怎么定义掉帧?Systrace中可以看到应用的掉帧情况,我们经常看到说主线程超过16.6ms就会掉帧,其实不然,这和我们这一篇文章讲到的TripleBuffer和一定的关系,一般来说,Systrace中我们从App端和SurfaceFlinger端一起来判断掉帧情况App端判断掉帧如果之前没有看过Systrace......