Open Leonhard-Euler-ai opened 5 months ago
DIIM仅使用了一次,后续两个是ACIIM,你可以仔细看下,第一个模块走的应该不是你说的那,两个模块传入的布尔符号是不一样的。你说的那个是后面两个ACIIM才从这走的
# Factorized attention.
use_efficient = minus
if use_efficient:
k_softmax = k.softmax(dim=2)
k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
else:
# minus = Softmin(dim=2)
# k_softmax = minus(k)
# k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
# factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
k_softmax = k.softmax(dim=2)
k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
好的,谢谢你,我看到DIIM设置minus=False了。 那请问用k做softmax的原理是什么?(如上214行)您把softmax(q@k)的代码注释了 这种做法有可以参考的依据吗
这是对内存消耗做了优化的写法。
# Factorized attention. use_efficient = minus if use_efficient: k_softmax = k.softmax(dim=2) k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v) factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v) else: # minus = Softmin(dim=2) # k_softmax = minus(k) # k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v) # factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v) k_softmax = k.softmax(dim=2) k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v) factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
好的,谢谢你,我看到DIIM设置minus=False了。 那请问用k做softmax的原理是什么?(如上214行)您把softmax(q@k)的代码注释了 这种做法有可以参考的依据吗
您好,这个DIIM模块作者卸载哪里了呀,我怎莫没有找到,您找到了吗?
@bingkun99 FactorAtt_ConvRelPosEnc
和MHCABlock
共同组成了DIIM模块,作者没有按照论文中命名,并且这些模块是被其他结构复用的,具体的计算图你可以调试着看 应该和论文是一致的
@bingkun99
FactorAtt_ConvRelPosEnc
和MHCABlock
共同组成了DIIM模块,作者没有按照论文中命名,并且这些模块是被其他结构复用的,具体的计算图你可以调试着看 应该和论文是一致的
感谢
作者你好,
FactorAtt_ConvRelPosEnc
模块中当前代码use_efficient=True
,计算_差异信息_的方式与您论文中x = v - factor_att
不一致,当前直接使用x = factor_att
,请问这样做的性能更好吗 k与v之间做attention的原理是什么? 期待您的回复!