追溯XLNet的前世今生:从Transformer到XLNet
作者丨李格映
来源 | 转载自CSDN博客
导读:2019 年 6 月,CMU 与谷歌大脑提出全新 XLNet,基于 BERT 的优缺点,XLNet 提出一种泛化自回归预训练方法,在 20 个任务上超过了 BERT 的表现,并在 18 个任务上取得了当前最佳效果!从 BERT 到 XLNet,预训练模型在不断进步,本文将解读 XLNet 的诞生过程,回顾它的前世今生。
前言
正当 GPT-2 还拿着 15 亿参数的模型吊着人们的胃口时,XLNet 带着开源的代码和 20 项 SOTA 的成绩悄悄发布了。从 BERT 到 XLNet,大一统预训练模型的成功,无疑昭示着行业的快速进步。现在是最好的时机。回到正题,本文虽篇幅较长,但能提供不一样的视角,帮你迅速理清模型的细节。废话不多说,笔者这就将带你快速品读,XLNet 诞生之路上最重要的三篇论文:
Attention Is All You Need (12 Jun. 2017)
Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context (9 Jan. 2019)
XLNet: Generalized Autoregressive Pretraining for Language Understanding (19 Jun. 2019)
一、Attention Is All You Need
论文链接:https://arxiv.org/abs/1706.03762
代码链接:https://github.com/tensorflow/tensor2tensor
这篇论文诞生于 2017 年 6 月,彼时 RNN、LSTM、GRU 早已名扬天下,发迹于 2015 年的 Attention 机制也在经历各种变形的考验,两者相互合作,占据了 NLP 的半边天。循环神经网络最大的缺陷,在于其序列依赖性,上一时刻输出的隐藏状态(以及 LSTM 的记忆细胞)和本时刻的输入共同作为新一轮的单元细胞处理材料,如此往复。
出于自回归的特性,单单凭借一到两个矩阵完整而不偏颇地记录过去几十个甚至上百个时间步长的序列信息,显然不太可能,其权重在训练过程中反复调整,未必能刚好应用到测试集的需求上。更不用提训练时梯度消失导致的难以优化的问题。这些缺陷从 LSTM 的单元公式便足以看出。后续新模型的开创者们始终没有推出一个可以完美解决以上问题,同时保证特征抽取能力的方案,直到 Transformer 出现。(下图为应用于文本摘要任务的模型结构示例,结构为双向 LSTM 搭配 Attention 机制)
在各种情景下历经切除试验而始终保持稳健性的 Attention 机制不能抛弃,于是 Transformer 的发明者选择将其保留,而彻底摒弃循环神经网络的设计架构。取而代之的,是回炉再造后焕然新生的 Attention 机制,叫做 Self-Attention,意为 “Attention on oneself”。
▌Attention机制
在介绍 Self-Attention 前,我们首先回顾一下 Attention 机制的原理,委屈一下对 Attention 机制熟悉的读者。Attention 机制的目的是作为 Encoder 的附加层,提取更为丰富的特征信息。其核心在于三个要素:Query, Key 和 Value,公式如下,
Attention(Q,K,V)=Similarity(Q,K)V
其中分dk一般为词向量的维度。在此基础上进一步变形,将 Query, Key, Value 经过多组线性变换后分别放入 Scaled Dot-Product Attention,对得出的结果进行合并并进行二次线性变换,这样的 Attention 机制称为 Multi-Head Attention:
在另一方面,以上问答系统案例中的 Query 和 Key 分别来自与文本和问题有关的隐藏状态,而当 Query 和 Key 来自同一组对象时,即计算相似度时我们将词向量与文本本身的其他词向量组合求相似度,不引用任何其他信息,这样的 Attention 机制称为 Self-Attention。自注意力输出的特征直接替换原隐藏状态,不再与其合并。以上四者的结合便是 Attention 机制在 Transformer 中的应用,更多细节我们将在下文中介绍。除以上几者之外,Attention 还有诸多不同的变形方式,包括拼接后导入感知机代替点积进行相似度计算,以及以加权平均的方式代替 Attention 输出特征与 Query 的纵向合并,感兴趣的读者可自行了解。
▌Transformer
使用循环神经网络搭配 Attention 机制进行各种变形形成 Encoder,再接一个作为输出层的 Decoder 形成 Encoder-Decoder 架构,是 Transformer 诞生前夕各类主流 NLP 神经网络的设计思路。
例如动态协同注意网络 (Dynamic Coattention Network, DCN) 使用作为 Encoder 的单向 LSTM + 协同注意力编码器对来自文本和问题的隐藏状态进行多次线性/非线性变换、合并、相乘后得出联合矩阵,再投入由单向 LSTM、双向 LSTM 和 Highway Maxout Networks (HMN) 组成的动态指示解码器 (Dynamic Pointing Decoder) 导出预测结果;双向注意流网络 (Bi-Directional Attention Flow, BiDAF) 除特殊的由循环神经网络构成的结构外,同时使用问题到文本和文本到问题的注意力矩阵提取特征。
在问答领域还包括 DrQA、AoA、r-Net 种种变形后表现有所提升的模型,其他领域则更多。但无论如何,始终摆脱不掉 RNN 或 CNN 的影子。
Transformer 超脱于其中,是第一个使用自注意力机制,彻底摆脱循环或卷积神经网络依赖的模型。模型结构如下:
左侧和右侧分别是基础的 Encoder 单元和 Decoder 单元,两者搭配在一起组成一个 Transformer 层 (Transformer-layer)。为行文清晰,我们将模型细节由浅入深,整理为以下要点:
Inputs:模型的训练基于单向 many-to-many,不要求 Inputs 和 Outputs 的长度相等,两者不等长时将空缺部分填充为 0 向量。
Outputs (shifted right):在一般任务下,模型训练的目的为预测 next token probability,从而保持 Inputs 和 Outputs 等长,Outputs 取自于文本中相对于 Inputs 右移一个位置,即 shifted right;在进行翻译任务的训练时,则输入一个不等长的句子对。
Nx:论文中的 Transformer 深度为六层。在每一层的结尾,Encoder 输送隐藏状态给下一层 Encoder,Decoder 同理。
三个箭头:通向每个注意力层的三个并列的箭头从左到右分别为 Value、Key 和 Query。Encoder 在每一层将隐藏状态通过线性变换分化出 Key 和 Value 输送给 Decoder 的第二个注意力层。
Input Embedding:使用预训练词向量表示文本内容,维度为 dmodel ,论文中 dmodel=512.
Positional Embedding:依据单词在文本中的相对位置生成正弦曲线,以记录序列长度信息,针对 pos pospos 位置上的奇数维和偶数维,
Masked Multi-Head Attention:仅应用于 Decoder 的第一个注意力层。在 Multi-Head Attention 的基础上做 Masking 处理,其目的在于计算某一位置 Self-Attention 时不利用到右侧我们将要预测的信息,所有与右侧位置的点积不参与计算,直接取值为 −∞,这样一来经过 Softmax 归一化处理,右侧位置的权重将接近于 0。
Linear:输出模型结果的概率分布,输出维度为预测目标的词汇表大小。
以上概括虽简短,但皆是论文内容的高度浓缩,相信读者到这里已经非常清楚 Transformer 的架构了。由于引入了自注意力机制,Transformer 避免了使用自回归模型提取特征的弊端,得以充分捕获近距离上文中的任何依赖关系。不考虑其优良的并行特性,在应对文本总长度小于词向量维度的任务时 (例如机器翻译),模型的训练效率也显著高于循环神经网络。夸归夸,Transformer 也有不足之处。之所以说是捕获近距离的任何依赖关系,是因为论文没有提到,当输入文本的固定长度持续增长时,其训练时间也将呈指数上涨。也因此,Transformer 的序列建模长度不如 LSTM,输入句子对是标准的训练形式。
▌成绩
论文作者在两项机器翻译任务上训练 Transformer,并刷新了历史最佳成绩。分别为 WMT 2014 年英德翻译数据集 (包含450万个句子对),和 2014 年英法翻译数据集 (包含3,600万句子对)。前者预测的是德语语料的双字节编码 (byte-pair encoding),词汇大小为 37,000,后者则是纯粹的单词,共计 32,000 个。
每次投入包含 25,000 个源语言词汇以及 25,000 个目标语言词汇的句子对批量进入模型训练。训练在 8 块 Nvidia P100 GPU 上进行,依据上文所述超参数进行配置的基础模型使用了 12 个小时训练了 100,000 个步长,平均每个步长耗时 0.4 秒;而经过反复调参,表现最好的大参数模型花费 3.5 天训练了 300,000 个时间步长,每个步长耗时 1 秒。
优化器选用 Adam Optimizer。训练时采用了三种正则化方式:1)在每一个注意力层和前馈层后接一个概率为 Pdrop=0.1 的 Dropout 层;2)在将 Input 或 Output Embedding 和 Positional Embedding 进行加法运算后以同样的概率随机 Dropout;3)对模型标签采用 els=0.1 的平滑处理。这三种方式都一定程度地提高了模型的泛化能力。更多细节请读者自行参考论文。
最终 Transformer 在第一个任务上将历史最佳表现提升两个百分点到 BLEU 28.4,第二个任务提升 0.5 个百分点到 BLEU 41.8。除这两个任务以外,论文阐述了在英文句法分析 (Consituency Parsing) 上也取得了不错的效果。
Transformer 最大的成就在于引入自注意力机制,摆脱了序列模型自回归式的设计。由于没能在实际任务的应用上大范围地刷新 RNN 系模型的成绩,因而没有引起如同 BERT 和 XLNet 诞生之时的轰动。在此期间,仍然有大量的学者致力于研究 LSTM 梯度消失问题的解决方案,包括调整参数初始化,增强记忆结构,调整单元架构等等,没有将注意力放在 Transformer 上。正是借助 OpenAI GPT、BERT 这些表现亮眼的上层模型,Transformer 才在一两年后逐渐奠定它的江湖地位。
二、Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
论文链接:https://arxiv.org/abs/1901.02860
代码链接:https://github.com/kimiyoung/transformer-xl
这篇论文发布于今年年初 (9 Jan. 2019)。论文中,Transformer-XL 旨在于解决长期以来困扰 NLP 界的难题:捕捉长距离依赖关系,这也是其名称的由来 XL: extra long。有学者研究表明,LSTM 的平均上下文长度为 200 (Transformer 低于 50)。而在同等的计算力下,Transformer-XL 最终可以捕获的依赖关系距离比循环神经网络远 80%,更超出 Transformer 450%。
这还不够,next token prediction 速度更是 vanilla Transformer (Transformer 在字符级和深度上的改良版本) 的 1,800+ 倍。这其中的秘诀在于 Transformer-XL 对自注意力机制引入的两项调整 —— 循环机制 (recurrence mechanism) 和 相对位置编码 (relative positional encoding)。但 Transformer-XL 和 Transformer 的区别还远不止于此,我们会在下文中逐步展开相关介绍。
▌Vanilla Transformer
两者还存在诸多区别的原因,在于 Transformer-XL 并非直接从 2017 年发布的原始 Transformer 演化而来,而是一个叫 vanilla Transformer 的版本。该版本首次出现在 Rami Al-Rfou 等人于 2018 年发布的 Character-Level Language Modeling with Deeper Self-Attention (9 Aug. 2018),论文链接。(该论文中并没有提到 vanilla 的字样,至于本文作者为何称呼该模型为 vanilla,笔者暂未找到答案,尚且沿用这一称呼)。
Vanilla Transformer 将 Transformer 的深度扩展到 64 层,并应用了 标准 Transformer 架构 (standard Transformer architecture):将每一层中的 Decoder 剔除,并将 Encoder 中的自注意力层改为 Masked 自注意力层,由此一来模型结构大大简化,使得 Transformer 具备成为优秀特征提取器的资质 (如同当年 RNN 那样)。在下文中介绍 BERT 和 XLNet 时我们将会多次提到这一概念。
Vanilla Transformer 还引入了一些其他独特的设计,包括在中间层添加辅助损失函数提前参与收敛,这里不进行赘述。训练时,首先将完整的语料分成若干个等长的 segment,计算 self-attention 不考虑本 segment 以外的语料信息,由此预测 segment 内部的 next token probability。而在推理 (预测) 时,逐字划分 segment 边界,每过一个时间步长则向右滑动一个单位。如下图所示:
本论文指出,这样的设计存在两个重要缺陷:1)捕捉长距离依赖关系依然受限于 segment 的长度,同时无法充分利用自注意力机制的优化优势;2)将语料序列直接划入等长的 segment 将把句子横空切断,造成上下文碎片化 (context fragmentation)。
▌循环机制
爱之深,责之切。批评过后,论文提出了解决方案:循环机制。同 vanilla Transformer 一样,将语料事先划分为等长的 segments,训练时将每一个 segment 单独投入计算 self-attention。每一层输出的隐藏状态作为记忆存储到内存中,并在训练下一个 segment 时,将其作为额外的输入,代表上文中的语境信息。这样一来便在上文与下文之间搭建了一座桥梁,使得模型能够捕获更长距离的依赖关系:
数学上,假设两个相邻的 segment 分别为,
▌Transformer-XL
将循环机制和相对位置编码结合起来,也就得到了完整的 Transformer-XL 模型。最终表达式为,
▌成绩
Transformer-XL 承袭了 vanilla Transformer 适用于字符级 (character-level) 任务的特性,并能够连续生成包含数千个字符的文本 (尚且不知同等参数量下,生成效果和后来大名鼎鼎的 OpenAI GPT-2 相比如何)。
论文作者将 Transformer-XL 广泛应用在词汇级和字符级的数据集上,包括 WikiText-103,enwik8,text8,One Billion Word,以及 Penn Treebank。前三个数据集重在检测长距离依赖关系的捕捉能力,Transformer-XL 不负所望,所有表现皆优于当下 SOTA 模型;
第四个数据集 One Billion Word 由于句子被打乱,考验的是短距离依赖关系的捕捉能力,Transformer-XL 依旧刷新了最佳成绩;第五个数据集体量仅有100万,不足前四者的百分之一,考验的是小数据集训练后的泛化能力,Transformer-XL 表现仍然亮眼。模型设置方面,注意力长度 O(N×L) O(N\times L)O(N×L) 训练时从 384 起底,最高 784,而预测时 Large 模型更是达到了原来不可想象的 3,800 的高度;Encoder 和 Decoder 层数从 12 层到 24 层不定。
▌RECL
abbr. Relative Effective Context Length。在论文的结尾,作者提出了将 RECL 作为判断模型有效文本利用长度的基准,换句话说,衡量模型对长距离关系的捕获能力。原理在于找出 r rr 百分比个最难预测的 token,求得能极小化损失函数的注意力长度。设定 r=0.1 r=0.1r=0.1,Transformer-XL 最终的成绩为 900,这便是前文中 80% 和 450% 数字的由来:
而在预测速度上,1,800+ 的数字来自于:
既能捕获长距离依赖关系,也能充分利用短距离依赖关系,Transformer-XL 名副其实地成为第一个同时在字符级和词汇级任务上超越循环神经网络的自注意力模型,并在为构建集成网络,刷新问答、分类、推理等 NLP 领域的成绩做着全面的准备。
三、XLNet: Generalized Autoregressive Pretraining for Language Understanding
论文链接:https://arxiv.org/abs/1906.08237
代码链接:https://github.com/zihangdai/xlnet
6 月 19 日,带着 Transformer-XL 的优良特性,XLNet 终于问世。自一月份 Transformer-XL 的论文发布以来,已过去五个月。期间,擅长暴力美学,堆砌训练材料和参数体量的 GPT-2 (16 Feb. 2019) 因续写文章表现出色,难以辨识真假,引发一阵道德舆论风暴。
但在模型设计本质上,GPT-2 相对于 GPT 并未获得具有价值的创新,因而论文中鲜有涉及 GPT-2 的讨论。相对地,无论是最终的模型表现,还是部分细节的设计初衷,XLNet 都和 BERT 紧密相关。因此读懂这篇论文,需要对 BERT 的原理有基本的了解。如果你对 BERT 不甚熟悉,没关系,笔者将带着你一起回顾。
▌BERT
如果说 BERT 的出现代表基于 Transformer 的自注意力派系彻底战胜基于 RNN 的自回归系,那么 XLNet 则是出自自注意力派系门下,融合两家武学之长的集大成者。BERT 出自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (11 Oct. 2018),论文链接。以下是 BERT 的结构:
由图我们看出,BERT 由双层双向 Transformer 构建而成,训练分为两个步骤:预训练 (pre-training) 和 微调 (find-tuning)。预训练是为了在输入的词向量中融入上下文特征,微调则是为了使 BERT 能适应不同的下游任务,包括分类、问答、序列标注等,两者是独立进行的。
由此我们可以看出,BERT 是一个普适性非常强的模型,而不像过去几年中很多为特定任务设计的模型 (feature-based task-specific models) 那样,只能应用于单一场景 ,这为 BERT 刷新 11 项记录奠定了基础。预训练时,BERT 采用的策略与标准 Transformer 不同的地方在于,后者是基于预测 next token,只在输入句子的结尾进行预测;而前者预测的是句子本身,只是输入时 15% 的 token 被随机遮盖 (mask) 掉了,这便是 BERT 独特的 Mask 机制,也是众多 data corruption 方式中的一种。而 BERT 在标准 Transformer 的位置编码基础上,还添加了一项 segment 编码,如下图:
这是 BERT 预训练时最标准的输入形式。每个训练步长,BERT 输入句子 A,然后以 50% 的概率选择下一个连续的句子作为 B,另外 50% 的概率是从语料中随机抽取不连续的 B 取而代之。这便是 BERT 论文中所提到的 Next Sentence Prediction。因此模型训练时的输出除了完整的句子本身外,还有一个是或否的标签,判断两个句子是否连续。
这样设计的初衷在于增强 BERT 的上下文推理能力。以上是预训练,在微调时,只需要改变模型的输入和输出即可。关于 BERT 的简短介绍就进行到这里。最终,BERT 在以下十一个任务上取得了 SOTA 成绩:
分类及推理:GLUE (MNLI, QQP, QNLI, STS-B, MRPC, RTE, SST-2, CoLA), SWAG
序列标注:CoNLL-2003 NER
问答:SQuAD
由于 BERT 不是本文的重点,更多细节请读者自行参读论文,或参考网络博客 (出于 BERT 的知名度,网上的解读非常详尽)。以下将会经常提到关于 BERT 的以上内容。
▌有序因子排列
BERT 与 XLNet 的首要不同在于,BERT 底层应用的是 Mask 机制下的 标准 Transformer 架构,而 XLNet 应用的是在此基础上融入了自回归特性的 Transformer-XL。前者无论是在训练还是预测,每次输入的文本都相互独立,上一个时间步长的输出不作为下一个时间步长的输入;而传统的循环神经网络正好相反。
论文将满足前者特性的模型归类于 自编码 (autoencoding, AE) 语言模型,而把 RNN 系归类于自回归 (autoregressive, AR) 语言模型。以 BERT 为首的自编码模型虽可以学得上下文信息,但在 data corruption 设计上存在两个天然缺陷:
1)忽视了训练时被 Mask 掉的 token 之间的相关关系;
2)这些 token 未能出现在训练集中,进一步导致预训练的模型参数在微调时产生差异。而自回归模型虽不存在以上缺陷,但只能基于单向建模。双向设计 (如 GPT 的双层 LSTM) 将产生两套无法共享的参数,本质上仍为单向模型,利用上下文语境的能力有限。
不同的排列方式,使模型的训练充分融合上下文特征,同时不会造成 Mask 机制下的有效信息缺失,从而使模型充分利用自编码和自回归的优势,而避免了两者的不足。这样独特的思路并不是创造 XLNet 的学者们拍拍脑袋想出来的,而是借鉴了发表于 2016 年的一篇论文中的思想,只不过后者对元素的排列并没有如同 XLNet 进行有序的规划,而是全程无序的,论文指出这样的思路会使序列退化为词袋,从而丢失关键信息,因而做出调整。
▌双流自注意力
双流自注意力 (Two-Stream Self-Attention) 为配合有序因子排序而生,是相对于 Transformer-XL 的单流自注意力而言的。由于论文没有对 Transformer-XL 展开详细的介绍,因此不熟悉 Transformer-XL 的读者读到这里会觉得晦涩难懂 (笔者在阅读本论文前看了几篇知名博主发布的关于 XLNet 的解读,都没能将它解释清楚)。鉴于此,笔者会在后面详细解释相关要点,我们先依旧按照论文的逻辑展开。第一步,先尝试将有序因子排列应用在 Transformer-XL 上。似然函数表达式:
当读者看到上述公式中 Query Stream 的 Key 和 Value 用的是来自 Content Stream 的隐藏状态时,应当非常熟悉,这正是 2017 年发布的第一代 Transformer 的设计:将固定长度的语料作为 Inputs 导入 Encoder,而将语料整体向右移动一个字符作为预测对象 Outputs 导入 Decoder;Inputs 经过一个自注意力层和一个前馈层后,从输出结果中分离 Key 和 Value 给 Decoder;Decoder 经过一个 Mask 自注意力层后保留 Query,接收来自于 Encoder 的 Key 和 Value 进行进一步运算。
对以上过程不熟悉的读者可参读本文第一节。而在第二节中我们提到过,Transformer-XL 由 vanilla Transformer 演变而来,使用的是标准 Transformer 架构。这个架构本身的特点在于 Query 和 Key 你我不分家,两者通过不同的参数从一个矩阵线性 (隐藏状态) 变换而来;继续往下追溯,两者取自同一块语料;属于单流自注意力设计。因此双流自注意力实际上是 XLNet 为了配合有序因子排列,而将 Transformer-XL 的结构还原回初代 Transformer 的架构。Query Stream 中剔除 等同于初版 Transformer 中 Decoder 对 Query 的 Mask 操作。
回到论文内容。这时的模型已经可以投入使用,但经过试验发现,有序因子排序增加了数倍的计算量使得模型的收敛速度过于缓慢,为此 XLNet 引入一项超参数 K KK,只对排列尾部的 1/K 1/K1/K 个元素进行预测,最大化似然函数。如此以来效率大大提高,而同时不用牺牲模型精度。这个操作称为 partial prediction,同 BERT 只预测 15% 的 token 类似。
▌XLNet
关于模型的设计还有以下要点:
Transformer-XL:关于 Transformer-XL 中的循环机制 (recurrence mechanism) 以及相对位置编码 (relative position encoding),应用到 XLNet 中并没有发生改变。XLNet 会为每一种排列记录隐藏状态记忆序列,而相对位置编码在不同排列方式间保持一致,不随排列方式的变化而变化。以一句话作为总结,我们可以将 XLNet 看成是不同排列下多个 Transformer-XL 的并行。
训练过程:与 BERT 同样分为预训练和微调。预测时只需要关闭 Query Stream,将 Transformer-XL 再度还原回单流注意力的标准形态即可。
问答任务:应用于提供一个问题和一段文本的问答任务时,仿照 BERT,从语料中随机挑选两个样本 segment 组成一个完整的 segment 进行正常训练。只有当两者来自于同一个上下文范围时使用循环机制。而对于相对位置编码,使用可训练参数替换原来的正弦曲线。经过切除测试 (ablation study),BERT 中的 next sentence prediction 并未对模型效果有显著提高,因此不使用。
到这里,XLNet 的介绍也就基本结束了。
▌成绩
集百家之长,避百家之短的 XLNet 融汇了过去几年里几乎所有相关模型的先进思想,成为超越 BERT 的又一个大一统的集成模型,并在 20 项任务上全面超越前者。其中,18 项任务创造了 SOTA 记录:
分类:GLUE (MNLI, QNLI, STS-B, MRPC, RTE, SST-2, WNLI), RACE, IMDB, Yelp-2, Yelp-5, DBpedia, AG, Amazon-2, Amazon-
文档排序:NDCG@20, ERR@20
问答:SQuAD
XLNet 同时克服了自编码模型和自回归模型的缺陷,并出于 Transformer-XL 优秀的长距离依赖关系捕捉能力,对 BERT 的表现形成碾压趋势。其中最大体量的 XLNet-Large 参照 BERT-Large 的配置,包含 3.4 亿参数,16 个注意力头,24 个 Transformer 层,1024 个隐藏单元。论文指出即使是这样的配置,在训练过后依然呈现欠拟合的态势,而 15 亿参数量 GPT-2 的诞生无疑也预示着,将来 NLP 前沿模型将会持续保持大体量和大规模。
这对各项任务的数据提出了更高的要求。更有专业人士研究表明,XLNet 的训练成本高达 6 万美元,接近 BERT 的 5 倍 和 GPT-2 的 1.5 倍。我们期待未来的 NLP 前沿模型能适用于更多的 NLP 任务以及更小的数据集。
后续
XLNet 的官方 Github 地址 提供了使用预训练模型参数,以及应用于单场景下游任务 (回归/分类/SQuAD) 的微调 (fine-tuning) 教程。目前只发布了包含了 24 层自注意力,1024 个隐藏单元和 16 个注意力头的 XLNet-Large (TensorFlow 1.13.1, Python 2),将于近期发布 XLNet-Base,请读者自行关注官方网址以跟进动态。
作者介绍:
李格映,数据科学专业研究生,来自于香港中文大学(深圳)高等金融研究院,目前就职于华为 (实习)。在自然语言处理的命名实体识别、问答系统领域具备一定研究经验。
原文链接:
https://blog.csdn.net/weixin_43269174/article/details/94323036
(*本文为 AI科技大本营转载文章,转载请联系原作者)
◆
精彩推荐
◆
“只讲技术,拒绝空谈!”2019 AI开发者大会将于9月6日-7日在北京举行,这一届AI开发者大会有哪些亮点?一线公司的大牛们都在关注什么?AI行业的风向是什么?2019 AI开发者大会,倾听大牛分享,聚焦技术实践,和万千开发者共成长。
目前,大会盲订票限量发售中~扫码购票,领先一步!
推荐阅读
扶稳!四大步“上手”超参数调优教程,就等你出马了 | 附完整代码基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法
10个简单小窍门带你提高Python数据分析速度(附代码)
Python手写线性回归算法
程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
抖音微博等短视频千万级高可用、高并发架构如何设计?
为何 5G、物联网和区块链,可以成为科技铁三角?

