d2ee50a8934ac2b4645933926fc34644.gif

向AI转型的程序员都关注了这个号👇👇👇

一、注意力机制和自注意力机制的区别

Attention机制与Self-Attention机制的区别

传统的Attention机制发生在Target的元素和Source中的所有元素之间。

简单讲就是说Attention机制中的权重的计算需要Target来参与。即在Encoder-Decoder 模型中,Attention权值的计算不仅需要Encoder中的隐状态而且还需要Decoder中的隐状态。

Self-Attention:

不是输入语句和输出语句之间的Attention机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的Attention机制。

例如在Transformer中在计算权重参数时,将文字向量转成对应的KQV,只需要在Source处进行对应的矩阵操作,用不到Target中的信息。

二、引入自注意力机制的目的

神经网络接收的输入是很多大小不一的向量,并且不同向量向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。比如机器翻译问题(序列到序列的问题,机器自己决定多少个标签),词性标注问题(一个向量对应一个标签),语义分析问题(多个向量对应一个标签)等文字处理问题。

针对全连接神经网络对于多个相关的输入无法建立起相关性的这个问题,通过自注意力机制来解决,自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性。

三、Self-Attention详解

针对输入是一组向量,输出也是一组向量,输入长度为N(N可变化)的向量,输出同样为长度为N 的向量。


3.1 单个输出

bebb705f91b28eed51f2a207731f3269.png

对于每一个输入向量a,经过蓝色部分self-attention之后都输出一个向量b,这个向量b是考虑了所有的输入向量对a1产生的影响才得到的,这里有四个词向量a对应就会输出四个向量b。

下面以b1的输出为例

首先,如何计算sequence中各向量与a1的关联程度,有下面两种方法

3eec8fecd2a38f4f985e9560a3cdd3a4.png

Dot-product方法是将两个向量乘上不同的矩阵w,得到q和k,做点积得到α,transformer中就用到了Dot-product。

        上图中绿色的部分就是输入向量a1和a2,灰色的Wq和Wk为权重矩阵,需要学习来更新,用a1去和Wq相乘,得到一个向量q,然后使用a2和Wk相乘,得到一个数值k。最后使用q和k做点积,得到α。α也就是表示两个向量之间的相关联程度。

        上图右边加性模型这种机制也是输入向量与权重矩阵相乘,后相加,然后使用tanh投射到一个新的函数空间内,再与权重矩阵相乘,得到最后的结果。

        可以计算每一个α(又称为attention score),q称为query,k称为key

ce02db51dfdbf16fe8462c21961691ed.png

另外,也可以计算a1和自己的关联性,再得到各向量与a1的相关程度之后,用softmax计算出一个attention distribution,这样就把相关程度归一化,通过数值就可以看出哪些向量是和a1最有关系。

8d054962fdb59ca4b1690e04995bcae1.png

下面需要根据 α′ 抽取sequence里重要的资讯:

8f8f1f5efb8bb9e38d2ad6d0328fb706.png

先求v,v就是键值value,v和q、k计算方式相同,也是用输入a乘以权重矩阵W,得到v后,与对应的α′ 相乘,每一个v乘与α'后求和,得到输出b1。

如果 a1 和 a2 关联性比较高, α1,2′ 就比较大,那么,得到的输出 b1 就可能比较接近 v2 ,即attention score决定了该vector在结果中占的分量;

3.2 矩阵形式

用矩阵运算表示b1的生成:

Step 1:q、k、v的矩阵形式生成

d46c5c62e11131f0df3a6130feaa6304.png

写成矩阵形式:

146f7d5d55123ddf69651e62309c0dff.png

把4个输入a拼成一个矩阵a2b8b9171ce4f726de166ae4b7dee32e.png,这个矩阵有4个column,也就是a1到a4,ebef557123a0a546c65e6392734870ae.png乘上相应的权重矩阵W,得到相应的矩阵Q、K、V,分别表示query,key和value。

d437f6ea79a4f674bcf43e4c7aa5252e.png

三个W是我们需要学习的参数

Step 2:利用得到的Q和K计算每两个输入向量之间的相关性,也就是计算attention的值α, α的计算方法有多种,通常采用点乘的方式。

先针对q1,通过与k1到k4拼接成的矩阵K相乘,得到9102a9955bcf9f781ce185187c14729e.png拼接成的矩阵。

3e8010cd306e469f36033d253732cc2f.png

同样,q1到q4也可以拼接成矩阵Q直接与矩阵K相乘:

99af71a27734e8063173960ca2ebb829.png

公式为:

1074f77febc26cdc271a652f42888ffa.png

矩阵形式:

eebc6eac16978ffa20ead19ff3db4b5f.png

矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小α,A'是经过softmax归一化后的矩阵。

Step 3:利用得到的A'和V,计算每个输入向量a对应的self-attention层的输出向量b:

aeb692bd5348f75e353f22db802cb77e.png

bec70ed1c3615471c1aabf3510d973c6.png

写成矩阵形式:

523189c9527f191459bef42305ebf85c.png

 对self-attention操作过程做个总结,输入是I,输出是O:

e2410d88c40e9c8ea9ee9cb865726cc1.png

矩阵Wq、 Wk 、Wv是需要学习的参数。

四、Multi-head Self-attention

self-attention的进阶版本Multi-head Self-attention,多头自注意力机制

因为相关性有很多种不同的形式,有很多种不同的定义,所以有时不能只有一个q,要有多个q,不同的q负责不同种类的相关性。

对于1个输入a

481561804143c941d998f97842a45277.png

 首先,和上面一样,用a乘权重矩阵W得到,然后再用乘两个不同的W,得到两个不同的,i代表的是位置,1和2代表的是这个位置的第几个q。

fd342c8104137c1e71fef687efe4d928.png

这上面这个图中,有两个head,代表这个问题有两种不同的相关性。

同样,k和v也需要有多个,两个k、v的计算方式和q相同,都是先算出来ki和vi,然后再乘两个不同的权重矩阵。

e2f67b622f91cfa78cbaf63e073e4128.png

对于多个输入向量也一样,每个向量都有多个head:

84a83311ba607fbeb7894ba72f516f5c.png

算出来q、k、v之后怎么做self-attention呢?

和上面讲的过程一样,只不过是1那类的一起做,2那类的一起做,两个独立的过程,算出来两个b。

对于1:

be3abcc2166f996621970669218fb89a.png

 对于2:

8692b18e2def07a45dd70aaf8185f9cb.png

这只是两个head的例子,有多个head过程也一样,都是分开算b。

1dd2e5b35a029f99c0e827f9e61a22ba.png

五、Positional Encoding

在训练self attention的时候,实际上对于位置的信息是缺失的,没有前后的区别,上面讲的a1,a2,a3不代表输入的顺序,只是指输入的向量数量,不像rnn,对于输入有明显的前后顺序,比如在翻译任务里面,对于“机器学习”,机器学习依次输入。而self-attention的输入是同时输入,输出也是同时产生然后输出的。

如何在Self-Attention里面体现位置信息呢?就是使用Positional Encoding

283b8ad418b15c26afe62804ea5d7958.png

如果ai加上了ei,就会体现出位置的信息,i是多少,位置就是多少。

vector长度是人为设定的,也可以从数据中训练出来。

六、Self-Attention和RNN的区别

Self-attention和RNN的主要区别在于:

1.Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。

2.Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

3.Self-attention可以并行计算,而RNN不同层之间具有先后顺序。

1.Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。

7f0ec2368eed7f73b48171f2ea9d5302.png

比如,对于第一个RNN,只考虑了深蓝色的输入,绿色及绿色后面的输入不会考虑,而Self-Attention对于4个输入全部考虑

 2.Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

1e72935e69c5dc6e56a00e1a81206dfc.png

比如对于最后一个RNN的黄色输出,想要包含最开始的蓝色输入,必须保证蓝色输入在经过每层时信息都不丢失,但如果一个sequence很长,就很难保证。而Self-attention每个输出都和所有输入直接有关。

3.Self-attention可以并行计算,而RNN不同层之间具有先后顺序。

Self-attention的输入是同时输入,输出也是同时输出。

机器学习算法AI大数据技术

 搜索公众号添加: datanlp

bf4ff443105fbe25cdb034390e5360d7.jpeg

长按图片,识别二维码


阅读过本文的人还看了以下文章:

TensorFlow 2.0深度学习案例实战

基于40万表格数据集TableBank,用MaskRCNN做表格检测

《基于深度学习的自然语言处理》中/英PDF

Deep Learning 中文版初版-周志华团队

【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

《美团机器学习实践》_美团算法团队.pdf

《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

《深度学习:基于Keras的Python实践》PDF和代码

特征提取与图像处理(第二版).pdf

python就业班学习视频,从入门到实战项目

2019最新《PyTorch自然语言处理》英、中文版PDF+源码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

PyTorch深度学习快速实战入门《pytorch-handbook》

【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

《Python数据分析与挖掘实战》PDF+完整源码

汽车行业完整知识图谱项目实战视频(全23课)

李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

《神经网络与深度学习》最新2018版中英PDF+源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  

7374fe40539cc396784ce1b17d59508f.jpeg

3819533c24627f401074c1d761f9d499.jpeg

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