- LSH Attention:近似计算,针对l,只计算注意力中高权重的部分
- 可逆网络:时间换空间,针对\(n_l\),只存储最后一层的参数
- 分块计算:时间换空间,针对\(d_{ffn}\),对FFN层做分块计算
文章插图
- LSH Attention
LSH使用哈希函数对高位空间的向量x计算哈希函数h(x),\(h(x)\)满足在高维空间中更近的向量有更高的概率落在相同的哈希桶中 , 反之在高维空间中距离更远的向量有更低的概率会落在相同的哈希桶中 。LSH有很多种算法,这里作者使用的是基于角距离的局部敏感哈希算法 。随机初始化向量R维度是\(d_{model} * bucket/2\),哈希结果为旋转(xR)之后最近的一个正或者负的单位向量\(h(x) = argmax([xR;-xR])\)
使用LSH计算Attention会存在几个问题
- query和key的hashing不同:为了解决这个问题作者把计算注意力之前query和key各自的线性映射统一成了一个,\(k_j=\frac{q_j}{||q_j||}\),这样二者的哈希也会相同,只需要对key进行计算就得到token的哈希分桶 。例如上图(b)长度为6的序列被分成3个桶[1,2,4],[3,6],[5]
- 哈希的误差:哈希只是使得相似的向量落入相同桶的概率更高,为了进一步提高这个概率,可以进行多次不同的哈希函数对输出结果取交际,进一步降低近似带来的信息损失 。也就是用更多的时间和空间来换取更好的近似效果
- 每个序列哈希分桶的大小可能不尽相同,无法进行batch计算:这里作者又做了一步近似 。根据以上的哈希结果对token进行重排序,相同哈希的token放一起,桶内按原始位置排序,按固定长度m进行切分,每个chunk的query对当前chunk和前一个chunk的key计算注意,也就是位于[m,2m]的query对[0,2m]的key计算注意力,这里m和哈希桶数反向相关\(m=\frac{l}{n_{bucket}}\) , 也就是和平均哈希桶的大小正相关 。实际上LSH只是用来排序,提高固定长度内注意力权重占整个序列的比例 , 从而通过有限长度的注意力矩阵近似全序列的注意力结果 。同样是固定窗口,LSH使得该窗口内的token权重会高于以上Longformer,BigBird这类完全基于位置的固定窗口的注意力机制,不过LSH的搜索和排序也会进一步提高时间复杂度
- 可逆残差网络
- 分块计算
效果评测部分我们在下面的performer里一起讨论
Performer
- paper: Rethinking Attention with Performers
- github: https://github.com/google-research/google-research/tree/master/performer
- Take Away: 提出核函数使得QK变换后的内积可以近似注意力矩阵 , 配合乘法结合律把复杂度从平方降低到线性
文章插图
推荐阅读
- 为什么阿里Java开发手册不推荐使用Timestamp
- 《黑色皮革手册》的原著叫什么名字?
- 黑莲花攻略手册讲什么故事 黑莲花攻略手册讲什么
- 斯巴鲁BRZ保养周期 斯巴鲁brz保养手册
- 学车一点通——深圳学车驾驶完全手册
- 评价手册家长的话内容 评价手册家长的话怎么写简短
- 机动车驾驶手册 汽车驾驶完全手册
- 2023鱼台义务教育入学服务平台操作手册
- 汽车保养周期手册大全 汽车保养内容周期全攻略
- 奇瑞a3维修手册 奇瑞A3汽车保养费用详解