之前彙報時看到過詞嵌入這部分,這裏把自己看到過的總結在這裏,儘可能寫的全一點。
word2vec( 把詞映射爲實數域向量的技術也叫做詞嵌入(word embedding))
由來
爲什麼要引入word2vec:之前都是用one-hot編碼表示結點信息,當然也可以用one-hot來表示詞。雖然one-hot詞向量構造起來很容易,但通常並不是⼀個好選擇。⼀個主要的原因是,one-hot詞向量⽆法準確表達不同詞之間的相似度,如我們常常使⽤的餘弦相似度。對於向量x, y ∈ R d,它 們的餘弦相似度是它們之間夾⻆的餘弦值:x ⊤ y ∥ x ∥ ∥ y ∥ ∈ [ − 1 , 1 ] \frac{\boldsymbol{x}^{\top} \boldsymbol{y}}{\|\boldsymbol{x}\|\|\boldsymbol{y}\|} \in[-1,1] ∥ x ∥ ∥ y ∥ x ⊤ y ∈ [ − 1 , 1 ] 由於任何兩個不同詞的one-hot向量的餘弦相似度都爲0,多個不同詞之間的相似度難以通過onehot向量準確地體現出來。word2vec⼯具的提出正是爲了解決上⾯這個問題 它將每個詞表⽰成⼀個定⻓的向量,並使得這些向量能較好地表達不同詞之間的相似和類⽐關係。word2vec⼯具包含了兩個模型,即跳字模型 (skip-gram)和連續詞袋模型 (continuous bag of words,CBOW)以及兩種高效的訓練方法:負採樣 和層序softmax 。word2vec詞向量可以較好地表達不同詞之間的相似和類比關係。
跳字模型
跳字模型假設基於某個詞來⽣成它在⽂本序列周圍的詞。舉個例⼦,假設⽂本序列是 “the”“man”“loves”“his”“son”。以“loves”作爲中⼼詞,設背景窗口⼤小爲2。如圖所示,跳字模型所關⼼的是,給定中⼼詞“loves”,⽣成與它距離不超過2個詞的背景詞“the”“man”“his”“son”的條件概率,即: P(“the”, “man”, “his”, “son” | “loves”)
假設給定中⼼詞的情況下,背景詞的⽣成是相互獨⽴的,那麼上式可以改寫成: P(“the” | “loves”) · P(“man” | “loves”) · P(“his” | “loves”) · P(“son” | “loves”) 。假設給定⼀個⻓度爲T的⽂本序列,設時間步t的詞爲w (t)。 假設給定中⼼詞的情況下背景詞的⽣成相互獨⽴,當背景窗口⼤小爲m時,跳字模型的似然函數即給定任⼀中⼼詞⽣成所有背景詞的概率:∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) \prod_{t=1}^{T} \prod_{-m \leq j \leq m, j \neq 0} P\left(w^{(t+j)} | w^{(t)}\right) t = 1 ∏ T − m ≤ j ≤ m , j ̸ = 0 ∏ P ( w ( t + j ) ∣ w ( t ) ) 訓練跳字模型
訓練中我們通過最⼤化似然函數來 學習模型參數,即最⼤似然估計。這等價於最小化以下損失函數:− ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log P ( w ( t + j ) ∣ w ( t ) ) -\sum_{t=1}^{T} \sum_{-m \leq j \leq m, j \neq 0} \log P\left(w^{(t+j)} | w^{(t)}\right) − t = 1 ∑ T − m ≤ j ≤ m , j ̸ = 0 ∑ log P ( w ( t + j ) ∣ w ( t ) ) 在跳字模型中,每個詞被表⽰成兩個d維向量,⽤來計算條件概率。假設這個詞在詞典中索引爲i, 當它爲中⼼詞時向量表⽰爲v i ∈ R d , v_i ∈ R^d, v i ∈ R d , 而爲背景詞時向量表⽰爲u i ∈ R d u_i ∈ R^d u i ∈ R d 。設中⼼詞w c w_c w c 在詞典中索引爲c,背景詞w o w_o w o 在詞典中索引爲o,給定中⼼詞⽣成背景詞的條件概率可以通過對向量內積 做softmax運算而得到:P ( w o ∣ w c ) = exp ( u o ⊤ v c ) ∑ i ∈ V exp ( u i ⊤ v c ) P\left(w_{o} | w_{c}\right)=\frac{\exp \left(\boldsymbol{u}_{o}^{\top} \boldsymbol{v}_{c}\right)}{\sum_{i \in \mathcal{V}} \exp \left(\boldsymbol{u}_{i}^{\top} \boldsymbol{v}_{c}\right)} P ( w o ∣ w c ) = ∑ i ∈ V exp ( u i ⊤ v c ) exp ( u o ⊤ v c ) 其中詞典索引集V = 0 , 1 , . . . , ∣ V ∣ − 1 V = {0, 1, . . . , |V|−1} V = 0 , 1 , . . . , ∣ V ∣ − 1 。
按照以往經驗,我們可以用隨機梯度下降法來求解,以其中一個詞爲例子來看一下:每個詞的中心詞和背景詞的詞向量是模型參數,是我們要求的參數。
V c = V c − ∂ L ∂ V c ∂ log P ( w o ∣ w c ) ∂ v c = u o − ∑ j ∈ V exp ( u j ⊤ v c ) ∑ i ∈ v exp ( u i ⊤ v c ) u j ∂ log P ( w o ∣ w c ) ∂ v c = u o − ∑ j ∈ V P ( w j ∣ w c ) u j V_{c}=V_{c}-\frac{\partial L}{\partial V_{c}}\\
\frac{\partial \log \mathbb{P}\left(w_{o} | w_{c}\right)}{\partial \mathbf{v}_{c}}=\mathbf{u}_{o}-\sum_{j \in V} \frac{\exp \left(\mathbf{u}_{j}^{\top} \mathbf{v}_{c}\right)}{\sum_{i \in v} \exp \left(\mathbf{u}_{i}^{\top} \mathbf{v}_{c}\right)} \mathbf{u}_{j}\\
\frac{\partial \log \mathbb{P}\left(w_{o} | w_{c}\right)}{\partial \mathbf{v}_{c}}=\mathbf{u}_{o}-\sum_{j \in \mathcal{V}} \mathbb{P}\left(w_{j} | w_{c}\right) \mathbf{u}_{j} V c = V c − ∂ V c ∂ L ∂ v c ∂ log P ( w o ∣ w c ) = u o − j ∈ V ∑ ∑ i ∈ v exp ( u i ⊤ v c ) exp ( u j ⊤ v c ) u j ∂ v c ∂ log P ( w o ∣ w c ) = u o − j ∈ V ∑ P ( w j ∣ w c ) u j 不算前面的兩個加和,只針對後半部分求導,已經有很大的計算開銷了,即使用隨機梯度下降,每一步的迭代的開銷也非常大,時間複雜度至少 O ∣ V ∣ O| V | O ∣ V ∣ 。 它的計算需要詞典中所有詞以w c w_c w c 爲中⼼詞的條件概率。有關其他詞向量的梯度同理可得。 訓練結束後,對於詞典中的任⼀索引爲i的詞,我們均得到該詞作爲中⼼詞和背景詞的兩組詞向量v i v_i v i 和u i u_i u i 。在⾃然語⾔處理應⽤中,⼀般使⽤跳字模型的中心詞向量作爲詞的表徵向量。
連續詞袋模型
連續詞袋模型與跳字模型類似。與跳字模型最⼤的不同在於,連續詞袋模型假設基於某中⼼詞在 ⽂本序列前後的背景詞來⽣成該中⼼詞。在同樣的⽂本序列“the”“man”“loves”“his”“son” ⾥,以“loves”作爲中⼼詞,且背景窗口⼤小爲2時,連續詞袋模型關⼼的是,給定背景詞 “the”“man”“his”“son”⽣成中⼼詞“loves”的條件概率(如圖所示),也就是:P(“loves” | “the”, “man”, “his”, “son”)。
因爲連續詞袋模型的背景詞有多個,我們將這些背景詞向量取平均,然後使⽤和跳字模型⼀樣的⽅法來計算條件概率。設v i ∈ R d 和 u i ∈ R d v_i ∈ R^d和u_i ∈ R^d v i ∈ R d 和 u i ∈ R d 分別表⽰詞典中索引爲i的詞作爲背景詞和中⼼詞的向量(注意符號的含義與跳字模型中的相反)。設中⼼詞w c w_c w c 在詞典中索引爲c,背景詞w o 1 , . . . , w o 2 m w_{o_1} , . . . , w_{o_{2m}} w o 1 , . . . , w o 2 m 在 詞典中索引爲o 1 , . . . , o 2 m o_1, . . . , o_{2m} o 1 , . . . , o 2 m ,那麼給定背景詞⽣成中心詞的條件概率:
P ( w c ∣ w o 1 , … , w o 2 m ) = exp ( 1 2 m u c ⊤ ( v o 1 + … + v o 2 m ) ) ∑ i ∈ V exp ( 1 2 m u i ⊤ ( v o 1 + … + v o 2 m ) ) W o = ( w o 1 , ⋯  , w o 2 m } v ‾ o = ( v o 1 + … + v o 2 m ) / ( 2 m ) P ( w c ∣ W o ) = exp ( u c ⊤ v ‾ o ) ∑ i ∈ V exp ( u i ⊤ v ‾ o ) P\left(w_{c} | w_{o_{1}}, \ldots, w_{o_{2 m}}\right)=\frac{\exp \left(\frac{1}{2 m} \boldsymbol{u}_{c}^{\top}\left(\boldsymbol{v}_{o_{1}}+\ldots+\boldsymbol{v}_{o_{2 m}}\right)\right)}{\sum_{i \in \mathcal{V}} \exp \left(\frac{1}{2 m} \boldsymbol{u}_{i}^{\top}\left(\boldsymbol{v}_{o_{1}}+\ldots+\boldsymbol{v}_{o_{2 m}}\right)\right)}\\
\mathcal{W}_{o}=\left(w_{o_{1}}, \cdots, w_{o_{2 m}}\right\}\\
\overline{v}_{o}=\left(v_{o_{1}}+\ldots+v_{o_{2 m}}\right) /(2 m)\\
P\left(w_{c} | \mathcal{W}_{o}\right)=\frac{\exp \left(\boldsymbol{u}_{c}^{\top} \overline{\boldsymbol{v}}_{o}\right)}{\sum_{i \in \mathcal{V}} \exp \left(\boldsymbol{u}_{i}^{\top} \overline{\boldsymbol{v}}_{o}\right)} P ( w c ∣ w o 1 , … , w o 2 m ) = ∑ i ∈ V exp ( 2 m 1 u i ⊤ ( v o 1 + … + v o 2 m ) ) exp ( 2 m 1 u c ⊤ ( v o 1 + … + v o 2 m ) ) W o = ( w o 1 , ⋯ , w o 2 m } v o = ( v o 1 + … + v o 2 m ) / ( 2 m ) P ( w c ∣ W o ) = ∑ i ∈ V exp ( u i ⊤ v o ) exp ( u c ⊤ v o ) 給定⼀個⻓度爲T T T 的⽂本序列,設時間步t的詞爲w ( t ) w^{(t)} w ( t ) ,背景窗口⼤小爲m m m 。連續詞袋模型的似然 函數是由背景詞⽣成任⼀中⼼詞的概率:∏ t = 1 T P ( w ( t ) ∣ w ( t − m ) , … , w ( t − 1 ) , w ( t + 1 ) , … , w ( t + m ) ) \prod_{t=1}^{T} P\left(w^{(t)} | w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}\right) t = 1 ∏ T P ( w ( t ) ∣ w ( t − m ) , … , w ( t − 1 ) , w ( t + 1 ) , … , w ( t + m ) )
訓練連續詞袋模型同訓練跳字模型基本⼀致。連續詞袋模型的最⼤似然估計等價於最小化損失函數:− ∑ t = 1 T log P ( w ( t ) ∣ w ( t − m ) , … , w ( t − 1 ) , w ( t + 1 ) , … , w ( t + m ) ) log P ( w c ∣ W o ) = u c ⊤ v ‾ o − log ( ∑ i ∈ V exp ( u i ⊤ v ‾ o ) ) -\sum_{t=1}^{T} \log P\left(w^{(t)} | w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}\right)\\
\log P\left(w_{c} | \mathcal{W}_{o}\right)=\boldsymbol{u}_{c}^{\top} \overline{\boldsymbol{v}}_{o}-\log \left(\sum_{i \in \mathcal{V}} \exp \left(\boldsymbol{u}_{i}^{\top} \overline{\boldsymbol{v}}_{o}\right)\right) − t = 1 ∑ T log P ( w ( t ) ∣ w ( t − m ) , … , w ( t − 1 ) , w ( t + 1 ) , … , w ( t + m ) ) log P ( w c ∣ W o ) = u c ⊤ v o − log ( i ∈ V ∑ exp ( u i ⊤ v o ) ) 通過微分,我們可以計算出上式中條件概率的對數有關任⼀背景詞向量v o i ( i = 1 , . . . , 2 m ) v_{o_i}(i = 1, . . . , 2m) v o i ( i = 1 , . . . , 2 m ) 的梯度:∂ log P ( w c ∣ W o ) ∂ v o i = 1 2 m ( u c − ∑ j ∈ V exp ( u j ⊤ v ‾ o ) u j ∑ i ∈ V exp ( u i ⊤ v ‾ o ) ) = 1 2 m ( u c − ∑ j ∈ V P ( w j ∣ W o ) u j ) \frac{\partial \log P\left(w_{c} | \mathcal{W}_{o}\right)}{\partial \boldsymbol{v}_{o_{i}}}=\frac{1}{2 m}\left(\boldsymbol{u}_{c}-\sum_{j \in \mathcal{V}} \frac{\exp \left(\boldsymbol{u}_{j}^{\top} \overline{\boldsymbol{v}}_{o}\right) \boldsymbol{u}_{j}}{\sum_{i \in \mathcal{V}} \exp \left(\boldsymbol{u}_{i}^{\top} \overline{\boldsymbol{v}}_{o}\right)}\right)=\frac{1}{2 m}\left(\boldsymbol{u}_{c}-\sum_{j \in \mathcal{V}} P\left(w_{j} | \mathcal{W}_{o}\right) \boldsymbol{u}_{j}\right) ∂ v o i ∂ log P ( w c ∣ W o ) = 2 m 1 ⎝ ⎛ u c − j ∈ V ∑ ∑ i ∈ V exp ( u i ⊤ v o ) exp ( u j ⊤ v o ) u j ⎠ ⎞ = 2 m 1 ⎝ ⎛ u c − j ∈ V ∑ P ( w j ∣ W o ) u j ⎠ ⎞
有關其他詞向量的梯度同理可得。同跳字模型不⼀樣的⼀點在於,我們⼀般使⽤連續詞袋模型的背景詞向量作爲詞的表徵向量。至於弊端嗎,和跳字模型的弊端一樣,有很大的計算開銷,從∑ j ∈ V \sum_{j \in \mathcal{V}} ∑ j ∈ V 就可以看出,針對這個弊端,引出兩種
兩種近似訓練的方法:負採 樣(negative sampling)或層序softmax(hierarchical softmax),下篇文章再總結吧。
⼩結
• 詞向量是⽤來表⽰詞的向量。把詞映射爲實數域向量的技術也叫詞嵌⼊。
• word2vec包含跳字模型和連續詞袋模型。跳字模型假設基於中⼼詞來⽣成背景詞。連續詞袋模型假設基於背景詞來⽣成中⼼詞。