NLP基礎之詞向量(Word2Vector)
0. 前言
與圖像或相比,語言是一種經過人類智力處理後的、更爲抽象的數據對象,因此nlp相比cv相比有許多獨特之處,研究起來也比較複雜,其中詞的表徵方式就是一個重要方面。
1. one-hot向量
詞(Word)最簡單粗暴的一種表徵方式(representation)就是one-hot vector。記V V V 爲詞庫,∣ V ∣ |V| ∣ V ∣ 爲詞庫大小,則每個詞可以表徵爲一個R ∣ V ∣ × 1 R^{|V|\times 1} R ∣ V ∣ × 1 的向量,其中第k k k 維爲1,其他維爲0 ,k k k 是該詞在詞庫中的位置。這種方式的缺點在於:
維數可能會很大,詞向量會很稀疏
無法衡量詞與詞之間的相似性(任何兩個詞之間的內積或者餘弦相似度都爲0)
因此,我們自然而然地想能否將詞向量的空間R ∣ V ∣ R|V| R ∣ V ∣ 降維成一個子空間,並且這個子空間可以表徵出詞與詞之間的關係。
2. SVD分解
先遍歷一個大的文檔集,統計每兩個詞是否配對出現。例如,設文檔集裏面的句子爲如下:
I enjoy flying.
I like NLP.
I like deep learning.
則可以都得到這樣的共現矩陣(Co-occurrence Matrix):
對X X X 進行SVD分解:
X = U Σ V T (2,1)
X=U\Sigma V^T\tag{2,1}
X = U Σ V T ( 2 , 1 )
假設選取前k k k 個奇異值對應主要成分,則應該選擇U 1 : ∣ V ∣ , 1 : k U_{1:|V|,1:k} U 1 : ∣ V ∣ , 1 : k 作爲降維後的詞嵌入矩陣 ,這樣就得到了詞庫中每個詞的k k k 維表徵。
這種方法的缺點是:
隨着新詞的引入,共現矩陣的大小會經常變化
共現矩陣很高維,而且很稀疏
SVD分解需要很大的時間開銷(約O ( n 3 ) O(n^3) O ( n 3 ) )
SVD的可解釋性較差
3. Word2Vec
前面提到的方法需要存儲和計算整個語料庫的所有信息,而Word2Vec通過上下文來預測詞的概率,用迭代學習參數的方法,可以降低複雜度。它包含兩種算法:continuous baf-of-words(CBOW)和skip-gram,兩種訓練方法:負採樣和層級softmax。
3.1. 語言模型——n-gram
用P ( ω 1 , ω 2 , ⋯ , ω n ) P(\omega_1, \omega_2, \cdots, \omega_n) P ( ω 1 , ω 2 , ⋯ , ω n ) 表示一個具有n個詞的序列(句子)的概率。Unigram模型假設每個詞之間都是相互獨立的,也即
P ( ω 1 , ω 2 , ⋯ , ω n ) = ∏ i = 1 n P ( ω i ) (3-1)
P(\omega_1, \omega_2, \cdots, \omega_n)=\prod_{i=1}^nP(\omega_i)\tag{3-1}
P ( ω 1 , ω 2 , ⋯ , ω n ) = i = 1 ∏ n P ( ω i ) ( 3 - 1 )
Bigram模型假設每個詞只與它前面的詞有關:
P ( ω 1 , ω 2 , ⋯ , ω n ) = ∏ i = 1 n P ( ω i ∣ ω i − 1 ) (3-2)
P(\omega_1, \omega_2, \cdots, \omega_n)=\prod_{i=1}^nP(\omega_i|\omega_{i-1})\tag{3-2}
P ( ω 1 , ω 2 , ⋯ , ω n ) = i = 1 ∏ n P ( ω i ∣ ω i − 1 ) ( 3 - 2 )
類似地可以得到n-gram的表達式。一般用CBOW或者Skip-gram方法來學習出一個句子的概率。
簡而言之,CBOW的目的是通過上下文來預測中心詞,而Skip-gram是通過中心詞來預測上下文的分佈。它們的作用都是將one-hot表示的詞“嵌入”到一個低維空間中,這個方法也叫“詞嵌入”(Word Embedding)
3.2. Continuous Bag of Words Model(CBOW)
先考慮bigram的情形,也即利用一個詞預測下一個詞。此時,輸入詞是語境詞(context word)w I w_I w I ,輸出詞是目標詞w O w_O w O 。
記輸入詞的one-hot向量爲x , x k = 1 , x k ′ = 0 f o r k ′ ≠ k x,x_k=1,x_{k'}=0\, for\ k'\neq k x , x k = 1 , x k ′ = 0 f o r k ′ = k ,輸出詞的one-hot向量爲y y y 。它們的維度都是∣ V ∣ |V| ∣ V ∣ ,非常大。我們希望將每個詞的one-hot向量映射到一個較低的維度N N N 上(同時還能較好地表達詞的含義以及詞與詞之間的關係)。爲此,我們在輸入詞和輸出詞之間增加一個N N N 個節點的隱藏層,輸入層到隱藏層的權重矩陣記爲W V × N W_{V\times N} W V × N ,稱之爲輸入層矩陣 ,隱藏層到輸出層的權重矩陣記爲W N × V ′ W'_{N\times V} W N × V ′ ,稱之爲輸出詞矩陣 。我們就是希望通過一系列訓練數據和上述模型結構學習到輸入詞矩陣和輸出詞矩陣。
一般我們用的詞向量是輸入層矩陣,輸出層矩陣代表了上下文詞與目標詞之間的關係。最開始的時候並不是這麼做,最開始爲了降低輸出端反向傳播的計算複雜度,用的是hierarchical softmax,輸出端是二叉樹結構,輸出端參數是二叉樹中每個節點的向量,輸出向量是和二叉樹的節點一一對應的,跟word根本對應不上來,這種情況你只能利用輸入端的詞向量。
bigram的CBOW模型可以表示爲如下的一個兩層神經網絡結構:
輸入層到隱藏層的矩陣運算爲:
h = W T x = W ( k , : ) T : = v w I (3-3)
h=W^Tx=W^T_{(k,:)}:=v_{w_I}\tag{3-3}
h = W T x = W ( k , : ) T : = v w I ( 3 - 3 )
W W W 的每一行v w v_{w} v w 代表了某個詞的輸入詞向量 (第i行代表第i個詞的輸入詞向量),輸入層h其實就是把W W W 的第k k k 層複製過來了,它代表了輸入詞w I w_I w I 的輸入詞向量 。這個地方隱含了輸入詞的激活函數是線性的且不對該層的輸入做任何改變。
隱藏層到輸出層可以表示爲:
U = W ′ T h (3-4)
U=W'^Th\tag{3-4}
U = W ′ T h ( 3 - 4 )
其中U U U 的每一行u j = v w j ′ T h u_j=v'^T_{w_j}h u j = v w j ′ T h ,v w j ′ T v'^T_{w_j} v w j ′ T 代表了輸出詞矩陣 W ′ W' W ′ 的第j j j 列。再對Z Z Z 進行一個softmax變換,就可以將其每一維都映射到[ 0 , 1 ] [0,1] [ 0 , 1 ] 之間,用來代表輸出層某一維不爲零的概率,這樣就可以與輸出詞的真實one-hot向量進行比較(計算loss function)。輸出層第j j j 個單元的值可以表示爲:
p ( w j ∣ w I ) = y j = e x p ( u j ) ∑ i = 1 ∣ V ∣ e x p ( u i ) = e x p ( v w j ′ T v w I ) ∑ i = 1 ∣ V ∣ e x p ( v w j ′ T v w I ) (3-5)
\begin{aligned}
p(w_j|w_I)=y_j&=\frac{exp(u_j)}{\sum_{i=1}^{|V|}exp(u_i)}\\
&=\frac{exp(v'^T_{w_j}v_{w_I})}{\sum_{i=1}^{|V|}exp(v'^T_{w_j}v_{w_I})}\tag{3-5}
\end{aligned}
p ( w j ∣ w I ) = y j = ∑ i = 1 ∣ V ∣ e x p ( u i ) e x p ( u j ) = ∑ i = 1 ∣ V ∣ e x p ( v w j ′ T v w I ) e x p ( v w j ′ T v w I ) ( 3 - 5 )
上式代表的是輸出詞(目標詞)w O w_O w O 第j j j 維不爲零的概率。假設實際的目標詞w O w_O w O 的第j ∗ j^* j ∗ 維不爲零(爲1),則該神經網絡的優化目標爲最大化如下式子:
m a x p ( w O ∣ w I ) = m a x y j ∗ = m a x l o g y j ∗ = m a x ( u j ∗ − l o g ∑ i = 1 ∣ V ∣ e x p ( u i ) ) (3-6)
\begin{aligned}
max\ p(w_O|w_I)&=max\ y_{j^*}\\
&=max\ logy_{j^*}\\
&=max\ \left(u_{j_*}-log\sum_{i=1}^{|V|}exp(u_i)\right)\\
\tag{3-6}
\end{aligned}
m a x p ( w O ∣ w I ) = m a x y j ∗ = m a x l o g y j ∗ = m a x ⎝ ⎛ u j ∗ − l o g i = 1 ∑ ∣ V ∣ e x p ( u i ) ⎠ ⎞ ( 3 - 6 )
當利用多個輸入詞來預測一個目標詞時,架構與上面類似,區別在於隱藏層的計算方式是全蟲矩陣乘以輸入詞的one-hot向量的平均值:
h = 1 C W T ( x 1 + x 2 + ⋯ + x C ) (3-7)
h=\frac{1}{C}W^T(x_1+x_2+\cdots+x_C)\tag{3-7}
h = C 1 W T ( x 1 + x 2 + ⋯ + x C ) ( 3 - 7 )
3.3. Skip-Gram Model
skip-gram模型是CBOW模型的反向過程:利用一個詞來預測它的上下文。記輸入詞爲x x x ,隱藏層爲h h h ,輸入層到隱藏層的權重矩陣爲W W W ,輸入層到隱藏層可以表示爲:
h = W T x = W ( k , : ) T : = v w I (3-8)
h=W^Tx=W^T_{(k,:)}:=v_{w_I}\tag{3-8}
h = W T x = W ( k , : ) T : = v w I ( 3 - 8 )
其中v w I v_{w_I} v w I 表示代表了輸入詞w I w_I w I 的輸入詞向量 。假設上下文的詞的個數爲C,與CBOW不同的地方在於,隱藏層映射到輸出層時,輸出層有C組size爲∣ V ∣ |V| ∣ V ∣ 的向量,對應每個上下文詞的預測輸出。
U c = W ′ T h (3-9)
U_c=W'^Th\tag{3-9}
U c = W ′ T h ( 3 - 9 )
假設第c c c 個上下文詞的實際值是w O , c w_{O,c} w O , c ,則輸出層第c c c 個預測詞等於實際詞的概率爲:
p ( w c , j = w O , c ∣ w I ) = y c , j = e x p ( u c , j ) ∑ i = 1 ∣ V ∣ e x p ( u i ) = e x p ( v w j ′ T v w I ) ∑ i = 1 ∣ V ∣ e x p ( v w j ′ T v w I ) (3-10)
\begin{aligned}
p(w_{c,j}=w_{O,c}|w_I)&=y_{c,j}&\\
&=\frac{exp(u_{c,j})}{\sum_{i=1}^{|V|}exp(u_i)}\\
&=\frac{exp(v'^T_{w_j}v_{w_I})}{\sum_{i=1}^{|V|}exp(v'^T_{w_j}v_{w_I})}\\
\tag{3-10}
\end{aligned}
p ( w c , j = w O , c ∣ w I ) = y c , j = ∑ i = 1 ∣ V ∣ e x p ( u i ) e x p ( u c , j ) = ∑ i = 1 ∣ V ∣ e x p ( v w j ′ T v w I ) e x p ( v w j ′ T v w I ) ( 3 - 1 0 )
loss function可以表示爲:
L o s s = − l o g p ( w O , 1 , p ( w O , 2 , ⋯ , p ( w O , C ∣ w I ) = − l o g ∏ e x p ( u c , j c ∗ ) ∑ i = 1 ∣ V ∣ e x p ( u i ) = − ∑ c = 1 C u j c ∗ + C ⋅ l o g ∑ i = 1 ∣ V ∣ e x p ( u i ) (3-11)
\begin{aligned}
Loss&=-log\ p(w_{O,1},p(w_{O,2},\cdots,p(w_{O,C}|w_I)\\
&=-log\prod\frac{exp(u_{c,j_c^*})}{\sum_{i=1}^{|V|}exp(u_i)}\\
&=-\sum_{c=1}^Cu_{j_c^*}+C\cdot log\sum_{i=1}^{|V|}exp(u_i)\\
\tag{3-11}
\end{aligned}
L o s s = − l o g p ( w O , 1 , p ( w O , 2 , ⋯ , p ( w O , C ∣ w I ) = − l o g ∏ ∑ i = 1 ∣ V ∣ e x p ( u i ) e x p ( u c , j c ∗ ) = − c = 1 ∑ C u j c ∗ + C ⋅ l o g i = 1 ∑ ∣ V ∣ e x p ( u i ) ( 3 - 1 1 )