Bert由来之--word2vec和transformer

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架构

例如:机器翻译
Bert由来之--word2vec和transformer_第1张图片

  • encoder的具体长相

Bert由来之--word2vec和transformer_第2张图片
self-attention得到特征向量Z,即下图中的Attention在这里插入图片描述
而Feed Forward阶段,是两层全连接,第一层的激活函数是ReLU,第二层的激活函数是在这里插入图片描述

  • decoder的长相
    Bert由来之--word2vec和transformer_第3张图片
    可以看出,decoder和encoder不同的是attention是两个了,
    解释说:
    attention1)是当前翻译的和已经翻译的关系,就是y_t和y_t-1的关系
    attention2)是当前翻译的和句子的语义向量的关系

  • 层与层之间的关系
    Bert由来之--word2vec和transformer_第4张图片

  • 详细介绍self-attention
    Bert由来之--word2vec和transformer_第5张图片

上面的图,矩阵中间的q1,q2,k1,k2,v1,v2是结果,
例如X1 * W^Q = q1
X(特征向量)* W(Q,K,V)得到X的三个向量q,k(有多个),v(有多个)
q和不同的k相乘,得到关于每个keys的一个值
然后将这些值softmax,得到比重
乘以v得到最终单词向量。

  • 图示说明

Bert由来之--word2vec和transformer_第6张图片
还有这张图
Bert由来之--word2vec和transformer_第7张图片
Bert由来之--word2vec和transformer_第8张图片
Q矩阵每一行是一个单词的表示,Q的每一行去和K矩阵相乘,得到该单词在该
key的值。

  • 额外厉害的地方,使用类似resnet的short-cut结构,就是把原来的结果直接加上去
    Bert由来之--word2vec和transformer_第9张图片

  • Multi-Head Attention
    指的是在self-attention的阶段中,W,Q,K矩阵是有多个(8个),生成一个矩阵的8个表达,然后给横着连接起来,那么一个词就是很长的一个向量,然后使用全连接矩阵给由缩短向量的长度。
    Bert由来之--word2vec和transformer_第10张图片

  • decoder阶段,(某博客这样写的),Q是上一个decoder的输出,而K和V是来自encoder。Q应该是矩阵(大写)。

  • 位置编码

因为transformer中每个单词没什么区别,都是矩阵,向量,不存在位置、时序关系,为了加入时序关系,给每个单词赋予位置权重。我们可以看到,位置encoding加上初始encoding得到最终的单词的向量。
Bert由来之--word2vec和transformer_第11张图片
在这里插入图片描述
在这里插入图片描述
“根据公式
sin(\alpha+\beta) = sin \alpha cos \beta + cos \alpha sin\beta 以及
cos(\alpha + \beta) = cos \alpha cos \beta - sin \alpha sin\beta ,这表明位置 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使用双向的,具体怎么回事呢?

你可能感兴趣的:(Bert由来之--word2vec和transformer)