相关文章:

微软MCITP系列课程
http://liushuo890.blog.51cto.com/5167996/d-1转载于:https://blog.51cto.com/showcart/1156172

在Ubuntu11.10中安装配置OpenCV2.3.1和CodeBlocks
1、 打开终端; 2、 执行指令,删除ffmpeg and x264旧版本:sudo apt-get removeffmpeg x264 libx264-dev 3、下载安装x264和ffmpeg所有的依赖:sudo apt-get update sudo apt-get installbuild-essential checkinstall git cmake…

深入浅出Rust Future - Part 1
本文译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 1,时间:2018-12-02,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示 Rust中文社区首页Rust…

cmd 修改文件属性
现在的病毒基本都会采用一种方式,就是将病毒文件的属性设置为系统隐藏属性以逃避一般用户的眼睛,而且由于Windows系统的关系,这类文件在图形界面下是不能修改其属性的。但是好在Windows还算做点好事,留下了一个attrib命令可以让我…

Django 视图
Django之视图 目录 一个简单的视图CBV和FBV FBV版:CBV版:给视图加装饰器 使用装饰器装饰FBV使用装饰器装饰CBVrequest对象 请求相关的常用值属性方法Response对象 使用属性JsonResponse对象Django shortcut functions render()redirect()Django的View&am…

