写点什么

XLnet:GPT 和 BERT 的合体,博采众长,所以更强

2019 年 9 月 09 日

XLnet:GPT和BERT的合体,博采众长,所以更强


前面介绍过 BERT,作为一种非常成功的预训练模型,取得了非常不错的成绩,那么,他还有改进的空间吗?


本文介绍 BERT 的改进版,XLnet。看看它用了什么方法,改进了 BERT 的哪些弱点。


为什么要有 XLnet?

要理解 XLnet,我们先回顾一下先于 XLnet 的两种表现最好的预训练模型 BERT 和 GPT:


  1. Generative Pre-Training(GPT),采用 Transfomer 作为特征抽取器,预训练阶段采用单向语言模型的模式。

  2. Pre-training of Deep Bidirectional Transformers for Language Understanding(BERT),同样采用 Transfomer 作为特征抽取器,与 GPT 的主要差异在于,在训练阶段,其采用基于 MLM 的双向语言模型。


XLnet 的提出者们,仔细研究了一下这两个模型,发现他们都有自己的缺点。


对 GPT,它主要的缺点在于,采用的是单向语言模型。模型在预测当前词的时候,只能看到该词前面词的信息。而对于很多语言理解任务而言,例如阅读理解等,常常需要参考该词前后的语境,因此,单向语言模型往往是不够的。XLnet 的研究者称 GPT 这一类结构为 AR(AutoRegressive)语言模型。


对 BERT,采用 MLM,即在训练时遮住训练语料中 15%的词(实际的 MASK 机制还有一些调整),用符号[MASK]代替,然后试图让网络重建该词。这个过程,在训练语料中引入了符号[MASK]。而在实际的 Finetune 及预测过程中,是没有这个符号的,这就在预训练和预测阶段之间产生了 GAP。BERT 在 MLM 中还隐含了一个独立性假设,即重建各个符号[MASK]的过程,是相互独立的。这个假设其实是未必成立的,会造成模型训练时部分信息的损失。XLnet 的研究者称 BERT 这一类结构为 AE(AutoEncoding)语言模型。


由此可见,BERT 和 GPT 都有待改进的地方,XLnet 的研究者们的想法是将两个模型结合起来,并改进一些点。下面我们来看看 XLnet 是如何基于 GPT 和 BERT 来做改进的。


XLnet 的改进

1) 预训练模式的优化:Permutation Language Modeling(PLM)

XLnet 想要实现 BERT 的双向语言模型,但是又不想引入 BERT MLM 中的独立性假设和符号[MASK],进而提出了 PLM。


XLnet 中,沿用 GPT 的语言模型的办法,即基于序列中前面部分的内容,预测该词。但是,为了在预测该词的时候,为了能够看到该词后面部分的内容,对序列进行排列组合。这样的话,该词的前面也包含该词后面词的信息,用另外一种方式,实现了双向语言模型。



如上图所示,假定输入序列的长度为 4,则除了原语序,这 4 个词总共有 24 种排列方式,上图中用各词在原序列中的位置来表示各词,列出了其中 4 种,[3,2,4,1],[2,4,3,1],[1,4,2,3],[4,3,1,2]。


有同学会疑问,对于 Transformer 这种特征抽取器来说,在不加掩码的情况下,不管输入序列按照哪种顺序输入,效果应该都是一样的才对。


没错,因此 XLnet 还引入了 Two-Stream Self-Attention,双流自注意力模型


所谓双流就是输入包括了两种,训练句子和相应的位置信息,下面看看具体是怎么组织起来的。



如上图所示,输入包括两种类型,query stream 和 content stream。



1.query stream 仅仅包含输入序列中预测位置前面的词 x_(z<t),以及该词在原序列(未重新组合前)中的位置 z_t 信息,但是不包括 x_(z_t)。


2.content stream 跟普通的 transformer 输入一致,包括 x_(z_t)及 x_(z<t)。


通过双流注意力机制,可以有效的学习到双向模型的表征。


2)特征抽取器的优化

