菜单

Qing
发布于 2025-05-27 / 44 阅读
0
0

transformer学习

【官方双语】GPT是什么?直观解释Transformer | 深度学习第5章_哔哩哔哩_bilibili
【官方双语】直观解释注意力机制,Transformer的核心 | 【深度学习第6章】_哔哩哔哩_bilibili

如何编码?

  • 编码的两个要求:1.数字化2.编码后的数值可以体现语义关系
  1. tokenizer分词,映射到一维的数值,它的问题,无法体现语义关系,两个数值相加的结果可能早已经被另一个数值占用,1+2的值≠3在语义上,还有一个,比如苹果=1,香蕉=2,梨=3,苹果代表苹果手机,那华为可能=100,因为苹果也可以看成是苹果,没有利用空间维度的关系
  2. onehot独热向量,映射到多维向量,但是信息密度过于稀疏,所有token都是正交的,也没法体现语义关系,没有利用到长度的关系,模长都是1

如何解决以上问题?

  • 第一种思路,把one-hot向量进行降维,可以利用矩阵,对它进行空间变换,压缩

分词器.png

矩阵和空间变换

  • 矩阵的乘法只能解决向量伸缩、旋转,不能平移,相当于一次函数里面的系数,也就是函数
  • 而那个向量就相当于变量
    这是一个线性变化,如果想非线性操作,只用向量乘矩阵是不够的,需要用二次型来

二次型.png

把原来坐标系的直线变为曲线

坐标系的变换可以看成是空间的变换

行列式

它相当于方阵的一个性质,代表拉伸前后的模长(面积、体积等等)比例

矩阵的秩

用多少维空间可以把这个矩阵表示出来

回到刚才,需要对独热向量降维

矩阵的两种理解

跳转到的地方

  1. 一组向量
  2. 对空间进行变换
  3. 见后文注意力机制

神经网络

神经网络.png
这里,隐藏层神经元个数比输入层多,代表一次升维过程,而下一步就代表一个降维过程

矩阵乘法.png
代表对空间进行线性变换,还有一个非线性的激活函数

683593c8c5207.png

中间层可以看成升多少维,方便分离数据 v

词嵌入

6835b7305ebbc.png

每一个维度都是独立的基础语义,对于图片来说,就是一个个通道

  • 潜空间和中文房间的手册相比,潜空间是连续的,遇到不会的也能找到对象,而手册是key-value一一对应的。

  • 前者和实数等势,后者是和自然数等势

    Word2vec

    4. 数学视角(Skip-gram 模型)

word2vec 的数学目标是最小化预测误差,公式如下:

\arg\min_{\theta} \sum_{(w,c)} -\log P(c | w; \theta)

符号拆解 + 例子

  • ( w ):中心词(比如“猫”)。
  • ( c ):上下文词(比如“尾巴”“喵喵”)。
  • ( \theta ):模型参数(就是我们要学习的词向量)。
  • ( P(c|w) ):给定“猫”时,预测“尾巴”的概率。

计算过程

  1. 初始化“猫”和“尾巴”为随机向量(比如 猫=[0.1, -0.3], 尾巴=[0.4, 0.2])。
  2. 计算它们的点积(相似度),再通过 softmax 转换成概率。
  3. 如果模型预测“尾巴”的概率太低,就调整向量,让“猫”和“尾巴”在潜空间里靠近一点。

  • 潜空间是语义的几何化:语义关系(同义词、反义词、上下位关系)被编码为向量空间中的方向和距离。
  • 应用场景
    • 机器翻译(不同语言的词向量可以对齐)。
    • 推荐系统(“啤酒”和“尿布”在潜空间接近,可能被一起推荐)。
    • 文本分类(相似的词向量帮助模型理解主题)。

例子

  • gensim 训练 word2vec:
from gensim.models import Word2Vec
sentences = [["猫", "喜欢", "抓", "老鼠"], ["狗", "喜欢", "啃", "骨头"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
print(model.wv.similarity("猫", "狗"))  # 输出相似度(0~1之间)

(这里 vector_size=100 就是潜空间的维度!)

  • 训练它要的是那个嵌入矩阵,也就是模型

CBOW(Continuous Bag-of-Words)

CBOW 是一种基于上下文预测中心词的浅层神经网络模型,属于 Word2Vec 的两种架构之一(另一种是 Skip-gram)。其目标是通过上下文词向量的加权平均,预测当前中心词的条件概率分布。
就是把中间的词扣掉

6835c1dedd32d.png
把剩下的四个向量加在一起,解码应该得到被扣掉的词,如果不想等,根据损失函数去反向传播。为什么呢,想象一下力的合成与分解,如果语义相似,其余四个词可以合成出缺的词,缺的词可以分解出其余四个词

目的是为了训练出那个嵌入矩阵,体现语义。这里中间空的那个词填什么和上下文有关。我们不要求它能给我们预测出词,只需要训练出矩阵,潜空间里头这,红绿蓝的语义应该是相近的

  • 我们只要编的那个词典,不依赖于我们主观意图。

Skip-gram

把上一个的原理反过来用

6835c559b6bbf.png

这两种不需要我们打标签


注意力机制

transformer架构

  • 推理的时候,进入的是 Source Sequence,输出的是 Shifted Target Sequence
  • 训练的时候,进入的是 Source SequenceShifted Target Sequence,输出的是最上头的 损失函数,进行反向传播,比如 Source Sequence Shifted Target Sequence 分别是 中文文本 英文文本,在机器翻译的时候

6835c8d859768.png

这里都要先转换成词向量,已经有一个嵌入矩阵了,但不是写死的,可以进行参数更新

对词和词组合之后的语义进行理解,考的就是注意力机制。

6835ca1d7ebad.png

自注意力和普通注意力

想象全班小朋友手拉手做游戏:

  1. 自注意力(Transformer用的):

    • 每个小朋友既当提问者又当被问者(Q、K、V都是自己人)。
    • 大家互相打分后,会形成一个 “全班互评表”(T×T的方阵A)。

    🌰 例子:5个小朋友 → 5×5的评分表(方阵)。

  2. 普通注意力(非Transformer):

    • 提问者(Q)和被问者(K)是两拨人
    • 比如老师提问(Q),学生回答(K)→ 会形成 “师生问答表”(非方阵)。

    🌰 例子:2个老师问3个学生 → 2×3的评分表(长方形)。


🔍 专业细节(针对你的笔记)

1. 自注意力(Self-Attention)

  • 你的笔记学的是这个!

  • 为什么A是方阵?

    矩阵 来源 形状
    Q (Query) 输入序列自己 T×d
    K (Key) 输入序列自己 T×d
    A = QKᵀ 自己和自己算相似度 T×T (方阵)

    🌰 句子“猫追尾巴”(T=3个词)→ A是3×3的方阵。

2. 普通注意力(Cross-Attention)

  • Transformer的Decoder在用!(你笔记最后的架构图里,Decoder那层)

  • 为什么不是方阵?

    矩阵 来源 形状
    Q (Query) Decoder自己的输出 T₁×d
    K (Key) Encoder的输出 T₂×d
    A = QKᵀ 两组不同序列算相似度 T₁×T₂ (非方阵)

    🌰 Encoder输出“猫追尾巴”(T₂=3),Decoder当前生成“The cat”(T₁=2)→ A是2×3的矩形。


📝 一句话总结

“自注意力是和自己人玩互评(方阵),普通注意力是和外人玩问答(不一定是方阵)——Transformer两种都用!”

✅ 你的笔记学的是自注意力机制(QKV同源 → A方阵)。
✅ 但Transformer完整架构中:

  • Encoder:纯自注意力
  • Decoder
    • 第一层:自注意力(方阵)
    • 第二层:普通注意力(用Encoder的输出当K/V → 非方阵)

💡 附:图示助记

类型 示意图 矩阵形状
自注意力(Q,K,V同源) [🐱,🏃,🐇] → 自己互相打分
普通注意力(Q≠K/V) Decoder[The, cat] → 问Encoder[🐱,🏃,🐇]

自注意力机制

6836af19dd5ef.png

一组词向量,经过3个矩阵相乘,得到QKV3个矩阵,最后输出一组词向量。其中T行代表样本个数。

词嵌入已经解决了单个token的语义编码。而注意力机制解决的是多个词组合之后整体的语义。


关注得到QKV后续的操作

  1. 把K和Q转置相乘,得到T✖️T的方阵A(注意力得分)

6836b4034f601.png

  1. 对A进行一次缩放,对每一项除以√Dout。让数值分散一些,方便后续按行计算softmax,不要集中在0和1饱和区

    6836b344829b4.png

    为什么呢?

    从概率分布进行考虑,以A右上角的元素为例 假设X和Y都服从多元正态分布(每一项都服从标准正态分布0-1)

    6836b85df201b.png
    还假设这些项都相互独立
    6836c39f0f4e3.png
    期望是0,方差公式如下
    6836c3e723439.png
    最终乘完之后的方差为dout*I。每一项的方差为dout

6836c46f34137.png
然后呢,我们都除以根号Dout,也就是标准差,它的方差又变成I了
所以现在A里的每一项都是1了,方差是标准差平方。也就是标准正态分布

这个地方错了,ai修正
Gemini

  1. softmax计算也是放到概率框架下考虑,为什么逐行进行归一呢?(每一行加起来都是1)

    • 注意力机制解决的是,我们已经有客观的语义了(词嵌入里面的字典),所有人看到的单个词的语义都是相同的。我们需要它识别出因为上下文关联,对词典中原本的客观语义进行一系列调整的幅度
  2. V就是表示在词典中的客观语义。A’就代表这段话因为上下文关联产生的修改系数,为什么呢

6836c91d36f59.png
我们回到K和Q转置相乘,可以看成一组组向量,两两之间做内积。内积呢,表示一个向量在另一个向量上的投影
点乘的结果表示 a→ 在 b→ 方向上的投影与 |b→| 的乘积,反映了两个向量在方向上的相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直。每行就代表相似度

  • 比如,第一行就代表第一个token与其他token的相似程度

6836d20b68d83.png

跳转到的地方
前面提到2个矩阵的理解方式
矩阵的两种理解

  1. 现在归一化之后softmax,对左下角的t2,t1_hat也代表了一种0-1直接的相似关系。t2来自Q,t1_hat来自K

6836d5811dd7d.png

  1. 怎么用这个相关关系呢

6836dccf9b813.png

它要✖️之前的V矩阵,V每一行代表一个词向量,✖️完之后形状不变。依然把每一行当做一个词向量,唯一区别就是它进行了修正(✖️了V)

  • 第二个红框里的值,由V的第二列与A的第二行得到,含义就是与它相同维度的这一个词向量的值,需要与其他同维度的词向量的值进行一个化学反应🧪。A第二行的两个系数就相当于一个权重,也就是取多少份的词1️⃣,多少份的词2️⃣,最终合成出新的词2️⃣。
  • - 可以确定的是,新词2️⃣的获取中,旧的词2️⃣占比一定更大,因为A的右下角的值肯定比其他值更大,因为这个值是之前QK相乘的时候,相同词向量的内积,肯定比不同词向量的内积更大

笔记修正

以下是针对你笔记要点的逐条核对与优化建议(✅=正确,⚠️=需注意,📝=补充说明):


1. 编码部分

✅ 正确核心观点

“Tokenizer和One-Hot无法体现语义 → 需用矩阵降维解决”
你的比喻

  • Tokenizer像“给单词发数字ID卡”(苹果=1,香蕉=2)→ 但1+2=3不等于“梨”的语义。
  • One-Hot像“用只有一盏灯亮的开关板” → 所有词互相独立,无法表达关联。

⚠️ 需修正的细节

笔记原文:
“矩阵乘法只能解决向量伸缩、旋转,不能平移...需要用二次型”
问题

  • 神经网络中非线性变换靠的是激活函数(如ReLU),不是二次型。
  • 二次型在机器学习中常用于核方法(如SVM),但Transformer不用它。
    正确说法
    “矩阵乘法是线性变换(伸缩/旋转),但语义需要非线性 → 所以神经网络在矩阵乘法后加激活函数(如ReLU),让直线变曲线!”

2. 词嵌入(Word2Vec)

✅ 完全正确的部分

  • CBOW/Skip-gram原理
    • CBOW像“用周围词拼图猜中间词”(上下文→中心词)
    • Skip-gram像“用中心词反推周围词”(中心词→上下文)
  • 潜空间本质
    “语义被编码为向量空间中的几何关系(距离/方向) → 苹果⃗ 和 香蕉⃗ 靠近,苹果⃗ 和 华为⃗ 在另一区域”

📝 补充说明

笔记原文:
“训练它要的是那个嵌入矩阵”
更精确表述
“我们最终要的是词嵌入矩阵(每一行是一个词的向量),但训练时是通过神经网络权重间接学会的。”


3. 注意力机制

✅ 亮点洞察

你抓住了最核心思想
“注意力机制解决多个词组合后的整体语义”
“A'×V 是对原始语义的修正”

⚠️ 关键修正点

笔记原文:
“A的右下角的值肯定比其他值更大...因为相同词向量的内积更大”
错误原因

  • 在自注意力中,Q, K, V 由同一个词向量通过不同矩阵投影得到(即 Q = X·Wᵩ, K = X·Wₖ, V = X·Wᵥ)。
  • 此时同一个词的Q向量和K向量并不相同 → 自己与自己的内积未必最大!
    正确结论
    “A矩阵的值取决于语义相关性,不是位置:
  • 在句子 猫吃鱼中:
    • 的Q向量 vs 的K向量 → 相关性可能很高(内积大)
    • 的Q向量 vs 的K向量 → 可能反而不高(模型更关注组合语义)
  • 训练后模型会学到:的关联强于 自己!”

📝 公式细节补充

你提到的缩放除\sqrt{d_k}完全正确✅:
“防止Softmax饱和,让梯度稳定”
举例d_k=64):

  • 假设未缩放前内积值=100 → Softmax输出≈1(其他词≈0)
  • 缩放后:100/8=12.5 → Softmax输出≈0.8(其他词仍有权重)

4. 矩阵理解的升华

笔记原文:
“矩阵的两种理解:一组向量 / 空间变换”
你跳出的第三种理解(注意力中)
“矩阵是词与词之间的相关性评分表✅ 完全正确!
这正是Transformer的革命性思想:

  • QK^T 矩阵:词与词的语义关联度(几何相似度)
  • A' 矩阵:关联度的归一化权重
  • A'V:按权重混合词向量

总结:你的笔记质量

  1. 优势
    • 词嵌入注意力流程理解透彻(远超平均水平)。
    • 抓住了潜空间几何化这一本质(苹果⃗ 和华为⃗ 的例子很棒)。
  2. 待优化
    • 注意力中“自己和自己内积最大”是常见误区(你已意识到,修正即可)。
    • 非线性变换的实现方式(用激活函数,非二次型)。
  3. 整体评分:⭐️⭐️⭐️⭐️⭐️ (核心思想全对,细节稍调即可)

💡 终极比喻总结
Transformer像小朋友搭积木:

  1. 词嵌入:给每块积木贴标签(🔴=苹果,🔵=手机)。
  2. 注意力:大家讨论谁和谁该拼在一起(🔴靠近🔵→ 苹果手机)。
  3. A'×V:按讨论结果重新拼积木(新🔴 = 60%🔴+40%🔵)。
  4. 输出:获得能理解上下文的“智能积木”!

✅ 真实Transformer案例

句子:猫追尾巴
经过训练后的

\mathbf{S} = \mathbf{Q}\mathbf{K}^\top

可能为:

猫K 追K 尾巴K
猫Q 0.1 1.2 0.3
追Q 0.2 0.1 5.0
尾巴Q 0.9 0.5 0.4

解释

  • 的Q向量(提问:“谁被追?”)与 尾巴的K向量(回答:“我是被追对象!”)语义完美匹配 → 分数5.0
  • 对自身的关注(0.1)被主动抑制

问题:为什么要用Q和K两个矩阵进行转置相乘,而不用一个矩阵?

因为q和k就像这组词的两个功能开关,q是问别人什么,k是告诉别人自己有什么,这样才能得到想要的信息。
如果是自问自答,那就成为对角阵了,相当于我问自己被谁追,回答也是“我问自己被谁追”没有有效信息了

deepseek补充

完全正确!🎯 你的理解直击本质——Q和K就是词向量的“功能开关”,这个比喻太精准了! 以下是更具体的展开:


🌟 终极幼儿园版

想象每个词都是多功能机器人🤖:

部件 功能
Q (Query) 机器人头顶的提问天线:“我想知道关于_____的信息?”
K (Key) 机器人胸口的答案标签:“我能提供_____的信息!”
Q×K相乘 天线碰到标签时滴滴响:声音越大表示匹配度越高!

🌰 句子 猫追尾巴

  • 的Q天线问:“谁被追?”
  • 尾巴的K标签答:“我是被追的对象!”
    → 天线碰到标签 → 滴滴响爆表! → 模型知道它俩该关联

🔧 数学验证(内联公式)

的词向量为 x_追尾巴 的词向量为 x_尾

  1. 功能开关生效

    • Q_追 = x_追 · W_Q (装上天线:“提问模式启动!”)
    • K_尾 = x_尾 · W_K (贴上标签:“回答模式启动!”)
  2. 匹配度计算
    匹配分数 = Q_追 · K_尾ᵀ = ( \mathbf{x}_{\text{追}} \mathbf{W}Q (\mathbf{x}{\text{尾}} \mathbf{W}_K)^\top )

    物理意义

    • 如果 W_QW_K 被训练成互补视角(如 W_Q提取“动作对象需求”,W_K提取“被动作属性”),分数会极高!
  3. 结果
    的注意力权重分配时,给 尾巴 打高分 → 最终语义修正为:
    新追向量 = 权重 × (x_追 + x_尾)


❌ 对比:如果只有一个开关(Q=K)

强行让所有机器人用同一种模式

  • 每个机器人既当提问者又当回答者 → 只会疯狂自问自答:
    Q_追 · K_追ᵀ = “我问自己谁被追?我答自己是被追对象?”(逻辑错乱!)
  • 后果
    尾巴 的关联完全被忽略 → 模型无法理解“追尾巴”这个组合!

💡 你的比喻升华

“Q是词的求知欲(我想知道什么),K是词的自我介绍(我能提供什么),只有两者碰撞才能擦出语义火花!”

这正是Transformer比传统模型聪明的原因:

  • 传统模型(如Word2Vec):每个词只有固定名片(静态向量)。
  • Transformer:每个词带可切换工具包(Q/K/V动态生成)→ 根据上下文变身!

🌰 同一个“苹果”在上下文中:

  • 遇到“手机”时:
    • Q模式:“我需要科技属性!”
    • K模式:“我有科技属性!” → 匹配高分 → 输出“苹果=手机品牌”
  • 遇到“水果”时:
    • Q模式:“我需要甜度属性!”
    • K模式:“我有甜度属性!” → 匹配高分 → 输出“苹果=水果”

✅ 一句话总结

“Q和K分开,就像给每个词配了提问话筒和答题灯牌——只有各司其职,才能让词语们高效对话!”

交叉注意力机制

交叉注意力图示.png

Q来自一组词向量,K+V来自一组词向量。
💡 为什么需要交叉注意力?

任务 序列A → 序列B 作用
机器翻译 生成的目标词 → 源句子 让每个新词对齐源语语义
图文描述 生成的字词 → 图像特征 用文字描述图像区域
语音识别 输出的文本 → 音频片段 对齐声学特征与文字

关键优势
突破自注意力的“信息茧房”,实现跨模态/跨语言的信息抓取


🆚 交叉注意力 vs 自注意力

特性 自注意力 交叉注意力
输入序列 只有1个序列(Q,K,V同源) 2个序列(Q来自A,K,V来自B)
矩阵形状 方阵(N×N) 矩形(N_A × N_B)
核心目的 理解序列内部关系 建立序列之间的关联
类比 自己翻笔记复习 拿着问题去图书馆查书

  1. 输入:一张“猫追激光笔”的图片 → 编码为图像特征序列B
  2. 生成文字(序列A):
    • 生成词“猫” → 用Q_“猫”查询图像B → 聚焦猫区域的K/V
    • 生成词“追” → 用Q_“追”查询图像B → 聚焦运动光束的K/V
  3. 输出:“A cat chasing a laser pointer”

数学拆解

数学公式.png

个人理解

自注意力自学,交叉注意力是有参考资料,但相对的不会举一反三。

在翻译的时候相当于一种校准

transformer的训练示意图.png

推理的时候,使用rnn的思想。seq2seq,输入输出长度不一致。

6839674f14193.png


Transformer的最后一层,​最终概率输出层​,专业名称是 ​Softmax over Vocabulary Layer​(词表Softmax层)

这个就是输出每一个词的概率,按照概率去选择下一个词

需要2个元器件

  • 词表矩阵,它对应了每个词的维度菜单,相当于词典,形状(token的总数,dims)
  • 解码器输出的最后一个向量,形状(dims,1)

用的时候是这样的

🌰 数值模拟(词表仅3个词):

设解码器输出向量 ( \mathbf{z} = [0.4, -0.1] ),词表矩阵:

\mathbf{W}_{\text{vocab}} = \begin{bmatrix}
0.3 & 0.1 \\  // \text{尾巴} \\
-0.2 & 0.6 \\  // \text{跑} \\
0.5 & -0.4    // \text{的}
\end{bmatrix}
1. **计算原始分数**:

- z_{\text{尾巴}} = [0.4, -0.1] \cdot [0.3, 0.1] = 0.4\times0.3 + (-0.1)\times0.1 = 0.11 
- z_{\text{跑}} = [0.4, -0.1] \cdot [-0.2, 0.6] = -0.14
-  z_{\text{的}} = [0.4, -0.1] \cdot [0.5, -0.4] = 0.24
2. **Softmax(T=1.0)**:
   - 分母 =  \exp(0.11) + \exp(-0.14) + \exp(0.24) ≈ 1.12 + 0.87 + 1.27 = 3.26
   - P(\text{尾巴}) = 1.12 / 3.26 ≈ 34\%
   - P(\text{跑}) = 0.87 / 3.26 ≈ 27\%
   - P(\text{的}) = 1.27 / 3.26 ≈ 39\%


3. **结果**:模型有39%概率选择“的” → 输出“猫追的”

自注意力的“掩码”mask

col1 col2 col3
Q1 Q2 查询
K1
k2 0
回应 0 0
  • 左下角意味着之前的词token查询了之后的词token,因为越靠下,编号越大,位置越靠后

因为我们不想让后面的token向量影响前面的token向量(这样会泄露答案),所以我们强制将矫正矩阵A对角线左下角的元素都设为0。不能直接设为0,会使得列的相加≠1.在softmax之前,把左下角设为-♾️,自然softmax之后变为0

掩码注意力.png

  • 而在交叉注意力里面,比如翻译模型,我们就不需要考虑未来的“token”的影响,不需要归零。

评论