喜大普奔!GitHub官方文档推出中文版
原创整理 | Python开发者(ID:PythonCoder)最近程序员交友圈出了一个大新闻,GitHub 帮助文档正式推出中文版了,之前一直都是只有英文文档,看起来费劲不方便。这份中文文当非常详尽,可以说有了它 …

Linux中获取当前程序路径的方法
1、命令行实现:转自:http://www.linuxdiyf.com/viewarticle.php?id84177 #!/bin/sh cur_dir$(pwd) echo $cur_dir 注意:在cur_dir后没空格,后面也不能有空格,不然它会认为空格不是路径而报错 2、程序实现…

android 关于字符转化问题
今日在写android的客户端,发现字符转化是个大问题。 下面是Unicode转UTF-8的转化,便于以后使用 private static String decodeUnicode(String theString) { char aChar; int len theString.length(); StringBuffer outBuffer new Strin…

30分钟看懂XGBoost的基本原理
作者 | 梁云1991转载自Python与算法之美(ID: Python_Ai_Road)一、XGBoost和GBDTxgboost是一种集成学习算法,属于3类常用的集成方法(bagging,boosting,stacking)中的boosting算法类别。它是一个加法模型,基模型一般选择树模型&…

Linux下遍历文件夹的实现
转自:http://blog.csdn.net/wallwind/article/details/7528474 linux C 遍历目录及其子目录 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h&…

如何用Python画一棵漂亮的树
Tree海龟绘图turtle 在1966年,Seymour Papert和Wally Feurzig发明了一种专门给儿童学习编程的语言——LOGO语言,它的特色就是通过编程指挥一个小海龟(turtle)在屏幕上绘图。 海龟绘图(Turtle Graphics)后来…

windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
1、从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-windows-i586.exe,安装到D:\ProgramFiles\Java,并将D:\ProgramFiles\Java\jdk1.7.0_02\bin添加到环境变量中; 2、从http://www.ec…

外观模式 - 设计模式学习
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功能完成…

Google最新论文:大规模深度推荐模型的特征嵌入问题有解了!
转载自深度传送门(ID: gh_5faae7b50fc5)导读:本文主要介绍下Google在大规模深度推荐模型上关于特征嵌入的最新论文。 一、背景大部分的深度学习模型主要包含如下的两大模块:输入模块以及表示学习模块。自从NAS[1]的出现以来&#…

[20181204]低版本toad 9.6直连与ora-12505.txt
[20181204]低版本toad 9.6直连与ora-12505.txt--//我们生产系统还保留有一台使用AMERICAN_AMERICA.US7ASCII字符集的数据库,这样由于toad新版本不支持该字符集的中文显示.--//我一直保留toad 9.6的版本,并且这个版本是32位的,我必须在我的机器另外安装10g 32位版本的客户端,这样…

Google揭露美国政府通过NSL索要用户资料
当美国联邦调查局FB或其他美国执法机构进行有关国家安全的调查时,能通过一种“国家安全密函National Security ,NSL)”向服务商索取其用户的个人资料,由于事关国家安全,因此该密函并不需经法院同意。但根据美国电子通讯隐私法的规…

Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
1、 打开新立得包管理器,搜索JDK,选择openjdk-6-jdk安装; 2、 打开Ubuntu软件中心,搜索Eclipse,选择Eclipse集成开发环境,安装; 3、 打开Eclipse,File-->New-->Java Proj…

