Open PowerFour4 opened 2 months ago
关于attn.py下ProbAttention._get_initial_context方法下V.cumsum累加的问题,我认为这里缺少一步累加后的平均操作,因此导致结果特征图分布差异很大。 具体原因如下: decoder中,对于每一个Q都考虑其自身和以前的时间步的信息来满足因果关系和防止信息泄露,因此需要mask,而论文中提到的ProbSparceAtten认为有些Q是Lazy的也就是接近均匀分布,基于这个假设mask后的lazy的Q应当是以前所有时间步的V的平均而不应该是累加。 我也debug看了特征图的确会出现lazy的Q对应的特征行注意力计算后达到几十的数量级,而active的Q的结果只在零点几的数量级。这样导致特征图分布极不平衡,我认为会损害训练稳定性和性能。
因此, 对于该行代码 contex = V.cumsum(dim=-2) 应该修改为 contex = V.cumsum(dim=-2) row_sum = torch.arange(1, V.shape[-2]+1)[None, None, :, None].to(V.device) # (1, 1, L_V, 1) contex = contex/row_sum 来保证初始化的contex分布一致,不会随着行数的增加数值尺度变大。 作者您好,如果您看到此issue,希望尽快回复,谢谢。
关于attn.py下ProbAttention._get_initial_context方法下V.cumsum累加的问题,我认为这里缺少一步累加后的平均操作,因此导致结果特征图分布差异很大。 具体原因如下: decoder中,对于每一个Q都考虑其自身和以前的时间步的信息来满足因果关系和防止信息泄露,因此需要mask,而论文中提到的ProbSparceAtten认为有些Q是Lazy的也就是接近均匀分布,基于这个假设mask后的lazy的Q应当是以前所有时间步的V的平均而不应该是累加。 我也debug看了特征图的确会出现lazy的Q对应的特征行注意力计算后达到几十的数量级,而active的Q的结果只在零点几的数量级。这样导致特征图分布极不平衡,我认为会损害训练稳定性和性能。
因此, 对于该行代码 contex = V.cumsum(dim=-2) 应该修改为 contex = V.cumsum(dim=-2) row_sum = torch.arange(1, V.shape[-2]+1)[None, None, :, None].to(V.device) # (1, 1, L_V, 1) contex = contex/row_sum 来保证初始化的contex分布一致,不会随着行数的增加数值尺度变大。 作者您好,如果您看到此issue,希望尽快回复,谢谢。