个人学习笔记,如有错误欢迎指正,也欢迎交流,其他笔记见个人空间
为什么需要自注意力机制
传统神经网络(如CNN)处理的是固定长度的向量输入,但现实中的许多任务(如语言、语音、图数据)输入是长度可变的向量集合(Vector Set)。
例如:文字处理
问题1:如果我们把一个句子裡面的每一个词汇,都描述成一个向量,输入就会是一个数组,且随着句子长度不一样,这个数组也会变化。
问题2:要把每个词汇单独设一个向量,最简单的做法就是One-hot vector,但是随之而来的问题就是这个向量的长度和词汇数量一样多,比如一句话3个单词,apple是100,bag就得是010,单词越多,向量越长,问题越复杂。而且词汇之间彼此没有关联,cat和dog间没有联系,和apple也没有联系。
李老师介绍了一种方法解决这个问题:词嵌入 Word Embedding
Word Embedding(词嵌入) 是一种将词语表示为稠密向量(dense vector)的技术。与 One-hot 向量相比,它包含语义信息,能更好地反映词与词之间的关系。
举例:
它和接下来要说的自注意力机制有什么关系呢:
以自然语言处理NLP为例,词语转为嵌入向量,送入 Self-Attention 层,使用 Attention 机制建模词与词之间的关系,输出的是“考虑上下文之后”的向量,最终输出用于分类 / 生成 / 序列标注等任务。
打个比方来说:
-
Word Embedding: 你在派对上初识每个人(你知道他们的身份、个性)
-
Self-Attention: 你通过观察对话来判断谁和谁关系更密切,谁说的话最关键
Word Embedding不止可以处理单词,对于声音信号、图、分子信息等都能处理
声音信号:每个Window里的信息可以处理成一个向量frame,窗口每次向右一点再处理一个向量
图是每个节点看作一个向量,节点和节点之间的边就是关系连接吗。原子也类似,每个原子可以看作一个向量,一个分子就类似一个图。
输出的三种情况(对应三种任务)
Sequence Labeling(如词性标注):每个输入向量对应一个输出label
整体分类(如情感分析):整段输入对应一个输出label。
给一段话,判断它是积极还是消极;给一段语音,判断是谁在说;给一个分子判断它有没有疏水性......
Sequence to Sequence(如机器翻译):输入和输出均为序列,长度不一定相同,机器自己决定输出多少个label。
自注意力机制的登场
对于Sequence Labeling问题,以前的直觉就是使用 Fully-Connected Network(FCN)逐个处理向量,提取特征,但是这么做容易忽略上下文,导致出错。
可通过窗口法(上下文拼接)部分缓解,但受限于窗口大小和序列长度的变化。如果任务需要考虑整个句子就搞不定
对于这样的问题, 自注意力机制可以吃下一整个句子
中间这四个vector,都是考虑一整个句子后才得到的,且Self-Attention不是只能用一次,可以叠加很多次
自注意力机制的过程
简单来说:
-
输入:一整个向量序列 a1,a2,...,an(可能是整个网络的输入,也可能是某个隐藏层的输出)
-
输出:每个位置输出一个向量 bi,但这个向量是基于整个序列计算得出的
怎么产生bi呢,这里有一个特别的机制,比方说a1,这个机制可以帮我们找出ai与它有关系,其关联程度用α表示。
核心过程(以 Transformer 用法为例):
-
每个输入向量被映射为三个向量:查询Query(q)、键Key(k)、值Value(v)
-
对于每个 Query,计算其与所有 Key 的相似度(通常用 dot product 得到 attention score)
-
用 softmax 得到归一化的 attention weights(即α')
-
用这些权重对所有 Value 向量加权求和,得到最终输出向量 bi
PS:还有一种计算α的叫做additive的方式:
q,k,v具体含义
通俗易懂一点来说可以类比成图书馆借书
你走进图书馆,想找一本关于“人工智能”的书。
-
你心里想要找的主题(人工智能),就是 Query(查询)
-
每本书的目录或标签信息,就是 Key(关键词)
-
每本书的实际内容,就是 Value(内容)
Self-Attention 的过程就像这样:
-
你拿着你的“查询”(Query),
-
对比图书馆里每一本书的“标签”(Key),
-
找出那些最匹配的书(注意力分数高的 Key),
-
再根据它们的“内容”(Value)加权平均,汇总成一个你想要的“知识结果”。
从矩阵角度理解
每一个a都产生q,k,v
变成矩阵形式就是这样
Wq,Wk,Wv就是需要学习的参数
接下来每个q都会去乘不同的key得到 attention score
对于q2,3,4同样操作
对于b1,b2,b3,b4同理
总的来说就是这样:
Multi-head Self-attention
直译过来就是“多头”
为什么引入“多头”机制?
-
单一的 attention 只能关注一种类型的关联(比如“语义相似性”)。
-
不同的注意力头(head)可以学习不同类型的关系,比如语法关系、实体依存等。
-
多头机制允许模型从多个子空间中并行抽取信息,增强表示能力。
也就是通过不同的q负责不同种类的相关性
注意qi1不用乘ki2或者kj2,也不用管vi2/vj2,对于qi2同理
再把bi1,2拼起来
位置编码Positional Encoding
为什么需要 Positional Encoding?
我们处理的是序列数据(如自然语言),位置信息是不可缺的。比如在语义理解中,“他吃了饭”和“饭吃了他”完全不同,因此模型必须知道词语的顺序。
具体来说就是为每个位置设定一个vector,ei加到ai上即可
Attention is All You Need中
其他
老师还提到了自注意力机制在声音识别、图像识别中的应用以及和CNN、RNN的区别,这里就不展开说。简单来说CNN 可以看作是一种简化版的 Self-attention,随着训练资料的增多Self-attention的效果会更好。
RNN和Self-attention区别在于Self-attention考虑了整个输入,RNN只考虑上一个hidden的输出,没法平行化