多模态bert-基于双流的bert 笔记 ViLBert、LXMERT、IMAGEBERT

ViLBert  
paper: ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks

基于双流的 ViLBERT,在一开始并未直接对语言信息和图片信息进行融合,而是先各自经过 Transformer 的编码器进行编码。分流设计是基于这样一个假设,语言的理解本身比图像复杂,而且图像的输入本身就是经过 Faster-RCNN 提取的较高层次的特征,因此两者所需要的编码深度应该是不一样的。
 
 

双流的 ViLBERT包括两个平行的视觉(绿色)和语言(紫色)处理流,它们通过新的共同注意转换层相互作用。这种结构允许每个模态的不同深度,并通过共同注意实现稀疏交互。带乘数下标的虚线框表示重复的层块。

 输入:Image 和text :

输出:Attention 过的 Image 和text 的表示

模型

1.预训练步骤

2.联合表示Image 和Text

两个任务:1. 预训练:Mask掉image 和部分文字去预测image 或者word ;2 微调:预测是否对应

创新:在结构上加入交互attention之后去训练

2. LXMERT 论文解读
paper:(EMNLP 2019) LXMERT: Learning Cross-Modality Encoder Representations from Transformers

code: https://github.com/airsplay/lxmert

理解这两种模式之间的对齐和关系,提出对两种模态分布进行建模。这个框架模仿了最近的bert风格的创新,同时进一步适应了有用的跨模态场景。我们的新跨模态模型侧重于视觉和语言的交互学习,特别是对单个图像的表示和它的描述性语句。

模型结构


Input Embeddings:Word Embedding && Image Embeddings

Q:TODO Object-Level Image Embeddings  怎么做???

Encoders :language encoder && the object-relationship encoder

Output Representations:

language, vision, and cross-modality

训练任务:1. Language Task: Masked Cross-Modality LM

2 Vision Task: Masked Object Prediction

3 Cross-Modality Tasks

单流Bert--------image-text  joint embedding

3. IMAGEBERT
Paper : I MAGE BERT: C ROSS - MODAL P RE -TRAINING WITH L ARGE - SCALE W EAK - SUPERVISED I MAGE -T EXT D ATA
 

数据收集过程

### 使用 `bert-base-uncased` 实现多模态情感分析 为了实现基于 `bert-base-uncased` 的多模态情感分析,可以遵循以下方法。此过程涉及数据准备、模型构建以及最终的训练和评估。 #### 数据准备 在进行任何建模之前,需先准备好用于训练的数据集。这包括收集文本、图像和其他形式的多媒体资料,并对其进行必要的预处理工作,比如去除噪声、标准化格式等[^2]。对于每种类型的媒体,还需要提取相应的特征向量作为后续分析的基础。 #### 特征融合 由于目标是执行多模态的情感分析,因此需要找到一种有效的方式将来自不同源的信息结合起来。一种常见的做法是在早期阶段就混合这些信号;另一种则是分别处理各路输入后再做后期聚合。无论采取哪种方式,都应确保所选方案能够充分利用到各个维度上的特性来提升整体性能。 #### 构建BERT模型 接下来就是搭建具体的深度学习框架了。这里选用的是 Hugging Face 提供的 PyTorch 版本 Transformer 库中的 pre-trained BERT 模型 (`bert-base-uncased`) 来加载权重参数并定义新的分类头层: ```python from transformers import BertTokenizer, BertForSequenceClassification import torch.nn as nn tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained( 'bert-base-uncased', num_labels=3) # 假设有三个类别:正面、负面、中立 ``` #### 定义辅助模块 考虑到除了文字之外还有其他类型的数据参与进来,所以要额外引入一些组件帮助完成跨域转换的任务。例如,可以通过 CNN 或者 RNN 对图片/音频片段编码成固定长度的嵌入向量,之后再与词句表征拼接在一起送入全连接层作最后决策: ```python class MultimodalModel(nn.Module): def __init__(self, text_model, aux_input_size): super().__init__() self.text_encoder = text_model.bert self.classifier = text_model.classifier # 添加一个线性变换以匹配辅助输入尺寸 self.aux_fc = nn.Linear(aux_input_size, 768) def forward(self, input_ids=None, attention_mask=None, token_type_ids=None, position_ids=None, head_mask=None, inputs_embeds=None, labels=None, aux_features=None): outputs = self.text_encoder(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)[0] pooled_output = outputs[:, 0] if aux_features is not None: transformed_aux = F.relu(self.aux_fc(aux_features)) combined_representation = torch.cat((pooled_output, transformed_aux), dim=-1) else: combined_representation = pooled_output logits = self.classifier(combined_representation) return logits ``` #### 训练流程 有了上述准备工作后就可以着手编写完整的训练循环逻辑了。注意,在实际操作过程中可能还会涉及到超参调整、早停机制等一系列优化措施来保证收敛速度及泛化效果。 ```python device = "cuda" if torch.cuda.is_available() else "cpu" multimodal_net = MultimodalModel(model).to(device) optimizer = AdamW(multimodal_net.parameters(), lr=5e-5) loss_fn = CrossEntropyLoss() for epoch in range(num_epochs): multimodal_net.train() total_loss = 0 for batch in train_loader: optimizer.zero_grad() texts_inputs = {k:v.to(device) for k,v in batch['text'].items()} images_tensors = batch['image'].float().to(device) predictions = multimodal_net(**texts_inputs, aux_features=images_tensors) loss = loss_fn(predictions.view(-1, model.num_labels), batch["label"].view(-1).to(device)) loss.backward() optimizer.step() total_loss += loss.item() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值