ELMo詞向量出自于論文《Deep contextualized word representations》
什么是ELMo瞻佛?
ELMo的全稱是Embeddings from Language Models费彼,中文意思是基于語(yǔ)言模型的詞向量,它是一個(gè)上下文詞向量/動(dòng)態(tài)詞向量,同一單詞在不同的上下文中具有不同的含義泵三,而ELMo詞向量能表示出這種不同口猜。
實(shí)現(xiàn)過(guò)程可以簡(jiǎn)單描述為:將不同的句子輸入模型,模型會(huì)實(shí)時(shí)產(chǎn)生上下文詞向量逃沿。
ELMo是如何實(shí)現(xiàn)的婴渡?
構(gòu)建一個(gè)雙向語(yǔ)言模型,給定一個(gè)包含N個(gè)tokens
的序列
前向語(yǔ)言模型凯亮,給定前面的tokens求下一個(gè)token是
的概率:
反向語(yǔ)言模型边臼,與前向語(yǔ)言模型相反,知道后邊的token假消,求前面的token:
那么柠并,雙向語(yǔ)言模型可以表示為:
其中,是輸入層單詞表示的參數(shù)置谦,
是LSTM參數(shù)堂鲤,
是Softmax層的參數(shù)。
結(jié)合網(wǎng)絡(luò)各層的雙向語(yǔ)言模型的表達(dá)
對(duì)于token媒峡,通過(guò)一個(gè)由
層雙向語(yǔ)言模型構(gòu)成的網(wǎng)絡(luò)瘟栖,可以得到
個(gè)表示:
是對(duì)token直接編碼的結(jié)果(可以使用word2vec,Glove,或者將字符通過(guò)CNN進(jìn)行編碼)谅阿,
是每個(gè)biLSTM層輸出的結(jié)果半哟。
在下游任務(wù)中,可以組合不同層的單詞的表示進(jìn)行使用:
其中签餐,是任務(wù)相關(guān)的scale參數(shù)寓涨,不同的任務(wù)要設(shè)置不同的數(shù)值,
是一個(gè)softmax的結(jié)果氯檐,可以在訓(xùn)練的過(guò)程中學(xué)習(xí)戒良。
ELMo是如何訓(xùn)練的?
網(wǎng)絡(luò)結(jié)構(gòu)共三層
- 第一層是普通的word embedding 可以用wrod2vec或者glove來(lái)得到冠摄,或者使用character level得到token embedding糯崎。 這部分是general embedding,上下文無(wú)關(guān)河泳。文中使用的是character level的CNN+Highway沃呢。
- 后面兩層是兩個(gè)biLSTM 去encode 輸入(同時(shí)也有殘差連接), 每一層LSTM得到的輸出(隱狀態(tài)) 作為每個(gè)詞的上下文相關(guān)的word vectors。
ELMo和Glove的區(qū)別
Glove 詞向量是固定的詞向量拆挥。同一單詞在不同的語(yǔ)句中具有相同的表示薄霜。
ELMo的基本輸入單元為句子,每個(gè)詞沒(méi)有固定的詞向量,是根據(jù)詞的上下文環(huán)境來(lái)動(dòng)態(tài)產(chǎn)生當(dāng)前詞的詞向量惰瓜,可以較好地解決一詞多義的問(wèn)題否副。
ELMo 的輸入是字母而不是單詞。因此鸵熟,他們可以利用子字詞單元來(lái)計(jì)算有意義的表示副编,即使對(duì)于詞典外的詞(如 FastText這個(gè)詞)也是如此。
ELMo 是 biLMs 幾層激活的串聯(lián)流强。語(yǔ)言模型的不同層對(duì)單詞上的不同類型的信息進(jìn)行編碼(如在雙向LSTM神經(jīng)網(wǎng)絡(luò)中痹届,詞性標(biāo)注在較低層編碼好,而詞義消歧義用上層編碼更好)打月。連接所有層可以自由組合各種文字表示队腐,以提高下游任務(wù)的性能。
實(shí)踐參考代碼
哈工大改寫的多國(guó)語(yǔ)言版:https://github.com/HIT-SCIR/ELMoForManyLangs
Pytorch版ELMo(Allennlp)
from allennlp.commands.elmo import ElmoEmbedder
elmo = ElmoEmbedder(options_file='../data/elmo_options.json', weight_file='../data/elmo_weights.hdf5', cuda_device=0)
context_tokens = [['I', 'love', 'you', '.'], ['Sorry', ',', 'I', 'don', "'t", 'love', 'you', '.']]
elmo_embedding, elmo_mask = elmo.batch_to_embeddings(context_tokens)
print(elmo_embedding)
print(elmo_mask)
1. 導(dǎo)入ElmoEmbedder類
2. 實(shí)例化ElmoEmbedder. 3個(gè)參數(shù)分別為參數(shù)配置文件, 預(yù)訓(xùn)練的權(quán)值文件, 想要用的gpu編號(hào), 這里兩個(gè)文件我是直接下載好的, 如果指定系統(tǒng)默認(rèn)自動(dòng)下載會(huì)花費(fèi)一定的時(shí)間, 下載地址
DEFAULT_OPTIONS_FILE = "https://s3-us-west-2.amazonaws.com/allennlp/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_options.json"
DEFAULT_WEIGHT_FILE = "https://s3-us-west-2.amazonaws.com/allennlp/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_weights.hdf5"
3. 輸入是一個(gè)list的token序列, 其中外層list的size即內(nèi)層list的個(gè)數(shù)就是我們平時(shí)說(shuō)的batch_size, 內(nèi)層每個(gè)list包含一個(gè)你想要處理的序列(這里是一句話, 你可以一篇文章或輸入任意的序列, 因?yàn)檫@里預(yù)訓(xùn)練的模型是在英文wikipidia上訓(xùn)的, 所以輸入非英文的序列肯定得到的結(jié)果沒(méi)什么意義).
4. 通過(guò)batch_to_embeddings對(duì)輸入進(jìn)行計(jì)算的到tokens的embedding結(jié)果以及我們輸入的batch的mask信息(自動(dòng)求mask)
Variable containing:
( 0 , 0 ,.,.) =
0.6923 -0.3261 0.2283 ... 0.1757 0.2660 -0.1013
-0.7348 -0.0965 -0.1411 ... -0.3411 0.3681 0.5445
0.3645 -0.1415 -0.0662 ... 0.1163 0.1783 -0.7290
... ? ...
0.0000 0.0000 0.0000 ... 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 ... 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 ... 0.0000 0.0000 0.0000
?
( 1 , 2 ,.,.) =
-0.0830 -1.5891 -0.2576 ... -1.2944 0.1082 0.6745
-0.0724 -0.7200 0.1463 ... 0.6919 0.9144 -0.1260
-2.3460 -1.1714 -0.7065 ... -1.2885 0.4679 0.3800
... ? ...
0.1246 -0.6929 0.6330 ... 0.6294 1.6869 -0.6655
-0.5757 -1.0845 0.5794 ... 0.0825 0.5020 0.2765
-1.2392 -0.6155 -0.9032 ... 0.0524 -0.0852 0.0805
[torch.cuda.FloatTensor of size 2x3x8x1024 (GPU 0)]
Variable containing:
1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1
[torch.cuda.LongTensor of size 2x8 (GPU 0)]
輸出兩個(gè)Variable, 第一個(gè)是2*3*8*1024的embedding信息, 第二個(gè)是mask.
其中2是batch_size, 3是兩層biLM的輸出加一層CNN對(duì)character編碼的輸出, 8是最長(zhǎng)list的長(zhǎng)度(對(duì)齊), 1024是每層輸出的維度
mask的輸出2是batch_size, 8實(shí)在最長(zhǎng)list的長(zhǎng)度, 第一個(gè)list有4個(gè)tokens, 第二個(gè)list有8個(gè)tokens, 所以對(duì)應(yīng)位置輸出1.
參考資料
http://shomy.top/2019/01/01/elmo-1/
https://cstsunfu.github.io/2018/06/ELMo/
https://blog.csdn.net/sinat_26917383/article/details/81913790