惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

StudyingLover's Blog

Diffusion Policy笔记 rwkv笔记 act笔记 nanovllm-block_manager opencode多智能体 nanobot-pre-train nanobot-rl nanobot-sft nanobot-checkpoint_manager nanobot-gpt nanobot-mid-train Vision Mamba (Vim)笔记 BPE演示 YOLOv5 目标检测笔记 下载根服务器解析记录 Dynaseal A Backend-Controlled LLM API Key Distribution Scheme with Constrained Invocation Parameters 判断链表有环 王道25数据结构勘误 关于perplexity的open-sourcing-r1-1776 AI为什么不像人类一样进行多轮对话 新博客改造日记和功能测试 linuxqq只显示登陆背景图 数字设计和计算机体系结构(机械工业出版社)勘误(自制) Dynaseal:面向未来端侧llm agent的llm api key分发机制 A Definitive Guide to Markdown Style This post is using MDX, Where you can embed JSX and Astro components RT-Patch学习 pydantic实现的LLM ReAct fastapi 和 uvicorn 设置监听 ipv6 pydantic+openai+json 控制大模型输出的最佳范式 解决 Matplotlib Scatter 不支持 Marker 列表的问题:mscatter 实现 roofline model zhipuAI接口兼容openai 在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip clion搭建libbpf-bootstrap开发环境 coze+coze-discord-proxy+ChatNextWebUI实现AI自由 安卓内核时间使用的是UTC时间 colab运行google最新开源模型Gemma Sora技术报告 视频生成模型作为世界模拟器 笔记 archlinux flutter开发踩坑 fastapi集成google auth登录 linux下NTFS磁盘报错输入输出错误 Venn-Abers 预测器 基于Venn-Abers预测器的系统日志异常检测方法_顾兆军 手机平板远程访问kvm虚拟机的windows phi-2弱智吧测评 poe的gemini pro或是百度开发 google gemini api使用 google gemini api申请 构建用于复杂数据处理的高效UDP服务器和客户端 matplotlib中文字体渲染 TruFor笔记和代码复现 深入分析:GitHub Trending 项目 "multipleWindow3dScene" pua大模型 ggml教程|mnist手写体识别量化推理 xgboost2.0最佳实践 xgboost使用GPU最佳实践 马踏棋盘 cloudlflare推理llama2 docker搭建elasticsearch并使用python连接 FreeU-文字生成图片的免费午餐笔记 使用xgboost的c接口推理模型 Archlinux使用CMake调用xgboost的c接口 m2cgen生成机器学习c语言推理代码 xgboost模型序列化存储并推理 speculative-sampling笔记 prompt2model笔记 RoboTAP笔记 自建obsidian同步服务 MediaPipe即将推出图像生成服务 Dual-Stream Diffusion Net for Text-to-Video Generation笔记 ViT在DDPM取代UNet(DiT) arch4edu搞崩了我的flutter LISA(推理分割)笔记 在终端绘制GPU显存使用曲线 GPTBot介绍 arch蓝牙无法连接 GPU部署llama-cpp-python(llama.cpp通用) 花式求GCD 使用llama构建一个蜜罐(前端) 使用llama构建一个蜜罐(后端) llama-cpp-python快速上手 快速上手llama2.c(更新版) Paper Gestalt笔记 DINO-v2笔记 快速上手llama2.c AnyDoor笔记 Archlinux安装scrcpy加载共享库出错 error while loading shared libraries:libusb-1.0.so.0:wrong ELF class:ELFCLASS32 npc_gzip笔记 python调用c++函数 Filesystem type ntfs3,ntfs not configured in kernel open_clip编码图像和文本 PicGo配置CloudflareR2图片储存 ArchlinuxGnome快捷键打开终端 clip-interrogator代码解析 GroundingDINO安装报错解决 2023华为鲲鹏畅想日暨西安高新国际会议中心零食午饭测评 RoboMaster开源仓库汇总(长期更新) 没有手都可以在腾讯云创建镜像 I3D笔记
最后一遍学习Transformer
About the Author StudyingLover · 2026-01-02 · via StudyingLover's Blog

Nx LayersInputsInput EmbeddingPositional Encoding+Multi-Head AttnAdd & NormFeed ForwardAdd & NormNx LayersOutputs(shifted right)Output EmbeddingPositional Encoding+MaskedMulti-Head AttnAdd & NormMulti-Head Attn(Cross Attention)Add & NormFeed ForwardAdd & NormLinearSoftmaxOutput Probs

Now Inspecting

Input Embedding

Source: Section 3.4

Mathematical Formulation

Embedding(x) * √ d_model

Tensor Shape Flow

[Batch, Seq_Len] → [Batch, Seq_Len, 512]

