机器学习词向量表示

时间:2024-02-25 21:53:28

机器学习词向量表示

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)}\)

word2vec.png

输入: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中单词的总数