天天看點

從詞向量衡量标準到全局向量的詞嵌入模型GloVe再到一詞多義的解決方式衡量标準Evaluation引子全局向量的詞嵌入應用對一詞多義的思考Reference

衡量标準Evaluation

此處的衡量标準主要是針對單詞向量而言。

内部标準Intrinsic

  • 固定任務 (specific subtask)
  • 運作時間 (time taken to compute)
  • 能否幫助了解系統 (helps to understand the system)

外部标準Extrinsic

  • 真實任務的評估 (evaluation on a real task)
  • 計算正确率的用時 (time taken to compute accuracy)
  • 不清楚是該子系統問題還是它與其他子系統的互相作用導緻了問題的出現 (unclear if the subsystem is the problem or its interaction with other subsystems)

内在詞向量評估

英文是Intrinsic word vector evaluation。

引子

我們先從word2vec的跳字模型入手。考慮 w i w_i wi​為中心詞時,将其所有背景詞全部彙總并保留重複元素,記作多重集(multiset) C i \mathcal C_i Ci​。一個元素在多重集中的個數稱為該元素的重數(multiplicity)。将多重集中 j j j元素的重數記為 x i j x_{ij} xij​,表示整個資料集中所有以 w i w_i wi​為中心詞的背景視窗中詞 w j w_j wj​的個數。損失函數可以表示如下。

J = − ∑ i ∈ V ∑ j ∈ V x i j l o g P ( w j ∣ w i ) J = -\sum_{i \in V}\sum_{j \in V} x_{ij} log P(w_j|w_i) J=−i∈V∑​j∈V∑​xij​logP(wj​∣wi​)

我們将資料集中所有以 w i w_i wi​為中心詞的背景詞的數量之和 ∣ C i ∣ |\mathcal C_i| ∣Ci​∣記為 x i x_i xi​,将以 w i w_i wi​為中心詞生成背景詞 w j w_j wj​的條件機率 x i j / x i x_{ij} / x_i xij​/xi​記作 p i j p_{ij} pij​。我們可以将損失函數改寫為

J = − ∑ i ∈ V x i ∑ j ∈ V p i j l o g P ( w j ∣ w i ) J = -\sum_{i \in V} x_{i} \sum_{j \in V} p_{ij} log P(w_j|w_i) J=−i∈V∑​xi​j∈V∑​pij​logP(wj​∣wi​)

損失函數的後半部分計算的是以 w i w_i wi​為中心詞的背景詞條件機率分布 p i j p_{ij} pij​和模型預測的條件機率分布的交叉熵,前半部分使用以 w i w_i wi​為中心詞的背景詞的數量之和對交叉熵進行權重。最小化損失函數會使模型預測的條件機率分布盡可能接近訓練集的條件機率分布。

由于生僻詞出現次數少,其權重較小。模型對生僻詞的條件機率分布的預測會出現較大偏差。

類似Latent Semantic Analysis (LSA)等全局矩陣分解模型具有訓練時間短和充分運用統計知識的優點,但是模型在詞類比任務上表現較差,另外會給予常出現的詞語非常大的權重。

而諸如word2vec和NNLM等上下文視窗模型能夠學習到除詞語相似度之外的一些複雜規律,但是可擴充性較弱(不太能夠應對非常大的訓練文本),而且對統計知識的利用不足(忽視一些重複出現的詞句現象)。

下面介紹全局向量的詞嵌入模型,結合了上述兩類模型的優點。

全局向量的詞嵌入

英文是Gloabl Vectors for Word Representation (GloVe)。

損失函數

采用平方損失取代交叉熵,使用非機率分布的變量 p ’ i j = x i j p’_{ij} = x_{ij} p’ij​=xij​和 q ’ i j = e x p ( u j T v i ) q’_{ij} = exp(u_j^Tv_i) q’ij​=exp(ujT​vi​),并對他們取對數。

J = ( l o g p ’ i j − l o g q ’ i j ) 2 = ( u j T v i − l o g ( x i j ) ) 2 J = (log p’_{ij} - log q’_{ij})^2 = (u_j^Tv_i - log(x_{ij}))^2 J=(logp’ij​−logq’ij​)2=(ujT​vi​−log(xij​))2

為每一個詞 w i w_i wi​增加了兩個标量模型參數:中心詞偏差項 b i b_i bi​和背景詞偏差項 c j c_j cj​。将每個損失項的權重替換成函數 h ( x i j ) h(x_{ij}) h(xij​),值域在[0,1]之間,單調遞增。

