type
status
date
slug
summary
tags
category
icon
password
Slef-Attention
Input
Self-Attention是深度学习模型中的一种关键组件。但以往架构的输入都是单个向量,如果遇到了多个数量不定的向量作为一组输入的时候呢?
- 什么输入会是长度不一的向量组呢?
- 自然语言的句子
- 如何把一个单词变成一个向量呢?
- 世界上每一个单词对应一个向量,可是这样做无法体现出词汇之间的关系
- Word Embedding 有关系的词汇会聚集在一起
- 一段声音信号
- 一个Graph(把每一个节点看作是一个向量,输入一幅图就是输入一堆节点、一堆向量)
- 社交关系图、分子结构图
https://youtu.be/X7PH3NuYWOQ
- Self-Attention for image
- 每一个像素点就是一个三维向量(R,G,B)
- CNN:self-attention that can only attend in a receptive field
- CNN is simplified self-attention
扩展论文:ON THE RELATIONSHIP BETWEEN SELF-ATTENTION AND CONVOLUTIONAL LAYERS
Output
What is the output?
- Each input vector has an output label (also called Sequence Labeling)
- 单词词性标注
- 识别语音
- 图中节点的特性
输入与输出数量一致
- The whole sequence has a label
- 句子情感判断
- 识别语言是谁讲的
- 预测分子是否有毒性
- Model decides the number of labels itself (also called seq2seq)
- Translation(HW5)
作用
假如我们现在有一个标注词性的任务:I saw a saw (我看见了一把锯子)
很显然,这里两个saw的词性并不相同。这四个单词对应的四个向量如果分别被丢进Fully Connected中,两个saw的输出肯定相同,因为这样处理并没有考虑到上下文。而你简单的创建一个window,将一个window中的上下文一起丢给FC的话,有面临着一个问题:在输入的向量数不定的情况下,Window的大小如何确定?
- Is it possible to consider the text?
- FC can consider the neighbor through window
- How to consider the whole sequence?
- A window covers the whole sequence?
- How to ensure the size of the window?
- self-attention是transformer的一个重要module
Solution: Self-Attention
- 类似于“预处理”,将输入的四个向量预处理为四个带黑框的向量
- 经过Self-Attention处理后的向量,是考虑了一整个Sequence后的到了,具有 with context 的特性。
- 处理后再把向量丢给FC
- 这样的处理还可以叠加很多次
运作机理
- 计算输入向量组之间的关联度 Alpha
- “consider the whole sequence” 的具体体现
- 两种计算方法
- Dot-Product——将输入的向量分别乘以两个矩阵Wq和Wk后,再做点乘
- Additive——同样是是乘上两个矩阵,之后相加,再过addive函数,加上参数矩阵W即可
- 将Alpha过一遍Normalization
- 这里的各种W都是需要在深度学习时训练的参数
- 还要计算自己和自己的关联度!
- 其实这里也可以过ReLU之类的函数,可以自己多试试
- 计算输出向量
- 每个输入向量乘上另一个矩阵W后,与Alpha`相乘后相加得到结果
- b1、b2、b3...是可以并行计算的
完整图示
- 每一个输入向量都乘矩阵Wq、Wk、Wv
Wq、Wk、Wv是训练中learn出来的参数
- 我们将系列向量综合为一个矩阵,可以大大提升机器运算速度。
Muti-Head Self-Attention
进阶版的Self-Attention——Different types if relevance,由不同的q来负责不同的方面、角度上的相似度
横看成岭侧成峰
Positional Encoding
其实输入的Sequence中向量的位置是未知的。上面的1、2等编号只是为了便于理解,本质上,上面的方法中向量之间的顺序对于计算出的output没有任何影响,但在很多情况下,输入的Sequence的内部顺序是一种很重要的信息。
- NO position information in self-attention
- Each position has a unique positional vector ei
- Hand-crafted 由人设定
- 可以sin&cos来产生
- 其实也可以让机器自己学出来
simply add ei to ai
- 依旧是一个正在研究的问题
- Widely used in NLP!
Self-Attention for Graph
- 图中每一个节点即是一个向量,输入一幅图就相当于输入了一个Sequence。但是对于Self-Attention,图数据结构具有一个天然优势:图中节点之间的边就是天然的向量关系!
- 我们可以结合邻接矩阵,得到向量之间的初步关系
- Self-Attention时,就不用计算领结矩阵中为0的位置(两节点没有边,这两个向量之间任何联系,自然不用计算)
- 把Self-Attention用于图中,就是图神经网路Graph Neural Network,GNN的一个变种。
To learn More
- Self-Attention最大的问题就是运算量太大,如何减少运算量就是未来的研究重点
- 于是Self-Attention有了很多变种。最开始Self- Attention是用在Transformer里的,有时候广义的Transformer指的就是Self-Attention;所以后来Self-Attention的各种变形都取名叫 **former
Transformer
是一个Sequence-to-Sequence model, input a sequence, out put a sequence. The output length is determined by model.
- 他能做什么?
- 各种各样NLP的问题都可以看作是QA的问题,而QA问题都可以使用Seq2Seq来解决。如果根据具体任务,定制化S2S模型,能获得很不错的效果
- Seq2Seq For Syntactic Parsing 语法分析
- Seq2Seq For Multi-label Classification (区别于Mutil-class Classification) 甚至可以硬解
- Seq2Seq For Object Detection
Seq2Seq
- 将输入丢给Encoder做一些预处理
- 处理好后丢给Decoder决定要输出些什么
- 上面的Seq2Seq是在14年9月份提出的。经过数年发展,提出如今著名的Transformer
Encoder
这一部分要做的事就是:给一排向量,输出一排向量。这样的工作很多模型都能做到:不仅仅是上面学过的Self- Attention,CNN、RNN等都完成工作

Decoder
Decoder有两种:AT and NAT
Auto-Regressive (AT)
- 输入输出是什么?
- 将Decoder自己当前的输出与Encoder的输出一起作为Decoder的输入,产生下一个输出;又将这一个输出加到Decoder的输入,产生新的输出。
- 怎么把自己的输出加到输入里去?
- Decoder的输出加入到输入后,需要过一遍Masked Self-Attention,这里的Mask是:
- 第n个向量在过Self-Attention时只能考虑到第一个到第n个向量,不能考虑到第n+1及其之后的向量
- 为什么?
- Decoder是串行输出的,第n个向量用作输入时,第n+1个向量还不存在呢,所以自然考虑不到它后面的向量了。为了与一般的Self- Attention做出区分,这里特别取名为Masked Self-Attention
- 是怎么输出的?
- 经过一系列运算后,会过一个Liner层和SoftMAX层,把输入的向量化作为一个概率分布表Distribution,输出概率最大的字符/word token。
- 两个特殊的向量
- BOC(Begin of Content)
- 作为Decoder的第一个默认输入,代表句子的起始
- END
- 是Decoder的一个输出,若通过计算输出了END,那么整个工作流程就此终止
Not Auto-Regressive (NAT)
如果说AT是“串行”生成一个一个字,那NAT就是“并行”同时生成一排字。
NAT的输入是Encoder的输出以及一系列BOC。有多少个BOC,Decoder就会输出多少个向量。因此,NAT的输出长度可以认为限定。
NAT常常用于音频处理/生成方面。
相较于AT,NAT在生成速度上有优势,但是准确度较低。因此也是目前的一大研究热门问题。
Encoder与Decoder的桥梁——Cross Attention
- 何谓Cross?
- 之前我们计算向量之间的关联度alpha,使用了到了个输入向量的q和k。在这里,我们在计算A1的alpha时,不使用A1自己的q1与各个key相乘,而是使用Masked-Self-Attention输出的向量的q来,交换了其中的q,这就是所谓的“Cross”
Train Transformer
- 计算输出的概率分布表与真实值的Cross Entropy, 使其越小越好
- Teacher Forcing 技术
- AT模式下,Decoder的输入中“将自己输出喂给自己输入”的部分,直接替换为正确的真实值来测试输出
Tips
- Copy Mechanism
在一些情况下,我们只需要复制输入的一部分词语道输出即可,例如一个人的姓名。我们并不需要让模型反复创造这个人的名字,我们只需要复制他的名字到输出即可
- 作者:CrystalPuNK
- 链接:https://crystalpunk.top/article/1905d734-b731-80cd-bb2e-f8eb5e9dc9db
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
【nature】Accurate predictions on small data with a tabular foundation model

【ICLR 2024】A Flexible Generative Model for Heterogeneous Tabular EHR with Missing Modality
【ML】队列数据 Cohort Data

【ML】扩散薛定谔桥&扩散模型

Cross Domain Skeleton-based Action Recognition by Using Parameter-free Similarity Matching
机器学习·李宏毅 2024版