傳統(tǒng)的詞向量模型,例如 Word2Vec 和 Glove 學(xué)習(xí)得到的詞向量是固定不變的,即一個(gè)單詞只有一種詞向量,顯然不適合用于多義詞。而 ELMo 算法使用了深度雙向語言模型 (biLM),只訓(xùn)練語言模型,而單詞的詞向量是在輸入句子實(shí)時(shí)獲得的,因此詞向量與上下文信息密切相關(guān),可以較好地區(qū)分歧義。
1. 靜態(tài)詞向量算法
在之前的文章中介紹了詞嵌入算法 Word2Vec 和 Glove。與傳統(tǒng)的 one-hot 編碼、共現(xiàn)向量相比,詞嵌入算法得到的詞向量維度更低、也可以比較好地支持一些下游的任務(wù),例如文檔分類,問答系統(tǒng)等。
但是這兩種算法都是靜態(tài)詞向量算法,在數(shù)據(jù)集上訓(xùn)練好一個(gè)語言模型之后,每一個(gè)詞的詞向量就固定下來了。后續(xù)使用詞向量時(shí),無論輸入的句子是什么,詞向量都是一樣的,例如:
”我喜歡吃小米“中的”小米“指一種食物
”小米手機(jī)挺好用“中的”小米“指手機(jī)品牌
給定上面兩個(gè)句子,在 Word2Vec 和 Glove 中去得到“小米“的詞向量都是一樣的,不能根據(jù)上下文給出更準(zhǔn)確的詞向量。
而 ELMo 是一種動態(tài)詞向量算法,在大型的語料庫里訓(xùn)練一個(gè) biLSTM (雙向LSTM模型)。下游任務(wù)需要獲取單詞詞向量的時(shí)候,將整個(gè)句子輸入 biLSTM,利用 biLSTM 的輸出作為單詞的詞向量,包含了上下文信息。可以理解成,biLSTM 是一個(gè)函數(shù),函數(shù)的輸入是一個(gè)句子,輸出是句子中單詞的詞向量。
2. 雙向語言模型
首先介紹什么是雙向語言模型,以及如何通過 biLSTM 得到單詞的詞向量,對 LSTM 不熟悉的童鞋可以參考前一篇文章《循環(huán)神經(jīng)網(wǎng)絡(luò) RNN、LSTM、GRU》。
2.1 雙向語言模型
雙向語言模型包括前向模型和后向模型,給定一個(gè)包含 N 個(gè)單詞的句子 T = [t(1), t(2), ..., t(N)],前向模型需要通過前面的單詞 [t(1), t(2), ..., t(k-1)] 預(yù)測下一個(gè)單詞 t(k),而后向模型需要通過后面的單詞,預(yù)測前一個(gè)單詞。

2.2 使用 biLSTM 得到上下文相關(guān)的詞向量

biLSTM 是一種雙向的循環(huán)神經(jīng)網(wǎng)絡(luò),包含了前向網(wǎng)絡(luò)與后向網(wǎng)絡(luò)兩部分。上圖是一個(gè)層數(shù) L = 2 的 biLSTM。
每一個(gè)單詞 t(i) 的輸入是詞向量,這個(gè)詞向量是固定的,可以使用 Word2Vec 或者 Glove 生成的詞向量,在 ELMo 中使用了 CNN-BIG-LSTM 生成的詞向量。注意,ELMo 輸入時(shí)的詞向量是固定的,ELMo 將輸入的詞向量傳到 biLSTM 得到的才是動態(tài)的,包含上下文信息。
ELMo 的論文中使用以下符號表示雙向 LSTM 中每一層對應(yīng)第 i 個(gè)單詞的輸出 ,前向輸出包含第 i 個(gè)單詞之前的語義,后向輸出包含了第 i 個(gè)單詞之后的語義。

文章中比較難添加公式,因此使用 h(k,j,→) 表示前向輸出,使用 h(k,j,←) 表示后向向輸出,請諒解。每一層的輸出 h(k-1,j,→) 和 h(k+1,j,←) 都是單詞的動態(tài)詞向量。
LSTM 一共 L 層,對于前向 LSTM,每一個(gè)單詞 t(k-1) 的最后一層輸出 h(k-1,L,→) 用于預(yù)測下一個(gè)單詞 t(k);對于后向 LSTM,每一個(gè)單詞 t(k+1) 的最后一層輸出 h(k+1,L,←) 用于預(yù)測前一個(gè)單詞 t(k)。預(yù)測的過程采用 softmax, biLSTM 需要優(yōu)化的目標(biāo)函數(shù)如下:

θ(x) 表示單詞輸入時(shí)候的詞向量,這個(gè)詞向量是固定的。θ(s) 表示 softmax 層,用于預(yù)測前后的單詞。θ(LSTM,→) 表示前向 LSTM 的參數(shù),用于計(jì)算 h(k-1,L,→)。θ(LSTM,←) 表示后向 LSTM 的參數(shù),用于計(jì)算 h(k-1,L,←)。
3. ELMo 算法
3.1 流程介紹

