ZhengkunTian / OpenTransformer

A No-Recurrence Sequence-to-Sequence Model for Speech Recognition
MIT License
372 stars 66 forks source link

Bug in relative positional encoding implementation #25

Closed jjjjohnson closed 3 years ago

jjjjohnson commented 3 years ago

你好, 因为conformer在ASR的应用中是encoder,不需要和transformer-XL(decoder)一样加上下三角的attention mask, 所以transformer-XL中的_shift实现用到conformer中是不对的。(当然代码中没有加下三角的,比如下图第一行[00 pad 14 13 12]如果不用下三角mask,这样shift了以后会将一个batch中的其他样本的feature引入当前样本。这样个人认为不合理)。 我在ESPNET也提过issue,作者也承认了这个问题。

配一张图来说明transformer-XL的shift实现原理: image 如果需要 我可以提一个PR~ 谢谢!

ZhengkunTian commented 3 years ago

感谢您发现问题,您如果愿意可以提一个PR,太感谢了!

chenjiasheng commented 3 years ago

比如下图第一行[00 pad 14 13 12]如果不用下三角mask,这样shift了以后会将一个batch中的其他样本的feature引入当前样本

我觉得应该是引入了同一个样本中其他帧之间的信息,而非不同样本间的信息。 而且引入的是一些混乱的信息。例如0行2列本应该是0号帧对2号帧的注意力评分,却错成了"14"也即1号帧对-3号帧的注意力评分。

如果encoder要求完整的双向感受野,那么我们的最后需要的矩阵是这样的:

. . . . .
00 01 02 03 04
11 10 11 12 13
22 21 20 21 22
33 32 31 30 31
44 43 42 41 40
. . . . .
00 0,-1 0,-2 0,-3 0,-4
11 10 1,-1 1,-2 1,-3
22 21 20 2,-1 2,-2
33 32 31 30 3,-1
44 43 42 41 40

我这样理解对吗? @jjjjohnson

ZhengkunTian commented 3 years ago

的确是有个正负号的,上图中的是针对语言模型而言,我们的编码器是针对全部上下文的,不过不同的是,代码中我默认左边为负数,右边是正数。