zoukankan      html  css  js  c++  java
  • GloVe损失函数的理解

     

    简介

    GloVe是一种非常简单快速的训练词向量的算法。与复杂的word2vec相比,其是一个log双线性模型,仅通过一个简单的损失函数就能够得到很好的结果。

    (1)J=∑i,jNf(Xi,j)(viTvj+bi+bj−log(Xi,j))2


    其中,vivj是i和j的词向量,bibj是两个偏差项,f是一个权重函数,N为词汇表大小
    但是这个损失函数的意义却不是很直观,这里参照一篇博客写了一下对于这个损失函数的分析

    思路

    Glove首先会通过设置定义的窗口大小,进行统计得到词的共现矩阵。如Xi,j表示词ij同时出现的次数。共现矩阵是一个N×N的矩阵

    然后我们需要计算一些条件概率
    定义

    Xi=∑j=1NXi,j
    Pi,k=Xi,kXi
    ratioi,j,k=Pi,kPj,k


    然后我们分析这里的ratio会发现一些规律


    所以我们想到,如果能够通过词向量vi,vjvk得到相似的规律的,那么说明我们的词向量是很不错的。即我们想做的是得到函数g(),使之满足

    ratioi,j,k=Pi,kPj,k=g(vi,vj,vk)


    那么为了使二者尽量想近,对于损失函数,一个直观的想法就是MSE,即

    (2)J=∑i,j,kN(Pi,kPj,k−g(vi,vj,vk))2


    不过这里的计算复杂度是N3,过于复杂,我们需要进一步分析。我们可以开始猜想一下g(vi,vj,vk)是一个什么样的形式,因为其衡量了单词i,j之间的关系,那么我们可以猜想其中含有vi−vj,又因为其中还有对k的关系且最终是一个标量,那么我们假设其存在一个内积,即(vi−vj)Tvk
    那么现在我们有

    Pi,kPj,k=g(vi,vj,vk)=(vi−vj)Tvk=viTvk−vjTvk


    可以看到这里我们和上面的损失函数有点类似了,但是还是缺少一个exp,我们可以加上它看看,即

    Pi,kPj,k=exp⁡(viTvk−vjTvk)=exp⁡(viTvk)exp⁡(vjTvk)


    可以看到,加上exp之后分子分母的形式就完全一样了,我们可以将其一起考虑,即现在只需要满足

    Pi,j=exp(viTvj)


    两边取对数,我们的损失函数就能够转化为

    (3)J=∑i,jN(log(Pi,j)−viTvj)2

    这个损失函数已经更像一些了,但是还是不太一样。这是因为我们前面是存在一点问题的。根据前面我们有

    log(Pi,j)=viTvj和log(Pj,i)=vjTvi


    但是实际上,上面的式子右边是相等的,但左边并不相等(并且对于这个问题来说,我们可以想到target和context其实是可以互换的,所以存在对称),即原有的对称性不满足了。我们需要进一步处理一下。我们将上面(3)的中的条件概率log(Pi,j)展开,得到

    log(Pi,j)=log(Xi,j)−log(Xi)=viTvj


    这里的log(Xi)是独立于j的,所以可以被吸收进bi变为

    log(Xi,j)=viTvj+bi+bj


    这样代价函数就变成了

    J=∑i,jN(viTvj+bi+bj−log(Xi,j))2


    然后加上词频越高权重越大(共现次数很少的实际上很可能是异常值,并且共现次数少的一般来说含的信息也少)

    (4)J=∑i,jNf(Xi,j)(viTvj+bi+bj−log(Xi,j))2


    权重函数

    f(x)={(x/xmax)0.75,if x<xmax1,if x>=xmax


    引用

    1. Pennington J, Socher R, Manning C. Glove: Global vectors for word representation[C]//Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP). 2014: 1532-1543.
    2. https://blog.csdn.net/codertc/article/details/73864097

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    kafka在线修改topic配置
    DateFormat采坑
    mysql ifnull 取反值;case when null的使用
    pip常用命令
    zip压缩
    Solaris 10 x86-64 虚拟机配置
    正则学习
    vnc
    window10创建系统服务
    java内存对象clone
  • 原文地址:https://www.cnblogs.com/MrLJC/p/8732985.html
Copyright © 2011-2022 走看看