机器学习词向量表示
机器学习词向量表示
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)\) 假设\(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}\)出现的概率
优化问题:
\(\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中单词的总数