跨語言版BERT:Facebook提出跨語言預訓練模型XLM

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

選自 GitHub

機器之心編譯

參與:張倩、思源

自去年 BERT 橫空出世以來,預訓練語言模型就得到大量的關注,但大多數預訓練表征都是單語言的,不同語言的表征並沒有什麼關係。今天,Facebook 發布了一種新型跨語言預訓練語言模型,它旨在構建一種跨語言編碼器,從而將不同語言的句子在相同的嵌入空間中進行編碼。這種共享的編碼空間對機器翻譯等任務有很大的優勢。

項目地址:https://github.com/facebookresearch/XLM

在這一項工作中,作者展示了跨語言預訓練語言模型的高效性,它在多種跨語言理解基準任務中都取得了很好的效果。總的而言,Facebook 提供的是一種跨語言版的 BERT,它在 XNLI 和無監督機器翻譯等跨語言任務取得了當前最好的效果。

跨語言版BERT:Facebook提出跨語言預訓練模型XLM

整個 XLM 開源項目主要展示了預訓練語言模型和機器翻譯等使用方法,如下所示為項目結構。

1. 預訓練語言模型:

  • 因果語言模型(CLM)—單語言

  • BERT 中通過掩碼訓練的語言模型(MLM)—單語言

  • 翻譯語言模型(TLM)—跨語言

2. 監督/無監督機器翻譯訓練:

  • 降噪自編碼器

  • 平行數據訓練

  • 在線回譯

3.XNLI 微調

4.GLUE 微調

此外,XLM 支持多 GPU 和多節點訓練,這對於大規模重訓練或微調都很有幫助。

預訓練模型

本項目提供預訓練跨語言模型,所有預訓練模型都是利用 MLM 目標函數訓練的:

跨語言版BERT:Facebook提出跨語言預訓練模型XLM

機器翻譯預訓練論文中用到的是英-法、英-德、英-羅馬尼亞模型。如果要使用這些模型,需要使用相同的數據預處理/BPE 代碼來預處理數據。

XNLI 微調用到的模型是 XNLI-15。它可以處理英語、法語、西班牙語、德語、希臘語、保加利亞語、俄語、土耳其語、阿拉伯語、越南語、泰國語、漢語、印地語、斯瓦希里語和烏爾都語。該模型的預處理方法不同於機器翻譯模型。

生成跨語言句子表征

項目提供了一段簡單的示例代碼,它可以幫我們從預訓練模型快速獲取跨語言句子表征,這種跨語言的句子表征對機器翻譯、計算句子相似性或做到跨語言的分類器都很有幫助。項目提供的示例主要是 Python 3 寫的,它還需要 Numpy、PyTorch、fastBPE 和 Moses 四個庫的支持。其中 fastBPE 主要幫助解決機器翻譯中罕見詞的表征問題,Moses 主要對文本進行清理和 Tokenize 等過程,這個庫並不需要安裝。

要生成跨語言的句子表征,首先需要導入一些代碼文件和庫:

    import os
import torch

from 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 [email protected]@ dary [email protected]@ ters also appear in the [email protected]@ el .', 'en'),
('les zones rurales [email protected]@ ent de petites routes , a deux voies .', 'fr'),
('luego del [email protected]@ quet , esta el futbol , el [email protected]@ f , entre otros .', 'es'),
('am 18. august 1997 wurde der [email protected]@ id ( [email protected]@ 55 ) [email protected]@ 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] = sent

lengths = 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

跨語言版BERT:Facebook提出跨語言預訓練模型XLM

論文鏈接:https://arxiv.org/abs/1901.07291

摘要:最近的研究已經展示了生成預訓練在英語自然語言理解上的有效性。本研究將此方法擴展到多種語言並展示了跨語言預訓練的有效性。研究者提出了兩種方法,用於學習跨語言模型(XLM):一個是無監督模型,只依賴單語數據,另一個是有監督模型,利用具有新的跨語言模型目標函數的平行數據。該方法在跨語言分類、無監督和有監督機器翻譯方面達到了當前最佳水準。在 XNLI 上,該方法將當前最高絕對準確率提高了 4.9%。在無監督機器翻譯上,本研究中的方法在 WMT’16 德語-英語任務上的 BLEU 到達了 34.3,將當前最佳水平提高了 9 分。在有監督機器翻譯任務中,該方法在 WMT’16 羅馬尼亞語-英語任務中的 BLEU 達到 38.5,將當前最佳水平提高了 4 分。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄————————————————

加入機器之心(全職記者 / 實習生):[email protected]

投稿或尋求報導:content@jiqizhixin.com

廣告 & 商務合作:[email protected]

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!