傳統的詞向量模型,例如 Word2Vec 和 Glove 學習得到的詞向量是固定不變的,即一個單詞只有一種詞向量,顯然不適合用於多義詞。而 ELMo 算法使用了深度雙向語言模型 (biLM),只訓練語言模型,而單詞的詞向量是在輸入句子實時獲得的,因此詞向量與上下文信息密切相關,可以較好地區分歧義。
1. 靜態詞向量算法
在之前的文章中介紹了詞嵌入算法 Word2Vec 和 Glove。與傳統的 one-hot 編碼、共現向量相比,詞嵌入算法得到的詞向量維度更低、也可以比較好地支持一些下遊的任務,例如文檔分類,問答系統等。
但是這兩種算法都是靜態詞向量算法,在數據集上訓練好一個語言模型之後,每一個詞的詞向量就固定下來了。後續使用詞向量時,無論輸入的句子是什麼,詞向量都是一樣的,例如:
"我喜歡吃小米"中的"小米"指一種食物"小米手機挺好用"中的"小米"指手機品牌給定上面兩個句子,在 Word2Vec 和 Glove 中去得到"小米"的詞向量都是一樣的,不能根據上下文給出更準確的詞向量。
而 ELMo是一種動態詞向量算法,在大型的語料庫裡訓練一個 biLSTM (雙向LSTM模型)。下遊任務需要獲取單詞詞向量的時候,將整個句子輸入 biLSTM,利用 biLSTM 的輸出作為單詞的詞向量,包含了上下文信息。可以理解成,biLSTM 是一個函數,函數的輸入是一個句子,輸出是句子中單詞的詞向量。
2. 雙向語言模型
首先介紹什麼是雙向語言模型,以及如何通過 biLSTM 得到單詞的詞向量,對 LSTM 不熟悉的童鞋可以參考前一篇文章循環神經網絡 RNN、LSTM、GRU。
2.1 雙向語言模型
雙向語言模型包括前向模型和後向模型,給定一個包含 N 個單詞的句子 T = [t(1), t(2), ..., t(N)],前向模型需要通過前面的單詞 [t(1), t(2), ..., t(k-1)] 預測下一個單詞 t(k),而後向模型需要通過後面的單詞,預測前一個單詞。
2.2 使用 biLSTM 得到上下文相關的詞向量
biLSTM 是一種雙向的循環神經網絡,包含了前向網絡與後向網絡兩部分。上圖是一個層數 L = 2 的 biLSTM。
每一個單詞 t(i) 的輸入是詞向量,這個詞向量是固定的,可以使用 Word2Vec 或者 Glove 生成的詞向量,在 ELMo 中使用了 CNN-BIG-LSTM生成的詞向量。注意,ELMo 輸入時的詞向量是固定的,ELMo 將輸入的詞向量傳到 biLSTM 得到的才是動態的,包含上下文信息。
ELMo 的論文中使用以下符號表示雙向 LSTM 中每一層對應第 i 個單詞的輸出,前向輸出包含第 i 個單詞之前的語義,後向輸出包含了第 i 個單詞之後的語義。
文章中比較難添加公式,因此使用 h(k,j,→) 表示前向輸出,使用 h(k,j,←) 表示後向向輸出,請諒解。每一層的輸出 h(k-1,j,→) 和 h(k+1,j,←) 都是單詞的動態詞向量。
LSTM 一共 L 層,對於前向 LSTM,每一個單詞 t(k-1) 的最後一層輸出 h(k-1,L,→) 用於預測下一個單詞 t(k);對於後向 LSTM,每一個單詞 t(k+1) 的最後一層輸出 h(k+1,L,←) 用於預測前一個單詞 t(k)。預測的過程採用 softmax, biLSTM 需要優化的目標函數如下:
θ(x) 表示單詞輸入時候的詞向量,這個詞向量是固定的。θ(s) 表示 softmax 層,用於預測前後的單詞。θ(LSTM,→) 表示前向 LSTM 的參數,用於計算 h(k-1,L,→)。θ(LSTM,←) 表示後向 LSTM 的參數,用於計算 h(k-1,L,←)。
3. ELMo 算法
3.1 流程介紹
ELMo 中使用的 biLSTM 層數 L = 2,ELMo 首先在大型的數據集上訓練好模型,然後再後續任務中可以根據輸入的句子,輸出每一個單詞的詞向量。例如給定一個句子 T = [t(1), t(2), ..., t(N)],ELMo 計算詞向量的方法如下:
從靜態的詞向量表裡查找單詞的詞向量 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 個詞向量。3.2 使用詞向量
在上面我們知道句子中一個單詞 i 可以得到 2L+1 個詞向量,在實際使用的過程中應該如何利用這 2L+1 個詞向量?
首先在 ELMo 中使用 CNN-BIG-LSTM 詞向量 E(i) 作為輸入,E(i) 的維度等於 512。然後每一層 LSTM 可以得到兩個詞向量 h(i,layer,→) 和 h(i,layer,←),這兩個向量也都是 512 維。則對於單詞 i 可以構造出 L+1 個詞向量。
h(i,0) 表示兩個 E(i) 直接拼接,表示輸入詞向量,這是靜態的,1024 維。
h(i,j) 表示第 j 層 biLSTM 的兩個輸出詞向量 h(i,j,→) 和 h(i,j,←) 直接拼接,這是動態的,1024維。
ELMo 中不同層的詞向量往往的側重點往往是不同的,輸入層採用的 CNN-BIG-LSTM 詞向量可以比較好編碼詞性信息,第 1 層 LSTM 可以比較好編碼句法信息,第 2 層 LSTM 可以比較好編碼單詞語義信息。
ELMo 的作者提出了兩種使用詞向量的方法:
第一種是直接使用最後一層 biLSTM 的輸出作為詞向量,即 h(i,L)。
第二種是更加通用的做法,將 L+1 個輸出加權融合在一起,公式如下。γ 是一個與任務相關的係數,允許不同的 NLP 任務縮放 ELMo 的向量,可以增加模型的靈活性。s(task,j) 是使用 softmax 歸一化的權重係數。
3.3 ELMo效果
這是論文中的一個例子,上面的是 Glove,下面兩行是 ELMo。可以看到 Glove 查找 play 的最近鄰,會出現「遊戲」、「表演」、「運動」等相關的單詞,可能與 paly 在句子中的實際意思不同。但是在 ELMo 中,可以看到第一個句子中的 play 是比賽的意思,其最近鄰句子的 play 也是比賽的意思。而第二個句子的 play 都是表演的意思。說明 ELMo 可以根據上下文更好地得到一個單詞的詞向量。
4. ELMo 總結
ELMo 訓練語言模型,而不是直接訓練得到單詞的詞向量,在後續使用中可以把句子傳入語言模型,結合上下文語義得到單詞更準確的詞向量。
使用了 biLSTM,可以同時學習得到保存上文信息和下文信息的詞向量。
biLSTM 中不同層得到的詞向量側重點不同,輸入層採用的 CNN-BIG-LSTM 詞向量可以比較好編碼詞性信息,第 1 層 LSTM 可以比較好編碼句法信息,第 2 層 LSTM 可以比較好編碼單詞語義信息。通過多層詞向量的融合得到最終詞向量,最終詞向量可以兼顧多種不同層次的信息。
參考文獻
1. Deep contextualized word representations
https://arxiv.org/pdf/1810.04805.pdf
2. 知乎:ELMo原理解析及簡單上手使用
https://zhuanlan.zhihu.com/p/51679783