视频预训练界的HERO!微软提出视频-语言全表示预训练模型HERO,代码已开源!...

关注公众号,发现CV技术之美

 写在前面

在本文中,作者提出了HERO,一个新的大规模视频+语言综合表示学习框架。HERO以层次结构编码多模态输入,其中视频帧的局部上下文 通过多模态融合被跨模态Transformer(Cross-modal Transformer) 捕获,而全局视频上下文时间Transformer(Temporal Transformer) 捕获。

除了标准的 Masked Language Modeling(MLM)Masked Frame Modeling(MFM) 外,作者还设计了两个新的预训练任务:

(i) 视频字幕匹配( Video-Subtitle Matching,VSM) ,其中模型预测全局和局部时间对齐;

(ii) 帧顺序建模(Frame Order Modeling,FOM) ,其中模型预测打乱视频帧的正确顺序。

HERO在HowTo100M和大规模电视数据集上进行联合训练,以了解多个域的视频信息。综合实验表明,HERO在基于文本的视频/视频时刻检索、视频问答(QA)、视频和语言推理和视频字幕任务上取得了SOTA水平。此外。作者还提出了两个新的具有挑战性的基准测试——How2QAHow2R 的视频QA和检索。

 1. 论文和代码地址

212a2903718c6e57a07e4b4125048c9c.png

HERO: Hierarchical Encoder for Video+Language Omni-representation Pre-training

论文地址:https://arxiv.org/abs/2005.00200

代码地址:https://github.com/linjieli222/HERO

 2. Motivation

受BERT启发,大规模的多模态预训练在视觉与语言研究领域盛行,比如ViLBERT,LXMERT,UNITER等等。然而,大多数大规模的预训练模型都是为静态图像量身定制的,而不是动态视频。

VideoBERT是第一个应用BERT来学习视频文本对的联合嵌入的方法。但由于只有离散的token被用来表示视频帧,丰富的视频帧特征并没有得到充分利用。为了解决这一点,CBT提出使用对比损失,但仅用于视频表示学习。

目前,一些约束条件固有地限制了现有模型的成功:

1) 大多数模型设计都是对BERT的直接调整,以字幕句子和视觉帧的简单concat结果作为输入,同时失去了视频和文本模态之间的时间对齐。

2) 预训练任务直接借鉴图像+文本预训练方法,而不利用视频的顺序性质。

3) 与现有工作中研究的不同图像域相比,当前视频模型中使用的视频数据集仅限于烹饪或叙述教学视频,不包括包含动态场景和复杂社会互动的视频源。

为了解决这些挑战,作者提出了一个新的视频和语言大规模训练预框架——HEROH ierarchical E ncodeR  for O mni-representation learning)。HERO将一系列视频片段帧及其附带的字幕句子作为输入。HERO没有采用一个类似BERT的编码器,而是以一种分层的方式对多模态输入进行编码:

1) 跨模态Transformer 来融合字幕句子及其相应的局部视频帧;

2) 时间Transformer 使用所有周围的帧作为全局上下文,来获取每个视频帧的顺序上下文嵌入。

所提出的层次模型能够首先在帧级别上吸收视觉和文本的局部上下文,然后转移到全局视频级的时间上下文中。实验表明,这种新型的模型设计比类似BERT的结构具有更好的性能。

针对HERO,作者设计了四个预训练任务:

1) Masked Language Modeling(MLM) 

2) Masked Frame Modeling(MFM) 

3) Video-Subtitle Matching(VSM) 

4) Frame Order Modeling(FOM) 

与之前的工作相比,关键的新颖之处是VSM和FOM,它鼓励多模态之间显式时间对齐,以及对视频输入的顺序性质进行开发。在VSM中,该模型不仅考虑全局对齐(预测字幕是否与输入的视频片段相匹配),而且还考虑局部时间对齐(检索视频片段中字幕的时刻)。

在FOM中,作者随机选择并打乱视频帧的一个子集,并训练模型恢复它们的原始顺序。大量的消融研究表明,VSM和FOM在视频+语言预训练中都起着关键作用。

为了使模型拥有更丰富的知识,作者在HowTo100M和大规模电视数据集联合训练HERO。与HowTo100M中的描述相比,电视数据集包含了更复杂的情节,需要全面解释人类情感、社会动态和事件的因果关系,使其成为对HowTo100M的有价值的补充,并更接近现实生活场景。

