zoukankan      html  css  js  c++  java
  • 训练词向量

    词向量演进

    1. fast text:利用英文的每个字母,生成Embedding vector
    2. w2v:predicttive model
      1. cbow:用周围词预测当前
        将C个周围词的onehot向量求和,乘以 输入Embeding矩阵,变成C个周围词的隐藏层表示;再乘以输出Embeding的转置,变回长度为V的向量,对中间词向量的概率取对数,作为损失函数。
        反向传播依次更新 输出Embeding矩阵和输出Embeding矩阵。最后还是求和使用吧。
      2. Skip-gram:当前词预测周围词
        与cbow同理,只是包含多个损失函数
      3. 其他补充
        1. 为什么需要两次Embeding:容易优化;最后将两者取平均
    3. glove:count-base model
      基本概念:基于全局的token共现次数,构造任意两个token之间的共现矩阵,利用词向量去拟合共现矩阵。
      公式推导
      假如两个词之间的距离为d,那么他们的共现值为1/d,作者利用以下的公式表达 词向量和共现值之间的关系

      [w_i^T ilde{w_j} + b_i + ilde{b_j} = log(X_{ij}) ]

      其中(w_i, ilde{w_j}) 是我们要求解的词向量,(b) 表示两个词向量的bias term,(b_i=log(X_i)),利用上述公式,就可以构造loss function了,论文中利用MSE做为loss function,如下

      [J=sumlimits_{i,j=1}^{V}{f(X_{ij})(w_i^T ilde{w_j} + b_i + ilde{b_j} - log(X_{ij}))^2} ]

      其中(f(X_{ij}))为权重函数,共现次数越多的token,他们的权重越高,共现次数越小,权重越小,共现=0,就不参与loss计算。 同时希望权重函数不能过大。因此设计权重函数如下

      [ F(x)=left{ egin{array}{cases} (x/x_{max})^{alpha} & & {x>x_{max}}\ 1 & & {else} end{array} ight. ]

      (alpha)论文中设置0.75,(x_{max})取100
      训练过程如下
      采用了AdaGrad的梯度下降算法,对矩阵中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05。最终学习得到的是两个vector是和 ({x})({ ilde{w}}),因为({X})是对称的(symmetric),所以从原理上讲 ({x})({ ilde{w}}) 也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。
      优秀博客http://www.fanyeong.com/2018/02/19/glove-in-detail/
    4. cbow vs glove from stanford cs224 lecture02
      1. glove:基于计数
        1. 训练速度快
        2. 高效使用到了统计数据
        3. 能捕捉到单词之间的相似性。比如swim 和 swiming
        4. 对共现次数大的pair过于重视;可以通过限制最大值解决
      2. cbow:基于预测
        1. 随词表库大小变动;glove也是这样?
        2. 在单词相似性之外能捕捉到更复杂pattern
        3. 可以在其他任务上继续训练,提高性能;类似pretrain, finetune的形式
        4. 没有完全利用统计数据
    5. ELMo:两个单向LSTM训练
    6. GPT:transformer in LM
      1. 单向,每个token之前看到之前的token
    7. Bert
      1. Unidirectional Transformer -> Biddirectional Transformer
      2. Standard LM -> Masked LM
      3. Only Token-level prediction -> Next Sentence prediction
    8. ERNIE
      1. 多任务,大数据训练
      2. Ngram mask
    9. XLNET
    10. T5
    11. UniLM看来很叼的样子,支持多输入多输出结构、语言模型结构、seq2seq结构

    Bert

    1. 参数量计算
      bert-base 110M,如下
      (30522 + 512 + 2) * 768 + 12 * (768 * 12 * 64 * 3 + 12 * 64 * 3 + 64 * 12 * 768 + 768 + 768 + 768 + 768 * 3072 + 3072 + 3072 * 768 + 768 + 768 + 768) = 108890112
      相关博客:
    2. https://zhuanlan.zhihu.com/p/91903871
    3. https://blog.csdn.net/weixin_43922901/article/details/102602557

    ALBert


    Bert 108M = 23.8M(Embedding) + 84.9M(Attention)
    ALBert 12M ≈ 4M(Embedding) + 7M(Attention)
    Bert -> ALBert
    Embedding 30522 * 768 -> 30522 * 128 + 128 * 768
    Attention 12层encoder共享参数,84.9M -> 84.9M/12

    n-gram mask的公式还是挺有意思的,可以尝试

    ERNIE

    ernie的mask机制,最重要的实体识别需要提前训练,入门的门槛太高了。。短语级别的mask,与albert的n-gram mask比较相似
    Basic-Level Masking: 跟bert一样对单字进行mask,很难学习到高层次的语义信息;
    Phrase-Level Masking: 输入仍然是单字级别的,mask连续短语;
    Entity-Level Masking: 首先进行实体识别,然后将识别出的实体进行mask。

    XLNet

    改进点

    1. Permutation Language Model:将mask融入到自回归LM(从左到右or从右到左,不同时考虑左右context)中;针对每一句话,随机重新排列该句话,针对第i个token的预测,输入只考虑1~i-1之间的token,为了提高输入丰富度,实际上只对后1/K的部分进行预测,K=6-7;解决Bert中mask的token之间相互独立、不相互影响的问题;Bert的mask思路与此类似,只是mask的数量不同,可以对Bert改进达到类似效果。
    2. 引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的;
    3. 加大增加了预训练阶段使用的数据规模

    https://zhuanlan.zhihu.com/p/70257427

  • 相关阅读:
    k8s环境搭建--基于minik8s方法
    k8s环境搭建--基于kubeadm方法
    Ubuntu 搭建简单的git server
    国密算法--Openssl 实现国密算法(加密和解密)
    国密算法--Openssl 实现国密算法(基础介绍和产生秘钥对)
    Hyperledger Fabric 1.1 -- Policy 构成
    Pycharm 2018.2.1-2018.1
    6-5 链式表操作集
    6-4 链式表的按序号查找
    6-3 求链式表的表长
  • 原文地址:https://www.cnblogs.com/wa007/p/14692407.html
Copyright © 2011-2022 走看看