word2vec -> Transformer -> ELMo -> Bert
word2vec是训练词向量。有skim-gram和CBOW两种形式。
重点:训练样本是一个句子的中心词和周围的词拼接成。
例如skim-gram例如 I love apple very much。以apple 为中心词,窗口大小是2,则可以凑出样本:【apple,love】【apple,I】【apple,very】【apple,much】。样本的前一个input,后一个是output,训练一个词的v_c和U(词向量和outputvector)
CBOW是反过来的,通过周围的词来预测中心词。
Transformer是全部注意力,舍去CNN和RNN架构
例如:机器翻译
- encoder的具体长相
self-attention得到特征向量Z,即下图中的Attention
而Feed Forward阶段,是两层全连接,第一层的激活函数是ReLU,第二层的激活函数是
-
decoder的长相
可以看出,decoder和encoder不同的是attention是两个了,
解释说:
attention1)是当前翻译的和已经翻译的关系,就是y_t和y_t-1的关系
attention2)是当前翻译的和句子的语义向量的关系 -
层与层之间的关系
-
详细介绍self-attention
上面的图,矩阵中间的q1,q2,k1,k2,v1,v2是结果,
例如X1 * W^Q = q1
X(特征向量)* W(Q,K,V)得到X的三个向量q,k(有多个),v(有多个)
q和不同的k相乘,得到关于每个keys的一个值
然后将这些值softmax,得到比重
乘以v得到最终单词向量。
- 图示说明
还有这张图
Q矩阵每一行是一个单词的表示,Q的每一行去和K矩阵相乘,得到该单词在该
key的值。
-
额外厉害的地方,使用类似resnet的short-cut结构,就是把原来的结果直接加上去
-
Multi-Head Attention
指的是在self-attention的阶段中,W,Q,K矩阵是有多个(8个),生成一个矩阵的8个表达,然后给横着连接起来,那么一个词就是很长的一个向量,然后使用全连接矩阵给由缩短向量的长度。 -
decoder阶段,(某博客这样写的),Q是上一个decoder的输出,而K和V是来自encoder。Q应该是矩阵(大写)。
-
位置编码
因为transformer中每个单词没什么区别,都是矩阵,向量,不存在位置、时序关系,为了加入时序关系,给每个单词赋予位置权重。我们可以看到,位置encoding加上初始encoding得到最终的单词的向量。
“根据公式 以及
,这表明位置 k+p 的位置向量可以表示为位置 k 的特征向量的线性变化,这为模型捕捉单词之间的相对位置关系提供了非常大的便利。”
深入理解
-
encoder中的self-attention是指,有别于传统的attention(decoder当前状态和encoder状态运算),这里是自己和自己运算。
-
Q在encoder中是问题,在decoder中是答案,而K和V都是想要输出的东西,K=V,K和Q去做相似度判断,然后乘V,得到attention。
-
关于Q,K,V的计算,只是attention的一种实现方式。
-
输入的时候应该是多个单词一起输入,经过多轮的encoder提取词之间的关系。而输出的时候,一个decoder输出一个词。
-
关于mask是个很重要的概念,mask在众多博客中说的是decoder阶段,这一时刻的输出不应该看到未来的信息,或者说一个句子想要完形填空就不能看到要预测的单词(根据任务的不用,应该由很大区别)
- 在训练阶段, mask,decoder的每一个时刻的输入,Q都是一个完整句子(翻译结果)的掩盖之后词的结果(他应该每一步骤对于答案都是要经过新的处理)。而K和V就是来自上一层了。
- 而在test阶段,初始值应该是类似于传统的encoder-decoder模型,一个句子的起始符之类的。
- 有位朋友提出,这里也是单向的,后来的Bert使用双向的,具体怎么回事呢?
来源:CSDN
作者:zixufang
链接:https://blog.csdn.net/yagreenhand/article/details/86064388