1. 程式人生 > 其它 >機器學習詞向量表示

機器學習詞向量表示

機器學習詞向量表示

1. 詞向量的表示

對於語料庫 $ V={w_1,w_2,w_3,...w_{|v|}} $

  • one-hot表示:

    \(w_1=[1,0,0,0,...]\)

    \(w_2=[0,1,0,0,...]\)

    優點:解釋性強

    缺點:

    1. 通常詞典中詞的個數是非常多的,這將導致詞向量的維度特別高,計算成本加大

    2. 每個詞元素是離散的

    3. 每個詞\(w_i\)的含義只由第i維的值表示

      由b,c兩點將導致每個詞語與其它詞語的關聯及弱,難以通過餘弦相似度等工具衡量兩個詞語的相似度。

  • 分散式表示:(針對one-hot提出的解決方法,eg:Word2Vec,GloVe,...)

    \(w_1=[0.8,0.05,0.1,...]\)

    \(w_2=[0.1,0.8,0.05,0.02,...]\)

    優點:

    • 相較於one-hot,詞向量的維度降低了很多,方便計算

    • 詞向量中每個元素是實數

    • 每個詞\(w_i\)的含義由該向量中每個元素的值綜合表示

      相較於one-hot,通過此方法可以有效的使用兩個向量的夾角、內積計算兩個詞向量的相似度。

2. Word2Vec

對於語料庫\(V={w_1,w_2,w_3,...,w_{t-1},w_t,w_{t+1},...,w_{T-1},w_T}\),

\(P(w_{1:T})=P(w_t)\cdot P(context(w_t)|w_t)\), 假設context(上下文)視窗大小為:2c

\(=P(w_t)\cdot P(w_{t-c:t-1},w_{t+1:t+c})\),

conditional likehihood:     \(\Pi^{T}_{t=1} \ P(w_{t-c:t-1},w_{t+1:t+c})\)   假設各詞相互獨立

Average conditional log likehihood: \(\frac{1}{T}\sum^{T}_{t=1} \ P(w_{t-c:t-1},w_{t+1:t+c})\)

​             \(=\frac{1}{T}\sum^T_{t=1}\Pi_{i\in [-c,c]}P(w_{t+i}|w_t)\)

  假設\(P(w_{t+i}|w_t)\)是相互獨立的

​             \(=\frac{1}{T}\sum^T_{t=1}\sum_{i\in [-c,c]}logP(w_{t+i}|w_t)\)

表示了已知\(w_t\)的概率,\(w_{t+i}\)出現的概率

優化問題:

\[J(\theta)=-\frac{1}{T}\sum^T_{t=1}\sum_{i\in [-c,c]}logP(w_{t+i}|w_t) \]

\(\theta=\{P_1,P_2,...,P_{|v|}\}=\{W,U\}=\{v_i,u_j\}\), W:權重矩陣,U:隱藏層引數

\(P_{Output}|P_{Input}\)

\(w_Olw_I=w_i\) \(w_1\) \(w_2\) ... \(w_j\) ... \(w_{lvl}\)
\(P\{w_Olw_I=w_i\}\) \(P_1\) \(P_2\) ... \(P_j\) ... \(P_{lvl}\)

\(\displaystyle\sum^{|v|}_{j=1}P_j=1\), \(P_j\in [0,1]\),

\(P_j=P(w_O=w_j|w_I=w_i)=softmax(\Delta_j)=softmax(v^T_iu_j)=\frac{exp(v^T_iu_j)}{\displaystyle\sum^{|v|}_{k=1}exp(v^T_iu_j)}\)

輸入:one-hot encoder

\(w^T_i \cdot W \cdot = \Delta^T=v^T_i(u_1,u_2,...,u_{|v|})=(v^T_iu_1,v^T_iu_2,...,v^T_iu_{|v|})\)

\(\Delta_j=v^T_iu_j\)

\(\Delta =\left[\begin{matrix} \Delta_1 \\ \Delta_2 \\ ... \\ \Delta_{|v|}\end{matrix}\right] _{|v|\times 1}\), \(W =\left[\begin{matrix} w_1 \\ w_2 \\ ... \\ w_{|v|}\end{matrix}\right]\), \(U=(u_1,u_2,...,u_{|v|})\)
原理概述:模型訓練結束後,得到的是神經網路的權重。因為輸入層是one-hot encoder,從輸入層到隱含層的權重裡,只有一個位置的值為1(假設為第i個位置),隱含層中所有的節點只有第i個節點被啟用。因為每個詞語的one-hot encoder中“1”的位置是不同的,因此可以用矩陣\(\Delta\)唯一的表示此詞語。因此,Word2Vec是一種降維操作,從one-hot encoder中|v|的維度降低隱含層節點個數的維度。

Word2Vec 的兩種模型

  1. skip-gram,輸入是一個詞語,用來預測上下文
  2. CBOW,輸入是上下,用來預測該詞語

3. 基於gensim的word2vec的使用

from gensim.models import Word2Vec
from gensim.models import word2vec

def generate_word_model():
	#讀取原始檔(分詞後的檔案)
    sentences=word2vec.LineSentence('words.txt')
    #訓練模型
    model=Word2Vec(sentences,size=100,workers=4)
    #儲存模型
    model.save('words.model')
    #載入模型
    model = Word2Vec.load('words.model')
    #判斷兩個詞的相似度
    print(model.similarity('你好', '您好'))

if __name__=="__main__":
    pass

Word2Vec常用引數說明:

class Word2Vec(sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH, compute_loss=False, callbacks=(), max_final_vocab=None)

sentences: list,儲存原始檔中的詞,可用LineSentence構建

size: 特徵向量的維度

window: 視窗大小

min_count: 小於min_count的詞語被捨棄

workers:訓練並行數目

sg:訓練演算法,1:CBOW,other:skip-gram

batch_words: 每個batch中單詞的總數