现有的预训练模型都是在YouCook2和MSR-VTT数据集上进行的评估。YouCook2只关注烹饪视频,而MSR-VTT中的标题非常简单。为了在更具挑战性的基准测试上评估本文的模型,作者收集了两个关于视频时刻检索和问答的新数据集——How2R和How2QA。

此外,作者还评估了HERO在流行的检索和QA任务上的性能,如TVR和TVQA,在这些任务中,HERO的性能远远优于现有模型。此外,作者进一步证明了本文模型的泛化性:

1) 将HERO用于不同的下游任务 (视频和语言推理和视频字幕任务),并在VIOLIN和TVC数据集上达到了SOTA的性能;

2) 采用不同的视频类型 :单频道视频(仅限视频)和多频道视频(视频+字幕),并在DiDeMo和MSR-VTT数据集上达到了SOTA性能。

 3. 方法

3.1 Model Architecture

c3052745ba4c544963f3e75c40e5bc43.png

HERO的模型架构如上图所示,它以视频片段的帧和字幕句子的文本token作为输入。它们被输入到一个视频嵌入器和一个文本嵌入器中来提取初始表示。HERO在一个层次化的过程中计算上下文化的视频嵌入。

首先,每个视觉帧的局部文本上下文被一个跨模态Transformer 捕获,计算字幕句子与其相关视觉帧之间的上下文化多模态嵌入。然后将整个视频片段的编码帧嵌入输入到时间Transformer 中,学习全局视频上下文,并获得最终的上下文化视频嵌入。

Input Embedder

将视频片段的视觉帧表示为,其字幕表示为,是视频片段中的视频帧数,是字幕中的句子数。对于文本嵌入器,首先将字幕句子转换为WordPieces序列,即(L是中的token数)。每个单词的最终表示是通过将其token嵌入和位置嵌入相加,然后再加一个层归一化(LN)得到。

对于视频嵌入器,作者首先使用预训练的ResNet和SlowFast提取每个视频帧的二维和三维视觉特征。这些视觉特征concat起来,并通过一个全连接(FC)层投影到与token嵌入投影到相同的低维空间中。

由于视频帧是顺序的,因此它们的位置嵌入可以与文本嵌入器中相同的方式进行计算。通过将FC输出和位置嵌入相加,然后通过一个LN层,得到了帧的最终嵌入。在输入嵌入器后,和的token和帧嵌入表示为和。

Cross-modal Transformer

为了利用字幕和视频帧之间的固有对齐,对于每个字幕句子,作者首先通过跨模态注意学习相应的token与其相关的视觉帧之间的上下文嵌入。跨模态Transformer的输出是针对每个字幕token和每个视频帧得到的上下文化嵌入序列:

其中表示跨模态Transformer,,。

Temporal Transformer

在从跨模态Transformer的输出中收集了所有的视觉帧嵌入后,作者使用另一个Transformer作为时间Attention,从视频片段的全局上下文中学习上下文化的视频嵌入。为了避免丢失位置信息,作者使用残差连接来添加。最终的上下文化视频嵌入的计算方法为:

其中表示时间Transformer,。与BERT直接连接所有文本token和视觉帧作为输入的编码器相比,本文的模型有效地利用字幕句子和视频帧之间的时间对齐,以更细粒度的方式进行多模态融合。在实验中,作者证明了本文的模型设计远远优于BERT。

3.2 Pre-training Tasks

23a3c44d1e131cf668f522c04f754740.png

作者提出了四个预训练任务。在训练过程中,每个mini-batch采样一个任务,以防止不同的任务破坏彼此的输入。如上图所示,MFM和MLM与BERT相似。单词Mask是通过用特殊的[MASK] token 来替换一个单词,通过将帧特征向量替换为零向量来实现帧Mask。

作者每次只mask一种模态,同时保持另一种模态的完整。VSM旨在学习局部对齐(在视觉帧和字幕句子之间)和全局对齐(在视频片段和字幕句子序列之间)。FOM是通过学习随机重排序帧的原始顺序来建模视频的顺序特征的。

3.2.1 Masked Language Modeling

MLM的输入包括:(1)第i个字幕的单词token;(2)与对齐的视觉帧;(3)mask索引(其中M为mask token的数量,为mask的索引)。

