本文是在上文自然語言處理——詞的表示基礎上,引入一個更先進的詞向量模型GloVe。然后介紹如何內在和外在地評估詞向量。
1 Global Vectors for Word Representation (GloVe)
1.1 和先前方法的比較
上文介紹了兩類獲取詞向量的方法。第一類基於計數和矩陣分解,比如潛在語義分析(Latent Semantic Analysis,LSA)、語義存儲模型(Hyperspace Analogue to Language,HAL)。這類方法有效地利用全局統計信息,善於捕捉詞匯間的相似之處,但是對諸如詞類比(比如:北京之於中國,相當於東京之於日本。其實就是對對聯嘛:天對地,雨對風,大陸對長空。山花對海樹,赤日對蒼穹。現成的訓練語料^_^)的任務就無能為力了,說明這是欠佳的向量空間結構。另一類基於淺窗口(窗口一般是5到10),通過在局部上下文窗口中做預測來學習詞向量(比如skip-gram和CBOW)。這類方法處理詞匯相似性之外,還能捕捉到復雜的語言模式,但並不能利用全局的共現統計信息。
相比之下,二者的優點GloVe兼而有之。由於包含一個基於詞與詞全局共現次數的最小二乘模型,因此更有效地利用了全局統計信息。該模型生成的詞向量空間具有更豐富的子結構。它在詞類比的任務中達到了最高的水准,在一些詞相似性任務中也勝過了其他的模型。
簡而言之,GloVe利用全局統計信息預測詞$j$出現在詞$i$的上下文環境中的概率。
1.2 共現矩陣
- $X$:詞與詞的共現矩陣。
- $X_{ij}$:詞$j$出現在詞$i$的上下文環境中的次數。
- $X_i = \sum_k X_{ik}$:在詞$i$的上下文環境中出現過的所有詞的總數。
- $P_{ij} = P(w_j|w_i) = \frac{X_{ij}}{X_i}$:詞$j$出現在詞$i$的上下文環境中的概率。
計算該矩陣需要對整個語料進行一次掃描。對於較大的語料集,這是耗時的,不過也是一勞永逸的。
1.3 最小二乘目標函數
回憶一下,在skip-gram模型中,我們使用softmax來計算詞$j$出現在詞$i$的上下文環境中的概率:
\begin{align*}
Q_{ij} = \frac{\exp(\vec{u}_j^T\vec{v}_i)}{\sum_{w=1}^{W} \exp(\vec{u}_w^T\vec{v}_i)}
\end{align*}
可以通過在線的,隨機的方式進行訓練(這里是隨機梯度下降的意思吧。這種模型可用於在線學習,從而與時俱進,對於新語料、新詞匯的加入很友好,這點要優於GloVe)。但是其中包含的全局交叉熵損失可通過如下方式計算:
\begin{align*}
J = -\sum_{i \in corpus} \sum_{j \in context(i)} \log(Q_{ij})
\end{align*}
由於同樣的詞$i$和詞$j$可能會在語料中共現多次,首先將同樣的$i$和$j$整合到一起:
\begin{align*}
J = -\sum_{i=1}^{W} \sum_{j=1}^{W} X_{ij} \log(Q_{ij})
\end{align*}
交叉熵損失有一個明顯的缺陷:需要對$Q$的分布進行適當的規范化(也就是說,$Q$必須是個概率空間,$\sum Q = 1$),而這涉及到對所有的詞匯求和,計算量巨大(其中,上一節的3.4 Negative Sampling和3.5 分層Softmax也給出了針對這一問題的解決方案)。為了避免這一問題,我們使用最小二乘目標函數,並拋棄掉需要規范化的因子$Q$:
\begin{align*}
\hat{j} = \sum_{i=1}^{W} \sum_{j=1}^{W}X_i(\hat{P}_{ij} - \hat{Q}_{ij})^2
\end{align*}
其中,$\hat{P}_{ij} = X_{ij}$和$\hat{Q}_{ij} = \exp(\vec{u}_j^T\vec{v}_i)$是未規范化分布(unnormalized distributions,可以參考What is an unnormalized measure in probability theory?以及Unnormalized probability: A different view of statistical mechanics)。這一公式有引入了新的問題:$X_{ij}$的值往往都很大,導致難以優化。一個有效的解決方案是取對數:
\begin{align*}
\hat{j} &= \sum_{i=1}^{W} \sum_{j=1}^{W}X_i(\log(\hat{P}_{ij}) - \log(\hat{Q}_{ij}))^2 \\
&= \sum_{i=1}^{W} \sum_{j=1}^{W} X_i(\vec{u}_j^T\vec{v}_i - \log(X_{ij}))^2
\end{align*}
此外,根據觀察發現,我們並不能保證權重因子$X_i$是最優的。因此,我們使用一個更一般的權重函數,可以根據上下文詞匯自由選擇:
\begin{align*}
\hat{j} &= \sum_{i=1}^{W} \sum_{j=1}^{W} f(X_{ij})(\vec{u}_j^T\vec{v}_i - \log(X_{ij}))^2
\end{align*}
2 詞向量評估
到目前為止,我們已經介紹了諸如Word2Vec、GloVe的方法,來訓練和發現自然語言詞語在語義空間潛在的詞向量表示。接下來,我們介紹如何評估這些由不同模型所產生的詞向量。
2.1 內在評估
內在評估就是通過明確的中間子任務(一個媒介任務,並不是最終的任務,比如詞匯類比的表現)對各種技術產生的詞向量進行評估。這些子任務一般都很簡單,並且可以很快得到計算,因此幫助我們理解生成這些詞向量的系統。內在評估方法一般都會返回一個數字,來說明詞向量在這些子任務中的表現。
使用內在評估方法的動機是什么呢?比如我們的最終目標是創建一個以詞向量為輸入的問答系統。可以用如下方法訓練一個機器學習系統:
- 以詞作為輸入
- 將詞轉換成詞向量
- 使用詞向量作為一個機器學習系統的輸入
- 將輸出的詞向量映射為相應的自然語言詞匯
- 將詞作為答案輸出
在構建對話系統的過程中,需要創建盡可能理想的詞向量表示,因為這會用於下游的子系統(比如一個深度神經網絡)。為達到這一目的,需要調整Word2Vec子系統中的許多超參數(比如詞向量的維度)。最理想的方法是,每調整一個Word2Vec的超參數,就對整個系統重新訓練一次。但這在工程實踐中是不可能的,因為下游的機器學習系統(第3步)很可能是個深度神經網絡,具有成千上萬個參數,訓練起來很費時間。在這種情形下,就需要一個內在的評估手段,來鑒別所生成詞向量的優劣。
簡而言之,內在評估有如下特點:
- 在一個明確的中間任務上評估
- 可以快速算得結果
- 有助於理解子系統(也就是生成詞向量的系統)
- 和最終的任務正相關
2.2 外在的評估
- 使用真實的任務進行評估
- 計算時間較長
- 不容易確定,到底是哪個子系統出了問題,或者交叉影響
- 替換掉一個子系統,看一下性能是否提升。
2.3 內在評估案例:詞向量類比
在詞向量類比中,首先給出如下不完整的類比形式:
a : b : : c : ?
然后內在評估系統求得使下面余弦相似度最大的詞向量:
\begin{align*}
d = \mathop{\arg\max}\limits_{i} \frac{(x_b - x_a + x_c)^T x_i}{\left \| x_b - x_a + x_c \right \|}
\end{align*}
這一度量標准有一個直觀上的解釋。理想的情況下,我們希望$x_b - x_a = x_d - x_c$(比如,后 - 王 = 女演員 - 男演員)。
考慮如下形式的詞類比:
城市1:所在州1::城市2:所在州2
表1 語義上的詞向量類比
由於美國大量的城市/城鎮/鄉村存在同名的情況(其實中國也一樣。比如吉林省市同名,廣州市和貴陽市都有一個白雲區,全國有無數個城關鎮),所以有些答案可能不唯一。例如,全美至少有10個地方叫做Phoenix,因此Arizona不需要是唯一的正確答案。我們再來看另一個形式的類比:
首都1:國家1::首都2:國家2
在很多情況下,以上形式產生的都是該國家最近的首都。這也有一個問題,比如,在1997年以前,哈薩克斯坦的首都是阿拉木圖(現在是阿斯塔納)。因此,如果語料過時的話,我們會得到不同的答案。
上面兩個例子,都是詞向量在語義上的類比,當然也可以在語法上類比。例如,形容詞與其最高級的類比:
表2 語法上的詞向量類比
2.4 內在評估調整案例
可供內在評估技術調整的幾個詞向量模型超參數:
- 詞向量維度
- 語料大小
- 語料來源/種類
- 上下文窗口大小
- 上下文對稱性
表3 不同模型在不同語料和超參數下的表現
從表3中,我們可以總結出3點主要的信息:
- 效果嚴重依賴於所使用的模型。
- 大語料集可以取得剛好的效果。
- 詞向量維度過高或過低,效果都不理想。維度過低捕捉的信息不全,從而欠擬合。維度過高,容易捕捉到語料中的噪聲,從而過擬合。
實現細節:窗口選擇8時,GloVe的效果最好。
以下三幅圖分布是對訓練次數、語料規模、詞向量維度和窗口大小的調整:
圖1 迭代次數對性能的影響
圖2 語料規模如何影響詞向量的性能
圖3 詞向量維度、窗口大小對GloVe性能的影響
2.5 內在評估案例:相似性評估
另一個內在評估方法是,人工標注兩個詞之間的相似度(在一定范圍內,比如0-1),然后和兩個詞向量之間的余弦相似度進行比較。
表4 通過相似度評估不同模型的性能
3 外在任務的訓練
下面討論使用詞向量處理真實的外在任務的一般方法。
3.1 問題界定
大多數NLP任務都可以被定義為分類任務。例如,給一個句子,分析其情感是積極的還是消極的。類似的,對於命名實體識別(named-entity recognition,NER), 給出一個上下文環境和一個中心詞,我們需要將中心詞歸為很多類別中的一個。例如,"Jim bought 300 shares of Acme Corp. in 2006",分類后的輸出結果為:"[Jim]Person bought 300 shares of [Acme Corp.]Organization in [2006]Time."。對於這類問題,我們一般都是從如下形式的訓練集開始:
\begin{align*}
\{ x^{(i)}, y^{(i)} \}_1^N
\end{align*}
其中,$x^{(i)}$是一個d維詞向量。$ y^{(i)}$是代表某個類別的one-hot向量(比如情感信息,別的詞語,命名實體,買入/賣出信號,等等)。
在一般的機器學習任務中,我們通常都是使用輸入數據和目標標簽,通過一些優化技術(比如梯度下降,L-BFGS,牛頓法,等等)來訓練模型。但是在NLP任務中,我們引入一個新的思想:在訓練外在任務時,再次訓練詞向量。下面將討論為什么以及什么時候需要這樣做。
3.2 再次訓練詞向量
正如上面所討論的,外在任務所使用的詞向量,是通過簡單的內在任務進行優化的。在很多情況下,這種詞向量應用於外在任務都能有良好的表現。詞向量可以通過外在任務進一步訓練,以便達到更好的效果。不過,再次訓練也是有風險的,如果訓練語料太少,返回會使情況更糟糕。
3.3 Softmax分類和正則化
讓我們分析一下Softmax分類函數的形式:
\begin{align*}
p(y_j=1|x) = \frac{\exp(W_j \cdot x)}{\sum_{c=1}^{C}\exp(W_c \cdot x)}
\end{align*}
上式計算了詞向量$x$是類別$j$的概率。使用交叉熵損失函數,對一個訓練樣本計算如下的損失:
\begin{align*}
-\sum_{j=1}^C y_j \log(p(y_j=1|x)) = -\sum_{j=1}^C y_j \log(\frac{\exp(W_j \cdot x)}{\sum_{c=1}^{C}\exp(W_c \cdot x)})
\end{align*}
事實上,上面的求和,$(C-1)$個都是0,只有$y_j$是1。假設$k$是正確類別的索引,上式可以簡化為:
\begin{align*}
-\log(\frac{\exp(W_k \cdot x)}{\sum_{c=1}^{C}\exp(W_c \cdot x)})
\end{align*}
將上面的損失函數擴展到訓練集的$N$個點:
\begin{align*}
-\sum_{i=1}^{N} \log(\frac{\exp(W_{k(i)} \cdot x^{(i)})}{\sum_{c=1}^{C}\exp(W_c \cdot x^{(i)})})
\end{align*}
其中,$k(i)$是一個函數,返回實例$x^{(i)}$所對應的正確類別的索引。
讓我們來估計一下,如果同時訓練模型權重$W$和詞向量$x$,需要更新的參數個數。對於一個簡單的線性決策邊界,模型至少需要一個$d$維的輸入詞向量,並且產生$C$個類別的分布。因此,更新模型參數至少是更新$C \cdot d$個參數。如果同時更新詞庫$V$中的每一個詞,那就需要更新$\left | V \right |$個詞向量,這是$\left | V \right | \cdot d$個參數。所以總共需要更新的參數個數是$C \cdot d + \left | V \right | \cdot d$。這是數量是巨大的,很容易造成過擬合。解決方案也很簡單,增加正則項:
\begin{align*}
-\sum_{i=1}^{N} \log(\frac{\exp(W_{k(i)} \cdot x^{(i)})}{\sum_{c=1}^{C}\exp(W_c \cdot x^{(i)})})
+ \lambda \sum_{k=1}^{C \cdot d + \left | V \right | \cdot d} \theta_k^2
\end{align*}
本文翻譯自CS224n課程的官方筆記2,對應該課程的第3、4節。