Word2Vec

Word2Vec 是 NLP 中一种通过语料库预训练[[Word Embedding]] 的方法。常见实现形式:

  • [[CBOW]] :<-> 根据上下文来预测下一个单词。

  • [[Skip-Gram]] :<-> 根据一个单词来预测上下文。
    CBoW 和 skip 对比

  • 训练速度 :-> Cbow 训练速度快

  • 训练效果(准确率):-> skip 准确率和生僻字预测效果好,每一词会经过 C 次调整,模型的训练机制会对向量的预测能力要求更高(1 predict n)
    参数更新

  • tjc=I(jc=jc)t_{j}^{c}=\mathbb{I}\left(j_{c}=j_{c}^{*}\right),即网络第 c 个输出的第 j 个分量对应于第 c 个真实的输出单词 $${word_{j^*_c}}$$时,它为 1;否则为0。定义:

  • ejc=Eujc=yjctjce_{j}^{c}=\frac{\partial E}{\partial u_{j}^{c}}=y_{j}^{c}-t_{j}^{c}

  • Ewj=c=1CEujc×ujcwj=c=1Cejch\frac{\partial E}{\partial \overrightarrow{\mathbf{w}}_{j}^{\prime}}=\sum_{c=1}^{C} \frac{\partial E}{\partial u_{j}^{c}} \times \frac{\partial u_{j}^{c}}{\partial \overrightarrow{\mathbf{w}}_{j}^{\prime}}=\sum_{c=1}^{C} e_{j}^{c} \overrightarrow{\mathbf{h}}

  • EH=Eh=c=1C(uch)TEuc\overrightarrow{\mathbf{E H}}=\frac{\partial E}{\partial \overrightarrow{\mathbf{h}}}=\sum_{c=1}^{C}\left(\frac{\partial \overrightarrow{\mathbf{u}}^{c}}{\partial \overrightarrow{\mathbf{h}}}\right)^{T} \frac{\partial E}{\partial \overrightarrow{\mathbf{u}}^{c}}

  • EH=c=1CWec=j=1VEIjwj\overrightarrow{\mathbf{E H}}=\sum_{c=1}^{C} \mathbf{W}^{\prime} \overrightarrow{\mathbf{e}}^{c}=\sum_{j=1}^{V} E I_{j} \overrightarrow{\mathbf{w}}_{j}^{\prime}

  • Ewk,i=Ehi×hiwk,i=EHi×xk\frac{\partial E}{\partial w_{k, i}}=\frac{\partial E}{\partial h_{i}} \times \frac{\partial h_{i}}{\partial w_{k, i}}=E H_{i} \times x_{k}

优化

  • [[Hierarchical Softmax]]本质是把 N 分类问题变成 log(N)次二分类

  • 从 Word2Vec 中可以看到,更新一个样本时需要计算词表每个单词的概率。计算量大。

  • HS 使用树结构能在 $${\log(V)}$$ 的时间内计算出给定单词的概率。

  • 二叉树的每条边代表分裂:

    • 向左的边:表示选择左子节点,边的权重为选择左子节点的概率

    • 向右的边:表示选择右子节点,边的权重为选择右子节点的概率

  • 对于任意一个中间节点 t,有一个向量 $$\overrightarrow{\mathbf{v}_t}^{\prime}$$。从求解 $$\overrightarrow{\mathbf{w}}^{\prime}$$ 问题转化到 V-1 个二叉树的中间节点向量表达(下图灰色的节点)。

  • 左子节点的概率:$$p(t, l e f t)=\sigma\left(\overrightarrow{\mathbf{v}}_{t}^{\prime} \cdot \overrightarrow{\mathbf{h}}\right)$$

  • 右子节点的概率:$$p(t, right)=1 - \sigma\left(\overrightarrow{\mathbf{v}}_{t}^{\prime} \cdot \overrightarrow{\mathbf{h}}\right)$$

  • 左右节点的概率和为 1

  • 当需要计算某个单词的概率时,找到从根到这个单词所在叶节点的路径。然后按上面的方法计算概率,一直将概率相乘,得到这个单词的概率。

  • p(w)=j=1L(w)1σ(g(n(w,j+1)=ch(n(w,j)))×vn(w,j)h)p(w)=\prod_{j=1}^{L(w)-1} \sigma\left(g(n(w, j+1)=c h(n(w, j))) \times \overrightarrow{\mathbf{v}}_{n(w, j)}^{\prime} \cdot \overrightarrow{\mathbf{h}}\right)

  • g(...)g(...) 表示如果这个单词属于当前节点的左子树,为 1,反之为 -1。和上面的节点概率有关。

  • 词频高的节点离根节点较远,距离远参数数量就多,在训练过程中,低频词的路径上的参数能够得到更多的训练。

问题

  • 为什么在计算word similarity的时候,我们要用cosine distance,我们能够用其他距离吗?

    • 欧拉距离也可以,cos 自带归一化。
  • 在word2vec的目标函数中,两个词 $${w_i,w_j}$$ 的词向量 $${v_i,v_j}$$ 其实分别来自输入权重矩阵和输出权重矩阵,那么在实际使用时,我们需要分别存储输入矩阵和输出矩阵吗?还是直接用输入矩阵当作word2vec计算similarity就好了?

    • 两个向量来自不同的空间

    • 输出权重矩阵 encodes the meanings of words as context

    • ^需要选择那个矩阵?^

  • 隐层的激活函数是什么?是sigmoid吗?

推荐系统中使用 embedding 的方法

  • 有监督学习 wide&deep 之类,embedding 作为优化变量,随机初始化,在优化最终的 logloss 的过程中, embedding 是模型副产品。

  • 无监督学习

    • 套用 word2vec 的方法,预训练 embedding

    • 上面学习得到的 emb 可以用来做召回,或者放到其他模型中作为参数输入。

  • embedding 使特征向量化,从而实现计算相似度

[[Ref]]

  • [[Word2Vect tf 实现]]

  • word_representation

  • nce-loss函数与Word2Vec实现 - 知乎

  • 稀疏词向量,用skip-gram还是cbow训练好? - 知乎

    • 使用 Skip-gram :一句话可能产生多个训练样本,对罕见词和罕见搭配更加友好

    • cbow 避免训练集膨胀,训练结果偏向常用词

  • [NLP] 秒懂词向量Word2vec的本质

    • Distributed Representations of Sentences and Documents

      • 贡献:在前人基础上提出更精简的语言模型(language model)框架并用于生成词向量,这个框架就是 Word2vec
    • Efficient estimation of word representations in vector space

      • 贡献:专门讲训练 Word2vec 中的两个trick:hierarchical softmax 和 negative sampling

      • 优点:Word2vec 开山之作,两篇论文均值得一读

      • 缺点:只见树木,不见森林和树叶,读完不得要义。

        • 这里『森林』指 word2vec 模型的理论基础——即 以神经网络形式表示的语言模型,『树叶』指具体的神经网络形式、理论推导、hierarchical softmax 的实现细节等等
    • Xin Rong word2vec Parameter Learning Explained

作者

Ryen Xiang

发布于

2024-10-05

更新于

2025-04-22

许可协议


网络回响

评论