在MLM中,作者随机以15%的概率mask输入单词,并用特殊的[MASK] token替换需要mask的token。目标是通过周围单词和与句子对齐的视觉帧来预测这些mask单词,损失函数为最小化预测负对数可能性:

其中,θ表示可训练的参数。每对都从训练集D中采样。

3.2.2 Masked Frame Modeling

与MLM类似,作者也对帧进行采样,并以15%的概率mask它们的视觉特征。然而,不同之处在于,MLM是在局部上下文(即跨模态Transformer的输出)上执行的,而MFM是在全局上下文(即时间Transformer的输出上执行的)。

根据剩余的帧和所有的字幕句子,训练模型重构mask的帧。被mask的视觉帧用零向量替代,与用离散标签表示的文本token不同,视觉特征是高维和连续的,因此不能通过类的似然进行监督。因此作者提出了MFM的两种变体,它们具有相同的目标:


Masked Frame Feature Regression (MFFR)

MFFR学习将每个mask帧上的输出回归到其视觉特征。具体来说,作者应用一个FC层将输出帧表示转换为与输入视觉特征相同维度的向量。然后在两者之间应用L2回归:

Masked Frame Modeling with Noise Contrastive Estimation (MNCE)

作者使用了噪声对比估计(NCE)损失的softmax版本,而不是直接回归mask视觉特征的真实值。NCE损失鼓励模型在给定上下文的情况下,识别正确的帧。与MFFR类似,作者将mask帧的输出输入到一个FC层,将它们投影到一个向量中。

此外,作者从未mask帧的输出中随机采样帧,作为negative distractors,这些帧也通过相同的FC层进行转换得到。最终目标是将NCE损失最小化:


3.2.3 Video-Subtitle Matching

VSM的输入包括:(1)从所有字幕句子中采样的查询;(2)整个视频片段;(3)视频片段的剩余字幕句子。作者希望模型学习:

1) 局部对齐 ——开始和结束索引,表示与查询对齐的视觉帧的span;

2) 全局对齐 ——匹配采样查询的整个视频。

在VSM中,作者计算了在局部和全局水平上的查询和视觉帧之间的匹配分数。具体来说,作者提取时间Transformer的输出作为最终的视觉帧表示。查询被输入跨模态Transformer,以计算其文本表示:

在此基础上,作者使用一个查询编码器,由一个自注意层、两个线性层和一个LN层组成,从中获得最终的查询向量。

Local Alignment

局部查询视频匹配得分采用点积进行计算:

对分数应用两个可训练的一维卷积滤波器,然后是一个Softmax,以生成两个概率向量,表示每个位置是ground-truth span的开始和结束的概率。在训练过程中,作者对每个视频抽取15%的字幕句子作为样本的查询,并使用交叉熵损失来预测局部对齐的开始和结束索引:

其中表示向量p的第y个元素的索引。注意,XML分别计算了每种模态的查询-视频匹配得分,最终的匹配得分是两个分数之和。

Global Alignment

全局匹配分数是通过max-pooling每一帧和查询之间的余弦相似性来计算的:

作者在正、负的查询视频对上使用了一个combined hinge loss。对于每对正对,作者将或替换为同一mini-batch中的另一个样本,以构建两组负对:和。训练损失可以表示为:

其中,δ是margin超参数。最后的损失是,其中λ1和λ2是平衡这两项的超参数。

3.2.4 Frame Order Modeling

FOM的输入包括:(1)所有字幕句子s;(2)视觉帧v;(3)重排序索引。作者随机选择15%的帧进行打乱,目标是重建它们的原始时间顺序,记为,其中。作者将FOM表示为一个分类问题,其中t是重排序帧的ground-truth标签。

具体来说,重新排序发生在字幕和视觉帧的多模态融合之后。重新排序的特征被输入时间Transformer,产生重新排序的视觉帧嵌入。这些嵌入通过一个FC层进行转换,然后是一个softmax层来生成一个概率矩阵,其中每一列代表第i个时间戳所属的个时间戳类的分数。最终的目标是最小化负对数似然(交叉熵损失):


 4.实验

4.1. Ablation Study

ced6af607449c776b5d64ebf941627be.png

上表展示了不同预训练任务的实验结果,可以看出,本文提出的两个预训练任务对于实验性能的提升确实是有效果的。

