Deep contextualized word representations (ELMo)
最近NLP突飛猛進,現有ELMo,後有BERT。
glove以及word2vec的word embedding在nlp任務中都取得了最好的效果, 現在幾乎沒有一個NLP的任務中不加word embedding.
常用的擷取embedding方法都是通過訓練language model, 将language model中預測的hidden state做為word的表示, 給定N個tokens的序列
(t1,t2,...,tn)(t1,t2,...,tn)
, 前向language model就是通過前k-1個輸入序列
(t1,t2,...,tk)(t1,t2,...,tk)
的hidden表示, 預測第k個位置的token, 反向的language model就是給定後面的序列, 預測之前的, 然後将language model的第k個位置的hidden輸出做為word embedding。
之前的做法的缺點是對于每一個單詞都有唯一的一個embedding表示, 而對于多義詞顯然這種做法不符合直覺, 而單詞的意思又和上下文相關, ELMo的做法是我們隻預訓練language model, 而word embedding是通過輸入的句子實時輸出的, 這樣單詞的意思就是上下文相關的了, 這樣就很大程度上緩解了歧義的發生。且ELMo輸出多個層的embedding表示, 試驗中已經發現每層LM輸出的資訊對于不同的任務效果不同, 是以對每個token用不同層的embedding表示會提升效果。
elmo語言模型

目标:
-
正向:對于序列,通過前n-1個token,預測第n個token。
p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , … , t k − 1 ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right) p(t1,t2,…,tN)=k=1∏Np(tk∣t1,t2,…,tk−1)
-
反向:通過目前詞語後的[n+1, n + 2,…, seq_len]位置的token,預測第n個token。
p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , … , t N ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{k+1}, t_{k+2}, \ldots, t_{N}\right) p(t1,t2,…,tN)=k=1∏Np(tk∣tk+1,tk+2,…,tN)
使用的網絡是Bi_LSTM,正向LSTM任務為正向目标,反向為反向目标,通過在語料上訓練出模型,用于下遊的任務。
fine-tuning
對于一個L層的elmo,共有2L+1個向量,對于下遊網絡使用,是直接用最上層的輸出?還是将所有向量concat呢?
文中方法:提出基于任務的權重矩陣,通過目标任務來訓練權重:
E L M o k task = E ( R k ; Θ task ) = γ task ∑ j = 0 L s j task h k , j L M \mathrm{ELMo}_{k}^{\text {task}}=E\left(R_{k} ; \Theta^{\text {task}}\right)= \gamma^{\operatorname{task}} \sum_{j=0}^{L} s_{j}^{\operatorname{task}} \mathbf{h}_{k, j}^{L M} ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM
模型下載下傳:https://allennlp.org/elmo
Reference
- 論文:https://arxiv.org/abs/1802.05365
- 應用:https://arxiv.org/abs/1806.06259
- github開源代碼(TensorFlow):https://github.com/allenai/bilm-tf
- GitHub(PyTorch):https://github.com/allenai/allennlp