跨语言预训练模型(XLM)

  • 摘要
  • Shared sub-word vocabulary
  • 跨语言模型
  • 代码生成跨语言句子表征
  • 文章翻译

文章链接:

Cross-lingual Language Model Pretraining

代码链接:

XLM

本文是FaceBook AI Team在2019年一月发布的文章,该文章和前面三篇文章出自同一团队,主要提出了XLM跨语言预训练模型。XLM中的 ‘X’ 个人理解代表泛指,实际上文中提出了MLM、CLM、TLM三种预训练模型。XLM在有监督和无监督任务中都表现抢眼,在原来的state-of-the-art工作基础上提高了很多。

自去年 BERT 横空出世以来,预训练语言模型就得到大量的关注,但大多数预训练表征都是单语言的,不同语言的表征并没有什么关系。今天,Facebook 发布了一种新型跨语言预训练语言模型,它旨在构建一种跨语言编码器,从而将不同语言的句子在相同的嵌入空间中进行编码。这种共享的编码空间对机器翻译等任务有很大的优势。由于XLM是在Bert的基础上做的改进,所以XLM其实是一种跨语言版的 Bert,使用了两种预训练方式:

  • 基于单语种语料的无监督学习
  • 基于跨语言的平行语料的有监督学习

摘要

摘要:最近的研究已经展示了生成预训练在英语自然语言理解上的有效性。本研究将此方法扩展到多种语言并展示了跨语言预训练的有效性。研究者提出了两种方法,用于学习跨语言模型(XLM):一个是无监督模型,只依赖单语数据,另一个是有监督模型,利用具有新的跨语言模型目标函数的平行数据。该方法在跨语言分类、无监督和有监督机器翻译方面达到了当前最佳水准。在 XNLI 上,该方法将当前最高绝对准确率提高了 4.9%。在无监督机器翻译上,本研究中的方法在 WMT’16 德语-英语任务上的 BLEU 到达了 34.3,将当前最佳水平提高了 9 分。在有监督机器翻译任务中,该方法在 WMT’16 罗马尼亚语-英语任务中的 BLEU 达到 38.5,将当前最佳水平提高了 4 分。

Shared sub-word vocabulary

目前的词向量基本都是在单语言语料集中训练得到的,所以其embedding不能涵盖跨语言的语义信息。研究表明,对于共享相同的字母、数字符号的语言,使用Byte Pair Encoding (BPE)能够显著的提升嵌入空间的对齐效果。本文学习在单语料库中从随机多项式分布中采样句子进行BPE学习。BPE的具体细节可以参考以下博文:

通过BPE解决OOV问题

跨语言模型

  1. Causal Language Modeling (CLM)

    概括的说就是使用Transformer在给定前序词语的情况下预测下一个词的概率。

    这里的CLM就是一个传统的语言模型训练过程,使用的是目前效果最好的Transformer模型。对于使用LSTM 的语言模型,通过向 LSTM 提供上一个迭代的最后隐状态来执行时间反向传播 (backpropagation through time, BPTT)。而对于 Transformer,可以将之前的隐状态传递给当前的 batch,为 batch 中的第一个单词提供上下文。但是,这种技术不能扩展到跨语言设置,因此在这里作者们进行了简化,只保留每个 batch 中的第一个单词,而不考虑上下文。

  2. Masked Language Modeling (MLM)

    这一个预训练目标同BERT的MLM思想相同,唯一不同的就是在于模型输入。BERT的输入是句子对,而XLM使用的是随机句子组成的连续文本流。此外,为了避免采样不均,对相对频繁的输出采用与频率倒数的平方根成正比的权重从多项式分布中进行子采样。

  3. Translation Language Modeling (TLM)

    这一部分应该是对跨语言任务取得提升的最大原因。不同于以上两个预训练模型(单语言语料训练 + 无监督训练),翻译语言模型使用的是有监督的跨语言并行数据。如下图所示输入为两种并行语言的拼接,同时还将BERT的原始embedding种类改进为代表语言ID的Laguage embedding和使用绝对位置的Position embedding。这些新的元数据能够帮助模型更好地学习不同语言相关联Token之间的关系信息。

    TLM训练时将随机掩盖源语言和目标语言的token,除了可以使用一种语言的上下文来预测该Token之外(同BERT),XLM还可以使用另一种语言的上下文以及Token对应的翻译来预测。这样不仅可以提升语言模型的效果还可以学习到source和target的对齐表示。也就是说,如果英语上下文不足以推断出掩盖的英语单词,那么该模型可以利用法语语境来推断(个人认为这点比较有想法)。本文提出的TLM如下,结合了BERT和MLM:

