C/C++教程

MemCap:Memorizing Style Knowledge for Image Captioning

本文主要是介绍MemCap:Memorizing Style Knowledge for Image Captioning,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

MemCap:Memorizing Style Knowledge for Image Captioning

论文主要贡献

  1. 提出了一种基于MemCap的风格化的图像描述方法,使用style memory module(风格记忆模块)来记忆关于语言风格的知识,并根据图片中的内容来检索这些知识。
  2. 提出了一种sentence decomposing algorithm(句子分解算法),自动将风格相关部分从风格句子中分离出来,以促进风格记忆模块的学习。
  3. 在多个数据集上进行的大量实验表明,与现有的方法相比,该方法具有更好的性能。

引言

近年来,图像描述的研究取得了显著的进展。大多数现有的图像描述模型侧重于生成准确的描述,而忽略了句子的语言风格。但是一个理想的描述不仅要准确的描述图像的内容,还要将特定的语言风格融入到生成的句子中。然而,有些风格相关的信息不能从图像中直接感知,因为这些信息没有视觉基础。在这种情况下,人类通常可以利用关联能力从先验知识中搜索和提取相应的风格化语料库,如图所示。
在这里插入图片描述
这篇文章提出了一种用于风格化图像描述的MemCap方法。从训练语料库中分离风格相关的短语,作者开发了一种算法,即句子分解算法§,以无监督的方式将一个风格化的句子分解为风格相关部分和内容相关部分,然后将反映语言风格短语相关的知识存储到记忆模块(M),通过一组嵌入向量对训练语料中的风格知识进行编码,然后将这些知识整合到文本描述中。
即采用注意机制根据图像内容学习注意权重,从风格记忆模块中提取相关知识。然后将提取的风格知识与图像的视觉表示结合,作为语言模型的输入。由于该方法是用非配对的程式化语料库训练的,所以图像和事实句之间的中间形式是必不可少的,本文使用场景图作为中间形式,总结视觉场景中的对象、对象之间的关系和对象的属性。图像和句子的事实内容都用场景图来表示。
在这里插入图片描述

论文方法

方法概述

整个模型如上图所示,包含风格记忆模块 M M M,句子分解器 P P P,描述生成模块 C C C,图像场景图生成器 ε \varepsilon ε和句子场景图生成器 F F F。在风格记忆模块 M M M的训练中,使用句子分解器 P P P将风格化的句子分解为内容相关部分 W c W_c Wc​和风格相关部分 W s W_s Ws​,之后将 W c W_c Wc​送入句子场景图生成器 F F F生成其场景图,风格相关部分 W s W_s Ws​用于更新风格记忆模块 M M M,根据输入句子场景图 G y G^y Gy得到风格知识 m y m_y my​,在使用两者作为输入进行端到端的训练,采用传统的交叉熵损失函数和带有奖励函数的self-critical训练策略对 M M M和 C C C进行优化。测试时,对于每个输入图像x,由图像场景图生成器 ε \varepsilon ε生成其场景图 G x G^x Gx,然后根据 G x G^x Gx从风格记忆模块 M M M中提取内容相关的风格知识 m y m_y my​,最后利用描述生成模块 C C C生成句子 y ^ s \hat{y}^s y^​s。

句子分解器 P P P

