(Stanford CS224d) Deep Learning and NLP課程筆記(三):GloVe與模型的評估
本節課繼續講授word2vec模型的演算法細節,並介紹了一種新的基於共現矩陣的詞向量模型——GloVe模型。最後,本節課重點介紹了word2vec模型評估的兩種方式。
Skip-gram模型
上節課,我們介紹了一個十分簡單的word2vec模型。模型的目標是預測word \(o\)出現在另一個word \(c\)的上下文語境裡的條件概率:
\[p(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w=1}^W{exp(u_w^Tv_c)}}\]
其中,向量\(u_o\)被稱為word \(o\)的outside vector;向量\(v_c\)被稱為word \(c\)的inside vector。
模型的損失函式是一個對數似然概率:
\[J(\theta) = \frac{1}{T}{\sum_{t=1}^T\sum_{-m \leq j \leq m, j \neq 0} \log{p(w_{t+j}|w_t)}}\]
後面我們會看到這個損失函式的物理意義。
我們通常用一個向量\(\theta\)表示模型的所有引數(這裡是詞典中每個word的\(u\)、\(v\)向量)。顯然這是一個維度巨大的長向量(\(\theta \in \mathbf{R}^{2dV}\))。然而,在用SGD(隨機梯度下降法)求解模型的引數時,對於每一個時間視窗,我們至多僅有\(2c-1\)個單詞需要計算。因此,\(\theta\)
為此,在word2vec模型裡,我們通常用一個叫做embedding matrix的矩陣儲存模型的引數。該矩陣的大小為\(d \times V\),每一列對應著詞典中一個word的詞向量。藉助這個hash詞表,我們可以只對當前訓練時出現的詞向量進行更新。
然而,這個簡單的word2vec模型的訓練卻並不簡單。原因在於計算損失函式的梯度時需要用到歸一化的條件概率——而正是這個歸一化成為了模型訓練的瓶頸。想象一個百萬量級的詞典,每一步訓練我們都需要計算上百萬次詞向量的內積——顯然,這是無法容忍的。
因此,Mikolov在2013年那篇著名的論文裡提出了一種負取樣(Negative Sampling)的似然函式,避免了歸一化概率的計算:
\[J_t(\theta) = \log \sigma(u_o^Tv_c) + \sum_{i=1}^K E_{j \sim P(w)} [\log \sigma(-u_j^Tv_c)]\]
其本質是訓練一個二分類的邏輯迴歸函式,用於判斷一對詞是來自真實語料環境還是取樣自一個隨機的噪聲分佈。\(K\)是模型的超引數,決定負取樣的個數。\(\sigma(x) = \frac{1}{1 + e^{-x}}\)是邏輯迴歸函式,也被稱為Sigmoid函式。注意到\(\sigma(-x) = 1 - \sigma(x)\)。 \(P(w)\)通常取為\(U(w)^{\frac{3}{4}}\)。冪次項對超高頻的word起到了下采樣的作用。
基於這個似然函式,Mikolov在他的word2vec工具包裡提供了兩種模型:Skip-gram和CBoW。這兩個模型都是一個log-bilinear的淺層神經網路結構。區別在於,Skip-gram是用一個center word預測其context裡的word;而CBoW是用context裡的所有word去預測一個center word。顯然,前者對訓練資料的利用更高效,因此,對於較小的語料庫,Skip-gram是更好的選擇。
GloVe模型
在上節課最後,我們比較了基於統計的詞向量模型和基於預測的詞向量模型。前者以基於SVD分解技術的LSA模型為代表,通過構建一個共現矩陣得到隱層的語義向量,充分利用了全域性的統計資訊。然而這類模型得到的語義向量往往很難把握詞與詞之間的線性關係(例如著名的King、Queen、Man、Woman等式)。後者則以基於神經網路的Skip-gram模型為代表,通過預測一個詞出現在上下文裡的概率得到embedding詞向量。這類模型的缺陷在於其對統計資訊的利用不充分,訓練時間與語料大小息息相關。不過,其得到的詞向量能夠較好地把握詞與詞之間的線性關係,因此在很多工上的表現都要略優於SVD模型。
既然兩種模型各有優劣,那麼能不能二者各取其長,構造一個更強大的詞向量模型呢?這就是接下來要介紹的GloVe模型。
在GloVe的原始論文裡,作者首先分析了Skip-gram模型能夠挖掘出詞與詞之間線性關係的背後成因,然後通過在共現矩陣上構造相似的條件,得到一個基於全域性資訊的詞向量模型——GloVe模型。
GloVe模型的損失函式是:
\[J(\theta) = \frac{1}{2} \sum_{i,j = 1}^W {f(P_{ij})(u_i^Tv_j - \log{P_{ij}})^2}\]
其中,\(f(x)\)是一個截斷函式,以降低高頻詞對模型的干擾。
與Skip-gram模型相比,GloVe在充分利用了語料庫的全域性統計資訊的同時,也提高了詞向量在大語料上的訓練速度(一個共現矩陣的遍歷要比整個語料庫的遍歷容易的多)。而與傳統的SVD技術相比,SGD的訓練也更加簡單高效。同時,GloVe得到的詞向量更能把握住詞與詞之間的線性關係。
模型的評估
在NLP的研究領域裡,一個模型的評估通常有兩種方式:Intrinsic和Extrinsic。
Intrinsic評估關注的是模型在一個特定子任務上的表現。子任務的設計使得Intrinsic的評估快速便捷,同時有助於我們更好地理解模型內在的性質。不過,要注意的是,除非子任務被設計為與我們的最終目標有一定的聯絡,否則,模型在子任務上的評估結果並不具有太大的意義。
Extrinsic評估則關注的是模型在一個具體任務上的表現。比如情感分析或是機器翻譯。此時,我們關注的模型通常只是一個更復雜模型裡的一部分。因此,Extrinsic評估一般比較耗時。但是相比於Intrinsic評估更具有參考意義。
Intrinsic評估
對於詞向量模型,一個常用的Intrinsic評估是向量類比(word vector analogies)。它評估了一組詞向量在語義和句法上表現出來的線性關係。具體來說,給定一組詞(a, b, c, d),我們要驗證的是:\(d=\arg\max_i{\frac{(x_b-x_a+x_c)^Tx_i}{||x_b-x_a+x_c||}}\),即\(d\)是與向量\((x_b-x_a+x_c)\)的cosine距離最近的詞。
Mikolov在他的word2vec開源工具包裡也提供了用於word analogy評估的資料集。例如國家與首都的類比資料,時態或是比較級的類比資料。
藉助於Intrinsic評估,我們也可以方便快捷地對模型的超引數(Hyperparameters)進行選擇。例如向量的維度,context window的大小,甚至是模型的選擇。
Extrinsic評估
值得注意的是,即使一些模型在人為設定的Intrinsic任務上表現較弱,並不能說明它們在具體的真實任務中毫無優勢。Intrinsic評估的主要作用是對模型的超引數進行初步的調整和選擇(這種模型選擇在Extrinsic任務上往往極為耗時)。而評估模型的優劣還是要看它在Extrinsic任務上的表現。
對於詞向量模型,常見的Extrinsic任務是對詞向量進行分類。例如命名實體識別(NER)和情感分析。理論上,如果我們習得的詞向量足夠精確,那麼語義或句法上相近的詞必然分佈在同一片向量空間。這就使得基於詞向量的分類更加準確。
為此,我們引入專門處理多分類問題的Softmax函式。這個函式是Sigmoid函式的一般形式;它給出了每個類別在輸入特徵\(x\)下的歸一化條件概率。在後面的課程中,我們會經常用到這個函式:
\[p(y|x) = \frac{exp(W_yx)}{\sum_{c=1}^C exp(W_cx)}\]
(這其實就是上節課我們介紹word2vec模型時提到的條件概率\(p(o|c)\)!因此,矩陣\(W\)也可以被認為是分類label \(y\)的主題向量。)
由於Softmax的輸出是一個概率分佈,因此,我們通常用交叉熵(Cross Entropy)來定義Softmax的損失函式。
交叉熵可以用兩個分佈的\(KL\)散度表達:
\[H(p, q) = H(p) + D_{KL}(p||q)\]
其中,\(p\)是真實的概率分佈,\(q\)是我們估計的概率分佈。\(D_{KL}(p||q)\)是一個非對稱的變數,它定義了這兩個分佈的“距離”:
\[D_{KL}(p||q) = \sum_{c=1}^Cp(c)\log{\frac{p(c)}{q(c)}}\]
因此,最小化兩個分佈的交叉熵,等價於最小化這兩個分佈的\(KL\)散度距離。
對上式化簡,我們得到交叉熵一個更直接的定義:
\[H(p, q) = -\sum_{c=1}^C{p(c)\log{q(c)}}\]
在單分類問題中,一條訓練樣本對應的\(p\)是一個one-hot向量。因此,\(H(p, q)\)可以進一步簡化為:
\[H(p, q) = -\log{q(y=c|x)}\]
其中,\(p(c) = 1\)。(對這個損失函式可以直觀地理解為最大化目標label的對數似然概率)
最後,在用Extrinsic任務訓練Softmax權重\(W\)時,有一個問題值得考慮:我們是否也要同時對embedding的詞向量進行調整?答案是,it depends。微調embedding的詞向量固然使得模型能夠更好地擬合訓練資料,但如果訓練資料不是足夠多,對部分詞向量的微調可能會破壞整個向量空間原有的幾何結構,而使得模型的泛化能力反而變差了。