![5c81d18828e4314bd747e45f0721901c.png](https://i-blog.csdnimg.cn/blog_migrate/8ad75ee20663e3370c4883b90563a90c.jpeg)
Paper Reading Note: RubiksNet: Learnable 3D-Shift for Efficient Video Action Recognition
URL: https://rubiksnet.stanford.edu/(论文、补充材料、介绍视频与代码)
TL;DR
李飞飞团队出品,将spatial shift(以下均将shift翻译为“移位”)和temporal shift大一统,设计了“连续形式”的三维移位(与temporal shift手工设计的离散形式对比),从而可以通过反向传播进行优化。为了进一步加快运算,作者还提出了量化版本——在前向传播“四舍五入”,但这样得到的并非真实梯度,难以优化。因此作者提出了“注意力量化”,使用权重退火的方式,逐渐学习到ont-hot的整数偏移值,加快最终的推理速度。为了避免shift太多导致过大的内存消耗,作者还设计了budget loss进行移位比例约束;为了稳定收敛对梯度进行了normalize.......最终手工设计了四种不同规模的RubiksNet,Sth-Sth等数据集上都十分高效,与TSM相比能少2.9-5.9倍的参数和2.1-3.7倍的FLOPs。
总的来说,文章相当硬核,除了各种巧妙的设计外,还顺手写了底层CUDA加速orz。个人学识浅薄,对模块的设计原因可能认识有所偏颇,欢迎评论区讨论。
Dataset/Algorithm/Model/Experiment Detail
Dataset
Something-Something V1&V2、UCF101、HMDB51、Kinetics(补充材料)
Motivation
Spatial Shift最早在CVPR2018上被提出,被认为是传统卷积操作子的一种替换,在GPU上运算效率很高,尽管准确率有所缺陷。Temporal Shift在ICCV2019上被提出,作者手工设计了固定的时序移位,然而它没有从本质上改变空间操作,在参数量和运算量上仍花费较大。
对于行为识别这个任务来说,视频序列的连续帧中包含的时空上下文信息通常是多余的。并且,网络中不同深度的建模能力对识别行为的影响也不同。也即是说,在视频行为识别领域,对时间和空间维度灵活地进行高效移位(个人理解“灵活”的意思是“可学习的”、“不同深度自由变化的”),可以实现效率-准确率更好的权衡。
然而,简单地将固定的时序移位泛化为时空移位是十分棘手的,需要考虑不同维度上移位的channel数、移位的幅度以及如何将不同维度的操作进行结合。作者设计的初衷也即借鉴2D图像分类中空间移位的成功经验,探索实现对时空移位操作子稳定而有效的优化。
Algorithm
首先引入普通3D时空卷积定义如下(这里作者的求和符号没写清楚
![41e461ba3e2cee9f5f190723aabb694f.png](https://i-blog.csdnimg.cn/blog_migrate/3483899125f23cc8d16b608a373076b4.jpeg)
而固定时空移位操作的运算量则少得多(注意这里
![24e548ea1e5a3a199d732f13ff8467d4.png](https://i-blog.csdnimg.cn/blog_migrate/ed5f125e522534a1eb27ddd56e2e11aa.jpeg)
![c4dd5e292acca8459844717e68166cf7.png](https://i-blog.csdnimg.cn/blog_migrate/63487aa7d47d3cc6d9bdc7c167c25cba.jpeg)
RubilsShift
接着,作者便引入了可学习的时空移位操作。作者的方法可以联合学习时空上下文,从而考虑到更大范围的时空上下文信息
![8ef61c43bfa8cd6726870d12f18466ac.png](https://i-blog.csdnimg.cn/blog_migrate/3afadf9398edf0ad995f32ebe4e5c6aa.jpeg)
这里作者将移位算子构造为显示连续的三次线性插值(对周围
![6418ced291bb1eb8a5f1731da3eef260.png](https://i-blog.csdnimg.cn/blog_migrate/ed5d94155e92a61f003ea341d42a1196.jpeg)
RubilsShift-Q
为了进一步提高效率,作者对上述时空移位设计了量化版本。简单来说,模型保存了浮点数的移位值,但在前向传播的时候,所有的移位值被近似为最近的整数(四舍五入);而在反向传播过程中,梯度则基于对应的浮点移位值进行运算和更新。作者实验也发现这确实能在一定程度上加速,但由于缺少“真实梯度”,模型很难收敛。
RubilsShift-AQ
为了解决上述问题,作者提出了下图所示的“注意力量化”方式,在对移位值进行量化的同时保证了正确的梯度。计算如下
![c03c04d3c98c4f30ac7567f9f219f5cd.png](https://i-blog.csdnimg.cn/blog_migrate/ad7afd8aebf54a5494495f3e5e6135d9.jpeg)
![b868a6901617fc9df13c1d12ec055980.png](https://i-blog.csdnimg.cn/blog_migrate/51ddd5b491a5769de295c4b32f510a8a.jpeg)
在训练中对权重进行“退火”,一开始使用大的温度系数,这样softmax求得的值比较均一;而后期则使用小的温度系数,得到的移位值会变成ont-hot的整数值。通过这种方式,模型可以灵活稳定的学习到适用于视频动作识别的high-capacity时空表征,最终推理阶段和量化的移位操作一样高效。
Shift Operations Budget Constraint
尽管移位操作可以节省参数和计算量,但它会带来内存管理上的时延。作者为此引入了“移位预算限制”,这种限制可以考虑整体的移位预算,从而迫使模型渐进式地进行移位(个人认为即让模型的感受野逐渐增大)。
![ce990b4e4c07c0632a5553c52f7424f2.png](https://i-blog.csdnimg.cn/blog_migrate/cbadd2a2c4fef0cb377976700b4bad76.jpeg)
Stable Shift Training
为了保证训练时的稳定性,作者对移位的梯度进行了归一化,从而只利用了梯度变化的方向。考虑到三个维度上同等的归一化可能导致欠优化,因为空间维度实际上要大于时间维度(224x224与8),因此作者提出“放缩梯度归一化”,也即对时间梯度乘以一个小的因子(作者称这样的放缩为一个椭球而非单位球)
![4922b431dd6583921fe9b3437eb39a5f.png](https://i-blog.csdnimg.cn/blog_migrate/d3fbbe9833303838d662fed9ec94ce40.png)
Model
最终的RubiksShift layer包括了上述说的移位操作和point-wise卷积,作者将其放置在残差的位置,当然放在其他位置也是可以的。更进一步地,作者设计了不同大小的模型,具体可见补充资料(真手工设计,硬核)
![6c14670b78d5f77277697704032fb74f.png](https://i-blog.csdnimg.cn/blog_migrate/687f47bc344b8f6795044728c9960686.jpeg)
Large/Medium/Small对标ResNet-50/34/18,而Tiny则与Small相同深度,但宽度更小,可以看到相同量级下,RubiksNet的深度更深,个人认为原因是shift只能使得时空相邻的voxel交互,为了保证更大的感受野则必须使用更深的网络。
Experiment Detail
Training
为了得到更好的acc,作者现在ImageNet上预训练的spatial shift,接着在训练3D shift的时候赋予2D spatial shift的值,而对temporal shift随机初始化。其中退火的温度系数、初始化的范围都进行了设计
![4234c690c049b8c6176f59054671298c.png](https://i-blog.csdnimg.cn/blog_migrate/18641aae312db1855bd2aee51603b4d8.jpeg)
补充材料中有关于训练更多的细节,RubiksShift layer的学习率只是其它层的1/100,
![db683170d887be91a21ceb7d3186f53a.png](https://i-blog.csdnimg.cn/blog_migrate/2364078c49078a99d00559ee93f8b5eb.jpeg)
Kinetics的训练类似,UCF101和HMDB51使用Kinetics预训练的参数微调
layer级别的比较
![5da1629b61a94eb987c2feadcd2a59b3.png](https://i-blog.csdnimg.cn/blog_migrate/5b119c8505719f961a19b90fc2255bc1.jpeg)
可以看到参数量和计算量都少的多,而速度也是快得飞起,下图是更具体的比较
![461fedab1a9c6548380a5b98e59320e3.png](https://i-blog.csdnimg.cn/blog_migrate/1dec0d3b6f95fe4d25bfe2f3a5dbce00.jpeg)
![81b322a26fb7ebd1fdd38db9ea7d2406.png](https://i-blog.csdnimg.cn/blog_migrate/b5e64d16efeb8d5cb601c3e7f77d6ba2.jpeg)
SOTA比较
![a2ee21ab8088b91e2ffda2b91ce7ea8c.png](https://i-blog.csdnimg.cn/blog_migrate/dde83533707dcff618654d13c1fdd921.jpeg)
![589cd8f33f22aff0b06fcefba06c3404.png](https://i-blog.csdnimg.cn/blog_migrate/2378aa4e61ad3e7f9287f0001fc8529c.jpeg)
![72917b7246ea3de6f1cc75993f18741b.png](https://i-blog.csdnimg.cn/blog_migrate/b3e0a69333171f81eb5031120bf6cf5c.jpeg)
![3554fafd5fbab54ceeb115c31db73765.png](https://i-blog.csdnimg.cn/blog_migrate/4036a11b50865deab5d201556922292d.jpeg)
可以看到相同acc下,网络的参数和运算大大减少(从曲线的走势可能可以预估,在大模型里用shift的效果并不好)
Ablation
![33b3c2bced088bed1a1fef7dd8efb8fe.png](https://i-blog.csdnimg.cn/blog_migrate/5dc9524fdb7fab45f76ff9a667e4618d.jpeg)
消融实验也验证了各部分的有效性
Visualization
![d4a7535cfa1aefa740233e458d1c5e91.png](https://i-blog.csdnimg.cn/blog_migrate/74649a3289ba38d0fd90fd994f466683.jpeg)
可以发现模型在深层会分配更多的非零shift,可能的原因是,更抽象的特征空间里发生的信息交互可能对模型的建模能力更有益
![1f49b009af78e02b8fb8925075e63d61.png](https://i-blog.csdnimg.cn/blog_migrate/3f72413cf8c7782428ca6031e304dcc7.jpeg)
可视化不同层的shift分布(个人认为可能时进行了类似求和的操作),可以发现随着网路的加深,layer的感受野越来越大
Thoughts
本文的idea很有意思,统一了spatial shift和temporal shift,设计了十分高效的轻量网络。原文和补充材料看下来,也可以看到作者们下了很多功夫,各个模块、网络的结构、训练的方案都经过了精心的设计,对底层的CUDA也进行了支持,工作十分solid,整个行文体系非常值得借鉴,多多学习~~