句子分解器 P P P通过一个迭代的句子分解来实现,将句子分解为 W c W_c Wc​和 W s W_s Ws​。 W s W_s Ws​包含反映句子语言风格的短语, W c W_c Wc​包含句子描述的场景、对象和动作。形式上,给出一个句子 y = w 1 , w 2 , . . . , w L y=w_1,w_2,...,w_L y=w1​,w2​,...,wL​,该算法为每个单词分配一个标签 l i ∈ { 0 , 1 } l_i∈\{0,1\} li​∈{0,1}表示为 w i w_i wi​,表明改词是否与样式相关。对于事实句,风格相关部分是一个空序列。
由于风格相关的短语很少出现在事实句中,所以在事实句训练的语言模型中,一个风格化的句子比事实句更容易引起perplexity 。因此,训练一个以事实句为指导的语言模型,来区分与内容相关的部分和与风格相关的部分。对于风格化的句子 y s y^s ys,使用dependency tree parser对句子进行解析,句子中的每个单词都对应于树中的一个节点。从 v i v_i vi​到 v j v_j vj​的有向边 e i j e_{ij} eij​表示 w j w_j wj​依赖于 w i w_i wi​,在第t次迭代中,枚举句子 y ( t − 1 ) s y^s_{(t-1)} y(t−1)s​的依赖树中的所有边。对于边 e i j e_{ij} eij​,尝试删除节点 v j v_j vj​和它的子树,剩下的节点组成一个新的句子 y ( t , j ) s y^s_{(t,j)} y(t,j)s​。第t次迭代 y ( t , ∗ ) s y^s_{(t,*)} y(t,∗)s​中的所有新句子都由经过事实句预训练的语言模型进行评估,perplexity最低的句子留到下一次迭代。如果所有新句子的perplexity 都高于原句子,则整个修剪过程结束。最后一个被修剪的句子 y ( t ) s y^s_{(t)} y(t)s​中的单词组成了该句子的内容相关部分,并赋予标签 l i = 0 l_i=0 li​=0。将修剪部分中的词视为风格相关部分,并赋予标签 l i = 1 l_i=1 li​=1。

生成场景图

场景图以结构化的形式概括了图像或句子中的信息,包括对象、对象之间的关系以及图像或句子中对象的属性。场景图 G G G由节点集 V V V和边集 E E E组成,记为 G = ( V , E ) G = (V, E) G=(V,E)。节点集由对象、关系和属性三种不同的节点组成。 o i o_i oi​表示第 i i i个对象, r i j r_{ij} rij​表示两个对象 o i o_i oi​和 o j o_j oj​之间的关系,对象 o i o_i oi​的第 k k k个属性表示为 a i k a^k_i aik​。
本文使用(Anderson et al. 2016)的方法将句子转换为场景图,这包括两个阶段。首先使用dependency parser(Klein and Manning 2003)将句子转换为dependency tree。然后采用基于规则的方法(Schuster et al. 2015)将dependency tree映射到场景图。对于风格化的句子 y s y^s ys,先对对句子进行分解,并使用与内容相关的部分 w c w_c wc​而不是整个句子生成句子场景图。
对于图像的场景图,首先生成图像的事实描述,然后将句子转换为场景图。具体来说,训练(Anderson et al. 2018)中提出的Up-Down描述模型,生成图像x的事实描述,然后使用上述方法将其转换为场景图。

风格记忆模块

在训练过程中使用风格记忆模块对训练中与风格相关的单词或短语进行编码。包含有关样式s的知识的嵌入向量构成一个矩阵 M s ∈ R d × p M_s∈R^{d \times p} Ms​∈Rd×p,其中p为嵌入向量的个数,矩阵 M s ′ ∈ R d × p M^\prime_s∈R^{d \times p} Ms′​∈Rd×p,表示与 M s M_s Ms​中的风格知识相对应的事实内容。

更新风格记忆

给定风格化句子 y s y^s ys和标签 l i l_i li​,style memory随着风格相关词的嵌入而更新, M s M_s Ms​和 M s ′ M^\prime_s Ms′​的基向量和风格相关词有关,并且通过注意力权重利用下面的公式进行更新。
在这里插入图片描述其中 e w i ∈ R d e_{w_i}∈R^d ewi​​∈Rd,表示单词 w i w_i wi​的d维嵌入向量, e s e_s es​表示句子 y s y^s ys中风格相关词的嵌入, e c e_c ec​表示场景图的嵌入,向量 α ∈ R 1 × p \alpha∈R^{1\times p} α∈R1×p表示记忆模块中每个嵌入向量的权重。

提取风格知识

在生成风格化句子之前,根据图像的概念词提取风格知识。与记忆更新操作类似,对 M s M_s Ms​中的嵌入向量进行处理,并将这些向量的加权和作为提取的知识:在这里插入图片描述其中向量 β \beta β表示提取风格知识时每个嵌入向量的权重。向量 m m m表示提取的样式知识,用于更新captioner的隐藏状态。