∑ i ∈ V ∑ j ∈ V h ( x i j ) ( u j T v i + b i + c j − l o g ( x i j ) ) 2 \sum_{i \in V} \sum_{j \in V} h(x_{ij}) (u_j^Tv_i+b_i+c_j- log(x_{ij}))^2 i∈V∑​j∈V∑​h(xij​)(ujT​vi​+bi​+cj​−log(xij​))2

其中權重函數 h ( x ) h(x) h(x)的建議選擇如下:如果 x < t x < t x<t,令 h ( x ) = ( x / t ) α h(x) = (x/t)^{\alpha} h(x)=(x/t)α,如 α = 0.75 \alpha = 0.75 α=0.75。否則令 h ( x ) = 1 h(x) = 1 h(x)=1。此處 t t t隻是一個人為設定的最大界限。因為 h ( 0 ) = 0 h(0) = 0 h(0)=0,是以如果兩個詞并未相鄰,則不會有任何損失。每個時間步采樣小批量非零 x i j x_{ij} xij​(可以預先基于整個資料集計算得到),包含了資料集的全局統計資訊。

不同于word2vec中拟合的是非對稱的條件機率 P ( w j ∣ w i ) P(w_j|w_i) P(wj​∣wi​),GloVe模型拟合的是對稱的 x i j x_{ij} xij​。是以,任意詞的中心詞向量和背景詞向量在GloVe模型中是等價的。但由于初始化值的不同,同一個詞最終學習到的兩組詞向量可能不同。當學習得到所有詞向量以後,GloVe模型使用中心詞向量與背景詞向量之和作為該詞的最終詞向量。

條件機率比值

作為源于某大型語料庫的真執行個體子,以下列舉了兩組分别以“ice”(冰)和“steam”(蒸汽)為中心詞的條件機率以及它們之間的比值。

從詞向量衡量标準到全局向量的詞嵌入模型GloVe再到一詞多義的解決方式衡量标準Evaluation引子全局向量的詞嵌入應用對一詞多義的思考Reference

對于與“ice”相關而與“steam”不相關的詞 w k w_k wk​,如“solid”,我們期望條件機率比值較大,如上表最後一行中的值8.9;

對于與“ice”不相關而與“steam”相關的詞 w k w_k wk​,如“gas”,我們期望條件機率比值較小,如上表最後一行中的值0.085;

對于與“ice”和“steam”都相關的詞或都不相關的詞 w k w_k wk​,如“water”和“fashion”,我們期望條件機率比值接近1,如上表最後一行中的值1.36和0.96;

我們可以對任意三個不同的詞構造條件機率比值。

f ( u j , u k , v i ) ≈ p i j p i k f(u_j, u_k, v_i) \approx \frac{p_{ij}} {p_{ik}} f(uj​,uk​,vi​)≈pik​pij​​

函數 f f f可能的設計并不唯一,我們隻考慮其中一種合理的可能性。由于函數輸出是一個标量,我們可以将函數限制為一個标量函數。

f ( u j , u k , v i ) = f ( ( u j − u k ) T v i ) f(u_j, u_k, v_i) = f((u_j-u_k)^T v_i) f(uj​,uk​,vi​)=f((uj​−uk​)Tvi​)

值得注意的是單詞共現矩陣中,背景詞和中心詞應該是可以互換的。我們需要使得 u ⇔ v u \Leftrightarrow v u⇔v(單詞作為背景詞與作為中心詞的詞向量等價),還要使得單詞共現矩陣 X = X T X = X^T X=XT。而顯然上式并不滿足這兩個條件。

我們利用函數在群 ( R , + ) (R,+) (R,+)和 R > 0 , × R_{>0}, \times R>0​,×同态知識改寫上式。

f ( ( u j − u k ) T v i ) = f ( u j T v i ) f ( u k T v i ) f ( u j T v i ) = P ( w j ∣ w i ) = x i j x i f((u_j-u_k)^T v_i) = \frac{f(u_j^T v_i)}{f(u_k^T v_i)} \\\\ f(u_j^T v_i) = P(w_j|w_i) = \frac {x_{ij}}{x_i} f((uj​−uk​)Tvi​)=f(ukT​vi​)f(ujT​vi​)​f(ujT​vi​)=P(wj​∣wi​)=xi​xij​​

是以,一種可能是 f ( x ) = e x p ( x ) f(x) = exp(x) f(x)=exp(x)。于是,

f ( u j , u k , v i ) = e x p ( u j T v i ) e x p ( u k T v i ) ≈ p i j p i k f(u_j, u_k, v_i) = \frac{exp(u_j^T v_i)} {exp(u_k^T v_i)} \approx \frac{p_{ij}} {p_{ik}} f(uj​,uk​,vi​)=exp(ukT​vi​)exp(ujT​vi​)​≈pik​pij​​