在结构上,XLnet 采用改进后的 transofmerXL 作为特征抽取器。前面讲过 TransformerXL,他主要有两个优化,一个引入了序列循环机制;一个是引入了相对位置编码。


对于相对位置编码,在 XLnet 中的应用与之前在 transformer 的应用别无二致;对于序列循环机制,这里介绍一下在 XLnet 中是如何应用的。



如上面的公式所示,其实在 XLnet 中,attention 计算与 TransformerXL 中类似,也是将前一个序列中上一层的隐藏状态,与本序列中上一层隐藏层状态拼接起来。


总结

XLnet 是一个集合了目前两大预训练模型的优点,其效果自然不会差,目前其在各个任务中的表现都要优于 BERT。


XLnet 接过 BERT 的棒,把预训练模型再往前提升了一步。可以遇见,后续 NLP 预训练还会不断有新的模型出来。


2019 年 9 月 09 日 13:492028

评论

发布
暂无评论
发现更多内容

禁止在构造函数里调用虚函数

喵叔

C# .net 编码习惯

Scrum vs Kanban,如何选择

TerryLee

Scrum Kanban 敏捷开发 Worktile 研发管理

像黑客一样思考

Fooying

黑客思维 黑客 安全攻防

三点思考,判断一家公司是否值得加入

邓瑞恒Ryan

高效工作 个人成长 职业

聊聊:Java

谢烟客

Java 编程 开发者 随笔杂谈 「Java 25周年」

如何解决 Kubernetes 的 DNS 延迟问题

倪朋飞

Kubernetes 微服务 云原生

死磕Java并发编程(1):探究Java并发机制的底层原理

七哥爱编程

Java Java并发 并发编程

2020,这个世界会好吗?

IT民工大叔

读书笔记

Kubernetes中的CI/CD

倪朋飞

Kubernetes DevOps 微服务

关于Iterator和Iterable

shengjk1

Java Iterator和Iterable

探究vscode debug流程,解决无法运行go程序的问题

simpleapples

golang vscode

用你喜欢的 emoji 作为页面的 favicon 吧 🎉

遇见

CSS html favicon emoji

无代码开发

Fenng

GitHub知错就改,是个好同志

遇见

GitHub

程序员职业鉴赏

陆陆通通

程序员 加班 职业病 鄙视链

Arduino 蓝牙遥控+超声避障小车

黄耗子皮

树莓派 极客

破解 Java Agent 探针黑科技!

谭建

Java JVMTI APM Profile

我的第一个千万阅读量

彭宏豪95

创作 生活 写作

回“疫”录:开篇

小天同学

疫情 回忆录 现实纪录 纪实

我从来不在朋友圈晒投资人合影,却融了很多钱

邓瑞恒Ryan

高效工作 人脉 职业规划

Flink获取kafka中每条消息对应的topic

shengjk1

flink kafka flink 消费 kafka 获取 topic等信息

极客父母送给孩子的 ABC Book 就是这么 GEEK

魏彬(rockybean)

GEEK BOOK

Oauth2的认证实战-HA篇

Damon

Java 架构 Kubernetes 微服务架构 Spring Cloud

简单到不可能失败 —— 《微习惯》

零和幺

读书笔记

【SpringBoot】掌握这两个属性,你的测试类可以启动的更快些

遇见

Java Spring Boot Unit Test

Kubernetes 容器运行时演进

倪朋飞

Kubernetes 容器 云原生

阿里面试,一面就倒在了Java内存模型上?赶紧来看看

七哥爱编程

面试 Java并发 内存模型

你不必读完一本书

池建强

学习 读书

我如何用 Python 给 Github 的 README.md 做一个访客统计功能

遇见

Python GitHub 开源 badge open-source

一篇文章搞定 java 中的 path 和 classpath

shengjk1

Java classpath vs path classpath path

一文搞定 equals 和 hashCode

shengjk1

Java equals vs hashcode

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

XLnet:GPT和BERT的合体,博采众长,所以更强-InfoQ