1b669602eccaf4274761749c7a192a73.png

上表展示了模型设计的消融实验,可以看出,没有预训练之后,F-TRM(类似于BERT的Encoder)在两个任务上性能都会下降;预训练可以大大提高了HERO的性能,但F-TRM或H-TRM的效果不大。

4.2. Results on Downstream Tasks

f061b3c887f24ba0413d6a93d5eb34ff.png

上表展示了SOTA方法和本文方法的性能对比,可以看出,本文的性能能够大大超过以前的SOTA方法。

 5. 总结

在本文中,作者提出了一种用于视频+语言全表示预训练的层次编码器。本文的HERO模型提出了一个层次结构,包括跨模态Transformer和时间Transformer的多模态融合。

作者提出了新的预训练任务来捕获局部和全局的时间对齐。在两个大规模视频数据集上进行预训练之后,当HERO迁移到多个视频和语言任务时,HERO大大超过了SOTA水平。此外,作者还提出了两个基于文本的视频时刻检索和视频QA的新数据集,作为下游评估的额外基准。

▊ 作者简介

研究领域:FightingCV公众号运营者,研究方向为多模态内容理解,专注于解决视觉模态和语言模态相结合的任务,促进Vision-Language模型的实地应用。

知乎/公众号:FightingCV

d4336a0fd705f11e41f836de42d9fab8.png

END

欢迎加入「计算机视觉交流群👇备注:CV

825ee1fbffdbca291b3c86b360e5d8c6.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用深度强化学习(DQN)算法训练 OpenAI Gym 中的 `Hero-ram-v0` 环境的示例代码: ```python import gym import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam # 创建 DQN 模型 def create_model(state_shape, action_size): model = Sequential() model.add(Dense(24, input_shape=state_shape, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(action_size, activation='linear')) model.compile(loss='mse', optimizer=Adam(learning_rate=0.001)) return model # 初始化经验回放缓冲区 class ReplayBuffer: def __init__(self, buffer_size): self.buffer_size = buffer_size self.buffer = [] def add(self, experience): self.buffer.append(experience) if len(self.buffer) > self.buffer_size: self.buffer.pop(0) def sample(self, batch_size): return np.random.choice(self.buffer, batch_size) # DQN Agent class DQNAgent: def __init__(self, state_shape, action_size, buffer_size): self.state_shape = state_shape self.action_size = action_size self.buffer = ReplayBuffer(buffer_size) self.model = create_model(state_shape, action_size) def act(self, state): state = np.expand_dims(state, axis=0) q_values = self.model.predict(state)[0] action = np.argmax(q_values) return action def train(self, batch_size, gamma): minibatch = self.buffer.sample(batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: next_state = np.expand_dims(next_state, axis=0) target = reward + gamma * np.amax(self.model.predict(next_state)[0]) state = np.expand_dims(state, axis=0) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) def remember(self, state, action, reward, next_state, done): experience = (state, action, reward, next_state, done) self.buffer.add(experience) # 创建环境和 agent env = gym.make('Hero-ram-v0') state_shape = env.observation_space.shape action_size = env.action_space.n agent = DQNAgent(state_shape, action_size, buffer_size=1000) # 训练 DQN agent num_episodes = 1000 batch_size = 32 gamma = 0.99 for episode in range(num_episodes): state = env.reset() done = False total_reward = 0 while not done: action = agent.act(state) next_state, reward, done, _ = env.step(action) agent.remember(state, action, reward, next_state, done) state = next_state total_reward += reward if len(agent.buffer.buffer) > batch_size: agent.train(batch_size, gamma) print(f"Episode: {episode+1}, Reward: {total_reward}") # 使用训练好的 agent 进行测试 num_test_episodes = 10 for episode in range(num_test_episodes): state = env.reset() done = False total_reward = 0 while not done: action = agent.act(state) state, reward, done, _ = env.step(action) total_reward += reward print(f"Test Episode: {episode+1}, Reward: {total_reward}") ``` 请确保已经安装了 Gym、NumPy 和 TensorFlow 库。该代码使用一个简单的神经网络作为 DQN 的近似函数,并使用经验回放缓冲区来存储和重放过去的经验。在训练过程中,agent 与环境交互,并使用 Q-learning 更新网络权重。最后,代码还提供了一个简单的测试环节,用于评估训练好的 agent 在环境中的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值