type
status
date
slug
summary
tags
category
icon
password
LSTMSeq2SeqAttentionTransfomerEncoderWord EmbeddingPositional Encoding Self-attentionResidual ConnectionsDecoder获取Decoder值 获取Encoder-Decoder值Transformer(矩阵理解)EncoderWord EmbeddingPositional EncodingSelf-AttentionResidual ConnectionDecoderSelf-AttentionEncoder-and-Decoder Attention
参考:
LSTM
Seq2Seq
Attention
Transfomer
transformer是对Attention的进一步利用,也是在NLP中获得巨大影响力的一个结构模块
Encoder
Word Embedding
首先学习embbeding,词嵌入,它将一个单词转化为一个向量形式
- 中间通过的神经网络用激活函数进行代替
Positional Encoding
需要进行单词之间的单词顺序的输入,这里的位置输入向量是复数个不同 的sin或者是cos函数在相同地方的值
- sin和cos函数的宽度是越来越宽的
然后将两个向量进行相加,获得了存在位置关系的向量值
Self-attention
self-attention表示的是关于同一个输入中,相互之间的关系(或者说是权重)
- 比如:对于以一个句子作为输入的情况,单词与单词之间的关系就是self-attention所关注的
- 计算自身单词和其他所有单词(包括自身)的相关性
计算self-attention,涉及到三个指标
Query
Key
Value
每次计算score:
- 自身的
Query
和要比较的向量的key
进行计算,获得的结果进行SoftMax,获得权重
- 计算自身
Value
与比较向量的Value
,与权重分别向乘获得最终score
注意:
- 计算
Query
、Key
、Value
的时候,权重 参数是共用的
- 可以使用复数的self-attention模块,来获取复数attention值,这个流程叫做Multi-Head Attention
Residual Connections
和其他网络中的残差理论一样,这里需要添加残差,添加的是我们的位置embedding
Decoder
获取Decoder值
对Decoder来说,结构上和encoder几乎一样,之所以说是几乎,是因为还是存在一点区别:
- Key、Value、Query三个权重矩阵的值和encoder是不一样的
获取Encoder-Decoder值
由于对于Decoder来说,不止需要自身自身参数计算attention值,还要与encoder中的参数做attention
然后我们将这个attention value经过一个全连接层,就能得到最后的结果
Transformer(矩阵理解)
开始理解在矩阵方面的transformer步骤,便于理解transformer代码
Encoder
Word Embedding
可以从下图看出对于一个token转为二维向量的情况下,从矩阵方面是这么实现的
- 目的是一个二维embedding的时候,我们的词向量是一个one-hot编码的列向量
- 向量表示都是列向量表示
- 右乘一个权重矩阵
- 这个权重矩阵中每一行表示相同的词向量的权重(相同颜色表示)
Positional Encoding
这一步就是添加位置参数,相同行代表同样的位置
- 相同行的值代表从不同sin、cos函数中相同x值提取的y值,详细看前文
Self-Attention
在计算self-attention时,也是进行右乘矩阵,对于Key、Query、Value的计算
- Key
- 注意结果矩阵,每一行是每一个token的相应值
- Value
- Query
然后是计算相似score,这个值是一个标量,但是用矩阵表示每一个标量结果的集合
- 注意是用和的右 ,是key矩阵的转置矩阵
- 结果矩阵需要进行一次缩放,缩放值d是每一个Token的维度
对Attention的公式来说,还需要进行SoftMax,之后再和
Value
矩阵进行相乘- SoftMax在这里是针对结果的每一行进行一次SoftMax
Residual Connection
添加残差
Decoder
对于Decoder来说,和encoder有一点不同的地方,在于Self-Attention中的公式
其他模块几乎相同,按揭不表
Self-Attention
看看这个公式,重点在于其在计算相似score的时候,使用了Mask
为什么要使用Mask?假设这只是一个普通的语言翻译NLP,在进行decoder的时候,input是以下token,由<SOS>开始,在<EOS>结束
所以重点:
- 对于第一个输入来说,<SOS>不需要知道后面的单词的相似score,这样更加不会被其他因素影响
- 所以将矩阵中,第一个<SOS>对应后面的相似分遮掩住,让他不被影响
Encoder-and-Decoder Attention
计算encoder和decoder之间的attention,同样是需要一组Key、Value、Query
- 重点:Query来自Decoder,Key和Value来自Encoder
- 都是self-Attention加上残差之后的结果
- 右乘的三个矩阵是单独为这个阶段初始化的矩阵,和Decoder和encoder阶段的矩阵不一样
Attention计算公式
后面就是添加残差和进行全连接层了