文章来源:初识 CV - Transformer 模型详解(图解最完整版)
T r a n s f o r m e r Transformer T r a n s f o r m e r 是一种由谷歌团队在 2017 2017 2 0 1 7 年提出的深度学习模型架构,最初用于处理自然语言(翻译、文本生成等),现已广泛应用于图像、音频等领域,设计灵感是人类处理信息的方式 关注重点、忽略无关内容
# 结构 由图可知,T r a n s f o r m e r Transformer T r a n s f o r m e r 由 E n c o d e r Encoder E n c o d e r 和 D e c o d e r Decoder D e c o d e r 两部分组成
# 工作流程获取输入句子的每一个表示向量 x x x ,这个向量由 单词的意思Embedding 和 单词的位置Embedding 相加得到 将得到的 表示向量矩阵 (每一行是一个 表示向量 ),传入 E n c o d e r Encoder E n c o d e r 中,经过 6 6 6 个 E n c o d e r Encoder E n c o d e r 块后就可以得到该句子的编码信息矩阵 C C C 将编码矩阵 C C C 传递到 D e c o d e r Decoder D e c o d e r 中,D e c o d e r Decoder D e c o d e r 会根据当前翻译的 1 → i − 1 1 \to i - 1 1 → i − 1 个单词翻译下一个单词 i i i ,在翻译过程中,需要通过 Mask(掩盖) 操作遮盖住 i + 1 i + 1 i + 1 及之后的单词 # 单词的词意 Embedding可以通过 W o r d 2 V e c Word2Vec W o r d 2 V e c 或 G l o v e Glove G l o v e 等算法预训练得到,也可以在 T r a n s f o r m e r Transformer T r a n s f o r m e r 中训练得到
# 单词的位置 EmbeddingT r a n s f o r m e r Transformer T r a n s f o r m e r 的核心是 自注意力机制 ,把句子中的所有词当成一个集合,但有个问题是 我 爱 你 和 你 爱 我 ,他们会是一样的集合,丢失顺序信息,而此时,我们就提出了位置 E m b e d d i n g Embedding E m b e d d i n g
假设一句话有 L L L 个词,每个词的向量维度是 d m d_{m} d m ,我们给每个位置 p o s pos p o s 分配一个向量,P o s i t i o n a l E n c o d i n g ( P E ) Positional~Encoding~(PE) P o s i t i o n a l E n c o d i n g ( P E ) ,大小也是 d m d_m d m 。词意 E m b e d d i n g Embedding E m b e d d i n g 和 词位 E m b e d d i n g Embedding E m b e d d i n g 相加,这样模型就能感知到 “位置” 信息
# 公式P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m ) PE(pos, 2i) = sin(\frac{pos}{10000^{2i / d_{m}}}) P E ( p o s , 2 i ) = s i n ( 1 0 0 0 0 2 i / d m p o s )
P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m ) PE(pos, 2i+1)=cos(\frac{pos}{10000^{2i/d_m}}) P E ( p o s , 2 i + 1 ) = c o s ( 1 0 0 0 0 2 i / d m p o s )
以 我 爱 你 为例
位置 p o s = 0 , 1 , 2 pos = 0, 1, 2 p o s = 0 , 1 , 2 d m d_{m} d m 取一个小一些的,假设是 4 4 4 ,那 i = 0 , 1 , 2 , 3 i = 0, 1, 2, 3 i = 0 , 1 , 2 , 3 每一个词都可以代入,得到一个唯一的位置 E m b e d d i n g Embedding E m b e d d i n g
# Self-Attention(自注意机制) 被额外框起来的部分是 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n ,是由多个 S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 组成的,E n c o d e r Encoder E n c o d e r 包括一个 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n ,而 D e c o d e r Decoder D e c o d e r 包含两个 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n
每个 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n 上都有一个 A d d & N o r m Add ~ \& ~ Norm A d d & N o r m 层
A d d Add A d d 层表示残差连接(R e s i d u a l C o n n e c t i o n Residual~Connection R e s i d u a l C o n n e c t i o n ),用于防止网络退化N o r m Norm N o r m 层表示 L a y e r N o r m a l i z a t i o n Layer~Normalization L a y e r N o r m a l i z a t i o n ,用于对每一层的激活值进行归一化# Self-Attention 结构S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 接受的是输入(单词的表示向量 x x x 组成的矩阵 x x x 或者 上一个 E n c o d e r Encoder E n c o d e r 块的输出)
Q , K , V Q,K,V Q , K , V 三个矩阵都是通过矩阵乘法线性变换得来的
Q ( Q u e r y ) Q~(Query) Q ( Q u e r y ) :我是谁?我想找谁?K ( K e y ) K~(Key) K ( K e y ) :我有什么特征?我可以被谁找?V ( V a l u e ) V~(Value) V ( V a l u e ) :我的内容是什么?被找到的时候我要传递什么信息?在数学形式上,就是三个线性变换
Q = X ⋅ W Q , K = X ⋅ W K , V = X ⋅ W V Q = X·W_Q, K = X·W_K,V=X·W_V Q = X ⋅ W Q , K = X ⋅ W K , V = X ⋅ W V
W Q , K , V ∈ R d m × d k W_{Q,K,V} \in \mathbb{R}^{d_{m} \times d_k} W Q , K , V ∈ R d m × d k :是可训练的矩阵d k d_k d k 通常比 d m d_m d m 小用 Q Q Q 和 K K K 做点积,可以得到相关性
S c o r e s = Q ⋅ K T ∈ R n × n Scores = Q·K^{T} \in \mathbb{R}^{n \times n} S c o r e s = Q ⋅ K T ∈ R n × n
这样一个 n × n n \times n n × n 矩阵,表示第 i i i 个词对第 j j j 个词的注意力打分。为了避免数值太大,通常除以 d k \sqrt{d_k} d k 进行缩放
S c o r e s c a l e d = Q ⋅ K T d k Score_{scaled}=\frac{Q·K^T}{\sqrt{d_k}} S c o r e s c a l e d = d k Q ⋅ K T
再对每一行做 S o f t M a x SoftMax S o f t M a x ,变成权重形式
A t t e n t i o n W e i g h t s = S o f t M a x ( Q ⋅ K T d k ) Attention~Weights = SoftMax(\frac{Q·K^T}{\sqrt{d_k}}) A t t e n t i o n W e i g h t s = S o f t M a x ( d k Q ⋅ K T )
用这样的权重去加和 V V V ,就能得到输入的新的表示
O u t p u t = V ⋅ A t t e n t i o n W e i g h t s ∈ R n × d v Output = V·Attention~Weights \in \mathbb{R}^{n \times d_v} O u t p u t = V ⋅ A t t e n t i o n W e i g h t s ∈ R n × d v
通过这样的形式,就能更新每个词的表示,同时还能融合其他词的信息
# Multi-Head Attention(多头注意力机制)M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n 中包含多个 S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 层,分别将输入 x x x 传入 h h h 个不同的 S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 中,得到 h h h 个输出矩阵 Z Z Z 将 h h h 个输出矩阵 Z Z Z 拼接(C o n c a t Concat C o n c a t )到一起,然后传入一个 L i n e a r Linear L i n e a r 层,从而得到 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n 层的最终输出
# Encoder 结构E n c o d e r Encoder E n c o d e r 部分还有 Add & Norm 和 Feed Forward 部分,这里进行一个补充介绍
# Add & NormO u t p u t = L a y e r N o r m ( x + S u b L a y e r ( x ) ) Output = LayerNorm(x+SubLayer(x)) O u t p u t = L a y e r N o r m ( x + S u b L a y e r ( x ) )
顾名思义,这个部分分为
A d d Add A d d :残差连接N o r m Norm N o r m :层归一化# Add计算完上一层的输入 S u b L a y e r ( x ) SubLayer(x) S u b L a y e r ( x ) 后,与原始输入相加
y = x + S u b L a y e r ( x ) y = x + SubLayer(x) y = x + S u b L a y e r ( x )
通过相加,既能保留原始信息,又能叠加上新信息,缓解梯度消失的问题
# Norm对 A d d Add A d d 的 y y y 进行 L a y e r N o r m a l i z a t i o n Layer~Normalization L a y e r N o r m a l i z a t i o n ,在特征维度上做归一化
L a y e r N o r m ( y ) = γ ⋅ y − μ σ 2 + ϵ + β LayerNorm(y) = \gamma· \frac{y - \mu}{\sqrt{\sigma^2+\epsilon}} + \beta L a y e r N o r m ( y ) = γ ⋅ σ 2 + ϵ y − μ + β
μ = 1 d ∑ i = 1 d y i \mu = \frac{1}{d} \sum\limits_{i=1}^{d} y_i μ = d 1 i = 1 ∑ d y i :样本均值σ 2 \sigma^2 σ 2 :方差d d d :特征维度γ , β \gamma,\beta γ , β :学习的参数,用来缩放和平移,恢复网络的表达能力ϵ \epsilon ϵ :防除 0 0 0 的小常数# Feed Forward(前馈全连接网络 FFN)F F N FFN F F N 用来进一步对特征进行加工,核心是 两层全连接 + 激活函数
F F N ( x ) = W 2 ⋅ σ ( W 1 ⋅ x + b 1 ) + b 2 FFN(x) = W_2 · \sigma(W_1·x+b_1)+b_2 F F N ( x ) = W 2 ⋅ σ ( W 1 ⋅ x + b 1 ) + b 2
W 1 ∈ R d f × d m W_1 \in \mathbb{R}^{d_f \times d_m} W 1 ∈ R d f × d m :第一层权重,把 d m d_m d m 升维至 d_b 1 ∈ R d f b_1 \in \mathbb{R}^{d_f} b 1 ∈ R d f :第一层偏置σ ( ⋅ ) \sigma(·) σ ( ⋅ ) :激活函数(通常是 R e L U ReLU R e L U 或 G E L U GELU G E L U )W 2 ∈ d m × d f W_2 \in \mathbb{d_m \times d_f} W 2 ∈ d m × d f :第二层权重,降维回到 d m d_m d m b 2 ∈ R d m b_2 \in \mathbb{R}^{d_m} b 2 ∈ R d m :第二层偏置通俗易懂的解释就是,一句话的表达 x x x 先展开思路(升维),再把展开的思路精简一下(降维) 而激活函数的作用就是增加非线性的表达,如果没有激活函数的话,那就相当于一个线性变换了,什么都没做
# Decoder 结构
# 第一个 MHAD e c o d e r Decoder D e c o d e r 部分的第一个 M H A MHA M H A 使用了 M a s k e d Masked M a s k e d 操作,之前我们提过,在翻译过程中,是顺序翻译的(翻完 i i i 个单词才能翻 i + 1 i+1 i + 1 个)注意 ,M a s k e d Masked M a s k e d 操作是在 S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 的 S o f t m a x Softmax S o f t m a x 之前使用的M a s k e d Masked M a s k e d 矩阵参考图如下:
第一步仍是 Q ⋅ K T Q · K^T Q ⋅ K T ,得到注意力矩阵 Q K T QK^T Q K T (此处为了方便,不提及缩放) 区别就是,要在 S o f t m a x Softmax S o f t m a x 钱,利用 M a s k e d Masked M a s k e d 矩阵做掩码 用 M a s k ( Q ⋅ K T ) Mask(Q·K^T) M a s k ( Q ⋅ K T ) # 第二个 MHA第二个 M u l t i − H e a d A t t e n t i o n Multi-Head~Attention M u l t i − H e a d A t t e n t i o n 之前的 M H A MHA M H A 变化不大,主要的区别是其中的 S e l f − A t t e n t i o n Self-Attention S e l f − A t t e n t i o n 的 K , V K, V K , V 矩阵是使用 Encoder 的编码信息矩阵 C 计算的,而不是使用上一个 D e c o d e r Decoder D e c o d e r 的输出
K , V K, V K , V 是从 E n c o d e r Encoder E n c o d e r 的编码信息矩阵 C C C 来的Q Q Q 是由上一个 D e c o d e r Decoder D e c o d e r 来的这样的好处是,在 D e c o d e r Decoder D e c o d e r 时,每一位单词都可以利用到 E n c o d e r Encoder E n c o d e r 的所有信息(这些信息无需 M a s k e d Masked M a s k e d )
# Softmax其实是得到一堆 S o f t m a x Softmax S o f t m a x ,表示每个位置每词的概率