尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
選自 GitHub
機器之心編譯
參與:張倩、思源
自去年 BERT 橫空出世以來,預訓練語言模型就得到大量的關注,但大多數預訓練表征都是單語言的,不同語言的表征並沒有什麼關係。今天,Facebook 發布了一種新型跨語言預訓練語言模型,它旨在構建一種跨語言編碼器,從而將不同語言的句子在相同的嵌入空間中進行編碼。這種共享的編碼空間對機器翻譯等任務有很大的優勢。
項目地址:https://github.com/facebookresearch/XLM
在這一項工作中,作者展示了跨語言預訓練語言模型的高效性,它在多種跨語言理解基準任務中都取得了很好的效果。總的而言,Facebook 提供的是一種跨語言版的 BERT,它在 XNLI 和無監督機器翻譯等跨語言任務取得了當前最好的效果。
整個 XLM 開源項目主要展示了預訓練語言模型和機器翻譯等使用方法,如下所示為項目結構。
1. 預訓練語言模型:
-
因果語言模型(CLM)—單語言
-
BERT 中通過掩碼訓練的語言模型(MLM)—單語言
-
翻譯語言模型(TLM)—跨語言
2. 監督/無監督機器翻譯訓練:
-
降噪自編碼器
-
平行數據訓練
-
在線回譯
3.XNLI 微調
4.GLUE 微調
此外,XLM 支持多 GPU 和多節點訓練,這對於大規模重訓練或微調都很有幫助。
預訓練模型
本項目提供預訓練跨語言模型,所有預訓練模型都是利用 MLM 目標函數訓練的:
機器翻譯預訓練論文中用到的是英-法、英-德、英-羅馬尼亞模型。如果要使用這些模型,需要使用相同的數據預處理/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
論文鏈接: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]