词向量演进
- fast text:利用英文的每个字母,生成Embedding vector
- w2v:predicttive model
- cbow:用周围词预测当前
将C个周围词的onehot向量求和,乘以 输入Embeding矩阵,变成C个周围词的隐藏层表示;再乘以输出Embeding的转置,变回长度为V的向量,对中间词向量的概率取对数,作为损失函数。
反向传播依次更新 输出Embeding矩阵和输出Embeding矩阵。最后还是求和使用吧。 - Skip-gram:当前词预测周围词
与cbow同理,只是包含多个损失函数 - 其他补充
- 为什么需要两次Embeding:容易优化;最后将两者取平均
- cbow:用周围词预测当前
- 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/ - cbow vs glove from stanford cs224 lecture02
- glove:基于计数
- 训练速度快
- 高效使用到了统计数据
- 能捕捉到单词之间的相似性。比如swim 和 swiming
- 对共现次数大的pair过于重视;可以通过限制最大值解决
- cbow:基于预测
- 随词表库大小变动;glove也是这样?
- 在单词相似性之外能捕捉到更复杂pattern
- 可以在其他任务上继续训练,提高性能;类似pretrain, finetune的形式
- 没有完全利用统计数据
- glove:基于计数
- ELMo:两个单向LSTM训练
- GPT:transformer in LM
- 单向,每个token之前看到之前的token
- Bert
- Unidirectional Transformer -> Biddirectional Transformer
- Standard LM -> Masked LM
- Only Token-level prediction -> Next Sentence prediction
- ERNIE
- 多任务,大数据训练
- Ngram mask
- XLNET
- T5
- UniLM看来很叼的样子,支持多输入多输出结构、语言模型结构、seq2seq结构
Bert
- 参数量计算
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
相关博客: - https://zhuanlan.zhihu.com/p/91903871
- 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
改进点
- 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机制。实践已经证明这两点对于长文档任务是很有帮助的;
- 加大增加了预训练阶段使用的数据规模