sh命令
cmd="fairseq-train data-bin/$data_dir
--save-dir $save_dir
--distributed-world-size $gpu_num -s $src_lang -t $tgt_lang
--arch $arch
--dropout $dropout
--criterion $criterion --label-smoothing 0.1
--task mmt_vqa
--optimizer adam --adam-betas '(0.9, 0.98)'
--lr $lr --lr-scheduler inverse_sqrt --warmup-init-lr 1e-07 --warmup-updates $warmup
--max-tokens $max_tokens --update-freq $update_freq
--share-all-embeddings
--find-unused-parameters
--skip-invalid-size-inputs-valid-test
--patience $keep_last_epochs
--keep-last-epochs $keep_last_epochs
--image-name-dir data-bin/$data_dir
--ptm-name $vision_model_name
--vision-model $vision_model_name
--weight $weight
--source-sentence-dir data-bin"
主要的执行流程–task
fairseq/tasks/mmt_vqa.py
模型–arch
fairseq/models/transformer/transformer_mmt_vqa_legacy.py
@register_model_architecture("transformer_mmt_vqa", "transformer_mmt_vqa_2sa_2decoder")
def transformer_mmt_vqa_2sa_2decoder(args):
args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 128)
args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 256)
args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4)
args.encoder_layers = getattr(args, "encoder_layers", 4)
args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 128)
args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 256)
args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4)
args.decoder_layers = getattr(args, "decoder_layers", 4)
mmt_vqa_base_architecture(args)
DualSAEncoder
VQA和MMT融合图像特征时 提取特征的encoder不一样、融合时选择的注意力也不一样、融合的门控参数也不一样。
具体的特征融合:
tensor.eq()/tensor.ne()
对两个张量Tensor进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回False。eq(等于)/ne(不等)
具体流程主要就是
对query得到query和mask_query的特征 同样的流程得到text和mask_text特征
然后使用预训练模型提取图像特征image_features
使用选择注意力机制将text和img特征进行融合"sum"得到融合后的text特征
同样得到融合后的query特征
DualLayersDecoder
vqa_decoder:获得之前的特征向量 得到attn_mask获得交叉注意力 得到特征
text和vqa一样 最后取多头注意力的均值 投影到固定维度(单词的字典长度)
vqa做vqa的 text做text的 没有交集 就是一般的transformer decoder
TransformerMMTVQAModel
就是encoder 然后把encoder的输出作为输入+prev_output放进decoder得到decoder的结果。
损失函数–criterion
fairseq/criterions/label_smoothed_cross_entropy_mmt_vqa.py
在计算损失的时候加上了vqa损失
paper:VALHALLA: Visual Hallucination for Machine Translation
代码改的部分
损失函数:valhalla-nmt/fairseq/fairseq/criterions/label_smoothed_cross_entropy_hal.py
获得图像和文本的特征表示:valhalla-nmt/models/vislang_discrete_encoder.py
加入位置信息 将图像文本特征concat起来得到encoder_out:valhalla-nmt/models/transformer_discrete_encoder.py
整个流程 所有的参数设置 decoder得到特征输出:valhalla-nmt/models/vislang_discrete_transformer.py
paper:Visual Prediction Improves Zero-Shot Cross-Modal Machine Translation
代码改的部分
• Grounded language pairs: language pairs where a multimodal parallel corpus is available, both at training and test time.
• Zero-shot language pairs: language pairs that only have a text parallel corpus for training, but have multimodal parallel data for test
zero-shot: --feat-padding-mask-infix-or-path feat-padding (test)
full: --replace-pad-by-pred
task:zeroshot-crossmodal-mt/fairseq/tasks/multilingual_multimodal_translation.py
损失函数:zeroshot-crossmodal-mt/fairseq/criterions/label_smoothed_cross_entropy_with_max_margin.py
加了一个对比损失 不理解怎么最大化正样本对最小化负样本对 理解的是正负样本对之间的距离减少
errors 包含了每个样本与batch中所有其他样本之间的相似度,即负样本相似度。
preds.unsqueeze(-1) 表示每个正样本对的相似度,与 errors 进行减法运算,得到每个正样本对与负样本之间的相似度差。
我不理解这里max 为什么可以确保正样本对和负样本对之间的距离至少为
α
\alpha
α
不会是因为加了
α
\alpha
α 所以距离就至少为
α
\alpha
α吧。。。
但是这个loss是要变小的,那不就是最小化正样本对之间的相似度,最大化负样本对的相似度,就反了啊。。。。除非是梯度上升,但看代码也不像啊。。。
arch:zeroshot-crossmodal-mt/fairseq/models/multimodal/imagination.py
encoder:zeroshot-crossmodal-mt/fairseq/models/multimodal/imagination_module.py
设置了几种不同的图像特征生成办法,输入region Embedding,然后作为query 和text做key和value进行注意力,之后再将其作为输入重复l次。
网络参数配置:zeroshot-crossmodal-mt/fairseq/models/multimodal/imagination_config.py
文本图像特征融合:zeroshot-crossmodal-mt/fairseq/models/multimodal/multimodal_projection_layers.py
decoder:zeroshot-crossmodal-mt/fairseq/models/transformer/transformer_decoder.py
transformer_decoder 提取输出的特征,{注意力权重,中间层状态} 将提取输出特征通过一个线性层映射到词汇表大小,然后通过 Softmax 计算概率分布,最后选择概率最大的词作为翻译输出。这个过程实现了从解码器特征到最终翻译结果的转换。
整体流程混乱 没找到一个总的代码 也不知道怎么实现的多语言零样本迁移的 训练的loss是预测视觉的vpn loss,那encoder和decoder迁移测试时是共享的参数吗?vpn loss训练时图像和预测值的比较在哪,还有成对文本对就是普通的MMT,缺失时就进行VPN的训练,但是VPN训练是需要图像特征的,训练好再在别的文本上直接翻译进行测试(理解的是这样)放弃了。。
数据加载流程:fairseq/data/mmt_vqa_language_pair_dataset.py