Teansformer 模型的作用
基于 seq-to-seq 架构的transformer 模型可以完成 NLP领域研究的典型任务,如 机器翻译,文本生成等。 同时由可以构建预训练语言模型,用于不同任务的迁移学习。transformer的经典模型如下图所示:
seq-to-seq架构
一段语音讯息 ——> Speech Recognition ——> 识别的语言文本
一段语言文本 ——> Machine Translation ——> 翻译的另一种语言文本
一段语音讯息 ——> Speech Translation ——> 翻译的另一种语言文字
seq2seq 可运用到不同类型的语言处理中,如训练一个对话机器,训练一个分析摘要重点的机器,或是训练一个判断一句话是正面或者反面的机器。虽然范围很广,但在处理不同问题时找到最合适的模型进行解决将大大提高效率。
http://speech.ee.nut.edu.tw/~hylee/dlhlp/2020-spring.html 提供了对于不同类型处理方向使用不同的模型的方法。
seq2seq 的流程:
input sequence ——> encoder ——> decoder ——> output sequence
transformer 原理:
encoder 架构:
工作:向其输入一些向量后输出另外一些向量,这是用于许多模型。但 transformer 的 encoder 有其独特的结构,一个encoder 中有许多block 层,一个block 又分为几个小层,最终得到下一个 block 的输入。
positional encoding 在 self- attention 基础上加入位置信息,Multi- Head attention 就是 self attention 的 block ,即Multi- Head self attention;add & norm 就是 下文提到的 residual attention + layer normalization;再进入 fulling connected 进行 feed forward,并进行add &norm。BERT 网络也使用的是这种网络。
positional encoding
Multi-Head Attention 就是self-attention block;Add&Norm 就是Residual + Layer normalization
BERT模型就是参照的 Transformer 的 encoder 来设计的
encoder 原理
一个 block 的具体工作方式:
输入一排向量输出一排向量。一个block 并非一个layer ,一个block 包含多个layer
流程:输入一排向量进入block ,首先进入 self- attention 来考虑整个sequence 的信息,输出另一排向量,接着进入full connection 层,最后输出下一个block 输入的向量。
事实上,经典的 transformer 中的一个 block 的计算方式更加复杂。
解释一下:首先输入一排向量进入block ,在block 中首先进入 ,由self- attention 对整个一排向量进行分析,得到对应一个向量的输出;再通过 residual attention 将原向量和所得向量相加;得到的新向量再进入 layer Normalization 进行归一化 ;最终得到的向量还要进入 full connection 进行全连接;与前面操作类似,得到的向量经过 residual attention 、layer normalization等最后得到最终该block 的输出。
Self-attention
解决的问题:对于大部分model 来说输入是一个 vector,
vector ———> Model ———> scalar or Class
那么如果输入是一排向量、且这一排向量中向量数量是变化的情况。
vector set ———> Model ———> scalars or Classs
输入是什么?
输入的sequence,长度是变化的:
场景一文字处理:
如何将一个sequence 分解成多个词汇向量?可用 One-hot Encoding,或者word embedding
word embedding:
Postionwise FFN
还有一段语音,一个图
输出是什么?
1、输入的每个向量都输出一个label eg:POS tagging
2、输入的一个sequence 仅输出一个label eg:Sentiment analysis
3、机器自己决定输出多少label eg:transformer 、seq2seq
对于第一种sequence labeling情况:
我们大可以将每个vector 都输入fully- connected 中得到对应的label,但此时会出现一个问题:比如 l saw a saw 中,两个saw 在进入 FC中后得到一样的结果。
可以考虑对于一个 FC 给它一个window 让其参考sequence的上下文,但又会出现另一个问题:如果一个label 需要考虑 整个 sequence?
此时self- attention 用于解决这个问题
Residual attentiont
Layer normalization
Decoder 架构
两类: Autoregressive 和 Non-autoregressive
Autoregressive Decoder
上图为decoder的架构
我们将中间的 Mulit-Head Attention 和 Add & Norm 盖住,其结构就和encoder相同了
Masked Self-attention
与Self-attention 的区别是:Self-attention 在输出每个对应的向量时,首先考虑了所有的输入向量,而Masked Self-attention 在输出对应向量时只能考虑其对应输入向量及之前的向量,无法考虑全部。
原因是:decoder在吃入由encoder产生的输出时,是一个一个吃入,不同于encoder的输入是同时全体的。原理如下图示:
当decoder输出“习”这个单词后,我们应该继续将“习”作为decoder的输入,而输出则是一个名为 “END” 的符号的概率最大,那么就输出 END,结束。
Non-autoregressive(NAT)Decoder
与Autoregressive 最大的区别是, NATdecoder 是同时一个步骤产生结果,不像 Autoregressive Decoder 是一个向量一个向量的产生。其 END 可能在产生的向量中间,那么END 后面的向量就丢弃。
NAT Decoder 是一个大坑,它的变现不如 AT D 好。
Decoder
这里多出来的部分是encoder 和 decoder 连接的桥梁,叫做 Cross-attention
其中的两个输入来自encoder 的输出向量的两个分量: k、v
k 为该向量的键,键是用于计算注意力权重的一部分。它起到了对序列中每个位置的编码和索引作用。注意力机制利用键来衡量当前位置的注意力应该如何分配给其他位置。在Encoder中,k是通过对Encoder的输出向量进行线性变换(通常是通过矩阵乘法)得到的。
v 为该向量键对应的信息,它提供了用于生成最终输出的上下文相关特征。在注意力机制中,根据注意力权重对值进行加权平均,以获得与当前位置最相关的上下文信息。在Encoder中,v也是通过对Encoder的输出向量进行线性变换得到的。