作者 | Lisnol 编辑 | 汽车人
原文链接:https://www.zhihu.com/question/413378105/answer/2394348786
点击下方卡片,关注“自动驾驶之心”公众号
ADAS巨卷干货,即可获取
本文只做学术分享,如有侵权,联系删文
本文主要参考了两篇博客:
https://lilianweng.github.io/posts/2020-04-07-the-transformer-family/
https://xieyangyi.blog.youkuaiyun.com/article/details/105980363
相比LSTM,Transformer的优点:
可并行计算,Transformer的attention和feed-forward,均可以并行计算。而LSTM则依赖上一时刻,只能串行
减少long range dependency,利用self-attention将每个字之间距离缩短,大大缓解了长距离依赖问题
提高网络深度。由于大大缓解了long range dependency的梯度衰减问题,Transformer网络可以很深,基于Transformer的BERT甚至可以做到24层。而LSTM一般只有2层或者4层。网络越深,高阶特征捕获能力越好,模型performance也可以越高。
Transformer是bidirectional 双向网络,可以同时融合前后位置的信息;而双向LSTM只是简单的将两个方向的结果相加。
可解释性强。完全基于attention的Transformer,可以表达字与字之间的相关关系,可解释性更强。
Transformer的缺点:
Input sequence的长度很长时,计算量爆炸。self-attention的计算量为O(),L为input sequence的长度。Transformer-XL利用层级方式,提升速度
Transformer的位置信息依赖position encoding,效果比较一般。当sequence较短时,Transformer效果不一定比LSTM好
Transformer参数量较大,在大规模数据集上,效果远好于LSTM。但在小规模数据集上,如果不是利用pretrain models,效果不一定有LSTM好。
Transformer-XL
vanilla transformer采用固定编码长度,将长文本按照固定长度,切分为多个segment。每个segment内部单独编码,segment之间没有交互信息,导致无法建模超过固定编码长度的文本,长句编码效果较差,计算量大。
Transformer-XL的改进:
Transformer-XL通过以下两个主要改进解决了context segmentation问题
hidden state reuse
Transformer-XL在编码后一个segment时,将前一个segment的隐层缓存下来。后一个segment的self-attention计算,会使用到前一个segment的隐层。后一个segment的第n+1层,对前一个segment的第n层隐层进行融合。

最大编码长度理论上为
在预测阶段,由于对segment隐层使用了缓存,故每预测一个词,不需要重新对之前的文本进行计算,大大提升了预测速度。
可以将attention的广度扩大,在多个segment之间发挥作用
使用relative positional encoding 相对位置编码
segment递归中有个比较大的问题,就是如何区分不同segment中的相同位置。如果采用原版Transformer中的绝对编码方案,两者是无法区分的。

Transformer-XL将绝对位置编码改为了q和k之间的相对位置编码,代表了两个token之间的相对位置,可以明确知道key vector k_{\tau,j} 和query vector q_{\tau,i} 的 position offset i-j 。绝对位置编码的attention计算如下:

query的token encoding和 key的token encoding之间的关联信息
query的token encoding和 key的position encoding之间的关联信息。p_j为绝对位置j的编码向量
query的position encoding和 key的token encoding之间的关联信息。p_i为绝对位置i的编码向量
query的position encoding和 key的position encoding之间的关联信息
相对位置编码的attention计算如下:

同样包含四部分,仍然为token encoding和position encoding之间的关联关系。区别在于

Longformer
Transformer计算量大。通过降低attention计算量,可以提升长距离编码能力。
LongFormer的改进
三种Sparse attention的方法,来降低计算量:

Tensor virtual machine (TVM)
使用TVM构建CUDA Kernel,加快速度,降低显存需求。
Adaptive attention span
灵活调整attention span的长度,只需要在有必要的时候回看,可帮助减少计算开销,
与adaptive computation time (ACT)相结合,可以进一步增加attention span 的长度,动态适应当前输入。
普遍趋势:较低层不需要很长的attention span,而较高层的一些attention heads可能会需要很长的attention span
大部分head只需要50左右的attention长度,只有少部分head需要较长的attention。

方案:
设定每个attention head内的token计算,都使用同一个span长度。利用attention mask来实现自适应span。对每个head都添加一个attention mask,mask为0的位置不进行attention计算。
mask函数为:

其中,R为超参,控制曲线平滑度,为单调递减函数,如下图。

实验证明,Adaptive span可有效降低计算需求,提高计算速度。
Reformer
Reformer大大提高了内存和计算资源效率,提出了以下三点改进:
Locality sensitive hashing局部敏感哈希
计算量从降低为
Adaptive span的方法虽然尝试解决attention span大小的问题,但是实际上,Attention本质是加权求和,权重为两个token间的相关性。最终结果取决于较大的权重,其他权值较小的基本就忽略了。并且softmax归一化更是加剧了这一点。小者更小,大者更大。为了减少计算冗余,可以只对相关性大的其他token的key向量计算Attention。
如何计算相关性大的token?--> locality sensitive hashing
让两个key向量在随机向量上投影,将它们划分到投影区间内。

