移位操作 浮点数_ECCV2020 斯坦福李飞飞团队 RubiksNet 可学习的三维移位

5c81d18828e4314bd747e45f0721901c.png

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时空卷积定义如下(这里作者的求和符号没写清楚

的范围,个人理解为
,而re-centered索引则是表示对中心点前后左右的像素进行操作),它的参数量和运算量与输入成三次方

41e461ba3e2cee9f5f190723aabb694f.png
3D时空卷积

而固定时空移位操作的运算量则少得多(注意这里

是对每个channel单独进行移位操作)

24e548ea1e5a3a199d732f13ff8467d4.png
固定时空移位

c4dd5e292acca8459844717e68166cf7.png
三种版本的RubilsShift

RubilsShift

接着,作者便引入了可学习的时空移位操作。作者的方法可以联合学习时空上下文,从而考虑到更大范围的时空上下文信息

8ef61c43bfa8cd6726870d12f18466ac.png
可学习的时空移位操作

这里作者将移位算子构造为显示连续的三次线性插值(对周围

个点进行加权求和),具体操作可见作者补充材料

6418ced291bb1eb8a5f1731da3eef260.png
三次线性插值

RubilsShift-Q

为了进一步提高效率,作者对上述时空移位设计了量化版本。简单来说,模型保存了浮点数的移位值,但在前向传播的时候,所有的移位值被近似为最近的整数(四舍五入);而在反向传播过程中,梯度则基于对应的浮点移位值进行运算和更新。作者实验也发现这确实能在一定程度上加速,但由于缺少“真实梯度”,模型很难收敛。

RubilsShift-AQ

为了解决上述问题,作者提出了下图所示的“注意力量化”方式,在对移位值进行量化的同时保证了正确的梯度。计算如下

c03c04d3c98c4f30ac7567f9f219f5cd.png
注意力量化

b868a6901617fc9df13c1d12ec055980.png
RubilsShift-AQ

在训练中对权重进行“退火”,一开始使用大的温度系数,这样softmax求得的值比较均一;而后期则使用小的温度系数,得到的移位值会变成ont-hot的整数值。通过这种方式,模型可以灵活稳定的学习到适用于视频动作识别的high-capacity时空表征,最终推理阶段和量化的移位操作一样高效。

Shift Operations Budget Constraint

尽管移位操作可以节省参数和计算量,但它会带来内存管理上的时延。作者为此引入了“移位预算限制”,这种限制可以考虑整体的移位预算,从而迫使模型渐进式地进行移位(个人认为即让模型的感受野逐渐增大)。

ce990b4e4c07c0632a5553c52f7424f2.png
移位预算限制

Stable Shift Training

为了保证训练时的稳定性,作者对移位的梯度进行了归一化,从而只利用了梯度变化的方向。考虑到三个维度上同等的归一化可能导致欠优化,因为空间维度实际上要大于时间维度(224x224与8),因此作者提出“放缩梯度归一化”,也即对时间梯度乘以一个小的因子(作者称这样的放缩为一个椭球而非单位球)

4922b431dd6583921fe9b3437eb39a5f.png
放缩梯度归一化

Model

最终的RubiksShift layer包括了上述说的移位操作和point-wise卷积,作者将其放置在残差的位置,当然放在其他位置也是可以的。更进一步地,作者设计了不同大小的模型,具体可见补充资料(真手工设计,硬核)

6c14670b78d5f77277697704032fb74f.png
网络结构

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
训练

补充材料中有关于训练更多的细节,RubiksShift layer的学习率只是其它层的1/100,

等等

db683170d887be91a21ceb7d3186f53a.png
训练补充材料

Kinetics的训练类似,UCF101和HMDB51使用Kinetics预训练的参数微调

layer级别的比较

5da1629b61a94eb987c2feadcd2a59b3.png
不同layer的比较

可以看到参数量和计算量都少的多,而速度也是快得飞起,下图是更具体的比较

461fedab1a9c6548380a5b98e59320e3.png
FLOPs比较

81b322a26fb7ebd1fdd38db9ea7d2406.png
参数比较

SOTA比较

a2ee21ab8088b91e2ffda2b91ce7ea8c.png
Something-SomethingV2

589cd8f33f22aff0b06fcefba06c3404.png
Something-SomethingV1

72917b7246ea3de6f1cc75993f18741b.png
UCF101-HMDB51

3554fafd5fbab54ceeb115c31db73765.png
Kinetics

可以看到相同acc下,网络的参数和运算大大减少(从曲线的走势可能可以预估,在大模型里用shift的效果并不好)

Ablation

33b3c2bced088bed1a1fef7dd8efb8fe.png
消融实验

消融实验也验证了各部分的有效性

Visualization

d4a7535cfa1aefa740233e458d1c5e91.png
shift分布

可以发现模型在深层会分配更多的非零shift,可能的原因是,更抽象的特征空间里发生的信息交互可能对模型的建模能力更有益

1f49b009af78e02b8fb8925075e63d61.png
不同层shift分布

可视化不同层的shift分布(个人认为可能时进行了类似求和的操作),可以发现随着网路的加深,layer的感受野越来越大

Thoughts

本文的idea很有意思,统一了spatial shift和temporal shift,设计了十分高效的轻量网络。原文和补充材料看下来,也可以看到作者们下了很多功夫,各个模块、网络的结构、训练的方案都经过了精心的设计,对底层的CUDA也进行了支持,工作十分solid,整个行文体系非常值得借鉴,多多学习~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值