描述生成器 C C C

captioner C C C使用场景图 G G G和提取的风格知识 m m m作为输入生成风格化的描述 y ^ s \hat{y}^s y^​s,首先将场景图 G G G映射到一组嵌入,而提取的样式知识 m m m用于初始化两层LSTM网络的单元状态。

场景图编码

作者将场景图中的对象 o i o_i oi​、关系 r i j r_{ij} rij​和属性 a i k a^k_i aik​的嵌入分别表示为 e o i e_{o_i} eoi​​、 e r i j e_{r_{ij}} erij​​和 e a i k e_{a^k_i} eaik​​,这些嵌入相当于节点的类标签的词嵌入,进一步对节点嵌入进行编码,以收集上下文感知信息。关系的上下文感知嵌入 r i j r_{ij} rij​可以由下式表示: u r i j = W t r [ e o i ; e r i j ; e o j ] u_{r_{ij}}=W_{tr}[e_{o_i};e_{r_{ij}};e_{o_j}] urij​​=Wtr​[eoi​​;erij​​;eoj​​]其中 e o i , e r i j , e a i k e_{o_i},e_{r_{ij}},e_{a^k_i} eoi​​,erij​​,eaik​​表示三元组 ⟨ o i , r i j , o j ⟩ \langle o_i,r_{ij},o_j\rangle ⟨oi​,rij​,oj​⟩中的节点嵌入,[;]表示向量连接, W t r ∈ R d × 3 d W_{tr}∈R^{d\times 3d} Wtr​∈Rd×3d是可学习参数,对象 o i o_i oi​的上下文文感知嵌入可以由下式表示:
在这里插入图片描述其中 e a i k e_{a^k_i} eaik​​表示对象 o i o_i oi​的第k个属性的节点嵌入, N i N_i Ni​表示 o i o_i oi​的属性个数, W a t ∈ R d × 2 d W_{at}∈R^{d\times 2d} Wat​∈Rd×2d是可学习参数。整个场景图的嵌入是通过对所有的上下文感知嵌入进行平均计算得出的,即 e c = ∑ p = 1 K u p e_c=\sum_{p=1}^{K} {u_p} ec​=∑p=1K​up​,其中K为上下文感知嵌入的总数。

描述生成

场景图的上下文感知嵌入用作LSTM的输入,以生成风格化的图像描述,首先用于attention LSTM,之后用于 language LSTM的输入。第一层LSTM网络利用注意机制对场景图中的所有上下文相关表示进行编码,第二层LSTM网络输出词汇表中每个单词的概率。在时间步t,第p个上下文感知嵌入 u p u_p up​的注意权重 γ t , i \gamma_{t,i} γt,i​通过以下公式计算:
在这里插入图片描述其中 W h a W_{ha} Wha​和 W v a W_{va} Wva​是可学习的参数, h t − 1 2 h^2_{t-1} ht−12​表示language LSTM的上一个隐藏层状态, h t 1 h^1_{t} ht1​表示attention LSTM的当前隐藏层状态, E w t − 1 E_{w_{t-1}} Ewt−1​​表示前一个词的嵌入编码。计算注意权重后,根据上下文感知嵌入的加权和来预测当前单词:
在这里插入图片描述其中 W o W_o Wo​是可学习参数, p t , w p_{t,w} pt,w​表示单词w在时间步t处的概率。

训练策略

