有一段时间笔者利用Transformer实现一个功能,输入有三种模态,分别是A , B , C A,B,CA,B,C,其中预训练过程中需要对A AA或者B BB进行动态地掩膜,这个过程中,笔者想到通过mask id进行实现。我们从之前的博文[1]中知道,自注意力机制的计算公式可表示为(1)所示
其中的,
是注意力掩膜(mask id),其作用用于屏蔽[PAD]字符的影响,具体细节可见博文[1]。如果把mask id也考虑进来,那么如Fig 1所示,一共有四种类型的id。
Fig 1. Transformer的输入通常由Token id,Segment id和Position id,mask id组成。笔者当时的推导是,如果将指定模态输入的mask id置为0,比如B模态的,那么Transformer计算过程中就应该会不考虑这一段的输入了吧。推导过程很简单,在m = 0 的时候,,那么如式子(1)所示,
的计算的值就会非常接近于− 10000 ,因此
输出接近为0,因此该部分就不会被计算到。笔者在实验中也进行了实验验证,做法是这样的:固定预训练模型参数,将模型设置为eval模式,固定A和C模态输入,并且输入不同的B,发现最后的运算输出没有差别。
Reference
[1]. https://fesian.blog.csdn.net/article/details/116137177