词向量训练
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, \tilde{w_j}\) 是我们要求解的词向量,\(b\) 表示两个词向量的bias term,\(b_i=log(X_i)\),利用上述公式,就可以构造loss function了,论文中利用MSE做为loss function,如下
其中\(f(X_{ij})\)为权重函数,共现次数越多的token,他们的权重越高,共现次数越小,权重越小,共现=0,就不参与loss计算。 同时希望权重函数不能过大。因此设计权重函数如下
\(\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
改进点
- 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改进达到类似效果。
- 引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的;
- 加大增加了预训练阶段使用的数据规模
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模型