这篇文章开篇就指出,我们的模型是要从人体动作的序列中选取出最informative的那些帧,而丢弃掉用处不大的部分。但是由于对于不同的视频序列,挑出最有代表性的帧的方法是不同的,因此,本文提出用深度增强学习来将帧的选择模拟为一个不断进步的progressive process。
这篇文章处理的问题是skeleton based action recognition,提出的模型的示意图如下:
可以看出整个模型大体分为两个部分,FDNet和GCNN。其中FDNet指的是frame distillation network,帧蒸馏网络,形象的将选取最有用的帧的过程用蒸馏来形容。FDNet得到有用的帧之后就要输入到GCNN,也就是graph convolutional neural network里面进行graph convolution,完成动作识别。
强化学习是通过优化选择actions的policy来最大化agent从environment所获得的rewards。文章中说至今为止,在动作识别领域,增强学习的应用还不多。
做skeleton based action recognition会用到人体关节的邻接矩阵,之前做skeleton based action recognition基本都是有骨骼相连的关节对才会在邻接矩阵的相应位置标记一个1,没有连接的位置就标记为0,但本文不同,本文考虑到不相连的关节之间的相互关系也是很重要的,比如两只手不是直接相连的,但是两只手的相互位置关系在识别‘拍手’这个动作时就尤为重要。因此,本文的人体关节邻接矩阵是这么设计的:如果两个关节有连接,就在邻接矩阵相应位置标记为α,称之为intrinsic dependencies,否则标记为β,称之为extrinsic dependencies。此外关节没有self connection,是邻接矩阵对角元素全是0.
本文的卷积操作如下:首先,人体骨架序列是表示成graph 的序列,也就是,对于序列当中的每一个graph,进行的卷积都是,其中y是卷积核,它的细节后文介绍,*表示卷积,xt是输入。之后会被输入到全连接网络得到,将的连接起来构成新的序列(一个3D tensor),之后用常规的CNN来处理G即得结果。本文的loss function选取的是交叉熵。接着介绍卷积的细节:首先graph上的拉普拉斯算符取做,其中In是单位阵,W是邻接矩阵,元素只有α、β和0,D是度矩阵,是对角的,表明graph每个node的度,即。有了L,就可以进一步处理得到,其中是L的最大特征值。之后就可以对输入的节点张量进行处理(节点张量x指的是每个节点的feature vector拼接而成得到的tensor)这里面Tk是切比雪夫多项式,意思应该是对第k帧的graph的节点向量,就用k次的切比雪夫多项式来处理,这里再说明一下是N个节点的三维坐标值。最后,卷积可以表示为。这里面有一点不是很理解,就是为什么要用拉普拉斯算符的切比雪夫多项式来进行卷积,用邻接矩阵的多项式进行卷积可以理解,是为了进行不同hop的卷积,一次多项式就相当于第一层卷积,每个节点只聚合其最近邻节点的信息,而二次多项式聚合2-hop的信息。这样看来,这个拉普拉斯算符其实就相当于修饰过的邻接矩阵,而切比雪夫多项式也就是普通多项式修饰过得到的,应该是为了更好的表现。这个切比雪夫多项式之前在geometric deep learning这篇综述中也看到过,可以再去看看具体为什么要用切比雪夫多项式。
接着介绍FDNet,它的大体过程如下图所示
本文将帧的选择过程描述为一个马尔可夫决策过程(Markov decision process,MDP)。有几个概念要先介绍:States,状态,MDP的状态S包含两个部分,是两个tensorF和M拼在一起,F是f×N×3的tensor,f是frames数量,N是joints数量,3就是三维坐标的意思,也就是说F是整个skeleton(graph)序列,而对于那些不够f个frames的序列,用双三次插值(bicubic interpolation)补全。M和F很相似,不同的是M是m×N×3的tensor,m是选出来的帧的数量,也就是说M包含着选出来的m帧skeleton graph的信息。而是一个f-dimension的vector,只有m个值为1,其余为零,负责记录哪些帧被选了出来。本文中f等于100而m等于30.
第二个概念,Actions,action指的是调整选取哪些帧所进行的动作,本文模型中有三种action,‘向左移动’、‘向右移动’、‘原地不动’三种,分别记作0、2、1.并且移动的步长定位一帧。这个actions是DFNet的输出,每一次迭代,FDNet都输出一个vector,而表示为第i帧选择动作j的概率大小,也就是为某一帧选择向左向右或是不动的概率大小。在采取action的时候有一个问题,比如第一帧向右移动的很多,而第二帧一直向左移动,导致第一帧到了第二帧右边,这样不同帧的顺序可能在一次次移动中产生混乱,因此作者为action设定了bound,定了界限,以保证所有帧都是按顺序排列的,设定界限也很简单,上限是这一帧和下一帧中间帧,即
表示第i帧移动的上界,也就是向右移动的界限,是第i帧和第i+1帧的中间位置向上取整,而如果i等于m,也就是i成为了选出来的m帧里的最后一个,那么调整的上限就是f,也就是graph序列的总帧数。调整的下界也是同样的想法,是这一帧和上一帧的中点,若是不能整除就向下取整
最终,第i帧的调整范围确定为,用表示调整的变化量,那么调整后的帧可表示为,而的范围就可以写作
这里面用了min,要达到的效果也就是,如果调整量加上去以后没有超过界限导致帧的顺序混乱,那就正常按照action的值来进行移动,否则,向左移动时,如果已经到了下限的位置,=0,那就不能再向左移动(=0),向右移动时同理。
接下来是Rewards的概念,记作,体现的是agent在状态S下采取动作action,会带来多好的结果。这个reward是用一个事先训练好的GCNN来获得的,在第一次迭代时,如果预测结果正确,那么r=1,否则r=-1,当n>1时,要表达r,首先要介绍一下,这里面表示第n次迭代时,正确的将结果预测为c的概率(就是说c是分类的ground truth),这样,r0在-1和1之间取值,最终n>1的reward表达如下
这个Ω是一个较大的数字,这个reward表达式的含义是,如果预测结果从错误跳变到正确,就给一个stimulation,也就是一个大的Ω,如果预测结果从正确跳变到错误,就给一个大的惩罚,就是-Ω,而没有正确错误跳变的时候,就按照r0的表达式给reward。
整个FDNet就是产生action用的,将FDNet所有参数表示为θ,那么FDNet表示为,根据状态S,在参数θ的控制下输出动作action,其结构如下图所示
Sa经过卷积层,pooling层,全连接层之后,和经过全连接层的Sb合并起来,输入到同一个全连接层中,经过这层全连接层的线性变换,由softmax层得到action。
接着,文章阐述了一下关于训练网络的内容,首先,目的是要最大化“discounted reward R”,也就是这里突然就出现了一个discounted reward,这个是强化学习中的内容,γ是一个大于0小于1的数,越往后,reward就越打折扣,可能是因为主要的调整集中在前几次迭代?或者也是为了最终能收敛?我还不是很确定。然后,为了最大化这个R,提出的loss函数是,这两者之间有什么关系我也还没台东,为什么增大这个reward就是要减小这个loss?有了这个loss之后,就可以由此更新θ了,具体是,这个只说是normalized R,应该也是强化学习中我还没了解到的内容。之后作者说到,训练深度强化学习可以用deep Q-learning或者policy gradient,而本文action有三种,3^m很大,用deep Q-learning计算量大(这里还需具体了解deep Q-learning的细节才知道为什么),所以用了policy gradient。整个深度增强网络算法如下:
最后作者讲了如何将FDNet和GCNN结合起来,首先,从graph的序列中均匀的选出一些frames,用它们来训练GCNN,之后将GCNN的参数固定,再来训练FDNet,而训练过的FDNet又能够精细调节GCNN, 就这样两者互帮互助。