Transformer模型详解-CSDN发布版

Transformer 模型详解:一篇文章看懂 Attention 的来龙去脉

本文内容依据知乎「初识CV」《Transformer模型详解(图解最完整版)》优化重写,配图改为 Mermaid 绘制,方便在 CSDN 直接阅读。适合对深度学习有兴趣、想搞清楚 Transformer 到底在干嘛的同学。


目录

  • [从一个句子说起:Attention 想解决什么问题](#从一个句子说起:Attention 想解决什么问题)
  • [整体结构:Encoder 读、Decoder 写](#整体结构:Encoder 读、Decoder 写)
  • [Self-Attention:Q、K、V 是怎么回事](#Self-Attention:Q、K、V 是怎么回事)
  • [一个具体例子:Thinking Machines](#一个具体例子:Thinking Machines)
  • 多头注意力:不只一个角度看
  • [Decoder 的两个"不同"](#Decoder 的两个"不同")
  • 位置编码:让模型知道谁在谁前面
  • [Add & Norm:训练更稳的小机关](#Add & Norm:训练更稳的小机关)
  • 一张图带走全部要点

1. 从一个句子说起

先别急着看结构,先看它到底要解决什么问题。

拿翻译举例:

I arrived at the bank after crossing the river

这里的 bank 到底是银行还是河岸?人一看就明白------后面跟着 river(河流),那多半是河岸。

机器要能做到这一点,关键就是看上下文:当模型翻译到 bank 这个词时,得回头去看句子里其它词,尤其是 river。谁跟当前词关系越近,谁就对它的含义贡献越大。

这就引出了 Transformer 和它前辈 RNN 的分水岭:

  • RNN:一个词一个词从左往右传,信息传得越远越淡;
  • Self-Attention:一次看全句,按"相关度"加权,一步到位。

#mermaid-svg-fSa2xTlLzn7N6vtF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fSa2xTlLzn7N6vtF .error-icon{fill:#552222;}#mermaid-svg-fSa2xTlLzn7N6vtF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fSa2xTlLzn7N6vtF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fSa2xTlLzn7N6vtF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fSa2xTlLzn7N6vtF .marker.cross{stroke:#333333;}#mermaid-svg-fSa2xTlLzn7N6vtF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fSa2xTlLzn7N6vtF p{margin:0;}#mermaid-svg-fSa2xTlLzn7N6vtF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster-label text{fill:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster-label span{color:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster-label span p{background-color:transparent;}#mermaid-svg-fSa2xTlLzn7N6vtF .label text,#mermaid-svg-fSa2xTlLzn7N6vtF span{fill:#333;color:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF .node rect,#mermaid-svg-fSa2xTlLzn7N6vtF .node circle,#mermaid-svg-fSa2xTlLzn7N6vtF .node ellipse,#mermaid-svg-fSa2xTlLzn7N6vtF .node polygon,#mermaid-svg-fSa2xTlLzn7N6vtF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fSa2xTlLzn7N6vtF .rough-node .label text,#mermaid-svg-fSa2xTlLzn7N6vtF .node .label text,#mermaid-svg-fSa2xTlLzn7N6vtF .image-shape .label,#mermaid-svg-fSa2xTlLzn7N6vtF .icon-shape .label{text-anchor:middle;}#mermaid-svg-fSa2xTlLzn7N6vtF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fSa2xTlLzn7N6vtF .rough-node .label,#mermaid-svg-fSa2xTlLzn7N6vtF .node .label,#mermaid-svg-fSa2xTlLzn7N6vtF .image-shape .label,#mermaid-svg-fSa2xTlLzn7N6vtF .icon-shape .label{text-align:center;}#mermaid-svg-fSa2xTlLzn7N6vtF .node.clickable{cursor:pointer;}#mermaid-svg-fSa2xTlLzn7N6vtF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fSa2xTlLzn7N6vtF .arrowheadPath{fill:#333333;}#mermaid-svg-fSa2xTlLzn7N6vtF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fSa2xTlLzn7N6vtF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fSa2xTlLzn7N6vtF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fSa2xTlLzn7N6vtF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fSa2xTlLzn7N6vtF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fSa2xTlLzn7N6vtF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster text{fill:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF .cluster span{color:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fSa2xTlLzn7N6vtF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fSa2xTlLzn7N6vtF rect.text{fill:none;stroke-width:0;}#mermaid-svg-fSa2xTlLzn7N6vtF .icon-shape,#mermaid-svg-fSa2xTlLzn7N6vtF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fSa2xTlLzn7N6vtF .icon-shape p,#mermaid-svg-fSa2xTlLzn7N6vtF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fSa2xTlLzn7N6vtF .icon-shape .label rect,#mermaid-svg-fSa2xTlLzn7N6vtF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fSa2xTlLzn7N6vtF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fSa2xTlLzn7N6vtF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fSa2xTlLzn7N6vtF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Self-Attention:一次看全,按相关度加权
高分
低分
低分
bank
river
at
I
RNN:从左往右一步步传
隔得远,信息淡了
I
arrived
at
bank
after
river

一句话总结 :注意力机制让每个词都能"看见"句子里的所有词,按重要程度加权组合,上下文信息一步到位。而 Q(询问)、K(被问)、V(答案)都来自同一句话时,就叫 Self-Attention


2. 整体结构

Transformer 是一个"编码器---解码器"结构,左半读入,右半产出。

原文的 Transformer 是 6 层 Encoder + 6 层 Decoder 堆起来的深网络。左边 Encoder 读入源语言,层层做 Self-Attention,让每个词都带上全文的语境;右边 Decoder 一边看自己已经生成的内容,一边盯着 Encoder 的输出,逐词产出目标语言。
#mermaid-svg-wjy4VP7oxE1iFKK9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wjy4VP7oxE1iFKK9 .error-icon{fill:#552222;}#mermaid-svg-wjy4VP7oxE1iFKK9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wjy4VP7oxE1iFKK9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .marker.cross{stroke:#333333;}#mermaid-svg-wjy4VP7oxE1iFKK9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wjy4VP7oxE1iFKK9 p{margin:0;}#mermaid-svg-wjy4VP7oxE1iFKK9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster-label text{fill:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster-label span{color:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster-label span p{background-color:transparent;}#mermaid-svg-wjy4VP7oxE1iFKK9 .label text,#mermaid-svg-wjy4VP7oxE1iFKK9 span{fill:#333;color:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .node rect,#mermaid-svg-wjy4VP7oxE1iFKK9 .node circle,#mermaid-svg-wjy4VP7oxE1iFKK9 .node ellipse,#mermaid-svg-wjy4VP7oxE1iFKK9 .node polygon,#mermaid-svg-wjy4VP7oxE1iFKK9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .rough-node .label text,#mermaid-svg-wjy4VP7oxE1iFKK9 .node .label text,#mermaid-svg-wjy4VP7oxE1iFKK9 .image-shape .label,#mermaid-svg-wjy4VP7oxE1iFKK9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-wjy4VP7oxE1iFKK9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .rough-node .label,#mermaid-svg-wjy4VP7oxE1iFKK9 .node .label,#mermaid-svg-wjy4VP7oxE1iFKK9 .image-shape .label,#mermaid-svg-wjy4VP7oxE1iFKK9 .icon-shape .label{text-align:center;}#mermaid-svg-wjy4VP7oxE1iFKK9 .node.clickable{cursor:pointer;}#mermaid-svg-wjy4VP7oxE1iFKK9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .arrowheadPath{fill:#333333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wjy4VP7oxE1iFKK9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wjy4VP7oxE1iFKK9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wjy4VP7oxE1iFKK9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster text{fill:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 .cluster span{color:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wjy4VP7oxE1iFKK9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wjy4VP7oxE1iFKK9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-wjy4VP7oxE1iFKK9 .icon-shape,#mermaid-svg-wjy4VP7oxE1iFKK9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wjy4VP7oxE1iFKK9 .icon-shape p,#mermaid-svg-wjy4VP7oxE1iFKK9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wjy4VP7oxE1iFKK9 .icon-shape .label rect,#mermaid-svg-wjy4VP7oxE1iFKK9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wjy4VP7oxE1iFKK9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wjy4VP7oxE1iFKK9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wjy4VP7oxE1iFKK9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Decoder 写出(N=6 层)
Encoder 读入(N=6 层)
K、V 传给 Decoder
预测词回填输入,逐词生成
输入 Input
多头注意力

Multi-Head Attention
Add & Norm
前馈网络 Feed Forward
Add & Norm
输出:已生成的部分
Masked 多头注意力
Add & Norm
Encoder-Decoder 注意力

Q 来自本层 K/V 来自 Encoder
Add & Norm
前馈网络 Feed Forward
Add & Norm
Softmax 输出概率

这张图先记住三件事:

  1. 每一层都是 注意力 + 残差 + 前馈
  2. Decoder 比 Encoder 多一层交叉注意力(Encoder-Decoder Attention);
  3. Decoder 输出逐词回填,生成下一个字。

3. Self-Attention 详解

这是整篇文章的核心,看懂了这里,Transformer 就懂了一半。

Self-Attention 里,Q(Query 查询)、K(Key 键)、V(Value 值)三个矩阵都来自同一个输入。它干的事可以拆成四步:

  1. 算分数:Q 和每个 K 做点乘;
  2. 缩放:除以 √dk,防止数值过大;
  3. Softmax:归一化成概率分布;
  4. 加权求和:权重 × V,得到输出。

核心公式:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}}) V Attention(Q,K,V)=softmax(dk QKT)V

其中 d_k 是单个 query/key 向量的维度。
#mermaid-svg-t4S6zRPLaec54jvp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-t4S6zRPLaec54jvp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-t4S6zRPLaec54jvp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-t4S6zRPLaec54jvp .error-icon{fill:#552222;}#mermaid-svg-t4S6zRPLaec54jvp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t4S6zRPLaec54jvp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-t4S6zRPLaec54jvp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t4S6zRPLaec54jvp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t4S6zRPLaec54jvp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-t4S6zRPLaec54jvp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t4S6zRPLaec54jvp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t4S6zRPLaec54jvp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t4S6zRPLaec54jvp .marker.cross{stroke:#333333;}#mermaid-svg-t4S6zRPLaec54jvp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t4S6zRPLaec54jvp p{margin:0;}#mermaid-svg-t4S6zRPLaec54jvp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-t4S6zRPLaec54jvp .cluster-label text{fill:#333;}#mermaid-svg-t4S6zRPLaec54jvp .cluster-label span{color:#333;}#mermaid-svg-t4S6zRPLaec54jvp .cluster-label span p{background-color:transparent;}#mermaid-svg-t4S6zRPLaec54jvp .label text,#mermaid-svg-t4S6zRPLaec54jvp span{fill:#333;color:#333;}#mermaid-svg-t4S6zRPLaec54jvp .node rect,#mermaid-svg-t4S6zRPLaec54jvp .node circle,#mermaid-svg-t4S6zRPLaec54jvp .node ellipse,#mermaid-svg-t4S6zRPLaec54jvp .node polygon,#mermaid-svg-t4S6zRPLaec54jvp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-t4S6zRPLaec54jvp .rough-node .label text,#mermaid-svg-t4S6zRPLaec54jvp .node .label text,#mermaid-svg-t4S6zRPLaec54jvp .image-shape .label,#mermaid-svg-t4S6zRPLaec54jvp .icon-shape .label{text-anchor:middle;}#mermaid-svg-t4S6zRPLaec54jvp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-t4S6zRPLaec54jvp .rough-node .label,#mermaid-svg-t4S6zRPLaec54jvp .node .label,#mermaid-svg-t4S6zRPLaec54jvp .image-shape .label,#mermaid-svg-t4S6zRPLaec54jvp .icon-shape .label{text-align:center;}#mermaid-svg-t4S6zRPLaec54jvp .node.clickable{cursor:pointer;}#mermaid-svg-t4S6zRPLaec54jvp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-t4S6zRPLaec54jvp .arrowheadPath{fill:#333333;}#mermaid-svg-t4S6zRPLaec54jvp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-t4S6zRPLaec54jvp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-t4S6zRPLaec54jvp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t4S6zRPLaec54jvp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-t4S6zRPLaec54jvp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t4S6zRPLaec54jvp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-t4S6zRPLaec54jvp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-t4S6zRPLaec54jvp .cluster text{fill:#333;}#mermaid-svg-t4S6zRPLaec54jvp .cluster span{color:#333;}#mermaid-svg-t4S6zRPLaec54jvp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-t4S6zRPLaec54jvp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-t4S6zRPLaec54jvp rect.text{fill:none;stroke-width:0;}#mermaid-svg-t4S6zRPLaec54jvp .icon-shape,#mermaid-svg-t4S6zRPLaec54jvp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t4S6zRPLaec54jvp .icon-shape p,#mermaid-svg-t4S6zRPLaec54jvp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-t4S6zRPLaec54jvp .icon-shape .label rect,#mermaid-svg-t4S6zRPLaec54jvp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t4S6zRPLaec54jvp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-t4S6zRPLaec54jvp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-t4S6zRPLaec54jvp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Q 查询

当前词想找谁
① 点乘 Q·K
K 键

所有词被问的
② 除以 √dk 缩放
③ Softmax 归一化
④ 权重 × V 加权求和
V 值

所有词真正内容
输出向量

带上上下文的新表示

打个比方:Q 是你在图书馆发出的问题,K 是每本书的索引标签,V 是书本身的内容。先拿问题和标签做匹配(打分),再按匹配程度把书的内容加权取出来。


4. 一个具体例子:Thinking Machines

光有公式太抽象,我们走一个具体的例子。

假设要翻译词组 Thinking Machines 。Thinking 的向量叫 x₁,Machines 的向量叫 x₂。现在处理 Thinking 这个词:

  1. 用 q₁ 分别与 k₁、k₂ 做点乘,得到两个分数 score₁、score₂;
  2. 除以 √d_k 缩放,再 Softmax 归一化;
  3. 权重分别乘 v₁、v₂,加起来得到新表示 z₁。

#mermaid-svg-pYjTghVEMJ2C4ct5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pYjTghVEMJ2C4ct5 .error-icon{fill:#552222;}#mermaid-svg-pYjTghVEMJ2C4ct5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pYjTghVEMJ2C4ct5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .marker.cross{stroke:#333333;}#mermaid-svg-pYjTghVEMJ2C4ct5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pYjTghVEMJ2C4ct5 p{margin:0;}#mermaid-svg-pYjTghVEMJ2C4ct5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster-label text{fill:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster-label span{color:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster-label span p{background-color:transparent;}#mermaid-svg-pYjTghVEMJ2C4ct5 .label text,#mermaid-svg-pYjTghVEMJ2C4ct5 span{fill:#333;color:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .node rect,#mermaid-svg-pYjTghVEMJ2C4ct5 .node circle,#mermaid-svg-pYjTghVEMJ2C4ct5 .node ellipse,#mermaid-svg-pYjTghVEMJ2C4ct5 .node polygon,#mermaid-svg-pYjTghVEMJ2C4ct5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .rough-node .label text,#mermaid-svg-pYjTghVEMJ2C4ct5 .node .label text,#mermaid-svg-pYjTghVEMJ2C4ct5 .image-shape .label,#mermaid-svg-pYjTghVEMJ2C4ct5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-pYjTghVEMJ2C4ct5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .rough-node .label,#mermaid-svg-pYjTghVEMJ2C4ct5 .node .label,#mermaid-svg-pYjTghVEMJ2C4ct5 .image-shape .label,#mermaid-svg-pYjTghVEMJ2C4ct5 .icon-shape .label{text-align:center;}#mermaid-svg-pYjTghVEMJ2C4ct5 .node.clickable{cursor:pointer;}#mermaid-svg-pYjTghVEMJ2C4ct5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .arrowheadPath{fill:#333333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pYjTghVEMJ2C4ct5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pYjTghVEMJ2C4ct5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pYjTghVEMJ2C4ct5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster text{fill:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 .cluster span{color:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pYjTghVEMJ2C4ct5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pYjTghVEMJ2C4ct5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-pYjTghVEMJ2C4ct5 .icon-shape,#mermaid-svg-pYjTghVEMJ2C4ct5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pYjTghVEMJ2C4ct5 .icon-shape p,#mermaid-svg-pYjTghVEMJ2C4ct5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pYjTghVEMJ2C4ct5 .icon-shape .label rect,#mermaid-svg-pYjTghVEMJ2C4ct5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pYjTghVEMJ2C4ct5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pYjTghVEMJ2C4ct5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pYjTghVEMJ2C4ct5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 计算 Thinking 的注意力分数
各自生成 Q/K/V
输入词向量
Thinking x1
Machines x2
q1 查询
k1 键
v1 值
q2 查询
k2 键
v2 值
score1 = q1·k1
score2 = q1·k2
除以√dk → Softmax 归一化
权重 × v1 + 权重 × v2 = z1(新表示)

权重最大的通常是自己(毕竟自己和自己最相关),但 river 这类真正决定含义的词 会拿到明显更高的分数。把所有词用权重加起来,就得到了一个带着全文语境的新表示 z₁

把整句的词向量拼成矩阵 X,一次就能算出所有词的 Q、K、V:

Q = X ⋅ W Q , K = X ⋅ W K , V = X ⋅ W V Q = X \cdot W^Q,\quad K = X \cdot W^K,\quad V = X \cdot W^V Q=X⋅WQ,K=X⋅WK,V=X⋅WV

其中 W 是模型训练中学出来的参数矩阵。


5. 多头注意力

"多头"就是准备了好几套 Q/K/V,从不同视角看同一句话。

单个注意力只能学出一种"关系";但一句话里可能同时存在指代、语法、语义等多种关系。多头注意力(Multi-Head Attention)准备多组 Q/K/V,每组(每个 head)各学各的侧重,最后拼起来再过一层线性变换。
#mermaid-svg-X2GAJJGcF2Y2Vr88{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .error-icon{fill:#552222;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .marker.cross{stroke:#333333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 p{margin:0;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster-label text{fill:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster-label span{color:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster-label span p{background-color:transparent;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .label text,#mermaid-svg-X2GAJJGcF2Y2Vr88 span{fill:#333;color:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .node rect,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node circle,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node ellipse,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node polygon,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .rough-node .label text,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node .label text,#mermaid-svg-X2GAJJGcF2Y2Vr88 .image-shape .label,#mermaid-svg-X2GAJJGcF2Y2Vr88 .icon-shape .label{text-anchor:middle;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .rough-node .label,#mermaid-svg-X2GAJJGcF2Y2Vr88 .node .label,#mermaid-svg-X2GAJJGcF2Y2Vr88 .image-shape .label,#mermaid-svg-X2GAJJGcF2Y2Vr88 .icon-shape .label{text-align:center;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .node.clickable{cursor:pointer;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .arrowheadPath{fill:#333333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-X2GAJJGcF2Y2Vr88 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X2GAJJGcF2Y2Vr88 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster text{fill:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .cluster span{color:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-X2GAJJGcF2Y2Vr88 rect.text{fill:none;stroke-width:0;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .icon-shape,#mermaid-svg-X2GAJJGcF2Y2Vr88 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .icon-shape p,#mermaid-svg-X2GAJJGcF2Y2Vr88 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .icon-shape .label rect,#mermaid-svg-X2GAJJGcF2Y2Vr88 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X2GAJJGcF2Y2Vr88 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-X2GAJJGcF2Y2Vr88 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-X2GAJJGcF2Y2Vr88 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入向量
Head 1

学词义关系
Head 2

学指代关系
Head 3

学语法关系
...
拼接 Concat
线性变换
多头注意力的输出

为什么有用? 单头像只问一个人,多头像同时问好几个明白人,把各自看到的不同关系凑在一起,模型表达容量更大。


6. Decoder 的两个"不同"

Decoder 的结构和 Encoder 基本一样,只有两处明显不同,因为它是生成一个词一个词来的:

  1. 第一级 Masked 多头注意力 :key、query、value 都来自前一层 Decoder 的输出,但加了 Mask 操作------只能 attend 到左边已经翻译过的词,不能偷看右边还没生成的词(毕竟生成下一个词之前,它还不存在,偷看就不公平了);
  2. 第二级 Encoder-Decoder Attention:query 来自前一级 Decoder 层的输出,但 key 和 value 来自 Encoder 的输出------这让 Decoder 的每个位置都能 attend 到输入序列的每一个位置。

#mermaid-svg-dFN8jMBWxPvJ9bz5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .error-icon{fill:#552222;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .marker.cross{stroke:#333333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 p{margin:0;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster-label text{fill:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster-label span{color:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster-label span p{background-color:transparent;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .label text,#mermaid-svg-dFN8jMBWxPvJ9bz5 span{fill:#333;color:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .node rect,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node circle,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node ellipse,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node polygon,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .rough-node .label text,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node .label text,#mermaid-svg-dFN8jMBWxPvJ9bz5 .image-shape .label,#mermaid-svg-dFN8jMBWxPvJ9bz5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .rough-node .label,#mermaid-svg-dFN8jMBWxPvJ9bz5 .node .label,#mermaid-svg-dFN8jMBWxPvJ9bz5 .image-shape .label,#mermaid-svg-dFN8jMBWxPvJ9bz5 .icon-shape .label{text-align:center;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .node.clickable{cursor:pointer;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .arrowheadPath{fill:#333333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dFN8jMBWxPvJ9bz5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dFN8jMBWxPvJ9bz5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster text{fill:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .cluster span{color:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dFN8jMBWxPvJ9bz5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .icon-shape,#mermaid-svg-dFN8jMBWxPvJ9bz5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .icon-shape p,#mermaid-svg-dFN8jMBWxPvJ9bz5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .icon-shape .label rect,#mermaid-svg-dFN8jMBWxPvJ9bz5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dFN8jMBWxPvJ9bz5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dFN8jMBWxPvJ9bz5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dFN8jMBWxPvJ9bz5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第二级:Encoder-Decoder Attention
前一级 Decoder 输出

提供 Q
交叉注意力
Encoder 输出

提供 K、V
第一级:Masked Self-Attention
已翻译的词
Masked 多头注意力

只能看左边,不能偷看未来

记成一句话:k 和 v 来源永远相同; q 在 Encoder 和第一级 Decoder 中与 k、v 相同,唯独在 Encoder-Decoder 注意力这一层,q 来自 Decoder,k、v 来自 Encoder。


7. 位置编码

Transformer 里没有 recurrence,也没有 convolution,模型天生不知道词与词之间的先后顺序 。为了补上这个信息,论文的做法是:在词向量上加一份位置编码,让它"带着序号"进模型。

P E p o s , 2 i = sin ⁡ ( p o s / 10000 2 i / d m o d e l ) PE_{pos,2i} = \sin(pos / 10000^{2i/d_{model}}) PEpos,2i=sin(pos/100002i/dmodel)

P E p o s , 2 i + 1 = cos ⁡ ( p o s / 10000 2 i / d m o d e l ) PE_{pos,2i+1} = \cos(pos / 10000^{2i/d_{model}}) PEpos,2i+1=cos(pos/100002i/dmodel)
#mermaid-svg-fWeoPYOBgiANjwYR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fWeoPYOBgiANjwYR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fWeoPYOBgiANjwYR .error-icon{fill:#552222;}#mermaid-svg-fWeoPYOBgiANjwYR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fWeoPYOBgiANjwYR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fWeoPYOBgiANjwYR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fWeoPYOBgiANjwYR .marker.cross{stroke:#333333;}#mermaid-svg-fWeoPYOBgiANjwYR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fWeoPYOBgiANjwYR p{margin:0;}#mermaid-svg-fWeoPYOBgiANjwYR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fWeoPYOBgiANjwYR .cluster-label text{fill:#333;}#mermaid-svg-fWeoPYOBgiANjwYR .cluster-label span{color:#333;}#mermaid-svg-fWeoPYOBgiANjwYR .cluster-label span p{background-color:transparent;}#mermaid-svg-fWeoPYOBgiANjwYR .label text,#mermaid-svg-fWeoPYOBgiANjwYR span{fill:#333;color:#333;}#mermaid-svg-fWeoPYOBgiANjwYR .node rect,#mermaid-svg-fWeoPYOBgiANjwYR .node circle,#mermaid-svg-fWeoPYOBgiANjwYR .node ellipse,#mermaid-svg-fWeoPYOBgiANjwYR .node polygon,#mermaid-svg-fWeoPYOBgiANjwYR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fWeoPYOBgiANjwYR .rough-node .label text,#mermaid-svg-fWeoPYOBgiANjwYR .node .label text,#mermaid-svg-fWeoPYOBgiANjwYR .image-shape .label,#mermaid-svg-fWeoPYOBgiANjwYR .icon-shape .label{text-anchor:middle;}#mermaid-svg-fWeoPYOBgiANjwYR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fWeoPYOBgiANjwYR .rough-node .label,#mermaid-svg-fWeoPYOBgiANjwYR .node .label,#mermaid-svg-fWeoPYOBgiANjwYR .image-shape .label,#mermaid-svg-fWeoPYOBgiANjwYR .icon-shape .label{text-align:center;}#mermaid-svg-fWeoPYOBgiANjwYR .node.clickable{cursor:pointer;}#mermaid-svg-fWeoPYOBgiANjwYR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fWeoPYOBgiANjwYR .arrowheadPath{fill:#333333;}#mermaid-svg-fWeoPYOBgiANjwYR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fWeoPYOBgiANjwYR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fWeoPYOBgiANjwYR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fWeoPYOBgiANjwYR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fWeoPYOBgiANjwYR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fWeoPYOBgiANjwYR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fWeoPYOBgiANjwYR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fWeoPYOBgiANjwYR .cluster text{fill:#333;}#mermaid-svg-fWeoPYOBgiANjwYR .cluster span{color:#333;}#mermaid-svg-fWeoPYOBgiANjwYR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fWeoPYOBgiANjwYR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fWeoPYOBgiANjwYR rect.text{fill:none;stroke-width:0;}#mermaid-svg-fWeoPYOBgiANjwYR .icon-shape,#mermaid-svg-fWeoPYOBgiANjwYR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fWeoPYOBgiANjwYR .icon-shape p,#mermaid-svg-fWeoPYOBgiANjwYR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fWeoPYOBgiANjwYR .icon-shape .label rect,#mermaid-svg-fWeoPYOBgiANjwYR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fWeoPYOBgiANjwYR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fWeoPYOBgiANjwYR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fWeoPYOBgiANjwYR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 词向量 Embedding

位置编码 Positional Encoding

三角函数 or 可学习
带位置的输入

Embedding + Positional

三角函数的好处:不同位置的编码彼此可区分,而且不同周期天然编码了"相对距离"------位置 3 和位置 5 的距离,跟位置 8 和位置 10 的距离在编码空间里是"同类"的。


8. Add & Norm:残差连接 + 层归一化

每层注意力/前馈之后,都跟着一个 Add & Norm。

  • Add(残差连接):把上一层的输出原样"绕"过当前层,加到本层输出上。这样梯度有一条近路可以回传,多层网络也能训练动------图像界的 ResNet 也是这个思路。
  • Norm(层归一化):把一层的激活值归一化到合适范围,加速训练、帮助收敛。Transformer 用 LayerNorm,而不是 BatchNorm------因为输入长度会变、要按"层"而不是按"批"归一,语义更稳定。

#mermaid-svg-LDZ7o7IiYNhiwWfl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LDZ7o7IiYNhiwWfl .error-icon{fill:#552222;}#mermaid-svg-LDZ7o7IiYNhiwWfl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LDZ7o7IiYNhiwWfl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .marker.cross{stroke:#333333;}#mermaid-svg-LDZ7o7IiYNhiwWfl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LDZ7o7IiYNhiwWfl p{margin:0;}#mermaid-svg-LDZ7o7IiYNhiwWfl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster-label text{fill:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster-label span{color:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster-label span p{background-color:transparent;}#mermaid-svg-LDZ7o7IiYNhiwWfl .label text,#mermaid-svg-LDZ7o7IiYNhiwWfl span{fill:#333;color:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .node rect,#mermaid-svg-LDZ7o7IiYNhiwWfl .node circle,#mermaid-svg-LDZ7o7IiYNhiwWfl .node ellipse,#mermaid-svg-LDZ7o7IiYNhiwWfl .node polygon,#mermaid-svg-LDZ7o7IiYNhiwWfl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .rough-node .label text,#mermaid-svg-LDZ7o7IiYNhiwWfl .node .label text,#mermaid-svg-LDZ7o7IiYNhiwWfl .image-shape .label,#mermaid-svg-LDZ7o7IiYNhiwWfl .icon-shape .label{text-anchor:middle;}#mermaid-svg-LDZ7o7IiYNhiwWfl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .rough-node .label,#mermaid-svg-LDZ7o7IiYNhiwWfl .node .label,#mermaid-svg-LDZ7o7IiYNhiwWfl .image-shape .label,#mermaid-svg-LDZ7o7IiYNhiwWfl .icon-shape .label{text-align:center;}#mermaid-svg-LDZ7o7IiYNhiwWfl .node.clickable{cursor:pointer;}#mermaid-svg-LDZ7o7IiYNhiwWfl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .arrowheadPath{fill:#333333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LDZ7o7IiYNhiwWfl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LDZ7o7IiYNhiwWfl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LDZ7o7IiYNhiwWfl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster text{fill:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl .cluster span{color:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LDZ7o7IiYNhiwWfl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LDZ7o7IiYNhiwWfl rect.text{fill:none;stroke-width:0;}#mermaid-svg-LDZ7o7IiYNhiwWfl .icon-shape,#mermaid-svg-LDZ7o7IiYNhiwWfl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LDZ7o7IiYNhiwWfl .icon-shape p,#mermaid-svg-LDZ7o7IiYNhiwWfl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LDZ7o7IiYNhiwWfl .icon-shape .label rect,#mermaid-svg-LDZ7o7IiYNhiwWfl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LDZ7o7IiYNhiwWfl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LDZ7o7IiYNhiwWfl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LDZ7o7IiYNhiwWfl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 子层(注意力/前馈)
残差近路绕一层
前一层输出 X
注意力 / 前馈层
Add:X + 层输出
Layer Norm 归一化
输出更稳

参考论文:Layer Normalization(arXiv:1607.06450)


总结:一张图带走全部要点

六个点串起来,就是 Transformer 的全部骨架:

模块 一句话
Self-Attention Q/K/V 打分加权,看全局
缩放 + Softmax 把分数变成概率权重
多头注意力 多套 Q/K/V,多视角并行
Decoder 先 Masked 再交叉注意力
位置编码 给词向量加"序号",补顺序
Add & Norm 残差抄近道 + 层归一化稳训练

配合 The Illustrated Transformer(图文并茂,强烈推荐)一起看,理解会更立体。

相关推荐
玹外之音14 分钟前
Codex CLI 沙箱实战:安全地让 AI 执行 Shell 命令
人工智能·安全
博、、17 分钟前
酒吧点餐小程序开发:从场景痛点到系统落地的全流程拆解
人工智能·架构·需求分析
Q一件事18 分钟前
防风固沙服务真的能沿直线“送达”北京吗?——对一项区域关联度研究的思考
大数据·人工智能
七牛云行业应用21 分钟前
DSH Desktop 桌面版实测:Win/macOS 一键安装,“桌面也是插件“怎么理解,和 npx 起 Web UI 差在哪
人工智能·agent·ai编程
空堂与归22 分钟前
文本喂给模型前要做啥?文本预处理与张量表示全解析
人工智能
小海豚儿24 分钟前
你写的 Prompt,可能有一半是安慰剂
人工智能
空堂与归30 分钟前
机器读不懂人话?用NLP自然语言处理让AI理解文本
人工智能
AI的探索之旅30 分钟前
97 个 OpenCV 实例(十七):图片读写,FileStorage 与 JPEG 采样
人工智能·opencv·计算机视觉
Forerror202633 分钟前
API网关怎么选?MAI Gateway vs 开源方案全面对比
人工智能·ai工具·maigateway·企业ai网关·企业级大模型网关