機器學習詞向量表示
機器學習詞向量表示
1. 詞向量的表示
對於語料庫 $ V={w_1,w_2,w_3,...w_{|v|}} $
-
one-hot表示:
\(w_1=[1,0,0,0,...]\)
\(w_2=[0,1,0,0,...]\)
優點:解釋性強
缺點:
-
通常詞典中詞的個數是非常多的,這將導致詞向量的維度特別高,計算成本加大
-
每個詞元素是離散的
-
每個詞\(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)\)
\(=\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 的兩種模型
- skip-gram,輸入是一個詞語,用來預測上下文
- 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中單詞的總數