语言模型
语言模型通常用条件概率分布进行表示:
为了实现,使用causal attention将当前词后面的词mask掉。causal attention其实与transformer的decode部分中的masked attention是一样的。如下图所示:
Multiple Positions
- 在论文中,训练了一个64层的char-level的Transformer模型,因为训练一个深度的transformer太难了,收敛的会很慢。如下图所示,对于一个char的prediction任务来说,transformer模型会把所有的context都输入进来,然后再去做prediction。做inference的时候,transformer每次会重新计算所有的context,这点上比不过lstm,lstm可以做增量。
- 加快收敛的方法是在序列中的每个位置预测当前位置和当前位置之前的词。
辅助损失 Auxiliary Losses
在刚开始进行训练时,当transformer的层数超过10层后,模型收敛速度变慢性能变差,为了解决这个问题加入了auxiliary losses.
Intermediate Layer Losses
1.除了在transformer的最上层进行下一个词的预测以外,我们在transformer的每个中间层也进行了下一个词的预测,这样中间层的每个位置都会有对应的损失函数,就叫做中间层的auxiliary losses
2.随着训练的进行,网络在一直收敛,这时底层的loss会变得越来越不重要。在论文中,如果有n层,那么第l层将会在训练步数的处不再起作用。这种设置将会使得在训练到一半的时候,中间层上的损失就不再起作用了。层数越低,loss权重越低。
3.当然最后所有的损失函数都是要加入到总损失函数中去,再用总损失函数进行梯度下降算法进行学习。我们这里使用的是加权求和,即每个辅助损失函数以一定的权重加入到总损失函数中去。
Multiple Targets loss
- 在序列中的每个位置,模型对下一个字符进行两次(或更多次)预测。对每次预测我们使用不同的分类器,这样我们对transformer的每一层的每个位置都会产出两个或多个损失函数,选择一共作为主要损失,其他的都称为字符辅助损失。
- 每个位置的多个损失需要合并成当前位置的总损失,我们将每个辅助损失乘0.5加上主损失得到当前位置的总损失。
位置编码 Positional Embeddings
- 在标准的transform中位置embeding用的是正弦曲线产生的时间信息,并且这个位置embeding是在输入transformer最下层之前加入到词embeding中去的。
- 由于模型深度比较深,这种时间信号可能在沿着transformer向上传递的时候发生丢失。为了解决这个问题,在每一层添加一个维度512的Positional Embeddings矩阵,这些矩阵都是可学习的。这样第i−1层的输出加上第i−1层的Positional Embeddings后再输入到第i层中去。