First Principles

将离散的 Token ID 转换为连续向量空间。注意:论文中在这里乘以了 sqrt(d_model) 来和位置编码的量级匹配。

具体模块

self-attention

对于一个输入x,先复制成3份QQ,KK,VV ,分别乘上WQW_Q,WKW_K,WVW_V矩阵,得到三个向量QQ,KK,VV

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

dkd_kQ,KQ,K矩阵的列数,即向量维度

经典八股问题:为什么除以dkd_k? 根据论文,有三点考量

  1. 防止点积数值过大导致梯度极小:论文明确指出,当 dkd_k(键向量的维度)较大时,点积运算的结果在数量级上会变得非常大。这会将 Softmax 函数推向梯度极小的区域(即饱和区),导致在反向传播时梯度消失,难以训练。为了抵消这种效应,作者选择将点积除以 dk\sqrt{d_k} 进行缩放。
  2. 数学统计上的方差控制:论文在脚注中提供了数学假设来解释为什么点积会变大:
  • 假设 query 和 key 的分量是相互独立的随机变量,且均值(mean)为 0,方差(variance)为 1。
  • 那么它们的点积 q⋅k=∑i=1dkqikiq \cdot k = \sum_{i=1}^{d_{k}}q_{i}k_{i} 的均值仍为 0,但方差会变成 dkd_k
  • 除以 dk\sqrt{d_k} 可以将方差重新缩放回 1,保持数值分布的稳定。
  1. 实验性能的考量:作者观察到,对于较小的 dkd_k 值,加性注意力(additive attention)和点积注意力(dot-product attention)性能相似。但是,对于较大的 dkd_k 值,如果不进行缩放,加性注意力的表现会优于点积注意力。缩放操作使得点积注意力在维度较高时也能保持良好的性能。

QQ乘以 KTK^T后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。对矩阵的每一行进行 Softmax,即每一行的和都变为 1.得到 Softmax 矩阵之后可以和V相乘,得到最终的输出ZZ

Multi-Head Attention

对于输入x,先通过不同的WQW_Q,WKW_K,WVW_V矩阵,然后进入不同的self attention,最后把结果拼在一起过一个线性层WOW^O得到最后结果

headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)

