1.Transforme
1.1 要做一件什么事
- 基本组成依旧是机器翻译模型中常见的Seq2Seq网络
- 输入输出都很直观,其核心架构就是中间的网络设计了
- MxN,输入M,输出N
1.2 传统的RNN网络有什么问题
- 传统RNN是一个时序模型,下一个RNN的输入依靠上一个RNN的输出,不能做到并行计算
- 由于不能并行计算,到时无法在工业级进行大规模数据处理使用
1.3 Self-Attention机制
-
Self-Attention机制来进行并行计算,在输入和输出都相同
-
输出结果是同时被计算出来的,现在基本已经取代RNN了
-
-
传统的word2vec表示向量时有什么问题? 预训练好的向量就永久不变了
-
不同语境中相同的词如何表达?
对于输入的数据,你的关注点是什么?如何才能让计算机关注到这些有价值的信息?对于一句话,在不同的语境中所关注的地方也不一样,例如这两句话中的it:
1.4 self-attention如何计算?
-
输入经过编码后得到向量
-
想得到当前词语上下文的关系,可以当作是是加权
-
构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。
三个需要训练的矩阵:Q: query,要去查询的;K: key,等着被查的;V: value,实际的特征信息
q与k的内积表示有多匹配;输入两个向量得到一个分值;K: key,等着被查的;V: value,实际的特征信息
每个词的Attention计算,每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征
Attention整体计算流程:
- 每个词的Q会跟每一个K计算得分
- Softmax后就得到整个加权结果
- 此时每个词看的不只是它前面的序列而是整个输入序列
- 同一时间计算出所有词的表示结果
1.5 multi-headed机制
一组q,k,v得到了一组当前词的特征表达;通过不同的head得到多个特征表达;将所有特征拼接在一起;可以通过再一层全连接来降维
堆叠多层,计算方法都是相同的
在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,我们希望模型能对位置有额外的认识。
- 加入归一化Normalize 2. 连接:基本的残差连接方式
2.BERT
BERT(Bidirectional Encoder Representations from Transformers),说白了就是transformer的encoder部分,并不需要标签,有预料就能训练了
2.1 如何训练BERT
方法1:句子中有15%的词汇被随机mask掉
交给模型去预测被mask的家伙到底是什么
词语的可能性太多了,中文一般是字
如果BERT训练的向量好,那分类自然OK
方法2:预测两个句子是否应该连在一起
[seq]:两个句子之前的连接符,[cls]:表示要做分类的向量
2.2 如何使用BERT
- github已经开源,直接使用训练好了的模型就行
- 所需的任务融入BERT中即可,它俩一起训练的!
- 端到端的输入输出方式,直接套用深度学习模型关注输入输出