文本embedding的算法大彙總
文章目錄
- 文本embedding的算法大彙總
-
- 一、潛在語義分析(Latent Semantic Analysis)
-
- 1. 簡單介紹
- 2. 基本原理
-
- 2.1 詞-文檔矩陣(Occurences Matrix)
- 2.2 SVD 分解
- 2.3 流程
- 3. 模型評價
-
- 3.1 具體應用
- 3.2 優點
- 3.3 缺點
- 二、神經網絡語言模型
-
- 1. 簡單介紹
- 2. 基本原理
- 3. 算法流程
- 三、詞向量模型 Word2Vec
-
- 1. 簡單介紹
- 2. CBOW 模型
-
- 2.1 總體算法流程
- 3. Skip-Gram 模型
-
- 3.1 總體算法流程
- 4. 模型的優化方法
-
- 4.1 Hierarchical softmax
-
- 4.1.1 模型參數的梯度計算
- 4.1.2 基于分層 softmax 的 CBOW 模型
- 4.1.3 基于分層 softmax 的 Skip-Gram 模型
- 4.2 Negative Sampling
-
- 4.2.1 負采樣的方法
- 4.2.2 模型參數的梯度計算
- 4.2.3 基于負采樣的 CBOW 模型
- 4.2.4 基于負采樣的 Skip-Gram 模型
- 四、GloVe
-
- 1. 簡單介紹
- 2. 基本原理
-
- 2.1 共現矩陣
- 3. 公式推導
- 五、ELMo
-
- 1. 簡單介紹
- 2. 基本原理
-
- 2.1 具體步驟
- 3. 模型評價
-
- 3.1 優點
- 3.2 缺點
- 六、GPT
-
- 1. 簡單介紹
- 2. 模型結構和基本原理
-
- 2.1 無監督預訓練
- 2.2 有監督微調
- 2.3 下遊任務的改造:
- 3. 模型評價
-
- 3.1 優點
- 3.2 缺點
- 七、Bert
-
- 1. 簡單介紹
- 2. 基本原理
-
- 2.1 Masked Language Model
- 2.2 Next Sentence Representation(NSP)
- 2.3 下遊任務的改造
- 3. 模型評價
-
- 3.1 優點
- 3.2 缺點
- 八、GPT 2.0
-
- 1. 訓練資料集
- 2. 輸入表示
- 3. 模型的改進
-
-
- 參考資料
-
- 3. 模型的改進
-
-
- 參考資料
-
一、潛在語義分析(Latent Semantic Analysis)
1. 簡單介紹
LSA 是 1988 年 S.T.Dumais 等人提出的一種新的資訊檢索代數模型,是用于知識擷取和展示的計算理論和方法,和傳統向量空間模型(vector space model)一樣使用向量來表示詞(terms)和文檔(documents),并通過向量間的關系(如cos)來判斷詞及文檔間的關系。不同的是,LSA 把高維的向量空間模型(VSM)表示中的文檔映射到低維的潛在語義空間中,并用這種潛在的語義結構來表示詞和文本,達到消除詞之間的相關性和簡化文本向量實作降維的目的。
原文位址:http://en.wikipedia.org/wiki/Latent_semantic_analysis
2. 基本原理
通過對大量的文本集進行統計分析,從中提取出詞語的上下文使用含義。技術上通過 SVD 分解等處理,消除了同義詞、多義詞的影響,提高了後續處理的精度。
2.1 詞-文檔矩陣(Occurences Matrix)
LSA 使用詞-文檔矩陣來描述一個詞語是否在一篇文檔中。矩陣的行表示詞,清單示文檔,每一個元素可為該詞在文檔中的詞頻或者該詞語的 tf-idf(term frequency–inverse document frequency),矩陣的每一行代表該詞語的向量表示,每一列代表該文檔的向量表示。
2.2 SVD 分解
假設 X 為m*n的矩陣,SVD 就是将 X 分解成 3 個矩陣的乘積:
(1.1) X m , n = U m , k ∗ Σ k , k ∗ V n , k T X_{m,n} = U_{m,k}*\Sigma_{k,k}*V^T_{n,k} \tag{1.1} Xm,n=Um,k∗Σk,k∗Vn,kT(1.1)
不妨設 t i T t^T_i tiT為每第 i i i 個詞的向量, d j d_j dj為第 j j j 個文本的向量分解可看成如下的樣子:
其中 σ 1 , . . . , σ l \sigma_1, ... , \sigma_l σ1,...,σl 被稱作奇異值,而 μ 1 , . . . , μ l \mu_1, ... , \mu_l μ1,...,μl 和 ν 1 , . . . , ν l \nu_1, ... ,\nu_l ν1,...,νl 則叫做左奇異向量和右奇異向量,可以看出原始矩陣中的 t i t_i ti隻與 U U U 矩陣的第 i i i 行 t ^ i \hat t_i t^i有關, d j d_j dj隻與 V V V 矩陣的第 j j j 列 d ^ j \hat d_j d^j有關,且都由矩陣的所有奇異值所決定。
我們可選取k個最大的奇異值,和它們對應的 U U U 和 V V V 中的向量相乘,則能得到一個 X X X 矩陣的k階近似,這樣就将詞向量和文檔向量映射到了語義空間,這也是一個從高維空間到低維空間的變換。
2.3 流程
- 統計分析文檔和詞的集合,建構詞-文檔矩陣 A。
- 對矩陣A做奇異值分解。
- 對 SVD 分解後得到的矩陣降維。
- 使用降維後的矩陣建構潛在的語義空間。
3. 模型評價
3.1 具體應用
- 比較向量 d ^ i \hat d_i d^i和 d ^ j \hat d_j d^j可以判斷文檔 i i i 和文檔 j j j 的相似度,可用于文檔聚類和文檔分類。
- 在翻譯好的文檔上進行訓練,可以發現不同語言的相似文檔,可用于跨語言檢索。
- 比較向量 t ^ i \hat t_i t^i與 t ^ j \hat t_j t^j可以判斷詞 i i i 和詞 j j j 的相似度,可用于同義詞、歧義詞檢測。
-
通過查詢映射到語義空間,可進行資訊檢索。給定一個查詢字元串,可計算其在語義空間内和已有文檔的相關性。
對原始文檔,将文檔向量映射到語義空間, d ^ j = Σ k − 1 U k T d j \hat d_j = \Sigma^{-1}_k U^T_k d_j d^j=Σk−1UkTdj,對查詢字元串,得到其對應詞的向量後,根據公式 q ^ = Σ k − 1 U k T q \hat q = \Sigma^{-1}_k U^T_k q q^=Σk−1UkTq 将其映射到語義空間,再與文檔向量進行比較。
- 從語義的角度發現詞語的相關性,可用于選擇題回答模型(multi choice questions answering model)
3.2 優點
- 低維語義空間可以刻畫同義詞,同義詞會對應着相同或相似的主題。
- 降維可以除去部分噪聲的影響,增加特征的魯棒性。
- 充分利用了備援的資料。
- 無監督/完全自動化。
- 與語言無關。
3.3 缺點
- 新生成的矩陣難以解釋。
- LSA 可以處理向量空間模型無法解決的一義多詞(synonymy)問題,但不能解決一詞多(polysemy)問題。因為 LSA 将每一個詞映射為潛在語義空間中的一個點,也就是說一個詞的多個意思在空間中對于的是同一個點,并沒有被區分。
- LSA 的機率模型假設文檔和詞的分布是服從聯合正态分布的,但從觀測資料來看是服從泊松分布的。是以 LSA 算法的一個改進 PLSA 使用了多項分布,其效果要好于 LSA。
- LSA 具有 Bag-of-words model 的缺點,即在一篇文檔或者一個句子中忽略詞語的先後順序。
- SVD 的計算複雜度很高,并且當有新的文檔到來時,需重新訓練更新模型。
二、神經網絡語言模型
1. 簡單介紹
用神經網絡來訓練語言模型的思想最早由百度 IDL (深度學習研究院)的徐偉提出,NNLM(Nerual Network Language Model)是這方面的一個經典模型,具體内容可參考 Bengio 2003年發表在 JMLR上的論文。原文位址:http://jmlr.org/papers/volume3/bengio03a/bengio03a.pdf
相對于傳統的語言模型,NNLM 模型使用了低維緊湊的詞向量對上文進行表示,這解決了詞袋模型帶來的資料稀疏、語義鴻溝等問題。顯然 NNLM 是一種更好的 n 元語言模型,另一方面在相似的上下文語境中,NNLM 模型可以預測出相似的目标詞,而傳統模型無法做到這一點。
NNLM 模型直接通過一個神經網絡結構對 n 元條件機率進行評估,其基本結構如下:
2. 基本原理
NNLM 的機率函數是:
(2.1) f ( w t , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = p ( w t ∣ w 1 t − 1 ) f(w_t,w_{t-1},...,w_{t-n+2},w_{t-n+1})=p(w_t|w^{t-1}_1) \tag{2.1} f(wt,wt−1,...,wt−n+2,wt−n+1)=p(wt∣w1t−1)(2.1)
給定一段序列時,由其前面的 n-1個詞預測第 n 個詞的機率。其中 w t w_t wt 表示第 t 個詞, w 1 t − 1 w_1^{t-1} w1t−1 表示從第一個詞到第 t 個詞組成的序列,且模型滿足:
(2.2) { f ( w t , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) > 0 ∑ i = 1 V f ( w i , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = 1 \begin{cases} f(w_t,w_{t-1},...,w_{t-n+2},w_{t-n+1})>0 \\ \sum^V_{i=1}f(w_i,w_{t-1},...,w_{t-n+2},w_{t-n+1})=1 \end{cases} \tag{2.2} {f(wt,wt−1,...,wt−n+2,wt−n+1)>0∑i=1Vf(wi,wt−1,...,wt−n+2,wt−n+1)=1(2.2)
其中 V 為詞彙表的大小,即需要滿足通過網絡預測的每個詞的機率都大于0,且所有詞的機率之和為1
3. 算法流程
輸入:一系列長度為 n 的文本序列訓練集,詞向量的次元 M,學習率 η \eta η
輸出:每一個詞的詞向量 x w x_w xw
- 第一步對訓練集進行分詞得到詞彙表,每一個單詞對應一個索引 i i i
- 第二步随機初始化所有模型參數和映射矩陣 C ∈ R V ∗ N C\in R^{V*N} C∈RV∗N
- 第三步特征映射,通過映射矩陣 C ∈ R V ∗ M C\in R^{V*M} C∈RV∗M 将每一個詞映射成一個特征向量, C ( w i ) ∈ R M C(w_i)\in R^M C(wi)∈RM 表示第 i i i 個詞的詞向量,然後将得到的詞向量拼接成一個 ( n − 1 ) M (n-1)M (n−1)M 維的向量(這裡我們定義為 h h h): ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) : = h (C(w_{t-n+1}),...,C(w_{t-1})):=h (C(wt−n+1),...,C(wt−1)):=h
-
第四步計算條件分布機率:通過一個函數 g g g 将輸入的詞向量序列 h h h 轉化成一個機率分布 y ∈ R V y\in R^V y∈RV,其中第 i i i 個元素表示預測的詞是第 i i i 個詞的機率
(2.3) f ( w i , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = g ( w i , h ) f(w_i,w_{t-1},...,w_{t-n+2},w_{t-n+1})=g(w_i,h) \tag{2.3} f(wi,wt−1,...,wt−n+2,wt−n+1)=g(wi,h)(2.3)
-
第五步定義神經網絡輸出層輸出:
(2.4) p ( w t ∣ w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = e x p ( y w t ) ∑ i V e x p ( y w i ) p(w_t|w_{t-1},...,w_{t-n+2},w_{t-n+1})=\frac{exp(y_{w_t})}{\sum^V_iexp(y_{w_i})} \tag{2.4} p(wt∣wt−1,...,wt−n+2,wt−n+1)=∑iVexp(ywi)exp(ywt)(2.4)
其中 y = b + W + U t a n h ( d + H x ) y=b+W+Utanh(d+Hx) y=b+W+Utanh(d+Hx),模型的參數 θ = ( b , d , W , U , H , C ) , x = h \theta=(b,d,W,U,H,C),x=h θ=(b,d,W,U,H,C),x=h 是神經網絡的輸入。 W ∈ R V ∗ ( n − 1 ) M , H ∈ R Q ∗ ( n − 1 ) M , U ∈ R V ∗ Q W\in R^{V*(n-1)M},H\in R^{Q*(n-1)M},U\in R^{V*Q} W∈RV∗(n−1)M,H∈RQ∗(n−1)M,U∈RV∗Q,其中 W W W 是可選參數, H H H 是輸入層到隐藏層的權重矩陣, U U U 是隐藏層到輸出層的權重矩陣, d , b d,b d,b 是偏置。
-
第六步定義似然函數并更新參數:
(2.5) L = 1 T ∑ t l o g f ( w t , w t − 1 , . . . , w t − n + 1 ; θ ) + R ( θ ) L=\frac 1T\sum_tlogf(w_t,w_{t-1},...,w_{t-n+1};\theta)+R(\theta) \tag{2.5} L=T1t∑logf(wt,wt−1,...,wt−n+1;θ)+R(θ)(2.5)
(2.6) θ ← θ + η ∂ l o g p ( w t ∣ w t − 1 , . . . , w t − n + 1 ) ∂ θ \theta \leftarrow\theta + \eta\frac{\partial logp(w_t|w_{t-1},...,w_{t-n+1})}{\partial \theta} \tag{2.6} θ←θ+η∂θ∂logp(wt∣wt−1,...,wt−n+1)(2.6)
其中 R ( θ ) R(\theta) R(θ) 是正則項
三、詞向量模型 Word2Vec
1. 簡單介紹
word2vec 模型其實就是一個簡單的神經網絡,輸入層是One-Hot Vector,中間隐藏層沒有激活函數,輸出層次元和輸入層次元一樣,用 softmax 回歸。這個模型的産物是隐藏層訓練好的參數,對應着每一個詞的詞向量表示。它本質上是一種單詞聚類的方法,是實作單詞語義推測、句子情感分析等目的一種手段。但是它的 context 視窗很小,沒有使用全局的 cooccur,是以實際上對 cooccur 的利用很少。
模型根據輸入和輸出的定義可分為 CBOW(Continuous Bag-of-Words)與 Skip-Gram 兩種模型。CBOW 的輸入是某個詞的上下文詞的詞向量,輸出是該詞的詞向量。Skip-Gram 則是與 CBOW 相反,輸入是一個詞的詞向量,輸出是該詞對應的上下文詞的詞向量。CBOW 在隻适合在少量資料集中訓練,而 Skip-Gram 在大型的語料集中表現更好。
2. CBOW 模型
輸入層是由上下文的詞的 One-hot 編碼 { x 1 , . . . , x C } \{x_1, ... , x_C\} {x1,...,xC} 組成,其中視窗大小為C,詞彙表大小為V,隐藏層是N維的向量,輸出是 One-hot 編碼的輸出單詞 y y y,輸入的 One-hot 向量通過一個 V × N 維的權重矩陣 W W W 連接配接到隐藏層,再通過一個 N × V 的矩陣 W T W^T WT 連接配接到輸出層。
2.1 總體算法流程
輸入:語料訓練樣本,詞向量的次元大小 N N N,CBOW 的上下文視窗大小 C C C ,步長 η \eta η
輸出:所有詞的輸入詞向量 v v v 和輸出詞向量 v ′ v' v′,即權重矩陣 W W W 和 W ′ W' W′
- 第一步随機初始化模型參數 W W W 和 W ′ W' W′
-
第二步計算隐藏層 h h h 的輸出:
(3.2.1) h = 1 C W T ⋅ ( ∑ i = 1 C x i ) = 1 C ( v w 1 + v w 2 + . . . + v w C ) T h = \frac 1C W^T⋅(\sum^C_{i=1}x_i)=\frac 1C(v_{w_1}+v_{w_2}+...+v_{w_C})^T \tag{3.2.1} h=C1WT⋅(i=1∑Cxi)=C1(vw1+vw2+...+vwC)T(3.2.1)
- 第三步計算輸出層的輸入:
(3.2.2) u = h ⋅ W ′ u=h\cdot W' \tag{3.2.2} u=h⋅W′(3.2.2)
-
第四步計算輸出層的輸出:
(3.2.3) y c , j = p ( w y , j ∣ w 1 , . . . , w c ) = e x p ( u j ) ∑ j ′ = 1 V e x p ( u j ′ ) y_{c,j} = p(w_{y,j}|w_1,...,w_c) = \frac {exp(u_j)}{\sum^V_{j'=1}exp(u_{j'})} \tag{3.2.3} yc,j=p(wy,j∣w1,...,wc)=∑j′=1Vexp(uj′)exp(uj)(3.2.3)
其中 u j u_j uj是輸出 u u u 的第 j j j 個數,即對應的第 j j j 個詞的機率。
-
第五步定義損失函數,即為給定上下文的輸出單詞的條件機率,取對數形式:
(3.2.4) L o s s = − l o g p ( w O ∣ w I ) = − u j o + l o g ∑ j ′ = 1 V e x p ( u j ′ ) Loss = -logp(w_O|w_I) = -u_{j_o} + log\sum^V_{j'=1}exp(u_{j'}) \tag{3.2.4} Loss=−logp(wO∣wI)=−ujo+logj′=1∑Vexp(uj′)(3.2.4)
其中 j o j_o jo是真實輸出的詞的索引值,我們的目标是最小化 L o s s Loss Loss 。
-
第六步對上述 L o s s Loss Loss 求偏導并更新輸出層權重矩陣 $W’ 與隐藏層權重矩陣 $ W W W 直到梯度收斂:
(3.2.5) ∂ l o s s ∂ u j = y c , j − t j : = e j \frac {\partial loss}{\partial u_j}=y_{c,j} - t_j:=e_j \tag{3.2.5} ∂uj∂loss=yc,j−tj:=ej(3.2.5)
其中 t j t_j tj當 j = j o j=j_o j=jo時等于1,其他情況為0 。然後可求出輸出層權重的梯度:
(3.2.6) ∂ l o s s ∂ W i j ′ = ∂ l o s s ∂ u j ⋅ ∂ u j ∂ W i j ′ = e j ⋅ h i \frac {\partial loss}{\partial W'_{ij}}=\frac {\partial loss}{\partial u_j}\cdot\frac {\partial u_j}{\partial W'_{ij}}=e_j\cdot h_i \tag{3.2.6} ∂Wij′∂loss=∂uj∂loss⋅∂Wij′∂uj=ej⋅hi(3.2.6)
則輸出層權重更新規則如下:
(3.2.7) W i j ′ ( n e w ) = W i j ′ ( o l d ) − η ⋅ e j ⋅ h i W'^{(new)}_{ij}=W'^{(old)}_{ij}-\eta\cdot e_j\cdot h_i \tag{3.2.7} Wij′(new)=Wij′(old)−η⋅ej⋅hi(3.2.7)
或者:
(3.2.8) v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ e j ⋅ h f o r j = 1 , 2 , . . . , V v'^{(new)}_{w_j}=v'^{(old)}_{w_j}-\eta\cdot e_j\cdot h\qquad for\ j=1,2,...,V \tag{3.2.8} vwj′(new)=vwj′(old)−η⋅ej⋅hfor j=1,2,...,V(3.2.8)
學習率 η > 0 , e j = y c , j − t j , h j \eta>0,e_j=y_{c,j}-t_j,h_j η>0,ej=yc,j−tj,hj是隐藏層的第 j j j 個單元, v w j T v^T_{w_j} vwjT是單詞 w j w_j wj 的輸出向量
同理 W W W 的梯度:
(3.2.9) ∂ l o s s ∂ h i = ∑ j = 1 V ∂ l o s s ∂ u j ⋅ ∂ u j ∂ h i = ∑ j = 1 V e j ⋅ W i j ′ : = E H i \frac {\partial loss}{\partial h_i}=\sum^V_{j=1}\frac {\partial loss}{\partial u_j}\cdot\frac {\partial u_j}{\partial h_i}=\sum^V_{j=1}e_j\cdot W'_{ij}:=EH_i \tag{3.2.9} ∂hi∂loss=j=1∑V∂uj∂loss⋅∂hi∂uj=j=1∑Vej⋅Wij′:=EHi(3.2.9)
又因為
(3.2.10) h i = 1 C ∑ c = 1 C v w c i = 1 C ∑ c = 1 C ∑ k = 1 V x w c k ⋅ W k i h_i = \frac 1C\sum^C_{c=1}v_{w_c}^i=\frac 1C\sum^C_{c=1}\sum^V_{k=1}x_{w_c}^k\cdot W_{ki} \tag{3.2.10} hi=C1c=1∑Cvwci=C1c=1∑Ck=1∑Vxwck⋅Wki(3.2.10)
(3.2.11) ∂ l o s s ∂ W k i = ∂ l o s s ∂ h i ∂ h i ∂ W k i = E H i ⋅ 1 C ∑ c = 1 C x w c k \frac {\partial loss}{\partial W_{ki}}=\frac {\partial loss}{\partial h_i}\frac {\partial h_i}{\partial W_{ki}}=EH_i\cdot \frac 1C\sum^C_{c=1}x^k_{w_c} \tag{3.2.11} ∂Wki∂loss=∂hi∂loss∂Wki∂hi=EHi⋅C1c=1∑Cxwck(3.2.11)
其中 x w c k x^k_{w_c} xwck 指的是第c個單詞的One-hot向量的第 k k k 個元素的值,是以
(3.2.12) ∂ l o s s ∂ W = ∂ l o s s ∂ h ⋅ ∂ h ∂ W = 1 C x w c ⋅ E H T \frac {\partial loss}{\partial W}=\frac {\partial loss}{\partial h}\cdot\frac {\partial h}{\partial W}=\frac 1Cx_{w_c}\cdot EH^T \tag{3.2.12} ∂W∂loss=∂h∂loss⋅∂W∂h=C1xwc⋅EHT(3.2.12)
這裡我們得到的是一個 V ∗ N V*N V∗N 次元的矩陣,又因為對每個 x w c x_{w_c} xwc ,都為隻有一個元素值為1、其他都為0的One-hot編碼,故 ∂ l o s s / ∂ W {\partial loss}/{\partial W} ∂loss/∂W 矩陣中隻有 w c w_c wc 單詞的索引行不為0,行值為 1 C E H \frac 1CEH C1EH,是以 W W W 的更新公式為:
(3.2.13) v w I , c ( n e w ) = v w I , c ( o l d ) − 1 C ⋅ η ⋅ E H T v^{(new)}_{w_{I,c}}=v^{(old)}_{w_{I,c}}-\frac 1C\cdot\eta\cdot EH^T \tag{3.2.13} vwI,c(new)=vwI,c(old)−C1⋅η⋅EHT(3.2.13)
其中 v w I , c ( n e w ) v^{(new)}_{w_{I,c}} vwI,c(new)是上下文中第c個單詞的輸入向量(隐藏層權重的對應單詞的行向量)
3. Skip-Gram 模型
Skip-Gram模型是由Mikolov等人提出的。上圖展示了Skip-Gram模型的過程,該模型可以看作CBOW模型的逆過程。
3.1 總體算法流程
輸入:語料訓練樣本,詞向量的次元大小 N N N,需要預測的上下文視窗大小 C C C ,步長 η \eta η
輸出:所有詞的輸入詞向量 v v v 和輸出詞向量 v ′ v' v′,即權重矩陣 W W W 和 W ′ W' W′
- 第一步随機初始化模型參數 W W W 和 W ′ W' W′
-
第二步計算隐藏層 h h h 輸出:
(3.3.1) h = W ( k , ⋅ ) : = v w I h=W_{(k,\cdot)}:=v_{w_I} \tag{3.3.1} h=W(k,⋅):=vwI(3.3.1)
-
第三步計算輸出層的輸入:
(3.3.2) u = h ⋅ W ′ u = h\cdot W' \tag{3.3.2} u=h⋅W′(3.3.2)
-
第四步計算輸出層的輸出:
(3.3.3) y c , j = p ( w c , j = w O , c ∣ w I ) = e x p ( u c , j ) ∑ j ′ = 1 V e x p ( u j ′ ) y_{c,j}=p(w_{c,j}=w_{O,c}|w_I)=\frac {exp(u_{c,j})}{\sum^V_{j'=1}exp(u_{j'})} \tag{3.3.3} yc,j=p(wc,j=wO,c∣wI)=∑j′=1Vexp(uj′)exp(uc,j)(3.3.3)
這裡 w c , j w_{c,j} wc,j 是第 c c c 個輸出, w O , c w_{O,c} wO,c 是中心詞對應的目标單詞中的第 c c c 個單詞, w I w_I wI 是中心詞(即輸入詞), y c , j y_{c,j} yc,j 是第 c c c 個輸出向量的第 j j j 個單元的輸出值, u c , j u_{c,j} uc,j 是第 c c c 個輸出向量上的第 j j j 個單元的輸入。且有:
(3.3.4) u c , j = u j = v w j ′ T ⋅ h u_{c,j}=u_j=v'^T_{w_j}\cdot h\tag{3.3.4} uc,j=uj=vwj′T⋅h(3.3.4)
v w j ′ T v'^T_{w_j} vwj′T 是詞彙表第 j j j 個單詞的輸出向量( W ′ W' W′ 的第 j j j 列)
-
第五步定義損失函數:
(3.3.5) L o s s = − ∑ c = 1 C u j c ∗ + C ⋅ l o g ∑ j ′ = 1 V e x p ( u j ′ ) Loss=-\sum^C_{c=1}u_{j^*_c}+C\cdot log\sum^V_{j'=1}exp(u_{j'})\tag{3.3.5} Loss=−c=1∑Cujc∗+C⋅logj′=1∑Vexp(uj′)(3.3.5)
其中 j c ∗ j^*_c jc∗ 表示第 c c c 個真實輸出單詞的索引值
-
第六步對上述 L o s s Loss Loss 求偏導并更新輸出層權重矩陣 $W’ 與隐藏層權重矩陣 $ W W W 直到梯度收斂:
(3.3.6) ∂ l o s s ∂ u c , j = y c , j − t c , j : = e c , j \frac {\partial loss}{\partial u_{c,j}}=y_{c,j}-t_{c,j}:=e_{c,j}\tag{3.3.6} ∂uc,j∂loss=yc,j−tc,j:=ec,j(3.3.6)
我們可定義一個 V 維的向量 E I = { E I 1 , . . . , E I V } EI = \{EI_1,...,EI_V\} EI={EI1,...,EIV} ,該向量是 C 個預測單詞的誤差總和:
(3.3.7) E I j = ∑ c = 1 C e c , j EI_j=\sum^C_{c=1}e_{c,j}\tag{3.3.7} EIj=c=1∑Cec,j(3.3.7)
(3.3.8) ∂ l o s s ∂ W i j ′ = ∑ c = 1 C ∂ l o s s ∂ u c , j ⋅ ∂ u c , j ∂ W i j ′ = E I j ⋅ h i \frac {\partial loss}{\partial W'_{ij}}=\sum^C_{c=1}\frac {\partial loss}{\partial u_{c,j}}\cdot\frac {\partial u_{c,j}}{\partial W'_{ij}}=EI_j\cdot h_i\tag{3.3.8} ∂Wij′∂loss=c=1∑C∂uc,j∂loss⋅∂Wij′∂uc,j=EIj⋅hi(3.3.8)
輸出層權重矩陣 W ′ W' W′ 的更新公式:
(3.3.9) W i j ′ ( n e w ) = W i j ′ ( o l d ) − η ⋅ E I j ⋅ h i W'^{(new)}_{ij}=W'^{(old)}_{ij}-\eta\cdot EI_j\cdot h_i\tag{3.3.9} Wij′(new)=Wij′(old)−η⋅EIj⋅hi(3.3.9)
或者
(3.3.10) v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ E I j ⋅ h v'^{(new)}_{w_j}=v'^{(old)}_{w_j}-\eta\cdot EI_j\cdot h\tag{3.3.10} vwj′(new)=vwj′(old)−η⋅EIj⋅h(3.3.10)
隐藏層權重矩陣 W W W 的更新公式:
(3.3.11) v w I ( n e w ) = v w I ( o l d ) − η ⋅ E H T v^{(new)}_{w_I}=v^{(old)}_{w_I}-\eta\cdot EH^T\tag{3.3.11} vwI(new)=vwI(old)−η⋅EHT(3.3.11)
其中 E H EH EH 是一個N維向量
(3.3.12) E H i = ∑ j = 1 V E I j ⋅ W i j ′ EH_i=\sum^V_{j=1}EI_j\cdot W'_{ij}\tag{3.3.12} EHi=j=1∑VEIj⋅Wij′(3.3.12)
4. 模型的優化方法
對上述模型,每個單詞都存在兩類向量的表達,即輸入向量 v w v_w vw(輸入層到隐藏層的權重矩陣 W W W),輸出向量 v w ′ v'_w vw′(隐藏層到輸出層的權重矩陣 W ′ W' W′)。學習得到輸入向量比較簡單,但是學習輸出向量是很困難的,需要周遊詞彙表中的每個單詞。若詞彙表非常巨大,那麼計算是非常龐大的。
為了解決計算量太大的問題,我們有兩種改進的優化方法:分層 softmax(Hierarchical softmax)和負采樣(negative sampling)。
4.1 Hierarchical softmax
為了避免計算詞彙表所有詞的 softmax 機率,分層 softmax 采用霍夫曼樹(huffman)來代替隐藏層到輸出 softmax 層的映射。即将上述的輸出層權重矩陣 W ′ W' W′ 替換成 霍夫曼樹的隐節點的權重 θ \theta θ 。
由于霍夫曼樹是二叉樹,故計算量由之前的 V 變成 l o g 2 V log_2V log2V,而且我們仍然有差不多同樣的模型參數(原始模型:V 個單詞的輸出向量,分層 softmax:V - 1 個隐節點的輸出向量)。且依據每個單詞的詞頻作為權重建構的霍夫曼樹,高頻詞的路徑更短,更容易被找到。
這裡樹的所有内部節點就類似之前的神經網絡隐藏層的神經元。根節點的詞向量對應我們投影後的詞向量,而所有葉子節點就類似之前 softmax 輸出層的神經元,葉子節點的個數就是詞彙表的大小。這裡從隐藏層到輸出層的 softmax 映射不是一下就完成的,是沿着霍夫曼樹一步一步完成的。每一個隐節點都是一個二分類的邏輯回歸問題,往左子樹走為負類(霍夫曼編碼為1),右邊則為正類(編碼為0),激活函數用 sigmoid 函數即:
(3.4.1) P ( + ) = σ ( x w T θ ) = 1 1 + e x p ( − x w T θ ) P(+)=\sigma(x^T_w\theta)=\frac 1{1+exp(-x^T_w\theta)}\tag{3.4.1} P(+)=σ(xwTθ)=1+exp(−xwTθ)1(3.4.1)
其中 x w x_w xw 是目前内部節點的詞向量, θ \theta θ 是我們需要訓練得到的模型參數
4.1.1 模型參數的梯度計算
分層 softmax 沒有單詞的輸出向量,而是 V - 1 個隐節點都有一個輸出向量 v n ( w , j ) ′ v'_{n(w,j)} vn(w,j)′ 。首先定義經過霍夫曼樹某一個節點 j j j 的邏輯回歸機率:
(3.4.2) P ( d j w ∣ x w , θ j − 1 w ) = { σ ( x w T θ j − 1 w ) d j w = 0 1 − σ ( x w T θ j − 1 w ) d j w = 1 P(d^w_j|x_w,\theta^w_{j-1})= \begin{cases} \sigma(x^T_w\theta^w_{j-1}) & \text d_j^w=0\\ 1-\sigma(x^T_w\theta^w_{j-1}) & \text d_j^w=1 \end{cases}\tag{3.4.2} P(djw∣xw,θj−1w)={σ(xwTθj−1w)1−σ(xwTθj−1w)djw=0djw=1(3.4.2)
那麼一個單詞作為輸出詞的最大似然為:
(3.4.3) p ( w = w O ) = ∏ j = 2 L ( w ) P ( d j w ∣ x w , θ j − 1 w ) = ∏ j = 2 L ( w ) [ σ ( x w T θ j − 1 w ) ] 1 − d j w [ 1 − σ ( x w T θ j − 1 w ) ] d j w p(w=w_O)=\prod^{L(w)}_{j=2}P(d^w_j|x_w,\theta^w_{j-1}) =\prod^{L(w)}_{j=2}[\sigma(x^T_w\theta^w_{j-1})]^{1-d_j^w}[1-\sigma(x^T_w\theta^w_{j-1})]^{d_j^w}\tag{3.4.3} p(w=wO)=j=2∏L(w)P(djw∣xw,θj−1w)=j=2∏L(w)[σ(xwTθj−1w)]1−djw[1−σ(xwTθj−1w)]djw(3.4.3)
取對數:
(3.4.4) L = l o g ∏ j = 2 L ( w ) P ( d j w ∣ x w , θ j − 1 w ) = ∑ j = 2 L ( w ) ( ( 1 − d j w ) l o g [ σ ( x w T θ j − 1 w ) ] + d j w l o g [ 1 − σ ( x w T θ j − 1 w ) ] ) L=log\prod^{L(w)}_{j=2}P(d^w_j|x_w,\theta^w_{j-1}) =\sum^{L(w)}_{j=2}((1-d_j^w)log[\sigma(x^T_w\theta^w_{j-1})]+d_j^wlog[1-\sigma(x^T_w\theta^w_{j-1})])\tag{3.4.4} L=logj=2∏L(w)P(djw∣xw,θj−1w)=j=2∑L(w)((1−djw)log[σ(xwTθj−1w)]+djwlog[1−σ(xwTθj−1w)])(3.4.4)
于是可對模型參數求偏導:
(3.4.5) ∂ L ∂ θ j − 1 w = ( 1 − d j w − σ ( x w T θ j − 1 w ) ) x w \frac{\partial L}{\partial \theta^w_{j-1}}=(1-d_j^w-\sigma(x^T_w\theta^w_{j-1}))x_w\tag{3.4.5} ∂θj−1w∂L=(1−djw−σ(xwTθj−1w))xw(3.4.5)
同理
(3.4.6) ∂ L ∂ x w = ( 1 − d j w − σ ( x w T θ j − 1 w ) ) θ j − 1 w \frac{\partial L}{\partial x_w}=(1-d_j^w-\sigma(x^T_w\theta^w_{j-1}))\theta^w_{j-1}\tag{3.4.6} ∂xw∂L=(1−djw−σ(xwTθj−1w))θj−1w(3.4.6)
4.1.2 基于分層 softmax 的 CBOW 模型
假設我們取得上下文的視窗大小為 2 c 2c 2c ,即訓練樣本中的每一個詞都以其前面和後面 c c c 個詞作為輸入,該詞本身作為樣本輸出。
算法流程如下:
輸入:基于 CBOW 的語料訓練樣本,詞向量次元的大小 N N N,CBOW 的上下文大小 2 c 2c 2c,步長 η \eta η
輸出:huffman 樹的所有内部節點模型參數 θ \theta θ 和所有的詞向量 x x x
- 第一步基于語料庫建構霍夫曼樹樹
- 第二步随機初始化模型參數 θ \theta θ 和所有詞的詞向量 x x x
- 第三步計算梯度并對每個訓練集中的樣本 ( c o n t e x t ( w ) , w ) (context(w),w) (context(w),w)作如下處理:
-
令 e = 0 e=0 e=0,計算
KaTeX parse error: Can't use function '$' in math mode at position 50: …\tag{3.4.7} 其中 $̲x_i$ 為上下文第 $i$ …
其中 x i x_i xi 為上下文第 i i i 個詞的輸入詞向量
-
f o r j = 2 t o L ( w ) for\ j=2\ to\ L(w) for j=2 to L(w) 計算:
f = σ ( x w T ) θ j − 1 w g = ( 1 − d j w − f ) η e = e + g θ j − 1 w θ j − 1 w = θ j − 1 w + g x w f=\sigma(x^T_w)\theta^w_{j-1} \\ g=(1-d^w_j-f)\eta \\ e=e+g\theta^w_{j-1} \\ \theta^w_{j-1}=\theta^w_{j-1}+gx_w f=σ(xwT)θj−1wg=(1−djw−f)ηe=e+gθj−1wθj−1w=θj−1w+gxw
-
對于 c o n t e x t ( w ) context(w) context(w) 中的每一個詞向量 x i x_i xi 進行更新直到梯度收斂:
x i = x i + e x_i = x_i+e xi=xi+e
-
4.1.3 基于分層 softmax 的 Skip-Gram 模型
對于 Skip-Gram 模型來說,輸入隻有一個詞 w w w,輸出為 2 c 2c 2c 個詞向量 c o n t e x t ( w ) context(w) context(w),我們期望 P ( x i ∣ x w ) , i = 1 , 2 , . . . , 2 c P(x_i|x_w),i=1,2,...,2c P(xi∣xw),i=1,2,...,2c 最大。
我們在期望 P ( x i ∣ x w ) , i = 1 , 2 , . . . 2 c P(x_i|x_w),i=1,2,...2c P(xi∣xw),i=1,2,...2c 最大時,也就是期望 P ( x w ∣ x i ) , i = 1 , 2 , . . . , 2 c P(x_w|x_i),i=1,2,...,2c P(xw∣xi),i=1,2,...,2c 最大,在訓練時,word2vec 使用了後者,因為這樣可以在一次疊代時不是隻更新 x w x_w xw 一個詞的詞向量,而是 x i , i = 1 , 2 , . . . , 2 c x_i,i=1,2,...,2c xi,i=1,2,...,2c 共 2 c 2c 2c 個詞的詞向量,可以使得整體的疊代更加均衡。是以 Skip-Gram 模型不像 CBOW 模型對輸入進行更新,而是對 2 c 2c 2c 個輸出進行更新。
這裡相當于把每一個原本的輸出詞向量作為輸入,原本的輸入詞向量作為輸出,類似上下文大小為1的 CBOW 模型,依次更新每一個輸出的詞向量。
算法流程如下:
輸入:基于 Skip-Gram 的語料訓練樣本詞向量次元的大小 N N N,Skip-Gram 的上下文大小 2 c 2c 2c,步長 η \eta η
輸出:huffman 樹的所有内部節點模型參數 θ \theta θ 和所有的詞向量 x x x
- 第一步基于語料庫建構霍夫曼樹
- 第二步随機初始化模型參數 θ \theta θ 和所有詞的詞向量 x x x
- 第三步對每一個樣本 ( w , c o n t e x t ( w ) ) (w,context(w)) (w,context(w)) 做如下處理:
-
$ for\ i=1\ to\ 2c$:
令 e = 0 , f o r j = 2 t o L ( w ) e=0,for\ j=2\ to\ L(w) e=0,for j=2 to L(w),計算:
f = σ ( x i T θ j − 1 w ) g = ( 1 − d j w − f ) η e = e + g θ j − 1 w θ j − 1 w = θ j − 1 w + g x i f=\sigma(x^T_i\theta^w_{j-1}) \\ g=(1-d^w_j-f)\eta \\ e=e+g\theta^w_{j-1} \\ \theta^w_{j-1}=\theta^w_{j-1}+gx_i f=σ(xiTθj−1w)g=(1−djw−f)ηe=e+gθj−1wθj−1w=θj−1w+gxi
更新每個該詞的詞向量:
x i = x i + e x_i=x_i+e xi=xi+e
- 若梯度收斂則結束,否則回到步驟1繼續疊代
-
這裡與上面 CBOW 模型的差別在于,上面 CBOW 其實也是由 2 c 2c 2c 個上下文詞向量來走到 Huffman 樹的葉子節點,但是他的根節點為 2 c 2c 2c 個詞向量的求和均值,并且更新的也是 c o n t e x t ( w ) context(w) context(w) 中的 2 c 2c 2c 個詞向量。而 Skip-Gram 每次單一的輸入 2 c 2c 2c 個詞向量中的一個,最後更新的也是這個輸入的詞向量和Huffman内部節點的參數。
4.2 Negative Sampling
相比于分層 softmax ,負采樣沒有用到霍夫曼樹,而是通過采樣得到 neg 個負例加上一個真實的正例,進行二進制邏輯回歸,得到負采樣對應每個詞 w i w_i wi 對應的模型參數 θ i \theta_i θi,以及每個詞的詞向量。負采樣每次讓一個訓練樣本僅僅更新一小部分的權重參數,進而降低梯度下降過程中的計算量。
4.2.1 負采樣的方法
若詞彙表大小為 V,我們先将長度為1的線段分成 V 份,每一份對應一個詞,且詞頻越高對應線段長度越長,詞 w w w 的長度:
l e n ( w ) = c o u n t ( w ) ∑ u ∈ v o c a b c o u n t ( u ) len(w)=\frac{count(w)}{\sum_{u\in vocab}count(u)} len(w)=∑u∈vocabcount(u)count(w)
在word2vec中長度計算如下:
l e n ( w ) = c o u n t ( w ) 3 / 4 ∑ u ∈ v o c a b c o u n t ( u ) 3 / 4 len(w)=\frac{count(w)^{3/4}}{\sum_{u\in vocab}count(u)^{3/4}} len(w)=∑u∈vocabcount(u)3/4count(w)3/4
采樣前,我們将線段均勻劃分成 M(預設為 1 0 8 10^8 108)份,且 M >> V,這樣每個劃分點 m i , i = 0 , 1 , 2 , . . . , M m_i,i=0,1,2,...,M mi,i=0,1,2,...,M 都對會落在某一個詞的線段上,我們隻需要從這 M+1 個點上采樣出 neg 個位置就行,其對應的詞就是我們需要的負例,且注意不要采到正例。
4.2.2 模型參數的梯度計算
假設通過負采樣,我們得到 n e g neg neg 個負例 ( c o n t e x t ( w ) , w i ) , i = 1 , 2 , . . . , n e g (context(w),w_i),i=1,2,...,neg (context(w),wi),i=1,2,...,neg,并假設正例詞為 w 0 w_0 w0
那麼我們正例和負例期望滿足:
P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w 0 T θ w i ) , y i = 1 , i = 0 P ( c o n t e x t ( w 0 ) , w i ) = 1 − σ ( x w 0 T θ w i ) , y i = 0 , i = 1 , 2 , . . . , n e g P(context(w_0),w_i)=\sigma(x^T_{w_0}\theta^{w_i}),\quad y_i=1,i=0 \\ P(context(w_0),w_i)=1-\sigma(x^T_{w_0}\theta^{w_i}),\quad y_i=0,i=1,2,...,neg P(context(w0),wi)=σ(xw0Tθwi),yi=1,i=0P(context(w0),wi)=1−σ(xw0Tθwi),yi=0,i=1,2,...,neg
最大似然為:
P ( w = w 0 ) = ∏ i = 0 n e g P ( c o n t e x t ( w 0 ) , w i ) = ∏ i = 0 n e g [ σ ( x w 0 T θ w i ) ] y i [ 1 − σ ( x w 0 T θ w i ) ] 1 − y i P(w=w_0)=\prod^{neg}_{i=0}P(context(w_0),w_i) =\prod^{neg}_{i=0}[\sigma(x^T_{w_0}\theta^{w_i})]^{y_i}[1-\sigma(x^T_{w_0}\theta^{w_i})]^{1-y_i} P(w=w0)=i=0∏negP(context(w0),wi)=i=0∏neg[σ(xw0Tθwi)]yi[1−σ(xw0Tθwi)]1−yi
取對數
L = ∑ i = 0 n e g y i l o g ( σ ( x w 0 T θ w i ) ) + ( 1 − y i ) l o g ( 1 − σ ( x w 0 T θ w i ) ) L=\sum^{neg}_{i=0}y_ilog(\sigma(x^T_{w_0}\theta^{w_i}))+(1-y_i)log(1-\sigma(x^T_{w_0}\theta^{w_i})) L=i=0∑negyilog(σ(xw0Tθwi))+(1−yi)log(1−σ(xw0Tθwi))
首先計算 θ w i \theta^{w_i} θwi 的梯度:
∂ L ∂ θ w i = y i ( 1 − σ ( x w 0 T θ w i ) ) x w 0 − ( 1 − y i ) σ ( x w 0 T θ w i ) x w 0 = ( y i − σ ( x w 0 T θ w i ) ) x w 0 \frac{\partial L}{\partial \theta^{w_i}}=y_i(1-\sigma(x^T_{w_0}\theta^{w_i}))x_{w_0}-(1-y_i)\sigma(x^T_{w_0}\theta^{w_i})x_{w_0} =(y_i-\sigma(x^T_{w_0}\theta^{w_i}))x_{w_0} ∂θwi∂L=yi(1−σ(xw0Tθwi))xw0−(1−yi)σ(xw0Tθwi)xw0=(yi−σ(xw0Tθwi))xw0
同理可得 x w 0 x_{w_0} xw0 的梯度:
∂ L ∂ θ w 0 = ∑ i = 0 n e g ( y i − σ ( x w 0 T θ w i ) ) θ w 0 \frac{\partial L}{\partial \theta^{w_0}}= \sum^{neg}_{i=0}(y_i-\sigma(x^T_{w_0}\theta^{w_i}))\theta^{w_0} ∂θw0∂L=i=0∑neg(yi−σ(xw0Tθwi))θw0
4.2.3 基于負采樣的 CBOW 模型
假設我們取得上下文的視窗大小為 2 c 2c 2c ,即訓練樣本中的每一個詞都以其前面和後面 c c c 個詞作為輸入,該詞本身作為樣本輸出。
算法流程如下:
輸入:語料訓練樣本,詞向量次元的大小 N N N,CBOW 的上下文視窗大小 2 c 2c 2c,步長 η \eta η,以及負采樣的個數 $neg $
輸出:詞彙表每個詞對應的模型參數 θ \theta θ 和所有的詞向量 x x x
- 第一步随機初始化所有的模型參數 θ w \theta^w θw,所有的詞向量 x w x_w xw
- 第二步對每個訓練樣本 c o n t e x t ( w 0 ) , w 0 ) context(w_0),w_0) context(w0),w0),進行負采樣,得到 n e g neg neg 個負例詞 $w_i,i=1, 2,…,neg $
- 第三步進行梯度上升疊代過程,對訓練語料中的每一個樣本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . , w n e g ) (context(w_0),w_0,w_1,...,w_{neg}) (context(w0),w0,w1,...,wneg)做如下處理:
-
令 e = 0 e=0 e=0,計算隐含層輸出:
x w 0 = 1 2 c ∑ i = 1 2 c x i x_{w_0}=\frac 1{2c}\sum ^{2c}_{i=1}x_i xw0=2c1i=1∑2cxi
-
f o r i = 0 t o n e g for\ i=0\ to\ neg for i=0 to neg,計算:
f = σ ( x w 0 T θ w i ) g = ( y i − f ) η e = e + g θ w i θ w i = θ w i + g x w 0 f=\sigma(x^T_{w_0}\theta^{w_i}) \\ g=(y_i-f)\eta \\ e = e+g\theta^{w_i} \\ \theta^{w_i}=\theta^{w_i}+gx_{w_0} f=σ(xw0Tθwi)g=(yi−f)ηe=e+gθwiθwi=θwi+gxw0
-
根據梯度對 c o n t e x t ( w ) context(w) context(w) 中的每一個詞向量 x k x_k xk(2c 個)進行更新:
x k = x k + e x_k = x_k+e xk=xk+e
- 若梯度收斂,結束疊代,否則回到第三步進行疊代更新
-
4.2.4 基于負采樣的 Skip-Gram 模型
與基于層級 softmax 的 Skip-Gram 模型一樣,這裡也是對 2 c 2c 2c 個輸出詞向量進行疊代更新。
算法流程如下:
輸入:基于 Skip-Gram 的語料訓練樣本,詞向量的次元大小 N,Skip-Gram 的上下文大小 2 c 2c 2c,步長 η \eta η,負采樣的個數 n e g neg neg 。
輸出:詞彙表每個詞對應的模型參數 θ w \theta^w θw,所有詞向量 x w x_w xw
- 第一步随機初始化所有的模型參數 θ \theta θ 和詞向量 x x x
- 第二步對每個訓練樣本 ( c o n t e x t ( w 0 ) , w 0 ) (context(w_0),w_0) (context(w0),w0) 采樣出 n e g neg neg 個負例詞 w i , i = 1 , 2 , . . . , n e g w_i,i=1,2,...,neg wi,i=1,2,...,neg
- 第三步進行梯度上升,并更新參數,對每個樣本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . , w n e g ) (context(w_0),w_0,w_1,...,w_{neg}) (context(w0),w0,w1,...,wneg) 做如下處理:
-
f o r i = 1 t o 2 c : for\ i=1\ to\ 2c: for i=1 to 2c:
令 e = 0 , f o r j = 0 t o n e g e=0,for\ j=0\ to\ neg e=0,for j=0 to neg,計算:
f = σ ( x w 0 T θ w j ) g = ( y j − f ) η e = e + g θ w j θ w j = θ w j + g x w 0 i f=\sigma(x^T_{w_0}\theta^{w_j}) \\ g=(y_j-f)\eta \\ e=e+g\theta^{w_j} \\ \theta^{w_j}=\theta^{w_j}+gx_{w_{0i}} \\ f=σ(xw0Tθwj)g=(yj−f)ηe=e+gθwjθwj=θwj+gxw0i
利用梯度對該輸出詞向量進行更新:
x w 0 i = x w 0 i + e x_{w_0}^i=x_{w_0}^i+e xw0i=xw0i+e
其中 x w 0 i x^i_{w_0} xw0i 為中心詞為 w 0 w_0 w0 的上下文 2 c 2c 2c 個詞中的第 i i i 個詞的詞向量
- 若梯度收斂,結束疊代,否則回到1繼續疊代更新參數
-
四、GloVe
1. 簡單介紹
GloVe 全稱叫 Global Vectors for Word Representation,是一個基于全局詞頻統計(count-based&overall statistics)的詞表征(word representation)工具,與 word2vec 一樣,她也是将每一個詞表示成一個向量。
GloVe 結合了 LSA 和 word2vec 兩者的優點,充分利用了所有語料全局資訊,更易于優化且訓練速度更快,但僅僅隻關注了詞語的共現關系,忽略了詞語的順序關系,是以訓練出來的詞向量包含的語義資訊有限,隻能進行一些詞語相似度等有限的任務。
2. 基本原理
GloVe 的實作可分為三步:
- 根據語料庫建構一個共現矩陣(Co-ocurrence Matrix) X X X
-
建構詞向量和共現矩陣之間的近似關系,論文作者提出的關系式為:
(4.1) w i T w ‾ j + b i + b ‾ j = l o g ( X i j ) w^T_i\overline w_j+b_i+\overline b_j=log(X_{ij})\tag{4.1} wiTwj+bi+bj=log(Xij)(4.1)
其中 w i T w_i^T wiT 和 w ‾ j \overline w_j wj 是我們最終要求解的詞向量, b i b_i bi 和 b ‾ j \overline b_j bj 分别是兩個詞向量的偏置
-
構造損失函數:
(4.2) L o s s = ∑ i , j = 1 V f ( X i j ) ( w i T w ‾ j + b i + b ‾ j − l o g ( X i j ) ) 2 Loss=\sum^V_{i,j=1}f(X_{ij})(w^T_i\overline w_j+b_i+\overline b_j-log(X_{ij}))^2\tag{4.2} Loss=i,j=1∑Vf(Xij)(wiTwj+bi+bj−log(Xij))2(4.2)
這實際上是一個加了一個權重函數 f ( X i j ) f(X_{ij}) f(Xij) 的均方誤差,而且我們希望:
- 一起出現次數多的單詞的權重要大于那些很少一起出現的單詞,是以 f f f 是非遞減函數
- 而且這個權重不能過大,到一定程度後不再增加
- 如果兩個單詞沒有一起出現過,即 X i j = 0 X_{ij}=0 Xij=0,那麼它們不應該參與到 Loss 的計算中去,是以 f f f 要滿足 f ( 0 ) = 0 f(0)=0 f(0)=0
作者使用的是如下函數:
(4.3) f ( x ) = { ( x / x m a x ) α i f x < x m a x 1 o t h e r w i s f(x)=\begin{cases} (x/x_{max})^\alpha & if\ x<x_{max} \\ 1 & otherwis \end{cases} \tag{4.3} f(x)={(x/xmax)α1if x<xmaxotherwis(4.3)
其中 α = 0.75 , x m a x = 100 \alpha=0.75,x_{max}=100 α=0.75,xmax=100
- 根據 Loss 計算梯度并更新參數
2.1 共現矩陣
共現矩陣中的每一個元素 X i j X_{ij} Xij 代表的是以單詞 i i i 為中心詞時,單詞 j j j 在特定大小的上下文視窗内共同出現的次數。一般來說次數最小機關是1,但是 GloVe 根據兩個單詞在上下文視窗的距離 d d d,增加了一個衰減函數 d e c a y = 1 / d decay=1/d decay=1/d,也就是距離越遠的兩個單詞所占總計數的權重越小
3. 公式推導
- 我們先定義一些變量:
- X i j X_{ij} Xij 表示單詞 j j j 出現在單詞 i i i 的上下文中的次數
- X i = ∑ k X i k X_i=\sum^kX_{ik} Xi=∑kXik 表示單詞 i i i 的上下文中所有單詞出現的總次數
- P i j = P ( j ∣ i ) = X i j / X i P_{ij}=P(j|i)=X_{ij}/X_i Pij=P(j∣i)=Xij/Xi 表示單詞 j j j 出現在單詞 i i i 的上下文中的機率
-
核心思想是,對任意的詞 i i i 和詞 j j j,以及第三個詞 k k k,如果詞 k k k 與詞 i i i 比詞 k k k 與詞 j j j 有更深的關聯,我們就有:
(4.4) P i k > P j k P_{ik}>P_{jk}\tag{4.4} Pik>Pjk(4.4)
且它們的比值很大,同理若詞 j j j 比詞 k k k 與詞 i i i 有更深的關聯,那麼它們的比值越小,若它們都很相關或者都不相關,則比值接近于1 。
-
由上可以構造出如下函數:
(4.5) F ( w i , w j , w ‾ k ) = P i k P j k F(w_i,w_j,\overline w_k)=\frac{P_{ik}}{P_{jk}} \tag{4.5} F(wi,wj,wk)=PjkPik(4.5)
其中 w i w_i wi 和 w j w_j wj 是我們要比較的兩個詞向量, w ‾ k \overline w_k wk 是其他的詞向量,函數 F F F 的參數和具體形式未定
-
又因為向量空間是線性的,我們可以用作差的方式衡量兩個向量的差異,于是 ( 3.2 ) (3.2) (3.2)式可以變換成如下形式:
(4.6) F ( ( w i − w j ) , w ‾ k ) = P i k P j k F((w_i-w_j),\overline w_k)=\frac{P_{ik}}{P_{jk}} \tag{4.6} F((wi−wj),wk)=PjkPik(4.6)
-
對上式可以發現右側是個數量,左側參數都是向量,于是可以對左側兩個向量做一個内積:
(4.7) F ( ( w i − w j ) T w ‾ k ) = P i k P j k F((w_i-w_j)^T\overline w_k)=\frac{P_{ik}}{P_{jk}} \tag{4.7} F((wi−wj)Twk)=PjkPik(4.7)
-
回到問題本身,我們要是基于 cooccur 進行計算的,實際上在一次共現中詞 w i , w j w_i,w_j wi,wj 是同等地位的,我們需要 F ( w i , w j ) = = F ( w j , w i ) F(w_i,w_j)==F(w_j,w_i) F(wi,wj)==F(wj,wi),而現在的公式是不滿足的,故而我們需要給 F F F 一個限制(套一層指數運算),将差的形式變成商的形式,使得 F F F 是一個同态變換:
(4.8) F ( ( w i − w j ) T w ‾ k ) = F ( w i T w ‾ k ) F ( w j T w ‾ k ) F((w_i-w_j)^T\overline w_k)=\frac{F(w^T_i\overline w_k)}{F(w^T_j\overline w_k)} \tag{4.8} F((wi−wj)Twk)=F(wjTwk)F(wiTwk)(4.8)
-
這樣,由 ( 3.4 ) (3.4) (3.4)和 ( 3.5 ) (3.5) (3.5)式,可得:
(4.9) F ( w i T ) = P i k = X i k X i F(w_i^T)=P_{ik}=\frac{X_{ik}}{X_i} \tag{4.9} F(wiT)=Pik=XiXik(4.9)
-
然後我們令 F = e x p F=exp F=exp,兩邊取對數于是有:
(4.10) w i T w ‾ k = l o g ( P i k ) = l o g ( X i k ) − l o g ( X i ) w^T_i\overline w_k=log(P_{ik})=log(X_{ik})-log(X_i) \tag{4.10} wiTwk=log(Pik)=log(Xik)−log(Xi)(4.10)
-
但是公式還是沒有滿足對稱性(當交換詞 w i w_i wi 和詞 w ‾ k \overline w_k wk 時公式不一緻),且 l o g ( X i ) log(X_i) log(Xi) 隻與 i i i 有關,我們将其吸納進 w i w_i wi 的偏置 b i b_i bi,同時我們可以針對 w ‾ k \overline w_k wk 加一個偏置 b k b_k bk :
(4.11) w i T w ‾ k + b i + b k = l o g ( X i k ) w^T_i\overline w_k+b_i+b_k=log(X_{ik})\tag{4.11} wiTwk+bi+bk=log(Xik)(4.11)
五、ELMo
1. 簡單介紹
ELMo 是一種新型的語境化的詞嵌入(contextualized word-embeddings)模型,可對詞進行複雜特征(如句法和語義)和詞在語言語境中的變化進行模組化(即對多義詞進行模組化),根據單詞在句子的上下文中表示的不同含義,給它們不同的表征。打破了之前 word2vec 一個詞對應一個詞向量的 embedding 方式。
ELMo的主要做法是先訓練一個完整的語言模型,再用這個語言模型去處理需要訓練的文本,生成相應的詞向量,它使用針對特定任務的雙向 LSTM 來建立嵌入。同時它用到了 finetuning 的技巧,在預訓練好的模型上,我們隻需讓其在我們自己的訓練資料上進行微調就能使用。
2. 基本原理
ELMo 最重要的就是訓練的語言模型,模型結構如下:
它使用的是一個雙向的 LSTM 語言模型,目标函數就是取這兩個方向的語言模型的最大似然。
前向 LSTM:
p ( t 1 , t 2 , . . . , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , . . . , t k − 1 ) p(t_1,t_2,...,t_N)=\prod^N_{k=1}p(t_k|t_1,t_2,...,t_{k-1}) p(t1,t2,...,tN)=k=1∏Np(tk∣t1,t2,...,tk−1)
反向 LSTM:
p ( t 1 , t 2 , . . . , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , . . . , t N ) p(t_1,t_2,...,t_N)=\prod^N_{k=1}p(t_k|t_{k+1},t_{k+2},...,t_N) p(t1,t2,...,tN)=k=1∏Np(tk∣tk+1,tk+2,...,tN)
最大似然函數:
∑ k = 1 N ( l o g p ( t k ∣ t 1 , t 2 , . . . , t k − 1 ) + l o g p ( t k ∣ t k + 1 , t k + 2 , . . . , t N ) ) \sum^N_{k=1}(logp(t_k|t_1,t_2,...,t_{k-1})+logp(t_k|t_{k+1},t_{k+2},...,t_N)) k=1∑N(logp(tk∣t1,t2,...,tk−1)+logp(tk∣tk+1,tk+2,...,tN))
其中 ( t 1 , t 2 , . . . , t N ) (t_1,t_2,...,t_N) (t1,t2,...,tN) 是一系列的 tokens,對每一個 tokens,一個 L 層的雙向 LSTM 要計算出 L+1 個表征(詞向量),我們可以取最後的一個表征作為我們需要的詞向量,也可以綜合所有的表征做權重求和得到最終結果。
2.1 具體步驟
對于一個 supervise NLP 任務,可以分為三步:
- 産生預訓練好的雙向語言模型,模型由兩層的雙向 LSTM 組成,之間可由殘差連接配接
- 在任務語料上 finetuning(無監督訓練)進一步得到語言模型
- 利用 ELMo 的 word embedding 進行上層任務的訓練
3. 模型評價
3.1 優點
- ELMo 訓練詞向量是基于上下文變化而改變的,是以在一詞多意方面 ELMo 的效果一定比 word2vec 要好。
- ELMo 利用了雙向的 LSTM 模型,能看到更長的上下文資訊,更加準确代表一個詞的意思。
- ELMo 還有一個優勢,就是它建立語言模型的時候,可以運用非任務的超大語料庫去學習,一旦學習好了,可以平行的運用到相似問題上。
3.2 缺點
- ELMo 對雙向 LSTM 模型的輸出隻是采取的簡單的拼接,并不能很好地融合雙向的語義資訊。
- 雙向 LSTM 模型對語義的提取不如 Transformer。
六、GPT
1. 簡單介紹
GPT 是一種半監督的處理語言了解任務的模型,使用非監督的預訓練和監督方式的微調。模型的目标是學習一個通用的表示,經過很小的調整就能在大量任務上進行應用,而且這個模型不需要目标任務和非标注的資料集在同一個領域,模型分為兩個階段:
- 用語言模型預訓練好一個深度模型
- 使用相應的有标簽的資料将這個模型的參數調整到目标任務
2. 模型結構和基本原理
2.1 無監督預訓練
預訓練過程是對非監督文本 ( x 1 , x 2 , . . . , x m ) (x_1,x_2,...,x_m) (x1,x2,...,xm) 的處理,我們的目标是用語言模型去最大化語言模型的極大似然:
(6.1) L 1 ( X ) = ∑ i l o g P ( x i ∣ x i − k , . . . , x i − 1 ; Θ ) L_1(X)=\sum_ilogP(x_i|x_{i-k},...,x_{i-1};\Theta)\tag{6.1} L1(X)=i∑logP(xi∣xi−k,...,xi−1;Θ)(6.1)
其中 k k k 是文本視窗的大小(即預測需要的上文的長度)
GPT 用的是多層 Transformer 的 Decoder 模型,這個模型應用了多頭自注意力機制。模型的輸入是詞向量加位置向量:
(6.2) h 0 = U W e + W p h_0=UW_e+W_p\tag{6.2} h0=UWe+Wp(6.2)
其中 U = ( u k , . . . , u 1 ) U=(u_k,...,u_1) U=(uk,...,u1) 是 tokens 的文本向量(One-hot), W e W_e We 是詞嵌入矩陣, W p W_p Wp 是嵌入矩陣的位置編碼。
再經過12層的 Transformer 子產品:
(6.3) h l = t r a n s f o r m e r _ b l o c k ( h l − 1 ) f o r ∀ i ∈ [ 1 , n ] h_l=transformer\_block(h_{l-1})\ for\ \forall i\in [1,n]\tag{6.3} hl=transformer_block(hl−1) for ∀i∈[1,n](6.3)
其中 n n n 是網絡的層數, h l h_l hl 是隐藏層第 l l l 層的輸出。
最後通過一個全連接配接加 softmax 預測第 k 個詞:
(6.4) P ( u ) = s o f t m a x ( h n W e T ) P(u)=softmax(h_nW_e^T)\tag{6.4} P(u)=softmax(hnWeT)(6.4)
2.2 有監督微調
在使用 ( 6.1 ) (6.1) (6.1)中的目标對模型進行預訓練後,我們再利用有監督目标任務對這些模型參數進行微調。假設一個帶标簽的資料集 C → ( x 1 , x 2 , . . . , x m , y ) ∈ C C\rightarrow(x^1,x^2,...,x^m,y)\in C C→(x1,x2,...,xm,y)∈C,輸入 ( x 1 , x 2 , . . . , x m ) (x^1,x^2,...,x^m) (x1,x2,...,xm) 經過我們預訓練的模型得到最後的輸出向量 h l m h^m_l hlm,然後通過一個附加的線性層和 softmax 預測标簽:
(6.5) P ( y ∣ x 1 , x 2 , . . . , x m ) = s o f t m a x ( h l m W y ) P(y|x^1,x^2,...,x^m)=softmax(h^m_lW_y)\tag{6.5} P(y∣x1,x2,...,xm)=softmax(hlmWy)(6.5)
最大似然函數:
(6.6) L 2 = ∑ x , y l o g P ( y ∣ x 1 , x 2 . . . , x m ) L_2=\sum_{x,y}logP(y|x^1,x^2...,x^m)\tag{6.6} L2=x,y∑logP(y∣x1,x2...,xm)(6.6)
另外,我們增加了語言模型輔助微調,提高了模型的泛化和收斂速度,最後的損失函數為:
(6.7) L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_3(C)=L_2(C)+\lambda *L_1(C)\tag{6.7} L3(C)=L2(C)+λ∗L1(C)(6.7)
2.3 下遊任務的改造:
對于分類問題,不用怎麼動,加上一個起始和終結符号即可;對于句子關系判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;對文本相似性判斷問題,把兩個句子順序颠倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;對于多項選擇問題,則多路輸入,每一路把文章和答案選項拼接作為輸入即可。
3. 模型評價
3.1 優點
- GPT 用的 Transformer 作為特征抽取器,其效果要比 LSTM 好
- 計算速度更快,易于并行化
3.2 缺點
- 對不同類型的任務需要對輸入資料做不同的調整
- 在進行預訓練時隻用了上文的資訊預測而抛開了下文
七、Bert
1. 簡單介紹
BERT 的全稱是Bidirectional Encoder Representation from Transformers,即雙向Transformer的Encoder。BERT 采用和 GPT 完全相同的兩階段模型,即語言模型預訓練加 fine-tuning 解決下遊任務,不同的是 BERT 在預訓練過程采用了類似 ELMo 的雙向語言模型。
BERT 模型結構如下:
2. 基本原理
2.1 Masked Language Model
顧名思義,masked 語言模型就是指在預訓練時對所有語料随機 mask 掉其中15%的 token,然後模型會嘗試基于序列中其他未被 mask 的上下文來預測被掩蓋的原單詞。
因為對于 maske 的這個标記在下遊 NLP 任務中并不存在,為了和後續任務保持一緻,作者又在15%的基礎上:
- 有80%的機率用“[mask]”标記替換該詞
- 有10%的機率用随機采樣的一個單詞替換改詞
- 有10%的機率不做替換
2.2 Next Sentence Representation(NSP)
在很多任務中,隻是依靠詞嵌入是不足以完成任務的(隻學到了一堆 token 級的特征),我們還需要捕捉一些句子級别的特征來完成 SLI、QA、dialogue 等需要句子表示、句間互動與比對的任務,于是BERT 又引入了另一個極其重要卻又極其輕量級的任務 NSP,來試圖把這種模式也學習到。
-
句子級負采樣:
在預訓練過程中,模型接受成對的句子作為輸入,并預測第二句話是否是第一句話的後續句子,其中有50%的輸入是前後關系,50%的輸入是從語料庫中随機采樣組成的非前後關系的句子。
-
句子級表示:
BERT 把兩句話會整合成一句話進行輸入,為了幫助模型區分開訓練中的兩個句子,BERT 在每個輸入前面加一個 [CLS] 标記,在每一句話後面加一個 [SEP] 标記,因為 Transformer 是可以無視空間和距離的把全局資訊 encoding 進每一個位置的,故而我們可以用 [CLS] 的最高隐藏層輸出作為句子/句子對的表征,預測句子對是否是上下文也可以用一個簡單的分類層将 [CLS] 标記的輸出變換為 2 維的向量并 通過 softmax 計算機率進行訓練。
-
segment embedding:
另外,相對于 GPT,BERT 對輸入的詞嵌入不僅加了位置的編碼資訊,還加入了segment embedding。如下圖所示,對于句子對來說, E A E_A EA 和 E B E_B EB 分别代表左句子和右句子,對于句子來說,隻有 E A E_A EA,最終輸入結果是由 Token Embedding、Segment Embedding 和 Position Embedding 三者拼接而成
2.3 下遊任務的改造
- 對于句子關系類任務,和GPT類似,加上一個起始和終結符号,句子之間加個分隔符即可。對于輸出來說,把第一個起始符号對應的Transformer最後一層位置上面串接一個softmax分類層即可。
- 對于分類問題,與GPT一樣,隻需要增加起始和終結符号,輸出部分和句子關系判斷任務類似改造。
- 對于序列标注問題,輸入部分和單句分類是一樣的,隻需要輸出部分Transformer最後一層每個單詞對應位置都進行分類即可。
- 對于機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。隻需要附着在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不同的預訓練資料初始化encoder和decoder即可。這是相當直覺的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隐層産生輸出也是可以的。
3. 模型評價
3.1 優點
- 采用的是 Transformer 雙向語言模型,捕捉到的是真正意義上的 bidirectional context 資訊。
- 在訓練 BERT 模型時,Masked LM 和 Next Sentence Prediction 是一起訓練的,目标就是要最小化兩種政策的組合損失函數,前者用于模組化更廣發的上下文,後者用來模組化多個句子間的關系。
- 另外預訓練資料量的
3.2 缺點
- 每個 batch 隻有15%的 token 被預測,是以 BERT 收斂得比 left-to-right 模型要慢。
- [mask] 标記在實際預測中不會出現,訓練時用過多 [mask] 影響模型表現,且在下遊任務中 fine-tuning 沒有 [mask] 标記,導緻上下遊任務訓練不一緻。
八、GPT 2.0
1. 訓練資料集
為了擷取多樣、體量龐大且又有品質的資料作為訓練樣本最終隻用人工篩選過的網頁内容,但是人工過濾爬蟲内容是很貴的,是以我們隻是把這個作為一個起點,我們爬取了Reddit上所有的外部連結,每個連結的karma值至少要有3分,最終得到800多萬個文檔,總共40G的資料作為訓練樣本
2. 輸入表示
作者沒有采用 word-level 或者 character-level 的嵌入,而是采用了 Byte Pair Encoding (BPE), 這種輸入表示允許我們将字級語言模型的經驗優勢與位元組級方法的通用性結合起來。因為我們的方法能給任何一個unicode字元串配置設定一個機率,是以該語言模型對任何資料集都不用做預處理。
BPE是一種介于字元級和字級之間的實用語言模型,它能有效地在頻繁符号序列的字級輸入和不頻繁符号序列的字元級輸入之間進行插值,盡管名為BPE,但實際是在處理Unicode編碼,而不是位元組序列,該方法需要包含所有unicode編碼,以便能對所有Unicode字元串模組化,在添加任何多符号标記之前,該方法的基本詞彙表超過13萬。與BPE經常使用的3.2萬到6.4萬個詞彙相比,這個數字大得令人望而卻步。相比之下,位元組級别的BPE需要的詞典大小隻有256,
然而,直接将BPE應用于位元組序列會導緻合并無法達到最優解,因為BPE使用貪婪算法來建構詞彙表。我們發現BPE包含了許多像dog這樣的常用的詞,因為它們出現在許多變體中,比如dog,dog?dog。諸如此類的。該結果将會導緻詞典詞槽配置設定與模型能力受到限制。為了避免這個問題,我們會防止BPE跨字元類别合并任何位元組序列,我們為空格添加了一個異常,它顯著地提高了壓縮效率,同時隻在多個vocab标記之間添加了最小的單詞碎片。
3. 模型的改進
相對于 GPT,GPT 2.0 做了少量的修改:
- 将layer normalization移到每個sub-block入口
- 在最後的self-attention子產品中添加了layer normalization
-
修改初始化殘差層權重的權值乘以 1 / N 1/\sqrt{N} 1/N
,其中 N 是殘差層的數量
- 詞典被擴充到了50257,context 的次元從 512 提高到了 1024 并且 batchsize 采用了512
參考資料
https://www.jianshu.com/p/9fe0a7004560
https://blog.csdn.net/roger__wong/article/details/41175967
https://zhuanlan.zhihu.com/p/53425736
https://blog.csdn.net/u010995990/article/details/79805321
https://www.cnblogs.com/pinard/p/7249903.html
https://blog.csdn.net/u010089444/article/details/52624964?ref=myread
https://www.jianshu.com/p/5bbb55c35961
https://blog.csdn.net/triplemeng/article/details/82380202
https://www.cnblogs.com/huangyc/p/9860430.html
常,它顯著地提高了壓縮效率,同時隻在多個vocab标記之間添加了最小的單詞碎片。
3. 模型的改進
[外鍊圖檔轉存中…(img-995uI4ZS-1564969549894)]
相對于 GPT,GPT 2.0 做了少量的修改:
- 将layer normalization移到每個sub-block入口
- 在最後的self-attention子產品中添加了layer normalization
-
修改初始化殘差層權重的權值乘以 1 / N 1/\sqrt{N} 1/N
,其中 N 是殘差層的數量
- 詞典被擴充到了50257,context 的次元從 512 提高到了 1024 并且 batchsize 采用了512
參考資料
https://www.jianshu.com/p/9fe0a7004560
https://blog.csdn.net/roger__wong/article/details/41175967
https://zhuanlan.zhihu.com/p/53425736
https://blog.csdn.net/u010995990/article/details/79805321
https://www.cnblogs.com/pinard/p/7249903.html
https://blog.csdn.net/u010089444/article/details/52624964?ref=myread
https://www.jianshu.com/p/5bbb55c35961
https://blog.csdn.net/triplemeng/article/details/82380202
https://www.cnblogs.com/huangyc/p/9860430.html
[Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector SpaceJ]. Computer Science, 2013.