传统的RNN网络
无法并行计算,只能一个一个输入词,而Transformer可以做并行计算。
Transformer
Self-Attention
当我们对一个词做编码时,不是简简单单只考虑当前的词,而是要考虑当前词的上下文语境,要把整个上下文语境融入到当前词的词向量中。
第一步是计算当前的每个词跟整个序列中的每个词的关系,当前每个词的q分别与整个序列中每个词的k做点积,点积结果越大则越相关。
用softmax函数,将分值转化为比例,表示当前的每个词对待编码词的影响程度的大小。
由于分值会随着向量长度的变化而变化,向量长度越长,內积的结果越大,那么表示这个结果越重要,这个不合理,于是要去掉向量维度的影响,采用根号dk。
z1是第一个词的编码结果
利用矩阵乘法,将每个词都进行编码,矩阵乘法可使得所有词进行并行计算,降低时间开销。
小细节问题
位置信息
希望模型对待每一个词处理的时候,如果放的位置不同,那么实际就不同了。t1不用one-hot编码,而是采用周期信号,余弦、正弦都可以。
归一化和残差连接
残差网络,一条路是经过self-Attention;一条是不经过该层。由模型自己判断,哪种方式使得损失越低,那个就越好。至少不比原来差。
Decoder
加入MASK机制,在第3个词看来,只能用前3个词,后面的词用不了,用MASK将其掩盖掉,不用它。对每个词做编码的时候,只能用之前已有的,后面没有出结果的,不能用。