在此特别感谢李宏毅老师的课程,真的是醍醐灌顶。
论文地址:
引入:
self-attention是一种新的注意力机制,transformer在NLP(自然语言处理)上应用的很广。
假设有这么一项任务,给定一个英文句子,能够得出句子中每个单词的词性:
考虑一句话:I saw a saw(我看见了一个锯子)
对应词性为:名词 动词 量词 名词
那么问题来了,这个句子如何放进模型进行训练呢?如何区别两个saw呢?
如果交给机器去学习,只考虑单个单词的话,很明显,学习出来的saw要不为名词、要不为动词,不可能同时都是。
input:之前的input为一个向量,通过一个模型,得到一个数值或者一个类别;假如inputs为一组向量并且每个向量的长度不一样时怎样通过模型得到一组输出的数值或者类别呢?例如I saw a saw每个单词都作为一个输入向量:
input编码方式(以一句话为例):one_hot编码 word embedding等
output:假设输出方式为每一个输入向量都有一个输出
如何区别两个saw呢?考虑句子中每个单词与它临近的单词之间的关系
self attention(自注意力机制)
每个输入得到一个输出,考虑其它输入的影响。
考虑句子中每个单词与它临近的单词之间的关系,即某个输入与其他输入之间的关系用相关性relevant衡量:
两个输入之间关系的衡量方法:self attention使用第一种方法
原理介绍:
以a1为例进行介绍:首先利用矩阵点乘得到(query,查询),再通过矩阵计算得到、、(key,键值),这些键值与的查询矩阵计算得到的attention score(注意力得分)。其他输入同理计算之后得到该输入与其他输入之间的相关性。
同时也要计算自己的attention score,经过softmax得到得分矩阵,如下图所示。
softmax也可以换成其他变换函数,如ReLU等。
利用矩阵点乘得到,其他输入同理,得到的v值与上步得出的结果进行计算得到。
同理:
由此得到所有输出:并且由于内部为矩阵乘法,可以并行计算,加快训练速度。
再从矩阵角度理解:
Q、K、V的计算:
attention score(注意力得分)计算:
attention score矩阵A与经过softmax处理的:
计算b,得到矩阵O:
完整过程:矩阵、、是可以被学习的参数矩阵
Multi-Headed Attention
以两头为例(可以理解为两类任务),将q矩阵分为两个q矩阵,每个矩阵单独进行计算。
最后的结果通过矩阵得到:
Positional Encoding(位置编码)
每个输入位置不定,加上一个向量作为输入对位置的考虑:
图像也能作为输入,从而将transformer应用到图像领域。
与CNN的关系:自注意力机制考虑整幅图像中像素之间的相关性,而CNN只考虑感受野内的像素特征,CNN是简化版的self-attention,CNN只考虑感受野内的,依赖人工划定的感受野;self-attention注考虑整张图,找出相关的像素,自动学出感受野的形状和大小。
与RNN的关系:自注意力机制为并行计算得到结果。
参考:
仅为学习记录,侵删!