查看“︁注意力机制”︁的源代码
←
注意力机制
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{noteTA |G1=IT |1=zh-cn:通过;zh-tw:透過; }} {{机器学习导航栏}} '''注意力机制'''({{lang-en|attention}})是[[人工神经网络]]中一种模仿[[注意|认知注意力]]的技术。这种机制可以增强神经网络输入数据中某些部分的权重,同时减弱其他部分的权重,以此将网络的关注点聚焦于数据中最重要的一小部分。数据中哪些部分比其他部分更重要取决于上下文。可以通过[[梯度下降法]]对注意力机制进行训练。 类似于注意力机制的架构最早于1990年代提出,当时提出的名称包括乘法模块(multiplicative module)、sigma pi单元、超网络(hypernetwork)等。<ref name=Lecun2020 />注意力机制的灵活性来自于它的“软权重”特性,即这种权重是可以在运行时改变的,而非像通常的权重一样必须在运行时保持固定。注意力机制的用途包括[[神经图灵机]]中的记忆功能、{{le|可微分神经计算机|Differentiable neural computer}}中的推理任务<ref name=Graves2016 />、[[Transformer模型|Transformer 模型]]中的语言处理、Perceiver(感知器)模型中的多模态数据处理(声音、图像、视频和文本)。<ref name=allyouneed /><ref name=Ramachandran2019 /><ref name=jaegle2021 /><ref name=tiernan2021 /> == 概述 == 假设我们有一个以索引 <math>i</math> 排列的标记(token)序列。对于每一个标记 <math>i</math>,神经网络计算出一个相应的满足 <math>\sum_i w_i=1</math> 的非负软权重 <math>w_i</math>。每个标记都对应一个由[[词嵌入]]得到的向量 <math>v_i</math>。加权平均 <math>\sum_i w_i v_i</math> 即是注意力机制的输出结果。 可以使用'''查询-键机制'''(query-key mechanism)计算软权重。从每个标记的词嵌入,我们计算其对应的查询向量 <math>q_i</math> 和键向量 <math>k_i</math>。再计算点积 <math>q_i k_j</math> 的 [[softmax函数|softmax 函数]]便可以得到对应的权重,其中 <math>i</math> 代表当前标记、<math>j</math> 表示与当前标记产生注意力关系的标记。 某些架构中会采用多头注意力机制(multi-head attention),其中每一部分都有独立的查询(query)、键(key)和值(value)。 == 语言翻译示例 == 下图展示了将英语翻译成法语的机器,其基本架构为编码器-解码器结构,另外再加上了一个注意力单元。在图示的简单情况下,注意力单元只是循环层状态的点积计算,并不需要训练。但在实践中,注意力单元由需要训练的三个完全连接的神经网络层组成。这三层分别被称为查询(query)、键(key)和值(value)。 <table> <tr> <td style="vertical-align:top"> {{plain image with caption|File:Attention-1-sn.png | align=left | 加入注意力机制的编码器-解码器架构。图中使用具体的数值表示向量的大小,使其更为直观。左侧黑色箭头表示的是编码器-解码器,中间橘色箭头表示的是注意力单元,右侧灰色与彩色方块表示的是计算的数据。矩阵H与向量w中的灰色区域表示零值。数值下标表示向量大小。字母下标i与i-1表示计算步。| 500px }} </td> </tr><tr> <td> {| class="wikitable" |+ 图例 |- ! 标签 !! 描述 |- | 100 || 语句最大长度 |- | 300 || [[词嵌入|嵌入]]尺寸(词维度) |- | 500 || 隐向量长度 |- | 9k, 10k || 输入、输出语言的词典大小 |- | <u>x</u>, <u>Y</u> || 大小为 9k 与 10k 的[[独热]]词典向量。<u>x</u> → x 以[[查找表]]实现。<u>Y</u> 是解码器 D 线性输出的 argmax 值。 |- | x || 大小为 300 的词嵌入向量,通常使用 {{le|GloVe}} 或 [[word2vec]] 等模型预先计算得到的结果。 |- | h || 大小为 500 的编码器隐向量。对于每一计算步,该向量包含了之前所有出现过的词语的信息。最终得到的 h 可以被看作是一个“句”向量,[[杰弗里·辛顿]]则称之为“思维向量”(thought vector)。 |- | s || 大小为 500 的解码器隐向量。 |- | E || 500 个神经元的[[循环神经网络]]编码器。输出大小为 500。输入大小为 800,其中 300 为词嵌入维度,500 为循环连接。编码器仅在初始化时直接连接到解码器,故箭头以淡灰色表示。 |- | D || 两层解码器。循环层有 500 个神经元,线性全连接层则有 10k 个神经元(目标词典大小)。<ref name="pytorch_s2s"/>单线性层就包含500 万(500×10k)个参数,约为循环层参数的 10 倍。 |- | score || 大小为 100 的对准分数 |- | w || 大小为 100 的注意力权重向量。这些权重为“软”权重,即可以在前向传播时改变,而非只在训练阶段改变的神经元权重。 |- | A || 注意力模块,可以是循环状态的点积,也可以是查询-键-值全连接层。输出是大小为 100 的向量 w。 |- | H || 500×100 的矩阵,即 100 个隐向量 h 连接而成的矩阵。 |- | c || 大小为 500 的上下文向量 = H * w,即以 w 对所有 h 向量取加权平均。 |} </td> </tr> </table> 下表是每一步计算的示例。为清楚起见,表中使用了具体的数值或图形而非字母表示向量与矩阵。嵌套的图形代表了每个h都包含之前所有单词的历史记录。在这里,我们引入注意力分数以得到所需的注意力权重。 {| class="wikitable" |- | 步 || x || h, H = 编码器输出 <br> 大小为 500×1 的向量,以图形表示 || s = 解码器提供给注意力单元的输入 || 对准分数 || w = 注意力权重 <br> = [[Softmax函数|softmax]](分数) || c = 上下文向量 = H*w || y = 解码器输出 |- | 1 || I || [[ File:icon-red-diamond.png | 30px]] = “I”的向量编码 || - || - || - || - || - |- | 2 || love || [[ File:icon-green-square.png | 30px]] = “I love”的向量编码 || - || - || - || - || - |- | 3 || you || [[ File:icon-blue-circle.png | 30px]] = “I love you”的向量编码 || - || - || - || - || - |- | 4 || - || - || 解码器尚未初始化,故使用编码器输出h<sub>3</sub>对其初始化 <br> [[ File:icon-blue-circle.png | 30px]] || [.63 -3.2 -2.5 .5 .5 ...] || [.94 .02 .04 0 0 ...] || .94 * [[ File:icon-red-diamond.png | 30px]] + .02 * [[ File:icon-green-square.png | 30px]] + .04 * [[ File:icon-blue-circle.png | 30px]] || je |- | 5 || - || - || s<sub>4</sub> || [-1.5 -3.9 .57 .5 .5 ...] || [.11 .01 .88 0 0 ...] || .11 * [[ File:icon-red-diamond.png | 30px]] + .01 * [[ File:icon-green-square.png | 30px]] + .88 * [[ File:icon-blue-circle.png | 30px]] || t' |- | 6 || - || - || s<sub>5</sub> || [-2.8 .64 -3.2 .5 .5 ...] || [.03 .95 .02 0 0 ...] || .03 * [[ File:icon-red-diamond.png | 30px]] + .95 * [[ File:icon-green-square.png | 30px]] + .02 * [[ File:icon-blue-circle.png | 30px]] || aime |} 以矩阵展示的注意力权重表现了网络如何根据上下文调整其关注点。 {| | |I |love |you |- |je | style="background-color:black; color:white; border: 1px solid black" |.94 | style="background-color:white; color:black; border: 1px solid black" | .02 | style="background-color:white; color:black; border: 1px solid black" | .04 |- | t' | style="background-color:white; color:black; border: 1px solid black" | .11 | style="background-color:white; color:black; border: 1px solid black" | .01 | style="background-color:grey ; color:white; border: 1px solid black" | .88 |- |aime | style="background-color:white; color:black; border: 1px solid black" |.03 | style="background-color:black; color:white; border: 1px solid black" | .95 | style="background-color:white; color:black; border: 1px solid black" | .02 |} 对注意力权重的这种展现方式回应了人们经常用来批评神经网络的[[可解釋人工智慧|可解释性]]问题。对于一个只作逐字翻译而不考虑词序的网络,其注意力权重矩阵会是一个对角占优矩阵。这里非对角占优的特性表明注意力机制能捕捉到更为细微的特征。在第一次通过解码器时,94%的注意力权重在第一个英文单词“I”上,因此网络的输出为对应的法语单词“je”(我)。而在第二次通过解码器时,此时88%的注意力权重在第三个英文单词“you”上,因此网络输出了对应的法语“t'”(你)。最后一遍时,95%的注意力权重在第二个英文单词“love”上,所以网络最后输出的是法语单词“aime”(爱)。 == 变体 == 注意力机制有许多变体:点积注意力(dot-product attention)、QKV 注意力(query-key-value attention)、强注意力(hard attention)、软注意力(soft attention)、自注意力(self attention)、交叉注意力(cross attention)、Luong 注意力、Bahdanau 注意力等。这些变体重新组合编码器端的输入,以将注意力效果重新分配到每个目标输出。通常而言,由点积得到的相关式矩阵提供了重新加权系数(参见图例)。 {| class="wikitable" !1. 编码器-解码器点积 !2. 编解码器QKV !3. 编码器点积 !4. 编码器QKV !5. Pytorch示例 |- |[[File:Attn-xy-dot.png|缩略图|同时需要编码器与解码器来计算注意力。<ref name=xy-dot />]] |[[File:Attn-xy-qkv.png|缩略图|同时需要编码器与解码器来计算注意力。<ref name=xy-qkv />]] |[[File:Attn-xx-dot.png|缩略图|解码器不用于计算注意力。因为只有一个输入,W是自相关点积,即w <sub>'''ij'''</sub> = x <sub>'''i'''</sub> * x <sub>'''j。'''</sub><ref name=xx-dot />]] |[[File:Attn-xx-qkv.png|缩略图|解码器不用于计算注意力。<ref name=xx-qkv />]] |[[File:Attn-pytorch-tutorial.png|缩略图| 使用FC层而非相关性点积计算注意力。<ref name=pytorch-tutorial />]] |} {| class="wikitable" |+图例 !标签 !描述 |- |变量 X,H,S,T |大写变量代表整句语句,而不仅仅是当前单词。例如,H 代表编码器隐状态的矩阵——每列代表一个单词。 |- |S, T |S = 解码器隐状态,T = 目标词嵌入。在 Pytorch 示例变体训练阶段,T 在两个源之间交替,具体取决于所使用的教师强制(teacher forcing)级别。 T 可以是网络输出词的嵌入,即 embedding(argmax(FC output))。或者当使用教师强制进行训练时,T 可以是已知正确单词的嵌入。可以指定其发生的概率(如 1/2)。 |- | X, H | H = 编码器隐状态,X = 输入词嵌入 |- |W |注意力系数 |- |Qw, Kw, Vw, FC |分别用于查询、键、向量的权重矩阵。 FC 是一个全连接的权重矩阵。 |- |带圈+,带圈x |带圈+ = 向量串联。带圈x = 矩阵乘法 |- |corr |逐列取 softmax(点积矩阵)。点积在变体 3 中的定义是'''x <sub>i</sub> * x <sub>j</sub>''' ,在变体 1 中是 '''h <sub>i</sub> * s''' <sub>j</sub> ,在变体 2 中是 列<sub>'''i'''</sub>(Kw*H) * 列<sub>'''j'''</sub> (Qw*S),在变体 4 中是 列<sub>'''i'''</sub>(Kw*X) * 列<sub>'''j'''</sub> (Qw*X)。变体 5 则使用全连接层来确定系数。对于 QKV 变体,则点积由 sqrt(d) 归一化,其中 d 是 QKV 矩阵的高度。 |} == 参考文献 == {{Reflist|2|refs=<ref name="pytorch_s2s">{{ cite web | url = https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html | title = Pytorch.org seq2seq tutorial | access-date=December 2, 2021 }}</ref> <ref name=Lecun2020>{{cite AV media | people=Yann Lecun | date=2020 | title=Deep Learning course at NYU, Spring 2020, video lecture Week 6 | url=http://www.youtube.com/watch?v=ycbMGyCPzvE%3Ft%3D3182 | access-date=2022-03-08 | time=53:00 | archive-date=2023-07-09 | archive-url=https://web.archive.org/web/20230709152025/https://www.youtube.com/watch?v=ycbMGyCPzvE%3Ft%3D3182 | dead-url=no }}</ref> <ref name=Graves2016>{{Cite journal|date=2016-10-12|title=Hybrid computing using a neural network with dynamic external memory|journal=Nature|language=en|volume=538|issue=7626|doi=10.1038/nature20101|issn=1476-4687|pages=471–476|pmid=27732574|bibcode=2016Natur.538..471G|s2cid=205251479|url=https://ora.ox.ac.uk/objects/uuid:dd8473bd-2d70-424d-881b-86d9c9c66b51|last1=Graves|first1=Alex|last2=Wayne|first2=Greg|last3=Reynolds|first3=Malcolm|last4=Harley|first4=Tim|last5=Danihelka|first5=Ivo|last6=Grabska-Barwińska|first6=Agnieszka|last7=Colmenarejo|first7=Sergio Gómez|last8=Grefenstette|first8=Edward|last9=Ramalho|first9=Tiago|last10=Agapiou|first10=John|last11=Badia|first11=Adrià Puigdomènech|last12=Hermann|first12=Karl Moritz|last13=Zwols|first13=Yori|last14=Ostrovski|first14=Georg|last15=Cain|first15=Adam|last16=King|first16=Helen|last17=Summerfield|first17=Christopher|last18=Blunsom|first18=Phil|last19=Kavukcuoglu|first19=Koray|last20=Hassabis|first20=Demis|access-date=2022-06-07|archive-date=2022-10-02|archive-url=https://web.archive.org/web/20221002210320/https://ora.ox.ac.uk/objects/uuid:dd8473bd-2d70-424d-881b-86d9c9c66b51|dead-url=no}}</ref> <ref name=allyouneed>{{cite arXiv|last1=Vaswani|first1=Ashish|last2=Shazeer|first2=Noam|last3=Parmar|first3=Niki|last4=Uszkoreit|first4=Jakob|last5=Jones|first5=Llion|last6=Gomez|first6=Aidan N.|last7=Kaiser|first7=Lukasz|last8=Polosukhin|first8=Illia|date=2017-12-05|title=Attention Is All You Need|class=cs.CL|eprint=1706.03762}}</ref> <ref name=Ramachandran2019>{{cite arXiv|last1=Ramachandran|first1=Prajit|last2=Parmar|first2=Niki|last3=Vaswani|first3=Ashish|last4=Bello|first4=Irwan|last5=Levskaya|first5=Anselm|last6=Shlens|first6=Jonathon|date=2019-06-13|title=Stand-Alone Self-Attention in Vision Models|class=cs.CV|eprint=1906.05909}}</ref> <ref name=jaegle2021 >{{cite arXiv|last1=Jaegle|first1=Andrew|last2=Gimeno|first2=Felix|last3=Brock|first3=Andrew|last4=Zisserman|first4=Andrew|last5=Vinyals|first5=Oriol|last6=Carreira|first6=Joao|date=2021-06-22|title=Perceiver: General Perception with Iterative Attention|class=cs.CV|eprint=2103.03206}}</ref> <ref name=tiernan2021 >{{Cite web|last=Ray|first=Tiernan|title=Google's Supermodel: DeepMind Perceiver is a step on the road to an AI machine that could process anything and everything|url=https://www.zdnet.com/article/googles-supermodel-deepmind-perceiver-is-a-step-on-the-road-to-an-ai-machine-that-could-process-everything/|access-date=2021-08-19|website=ZDNet|language=en|archive-date=2021-10-29|archive-url=https://web.archive.org/web/20211029180058/https://www.zdnet.com/article/googles-supermodel-deepmind-perceiver-is-a-step-on-the-road-to-an-ai-machine-that-could-process-everything/|dead-url=no}}</ref> <ref name=xy-dot>{{ cite arXiv|last1=Luong|first1=Minh-Thang| date=2015-09-20 |title=Effective Approaches to Attention-based Neural Machine Translation |class=cs.CL| eprint=1508.04025v5}}</ref> <ref name=xy-qkv>{{cite AV media | people=Neil Rhodes | date=2021 | title=CS 152 NN—27: Attention: Keys, Queries, & Values | url=https://www.youtube.com/watch?v=rA28vBqN4RM | access-date=2021-12-22 | time=06:30 | archive-date=2022-10-21 | archive-url=https://web.archive.org/web/20221021210348/https://www.youtube.com/watch?v=rA28vBqN4RM | dead-url=no }}</ref> <ref name=xx-dot>{{cite AV media | people=Alfredo Canziani & Yann Lecun | date=2021 | title=NYU Deep Learning course, Spring 2020 | url=https://www.youtube.com/watch?v=f01J0Dri-6k | access-date=2021-12-22 | time=05:30 | archive-date=2023-03-22 | archive-url=https://web.archive.org/web/20230322233805/https://www.youtube.com/watch?v=f01J0Dri-6k | dead-url=no }}</ref> <ref name=xx-qkv>{{cite AV media | people=Alfredo Canziani & Yann Lecun | date=2021 | title=NYU Deep Learning course, Spring 2020 | url=https://www.youtube.com/watch?v=f01J0Dri-6k | access-date=2021-12-22 | time=20:15 | archive-date=2023-03-22 | archive-url=https://web.archive.org/web/20230322233805/https://www.youtube.com/watch?v=f01J0Dri-6k | dead-url=no }}</ref> <ref name=pytorch-tutorial>{{ cite web|url=https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html | title = NLP From Scratch: Translation With a Sequence To Sequence Network and Attention | last=Robertson|first=Sean| website=pytorch.org|access-date=2021-12-22 }}</ref>}} {{Differentiable computing}} [[Category:机器学习]]
该页面使用的模板:
Template:Differentiable computing
(
查看源代码
)
Template:Lang-en
(
查看源代码
)
Template:Le
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Plain image with caption
(
查看源代码
)
Template:Reflist
(
查看源代码
)
Template:机器学习导航栏
(
查看源代码
)
返回
注意力机制
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息