滿足約等号的一種可能是 e x p ( u j T v i ) ≈ α p i j exp(u_j^T v_i) \approx \alpha p_{ij} exp(ujT​vi​)≈αpij​,考慮到 p i j = x i j / x i p_{ij} = x_{ij}/x_i pij​=xij​/xi​,取對數後 u j T v i ≈ l o g ( α ) + l o g ( x i j ) − l o g ( x i ) u_j^T v_i \approx log(\alpha) + log(x_{ij}) - log(x_i) ujT​vi​≈log(α)+log(xij​)−log(xi​)。我們使用額外的偏差項來拟合 − l o g ( α ) + l o g ( x i ) -log(\alpha) + log(x_i) −log(α)+log(xi​),可以得到

u j T v i − l o g ( α ) + l o g ( x i ) ≈ l o g ( x i j ) u_j^T v_i - log(\alpha) + log(x_i) \approx log(x_{ij}) ujT​vi​−log(α)+log(xi​)≈log(xij​)

對上式左右兩邊取平方誤差并權重,同樣可以得到GloVe模型的損失函數。

時間複雜度

模型的複雜度主要受限于單詞共現矩陣 X X X中的非零項,一個較為寬松的上限是 O ( ∣ V ∣ ) 2 O(|V|)^2 O(∣V∣)2。這看起來像是廢話。我們再嘗試縮小這個上限。

我們假設一組詞 w i w_i wi​和 w j w_j wj​同時出現的幾率可以被模拟為該詞頻率等級的幂律函數 r i j r_{ij} rij​。

X i j = k ( r i j ) α X_{ij} = \frac{k} {(r_{ij})^{\alpha}} Xij​=(rij​)αk​

我們知道,訓練文本中的單詞總數與共現矩陣中的每一項之和成正比。我們使用廣義調和數重新改寫了總合。

∣ C ∣ ∼ ∑ i j X i j = ∑ r = 1 ∣ X ∣ k r α = k H ∣ X ∣ , α |C| \sim \sum_{ij} X_{ij} = \sum_{r=1}^{|X|} \frac k {r^\alpha} = kH_{|X|,\alpha} ∣C∣∼ij∑​Xij​=r=1∑∣X∣​rαk​=kH∣X∣,α​

這個和的上界是 ∣ X ∣ |X| ∣X∣,同時是最大頻率等級,也是矩陣中的非零元素。也是當 X i j ≥ 1 X_{ij} \ge 1 Xij​≥1時 r r r可取的最大值。根據此,我們再将上式進行改寫。

∣ C ∣ ∼ ∣ X ∣ α H ∣ X ∣ , α |C| \sim |X|^\alpha H_{|X|,\alpha} ∣C∣∼∣X∣αH∣X∣,α​

同時,我們已知廣義調和數的計算( s > 0 s>0 s>0且 s ≠ 1 s\ne1 s​=1),其中 L ( s ) \mathcal L(s) L(s)是黎曼Zeta函數。

H x , s = x 1 − s 1 − s + L ( s ) + O ( x − s ) H_{x,s} = \frac{x^{1-s}} {1-s} + \mathcal L(s) + \mathcal O(x^{-s}) Hx,s​=1−sx1−s​+L(s)+O(x−s)

再對上式進行化簡

∣ C ∣ ∼ ∣ X ∣ 1 − α L ( α ) ∣ X ∣ α + O ( 1 ) |C| \sim \frac{|X|}{1-\alpha} \mathcal L(\alpha) |X|^\alpha + \mathcal O(1) ∣C∣∼1−α∣X∣​L(α)∣X∣α+O(1)

當 X X X非常大時

∣ X ∣ = O ( ∣ C ∣ ) , α < 1 ∣ X ∣ = O ( ∣ C ∣ 1 / α ) , α > 1 |X| = \mathcal O(|C|), \alpha < 1 \\\\ |X| = \mathcal O(|C|^{1/\alpha }), \alpha > 1 \\\\ ∣X∣=O(∣C∣),α<1∣X∣=O(∣C∣1/α),α>1

經過試驗,在原paper中得到 α = 1.25 \alpha=1.25 α=1.25,是以 ∣ X ∣ = O ( ∣ C ∣ 0.8 ) |X| = \mathcal O(|C|^{0.8}) ∣X∣=O(∣C∣0.8)。是以這個比類似word2vec等視窗模型的複雜度 O ( ∣ C ∣ ) \mathcal O(|C|) O(∣C∣)是要稍微好一些的。

