美文网首页
自然语言处理之词向量模型介绍

自然语言处理之词向量模型介绍

作者: 出题老头 | 来源:发表于2020-12-30 00:10 被阅读0次
    nlp

    我们在平日的生活中所说的话语,如何使用计算机自动构造出来呢?

    一.探究我们在说一句话时,无形中做了什么

    1.人类语言通俗剖析

    我想吃晚饭

      通过以上内容,我们可以把句的意思拆分为:我·想·吃·晚饭。
    我们通常在说“我”的时候,大脑其实是在思考下一个词,即“想”,然后说了“想”了同时,开始思考下一个词“吃”,以此类推。
      也就是说,我们每一次说出下一个词的时候,是基于上一个词说的是什么而定的,这样才能在表达出自己意思的同时能顺利组织成一句话。
      这种思想很像条件概率?没有错,这种思想确实可以用条件概率表达出来:
    P(S) = P(w_1,w_2,w_3,\cdots,w_n)=P(w_1)P(w_2|w_1)\cdots P(w_n|w_1,w_2,\cdots w_{n-1})
    此处的P(S)被称为语言模型,也用来计算一个句子的概率。
      通过以上式子可看出,每次新出现的词汇,都和之前已经出现的词汇有很强的关联(条件概率嘛),所以越到后面的词汇,所需要的条件概率越稀疏,并且参数巨大(每个词都是一个参数哟!)

    1. 数据过于稀疏
    2. 参数空间太大

    2.-N-gram模型的出现

      而事实上,当一个句子非常非常长的时候(特别是中文),后面出现的词汇很有可能和前面说的东西,产生的因果关系不大了。那么我们就可以进行如下假设:

    我们每个词汇出现的概率,只和前面一个词汇相关:
    P(S)=P(w_1)P(w_2|w_1)P(w_3|w_2)\cdots P(w_n|w_{n-1})

    我们每个词出现概率,只和前面两个词相关:
    P(S)=P(w_1)P(w_2|w_1)P(w_3|w_2,w_1)\cdots P(w_n|w_{n-1},w_{n-2})

    以此类推,还可以每个词和前面3个相关,4个等等....(对于处女座,这种玩法太难受了,但确实把问题化简了很多!)
      这种玩法就是传说中的-N-gram模型,其中N代表的就是和前面N个词条件相关。
      假设语料库的规模是N,相关词汇量是n,模型的参数量级为N^n。由此我们可以看到,随着相关n的增长,参数规模增长是十分迅速的。所以在进行模型设计时,要考虑到小伙伴电脑的牛逼程度才行,目前主流计算机能支持到n=10的程度。一般让n=4,5都是ok的。

    二.词向量

    1.Hierarchical softmax

    ①CBOW(Continuous Bag-of-Words)

    根据上下文预测出某个空的词是的内容
    \zeta = \sum_{w\in c}^{}\log P(w|Context(w))

    1. 根据词频,对语句进行哈夫曼树的构造(由底至上济宁构建),词频即为哈夫曼权值。


      构造过程

    2.开始进行计算啦!
    在计算之前,首先解释一下各个参数含义:

    1. p^w:从根节点出发到达w对应叶子节点的路径。
    2. l^w:路径中包含的叶子节点个数。
    3. p_1^w,p_2^w....p_n^wp^w中的各个节点。
    4. d_2^w,d_3^w....d_n^w \in \{0,1\}p^w上的第n个节点上对应的编码
    5. \theta_1^w,\theta_2^w,....\theta_n^wp^w非叶子节点对应的参数

    哈夫曼树是一种二叉树结构,也就是说,利用二分类可以一步一步找到叶子节点,我们这里使用sigmod进行二分类。所以:

    正例:\sigma (x_w^T\theta)=\frac {1}{1+e^{-x_w^T\theta}}
    负例:1-\sigma (x_w^T\theta)

    通过以上两个公式,我们找到目标的过程,无非可总结为以下两种情况:

    • 走向正例时:p(d_n^w|x_w\theta_{n-1}^w)=\sigma (x_w^T\theta_{n-1}^w)
    • 走向负例时:p(d_n^w|x_w\theta_{n-1}^w)=1-\sigma (x_w^T\theta_{n-1}^w)

    程序每次下寻找一次,都会经历上述两个公式其中之一,最终会找到目标词汇,同时会留下一条路径,把路径的每一部都连乘起来就是:
    p(text|Context(text))=\prod_{2}^{n}p(d_n^w|x_w\theta_{n-1}^w)
    在累乘计算时,计算可能会比较困难,我们把上述等式两边同时取对数:
    \zeta = \sum_{w\in c}^{}\log P(w|Context(w))
    从公式可知,这里的概率值越大越好!所以此题目为求解梯度上升
    \zeta求导,得:
    \frac{\partial \zeta(w,n)}{\partial \theta_{n-1}^w}=[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]x_w
    由梯度上升可知,更新形式为:
    \theta_{j-1}^w:=\theta_{j-1}^w+\eta[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]x_w
    同样,对投影层的x_w进行求导:
    \frac{\partial \zeta(w,n)}{\partial x_w}=[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]\theta_{n-1}^w
    投影中的x_w并不是单独的词向量,而是由词向量拼接而成的一个大向量,然而,2013年google粗暴的将这个导数更新到各个词向量中:
    v(\widetilde{w}):= v(\widetilde{w})+\eta \sum_{n=2}^{l^w}\frac{\partial \zeta(w,n)}{\partial x_w} ,w \in Context(\widetilde w)

    ②Skip-Gram模型

    其实就是把CBOW的流程倒过来,回推出各个词向量。

    2. 负采样

      当语料库非常庞大的时候,将会构造出非常庞大的哈夫曼树,这样仍然会增加计算机的压力,影响计算速度。如何解决呢?那么我们下回分解!

    相关文章

      网友评论

          本文标题:自然语言处理之词向量模型介绍

          本文链接:https://www.haomeiwen.com/subject/juffoktx.html