论文地址:
https://arxiv.org/abs/2006.16362arrow-up-right
对Q,K\mathbf Q,\mathbf KQ,K降维,然后通过对角阵增加模型表达力,最后达到相当的效果。
计算方式:
压缩率ppp,hhh为头数;
输入:X∈Rn×d,Y∈Rm×d,mi∈R,i=1,…,h\mathbf X\in \mathbb R^{n\times d},\mathbf Y\in \mathbb R^{m\times d},m_i\in \mathbb R,i=1,\ldots, hX∈Rn×d,Y∈Rm×d,mi∈R,i=1,…,h,记d1=⌊pd⌋d_1=\lfloor pd\rfloord1=⌊pd⌋
for i=1,…,hi=1,\ldots, hi=1,…,h
计算Q=XWQ(i)∈Rn×(d1/h),K=XWK(i)∈Rm×(d1/h),V=XWV(i)∈Rm×(d/h)\mathbf Q= \mathbf X\mathbf W_Q^{(i)} \in \mathbb R^{n\times (d_1 /h)},\mathbf K= \mathbf X\mathbf W_K^{(i)} \in \mathbb R^{m\times (d_1 /h)}, \mathbf V =\mathbf X\mathbf W_V^{(i)}\in \mathbb R^{m\times (d /h)}Q=XWQ(i)∈Rn×(d1/h),K=XWK(i)∈Rm×(d1/h),V=XWV(i)∈Rm×(d/h)
H(i)=MHA(Qdiag(mi),K,V)\mathbf H^{(i)}=\mathrm{MHA}(\mathbf Q\mathrm{diag}(m_i), \mathbf K, \mathbf V)H(i)=MHA(Qdiag(mi),K,V)
输出:Concat[H(i)]\mathrm{Concat}[\mathbf H^{(i)}]Concat[H(i)]
说明:
尽管原文中不同头算Q,K\mathbf Q,\mathbf KQ,K的WQ,WK\mathbf W_Q,\mathbf W_KWQ,WK是共享的,但实际实现的时候并不是;
对于每个头,时间复杂度为:
所以hhh个头的时间复杂度为:
略过。
https://github.com/lucidrains/x-transformers/blob/main/x_transformers/x_transformers.py#L514arrow-up-right
https://github.com/epfml/collaborative-attention/blob/master/src/collaborative_attention/collaborative_attention.pyarrow-up-right
https://github.com/epfml/collaborative-attentionarrow-up-right
因为只改了Head部分,所以适用于所有场景;作者进行了大量实验,效果均不错。
降维比例为30%的时候也能达到相当效果。
总结:
很简洁的思路,通过降维减少参数量,然后再通过少量参数恢复性能;
非常简洁,值得复现;
Last updated 3 years ago