在以前的video captioning解决方法中,绝大部分都是生成短短的一句话,并不能很好的概括视频中的详细内容,论文中提出了采用分级RNN的方法,先利用sentence generator产生句子,在上面叠加一层paragraph generato产生段落。在sentence generator中加入了时间和空间的attention机制。
整体结构如下:
Sentence Generator
图中(a)部分为sentence generator。首先将word用词向量来表示,作为Recurrent I的输入,Recurrent I相当于一个语言模型。在当前时刻Recurrent I计算出了当前的隐藏状态h,并把Recurrent I的隐藏状态h作为Attention I的输入。
其中video feature pool中为从视频中提取出的特征池,用{v1,v2,···, vkm}来表示。其中k为一帧当中patch的数量,因为要进行空间attention,所以需要在一阵中提取出多个不同的区域,以找出重点关注的部分;m为视频序列的长度,用于进行时间attention。
Attention I将视频特征v和隐藏状态h映射到一个低维空间,维数为32-256.Attention II对映射后的向量做了一个归一化。
通过
然后通过weighted average对特征进行加权平均计算出特征向量。需要补充的是,这个特征向量有可能有多个,比如文中有两个,object appearance和motion 特征。attention模型对不同的特征向量是分开进行权重学习的的。
在multimodal中将所有特征向量的加权平均值和Recurrent I中的隐藏状态h作为输入:
Paragraph Generator
对于paragraph中的第一个句子,Recurrent I的初始状态全部初始化为0,后续句子的初始化状态为paragraph状态。
Recurrent I和Recurrent II是异步的,Recurrent II以一个句子为一个时刻。把句子中所有词的词向量进行累加平均得到一个词的特征向量,用Recurrent I中的最后一个隐藏状态来作为句子的特征向量,连接这两个特征向量,然后与Sentence Embedding层全连接,激活函数用stanh得到最终句子的特征向量。
把句子输入到Recurrent II(可以看做以句子为单位的语言模型)中,得到当前时刻的隐藏状态,将隐藏状态与sentence embedding输入到paragraph state层得到当前段落状态,也作为下一句的初始状态。这样就学到了一个段落里面句子与句子之间的上下文关系。
训练
针对每一个单词的最大似然:s1:n-1表示之前句子的状态,w1:t-1表示句子中已有的词,V表示视频特征。
文中使用了SGD来进行求最优解,步长为10^-4。在生成阶段使用beam search来生成句子。
这一篇主要的内容还是分级RNN,sentence级作为以word的单位的encoder,paragraph级作为以sentence为单位的encoder。其根本是建立起了句与句之间的语义关联,并且使用了空间和时间的attention机制,取得了不错的效果。使用VGGnet提取外观特征,C3D提取运动特征。
作者最后提到了使用双向RNN仍然是一个问题,在rnn结构中训练时使用正确label做输入与测试时使用output做输入还是有一定差别。可以尝试用scheduled sampling等来解决这个问题。