词向量训练

1、fast text

利用英文的每个字母,生成Embedding vector

2、w2v:predicttive model

2.1、cbow

用周围词预测当前
将C个周围词的onehot向量求和,乘以 输入Embeding矩阵,变成C个周围词的隐藏层表示;再乘以输出Embeding的转置,变回长度为V的向量,对中间词向量的概率取对数,作为损失函数。
反向传播依次更新 输出Embeding矩阵和输出Embeding矩阵。最后还是求和使用吧。

2.2、Skip-gram

当前词预测周围词,与cbow同理,只是包含多个损失函数

2.3、对比

为什么需要两次Embeding:容易优化;最后将两者取平均

3、glove:count-base model

基于全局的token共现次数,构造任意两个token之间的共现矩阵,利用词向量去拟合共现矩阵。

3.1、公式推导

假如两个词之间的距离为d,那么他们的共现值为1/d,作者利用以下的公式表达 词向量和共现值之间的关系

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

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

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

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

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

\(\alpha\)论文中设置0.75,\(x_{max}\)取100

3.2、训练过程

采用了AdaGrad的梯度下降算法,对矩阵中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05。最终学习得到的是两个vector是和 \({x}\)\({\tilde{w}}\),因为\({X}\)是对称的(symmetric),所以从原理上讲 \({x}\)\({\tilde{w}}\) 也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

3.3、参考博客

http://www.fanyeong.com/2018/02/19/glove-in-detail/

3.4、cbow vs glove

glove:基于计数
1、训练速度快
2、高效利用了统计数据;w2v则没有
3、能捕捉到单词之间的相似性。比如swim 和 swiming
4、对共现次数大的pair过于重视;可以通过限制最大值解决
cbow:基于预测
1、随词表库大小变动;glove也是这样?
2、在单词相似性之外能捕捉到更复杂pattern
3、可以在其他任务上继续训练,提高性能;类似pretrain, finetune的形式
from stanford cs224 lecture02

3.5、源码

1、斯坦福源码:https://github.com/stanfordnlp/GloVe
全都是cpp,需要自己编译运行,修改成本较高
2、可python安装的源码:https://github.com/maciejkula/glove-python
py+cpp,可pip安装,存在一定修改的可能性

4、语言模型

4.1、Bert

特点
1、Unidirectional Transformer -> Biddirectional Transformer
2、Standard LM -> Masked LM
3、Only Token-level prediction -> Next Sentence prediction
参数量计算
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
相关博客:
1、https://zhuanlan.zhihu.com/p/91903871
2、https://blog.csdn.net/weixin_43922901/article/details/102602557

4.2、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的公式还是挺有意思的,可以尝试

4.3、ERNIE

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

4.4、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

5、其他

5.1、ELMo

两个单向LSTM训练

5.2、GPT

transformer in LM
单向,每个token之前看到之前的token

5.3、T5

5.4、UniLM

看来很叼的样子,支持多输入多输出结构、语言模型结构、seq2seq结构
1. 全网络,Mask一部分,类似Bert的训练
2. 只能看左边的信息,类似language model
3. 包含encode 和 decode,encode可以看全部信息,decode只能看左边的信息。类似seq2seq模型

posted @ 2021-04-23 09:34  wa007  阅读(306)  评论(0编辑  收藏  举报