代码生成跨语言句子表征

项目提供了一段简单的示例代码,它可以帮我们从预训练模型快速获取跨语言句子表征,这种跨语言的句子表征对机器翻译、计算句子相似性或实现跨语言的分类器都很有帮助。项目提供的示例主要是 Python 3 写的,它还需要 Numpy、PyTorch、fastBPE 和 Moses 四个库的支持。其中 fastBPE 主要帮助解决机器翻译中罕见词的表征问题,Moses 主要对文本进行清理和 Tokenize 等过程,这个库并不需要安装。

要生成跨语言的句子表征,首先需要导入一些代码文件和库:

import os
import torchfrom src.utils import AttrDict
from src.data.dictionary import Dictionary, BOS_WORD, EOS_WORD, PAD_WORD, UNK_WORD, MASK_WORD
from src.model.transformer import TransformerModel

加载预训练模型:

model_path = '/private/home/guismay/aws/XLM/mlm_tlm_xnli15_1024.pth'
reloaded = torch.load(model_path)
params = AttrDict(reloaded['params'])
print("Supported languages: %s" % ", ".join(params.lang2id.keys()))__________________________________________Supported languages: ar, bg, de, el, en, es, fr, hi, ru, sw, th, tr, ur, vi, zh

构建字典、更新参数和构建模型:

# build dictionary / update parameters
dico = Dictionary(reloaded['dico_id2word'], reloaded['dico_word2id'], reloaded['dico_counts'])
params.n_words = len(dico)
params.bos_index = dico.index(BOS_WORD)
params.eos_index = dico.index(EOS_WORD)
params.pad_index = dico.index(PAD_WORD)
params.unk_index = dico.index(UNK_WORD)
params.mask_index = dico.index(MASK_WORD)# build model / reload weights
model = TransformerModel(params, dico, True, True)
model.load_state_dict(reloaded['model'])

下面展示一些语言的案例,我们会根据预训练模型抽取句子表征,它们已经是 BPE 格式(基于 fastBPE 库):

# list of (sentences, lang)
sentences = [('the following secon@@ dary charac@@ ters also appear in the nov@@ el .', 'en'),('les zones rurales offr@@ ent de petites routes , a deux voies .', 'fr'),('luego del cri@@ quet , esta el futbol , el sur@@ f , entre otros .', 'es'),('am 18. august 1997 wurde der astero@@ id ( 76@@ 55 ) adam@@ ries nach ihm benannt .', 'de'),('اصدرت عدة افلام وث@@ اي@@ قية عن حياة السيدة في@@ روز من بينها :', 'ar'),('此外 , 松@@ 嫩 平原 上 还有 许多 小 湖泊 , 当地 俗@@ 称 为 “ 泡@@ 子 ” 。', 'zh'),
]# add </s> sentence delimiters
sentences = [(('</s> %s </s>' % sent.strip()).split(), lang) for sent, lang in sentences]

最后创建批量并完成前向传播就能获得最终的句子嵌入向量:

bs = len(sentences)
slen = max([len(sent) for sent, _ in sentences])word_ids = torch.LongTensor(slen, bs).fill_(params.pad_index)
for i in range(len(sentences)):sent = torch.LongTensor([dico.index(w) for w in sentences[i][0]])word_ids[:len(sent), i] = sentlengths = torch.LongTensor([len(sent) for sent, _ in sentences])
langs = torch.LongTensor([params.lang2id[lang] for _, lang in sentences]).unsqueeze(0).expand(slen, bs)tensor = model('fwd', x=word_ids, lengths=lengths, langs=langs, causal=False).contiguous()
print(tensor.size())

最后输出的张量形状为 (sequence_length, batch_size, model_dimension),它可以进行进一步的微调,从而完成 GLUE 中的 11 项 NLP 任务或 XNLI 任务等。

当然除了提取预训练句子嵌入向量,该项目还展示了如何用于无监督机器翻译等任务,详细内容可查阅原 GitHub 项目。

文章翻译

译文参考下面的博客链接:

《Cross-lingual Language Model Pretraining》译文

