来自:AINLP公众号

作者:张贵发 

研究方向:自然语言处理


介绍

近期,由卡耐基梅隆大学和谷歌大脑提出的全新 XLNet 在 20 个任务上超过了 BERT 的表现,而且还开放了源码,今天我们来讨论一下这篇论文。

论文地址:https://arxiv.org/pdf/1906.08237.pdf
github: https://github.com/zihangdai/xlnet

  • Context (文本内容)

  • Autoregressive vs Autoencoding (自回归与自编码)

  • XLNet: Best of both worlds

    • Permutation Language model

    • Two-Stream self-attention mechanism

    • Recurrence mechan

我们将快速讨论下关于文本处理两种主要方法的背景,自回归与自编码,然后进一步延申之两者的最好结合-----xlnet

实践证明无监督的学习是种坚如磐石的方法。从无背景中学习,随着语言模型的兴起,出现了许多很好的文本表示的模型如word2vec、glove等。我们有两种具有竞争力的方法自回归(AR)与自编码(AE),我们发现两种方法都存在一些限制。

AR(自回归)

AR语言模型试图用自回归模型来估计文本语料库的概率分布,具体来说,给定一个文本序列,AR利用极大似然建模正向或者反向。AR模型只能正向或者反向存在单方向上的依赖,存在单向流动的问题。公式若难理解可以看下图例子:


  • The animal didn’t cross the street because it was too tired.

  • The animal didn’t cross the street because it was too narrow

如我们给定的例子中,只看前文,我们很难猜测it指代的具体内容,编码的时候我们要看整个句子的上下文,只看前面或者只看后面是不行的。

AR模型的两个问题:

  1. 顺序依赖,t依赖t-1时刻。(或者反向)

  2. 单向信息流(如例子中指代信息,不能确定)

由于AR语言模型只被训练为对单向上下文(向前或向后)进行编码,因此它不能有效地对深层双向上下文进行建模。相反,下游语言理解任务通常需要双向上下文信息。这导致了AR语言建模和有效的预训练之间的差距。

AE(自编码)

单向信息流的问题 ,只能看前面,不能看后面,其实语料里有后面的信息,只是训练语言模型任务特殊要求只能看后面的信息,这是最大的一个问题。那么我们可以改变我们的训练任务。


基于AE的预训练是从损坏的输入中重建原始数据。一个值得注意的例子是Bert,它是最先进的预训练方法。给定输入token序列,token的某一部分将被一个特殊符号[mask]替换(如dog、likes),并且模型经过训练,可以从损坏的版本中恢复原始token。bert可以利用双向上下文进行重建。作为一个直接的好处,这弥补了前面提到的AR语言建模中的双向信息缺口,从而提高了性能。


基于自编码的架构,我们可以同时catch到两边的依赖。但是同时存在一些限制:

  • 在预测屏蔽token时,输入中有其他屏蔽token

  • 如果屏蔽token是相互依赖的呢

通过自动编码的架构,意味着我们在输出中有一个序列,在输入确定的序列中添加一些噪声,通过mask,因此当你想要预测这些mask的时候,你有左边的输入标记和在右边有什么限制。当你预测令牌之一的输入,右边也是mask的token,所以你是失去了部分信息,这是有限的,第二个问题是有两个连续的masked token像 new york,new york 是有内部依赖的,你想预测new york的结果非常好,重要的是要知道new是第一个令牌,new york与york new可能是两个城市。这与他们的位置关系存在严格的限制。

另外,在训练期间,BERT在预训练时使用的[MASK]等人工符号在实际数据中不存在,从而导致预训练的网络差异。

XLNet

面对现有语言预训练目标的优缺点,本文提出了一种广义自回归方法XLNET,它既利用了AR语言建模的优点,又避免了AE的局限性。

  • xlnet是基于自回模型上的,但是它不只是向前或向后,而是双方的排列来获取依赖信息。避免单向信息流。

  • 作为一种广义的AR语言模型,XLNet不依赖于数据破坏。避免mask丢失信息。避免与训练与微调的差异弊端。

  • 融合了transformerXL的方法(SOTA LM)

Permutation Language Modeling


