之前的回归和影像分类都是有着简单的假设,且输入是一个向量。如果输入是一排向量且长度可能会改变,应该怎么处理?
首先引入一个概念:独热编码(One-Hot Encoding)是一种将分类变量转换为二进制向量的编码方法。其核心思想是将每个分类变量用一个独特的二进制向量来表示,其中只有一个位置为1,其余位置为0。这样可以使分类变量在机器学习算法中更易于处理。
文字处理,就是输入一串多个词编码的向量。声音讯号、图(Graph)也都是一堆向量。
Sequence Labeling任务
该类任务output与input的数量相同,一个简单的思路是使用全连接层依次处理,但这对于句子理解等任务是不适用的,比如“I saw a saw(锯子)”,模型无法区别不同词性,所以需要考虑上下文信息。
自注意的代表作是Google的论文“attention is all you need”。self-attention就是变形金刚的火种源。
如下图所示,每个b都考虑了整个input的sequence才输出得到的。那么是怎么考虑的呢?
以a1为例,首先是找到Sequence中的其余元素与之的相关联程度α,它的计算方法有很多,常用的方法有Dot-product。接下来就要根据α的值大学区抽取Sequence的重要信息。
依次进行计算关联性。将α计算attention score,其计算是使用dot-product结果。谁的α越大,谁的k越大,说明对应的v就会对结果有更大的影响。
根据以上思路,使用矩阵的方式表示运算:
其中,只有、和是需要从训练数据中学习的。
Multi-head Self-attention(多头注意力机制)
为什么要引入多头的概念?因为向量之间可能有多种相关性,一个head难以理解。下面以两个head为例,对多头注意力机制进行演示。
在分别得到和之后,拼接起来乘上一个W,送往下一层。
但到目前为止,该方法还缺少一个位置信息,比如语义理解中,词序没有被考虑。所以又引入了一个Positional Encoding的方法,对每个位置设定一个专属的位置向量,具体的编码方式是多种多样的。
Self-attention在图像中的应用
上图可以看做5×10个长度为3的向量,这样就可以应用自注意力机制。卷积的感受野是认为设定的(马看见什么,是run决定的!)。但self-attention不同的地方在于,图片中哪个像素与中心像素有关,是网络学出来的。这里宏毅老师推荐一篇文章“On the Relationship between Self-Attention and Convolutional Layers”。Self-attention是更有弹性的CNN,在训练资料多的时候可能表现较好。
RNN(Recurrent Neural Network,循环神经网络),是一种用于处理序列数据的人工神经网络。与传统的前馈神经网络(如全连接网络和卷积神经网络)不同,RNN具有循环的结构,能够保留序列数据的上下文信息。这使得RNN特别适合处理时间序列数据或序列数据,如文本、语音、视频等。下图对比了RNN和Self-Attention的机制,RNN是没有办法平行处理所有的数据。如果想深入了解两者的关联,可以读一篇文章“Transformers are RNNs”。
Self-Attention在Graph上的应用
图包含Node信息和Edge信息,之前讲到了Self-Attention会自动学出向量之间的关联性,现在可以只考虑邻接节点的相关性。
文章“Long Range Arena: A Benchmark for EfficientTransformers”介绍了Self-Attention的多种变形。其最大的缺点是参数多,计算代价很高。如何设计又快又好的Self-Attention,是值得考虑的问题。