比Hadoop快至少10倍的物联网大数据平台,我把它开源了
作者 | 陶建辉转载自爱倒腾的程序员(ID: taosdata)导读:7月12日,涛思数据的TDengine物联网大数据平台宣布正式开源。涛思数据希望尽最大努力打造开发者社区,维护这个开源的商业模式,他们相信不将最核心的代…

Script:挖掘AWR实现查询SCN历史增长走势
AWR中记录了快照时间内calls to kcmgas的统计值,calls to kcmgas的意义在于通过递归调用获得一个新的SCN,该统计值可以看做SCN增长速度的主要依据,通过挖掘AWR可以了解SCN的增长走势,对于我们诊断SCN HEADROOM问题有所帮助&#x…

运动目标检测__光流法
以下内容摘自一篇硕士论文《视频序列中运动目标检测与跟踪算法的研究》: 1950年Gibson首先提出了光流的概念,光流(optical flow)法是空间运动物体在观测成像面上的像素运动的瞬时速度。物体在运动的时候,它在图像上对应点的亮度模式也在做相…

读完这45篇论文,“没人比我更懂AI了”
作者 | 黄海广 转载自机器学习爱好者(ID:ai-start-com) 导读:AI领域的发展会是IT中最快的。我们所看到的那些黑科技,其后无不堆积了大量论文,而且都是最新、最前沿的论文。从某种角度来讲,它们所用的技术跟…

