Self-Attention机制来进行并行计算,在输入和输出都相同
输出结果是同时被计算出来的,现在基本已经取代RNN了
传统的word2vec表示向量时有什么问题? 预训练好的向量就永久不变了
不同语境中相同的词如何表达?
对于输入的数据,你的关注点是什么?如何才能让计算机关注到这些有价值的信息?对于一句话,在不同的语境中所关注的地方也不一样,例如这两句话中的it:
输入经过编码后得到向量
想得到当前词语上下文的关系,可以当作是是加权
构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。
三个需要训练的矩阵:Q: query,要去查询的;K: key,等着被查的;V: value,实际的特征信息
q与k的内积表示有多匹配;输入两个向量得到一个分值;K: key,等着被查的;V: value,实际的特征信息
每个词的Attention计算,每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征
Attention整体计算流程:
一组q,k,v得到了一组当前词的特征表达;通过不同的head得到多个特征表达;将所有特征拼接在一起;可以通过再一层全连接来降维
堆叠多层,计算方法都是相同的
在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,我们希望模型能对位置有额外的认识。
- 加入归一化Normalize 2. 连接:基本的残差连接方式
BERT(Bidirectional Encoder Representations from Transformers),说白了就是transformer的encoder部分,并不需要标签,有预料就能训练了
方法1:句子中有15%的词汇被随机mask掉
交给模型去预测被mask的家伙到底是什么
词语的可能性太多了,中文一般是字
如果BERT训练的向量好,那分类自然OK
方法2:预测两个句子是否应该连在一起
[seq]:两个句子之前的连接符,[cls]:表示要做分类的向量