MemCap的整个训练过程包括预训练阶段和微调阶段。在预训练阶段,使用事实数据 D f D_f Df​训练captioner,给定图像 x x x和事实句子 y f y_f yf​,将图像场景图 G x G^x Gx输入captioner。由于在事实句中不涉及风格知识,所以将向量m设为全零向量。用交叉熵损失函数优化captioner C C C:
在这里插入图片描述在微调阶段,使用未配对的风格化语料库对captioner C C C和风格记忆模块 M M M进行端到端训练, y s y^s ys生成的场景图 G y G^y Gy和提取的风格知识 m m m作为captioner的输入,即 y ^ s = C ( G y , m ) \hat{y}^s=C(G^y,m) y^​s=C(Gy,m),其中 G y = F ( W c ) G^y=F(W_c) Gy=F(Wc​)为 y s y^s ys的内容相关部分推导出的场景图, y ^ s \hat{y}^s y^​s是captioner生成的预测句子。前几个epochs,使用交叉熵损失优化 C C C和 m m m,在微调过程中,使用强化学习算法,并对多个不同的评价指标(包括句子是否有风格、句子是否混淆)进行加权,作为奖励。将 C C C和 m m m的参数表示为 θ \theta θ, 表示如下:
在这里插入图片描述其中 y ^ s \hat{y}^s y^​s表示在每一个时间步从概率 p t p_t pt​中抽样得到的句子。函数 r ( y ^ s ) r(\hat{y}^s) r(y^​s)表示句子 y ^ s \hat{y}^s y^​s的奖励,包含三个部分:CIDEr奖励、style classifier奖励和perplexity奖励。在自我批评训练(Rennie et al. 2017)的启发下,引入了奖励的基线,奖励函数 r ( y ^ s ) r(\hat{y}^s) r(y^​s)定义为:
在这里插入图片描述其中sgn表示符号函数。句子 y ∗ y^* y∗表示取每个时间步上概率最大的单词得到的句子,作为 y ^ s \hat{y}^s y^​s的baseline。CIDEr奖励是根据ground-truth语句 y ∗ y^* y∗计算的,使得captioner保留输入场景图中的内容。风格分类器奖励 c l s ( y ) ∈ 0 , 1 cls(y)∈{0,1} cls(y)∈0,1是预训练风格分类器的输出,表示句子是否表达了想要的语言风格。perplexity奖励 p p l ppl ppl由使用风格s预先训练的语言模型计算。 λ 1 , λ 2 , λ 3 \lambda_1,\lambda_2,\lambda_3 λ1​,λ2​,λ3​表示三个分量的权值,是可调超参数。

实验

数据集

事实描述和对应的图像来自MSCOCO (Lin et al. 2014)数据集。这些风格化的描述来自SentiCap数据集(Mathews, Xie, and He 2016),其中包括积极和消极风格,以及FlickrStyle10K数据集(Gan et al. 2017),其中包括幽默和浪漫风格。
在所有的实验中,使用MSCOCO数据集中的图像和句子对captioner C C C进行预训练,使用SentiCap数据集和FlickrStyle10K数据集中的风格化句子进行微调。

评价指标

采用了风格分类精度(cls)和平均perplexity(ppl)评价句子的风格性,风格分类的准确性是由正确反映所需风格的句子所占的比例来衡量的。用SentiCap和StyleNet数据集中的风格句和MSCOCO数据集中的事实句训练逻辑回归分类器。通过预训练的语言模型计算生成的句子的平均perplexity。具体来说,对于四种风格的每一种,使用SRILM工具包(Stolcke 2002)训练一个基于三元组的统计语言模型,并由相应的语言模型分别评估生成的句子。perplexity得分越低,表示生成的句子越流畅,也越能反映出所期望的语言风格。

结果

单一风格

在这里插入图片描述
多风格

在这里插入图片描述
消融实验
在这里插入图片描述
生成描述结果
在这里插入图片描述
在这里插入图片描述

总结

作者提出了一种用于风格化图像描述生成的MemCap方法,通过记忆模块记忆语言风格知识,并通过注意机制提取与内容相关的风格知识,生成描述。因此,它生成的句子能够准确地描述图像的内容,并恰当地反映所需的语言风格。由于MemCap能够执行单风格和多风格字幕,并且使用非配对的程式化语料库进行训练,因此它可以很容易地应用于许多现实场景。在两个类型化数据集上的大量实验证明了该方法的优越性和有效性。

这篇关于MemCap:Memorizing Style Knowledge for Image Captioning的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!