第5章 Attention 的思想
本章目标:
不用公式,理解 Attention 为什么会出现,以及 Query、Key、Value 这三个名字的直觉含义。
5.1 从一个问题开始
假设你在读一篇文章:
text
The animal didn't cross the street because it was too tired.
请问:it 指的是什么?
你一眼就知道:it 指的是 animal,而不是 street。
但是你是怎么知道的?
你的大脑做了什么?
5.2 人类是如何理解"it"的?
你读到 it 的时候,你的大脑会:
- 扫描整个句子
- 找到所有可能的候选词(
animal、street) - 根据语义判断:
tired更可能描述animal,而不是street - 得出结论:
it = animal
这个过程就是:
根据当前词,去整个句子中寻找相关的词,并根据相关程度加权。
这就是 Attention 的核心思想。
5.3 RNN 是怎么做的?
RNN 的做法是:
#mermaid-svg-E447frclesOGTxiU{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-E447frclesOGTxiU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-E447frclesOGTxiU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-E447frclesOGTxiU .error-icon{fill:#552222;}#mermaid-svg-E447frclesOGTxiU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E447frclesOGTxiU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-E447frclesOGTxiU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E447frclesOGTxiU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E447frclesOGTxiU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-E447frclesOGTxiU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E447frclesOGTxiU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E447frclesOGTxiU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E447frclesOGTxiU .marker.cross{stroke:#333333;}#mermaid-svg-E447frclesOGTxiU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E447frclesOGTxiU p{margin:0;}#mermaid-svg-E447frclesOGTxiU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E447frclesOGTxiU .cluster-label text{fill:#333;}#mermaid-svg-E447frclesOGTxiU .cluster-label span{color:#333;}#mermaid-svg-E447frclesOGTxiU .cluster-label span p{background-color:transparent;}#mermaid-svg-E447frclesOGTxiU .label text,#mermaid-svg-E447frclesOGTxiU span{fill:#333;color:#333;}#mermaid-svg-E447frclesOGTxiU .node rect,#mermaid-svg-E447frclesOGTxiU .node circle,#mermaid-svg-E447frclesOGTxiU .node ellipse,#mermaid-svg-E447frclesOGTxiU .node polygon,#mermaid-svg-E447frclesOGTxiU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E447frclesOGTxiU .rough-node .label text,#mermaid-svg-E447frclesOGTxiU .node .label text,#mermaid-svg-E447frclesOGTxiU .image-shape .label,#mermaid-svg-E447frclesOGTxiU .icon-shape .label{text-anchor:middle;}#mermaid-svg-E447frclesOGTxiU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-E447frclesOGTxiU .rough-node .label,#mermaid-svg-E447frclesOGTxiU .node .label,#mermaid-svg-E447frclesOGTxiU .image-shape .label,#mermaid-svg-E447frclesOGTxiU .icon-shape .label{text-align:center;}#mermaid-svg-E447frclesOGTxiU .node.clickable{cursor:pointer;}#mermaid-svg-E447frclesOGTxiU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-E447frclesOGTxiU .arrowheadPath{fill:#333333;}#mermaid-svg-E447frclesOGTxiU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E447frclesOGTxiU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E447frclesOGTxiU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E447frclesOGTxiU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-E447frclesOGTxiU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E447frclesOGTxiU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-E447frclesOGTxiU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E447frclesOGTxiU .cluster text{fill:#333;}#mermaid-svg-E447frclesOGTxiU .cluster span{color:#333;}#mermaid-svg-E447frclesOGTxiU 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-E447frclesOGTxiU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-E447frclesOGTxiU rect.text{fill:none;stroke-width:0;}#mermaid-svg-E447frclesOGTxiU .icon-shape,#mermaid-svg-E447frclesOGTxiU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E447frclesOGTxiU .icon-shape p,#mermaid-svg-E447frclesOGTxiU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-E447frclesOGTxiU .icon-shape .label rect,#mermaid-svg-E447frclesOGTxiU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E447frclesOGTxiU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-E447frclesOGTxiU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-E447frclesOGTxiU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} The
animal
didn't
cross
the
street
because
it
信息从左到右,一步一步传递。
当 RNN 处理到 it 的时候,animal 的信息已经经过了 7 步传递。
每一步都会有信息损失。
所以 RNN 很难记住 animal。
5.4 Attention 是怎么做的?
Attention 的做法是:
#mermaid-svg-d7gozhDVoRWOsqaO{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-d7gozhDVoRWOsqaO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d7gozhDVoRWOsqaO .error-icon{fill:#552222;}#mermaid-svg-d7gozhDVoRWOsqaO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d7gozhDVoRWOsqaO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d7gozhDVoRWOsqaO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d7gozhDVoRWOsqaO .marker.cross{stroke:#333333;}#mermaid-svg-d7gozhDVoRWOsqaO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d7gozhDVoRWOsqaO p{margin:0;}#mermaid-svg-d7gozhDVoRWOsqaO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-d7gozhDVoRWOsqaO .cluster-label text{fill:#333;}#mermaid-svg-d7gozhDVoRWOsqaO .cluster-label span{color:#333;}#mermaid-svg-d7gozhDVoRWOsqaO .cluster-label span p{background-color:transparent;}#mermaid-svg-d7gozhDVoRWOsqaO .label text,#mermaid-svg-d7gozhDVoRWOsqaO span{fill:#333;color:#333;}#mermaid-svg-d7gozhDVoRWOsqaO .node rect,#mermaid-svg-d7gozhDVoRWOsqaO .node circle,#mermaid-svg-d7gozhDVoRWOsqaO .node ellipse,#mermaid-svg-d7gozhDVoRWOsqaO .node polygon,#mermaid-svg-d7gozhDVoRWOsqaO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d7gozhDVoRWOsqaO .rough-node .label text,#mermaid-svg-d7gozhDVoRWOsqaO .node .label text,#mermaid-svg-d7gozhDVoRWOsqaO .image-shape .label,#mermaid-svg-d7gozhDVoRWOsqaO .icon-shape .label{text-anchor:middle;}#mermaid-svg-d7gozhDVoRWOsqaO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d7gozhDVoRWOsqaO .rough-node .label,#mermaid-svg-d7gozhDVoRWOsqaO .node .label,#mermaid-svg-d7gozhDVoRWOsqaO .image-shape .label,#mermaid-svg-d7gozhDVoRWOsqaO .icon-shape .label{text-align:center;}#mermaid-svg-d7gozhDVoRWOsqaO .node.clickable{cursor:pointer;}#mermaid-svg-d7gozhDVoRWOsqaO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d7gozhDVoRWOsqaO .arrowheadPath{fill:#333333;}#mermaid-svg-d7gozhDVoRWOsqaO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d7gozhDVoRWOsqaO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d7gozhDVoRWOsqaO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d7gozhDVoRWOsqaO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d7gozhDVoRWOsqaO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d7gozhDVoRWOsqaO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d7gozhDVoRWOsqaO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d7gozhDVoRWOsqaO .cluster text{fill:#333;}#mermaid-svg-d7gozhDVoRWOsqaO .cluster span{color:#333;}#mermaid-svg-d7gozhDVoRWOsqaO 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-d7gozhDVoRWOsqaO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d7gozhDVoRWOsqaO rect.text{fill:none;stroke-width:0;}#mermaid-svg-d7gozhDVoRWOsqaO .icon-shape,#mermaid-svg-d7gozhDVoRWOsqaO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d7gozhDVoRWOsqaO .icon-shape p,#mermaid-svg-d7gozhDVoRWOsqaO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d7gozhDVoRWOsqaO .icon-shape .label rect,#mermaid-svg-d7gozhDVoRWOsqaO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d7gozhDVoRWOsqaO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d7gozhDVoRWOsqaO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d7gozhDVoRWOsqaO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 直接查询
直接查询
直接查询
直接查询
直接查询
直接查询
直接查询
直接查询
直接查询
直接查询
it
The
animal ★高相关
didn't
cross
the
street ★低相关
because
was
too
tired
it 直接和所有词交互,计算相关程度,然后加权求和。
不需要经过中间步骤。
5.5 Query、Key、Value 的直觉
这三个名字来自信息检索(Information Retrieval)的概念。
想象一个搜索引擎:
#mermaid-svg-EPahlujJMMdD8KDE{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-EPahlujJMMdD8KDE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EPahlujJMMdD8KDE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EPahlujJMMdD8KDE .error-icon{fill:#552222;}#mermaid-svg-EPahlujJMMdD8KDE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EPahlujJMMdD8KDE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EPahlujJMMdD8KDE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EPahlujJMMdD8KDE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EPahlujJMMdD8KDE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EPahlujJMMdD8KDE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EPahlujJMMdD8KDE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EPahlujJMMdD8KDE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EPahlujJMMdD8KDE .marker.cross{stroke:#333333;}#mermaid-svg-EPahlujJMMdD8KDE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EPahlujJMMdD8KDE p{margin:0;}#mermaid-svg-EPahlujJMMdD8KDE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EPahlujJMMdD8KDE .cluster-label text{fill:#333;}#mermaid-svg-EPahlujJMMdD8KDE .cluster-label span{color:#333;}#mermaid-svg-EPahlujJMMdD8KDE .cluster-label span p{background-color:transparent;}#mermaid-svg-EPahlujJMMdD8KDE .label text,#mermaid-svg-EPahlujJMMdD8KDE span{fill:#333;color:#333;}#mermaid-svg-EPahlujJMMdD8KDE .node rect,#mermaid-svg-EPahlujJMMdD8KDE .node circle,#mermaid-svg-EPahlujJMMdD8KDE .node ellipse,#mermaid-svg-EPahlujJMMdD8KDE .node polygon,#mermaid-svg-EPahlujJMMdD8KDE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EPahlujJMMdD8KDE .rough-node .label text,#mermaid-svg-EPahlujJMMdD8KDE .node .label text,#mermaid-svg-EPahlujJMMdD8KDE .image-shape .label,#mermaid-svg-EPahlujJMMdD8KDE .icon-shape .label{text-anchor:middle;}#mermaid-svg-EPahlujJMMdD8KDE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EPahlujJMMdD8KDE .rough-node .label,#mermaid-svg-EPahlujJMMdD8KDE .node .label,#mermaid-svg-EPahlujJMMdD8KDE .image-shape .label,#mermaid-svg-EPahlujJMMdD8KDE .icon-shape .label{text-align:center;}#mermaid-svg-EPahlujJMMdD8KDE .node.clickable{cursor:pointer;}#mermaid-svg-EPahlujJMMdD8KDE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EPahlujJMMdD8KDE .arrowheadPath{fill:#333333;}#mermaid-svg-EPahlujJMMdD8KDE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EPahlujJMMdD8KDE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EPahlujJMMdD8KDE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EPahlujJMMdD8KDE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EPahlujJMMdD8KDE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EPahlujJMMdD8KDE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EPahlujJMMdD8KDE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EPahlujJMMdD8KDE .cluster text{fill:#333;}#mermaid-svg-EPahlujJMMdD8KDE .cluster span{color:#333;}#mermaid-svg-EPahlujJMMdD8KDE 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-EPahlujJMMdD8KDE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EPahlujJMMdD8KDE rect.text{fill:none;stroke-width:0;}#mermaid-svg-EPahlujJMMdD8KDE .icon-shape,#mermaid-svg-EPahlujJMMdD8KDE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EPahlujJMMdD8KDE .icon-shape p,#mermaid-svg-EPahlujJMMdD8KDE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EPahlujJMMdD8KDE .icon-shape .label rect,#mermaid-svg-EPahlujJMMdD8KDE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EPahlujJMMdD8KDE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EPahlujJMMdD8KDE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EPahlujJMMdD8KDE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Query
搜索词
'深度学习'
搜索引擎
Key
文档标题
'机器学习入门'
'深度学习实战'
'Python教程'
相关度计算
Value
文档内容
加权返回
| 概念 | 搜索引擎 | Attention |
|---|---|---|
| Query | 搜索词 | 当前 Token 想找什么 |
| Key | 文档标题 | 每个 Token 能提供什么 |
| Value | 文档内容 | 每个 Token 的实际信息 |
| 相关度 | 匹配分数 | Attention Score |
5.6 一个更直观的例子
句子:The cat sat on the mat.
当处理 sat 这个词时:
- Query :
sat在问:"谁坐了?坐在哪里?" - Key :每个词都在说:"我是
The"、"我是cat"、"我是on"... - Attention Score :
sat和cat的相关度高,和The的相关度低 - Value :根据相关度,把
cat、on、mat的信息加权融合到sat的表示中
最终,sat 的新表示包含了:
"cat 坐在 mat 上" 这个完整的语义信息。
5.6.1 Embedding 是原材料,Attention 是雕刻师
这里有一个很重要的直觉:
Embedding 查表得到的初始向量,对于多义词(如 bank)每次都一样------它不知道当前语境是"银行"还是"河岸"。
真正区分多义词的是 Self-Attention。
text
Embedding(原材料):bank → 同一块"石材"
Attention(雕刻师):
- 上下文有 money, loan → 雕刻成"金融银行"
- 上下文有 river, boat → 雕刻成"河岸"
所以 Embedding 像一块通用的原材料 ,它代表"bank 这个词所有可能的含义"。Attention 根据周围的 Token 把它加工 成当前语境下的精确语义。这就是为什么 Transformer 的输出叫做 Contextual Embedding(上下文词向量)------同一个词在不同句子中会得到完全不同的向量。
📌 第11章会用可视化展示 bank 在不同语境中如何逐层从"模糊"变成"明确"。
5.7 为什么需要三个矩阵?
一个自然的问题:为什么不直接用词向量计算相关度?
为什么要有 Q、K、V 三个矩阵?
原因是:
Q、K、V 让模型学习"如何查询"和"如何被查询",而不是直接用原始向量。
类比:
- 你去图书馆找书(Query)
- 书的索引卡(Key)和书的实际内容(Value)是分开的
- 索引卡是为了快速匹配,内容才是真正有用的信息
如果 Key 和 Value 是同一个东西,模型就失去了这种灵活性。
5.7.1 为什么 Key 和 Value 不能合并?
这是 Transformer 设计中最精妙的一步,很多教材一笔带过。
如果让同一个向量既负责"让别人容易找到我"(Key 的职责),又负责"提供真正的语义信息"(Value 的职责),这两个目标会互相冲突。
类比:一本书的标题 和正文承担的职责完全不同:
| 角色 | 职责 | 优化方向 |
|---|---|---|
| 标题(Key) | 让读者快速判断"这本书和我的需求相关吗" | 简洁、易匹配 |
| 正文(Value) | 提供真正完整的知识内容 | 丰富、有语义 |
如果强行让一个向量同时做标题和正文,就像让一本书的标题写满详细内容------别人反而找不到它了。
拆开后的好处:
- Key 可以自由地学习:"怎样让需要我的人更容易找到我"
- Value 可以自由地学习:"当别人找到我后,我应该贡献什么信息"
- 两者解耦,模型学习更高效
💡 这也是为什么 Transformer 用三个独立的可训练矩阵 WQW_QWQ、WKW_KWK、WVW_VWV------每个矩阵负责从同一个 Embedding 中"提取"出不同角色的表示。同一个词,站在"提问者"、"被匹配者"、"信息提供者"三个角度,应该有三种不同的表达方式。
5.8 Attention 的本质
Attention 的本质是:
软性的、可微分的、单向拉取式的信息检索。
- 软性:不是硬性选择某一个词,而是对所有词加权求和
- 可微分:权重是通过 Softmax 计算的,可以反向传播
- 信息检索:根据 Query 从所有 Token 中检索相关信息
这三个特性使得 Attention 可以端到端训练。
5.8.1 Attention 是 Pull(拉取),不是 Exchange(交换)
这是一个容易产生误解的地方。我们常说"Token 之间交互",但更精确的描述是:
每个 Token 作为 Query,主动从所有 Token 中拉取信息。
#mermaid-svg-dwQp2yUqEAtCTYxe{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-dwQp2yUqEAtCTYxe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dwQp2yUqEAtCTYxe .error-icon{fill:#552222;}#mermaid-svg-dwQp2yUqEAtCTYxe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dwQp2yUqEAtCTYxe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dwQp2yUqEAtCTYxe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dwQp2yUqEAtCTYxe .marker.cross{stroke:#333333;}#mermaid-svg-dwQp2yUqEAtCTYxe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dwQp2yUqEAtCTYxe p{margin:0;}#mermaid-svg-dwQp2yUqEAtCTYxe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster-label text{fill:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster-label span{color:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster-label span p{background-color:transparent;}#mermaid-svg-dwQp2yUqEAtCTYxe .label text,#mermaid-svg-dwQp2yUqEAtCTYxe span{fill:#333;color:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe .node rect,#mermaid-svg-dwQp2yUqEAtCTYxe .node circle,#mermaid-svg-dwQp2yUqEAtCTYxe .node ellipse,#mermaid-svg-dwQp2yUqEAtCTYxe .node polygon,#mermaid-svg-dwQp2yUqEAtCTYxe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dwQp2yUqEAtCTYxe .rough-node .label text,#mermaid-svg-dwQp2yUqEAtCTYxe .node .label text,#mermaid-svg-dwQp2yUqEAtCTYxe .image-shape .label,#mermaid-svg-dwQp2yUqEAtCTYxe .icon-shape .label{text-anchor:middle;}#mermaid-svg-dwQp2yUqEAtCTYxe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dwQp2yUqEAtCTYxe .rough-node .label,#mermaid-svg-dwQp2yUqEAtCTYxe .node .label,#mermaid-svg-dwQp2yUqEAtCTYxe .image-shape .label,#mermaid-svg-dwQp2yUqEAtCTYxe .icon-shape .label{text-align:center;}#mermaid-svg-dwQp2yUqEAtCTYxe .node.clickable{cursor:pointer;}#mermaid-svg-dwQp2yUqEAtCTYxe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dwQp2yUqEAtCTYxe .arrowheadPath{fill:#333333;}#mermaid-svg-dwQp2yUqEAtCTYxe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dwQp2yUqEAtCTYxe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dwQp2yUqEAtCTYxe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dwQp2yUqEAtCTYxe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dwQp2yUqEAtCTYxe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dwQp2yUqEAtCTYxe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster text{fill:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe .cluster span{color:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe 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-dwQp2yUqEAtCTYxe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dwQp2yUqEAtCTYxe rect.text{fill:none;stroke-width:0;}#mermaid-svg-dwQp2yUqEAtCTYxe .icon-shape,#mermaid-svg-dwQp2yUqEAtCTYxe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dwQp2yUqEAtCTYxe .icon-shape p,#mermaid-svg-dwQp2yUqEAtCTYxe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dwQp2yUqEAtCTYxe .icon-shape .label rect,#mermaid-svg-dwQp2yUqEAtCTYxe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dwQp2yUqEAtCTYxe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dwQp2yUqEAtCTYxe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dwQp2yUqEAtCTYxe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} sat 作为 Query 时
计算相关度
计算相关度
计算相关度
sat 的 Q
cat 的 K ★高
the 的 K
mat 的 K ★中
按权重拉取 V
sat 的新表示
当 sat 拉取 cat 的信息时,cat 不会因此获得 sat 的任何信息。cat 需要等到自己作为 Query 时,才会去拉取 sat 的信息。
最终效果:一层 Attention 之后,每个 Token 都独立地从全局拉取了信息,所以看起来"所有 Token 都更新了"。但本质上,这是 N 次独立的 Pull 操作并行执行,而非 N×N 次双向交换。
5.9 与 CNN 的对比
CNN 也有一种"注意力"机制,但它是局部的:
#mermaid-svg-8iv1uaeol06ujU36{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-8iv1uaeol06ujU36 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8iv1uaeol06ujU36 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8iv1uaeol06ujU36 .error-icon{fill:#552222;}#mermaid-svg-8iv1uaeol06ujU36 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8iv1uaeol06ujU36 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8iv1uaeol06ujU36 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8iv1uaeol06ujU36 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8iv1uaeol06ujU36 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8iv1uaeol06ujU36 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8iv1uaeol06ujU36 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8iv1uaeol06ujU36 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8iv1uaeol06ujU36 .marker.cross{stroke:#333333;}#mermaid-svg-8iv1uaeol06ujU36 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8iv1uaeol06ujU36 p{margin:0;}#mermaid-svg-8iv1uaeol06ujU36 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8iv1uaeol06ujU36 .cluster-label text{fill:#333;}#mermaid-svg-8iv1uaeol06ujU36 .cluster-label span{color:#333;}#mermaid-svg-8iv1uaeol06ujU36 .cluster-label span p{background-color:transparent;}#mermaid-svg-8iv1uaeol06ujU36 .label text,#mermaid-svg-8iv1uaeol06ujU36 span{fill:#333;color:#333;}#mermaid-svg-8iv1uaeol06ujU36 .node rect,#mermaid-svg-8iv1uaeol06ujU36 .node circle,#mermaid-svg-8iv1uaeol06ujU36 .node ellipse,#mermaid-svg-8iv1uaeol06ujU36 .node polygon,#mermaid-svg-8iv1uaeol06ujU36 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8iv1uaeol06ujU36 .rough-node .label text,#mermaid-svg-8iv1uaeol06ujU36 .node .label text,#mermaid-svg-8iv1uaeol06ujU36 .image-shape .label,#mermaid-svg-8iv1uaeol06ujU36 .icon-shape .label{text-anchor:middle;}#mermaid-svg-8iv1uaeol06ujU36 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8iv1uaeol06ujU36 .rough-node .label,#mermaid-svg-8iv1uaeol06ujU36 .node .label,#mermaid-svg-8iv1uaeol06ujU36 .image-shape .label,#mermaid-svg-8iv1uaeol06ujU36 .icon-shape .label{text-align:center;}#mermaid-svg-8iv1uaeol06ujU36 .node.clickable{cursor:pointer;}#mermaid-svg-8iv1uaeol06ujU36 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8iv1uaeol06ujU36 .arrowheadPath{fill:#333333;}#mermaid-svg-8iv1uaeol06ujU36 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8iv1uaeol06ujU36 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8iv1uaeol06ujU36 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8iv1uaeol06ujU36 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8iv1uaeol06ujU36 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8iv1uaeol06ujU36 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8iv1uaeol06ujU36 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8iv1uaeol06ujU36 .cluster text{fill:#333;}#mermaid-svg-8iv1uaeol06ujU36 .cluster span{color:#333;}#mermaid-svg-8iv1uaeol06ujU36 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-8iv1uaeol06ujU36 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8iv1uaeol06ujU36 rect.text{fill:none;stroke-width:0;}#mermaid-svg-8iv1uaeol06ujU36 .icon-shape,#mermaid-svg-8iv1uaeol06ujU36 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8iv1uaeol06ujU36 .icon-shape p,#mermaid-svg-8iv1uaeol06ujU36 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8iv1uaeol06ujU36 .icon-shape .label rect,#mermaid-svg-8iv1uaeol06ujU36 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8iv1uaeol06ujU36 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8iv1uaeol06ujU36 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8iv1uaeol06ujU36 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Attention 全局感受野
Token 1
Attention
Token 2
Token 3
Token N
输出
CNN 局部感受野
Token 1
卷积核
Token 2
Token 3
输出
| 特性 | CNN | Attention |
|---|---|---|
| 感受野 | 局部(卷积核大小) | 全局(所有 Token) |
| 计算复杂度 | O(N) | O(N²) |
| 长距离依赖 | 需要多层叠加 | 一层即可 |
| 位置感知 | 隐式 | 需要 Position Encoding |
本章总结
Attention 的三句话总结:
- 为什么需要 Attention:RNN 无法直接建立长距离依赖
- Attention 做什么:让每个 Token 直接和所有 Token 交互,计算相关度
- Q、K、V 是什么:Query 是问题,Key 是索引,Value 是内容
本章思考题
- 如果没有 Attention,如何让 RNN 处理长距离依赖?(提示:思考 LSTM 的局限)
- 为什么 Attention 的计算复杂度是 O(N²)?
- Query 和 Key 为什么可以不同?举一个例子说明它们不同的好处。
- Attention 是"软性"的,这意味着什么?有什么好处?
下一章预告
下一章我们正式推导 Self-Attention。
包括:
- Q、K、V 矩阵是如何计算的?
- Attention Score 是如何计算的?
- 为什么要除以 √d_k?
- 完整手算一个例子