深入理解JVM——虚拟机GC
对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活。这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当…

2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总
作者 | 苏克1900来源 | 高级农民工(ID:Mocun6)【导语】最近 GitHub 上一个库火了,总结了 阿里、腾讯、百度、美团、头条等国内主流大厂的技术面试题目,目前 Star 2000,还在持续更新中,预计会火下…

华胜天成ivcs云系统初体验2
重启完成以后,就看到传统的linux init3级别的登录界面。输入用户名root 密码:123456 (默认)接下来的工作是配置一些东西,让它跑起来。首先,要修改IP地址,还有机器名。输入命令:ivcs…

OpenCV中响应鼠标信息cvSetMouseCallback函数的使用
转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h> #include <highgui.h> #include <stdio.h void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** …

日常遇到的一些问题或知识的笔记(一)
1、坑爹的sessionStorage 一直以为sessionStorage、localStorage跟cookie一样,只要存在,整个域名下都可见,直到新开了一个窗口tab页,惊奇的发现下面的sessionStorage丢失了! Web Storage 包含如下两种机制:…

你是“10倍工程师”吗?这个事,国外小伙伴们都快“吵”起来了
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,推特上一个话题“10x工程师”异常火爆,引发的热议经久不散。这个话题由一位印度初创公司投资人 Shekhar Kirani 的一条推特引发,他写道;“如果…

运动目标跟踪__kalman
转自:http://blog.csdn.net/lindazhou2005/article/details/1534234 1、 什么是卡尔曼滤波器(What is the Kalman Filter?) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他著名的理论(例如傅立叶变换&a…

Spring工厂常识
环境搭建导入Sring对应的jar包导入Spring依赖的commons-loggin包导入log4j.properties在src下导入ApplicationContext.xml在任意目录下是一个轻量级的企业开发框架核心:IOC , AOP编程IOC:也就是inverse of control 控制反转 就是讲创建对象的权利转移到工厂中,从而实现解耦合和…