论文阅读1-《VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts》

在这里插入图片描述论文里面的图
在这里插入图片描述

预训练:先训图像v-ffn,训完了冻结再训l-ffn,最后整体训练。

step1:模态表征

给定一个图像-文本对,提取文本、图像、图像和文本三种粒度的特征。

图像表征

  • 将一个h*w *c的图分成p * p个patch,再进行展平,这样就会得到一个大小为n * p * p * c的图像序列(其中,n = h * w )然后线性投影得到图像表征序列。
  • 在图像表征开头化加一个可学习的i_cls在这里插入图片描述
    代码:
# https://github.com/microsoft/unilm/blob/master/vlmo/vlmo/modules/multiway_transformer.py#L167
 def visual_embed(self, _x):
        x = self.patch_embed(_x)
        x = x.flatten(2).transpose(1, 2)
        B, L, _ = x.shape

        cls_tokens = self.cls_token.expand(B, -1, -1)
        x = torch.cat((cls_tokens, x), dim=1)
        
        if self.pos_embed is not None:
            x = x + self.pos_embed
        x = self.pos_drop(x)

        x_mask = torch.ones(x.shape[0], x.shape[1])

        return x, x_mask

文本表征

  • 将bert输出的表征加头:一个序列的开始标记([T_CLS])和一个特殊的边界标记([T_SEP])被添加到文本序列中;
    -在这里插入图片描述

多模态表征

最后将文本和图像表征concate;得到H。

step2: Mixture-of-Modality-Experts Transformer

给定前一层的输出向量Hl−1,l∈[1,L],每个MOME变压器块通过切换到不同的模态专家来捕获特定于模态的信息,并采用多头自匹配 (MSA)共享,以对齐视觉和语言内容。

代码核心部分

class Block(nn.Module):
       ....
  self.gamma_1 = \
            nn.Parameter(layer_scale_init_values * torch.ones((dim)),requires_grad=True) \
            if layer_scale_init_values is not None else 1.0
        self.gamma_2 = \
            nn.Parameter(layer_scale_init_values * torch.ones((dim)),requires_grad=True) \
            if layer_scale_init_values is not None else 1.0

        self.max_text_len = max_text_len

    def forward(self, x, mask=None, modality_type=None, relative_position_bias=None):
        x = x + self.drop_path(self.gamma_1 * self.attn(self.norm1(x), mask=mask, relative_position_bias=relative_position_bias))

        if modality_type == "image":
            x = x + self.drop_path(self.gamma_2 * self.mlp_imag(self.norm2_imag(x)))
        elif modality_type == "text":
            x = x + self.drop_path(self.gamma_2 * self.mlp_text(self.norm2_text(x)))
        else:
            if self.mlp_vl is None:
                x_text = x[:, : self.max_text_len]
                x_imag = x[:, self.max_text_len :]
                x_text = x_text + self.drop_path(self.gamma_2 * self.mlp_text(self.norm2_text(x_text)))
                x_imag = x_imag + self.drop_path(self.gamma_2 * self.mlp_imag(self.norm2_imag(x_imag)))
                x = torch.cat([x_text, x_imag], dim=1)
            else:
                x = x + self.drop_path(self.gamma_2 * self.mlp_vl(self.norm2_vl(x)))

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SOHO和VLBERT是两个不同的模型。SOHO是一个用于图像理解和生成的模型,而VLBERT是一个用于图像和文本联合理解的模型。 SOHO是一个基于自监督学习的模型,它通过对图像进行遮挡和恢复的任务来学习图像的表示。它可以用于图像生成、图像修复和图像编辑等任务。 VLBERT是一个将图像和文本结合起来进行联合理解的模型。它使用ViT的方法来提取图像特征,并将每个图像patch映射到隐状态维度。VLBERT的结构和ViT相似,但在LN层的位置上有所不同。VLBERT可以用于图像问答、图像标注和图像检索等任务。 总结来说,SOHO是一个用于图像生成和理解的模型,而VLBERT是一个用于图像和文本联合理解的模型。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [多模态中预训练的演变史](https://blog.csdn.net/qq_27590277/article/details/121690048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [从LXMERT到VLMO:多模态预训练模型的演变史](https://blog.csdn.net/qq_27590277/article/details/121391773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值