Transformer、BERT学习笔记

关于Transformer和BERT,网上已经有了很多的讲解。本博客是笔者阅读论文后,并参考了一些其他博主的思路,结合笔者本人的理解而写。文章的最后会列出一些参考博客(知乎),如有遗漏,烦请提醒。

Transformer

引言

Attention Is All You Need
文章链接
本文出自NIPS2017,一作是Ashish Vaswani,来自Google Brain。Transformer最开始是基于机器翻译任务提出的,打破了传统的RNN框架,完全依赖于注意力机制。能够很容易的并行训练,仅在8个P100上训练了12个小时,就实现了当时的新SOTA。

解析

整体结构

Transformer的结构如下图所示。还是机器翻译领域传统的Encoder-Decoder架构。

Encoder部分使用 N = 6 N=6 N=6个Layer组成,每个Layer又包含两个sub-layer,分别是:多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。每个sub-layer后面都添加了一个layer normalization层(出自文章),且使用了类似ResNet的跳跃连接。综上,对于输入为 x x x的sub-layer,它的输出是: LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x+\text{Sublayer}(x)) LayerNorm(x+Sublayer(x))

Decoder部分也是使用 N = 6 N=6 N=6个Layer组成,每个Layer包含三个sub-layer,分别是:带有掩码的多头注意力层(Masked Multi-Head Attention)、多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。


注意力机制

首先介绍基于点积的注意力(Scaled Dot-Product Attention),再引申出本文中用到的自注意力(Self Attention)和多头注意力(Multi-Head Attention)。

基于点积的注意力的网络结构如下图所示,具有三个输入: Q Q Q K K K V V V,分别代表 Q u e r y Query Query K e y Key Key V a l u e Value Value,这三个变量的含义下面会详细介绍。

下面,以机器翻译为例子,详细介绍注意力机制的计算过程。假设,此时模型的输入 I = " w o r d 1   w o r d 2   w o r d 3 " I="word_1 \space word_2 \space word_3" I="word1 word2 word3",使用 N N N表示单词个数,例子中 N = 3 N=3 N=3

  1. Embedding
    对输入的句子 I I I进行word embedding后,可以得到句子的特征 E E E,是一个 N × D i m E N \times Dim^E N×DimE的矩阵。按照下标进行索引即可得到每个单词的特征,这里使用 E i ( 1 ≤ i ≤ N ) E_i(1 \le i \le N) Ei(1iN)表示单词 w o r d i word_i wordi的特征,每个 E i E_i Ei的大小均为 1 × D i m E 1 \times Dim^E 1×DimE
  2. 获取 Q , K , V Q, K, V Q,K,V
    使用三个不同的权重矩阵 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,分别乘以 E E E即可得到 Q , K , V Q, K, V Q,K,V,大小分别为 N Q × D i m Q ,   N K × D i m K ,   N V × D i m V N^Q \times Dim^Q, \space N^K \times Dim^K, \space N^V \times Dim^V NQ×DimQ, NK×DimK, NV×DimV
    Q = E W Q ,   K = E W K ,   V = E W V Q = E W^Q, \space K = E W^K, \space V = E W^V Q=EWQ, K=EWK, V=EWV
    直观上来看, N Q = N K = N V = N N^Q=N^K=N^V=N NQ=NK=NV=N(实际上不一定,后文会说),下面以这种假设为前提,看一下如何计算Attention。
  3. 计算Attention
    对于单词 w o r d i word_i wordi来说,首先,通过索引得到其对应的查询向量 Q i Q_i Qi。通过矩阵乘法操作 S i = Q i K T S_i=Q_i K^T Si=QiKT可以得到一个大小为 1 × N 1 \times N 1×N的向量 S i S_i Si,而 S i [ j ] S_i[j] Si[j]即为 w o r d i word_i wordi w o r d j word_j wordj的Score。然后,使用 softmax \text{softmax} softmax将Score进行归一化,得到Attention Weight W i W_i Wi,大小仍是 1 × N 1 \times N 1×N,含义仍是 W i [ j ] W_i[j] Wi[j]表示 w o r d i word_i wordi w o r d j word_j wordj的相关性。,整个过程可以概括为(初始时 Q i Q_i Qi 的大小为 1 × D i m Q 1 \times Dim^Q 1×DimQ):
    1 × D i m Q     × K T →     1 × N     softmax →     1 × N     × V →     1 × D i m V 1 \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space 1 \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space 1 \times N \space \space \space \underrightarrow{\times V} \space \space \space 1 \times Dim^V 1×DimQ    ×KT   1×N    softmax   1×N    ×V   1×DimV
    不难发现,对于每一个 Q i Q_i Qi,分别计算再将结果Concatenate和直接使用 Q Q Q进行计算得到的结果是一致的:
    N × D i m Q     × K T →     N × N     softmax →     N × N     × V →     N × D i m V N \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space N \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space N \times N \space \space \space \underrightarrow{\times V} \space \space \space N \times Dim^V N×DimQ    ×KT   N×N    softmax   N×N    ×V   N×DimV
    上述介绍中,笔者实际上省略了论文中的一个重要操作——除以 D i m K \sqrt{Dim^K} DimK ,文中给出的此操作的作用是:作者同时测试了点积注意力和additive attention(出自文章)的表现,在 D i m K Dim^K DimK很小时,两种注意力的性能接近,在 D i m K Dim^K DimK很大时,前者的表现要更出色。而随着 D i m K Dim^K DimK的增加,点积操作 Q K T QK^T QKT得到的结果会变大,经过 softmax \text{softmax} softmax后,反向传播回来的梯度会很小,会对训练过程带来阻碍,故除以 D i m K \sqrt{Dim^K} DimK 进行缩放,再进行 softmax \text{softmax} softmax。综上,完整的计算Attention的过程为:
    Attention ( Q , K , V ) = softmax ( Q K T D i m K ) V \text{Attention}(Q, K, V)=\text{softmax}(\frac{QK^T}{\sqrt{Dim^K}})V Attention(Q,K,V)=softmax(DimK QKT)V

