fairseq框架使用记录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值