划分了四个区间(4个bucket),进行了三次Hash。第一次Hash,使得上面两个向量分别归入bucket0和bucket3中,下面两个向量都归入bucket0。第二次Hash,上面两个向量和下面两个,均归入到bucket2中了。相关性大的向量,容易归入到一个bucket中 局部敏感Hash还是有一定的错误率的,我们可以利用多轮Hash来缓解。这也是Reformer的做法,它采取了4轮和8轮的Hash。(a)full-attention矩阵一般是sparse的
(b)使用Locality sensitive hashing(LSH), 可以根据他们的 hash buckets对 keys 和 queries进行排序
(c)设置Q=K(=/||),使得一个bucket中key和query的个数相等,便于批量化。而且,这种“shared-QK”配置不会影响 Transformer 的性能。
(d)应用batching批处理,将 mmm 个连续查询的块组合在一起。Apply batching where chunks of mmm consecutive queries are grouped together.
经过局部敏感Hash后,我们可以将相关性大的key归入同一个bucket中。这样只用在bucket内进行普通Attention即可,大大降低了计算冗余度。为了实现并行计算,考虑到每个bucket包含的向量数目可能不同,实际处理中需要多看一个bucket。整个流程如下:
让query等于key
局部敏感Hash(LSH)分bucket。上图同一颜色的为同一个bucket,共4个buckets
对buckets排序,将相同的bucket放在一起
为了实现并行计算,将所有bucket分块(chunk),每个chunk大小相同
bucket内计算Attention,由于之前做了分块操作,所以需要多看一个块。

2.Reversible residual layer
反向传播中,梯度会从top layer向bottom layer传播,所以vanilla transformer需要保存住每一层的 Q,K,V向量,也就导致N层就需要N套 Q,K,V。
Reversible residual layer 使得任何给定层的activation都可以从下一层的activation中恢复,仅使用模型参数。因此,我们可以通过在反向传播期间重新计算activation而不是存储所有activation来节省内存。
使得N层layers内存消耗变为只需要一层,从而使得模型加深不会受内存限制。

reversible residual 和普通residual的效果基本相同。
3.Feed-forward Chunking 分块全连接
大大降低了feed-forward层的内存消耗。
分成多个独立的块:

Lite Transformer
Sparse attention; 通过压缩attention 通道的方式实现,减少multi-head 的数量
multi-Head self-attention变为了两路并行,分别为一半的通道数(多头)。如下图a所示。其中左半部分为正常的fully attention,它用来捕获全局信息。右半部分为CNN卷积,用来捕获布局信息。最终二者通过Feed Forward Network层融合。这个架构称为long-short range attention(长短期Attention)。
“为了进一步降低计算量,作者将CNN转变为了一个Depthwise卷积和一个线性全连接。Depthwise(DW)卷积与Pointwise(PW)卷积,合起来被称作Depthwise Separable Convolution(参见Google的Xception),该结构和常规卷积操作类似,可用来提取特征,但相比于常规卷积操作,其参数量和运算成本较低。所以在一些轻量级网络中会碰到这种结构如MobileNet。
”

Universal transformer
将self-attention和RNN的recurrent机制结合在一起
the long-term global receptive field of transformer
learned inductive biases of RNN
具体改动如下:
引入了时间步step,从而实现了循环递归。除了第一次是原始信息作为输入,之后都是由前一个step的输出作为后一个的输入。
Feed-forward换成了Transition函数。根据task不同,可选择separable convolution分解卷积和fully-connected neural network全连接神经网络。
时间和位置编码,TimeStep embedding和Position embedding,新引入了TimeStep embedding,编码公式如下:

利用Adaptive computation time (ACT):
根据模型在每个步骤中预测的标量pondering值来调整动态处理每个输入符号所需的计算步骤数。pondering值在某种意义上是模型对每个处理步骤中输入符号需要多少进一步计算的估计。
为输入序列中的每个位置添加了动态 ACT halting机制。一旦每个符号的循环块停止(表明该符号有足够数量的revisions),它的状态就会被简单地复制到下一步,直到所有块停止或我们达到最大步数。编码器的最终输出是表示的最后一层。
模型会动态调整每个位置所需的计算steps。当某个位置停止计算后,直接copy它的隐状态到下一step。当所有位置都停止计算后,整个过程才停止。
一开始,ACT是用在RNN中,用来动态决定RNN需要多少计算步骤
基于先前隐藏状态的序列在每一步并行演化每个符号的隐藏状态。
当运行固定步数时,相当于一个多层 Transformer,其层间有绑定的参数。
具有动态halting功能


Faster-transformer
Faster-Transformer算法结构和原版Transformer基本一致,主要是从框架层角度来实现计算加速。主要方法有
算子融合。对除矩阵乘法外的所有算子,进行了合并。比如Add、Sub。从而减少了GPU kernel调度和显存读写。
半精度F16优化。
GELU激活函数、层正则化、softmax等调用频次很高的操作的优化
Turbo-transformer
和Faster-Transformer一样,进行了算子融合。从而减少GPU kernel调用和显存占用
对于LayerNorm和softmax,由于不适合并行计算,重新开发并实现了并行计算版本。
内存缓存,避免频繁释放和分配内存。
① 全网独家视频课程
BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、点云3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码学习)

② 国内首个自动驾驶学习社区
近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

③【自动驾驶之心】技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)
④【自动驾驶之心】平台矩阵,欢迎联系我们!