ELMo 中使用的 biLSTM 層數(shù) L = 2,ELMo 首先在大型的數(shù)據(jù)集上訓(xùn)練好模型,然后再后續(xù)任務(wù)中可以根據(jù)輸入的句子,輸出每一個(gè)單詞的詞向量。例如給定一個(gè)句子 T = [t(1), t(2), ..., t(N)],ELMo 計(jì)算詞向量的方法如下:
從靜態(tài)的詞向量表里查找單詞的詞向量 E(1), ..., E(N) 用于輸入。ELMo 使用 CNN-BIG-LSTM 生成的詞向量作為輸入。
將單詞詞向量 E(1), ..., E(N) 分別輸入第 1 層前向 LSTM 和后向 LSTM,得到前向輸出 h(1,1,→), ..., h(N,1,→),和后向輸出 h(1,1,←), ..., h(N,1,←)。
將前向輸出 h(1,1,→), ..., h(N,1,→) 傳入到第 2 層前向 LSTM,得到第 2 層前向輸出 h(1,2,→), ..., h(N,2,→);將后向輸出 h(1,1,←), ..., h(N,1,←) 傳入到第 2 層后向 LSTM,得到第 2 層后向輸出 h(1,2,←), ..., h(N,2,←)。
則單詞 i 最終可以得到的詞向量包括 E(i), h(N,1,→), h(N,1,←), h(N,2,→), h(N,2,←),如果采用 L 層的 biLSTM 則最終可以得到 2L+1 個(gè)詞向量。
3.2 使用詞向量
在上面我們知道句子中一個(gè)單詞 i 可以得到 2L+1 個(gè)詞向量,在實(shí)際使用的過程中應(yīng)該如何利用這 2L+1 個(gè)詞向量?
首先在 ELMo 中使用 CNN-BIG-LSTM 詞向量 E(i) 作為輸入,E(i) 的維度等于 512。然后每一層 LSTM 可以得到兩個(gè)詞向量 h(i,layer,→) 和 h(i,layer,←),這兩個(gè)向量也都是 512 維。則對于單詞 i 可以構(gòu)造出 L+1 個(gè)詞向量。

h(i,0) 表示兩個(gè) E(i) 直接拼接,表示輸入詞向量,這是靜態(tài)的,1024 維。
h(i,j) 表示第 j 層 biLSTM 的兩個(gè)輸出詞向量 h(i,j,→) 和 h(i,j,←) 直接拼接,這是動態(tài)的,1024維。
ELMo 中不同層的詞向量往往的側(cè)重點(diǎn)往往是不同的,輸入層采用的 CNN-BIG-LSTM 詞向量可以比較好編碼詞性信息,第 1 層 LSTM 可以比較好編碼句法信息,第 2 層 LSTM 可以比較好編碼單詞語義信息。
ELMo 的作者提出了兩種使用詞向量的方法:
第一種是直接使用最后一層 biLSTM 的輸出作為詞向量,即 h(i,L)。
第二種是更加通用的做法,將 L+1 個(gè)輸出加權(quán)融合在一起,公式如下。γ 是一個(gè)與任務(wù)相關(guān)的系數(shù),允許不同的 NLP 任務(wù)縮放 ELMo 的向量,可以增加模型的靈活性。s(task,j) 是使用 softmax 歸一化的權(quán)重系數(shù)。

3.3 ELMo效果

這是論文中的一個(gè)例子,上面的是 Glove,下面兩行是 ELMo??梢钥吹?Glove 查找 play 的最近鄰,會出現(xiàn)“游戲”、“表演”、“運(yùn)動”等相關(guān)的單詞,可能與 paly 在句子中的實(shí)際意思不同。但是在 ELMo 中,可以看到第一個(gè)句子中的 play 是比賽的意思,其最近鄰句子的 play 也是比賽的意思。而第二個(gè)句子的 play 都是表演的意思。說明 ELMo 可以根據(jù)上下文更好地得到一個(gè)單詞的詞向量。
4. ELMo 總結(jié)
ELMo 訓(xùn)練語言模型,而不是直接訓(xùn)練得到單詞的詞向量,在后續(xù)使用中可以把句子傳入語言模型,結(jié)合上下文語義得到單詞更準(zhǔn)確的詞向量。
使用了 biLSTM,可以同時(shí)學(xué)習(xí)得到保存上文信息和下文信息的詞向量。
biLSTM 中不同層得到的詞向量側(cè)重點(diǎn)不同,輸入層采用的 CNN-BIG-LSTM 詞向量可以比較好編碼詞性信息,第 1 層 LSTM 可以比較好編碼句法信息,第 2 層 LSTM 可以比較好編碼單詞語義信息。通過多層詞向量的融合得到最終詞向量,最終詞向量可以兼顧多種不同層次的信息。