首先,我们不希望花更长的时间只是向后或只是向后,我们更关注形成新的序列,如给定序列[1,2,3,4],我们的目标是预测3,首先根据这个因子为4的序列进行全排列,形成24种情况。上图列出了其中4中排列情况,每一种的计算如下:

  • 第一,左侧没有值,是句子的开端,无需计算

  • 第二,

  • 第三,

  • 第四,

如果是传统的AR会直接计算

这样的处理方式,解决了单向注意力流问题,还避免了mask标记带来的问题。
那么怎么使它工作呢?

首先是位置编码,我们需要很好的位置计算,因为我们混合了一切,外部从左到右,或者从右到左,我们需要有一些位置,好在tansfomer中已经解决了这样的问题,标志只是正弦信号,他们使用了相对位置。这里提一下bert用的是绝对位置。


有了序列的选集,那我们该选择哪一个进行训练呢?

我们有4个因子就有24中排列,因此分解它很疯狂,对样本进行抽样,随机抽样,可能性是上图的公式,Zt是一切可能,这里表示24(4!)种分解,z是其中之一,本质上,对于文本序列X,我们一次采样一个分解顺序z,
并根据分解顺序分解似然  。由于相同的模型参数θ在训练期间在所有分解次序中被共享,在期望中,X_t已经看到序列中(x_i 与 x_t不等)每一个可能元素,因此能够捕获双向上下文。

Two-Stream self-attention

接下来,怎么真正的处理context和position呢?


其实思路很简单,预测的时候就是保持住position不变,同时移除预测位置的context embedding。训练的时候保留context embedding。Two-Stream Self-Attention巧妙地结合了两个处理。

  • 在预测当前xt的时候,fix住position,移除context embeding。

  • 当预测其他内容时候,再保留context embedding信息。

假设我们使用标准的SoftMax公式参数化下一个token分布,即:


其中表示在适当屏蔽后transformer网络产生的表示。现在注意,表示

并不取决于它将预测的位置,即z_t的位置信息。因此,无论目标位置如何,都会预测相同的分布,因为目标位置无法学习有用的表示。为了避免这个问题,我们建议重新参数化下一个token分布,以实现目标位置感知:

是一种新的表示形式,它另外以目标位置zt作为输入。

  • 如上图所示当作为内容表示时 ,简称h_zt,其作用与transformer标准隐藏状态相似。这种表示同时对上下文和x_zt本身进行编码。自己的context embedding参与到了计算。公式如下:



  • 查询表示 g_θ(x_{z<t},z_t) ,简称g_zt,只访问上下文信息x_{z<t} 和位置z_t,而不访问内容x_zt,本位置的context embedding不参与计算,如上所述。公式如下:


计算上,第一层查询流用可训练向量初始化,即,而内容流被设置为对应的字嵌入,即。对于每个self-attention层,m=1,…,M,这两个表示流是用一组共享参数(如图(a)和(b)所示)进行示意性更新的,中q、k、v表示注意力操作中的查询、键和值。内容表示的更新规则与标准的self-attention完全相同,因此在微调期间,我们可以简单地删除查询流。


假设bert和xlnet都选择这两个令牌[new york]作为预测目标,并最大化log p(new york is a city)。另外,假设xlnet对factorization的order(is,a,city,new,york)进行采样。在这种情况下,bert和xlnet趋向与以下目标:


验证了我上文关于bert的限制问题。

关于bert或者self-attention的理解可参考我之前的文章:一步步理解bert

注意本地FineTuning的话,需要安装SentencePiece

pip install SentencePiece

执行上述命令即可,不然会报异常。


原文链接:

https://blog.csdn.net/mr2zhang/article/details/94138844

推荐阅读:

一大批历史精彩文章啦

【一分钟知识】七种损失函数

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】轻松解读Semi-supervised Sequence Learning半监督序列学习

详解Transition-based Dependency parser基于转移的依存句法解析器

干货 | 找工作的经验总结(一)

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

是时候研读一波导师的论文--一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


