深度学习-词嵌入(word2vec)
詞嵌入(word2vec)
自然語言是一套用來表達含義的復雜系統。在這套系統中,詞是表義的基本單元。顧名思義,詞向量是用來表示詞的向量,也可被認為是詞的特征向量或表征。把詞映射為實數域向量的技術也叫詞嵌入(word embedding)。近年來,詞嵌入已逐漸成為自然語言處理的基礎知識。
跳字模型
跳字模型假設基于某個詞來生成它在文本序列周圍的詞。舉個例子:
- 假設文本序列是“the”“man”“loves”“his”“son”
- 以“loves”作為中心詞,設背景窗口大小為2
如下圖所示,跳字模型所關心的是,給定中心詞“loves”,生成與它距離不超過2個詞的背景詞“the”“man”“his”“son”的條件概率,即
P(the",man",his",son"∣“loves").P(\textrm{the"},\textrm{man"},\textrm{his"},\textrm{son"}\mid\textrm{``loves"}).P(the",man",his",son"∣“loves").
假設給定中心詞的情況下,背景詞的生成是相互獨立的,那么上式可以改寫成
P(the"∣loves")?P(man"∣loves")?P(his"∣loves")?P(son"∣loves").P(\textrm{the"}\mid\textrm{loves"})\cdot P(\textrm{man"}\mid\textrm{loves"})\cdot P(\textrm{his"}\mid\textrm{loves"})\cdot P(\textrm{son"}\mid\textrm{loves"}).P(the"∣loves")?P(man"∣loves")?P(his"∣loves")?P(son"∣loves").
在跳字模型中,每個詞被表示成兩個ddd維向量,用來計算條件概率。
- 假設這個詞在詞典中索引為iii
- 當它為中心詞時向量表示為vi∈Rd\boldsymbol{v}_i\in\mathbb{R}^dvi?∈Rd
- 當它為背景詞時向量表示為ui∈Rd\boldsymbol{u}_i\in\mathbb{R}^dui?∈Rd
- 設中心詞wcw_cwc?在詞典中索引為ccc,背景詞wow_owo?在詞典中索引為ooo
給定中心詞生成背景詞的條件概率可以通過對向量內積做softmax運算而得到:
P(wo∣wc)=exp(uo?vc)∑i∈Vexp(ui?vc),P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)},P(wo?∣wc?)=∑i∈V?exp(ui??vc?)exp(uo??vc?)?,
其中詞典索引集V=0,1,…,∣V∣?1\mathcal{V} = {0, 1, \ldots, |\mathcal{V}|-1}V=0,1,…,∣V∣?1。假設給定一個長度為TTT的文本序列,設時間步ttt的詞為w(t)w^{(t)}w(t)。假設給定中心詞的情況下背景詞的生成相互獨立,當背景窗口大小為mmm時,跳字模型的似然函數即給定任一中心詞生成所有背景詞的概率。
∏t=1T∏?m≤j≤m,j≠0P(w(t+j)∣w(t)),\prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),t=1∏T??m≤j≤m,?j?=0∏?P(w(t+j)∣w(t)),
這里小于1和大于TTT的時間步可以忽略。
訓練跳字模型
跳字模型的參數是每個詞所對應的中心詞向量和背景詞向量。訓練中我們通過最大化似然函數來學習模型參數,即最大似然估計。這等價于最小化以下損失函數:
?∑t=1T∑?m≤j≤m,j≠0logP(w(t+j)∣w(t)).- \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \text{log}P(w^{(t+j)} \mid w^{(t)}).?t=1∑T??m≤j≤m,?j?=0∑?logP(w(t+j)∣w(t)).
如果使用隨機梯度下降,那么在每一次迭代里我們隨機采樣一個較短的子序列來計算有關該子序列的損失,然后計算梯度來更新模型參數。梯度計算的關鍵是條件概率的對數有關中心詞向量和背景詞向量的梯度。根據定義,首先看到
log?P(wo∣wc)=uo?vc?log?(∑i∈Vexp(ui?vc))\log P(w_o \mid w_c) = \boldsymbol{u}_o^\top \boldsymbol{v}_c - \log\left(\sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)\right)logP(wo?∣wc?)=uo??vc??log(∑i∈Vexp(ui??vc?))
通過微分,我們可以得到上式中vc\boldsymbol{v}_cvc?的梯度
?logP(wo∣wc)?vc=uo?∑j∈Vexp?(uj?vc)uj∑i∈Vexp?(ui?vc)=uo?∑j∈V(exp(uj?vc)∑i∈Vexp(ui?vc))uj=uo?∑j∈VP(wj∣wc)uj.\begin{aligned} \frac{\partial \text{log} P(w_o \mid w_c)}{\partial \boldsymbol{v}_c} &= \boldsymbol{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_c)\boldsymbol{u}_j}{\sum_{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\ \\&= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\right) \boldsymbol{u}_j\ \\&= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \boldsymbol{u}_j. \end{aligned} ?vc??logP(wo?∣wc?)??=uo??∑i∈V?exp(ui??vc?)∑j∈V?exp(uj??vc?)uj???=uo??j∈V∑?(∑i∈V?exp(ui??vc?)exp(uj??vc?)?)uj??=uo??j∈V∑?P(wj?∣wc?)uj?.?
它的計算需要詞典中所有詞以wcw_cwc?為中心詞的條件概率。有關其他詞向量的梯度同理可得。
訓練結束后,對于詞典中的任一索引為iii的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量vi\boldsymbol{v}_ivi?和ui\boldsymbol{u}_iui?。在自然語言處理應用中,一般使用跳字模型的中心詞向量作為詞的表征向量。
連續詞袋模型
連續詞袋模型與跳字模型類似。與跳字模型最大的不同在于,連續詞袋模型假設基于某中心詞在文本序列前后的背景詞來生成該中心詞。在同樣的文本序列“the”“man”“loves”“his”“son”里,以“loves”作為中心詞,且背景窗口大小為2時,連續詞袋模型關心的是,給定背景詞“the”“man”“his”“son”生成中心詞“loves”的條件概率(如下圖所示),也就是
P(“loves"∣“the",man",his",“son").P(\textrm{“loves"}\mid\textrm{“the"},\textrm{man"},\textrm{his"},\textrm{``son"}).P(“loves"∣“the",man",his",“son").
因為連續詞袋模型的背景詞有多個,我們將這些背景詞向量取平均,然后使用和跳字模型一樣的方法來計算條件概率。設vi∈Rd\boldsymbol{v_i}\in\mathbb{R}^dvi?∈Rd和ui∈Rd\boldsymbol{u_i}\in\mathbb{R}^dui?∈Rd分別表示詞典中索引為iii的詞作為背景詞和中心詞的向量(注意符號的含義與跳字模型中的相反)。設中心詞wcw_cwc?在詞典中索引為ccc,背景詞wo1,…,wo2mw_{o_1}, \ldots, w_{o_{2m}}wo1??,…,wo2m??在詞典中索引為o1,…,o2mo_1, \ldots, o_{2m}o1?,…,o2m?,那么給定背景詞生成中心詞的條件概率
P(wc∣wo1,…,wo2m)=exp(12muc?(vo1+…+vo2m))∑i∈Vexp(12mui?(vo1+…+vo2m)).P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}\left(\frac{1}{2m}\boldsymbol{u}_c^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \text{exp}\left(\frac{1}{2m}\boldsymbol{u}_i^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o{2m}}) \right)}.P(wc?∣wo1??,…,wo2m??)=∑i∈V?exp(2m1?ui??(vo1??+…+vo2m?))exp(2m1?uc??(vo1??+…+vo2m?))?.
為了讓符號更加簡單,我們記Wo=wo1,…,wo2m\mathcal{W}o= {w{o_1}, \ldots, w_{o_{2m}}}Wo=wo1?,…,wo2m??,且vˉo=(vo1+…+vo2m)/(2m)\bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}} \right)/(2m)vˉo?=(vo1??+…+vo2m??)/(2m),那么上式可以簡寫成
P(wc∣Wo)=exp?(uc?vˉo)∑i∈Vexp?(ui?vˉo).P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)}.P(wc?∣Wo?)=∑i∈V?exp(ui??vˉo?)exp(uc??vˉo?)?.
給定一個長度為TTT的文本序列,設時間步ttt的詞為w(t)w^{(t)}w(t),背景窗口大小為mmm。連續詞袋模型的似然函數是由背景詞生成任一中心詞的概率
∏t=1TP(w(t)∣w(t?m),…,w(t?1),w(t+1),…,w(t+m)).\prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).t=1∏T?P(w(t)∣w(t?m),…,w(t?1),w(t+1),…,w(t+m)).
訓練連續詞袋模型
訓練連續詞袋模型同訓練跳字模型基本一致。連續詞袋模型的最大似然估計等價于最小化損失函數
?∑t=1TlogP(w(t)∣w(t?m),…,w(t?1),w(t+1),…,w(t+m)).-\sum_{t=1}^T \text{log} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).?t=1∑T?logP(w(t)∣w(t?m),…,w(t?1),w(t+1),…,w(t+m)).
注意到
log?P(wc∣Wo)=uc?vˉo?log?(∑i∈Vexp?(ui?vˉo)).\log P(w_c \mid \mathcal{W}_o) = \boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o - \log\left(\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)\right).logP(wc?∣Wo?)=uc??vˉo??log(i∈V∑?exp(ui??vˉo?)).
通過微分,我們可以計算出上式中條件概率的對數有關任一背景詞向量voi\boldsymbol{v}_{o_i}voi??(i=1,…,2mi = 1, \ldots, 2mi=1,…,2m)的梯度
?log?P(wc∣Wo)?voi=12m(uc?∑j∈Vexp?(uj?vˉo)uj∑i∈Vexp(ui?vˉo))=12m(uc?∑j∈VP(wj∣Wo)uj).\frac{\partial \log P(w_c \mid \mathcal{W}_o)}{\partial \boldsymbol{v}_{o_i}} = \frac{1}{2m} \left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\boldsymbol{u}_j^\top \bar{\boldsymbol{v}}_o)\boldsymbol{u}_j}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o)} \right) \\ = \frac{1}{2m}\left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \boldsymbol{u}_j \right).?voi???logP(wc?∣Wo?)?=2m1????uc??j∈V∑?∑i∈V?exp(ui??vˉo?)exp(uj??vˉo?)uj?????=2m1????uc??j∈V∑?P(wj?∣Wo?)uj????.
有關其他詞向量的梯度同理可得。同跳字模型不一樣的一點在于,我們一般使用連續詞袋模型的背景詞向量作為詞的表征向量。
- 詞向量是用來表示詞的向量。把詞映射為實數域向量的技術也叫詞嵌入。
- word2vec包含跳字模型和連續詞袋模型。跳字模型假設基于中心詞來生成背景詞。連續詞袋模型假設基于背景詞來生成中心詞。
總結
以上是生活随笔為你收集整理的深度学习-词嵌入(word2vec)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: org.attoparser.Parse
- 下一篇: (pytorch-深度学习)门控循环单元