现在,总结一下注意力到底做了什么。我觉得用一句话概括,就是:使用 K , V K, V K,V来获得 Q Q Q的更优表示。(以下部分参考了[2])

Q Q Q代表我们想要表达的内容(或序列,暂记为 X X X)在高维空间 A A A中的表达, K K K代表某内容(或序列,暂记为 Y Y Y)在高维空间 A A A中的表达, V V V代表某内容(或序列,暂记为 Y Y Y)在高维空间 B B B中的表达。即:
Q = A ( X ) ,   K = A ( Y ) ,   V = B ( Y ) Q=A(X), \space K=A(Y), \space V=B(Y) Q=A(X), K=A(Y), V=B(Y)
也就是说,通过计算两个不同序列 X , Y X, Y X,Y在同一高维空间 A A A的相似度,作为权重作用在序列 Y Y Y在另一高维空间 B B B上,从而获得序列 X X X在高维空间 B B B中的表达 B ( X ) B(X) B(X)

由上面这些分析可知,在注意力模块中,必满足以下两个约束:

  1. D i m Q = D i m K Dim^Q = Dim^K DimQ=DimK(即: Q Q Q K K K在同一高维空间中,这样才可以计算相似度)
  2. N K = N V N^K = N^V NK=NV(即: K K K V V V中的“单词”(不一定限定于单词)个数相同,因为他们是同一序列在不同高维空间的表达)

自注意力

其实只有一句话, Q = K = V Q=K=V Q=K=V


多头注意力

这部分也很好理解,就是通过多组不同的 Q , K , V Q, K, V Q,K,V分别计算注意力,再Concat一下。这样可以学到不同空间的表示。


Positional Encoding

TO DO.


参考

[1] https://blog.csdn.net/longxinchen_ml/article/details/86533005
[2] https://zhuanlan.zhihu.com/p/104393915


BERT

引言

Pre-training of Deep Bidirectional Transformers for Language Understanding
文章链接

解析

TO DO.

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值