最新语言表示方法XLNet相关推荐

  1. 一本深入探讨C++11~C++17最新语言特性的书推荐给你

    近10年来C++的更新可谓是非常频繁,这让我在2017年时感受到了一丝不安.那个时候我发现在开源平台上已经有很多项目采用C++11和C++14标准编写,其中不乏一些知名的代码库,而公司里所用的编译环境 ...

  2. R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间

    R语言sys方法:sys.info函数获取系统和用户信息.sys.localeConv函数获取当前区域中的数字和货币表示的详细信息.sys.setFileTime函数更改文件的时间 目录

  3. R语言sys方法:sys.chmod函数改变指定文件的权限、Sys.Date函数返回系统的当前日期、Sys.time函数返回系统的当前时间

    R语言sys方法:sys.chmod函数改变指定文件的权限.Sys.Date函数返回系统的当前日期.Sys.time函数返回系统的当前时间 目录

  4. R语言sys方法:sys.getpid函数获取R会话的进程ID、sys.glob函数和file.path函数匹配文件夹下的所有特定类型文件、sys.info函数获取系统和用户信息

    R语言sys方法:sys.getpid函数获取R会话的进程ID.sys.glob函数和file.path函数匹配文件夹下的所有特定类型文件.sys.info函数获取系统和用户信息 目录

  5. R语言sys方法:sys.timezone函数返回当前系统时区的名称、system.File函数查找系统文件或者安装包的文件路径(例如查看R Base可安装路径、dplyr包的安装路径)

    R语言sys方法:sys.timezone函数返回当前系统时区的名称.system.File函数查找系统文件或者安装包的文件路径(例如查看R Base可安装路径.dplyr包的安装路径) 目录

  6. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  7. html js 浏览器语言,js 判断浏览器语言的方法

    今天遇到一个要根据浏览器设置语言的类型,来展示网站的字体.比如,浏览器的语言是中文简体,那么网站也要显示中文简体字,如果是繁体或是英文都要根据浏览器当前设置的语言进行显示.那么,飞鸟慕鱼博客来和大家说 ...

  8. c语言排序方法有哪几种?

    c语言排序方法有:1.简单选择排序,基于O(n2)时间复杂度的排序算法:2.冒泡排序:3.简单插入排序:4.希尔排序:5.归并排序,基于归并操作的一种排序算法:6.快速排序,属于分治法的一种:7.堆排 ...

  9. 论文浅尝 - ACL2022 | 基于多语言语义解耦表示的跨语言迁移方法实现多语言阅读理解...

    论文作者:吴林娟,天津大学,研究方向为自然语言理解 论文链接:http://arxiv.org/abs/2204.00996 代码地址:https://github.com/wulinjuan/SSD ...

  10. win8编程c语言,Win8系统怎么运行C语言 win8系统运行C语言的方法

    C语言是一门通用计算机编程语言,是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言,但是许多win8系统用户并不知道要怎么运行C语言,针对这个情 ...

最新文章

  1. Python培训教程分享:“高效实用” 的Python工具库
  2. 关于android分辨率和使用iphone版切图
  3. Uva1593 代码对齐
  4. 本地搭建docker私服
  5. web性能测试分析-工具篇 (转载)
  6. ssm框架重定向_Java SSM 框架面试题,附答案!
  7. 牛顿新定律:凭本事得到的,凭什么要还?
  8. 第十期:快来了解这五种热门的开发技能
  9. android ndk gcc,Android NDK GCC似乎是铿锵的 - 它应该是这样吗?
  10. 浅谈智能电网的建设 软件开发
  11. atoi 原来将字符串02002xzm100转换为int以后是2002
  12. MySQL 存储引擎和锁
  13. 判断相等_C语言判断字符串是否为回文
  14. 写表单验证等页面的总结
  15. java chars_为什么在Java 8中String.chars()是一个整数流?
  16. 非堵塞socket实现android手机与PC的文件传输
  17. IBATIS开发指南(夏昕)
  18. Java log2x函数的实现
  19. 【信息收集】渗透测试信息收集的种类及方法(待拆分细化)
  20. macbookair有没有touchbar_高配MacBook Air和低配MacBook Pro选哪个?

热门文章

  1. Elasticsearch 2.3.x 拼音分词 analysis-lc-pinyin
  2. 在mysql中存储生日,php中计算今天是否为用户生日
  3. 写在2012的最后一天
  4. SNOI2017 礼物
  5. Mybatis-plus的两种分页插件的配置方式
  6. 夺命雷公狗---无限级分类NO2
  7. 浅复制和深复制的区别?//浅拷贝和深拷贝
  8. ProjectManage.rar 自动生成模板
  9. xPath(他山之石)
  10. C语言中可变参函数介绍与示例