微调训练
我们以batchsize=16为例
1、图片首先通过视觉特征提取网络,被抽象出特特征,图像特征再经过 layernorm,得到 imag_embeds size为(16,677,1480)的矩阵
2、将image_embeds送入blip2中的Q-former,经过query的自注意力和query与image_embeds的交叉注意力,得到图像特征的文本token化表达query_output size(16,32,768)
3 、query_output 经过一个全连接层(线性投影层),将768维度变成2560,2560是大语言模型的隐藏层维度。得到inputs_opt size(16,32,2560),并定义全为1的atts_opt size(16,32)
4、我们给图像标注了文本描述,将16句图像描述送入大语言模型(LLM)token编码器得到文本描述编码opt_tokens.input_ids size(16,22),将opt_tokens.input_ids中padding的token设置为-100,得到targets size(16,22),然后把targets中每条文本开头的prompt(例如 a photo of)对应的token设置为-100
5、定义一个全为-100的empty_targets size(16,32)
6、把empty_targets和targets使用torch.cat 拼接为targets size(16,54)
7、将opt_tokens送入大语言模型的embedding层,得到大语言模型的inputs_embeds size(16,22,2560)
8、将inputs_opt 和 inputs_embeds 使用torch.cat 拼接成inputs_embeds size(16,54,2560)
9、将atts_opt 和 opt_tokens.attention_mask 拼接成attention_mask szie(16,54)
10、将inputs_embeds 和 attention_mask 、targets 一并送入大语言模型中,使用交叉熵损失计算大语言模型的输出和targets之间的loss,然后做反向传播
推理
blip2推理使用的是transformer库中的GenerationMixin类的generate方法,该方法被OPTForCausalLM继承
首先图片经过视觉网络提取到视觉特征
然后视觉特征与Q-former中的query做交叉注意力得到最终的视觉语义化的token表示
视觉token化的特征经过线性投影层投影到大语言模型的隐藏层维度,得到inputs_opt
最后将inputs_opt 和 图像描述的prompt 拼在一起送给大语言模型,大语言模型通过设置top-k top-p 和 num_beams 、temperature选择不同的token选择策略,最终得到模型的输出, 将最终输出利用模型文本解码器将token翻译为文本。