face - Cross-lingual Language Model Pretraining ---- XLM相关推荐

  1. (五十):COCO-LM: Correcting and Contrasting Text Sequences for Language Model Pretraining

    (五十):COCO-LM: Correcting and Contrasting Text Sequences for Language Model Pretraining Abstract 1. I ...

  2. GLM General Language Model Pretraining with Autoregressive Blank Infilling

    GLM: General Language Model Pretraining with Autoregressive Blank Infilling 论文地址 [2103.10360v2] GLM: ...

  3. XLM:Cross-lingual Language Model Pretraining(2019-1-22)

    模型介绍 尽管原有的BERT模型可以在上百种语言上进行预训练,语言之间的信息并不是互通的,不同的语言模型之间没有共享知识.Facebook的XLM模型克服了信息不互通的难题,将不同语言放在一起采用新的 ...

  4. 【ICML 2020】REALM: Retrieval-Augmented Language Model PreTraining

    知识就是力量 培根 背景 去年可以说是语言模型快速发展的一年,BERT.XLNET.Albert等等模型不断刷新各个NLP榜单.在NLP榜单中比较引人注目的应该属于阅读理解型的任务,例如SQuAD等等 ...

  5. 论文阅读Unsupervised Corpus Aware Language Model Pre-training for Dense Passage Retrieval

    密集文本检索的无监督语料库感知语言模型预训练 ACL2022 论文链接 摘要 最近的研究证明了使用微调语言模型(LM)进行密集检索的有效性.然而,密集检索器很难训练,通常需要经过精心设计的微调管道才能 ...

  6. 文本生成(一)【NLP论文复现】Unified Language Model 文本生成从未如此轻松

    Unified Language Model 文本生成从未如此轻松 前言 UniLM How to build UniLM Get 2D MASK Send 2D MASK to Bert 使用Uni ...

  7. Multi-task Pre-training Language Model for Semantic Network Completion

    多任务预训练语言模型用于语义网络补全 Da Li ∗ , Sen Yang †‡ , Kele Xu §¶ , Ming Yi ∗ , Yukai He ∗ , and Huaimin Wang §¶ ...

  8. 深入理解深度学习——BERT派生模型:XLM(Cross-lingual Language Model)

    分类目录:<深入理解深度学习>总目录 BERT本应在语义理解上具有绝对优势,但其训练语料均为英语单语,受限于此,早期的BERT只在英语文本理解上有优势.随着全球化进程的加速,跨语言的预训练 ...

  9. 深度学习基础 | 从Language Model到RNN

    作者 | Chilia 整理 | NewBeeNLP 循环神经网络 (RNN) 是一种流行的「序列数据」算法,被 Apple 的 Siri 和 Google 的语音搜索使用.RNN使用内部存储器(in ...

最新文章

  1. 耐能团队论文登上《自然·电子学》:集成忆阻器与CMOS以实现更好的AI
  2. I/O流。简单利用File.copy
  3. 首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品 | ICCV 2019
  4. Web容器自动对HTTP请求中参数进行URLDecode处理
  5. arm920T与arm926的区别[转载]
  6. Android单元測试之JUnit
  7. this指向、数据双向流、传递参数、JSX中循环、React中样式、路由、引入资源的其它方式、create-react-app脚手架、事件处理、获取数据、UI框架推荐、pc桌面应用electronjs
  8. A8下超级终端调试问题
  9. pip 指定版本安装
  10. 向量叉乘公式_向量外积的高中数学运用
  11. MS-TCN: Multi-Stage Temporal Convolutional Network for Action Segmentation
  12. 尤雨溪:Vue 3 将成为新的默认版本
  13. CAD绘制区域覆盖对象
  14. 位图(bitset)的使用【STL】
  15. 违反开源项目GPL协议,法院判罚了!国内首例
  16. win10wifi开关自动弹回_win10系统wlan打开又关闭的解决方法
  17. USG防火墙------内外网用户通过外网IP访问内部服务器(NAT)
  18. linux下不让使用rm命令
  19. font-family、font-style、font-weight、font-variant的区别「In CSS」
  20. 去 OPPO 面试,被问麻了。。。

热门文章

  1. python list分组操作--简便易读
  2. 使用cookie登录百度网盘账号
  3. 教你使用cookie登录
  4. QCustomPlot基础教程(十)——QCustomPlot中图例的相关设置
  5. 门户网站java源码vue_vuetify-master
  6. 楼上常深夜响动,女子多次沟通无果,搭10个鞋盒放音箱“反击”
  7. js实现倒计时特效(背景颜色随时间改变)
  8. 转:明茨伯格:管理,一次扮演好一个角色
  9. BCC校验(异或校验)原理
  10. 数据链路层——广播信道CSMA/CD协议