MultiHead(Q,K,V)=Concat(head1,...,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O

Masked Multi-Head Attention

输入矩阵包含 <Begin> I have a cat 五个单词的表示向量,Mask 是一个 5∗55*5的 矩阵,不遮挡 = 0,遮挡 = 1,用于防止模型“看见”未来的 token,形如

0123401234[0111100111000110000100000]\begin{array}{cc} & \begin{matrix} 0 & 1 & 2 & 3 & 4 \end{matrix} \\ \begin{matrix} 0 \\ 1 \\ 2 \\ 3 \\ 4 \end{matrix} & \left[ \begin{matrix} 0 & 1 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 & 1 \\ 0 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 \end{matrix} \right] \end{array}

QQ乘以 KTK^T根据mask矩阵遮挡住每一个单词之后的信息,然后过softmax得到attention score

Add & Norm

LayerNorm(X+MultiHeadAttention(X))\mathrm{LayerNorm}\left(X+\text{MultiHeadAttention}(X)\right) LayerNorm(X+FeedForward(X))\mathrm{LayerNorm}\left(X+\text{FeedForward}(X)\right)

X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。

Add指 X+MultiHeadAttention(X),表示残差连接

Feed Forward

一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数

max(0,XW1+b1)W2+b2max(0,XW_1+b_1)W_2+b_2

Encoder

encoder是由多个encoder block组成的,第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出矩阵C,这一矩阵后续会用到 Decoder 中。

Decoder

这部分有两个Multi-Head Attention,第一个Multi-Head Attention 层采用了 Masked 操作。第二个 Multi-Head Attention 层的QQ使用上一个 Decoder block 的输出计算,KK, VV矩阵使用 Encoder 的最终输出CC,得到最后的输出ZZ

最后的部分是利用 Softmax 预测下一个单词

  • 训练整个ZZ每行都要用上算loss然后反向传播
  • 我们的目标是求 P(xt+1∣x1,...,xt)P(x_{t+1} | x_1, ..., x_t)。这个概率分布正好就是由包含前面所有信息的最后一个向量 hth_t 经过线性层(Linear Head)和 Softmax 得到的

Decoder 输出的最后一行向量,维度其实是 Hidden Size,而不是词表大小 Vocab Size。所以中间还必须要经过一个线性层(Linear Layer),通常和最开始的“输入 Embedding 矩阵”是共享权重(Weight Tying)的。也就是说,把 token 变成向量的矩阵,和把向量变回 token 概率的矩阵,往往是互为转置的同一个矩阵

极大似然估计理解Transformer

Transformer 的 Decoder 最终输出的是一个概率分布。

假设我们的模型参数为 θ\theta(也就是那堆 WQ,WK,V,WLinearW_Q, W_K, V, W_{Linear} 等矩阵)。对于一个序列 x=(x1,x2,...,xT)x = (x_1, x_2, ..., x_T),Transformer 实际上是在建模这样一个条件概率: Pθ(x)=∏t=1TPθ(xt∣x1,...,xt−1)P_\theta(x) = \prod_{t=1}^{T} P_\theta(x_t | x_1, ..., x_{t-1})

  • 含义: 整个句子出现的概率,等于“在给定前面所有词的情况下,下一个词出现的概率”的连乘积。
  • 实现: 只取Decoder最后一行做 Softmax 得到的结果。

极大似然估计的核心思想是:既然我们已经在现实世界中观测到了这组训练数据(比如维基百科的文本),那么最合理的模型参数 θ\theta,应该是让这组数据出现的概率最大的那组参数。

假设我们的训练集 DD 包含 NN 个样本。我们要找到最优的 θ∗\theta^*θ∗=argmax⁡θPθ(D)\theta^* = \operatorname*{argmax}_\theta P_\theta(D) 因为样本是独立的,联合概率就是连乘: θ∗=argmax⁡θ∏i=1NPθ(x(i))\theta^* = \operatorname*{argmax}_\theta \prod_{i=1}^{N} P_\theta(x^{(i)}) 连乘不好算(容易数值溢出且难以求导),所以我们在数学上通常取对数。因为 log⁡\log 是单调递增函数,最大化 PP 等价于最大化 log⁡P\log P

这就变成了最大化对数似然(Log-Likelihood): θ∗=argmax⁡θ∑i=1Nlog⁡Pθ(x(i))\theta^* = \operatorname*{argmax}_\theta \sum_{i=1}^{N} \log P_\theta(x^{(i)})

把 Transformer 的自回归性质代入进去:

θ∗=argmax⁡θ∑t=1Tlog⁡Pθ(xt∣x<t)\theta^* = \operatorname*{argmax}_\theta \sum_{t=1}^{T} \log P_\theta(x_t | x_{<t})

在深度学习里,我们习惯做最小化损失函数,而不是最大化目标。所以,我们在上面的公式前加一个负号,把 Maximizing 变成 Minimizing: Loss=−∑t=1Tlog⁡Pθ(xt∣x<t)\text{Loss} = - \sum_{t=1}^{T} \log P_\theta(x_t | x_{<t}) 这就是交叉熵损失函数(Cross-Entropy Loss)!

注:对于 One-hot 编码的真实标签 yy,交叉熵 H(y,y^)=−∑yilog⁡y^iH(y, \hat{y}) = - \sum y_i \log \hat{y}_i,因为真实标签 yy 只有对应词的位置是 1,其他是 0,所以就退化成了 −log⁡P(target_token)-\log P(\text{target\_token})

这也解释了为什么大模型会产生“幻觉”——因为它只是在拟合概率上的最大似然,而不是在理解逻辑上的真理。如果训练数据里有很多错误信息,MLE 会忠实地让模型把这些错误当成高概率事件。

八股

在自注意力机制中,序列中的每一个词(Token)都需要与序列中的所有其他词计算相关性得分。这就导致了计算量和内存消耗随着序列长度的增加呈平方级增长。

自注意力的核心公式为:

Attention(Q,K,V)=softmax(QKTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V

QQ 的维度是 n×dn \times dKTK^T 的维度是 d×nd \times n,将它们相乘,得到一个维度为 n×nn \times n 的矩阵(即 Attention Score 矩阵,表示 nn 个 Token 两两之间的注意力权重)。矩阵乘法需要进行 n×n×dn \times n \times d 次乘加运算。由于特征维度 dd 通常是一个固定的常数(例如 512 或 4096),因此相对于序列长度 nn,时间复杂度为 O(n2⋅d)O(n^2 \cdot d),简化表示为 O(n2)O(n^2)。前面得到的 n×nn \times n 的注意力权重矩阵,去乘以维度为 n×dn \times dVV 矩阵。同样需要 n×n×dn \times n \times d 次运算,时间复杂度依然是 O(n2)O(n^2)

除了计算耗时,内存占用同样是一个巨大的瓶颈: 为了进行 Softmax 计算以及在反向传播(Backpropagation)时计算梯度,模型必须在显存中保存那个 n×nn \times n 的注意力得分矩阵。 当序列长度 nn 变得非常大(例如从 2K 扩展到 128K)时,n2n^2 的内存占用会呈爆炸式增长,很容易导致显存溢出(OOM)。