Transformer是一种新的神经架构,它通过注意机制将输入数据编码为强大的特征。基本上,视觉transformer首先将输入图像分成几个局部小块,然后计算两种表示及其关系。
由于自然图像具有高度的复杂性和丰富的细节和颜色信息,因此块划分的粒度不同以挖掘不同尺度和位置上的物体特征。
在本文中指出这些局部补丁内部的注意力对于构建高性能的视觉transformer也是必不可少的,并探索了一种新的架构,即transformer中的transformer(TNT)。
具体来说,本文将局部小块(如16×16)视为“视觉句子”,并提出将其进一步划分为更小的小块(如4×4)作为“视觉单词”。每个单词的注意力将与给定视觉句子中的其他单词一起计算,计算成本可以忽略不计。
单词和句子的特征将被聚合以增强表示能力。在几个基准上的实验证明了所提出的TNT体系结构的有效性,例如,本文模型在ImageNet上获得了81.5%的top-1准确率,这比具有相似计算成本的最先进的视觉转换器高出约1.7%。
PyTorch代码可在https://github.com/huawei-noah/CV-Backbones,获得,
MindSpore代码可在https://gitee.com/mindspore/models/tree/master/research/cv/TNT获得。
提出了一种新颖的Transformer-iN-Transformer(TNT)模型,用于对 patch级和像素级表示进行建模。
华为诺亚实验室的研究者提出了一种新型视觉 Transformer 网络架构 Transformer in Transformer,它的表现优于谷歌的 ViT 和 Facebook 的 DeiT。TNT 还暗合了 Geoffrey Hinton 最新提出的 part-whole hierarchies 思想。
本文将描述所提出的transformer中transformer架构,并详细分析计算和参数复杂性。
Preliminaries
本文先简单描述一下transformer中的基本组件,包括MSA(多头自注意力机制)、MLP(多层感知器)和LN(层归一化)。
MSA:在自注意力机制模块中,输入 X ∈ R n × d X∈\Bbb R^{n×d} X∈Rn×d被线性变换成三个部分,即查询 Q ∈ R n × d k Q∈\Bbb R^{n×d_k} Q∈Rn×dk、关键字 K ∈ R n × d k K∈\Bbb R^{n×d_k} K∈Rn×dk和值 V ∈ R n × d v V ∈\Bbb R^{n×d_v} V∈Rn×dv,其中n是序列长度, d 、 d k 、 d v d、d_k、d_v d、dk、dv分别是输入、查询(关键字)和值的维度。缩放的点积注意力应用于Q、K、V:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
最后,使用线性图层生成输出。多头自注意力机制将查询、键和值拆分为h个部分并并行执行attention函数,然后将每个头的输出值级联并线性投影形成最终输出。
注意力机制(Attention Mechanism)的本质是:对于给定目标,通过生成一个权重系数对输入进行加权求和,来识别输入中哪些特征对于目标是重要的,哪些特征是不重要的;
为了实现注意力机制,可以将输入的原始数据看作< Key, Value>键值对的形式,根据给定的任务目标中的Query 计算 Key 与 Query 之间的相似系数,可以得到Value值对应的权重系数, 之后再用权重系数对 Value 值进行加权求和, 即可得到输出。将注意力权重系数W与Value做**点积操作(加权求和)**得到融合了注意力的输出:
A t t e n t i o n ( Q , K , V ) = W ⋅ V = s o f t m a x ( Q K T ) ⋅ V Attention(Q,K,V)=W⋅V=softmax(QK^T)⋅V Attention(Q,K,V)=W⋅V=softmax(QKT)⋅V
注意力模型的详细结构如下图所示:
注意力机制可以通过对< Key, Query>的计算来形成一个注意力权重向量,然后对Value进行加权求和得到融合了注意力的全新输出,注意力机制在深度学习各个领域都有很多的应用。不过需要注意的是,注意力并不是一个统一的模型,它只是一个机制,在不同的应用领域,Query, Key和Value有不同的来源方式,也就是说不同领域有不同的实现方法。
MLP:MLP应用于自注意力层之间,用于特征变换和非线性: M L P ( X ) = F C ( σ ( F C ( X ) ) 、 F C ( X ) = X W + b MLP(X)=FC(σ(FC(X))、FC(X) = XW + b MLP(X)=FC(σ(FC(X))、FC(X)=XW+b.其中W和b分别是全连接层的权重和偏置项,σ()是激活函数如GELU。
MLP中文叫法是多层感知机,其实质就是神经网络。MLP中文叫法是多层感知机,其实质就是神经网络。是深度神经网络(DNN)的基础算法,有时候提起DNN就是指MLP。在MLP中,层与层之间是全连接的.
GELU激活函数
全称是GAUSSIAN ERROR LINEAR UNIT,高斯误差线性单元,与Sigmoids相比,像ReLU,ELU和PReLU这样的激活可以使神经网络更快更好地收敛。高斯误差线性单元激活函数在最近的 Transformer 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了应用。GELU 的论文来自 2016 年,但直到最近才引起关注。
G E L U ( X ) = x ∗ P ( X ≤ x ) = x ∗ ϕ ( x ) , x ~ N ( 0 , 1 ) GELU(X)=x*P(X\leq x)=x*\phi(x),x~N(0,1) GELU(X)=x∗P(X≤x)=x∗ϕ(x),x~N(0,1).x是输入值,X是具有零均值和单位方差的高斯随机变量。P(X<=x)是X小于或等于给定值x的概率。
想使用它来创建确定性函数以用作激活。 请注意,SOI(zero-or-identity)可以执行以下两项操作之一:以概率 ϕ ( x ) \phi(x) ϕ(x) 做恒等映射,以概率 1 − ϕ ( x ) 1-\phi(x) 1−ϕ(x) 映射到0。对应着伯努利分布,该式子的期望(平均值)为:
I ∗ x ∗ ϕ ( x ) + 0 ∗ x ∗ ( 1 − ϕ ( x ) ) = x ∗ ϕ ( x ) 近 似 计 算 : G E E L U ( X ) = 0.5 ∗ x ∗ ( 1 + t a n h [ 2 π ∗ ( x + 0.044715 x 3 ) ] ) G E L U 激 活 函 数 的 倒 数 : d G E L U ( x ) d x = ϕ ( x ) + x ∗ ϕ ( x ) ‘ I*x*\phi(x)+0*x*(1-\phi(x))=x*\phi(x)\\ 近似计算:GEELU(X)=0.5*x*(1+tanh[\sqrt{\frac{2}{\pi}}*(x+0.044715x^3)])\\ GELU激活函数的倒数:\frac{dGELU(x)}{dx}=\phi(x)+x*\phi(x)^` I∗x∗ϕ(x)+0∗x∗(1−ϕ(x))=x∗ϕ(x)近似计算:GEELU(X)=0.5∗x∗(1+tanh[π2∗(x+0.044715x3)])GELU激活函数的倒数:dxdGELU(x)=ϕ(x)+x∗ϕ(x)‘
其中 Φ ( x ) \Phi(x) Φ(x)指的是x xx的高斯正态分布的累积分布,完整形式如下: x P ( X ≤ x ) = x ∗ ∫ − ∞ x e − ( x − μ ) 2 / ( 2 δ 2 ) 2 π δ d X xP(X\leq x)=x*\intop_{-∞}^{x}\frac{e^{-(x-μ)^2/(2\delta^2)}}{\sqrt{2\pi}\delta}dX xP(X≤x)=x∗∫−∞x2πδe−(x−μ)2/(2δ2)dX,计算的结果约为 0.5 ∗ x ∗ ( 1 + t a n h [ 2 π ∗ ( x + 0.044715 x 3 ) ] ) 0.5*x*(1+tanh[\sqrt{\frac{2}{\pi}}*(x+0.044715x^3)]) 0.5∗x∗(1+tanh[π2∗(x+0.044715x3)])。
Gelu(u(均值)=0,σ(方差) =1),Elu(α = 1),Relu激活函数对比图
LN:层标准化是transformer中稳定训练和更快收敛的关键部分。LN应用于每个样本 x ∈ R d x ∈\Bbb R^d x∈Rd,如下所示:
KaTeX parse error: Undefined control sequence: \var at position 19: …(x)=\frac{x-μ}{\̲v̲a̲r̲}\odotγ+β
其中μ∈ R、δ ∈ R分别是特征的平均值和标准偏差, ⊙ \odot ⊙是element-wise dot, γ ∈ R d 、 β ∈ R d γ∈\Bbb R^d、β∈\Bbb R^d γ∈Rd、β∈Rd是可学习的仿射变换参数。
Transformer in Transformer
给定一幅2D图像,本文将其均匀分成n个patch X = [ X 1 , X 2 , , X n ] ∈ R n × p × p × 3 X = [X1,X2,,Xn] ∈\Bbb R^{n×p×p×3} X=[X1,X2,,Xn]∈Rn×p×p×3,其中(p,p)是每个图像patch的分辨率。ViT 只是利用一个标准的transformer来处理一系列的补片,这破坏了补片的局部结构。
相反,本文提出transformer中transformer(TNT)架构来学习图像中的全局和局部信息。在TNT中,本文将补丁视为代表图像的视觉句子。每个小块被进一步分成m个子小块,即一个可视句子由一系列可视单词组成:
X i → [ x i , 1 , x i , 2 , ⋅ ⋅ ⋅ , x i , m ] , X_i → [x^{i,1}, x^{i,2}, · · · , x^{i,m}], Xi→[xi,1,xi,2,⋅⋅⋅,xi,m],
其中, x i , j ∈ R s × s × 3 x^{i,j} ∈\Bbb R^{s×s×3} xi,j∈Rs×s×3是第i个可视句子的第j个可视单词,(s,s)是子块的空间大小,j = 1,2,,m。利用线性投影,本文将可视单词转换成单词嵌入序列:
Y i = [ y i , 1 , y i , 2 , ⋅ ⋅ ⋅ , y i , m ] , y i , j = F C ( V e c ( x i , j ) ) , ( 5 ) Y_i = [y^{i,1}, y^{i,2}, · · · , y^{i,m}], y^{i,j} = FC(V ec(x^{i,j})),(5) Yi=[yi,1,yi,2,⋅⋅⋅,yi,m],yi,j=FC(Vec(xi,j)),(5)
其中 y i , j ∈ R c y^{i,j} ∈ R^c yi,j∈Rc为第j个单词嵌入,c为单词嵌入的维数,Vec(·)为向量化运算。
在TNT中,本文有两个数据流,其中一个流跨可视句子操作,另一个处理每个句子中的可视单词。对于单词嵌入,本文利用transformer块来探索视觉单词之间的关系:
Y l ‘ i = Y l − 1 i + M S A ( L N ( Y l − 1 i ) ) , ( 6 ) Y l i = Y l ‘ i + M L P ( L N ( Y l ‘ i ) ) . ( 7 ) Y^{`i}_l = Y^i_{l−1} + MSA(LN(Y^i_{l−1})),(6)\\ Y^i_l = Y^{`i}_l + MLP(LN(Y^{`i}_ l)).(7) Yl‘i=Yl−1i+MSA(LN(Yl−1i)),(6)Yli=Yl‘i+MLP(LN(Yl‘i)).(7)
其中l = 1,2,,L是第L个块的索引,L是堆叠块的总数。第一个模块的输入 Y 0 i Y^i_0 Y0i就是等式5中的Yi。变换后图像中的所有单词嵌入都是 Y l = [ Y l 1 , Y l 2 , . . . , Y l n ] Y_l=[Y^1_l,Y^2_l,...,Y^n_l] Yl=[Yl1,Yl2,...,Yln]。这可以视为内部transformer模块,表示为Tin。这个过程通过计算任意两个视觉单词之间的交互来建立视觉单词之间的关系。例如,在一幅人脸图像中,与眼睛相对应的单词与眼睛的其他单词的关联度更高,而与前额部分的交互度较低。
对于句子级,本文创建句子嵌入存储器来存储句子级表示的序列: Z 0 = [ Z c l a s s , Z 0 1 , Z 0 2 , . . . , Z 0 n ] ∈ R ( n + 1 ) × d Z_0=[Z_{class},Z^1_0,Z^2_0,...,Z^n_0 ] ∈\Bbb R^{(n+1)×d} Z0=[Zclass,Z01,Z02,...,Z0n]∈R(n+1)×d其中Zclass是类似于ViT 的cls标记,它们都被初始化为零。在每一层中,通过线性投影将单词嵌入序列转换到句子嵌入域中,并添加到句子嵌入中: Z l − 1 i = Z l − 1 i + F C ( V e c ( Y l i ) ) , Z^i_{l−1} = Z^i_{l−1} + FC(Vec(Y^{i}_l )), Zl−1i=Zl−1i+FC(Vec(Yli)),。
其中, Z l − 1 i ∈ R d Z^i_{l-1}∈\Bbb R^d Zl−1i∈Rd和全连接层FC使尺寸相匹配。通过上述加法运算,句子嵌入的表示通过单词级特征得到增强。本文使用标准transformer块来变换句子嵌入:
Z l ‘ = Z l − 1 + M S A ( L N ( Z l − 1 ) ) , ( 9 ) Z l = Z l ‘ + M L P ( L N ( Z l ‘ ) ) . ( 10 ) Z^`_l = Z_{l−1} + MSA(LN(Z_{l−1})),(9)\\ Z_l = Z^`_l + MLP(LN(Z^`_l)).(10) Zl‘=Zl−1+MSA(LN(Zl−1)),(9)Zl=Zl‘+MLP(LN(Zl‘)).(10)
这个外部transformer块Tout用于对句子嵌入之间的关系进行建模。
总之,TNT块的输入和输出包括视觉单词嵌入和句子嵌入,因此TNT可以被公式化为:
在本文的TNT块中,内部transformer块用于对视觉单词之间的关系进行建模以进行局部特征提取,外部transformer块从句子序列中捕获内在信息。通过堆叠L次TNT块,本文构建了transformer中transformer网络。最后,分类token用作图像表示,并且全连接层被应用于分类。
Position encoding:空间信息是图像识别中的一个重要因素。对于句子嵌入和单词嵌入,本文都添加了相应的位置编码来保留空间信息。这里使用了标准的可学习的1D位置编码。具体来说,每个句子都分配有一个位置编码: Z 0 ← Z 0 + E s e n t e n c e , Z_0←Z_0+E_{sentence}, Z0←Z0+Esentence,.
Complexity Analysis
一个标准的transformer块包括两部分,即多头自注意力模块和多层感知器。MSA的FLOPs是 2 n d ( d k + d v ) + n 2 ( d k + d v ) 2nd(d_k + d_v) + n^2(d_k + d_v) 2nd(dk+dv)+n2(dk+dv),MLP的FLOPs是 2 n d v r d v 2nd_vrd_v 2ndvrdv其中r是MLP的隐藏层的维度扩展比。总体而言,标准transformer模块的FLOPs为
F L O P s T = 2 n d ( d k + d v ) + n 2 ( d k + d v ) + 2 n d d r . ( 14 ) FLOPs_T = 2nd(d_k + d_v) + n^2(d_k + d_v) + 2ndd_r.(14) FLOPsT=2nd(dk+dv)+n2(dk+dv)+2nddr.(14)
由于r通常设置为4,并且输入、键(query)和值的维度通常设置为相同,因此FLOPs计算可以简化为 F L O P s T = 2 n d ( 6 d + n ) FLOPs_T = 2nd(6d + n) FLOPsT=2nd(6d+n)。
参数的数量可以通过下式获得: P a r a m s T = 12 d d Params_T = 12dd ParamsT=12dd
本文的TNT模块由三部分组成:内部transformer模块Tin、外部transformer模块Tout和线性层。Tin和Tout的计算复杂度分别为2nmc(6c + m)和2nd(6d + n)。线性层具有nmcd的FLOPs。总的来说,TNT模块的FLOPs为:
F L O P s T N T = 2 n m c ( 6 c + m ) + n m c d + 2 n d ( 6 d + n ) . FLOPs_{TNT} = 2nmc(6c + m) + nmcd + 2nd(6d + n). FLOPsTNT=2nmc(6c+m)+nmcd+2nd(6d+n).
类似地,TNT块的参数复杂度计算如下: P a r a m s T N T = 12 c c + m c d + 12 d d . Params_{T N T} = 12cc + mcd + 12dd. ParamsTNT=12cc+mcd+12dd.。
尽管本文在TNT模块中增加了两个元件,但增加的FLOPs由于c远小于实际中d和O(m) ≈ O(n)。
例如,在DeiT-S配置中,d = 384,n = 196。本文在TNT-S的结构中相应地设置c = 24,m = 16。从等式15和等式17来看,可以得到FLOPsT = 376M和FLOPsTNT = 429M。TNT模块与标准transformer模块的FLOPs比率约为1.14倍。
类似的,参数比值约为1.08倍。实验表明,在计算和存储开销增加很少的情况下,本文的TNT块可以有效地模拟局部结构信息,并在准确性和复杂性之间取得更好的平衡。
Network Architecture
在这一节中,本文对视觉基准进行了广泛的实验,以评估所提出的TNT架构的有效性。
Datasets and Experimental Settings
TNT on ImageNet
Ablation Studies
Visualization
Visualization of Feature Maps:
Visualization of Attention Maps
Transfer Learning
为了展示TNT强大的泛化能力,本文将在ImageNet上训练的TNT-S、TNT-B模型转移到下游任务中。
Pure Transformer Image Classification.
Pure Transformer Object Detection.
Pure Transformer Semantic Segmentation.
自注意力机制(self-Attention Mechanism),它最早由谷歌团队在2017年提出,并应用于Transformer语言模型。自注意力机制可以在编码或解码中单独使用,相对于注意力机制,它更关注输入内部的联系,区别就是Q,K和V来自同一个数据源,也就是说Q,K和V由同一个矩阵通过不同的线性变换而来。(详解自注意力机制及其在LSTM中的应用_NLP饶了我的博客-CSDN博客_自注意力机制lstm)
比如对于文本矩阵来说,利用自注意力机制可以实现文本内各词“互相注意”,即词与词之间产生注意力权重矩阵,然后对Value加权求和产生一个融合了自注意力的新文本矩阵。文本自注意力的实现步骤如下:
假设文本矩阵 i n p u t = R ( a × b ) input=\R^{(a×b)} input=R(a×b) ,三个变换矩阵(卷积核):$ ωq,ωk∈ \R{(b×d)}、ωv∈ \R^{(b×c)}$ ;
Q、K、V变换:文本矩阵和三个权重矩阵做线性变换,得到 Q , K ∈ R ( a × d ) 、 V ∈ R ( a × c ) Q,K∈ \R^{(a×d)}、V∈ \R^{(a×c)} Q,K∈R(a×d)、V∈R(a×c) : Q = i n p u t ⋅ ω q , K = i n p u t ⋅ ω k , V = i n p u t ⋅ ω v Q =input·ω^q, K =input·ω^k, V =input·ω^v Q=input⋅ωq,K=input⋅ωk,V=input⋅ωv;
缩放点积: Q × K T Q×K^T Q×KT然后乘以一个 1 / d k 1/\sqrt{d_k} 1/dk(dk为K的维度, 1 / d k 1/\sqrt{d_k} 1/dk为缩放因子,防止内积数值过大影响神经网络的学习),得到注意力得分矩阵$ G∈ \R{(a×a)}$,G的行表示某个词在各个词上的得分:$G=QKT/\sqrt{d_k}$;
得到注意力权重矩阵:softmax(G)表示注意力权重矩阵W : W = s o f t m a x ( Q K T d k ) W=softmax(\frac{QK^T}{\sqrt{d_k}}) W=softmax(dkQKT);
得到结果矩阵: W* V 得到一个结果矩阵 A t t e n t i o n ∈ R ( a × c ) Attention∈ \R^{(a×c)} Attention∈R(a×c),该矩阵就是一个全新的融合了注意力机制的文本矩阵z:
- z = A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V z=Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V z=Attention(Q,K,V)=softmax(dkQKT)V
在上述公式中,变换矩阵 ω q 、 ω k 、 ω v ω^q、ω^k、ω^v ωq、ωk、ωv都是神经网络的参数,可以随着反向传播而修改,通过修改这些变换矩阵来达到自注意力转移的目的。
若为多头自注意力机制,则有多组卷积核$ ω_iq,ω_iv,ω_i^k$,将步骤2-5进行h次得到h组结果矩阵 ( z 1 , . . . , z h ) (z_1,...,z_h ) (z1,...,zh),将 ( z 1 , . . . , z h ) (z_1,...,z_h ) (z1,...,zh)拼接并做一次线性变换 ω z ω^z ωz 就得到了想要的文本矩阵: M u l t i H e a d ( Q , K , V ) = C o n c a t ( z 1 , . . . , z h ) ω z MultiHead(Q,K,V )= Concat(z_1,...,z_h ) ω^z MultiHead(Q,K,V)=Concat(z1,...,zh)ωz.
缩放点积计算和多头自注意力机制计算过程如下图:
自注意力机制将文本输入视为一个矩阵,没有考虑文本序列信息,例如将K、V按行打乱,那么计算之后的结果是一样的,但是文本的序列是包含大量信息的.Positional Encoding计算公式如下:
{ P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) \begin{cases} \begin{aligned} PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) \end{aligned} \end{cases} {PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
pos 表示位置index,i表示位置嵌入index。得到位置编码后将原来的word embedding和Positional Encoding拼接形成最终的embedding作为多头自注意力计算的输入input embedding。
word embedding
Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。
word embedding:NLP语言模型中对单词处理的一种方式,这种技术会把单词或者短语映射到一个n维的数值化向量,核心就是一种映射关系,主要分为两种方式:
- one hot encoding:对语料库中的每个单词都用一个n维的one hot向量表示,其中n为语料库中不同单词的个数。这种方法的原理是把语料库中的不同单词排成一列,对于单词A,它在语料库中的位置为k,则它的向量表示为第k位为1,其余为0的n维向量。
- word2vec:可以理解为一种对单词onehot向量的一种降维处理,通过一种映射关系将一个n维的onehot向量转化为一个m维的空间实数向量(可以理解为原来坐标轴上的点被压缩嵌入到一个更加紧凑的空间内),由于onehot向量在矩阵乘法的特殊性,我们得到的表示映射关系的n*m的矩阵中的每k行,其实就表示语料库中的第k个单词。
- 采用这种空间压缩降维的处理方式对语料库中的词进行训练,主要有两种方式
- skip-gram神经网络训练模型:一种隐层为1的全连接神经网络,且隐层没有激活函数,输出层采用softmax分类器输出概率。输入为一个单词,输出为每个单词是输入单词的上下文的概率,真实值为输入单词的上下文中的某个单词。
- 主要通过skip-window控制,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。假如有一个句子“The dog barked at the mailman”,选取“dog”作为input word,那么最终获得窗口中的词(包括input word在内)就是[‘The’, ‘dog’,‘barked’, ‘at’]。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,将会得到两组 (input word, output word) 形式的训练数据,即 (‘dog’, ‘barked’),(‘dog’, ‘the’)。
- CBOW:原理与skip-gram类似,但是输入为上下文信息,输出为信息中的中心词。
- word2vec的优点:表示单词的向量维度缩减很大,有益于后续RNN训练的收敛性。如果某两个单词的上下文很相似,则计算出来的表示这两个单词的特征向量会很相似,在空间中表示相近的物理位置,所以可以用两个单词生成的向量的长度表示其含义的远近。除了词向量的大小之外,词向量的方向还表示一种含义,若某两个词向量的方向相同,则其表示的含义也相近。
Positional Encoding
说到优化器,我们脑海中首先浮现的可能就是 Stochastic Gradient Descent (SGD)、Adaptive Gradient (AdaGrad)、Root Mean Square prop (RMSprop)、Adaptive Moment estimation (Adam) 等常用的老牌优化器。但是神经网络发展到了现在,大部分 NLP 预训练模型已不再使用这些方法,而是使用 Adam Weight Decay Regularization (AdamW) 和19年首度亮相的 Layer-wise Adaptive Moments optimizer for Batching training (LAMB)。
为解决 GD 中固定学习率带来的不同参数间收敛速度不一致的弊端,AdaGrad 和 RMSprop 诞生出来,为每个参数赋予独立的学习率。计算梯度后,梯度较大的参数获得的学习率较低,反之亦然。此外,为避免每次梯度更新时都独立计算梯度,导致梯度方向持续变化,Momentum 将上一轮梯度值加入到当前梯度的计算中,通过某种权重对两者加权求和,获得当前批次参数更新的更新值。 Adam 结合了这两项考虑,既为每一个浮点参数自适应性地设置学习率,又将过去的梯度历史纳入考量
最优化方法一直是机器学习中非常重要的部分,也是学习过程的核心算法。而 Adam 自 14 年提出以来就受到广泛关注。不过自去年以来,很多研究者发现 Adam 优化算法的收敛性得不到保证,ICLR 2017 的最佳论文也重点关注它的收敛性。大多数深度学习库的 Adam 实现都有一些问题,并在 fastai 库中实现了一种新型 AdamW 算法。
Adam 优化器之旅可以说是过山车(roller-coaster)式的。本质上是一个出于直觉的简单想法:既然明确地知道某些参数需要移动得更快、更远,那么为什么每个参数还要遵循相同的学习率?因为最近梯度的平方告诉我们每一个权重可以得到多少信号,所以我们可以除以这个,以确保即使是最迟钝的权重也有机会发光。Adam 接受了这个想法,在过程中加入了标准方法,就这样产生了 Adam 优化器(稍加调整以避免早期批次出现偏差)!
随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变;Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
Adam 算法是AdaGrad和RMSProp两种随机梯度下降扩展式的优点集合;适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。
Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。
- α:称为学习率或步长因子,它控制了权重的更新比率(如 0.001)。较大的值(如 0.3)在学习率更新前会有更快的初始学习,而较小的值(如 1.0E-5)会令训练收敛到更好的性能。
- β1:一阶矩估计的指数衰减率(如 0.9)。
- β2:二阶矩估计的指数衰减率(如 0.999)。该超参数在稀疏梯度(如在 NLP 或计算机视觉任务中)中应该设置为接近 1 的数。
- ε \varepsilon ε:该参数是非常小的数,其为了防止在实现中除以零(如 10E-8)。
什么是梯度优化算法(GD梯度下降)
SGD-M 在SGD 基础上增加了一阶动量,AdaGrad 和 AdaDelta 在 SGD 基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是 Adam 了——Adaptive + Momentum。
AdamW就是Adam优化器加上L2正则,来限制参数值不可太大,这一点属于机器学习入门知识了。以往的L2正则是直接加在损失函数上,比如这样子:加入正则,损失函数就会变成这样子: