Word Vector的綜述

歷史

詞向量大致經過3個時期:

  • 最早在做檢索系統,或者推薦系統時候,需要計算query和文檔,或者user和文檔之間的相關性,涉及到相關性,很直觀的利用到了向量的歐式距離活着餘弦距離。所以這個時期的向量化主要是基於整體數據的矩陣分解,使用的是整體數據的global信息。
  • 詞向量的是一個主題迴歸的過程,相同主題的詞的向量彼此就比較接近。
  • 分佈式語義的表示,使用機器學習的方式,然後選擇合適的學習目標,然後詞的向量作爲變量來學習迭代。

下面是整體大綱:

  1. Global Matrix Factorization
    1.1 Vector Space Model (VSM)
    1.2 Latent Semantic Analysis (LSA)
    2.3 Latent Dirichlet Allocation (LDA)
  2. Distributed Word Embedding
    2.1 A Neural Probabilistic Language Model
    2.2 CBOW and SKip-Gram by Tomas Mikolov
    2.3 Global Vector by Manning
  3. out of vocab training
    Learning to Compute Word Embeddings On the Fly
    [Character Embedding] (https://arxiv.org/abs/1601.01343)

1. Global Matrix Factorization

這個階段的向量空間大致是基於詞和文檔組成的矩陣,然後根據某種規則來降維,達到學習詞和文檔的向量化表示。因爲類似處理矩陣的信息,所以用到了全局的信息,是一個Global算法。
這樣的算法的優勢是利用了全局的統計信息,對於文檔的表示具有優勢。
但是對於單個詞來說,還是比較缺乏個性化的訓練,對詞的語義表示來說是比較匱乏的。
在維度上和計算量方面都是一個挑戰,在大預料庫上面訓練基本是不太可能的。

1.1 Vector Space Model-高緯向量空間

Salton & Buckley

這個階段向量是用來表示文本段的,比如一個query,一個文檔,還沒有具體落到一個詞上面

最初使用向量空間模型的是在搜索場景,假設Query 和 Document都可以用一個向量來表示,
那麼計算Query和Document的相關性可以直接轉化爲求解他們向量的距離(如:歐式距離,餘弦距離等)

最初的做法是用基於BOW(詞袋)的思想,向量的維數是詞的個數,每一個維度代表文檔中對應詞是否出現出現爲1否則爲0(或者其他的權重變形,如:增加tf-idf信息)

假設:

Q=(t1,wt1;t2,wt2;...;tq,wtq)
D=(q1,wq1;q2,wq2;...,qd,wqd)

其中向量的維度爲包含的詞的個數,這樣 Query 和Document的相似性爲:

similarity(Q,D)=Cosin(Qw,Dw)=kwtkwqk|wq|2|wd|2 

然後Query 和 Document 的term的權重計算方式

term的權重都是基於term在全局和Query或者Document裏面的統計值進行計算
主要用到的是tf-idf及各種變形來進行

主要方式如下:

這裏寫圖片描述
這個階段向量的計算已經解決了部分相似性和計算量的問題。
但是完全基於詞是否出現這樣的向量的弊端很明顯
比如:
高興/愉快, ship/boat 在這裏是完全不同的詞,但是實際上他們的語義是接近的

弊端:

  1. 在語義表示(Sematic)方面非常弱
  2. 向量的維度非常高

1.2 Latent Semantic Analysis-低維潛在語義

上面講的高緯度的向量空間,爲了解決

  1. 向量的維度過高,導致計算複雜度上升;
  2. 完全基於詞頻的統計會導致計算損失過多的語義方面的信息。很接近的,但是如果基於詞頻,就是完全不同的兩個id

這個階段是將高緯向量利用SVD方式進行降維,保留詞的語義表示。

基於SVD分解:

假設 term 和 Document組成的矩陣爲XR[m,n]
其中m爲term的個數,n爲Document的個數。
根據SVD分解,我們可以知道,X可以分解爲一個左正交矩陣 * 對角矩陣 * 右對角矩陣的格式

X=TSDT

其中TR[m,m],DR[n,n] 分別是左右正交矩陣
SR[m,n] 是對角矩陣,它的元素是矩陣XTX 的特徵值開方,它的值按對角線遞減,其他元素是0的矩陣

注:X=TSDT
所以XTX=(TSDT)TTSDT=DSTTTTSDT=DSTSDT
因爲STS 是對角方陣,它的對角元素是矩陣XTX 的特徵值,所以S 的元素是XTX 特徵值的開方。

如果S的元素是從大到小排列的,那麼這種分解是唯一的

基於特徵值降維/降噪解釋

這裏我們簡單的回顧下特徵值和特徵向量的作用:

假設一個矩陣A分解後的特徵向量是一組正交基vi , 特徵值爲λi , 那麼AV=λV
這裏AV 表示矩陣A作用在這組正交基下面的正交旋轉,正交變換不損失信息,那麼AV 的表示可以轉化爲對λV 的研究上面
V是一組正交基,那麼所有這個空間的向量都可以表示爲V的線性組合
所以λV 表示在正交基上面的張量,該方向上面的權重爲對應的特徵值。
所以不同的特徵值大小代表矩陣在這個方向上面的重要程度,如果絕對值趨於0,那麼這個方向上面的信息是不重要,或者可能是噪音。

假設我們要簡化線性組合表示,是表示變的簡單,且不希望我們的信息損失太多。
這裏很直觀的是:直接將絕對值排在後面的特徵值置爲0

應用

S是一個對角矩陣,且它的對角元素是非負遞減的,所以如果我們需要保留r維的向量,我們只要捨棄S的第r個元素後面的秩,將這些元素置爲0。
這樣我們得到矩陣 SR ,將SR 代入原式我們得到:
XR=TSRDT

XR 的每一行都只有R個元素是非0的,其他都爲0,這樣達到了將爲的目的

優勢:
1. 既得到詞的語義向量,又得到Document的向量,所以不僅可以做詞的聚類,可以做Document的聚類
2. 降維作用明顯,又保留重要的信息
3. 這是全局的算法,基於的是所有詞和所有Document的信息,所以得到的解是全局最優的
4. 是一個topic算法:每一個term的表示都是這些特徵向量方向上面的線形組合,這些特徵向量是彼此沒有交集的,所以一個特徵方向是一個很好的topic表示

類似:
1. 不能解決一詞多義的問題
2. SVD的計算非常複雜,增量訓練困難
3. r的選擇不是學習的

1.3 Latent Dirichlet Allocation

LDA
上面介紹LSI,它是一個topic算法,

這裏的LDA介紹的也是類似的算法,每一個詞得到一個k維的向量,每一個向量是在這個topic下面的概率

假設有k個topic,我們得到每一個詞的表示是一個k維的向量,裏面的每一個元素代表這個詞在這個topic下面的概率

方法的目標:
給定topic數k, 計算每個詞在這些topic下面的概率,得到詞的概率向量
β=>βij=p(wj=1|zi=1) 表示在topiczi 下面出現詞wj 的概率

求解方式是構造概率模型,然後以概率最大化的方式計算得到β

一些不證明的先驗知識:

  1. 給定一個文檔Document,它屬於哪個topic是服從多項式分佈的,但是分佈服從的參數θ 是不同
  2. 給定一個topic,在這個topic出現某個詞也是服從多項式分佈。
  3. 假設θ 的先驗分佈是Dirichlet分佈,那麼,先驗 Dirichlet分佈 + 多項式分佈=後驗Dirichlet分佈,所以這裏θ 的先驗分佈選擇Dirichlet分佈,另外一方面Dirichlet經常被用來作爲非均衡自由度下的向量採樣(比如Beta分佈是它的1個自由度的形式,我們經常使用Beta分佈來擬合點擊率或者轉化率分佈,然後將擬合出來的分佈作爲ctr預估的先驗分佈,或者作爲e && e策略的先驗分佈)。

最大似然函數

l(α,β)=d=1Mlogp(Dd|α,β)

p(Dd|α,β)=p(θ|α)(n=1Nznp(zn|θ)p(wn|zn,β))dθ

這裏跟着這個式子,通俗的介紹下這個式子的符號代表的意思:

  1. α,β 是需要求的參數,分別代表 θ 先驗Dir分佈的
    這裏先簡單的用通俗的表達說下統計知識:

  2. 一個Document在樣本中屬於哪一個topic服從多項式分佈,這個多項式的分佈參數我們認爲它服從Dirichlet分佈(如果二元參數就是一個Beta分佈),那麼它的後驗校正分佈也是是一個Dirichlet分佈。

  3. 我們都知道先驗分佈是獨立於單個樣本的,只和整體的統計有關係,假定Dirichlet先驗分佈的參數α 是一個要學習的參數。那麼給定文檔i,我們從先驗Dirichlet概率分佈得到θ , 它是多項式分佈的參數。
  4. 得到的θ ,就得到這個文檔在各個topic下面的概率zn
  5. 假設概率矩陣爲ββij=p(wj=1|zi=1) ,當topic 爲i時,每個詞出現的概率。
  6. 給定znβ ,我們就可以得到,這樣就可以在p(wn|zn,β) 的概率分佈下面得到wn

然後我們開始介紹下式子的由來:
首先對於一個文檔Dd , 我們計算其中的N個詞,其中N可以直接提前設定,也可以由分佈獲取,比如poson分佈。

我們需要已經知道α,β , 我們需要計算這個文檔詞出現的概率:

  1. 首先θ 是從Dir(α) 分佈裏面採樣得到的
  2. 得到θ , 就得到文檔屬於每一個topic的多項分佈,znMultinomial(θ) , znp(zn|θ)=1
  3. 對於給定的topic 概率zn 和詞的概率分佈β , 然後從文檔中採樣出N個詞。對於每一個詞wn , 它基於當前的分佈的概率爲:p(wn|zn,β) , 然後對於所有的topic,我們得到該詞的概率:znp(zn|θ)p(wn|zn,β) 。然後這個文檔的N個詞的聯合概率爲:Nn=1znp(zn|θ)p(wn|zn,β)
  4. 然後對於採樣的θ 機型期望計算得到:
    p(Dd|α,β)=p(θ|α)(n=1Nznp(zn|θ)p(wn|zn,β))dθ
  5. 然後對於M個文檔,我們利用因子相乘的方式,對每個文檔的概率進行累乘,得到:
    p(D|α,β)=d=1Mp(θ|α)(n=1Nznp(zn|θ)p(wn|zn,β))dθ

關於優化方式,從上面的步驟我們可以看到,求解的過程是一個近似逼近的過程,比如Laplace逼近,變量逼近,MCMC等,也可以用基於凸優化的變量逼近方式。

2. Distributed Word Embedding

這個階段,已經開始關注到詞本身的一些向量表示,更多的關注詞的向量表示和機器學習的目標結合,弱化了全局詞的統計信息。

(Bengio) 在一些語言模型中嘗試將詞作爲一個向量變量來做提督下降優化,這樣出來的詞的向量表示需要結合特定的語言構造模型來使用,單獨是用詞的向量的意義性不大。
(Cbow,Skip-Gram, Tomas Mikolov) 他們嘗試以詞是否鄰近作爲目標,兩個詞的向量直接做點積,如果數值大代表相近,如果距離遠代表不相似,這樣每個詞的訓練只是和他的語料庫裏裏面的相鄰的詞有關。學些出來詞之間的距離是有實際意義的。

(global vector, Manning) 在Mikolov的基礎上,融入了詞的全局統計信息

2.1 Neural Probabilistic Language Model

A Neural Probabilistic Language Model

這種工作其實開創了NLP的Embedding工作的先河,使得詞的表示可以合理的使用語義數值向量,而不是隻有count等統計信息,一旦有了語義方面的數值表示,不管在統計模型還是在神經網絡,都可以做很多的事情。

對於一個統計語言模型,它的統計信息可以被表示成條件概率的形式:

p(w1,w2,...,wT)=t=1Tp(wt|w1,..,wt1)

這個在長文本上面的效果不是很好,計算量特別大,所以常見的是N-Gram 模型,每個詞和序列的前N-1個詞相關。

p(wt|w1,..,wt1)=p(wt|wtn+1,..,wt1)

似然函數

對於所有的文本信息:

tlogf(wt,...,wtn+1;θ)+R(θ)

R(θ) 爲正則項

softmax 層
我們看單個概率p(wt|w1,..,wt1) ,
我們知道Vp(wt=i|w1,..,wt1)=1

我們令:f(wt,..,wtn+1)=p(wt|w1,..,wt1) ,
所以Vf(i,wt1,...,wtn+1)=1

滿足這樣的f函數有很多,在神經網絡裏面,我們常用的是 softmax 函數。

比如:f(wt,...,wtn+1)=exp(h(wt))Vexp(h(wir))

Embedding 層

再看對詞wi 的處理,它是經過一個大小爲|V|的 Map 結構,連存儲的是每一個詞的向量,詞在更新時,先出map裏面取出,然後利用最優化的方式更新後,更新到Map中。
令:xi=C(wi) 是詞到map中向量的轉換,這個層次我們稱爲Embedding 層。

中間業務 層

在Embedding層和softmax直接可以根據業務目標,定義各種層級

這裏寫圖片描述
比如像這種單層的結構,也可以在各種NLP task 裏面,定義各種複雜的結構,比如RNN

這種方式:
詞向量的計算就不需要大矩陣的處理,可以用SGD等方式優化收斂,處理大規模的數據
然後能將詞向量的表示和訓練的任務相結合,訓練出固定維度的低緯向量

2.2 CBOW and SKip-Gram by Tomas Mikolov

Cbow,Skip-Gram, Tomas Mikolov and negtive sample, Tomas Mikolov

Neural Probabilistic Language Model(NPLM) 雖然開創了Embedding的先河,但是還是存在幾個問題需要解決:

  1. 基於深度模型訓練,對於大規模的預料數據,訓練是非常耗時耗資源的。
  2. 學習出來的詞的表示遷移能力不強,詞向量之間本身的距離沒有太多實際的物理含義。

這裏 Mikilov 等人在此基礎上對上面的模型做了改進


這裏寫圖片描述

差異點:

1. 語料feature的滑動窗口不同
  • NPLM:使用的是前N-1 個詞作爲訓練序列,第N個詞作爲預測序列,
  • 這裏有兩種方式改進,一個詞是和它的前後詞都是關聯的,假設選擇的序列長度是2n +1,前n後n。
  • CBOW(Continual bag of word):feafure爲前n後n個詞,他們的權重一樣,預測爲當前的值;
  • Skip-Gram:中訓練的語料feature爲當前的詞,預測的爲前後n個詞。
2. 輸出層的函數不一致
  • 在NPLM中,使用的是Softmax來預測當前的詞,但是一方面由於詞的量很大,比如漢語詞可能幾十萬,softmax在這麼大的空間中計算很浪費計算量;另外由於Softmax容易飽和,導致訓練的精度變低。
  • 這裏(以Negative Sample)爲例,把softmax蛻化爲二分類,正樣本爲前後的預料庫,負樣本可以以採樣的形式生成,一個正樣本對應於5~20 個負樣本差不多就可以有很好的結果,採樣的話如果簡單話可以直接隨機採樣,比如:p(w)f(w)3/4U(x) 是詞的一元count分佈,Z是歸一常量。或者更復雜點的p(w)1tf(w) 。所以目標函數簡化成:
    logσ(h(wn))+kEwneg[logσ(h(wneg)]
3. 對於中間層h(w)的生成
  • 在NPLM,各種複雜的forward 或者循環結構
  • 這裏爲了使得詞之間的cosine或者歐式距離是有意義的,在構造logits時,直接可以用wiwj 代表兩個詞來構造,比如在CBOW中,前後n個詞在預測當前詞的時候,隱藏層可以這麼構造:logits=h(wn)=(12n(wn+wn+1+...+wn1+wn))wn , 這樣其實有兩個隱藏的好處:1.cosine可以直接衡量詞向量;2.詞向量的可加性,如:v(man) + v(king) - v(woman)=v(quen)

CBOW和Skip-Gram According to Mikolov:

  • Skip-gram: works well with small amount of the training data, represents well even rare words or phrases.
  • CBOW: several times faster to train than the skip-gram, slightly better accuracy for the frequent words
  • This can get even a bit more complicated if you consider that there are two different ways how to train the models: the normalized hierarchical softmax, and the un-normalized negative sampling. Both work quite differently.

2.3 Global Vector by Manning

global vector: Manning

背景

Cbow 或者Skip-Gram取得了很大的成功,不管在訓練效率還是在詞向量的計算效果上面。
但是考慮到Cbow/Skip-Gram 是一個local context window的方法,比如使用NS來訓練,缺乏了整體的詞和詞的關係,負樣本採用sample的方式會缺失詞的關係信息。
另外,直接訓練Skip-Gram類型的算法,很容易使得高曝光詞彙得到過多的權重

Global Vector融合了矩陣分解Latent Semantic Analysis (LSA)的全局統計信息和local context window優勢。融入全局的先驗統計信息,可以加快模型的訓練速度,又可以控制詞的相對權重。

概率及表示

首先用符號X 來表示詞和詞之間的表示:
Xij :詞i在詞j的window context裏面的次數,同樣也是j出現在i window context的次數
Xi=kXik :詞i的window context裏面的詞的總次數
Pij=P(j|i)=Xij/Xi : 詞j出現在詞i 的context裏面的概率


這裏寫圖片描述
我們看這個Pij 的case:

我們知道solid是ice的形狀,gas是steam的狀態,如果用概率表示,我們希望
p(solid|ice)>p(solid|steam)
p(gas|ice)<p(gas|steam)
爲了數值化這個相對大小,我們引入他們的比例:p(k|ice)/p(k|steam) , 這個比例值越大,代表詞和ice更加相關,比例的值越小,代表和steam更加相關。

下一步:PikPjk=p(k|i)/p(k|j) 在機器學習裏面怎麼計算?

首先它應該和wi,wj,wk^ 這幾個詞向量有關,wi,wj 就是需要學習的詞向量,我們稱爲向量空間W
wk^ 也是向量,同Cbow一樣,這裏會學習兩個向量空間,一個是產出詞向量wi ,一個我們稱這個向量空間爲Ŵ 

因爲wiwk^ 是對稱的,所以更新方式和詞向量是一樣的,這裏在最後輸出詞向量事,採用兩個空間向量的和w+ŵ 

我們構造一個函數F

F(wi,wj,wk^)=PikPjk

當然滿足這種關係的F函數是很多的,我們對F的構造進行分析:

  1. 既然F要體現wi,wj 的相對對比大小關係,直接可以想到的是wiwjwi/wj ,相對來說wiwj 更加簡單,所以我們更新F的展現方式
    F(wiwj,wk^)=PikPjk
  2. 看最終的比例是一個常量的形式,但是F的輸入變量都是向量,一種最直接的方式是對向量做點積,得到常量。
    F((wiwj)Twk^)=PikPjk
  3. 對於Pik=XikXi ,它應該也可以直接表示成F的函數形式,爲:
    F(wTiwk^)=Pik
  4. 綜上,滿足這種函數的F,我們很快會想到:F=exp, 所以,
    wTiwk^=log(Pik)=log(Xik)log(Xi)

目標函數構造

我們來看wTiwk^=log(Pik)=log(Xik)log(Xi)
我們知道log(Xi) 是和k獨立的,所以我們可以認爲他是偏置bi , 爲了對稱,我們增加一個對稱的偏置 bk^ , 得到

wTiwk^+bi+bk^=log(Xik)

觀察log(Xik) ,當Xik 爲0時,是一個病態的函數

目標函數:

J=i,j(wTiwk^+bi+bk^log(Xik))2

爲了避免Xik=0 造成的病態,我們引入一個分段函數f(x) 來避免:

f(x) 具有的特性爲:

  1. f(0)=0 ,或者至少當x趨近於0時,xlog2(x) 有限
  2. f(x) 非遞減函數,這樣可以避免出現次數低的詞的條件概率過低
  3. f(x) 有上界,避免頻率高的詞權重過高

f(x)=min((x/xmin)α,1)

這裏的α 作者選擇 3/4和negtive sample, Tomas Mikolov是一致的,xmax=100

所以得到最終的目標函數:

J=ijf(Xij)(wTiwk^+bi+bk^log(Xik))2

到這裏,全部的問題已經解決,wi,wk^ 是詞獨立的兩個詞向量空間,bi,bk^ 是參數,Xij 是全局統計信息

對比Skip—Gram 對比:

我們看下詞向量訓練的似然函數, 然後從似然函數反推出上面的目標函數:

Qij=exp(wTiwj^)kexp(wTiwk^)

然後Negative sample的處理是,負樣本採樣,得到:

log(Qij)=log(σ(wTiwj^))+kEwneg[log(σ(wTiwk^)))]

對於Global Vector

J=ijQij

這裏如果詞i和詞j同時出現Xij 詞,那麼在Skip-Gram中會在模型裏面處理Xij ,一種做法是將這個數值先group下,這樣計算會更加有效率,得到:
J=ijXijlog(Qij)

因爲:Pij=Xij/Xi
所以:

J=ijXijlog(Qij)=iXijPijlogQij=XiH(Pi,Qi)

H(Pi,Qi) 是交叉熵,交叉熵是衡量概率誤差的一種方式,它的好處可以抵消softmax或者sigmoid帶來的飽和性,但是它是一個長尾的分佈,很容易給到極小概率的事件過多的權重,爲了這裏的cost 函數對比

將交叉熵距離改成平方差距離方式:

J=XiH(Pi,Qi)=ijXi(Pij^Qij^)

其中Pij^=log(Xij) , Qij^=log(exp(wTiwk^))=wTiwk^

所以

J=ijXi(wTiwk^logXij)2

Xi 是一個權重參數,我們可以更換爲更加通用的形式f(x)

到這裏,我們已經詳細的介紹了詞向量的歷史以及各種算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章