数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
一、Transformer [2017]
循环神经网络
RNN
(尤其是LSTM
、GRU
网络)已经牢牢地被确定为序列建模和转导transduction
问题的state-of-the-art
方法。此后,许多努力继续推动循环语言模型recurrent language model
和encoder-decoder
的发展。循环模型通常沿输入序列和输出序列的
symbol position
来考虑计算。将position
和step
在计算期间对齐aligning
,这些模型生成一系列hidden state
$ \mathbf{\vec h}_t $ ,其中 $ \mathbf{\vec h}_t $ 是前一个hidden state
$ \mathbf{\vec h}_{t-1} $ 和 $ t $ 时刻input
的函数。这种固有的序列性质sequential nature
阻止了训练样本内的并行化,而这种样本内的并行化在更长的序列长度下变得至关重要,因为内存约束限制了样本之间的batching
。最近的工作通过分解factorization
和条件计算conditional computation
显著提高了计算效率,同时在后者的case
中(即,条件计算)也提高了模型性能。然而,序列计算sequential computation
的基本约束仍然存在。注意力机制已经成为各种任务中引人注目的序列建模和转导模型
sequence modeling and transduction model
的组成部分,它允许建模依赖性而无需考虑这些相互依赖的项在input
序列或output
序列中的距离。然而,除了少数情况之外,这种注意力机制与RNN
结合使用。在论文
《Attention Is All You Need》
中,作者提出了Transformer
,这是一种避免循环recurrence
的模型架构。Transformer
完全依赖注意力机制来抽取input
和output
之间的全局依赖关系。Transformer
可以实现更高的并行化,并且在八个P100 GPU
上经过短短12
个小时的训练后就可以在翻译质量方面达到新的state-of-the-art
。背景:
减少序列计算这一目标也构成了
Extended Neural GPU
、ByteNet
、ConvS2S
的基础,它们都使用卷积神经网络作为基础构建块basic building block
,并行地为所有input position
和output position
来计算hidden representation
。在这些模型中,联系relate
来自两个任意input position
或output position
的信号所需操作的数量,随着position
之间的距离而增加:对于ConvS2S
呈线性增加,而对于ByteNet
则呈对数增加。这使得学习远距离位置之间的依赖性变得更加困难。在
Transformer
,这种数量被降低到常数级( $ O(1) $ ),尽管以降低有效分辨率effective resolution
为代价(由于attention-weighted
加权平均 ),但是我们使用多头注意力Multi-Head Attention
来抵消这种影响。自注意力
self-attention
(有时被称作intra-attention
)是一种将单个序列的不同位置关联起来从而计算序列的representation
的注意力机制。自注意力已经成功应用于各种任务,包括阅读理解reading comprehension
、抽象摘要abstractive summarization
、文本蕴含textual entailment
、学习任务无关的sentence representation
。端到端记忆网络
memory network
基于循环注意力机制recurrent attention mechanism
而不是序列对齐循环sequence-aligned recurrence
,并且已被证明在简单的语言问题和语言建模任务中表现良好。
然而,据我们所知,
Transformer
是第一个完全依赖自注意力来计算其input
和output
的representation
而不使用sequence-aligned RNN
或卷积的模型。在接下来部分中,我们将描述Transformer
、自注意力的启发,并讨论它相对于《Neural GPUs learn algorithms》
、《Neural machine translation in linear time》
、《Structured attention networks》
等模型的优势。
1.1 模型
1.1.1 模型架构
大多数有竞争力的神经序列转导模型
neural sequence transduction model
具有encoder-decoder
结构。这里,encoder
将symbol representation
的输入序列 $ \mathbf x = \left(\mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_n\right) $ 映射到continuous representation
的序列 $ \mathbf z = \left(\mathbf{\vec z}_1,\cdots,\mathbf{\vec z}_n\right) $ ,其中 $ n $ 为输入序列长度, $ \mathbf{\vec x}_i $ 为第 $ i $ 个输入symbol representation
(one-hot
向量), $ \mathbf{\vec z}_i $ 为第 $ i $ 个hidden representation
。 给定 $ \mathbf z $ ,decoder
然后生成symbol
的一个输出序列 $ \left(\mathbf{\vec y}_1,\mathbf{\vec y}_2,\cdots,\mathbf{\vec y}_m\right) $ ,一次输出一个元素,其中 $ m $ 为输出序列长度, $ \mathbf{\vec y}_j $ 为第 $ j $ 个输出symbol representation
(one-hot
向量)。在每个step
,模型都是自回归auto-regressive
的,在生成下一个输出symbol
时使用所有前面生成的symbol
作为额外的输入。Transformer
遵循这种整体架构,同时为encoder
和decoder
使用堆叠的self-attention
的和point-wise
的全连接层,分别如下图的左半部分和有半部分所示。下图中的
attention
的三个输入中,最右侧为query
而其它两个输入分别为key,value
。注意,key
的数量和value
的数量相等。Encoder
:encoder
由 $ N = 6 $ 个相同的层堆叠而成。每个层有两个子层:第一个子层是多头注意力机制multi-head self-attention mechanism
, 第二个子层是简单的、position-wise
的全连接前馈神经网络。我们在两个子层中的每个子层周围使用残差连接residual connection
,然后进行layer normalization
。即,每个子层的输出为:其中:
$ \text{Sublayer}\left(\mathbf{\vec x}\right) $ 是子层自己实现的函数。为了有助于这些残差连接,模型中的所有子层以及
embedding layer
都会产生维度 $ d_\text{model} = 512 $ 的输出。注意,图中黄色框内的标注是
Add & Norm
,即Add
在前、Norm
在后,也就是LayerNorm
作用在残差连接之后。Decoder
:decoder
也是由 $ N = 6 $ 个相同的层堆叠而成。decoder
的每个层包含三个子层,其中有两个子层与encoder
子层相同,而第三个子层对encoder stack
的输出执行multi-head attention
。与
encoder
类似,我们在每个子层周围使用残差连接,然后进行layer normalization
。我们还修改了decoder stack
中的self-attention
子层,从而防止它关注后续的position
(即,masked self-attention
)。这种masking
确保对position
$ i $ 的预测只能依赖于位置小于 $ i $ 的已知输出。
1.1.2 Attention
注意力函数可以描述为:将一个
query
和一组key-value pair
映射到output
,其中query, key, value, output
都是向量。output
被计算为value
的加权和,其中每个value
的权重是由一个函数来计算(即,注意力函数),该函数以query, key
作为输入。Scaled Dot-Product Attention
:我们称我们提出的注意力为Scaled Dot-Product Attention
,如下图所示。输入由三部分组成:维度为 $ d_k $ 的query
、维度为 $ d_k $ 的key
、维度为 $ d_v $ 的value
。我们将单个query
和所有的key
计算内积,然后内积的结果除以 $ \sqrt{d_k} $ ,然后对这些内积结果应用softmax
函数从而获得value
的权重。这里要求
query
向量的维度和key
向量的维度相同,都是 $ d_k $ 。在实践中,我们同时计算一组
query
的注意力函数,其中将query
打包到一个矩阵 $ \mathbf Q $ 中。key
和value
也被打包到矩阵 $ \mathbf K $ 和 $ \mathbf V $ 中。我们将output
矩阵计算为:假设有
$ n_q $ 个query
、 $ n_v $ 个key
、 $ n_v $ 个value
(要求key
的数量和value
的数量相同),则:两种最常见的注意力函数为:加性注意力
additive attention
、内积注意力dot-product (multiplicative) attention
。内积注意力与我们的算法相同,除了我们使用了
$ 1/\sqrt{d_k} $ 的缩放因子。因为维度越大,则内积中累加和的项越多,内积结果越大。很大的数值会导致
softmax
函数位于饱和区间,梯度几乎为零。加性注意力通过具有单隐层的前馈神经网络来计算注意力函数。
additive attention
(也称作Bahdanau Attention
) 的原理为:其中:
$ \mathbf {\vec w} $ 为attention
向量,为待学习的参数, $ \sigma(\cdot) $ 为非线性函数。 $ \mathbf{\vec q}_i $ 为第 $ i $ 个query
, $ \mathbf{\vec k}_j $ 为第 $ j $ 个key
, $ \mathbf{\vec v}_j $ 为第 $ j $ 个value
。 $ \mathbf W_q $ 将query
向量映射到公共空间, $ \mathbf W_k $ 将key
向量映射到公共空间,因此query
向量和key
向量可以为不同的维度。它们都是待学习的权重。 $ \alpha_{i,j} $ 给出第 $ i $ 个query
在各个position
的注意力权重,position
的数量为 $ n_v $ 。
虽然这两种注意力在理论上的复杂度相同,但是内积注意力在实践中更快且更节省内存空间,因为它可以使用高度优化的矩阵乘法代码来实现。
Multi-Head Attention
:与执行单个注意力函数attention function
(具有 $ d_\text{model} $ 维的query, key, value
)不同,我们发现将query, key, value
线性投影 $ h $ 次是有益的,其中每次线性投影都是不同的并且将query, key, value
分别投影到 $ d_k, d_k,d_v $ 维。然后,在每个
query, key, value
的投影后的版本上,我们并行执行注意力函数,每个注意力函数产生 $ d_v $ 维的output
。这些output
被拼接起来并再次投影,产生final output
,如上图右侧所示。多头注意力
multi-head attention
允许模型在每个position
联合地关注jointly attend
来自不同representation
子空间的信息。如果只有单个注意力头single attention head
,那么平均操作会抑制这一点。其中待学习的投影矩阵为:
$ \mathbf W_i^Q\in \mathbb R^{d_\text{model}\times d_k} $ 、 $ \mathbf W_i^K\in \mathbb R^{d_\text{model}\times d_k} $ 、 $ \mathbf W_i^V\in \mathbb R^{d_\text{model}\times d_v} $ 、 $ \mathbf W^O\in \mathbb R^{(hd_v)\times d_\text{model}} $ 。在这项工作中,我们使用
$ h=8 $ 个注意力头attention head
。对于其中每个注意力头,我们使用 $ d_k=d_v=d_\text{model}/h=64 $ 。由于每个head
的维度减小,因此总的计算成本与完整维度的单头注意力single-head attention
相近。注意力在
Transformer
中的应用:Transformer
以三种不同的方式使用多头注意力:- 在
encoder-decoder attention
层中,query
来自于前一个decoder layer
,key
和value
来自于encoder
的输出。这允许decoder
中的每个位置关注input
序列中的所有位置。这模仿了sequence-to-sequence
模型中典型的encoder-decoder attention
注意力机制。 encoder
包含自注意力层。在自注意力层中,所有的query, key, value
都来自于同一个地方(在这个case
中,就是encoder
中前一层的输出)。encoder
中的每个位置都可以关注encoder
上一层中的所有位置。- 类似地,
decoder
中的自注意力层允许decoder
中的每个位置关注decoder
中截至到当前为止(包含当前位置)的所有位置。我们需要防止decoder
中的信息向左流动,从而保持自回归特性。我们通过在scaled dot-product attention
内部屏蔽掉softmax input
的某些value
来实现这一点(将这些value
设置为 $ -\infty $ ),这些value
对应于无效连接illegal connection
。
- 在
1.1.3 Position-wise Feed-Forward Networks
除了注意力子层之外,我们的
encoder
和decoder
中的每一层还包含一个全连接的前馈神经网络,该网络分别且相同地应用于每个位置。该网络包含两个线性变换,中间有一个ReLU
激活函数:虽然线性变换在不同位置上是共享的(即,相同的参数),但是它们在层与层之间使用不同的参数。
该层的另一种描述是:
kernel size = 1
的两个卷积,其中input
和output
的维度为 $ d_\text{model} = 512 $ ,而内层的维度为 $ d_\text{ff} = 2048 $ 。 $ \mathbf W_1\in \mathbb R^{d_\text{model}\times d_\text{ff}} $ , $ \mathbf W_2\in \mathbb R^{d_\text{ff}\times d_\text{model}} $ 。这里采用膨胀的方式,选择 $ d_\text{ff} \gt d_\text{model} $ 从而使得representation
维度先增大再减小。
1.1.4 Embeddings and Softmax
与其它序列转导模型类似,我们使用学到的
embedding
将input token
和output token
转换为维度 $ d_\text{model} $ 的向量。我们还使用学到的线性变换和softmax
函数将decoder output
转换为next-token
的预测概率。在我们的模型中,我们在两个
embedding layer
(输入层)和pre-softmax
线性变换(输出层)之间(共计三个权重矩阵)共享相同的权重矩阵,类似于《Using the output embedding to improve language models》
。在embedding
层中,我们将这些权重乘以 $ \sqrt{d_\text{model}} $ 。这里有两个输入层,分别来自于
encoder input
和decoder input
。而输出层来自于decoder
。三个
embedding
矩阵共享的前提是:input symbol
空间和output symbol
空间是相同的,例如,输入是中文的文本,输出是中文摘要,那么input symbol
和output symbol
都是中文单词。否则,encoder
的embedding
矩阵无法和decoder
的 两个embedding
矩阵共享。但是无论如何,decoder
的两个embedding
矩阵之间可以共享。为什么要把
embedding
矩阵乘以 $ \sqrt{d_\text{model}} $ ?论文并未说明原因。有一种解释说是放大embedding
使得它的量级和positional embedding
的量级相同。可以通过实验来验证。
1.1.5 position embedding
由于我们的模型不包含递归和卷积,为了让模型利用序列的次序
order
,我们必须注入一些关于序列中token
的相对位置或绝对位置的信息。为此,我们在encoder stack
和decoder stack
底部的input embedding
中添加了positional encoding
。positional encoding
与embedding
具有相同的维度 $ d_\text{model} $ ,因此可以将二者相加。positional encoding
有很多选择,可以选择固定的也可以选择可学习的。这里我们选择固定的方式,采用不同频率的正弦函数和余弦函数:
其中:
$ j $ 表示position
, $ i $ 表示维度。即,positional encoding
的每个维度对应于一个正弦曲线,正弦曲线的波长从 $ 2\pi $ (当维度 $ i=0 $ 时)到 $ 10000\times 2\pi $ (当维度 $ 2i=d_\text{model} $ 时)。我们选择这个函数是因为我们假设它可以让模型通过相对位置来轻松地学习关注
attend
,因为对于任意固定的偏移量 $ k $ , $ \mathbf{\vec p}_{j+k} $ 可以表示为 $ \mathbf{\vec p}_j $ 的线性函数。我们还尝试使用可学习的
positional embedding
,发现这两个版本产生了几乎相同的结果。我们选择了正弦版本,因为它可以让模型推断出比训练期间遇到的序列长度更长的序列。正弦版本的
positional embedding
可以应用到训练期间unseen
的位置,而可学习的positional embedding
无法实现这一功能。
1.1.6 Why Self-Attention
这里我们将自注意力层与循环层、卷积层进行各个方面的比较。这些层通常用于将一个可变长度的
symbol representation
序列 $ (\mathbf{\vec x}_1,\cdots,\mathbf{\vec x}_n) $ 映射到另一个等长序列 $ (\mathbf{\vec z}_1,\cdots,\mathbf{\vec z}_n) $ ,其中 $ \mathbf{\vec x}_,\mathbf{\vec z}_i\in \mathbb R^d $ 。 为了启发我们使用自注意力,我们考虑了三个方面:每层的总计算复杂度、可并行化的计算量(以所需的最少的序列操作数量来衡量)、网络中远程依赖long-range dependency
的路径长度。学习远程依赖是许多序列转导任务中的关键挑战。影响学习这种依赖的能力的一个关键因素是:前向传播信号和反向传播信号必须在网络中传输的路径长度。
input
序列和output
序列中任意位置组合之间的路径越短,那么就越容易学习远程依赖。因此,我们还比较了由不同类型的层组成的网络中,任意input
位置和output
位置之间的最大路径长度。如下表所示:
自注意力层在所有位置都关联一个
$ O(1) $ 数量的序列操作(即具有最大程度的并行化),而循环层需要 $ O(n) $ 数量的序列操作(即几乎完全无法并行化)。并行化指的是:为了计算指定位置的输出,模型需要依赖已经产生的多少个输出?
在计算复杂度方面,当序列长度
$ n $ 小于representation
维度 $ d $ 时(机器翻译中state-of-the-art
模型常见的case
),self-attention
层比循环层更快。为了提高涉及非常长序列(即
$ n $ 非常大)的任务的计算性能,可以将自注意力限制为仅考虑输入序列中的局部区域,这个局部区域是以输出位置对应处为中心、大小为 $ r $ 的邻域。这会将最大路径长度增加到 $ O(n/r) $ ,同时每层的计算复杂度降低到 $ O(rnd) $ 。我们计划在未来的工作中进一步研究这种方法。具有
kernel width
$ k \lt n $ 的单个卷积层无法连接input position
和output position
组成的所有的pair
。如果希望连接所有的input position
和output position
,则需要堆叠 $ O(n/k) $ 个卷积层(连续核contiguous kernel
) 或 $ O(\log_k(n) ) $ 个卷积层(空洞卷积dilated convolution
),并且增加了网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更昂贵
expensive
(贵 $ k $ 倍)。然而,可分离卷积将计算复杂度显著降低到 $ O(k\times n\times d + n\times d^2) $ 。当 $ k=n $ 时,可分离卷积的复杂度就等于一个自注意力层和一个point-wise feed-forward layer
的组合(这就是我们在Transformer
模型中采用的方法)。
作为附带的好处,自注意力可以产生更可解释的模型。我们从
Transformer
模型中检查注意力的分布,并在下图中展示和讨论了示例。不仅单个注意力头清晰地学习执行不同的任务,而且许多注意力头似乎还表现出与句子的句法结构syntactic structure
和语义结构semantic structure
有关的行为。如下图所示为
encoder
六层自注意力层的第五层中,making
这个单词的多头自注意力分布(不同的颜色代表不同的头,颜色的深浅代表注意力大小)。making
这个单词的自注意力分布似乎倾向于构成短语making ... more difficult
。如下图所示为
encoder
六层自注意力层的第五层中的两个注意力头。上半部分为head 5
的完全的注意力分布(每个单词),下半部分为单词its
在head 5
和head 6
中的注意力分布。如下图所示为
encoder
六层自注意力层的第五层中的两个注意力头。
1.1.7 训练
Training Data and Batching
:我们在由大约
450
万个sentence pair
组成的标准WMT 2014 English-German
数据集上进行了训练。句子使用byte-pair encoding: BPE
(《Massive exploration of neural machine translation architectures》
) 进行编码,该编码有一个共享的source-target vocabulary
,词典规模大约37000
个token
。BPE
算法:- 语料库中每个单词表示为字符的拼接,其中
</w>
表示词尾。 - 将每个单词拆分为字符,并计算字符出现的次数。这些字符添加到词表
vocabulary
。 - 寻找出现频次最高的
character pair
,合并它们并添加到词表。这些合并的character pair
称作word-piece
。 - 重复执行上一步(即,“寻找--合并”),直到词表达到指定的规模。
- 语料库中每个单词表示为字符的拼接,其中
对于
English-French
,我们使用了更大的WMT 2014 English-French
数据集,该数据集由3600
万个sentence pair
组成。这些句子被拆分为token
,并且使用大小为32k
的word-piece vocabulary
。
sentence pair
按照近似的序列长度被batch
在一起。每个训练batch
包含一组sentence pair
,大约共计25k
个source token
和25k
个target token
。硬件和
schedule
:我们在一台配备8
个NVIDIA P100 GPU
的机器上训练我们的模型。- 对于我们的
base model
(使用我们在整篇论文中描述的超参数),每个training step
大约需要0.4
秒。我们对base model
进行了总共100k
步(即12
小时)。 - 对于我们的
big model
(如下表最后一行所示),每个training step
大约需要1.0
秒。我们对base model
进行了总共300k
步(即3.5
天)。
- 对于我们的
优化器:我们使用
Adam optimizer
优化器,其中 $ \beta_1=0.9,\beta_2=0.98,\epsilon=10^{-9} $ 。我们根据以下公式来调整训练期间的学习率:即:
- 在开头的
warmup_steps
训练step
中线性增加学习率。这里我们使用warmup_steps = 4000
。 - 然后根据
step number
的平方根倒数来按比例降低学习率。
为什么除以
$ \sqrt{d_\text{model}} $ ?论文并未给出原因。这样做的效果是:模型越大则学习率越小。- 在开头的
正则化:在训练期间我们使用三种类型的正则化:
Residual Dropout
:我们将
dropout
应用于每个子层的output
,然后将其和子层的input
相加(即残差连接)最后进行layer normalization
。即:此外,我们将
dropout
同时应用于encoder stack
和decoder encoder
中的sum embedding
,这个sum embedding
是embedding
和positional encoding
相加得到的。
对于
base model
,我们使用dropout rate
为 $ P_\text{drop} = 0.1 $ 。Label Smoothing
:在训练期间,我们采用了 $ \epsilon_\text{ls} = 0.1 $ 的label smoothing
。这会损害perplexity
指标,因为模型会变得更加不确定,但是会提高准确率指标和BLEU
得分。语言模型困惑度
perplexity
的定义为:其中
$ \mathcal W $ 为一个序列, $ P(\mathcal W) = P(w_1,w_2,\cdots,w_n) $ 为这个序列的概率。
1.2 实验
1.2.1 机器翻译
配置(所有超参数是在对验证集进行实验之后再选择的):
base model
使用单个模型,该模型是通过平均最后5
个checkpoint
获得的,其中checkpoint
是以10
分钟的间隔写入的。big model
也是会用单个模型,但是它平均了最后20
个checkpoint
。checkpoint
平均指的是参数值取平均(而不是输出结果取平均)。我们使用
beam size = 4
和length penalty
$ \alpha = 0.6 $ 的beam search
。在解码器的每个位置始终生成
beam size
个候选,直到出现结束标记。 $ \alpha $ 用于惩罚较短的生成序列:其中
$ n $ 为序列 $ \mathcal W=(w_1,\cdots,w_n) $ 的长度。 $ n $ 越大则修正后的困惑度越小。我们将推断期间的最大输出长度设置为
input length + 50
,但是在可能的情况下输出会提前结束。
下表总结了我们的结果,并将我们的翻译质量和训练成本,与文献中的其它模型架构进行了比较。我们通过将训练时间、使用的
GPU
数量、以及每个GPU
的单精度浮点运算能力的估计值相乘,从而估计用于训练模型的浮点运算的数量。对于K80, K40, M40, P100
,我们取它们的单精度浮点运算能力分别为2.8, 3.7, 6.0, 9.5 TFLOPS
。WMT 2014 English-to-German
翻译任务:big transformer model
比先前报告的最佳模型(包括ensemble
模型)在BLEU
指标上高出2.0
以上,达到了一个新的state-of-the-art
的BLEU
得分28.4
。big transformer model
在8
个P100 GPU
上训练耗时3.5
天。甚至我们的
base model
也超越了所有先前发布的模型和ensembles
,并且base model
的训练成本仅仅是任何其它有竞争力的模型的一小部分。bilingual evaluation understudy: BLEU
评估机器翻译质量。其思想是:机器翻译结果越接近专业人工翻译的结果,则越好。其中:
BP
为句子简短惩罚Brevity Penalty
,迫使机器翻译的长度与参考翻译的长度接近。其中
$ c $ 为机器翻译的长度, $ r $ 为参考翻译的长度。 $ N $ 代表机器翻译和参考翻译之间的n-gram
匹配最大的n
值。通常1-gram
匹配结果代表有多少个单词被独立地翻译出来,而2-gram
以上的匹配结果代表翻译的流畅度。通常 $ N $ 最大为4
。 $ w_n $ 代表n-gram
匹配结果的权重,通常选择 $ w_n = \frac {1}{N} $ 。 $ p_n $ 衡量机器翻译和参考翻译之间n-gram
匹配结果,即n-gram precision
:其中:
$ \text{Candidates} $ 表示翻译的所有句子的集合, $ \mathcal C $ 表示某个翻译的句子, $ \text{gram}_n $ 表示某个n-gram
项。 $ \text{count}(\cdot) $ 表示某个n-gram
项在所有翻译结果中出现的次数。 $ \text{count-clip}(\cdot) $ 表示某个n-gram
项在所有翻译结果中出现的截断次数:而
$ \text{ground-truth}(\text{gram}_n) $ 为n-gram
项在参考译文中出现的次数。因此这里的“截断”指的是被ground-truth
频次所截断。
WMT 2014 English-to-French
翻译任务:big transformer model
达到了41.0
的BLEU
得分,优于先前发布的所有单一模型,训练成本小于先前state-of-the-art
模型的1/4
。注意:为
English-to-French
而训练的Transformer big model
使用dropout rate
为 $ P_\text{drop} = 0.1 $ ,而不是0.3
。41.0
对不上?从下表结果来看应该是41.8
。
1.2.2 模型变体
为了评估
Transformer
不同组件的重要性,我们以不同的方式改变了我们的base model
,并衡量了验证集(newstest2013
)上English-to-German
翻译性能的变化。我们使用了上一节中描述的beam search
,但是没有使用checkpoint
平均。实验结果如下表所示。在
(A)
行中,我们改变了注意力头的数量以及注意力key, value
的维度,并保持计算量不变。可以看到,虽然单头注意力要比最佳配置差0.9 BLEU
,但是如果head
数量过多效果也会下降。在
(B)
行中,我们观察到降低注意力key
的维度 $ d_k $ 会损害模型质量。这表明确定compatibility function
并不容易确定,采用比内积更复杂的compatibility function
可能是有益的。compatibility function
就是计算未归一化注意力分的函数 $ s_{i,j} = \mathbf{\vec q}_i \mathbf{\vec k}_j^\top $ 。此外,降低
$ d_k $ 降低了模型容量(模型参数从65M
降低到60M
和58M
)。在
(C)
行中,我们观察到,正如预期的那样,更大的模型更好。在
(D)
行中,我们观察到,dropout
和label smoothing
有助于缓解过拟合,但是需要选取合适的dropout rate
和label smoothing rate
。在
(E)
行中,我们用可学习的positional embedding
代替固定的正弦positional encoding
,并观察到与base model
几乎相同的结果。
1.2.3 English Constituency Parsing
为了评估
Transformer
是否可以泛化到其它任务,我们对英语成分分析English constituency parsing
任务进行了实验。这项任务提出了特定的挑战:output
受到强烈的结构性约束,并且明显比input
更长。此外,RNN sequence-to-sequence model
无法在小数据领域获得state-of-the-art
结果。我们在
Penn Treebank
的Wall Street Journal: WSJ
部分(大约40k
个训练句子)上训练了一个 $ d_\text{model} = 1024 $ 的4
层transformer
。对于该任务,我们使用16k token
的词典vocabulary
。我们还在半监督环境中训练了相同配置的
transformer
,使用来自大约1700
万个句子的更大的high-confidence
和BerkleyParser
的数据集。对于该任务,我们使用32k token
的词典。我们仅在
Section 22
验证集上进行了少量实验来选择以下超参数:dropout
(attention
和residual
上的dropout
)、学习率、beam size
。所有其它超参数保持与English-to-German base translation model
相同。在推断期间,我们将最大输出长度增加到input length + 300
。对于WSJ only
和半监督任务,我们都使用beam size = 21
和 $ \alpha = 0.3 $ 。实验结果如下表所示,可以看到:
- 尽管缺乏对特定任务的调优,但是我们的模型表现得非常好,比除了
Recurrent Neural Network Grammar
之外的所有先前报告的模型得到了更好的结果。 - 与
RNN sequence-to-sequence model
相比,即使仅在具有40k
个句子的WSJ
训练集上进行训练,Transformer
的性能也超越了Berkeley- Parser
。
- 尽管缺乏对特定任务的调优,但是我们的模型表现得非常好,比除了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论