應用

預訓練的GloVe模型的命名規範大緻是“模型.(資料集.)資料集詞數.詞向量次元.txt”。

我們平時可以使用基于維基百科子集預訓練的50維GloVe詞向量。其中含有40萬個詞和1個特殊的未知詞符号。

近義詞

from mxnet import nd

def knn(W, x, k):
	# 添加的1e-9是為了數值穩定性
    cos = np.dot(W, x.reshape((-1,))) / (np.sqrt((nd.sum(W * W, axis=1) + 1e-9)) * np.sqrt(np.sum(x * x)))
    topk = nd.topk(cos, k=k, ret_typ='indices').asnumpy().astype('int32')
    return topk, [cos[i].asscalar() for i in topk]

def get_similar_tokens(query_token, k, embed):
    topk, cos = knn(embed.idx_to_vec,
                    embed.get_vecs_by_tokens([query_token]), k+1)
    for i, c in zip(topk[1:], cos[1:]):  # 除去輸入詞
        print('cosine sim=%.3f: %s' % (c, (embed.idx_to_token[i])))
           

類比詞

由近義詞延伸出來的類比詞。對于類比關系中的4個詞 a : b : : c : d a:b :: c:d a:b::c:d, 第一組詞 a a a和 b b b在某個次元上不同,而且這種差異可以在第二組詞 c c c和 d d d上展現。給定前3個詞 a a a 、 b b b和 c c c ,求 d d d。設詞 w w w的詞向量為vec(w) 。求類比詞的思路是,搜尋與vec©+vec(b)−vec(a)的結果向量最相似的詞向量。需要注意的是,如果搜尋結果中出現了輸入的單詞,我們需要丢棄。

d = a r g m a x i ( x b − x a + x c ) T x i ∣ ∣ x b − x a + x c ∣ ∣ d = argmax_i \frac{(x_b-x_a+x_c)^T x_i} {||x_b-x_a+x_c||} d=argmaxi​∣∣xb​−xa​+xc​∣∣(xb​−xa​+xc​)Txi​​

下圖展示了不同詞之間的對應關系,詞嵌入的差異主要是由于性别造成的。

從詞向量衡量标準到全局向量的詞嵌入模型GloVe再到一詞多義的解決方式衡量标準Evaluation引子全局向量的詞嵌入應用對一詞多義的思考Reference

代碼實作如下。

def get_analogy(token_a, token_b, token_c, embed):
    vecs = embed.get_vecs_by_tokens([token_a, token_b, token_c])
    x = vecs[1] - vecs[0] + vecs[2]
    topk, cos = knn(embed.idx_to_vec, x, 1)
    return embed.idx_to_token[topk[0]]
           

例如

可以得到答案是japan。相當于 B e i j i n g : C h i n a : : T o k y o : J a p a n Beijing:China :: Tokyo:Japan Beijing:China::Tokyo:Japan。

缺點

  1. 單詞之間具有一定的關聯,但未必是線性關聯

對一詞多義的思考

大部分單詞都有很多個意思,特别是那些存在已久的單詞和常見的單詞。如何解決一詞多義的問題是詞嵌入的一大難題。

多單詞原形訓練

在GloVe中,我們可以創造多個單詞原形進行學習,将多個單詞原形放到不同聚類當中進行重新訓練。例如,bank既可以表示銀行,也可以表示河邊、岸邊意思。下圖bank(1)(2)分别代表了這個意思。

從詞向量衡量标準到全局向量的詞嵌入模型GloVe再到一詞多義的解決方式衡量标準Evaluation引子全局向量的詞嵌入應用對一詞多義的思考Reference

一詞多義的線性組合

例如word2vec之類的标準單詞嵌入,使用單詞的不同含義的權重線性疊加。我們可以設定權重為單詞不同意思出現的機率。

v e c w o r d = α 1 v e c w o r d 1 + α 2 v e c w o r d 2 + α 3 v e c w o r d 3 α 1 = f 1 f 1 + f 2 + f 3 vec_{word} = \alpha_1 vec_{word_1} + \alpha_2 vec_{word_2} + \alpha_3 vec_{word_3} \\\\ \alpha_1 = \frac{f_1} {f_1+f_2+f_3} vecword​=α1​vecword1​​+α2​vecword2​​+α3​vecword3​​α1​=f1​+f2​+f3​f1​​

Reference

  • GloVe: Global Vectors for Word Representation, Jeffrey Pennington, Richard Socher, Christopher D. Manning. 2014.
  • Dive Into Deep Learning,第10章

繼續閱讀