先簡單講一下itc 和itm itg loss
itc loss
是將圖像和(he)query經過Q-former得到(dao)(dao)圖像的表(biao)(biao)征(zheng),文本經過Q-former得到(dao)(dao)文本表(biao)(biao)征(zheng),文本和(he)圖像矩陣乘計算對比損失
itm loss
是上一(yi)步圖像和文(wen)(wen)本(ben)表征,分別組(zu)(zu)(zu)成三(san)組(zu)(zu)(zu),一(yi)組(zu)(zu)(zu)相匹(pi)(pi)配(pei)的圖像和文(wen)(wen)本(ben),另外兩組(zu)(zu)(zu)不匹(pi)(pi)配(pei)的圖像和文(wen)(wen)本(ben),將三(san)組(zu)(zu)(zu)圖像和文(wen)(wen)本(ben)、query 一(yi)起送入Q-former,得(de)到三(san)組(zu)(zu)(zu)的分類損失(shi),相匹(pi)(pi)配(pei)的一(yi)組(zu)(zu)(zu)標簽為(wei)1,不匹(pi)(pi)配(pei)的標簽為(wei)0
itg loss
是將文(wen)本和(he)(he)第(di)一步計(ji)(ji)算(suan)itc loss 過程中圖像和(he)(he)query經過Q-former得到的每(mei)一層(ceng)隱藏層(ceng)狀態,一起送入Q-former,計(ji)(ji)算(suan)文(wen)本生成損(sun)失(shi)
1、首先定(ding)義一個(ge) blip2Qformer類 ,這個(ge)類里面包含一個(ge)vit視覺(jue)模型和(he)Qformer
note:Qformer是(shi)一個12層的(de)bert(only encoder)再加上一個全連接層
2、首先 圖(tu)像經過(guo)視覺模型(xing)得(de)到image_embeds size(16,257,1408),新(xin)建全為1的image_atts size(16,257)
3、query_tokens 是blip2Qformer類的屬性(xing),在類中被初(chu)始化全為(wei)0,size (1,32,768)
將query_tokens 復制為bachsize 為16, size為(16,32,768)
4、接下來詳解 圖(tu)像(xiang)特征 和 query 是如何(he)在Qformer中(zhong)進行運(yun)算的
4.1 query_tokens 作為(wei)Qformer的(de)輸入 首先經過(guo)embdding層(ceng),將query_tokens進行(xing)layerNorm和dropout,得(de)到(dao)embedding_output size(16,32,768)
根據embedding_output 的(de)(de)shape得到全為1的(de)(de)attention_mask size(16,32),把attention_mask extend為 extended_attention_mask size(16,1,1,32),現在extended_attention_mask中的(de)(de)值全為1,接著(zhu)需(xu)要(yao)使用公(gong)式(shi):(1-element)*-10000,作(zuo)用于每一(yi)個(ge)元素。這樣做的(de)(de)目的(de)(de)是將真正輸(shu)入的(de)(de)token mask 設置(zhi)為0,非token mask設置(zhi)為-10000
4.2 將(jiang)圖像特征賦(fu)值給encoder_hidden_states size(16,257,1408),設(she)置全為(wei)1的encoder_attention_mask size(16,257),把(ba)encoder_attention_mask extend為(wei) encoder_extended_attention_mask size(16,1,1,257),現(xian)在encoder_extended_attention_mask中的值全為(wei)1,接著需要使用公式(shi):(1-element)*-10000,作用于(yu)每一個元(yuan)素。這樣做的目的是將(jiang)真正輸入的token mask 設(she)置為(wei)0,非(fei)token mask設(she)置為(wei)-10000
4.3 將embedding_output extended_attention_mask encoder_hidden_states encoder_attention_mask 一并送(song)入encoder中
note:encoder共計(ji)12層(ceng)(ceng), 每(mei)一層(ceng)(ceng)有一個(ge)self-attention ,每(mei)個(ge)偶數(shu)(shu)層(ceng)(ceng)多(duo)加一個(ge)cross attention,如(ru)果沒有cross attention,self-attention層(ceng)(ceng)計(ji)算完成后,輸出(chu)的結果也要經(jing)過升維(wei)全連接(jie)層(ceng)(ceng) gelu激活函(han)數(shu)(shu)層(ceng)(ceng) 降(jiang)維(wei)全連接(jie)層(ceng)(ceng) 和 droput層(ceng)(ceng)、LayerNorm層(ceng)(ceng)
4.3.1 首先(xian)embedding_output extended_attention_mask做self-attention,embedding_output 復制為q, k, v , qkv各自經(jing)過一(yi)層(ceng)全連接(jie)層(ceng)完成一(yi)次特征重提取,緊接(jie)著再(zai)(zai)用heads_num將(jiang)其shape重新view,得(de)(de)到新的(de)(de)qkv size(16,12,32,64),然后q和k 先(xian)進行 matmul得(de)(de)到attetion_scores,attention_scores再(zai)(zai)除以根(gen)號(hidden_size / heads_num), 得(de)(de)到的(de)(de)結果再(zai)(zai)加(jia)上extended_attention_mask,再(zai)(zai)經(jing)過dropout得(de)(de)到最終的(de)(de)attention_scores size(16,12,32,32)
4.3.2 attention_scores和v在相乘得到context_layer size(16,12,32,64),將context_layer中的head_nums 的維度取消(xiao),得到outputs size(16,32,768)
4.3.3 將outputs 經過(guo)一層全(quan)連接層,并dropout之(zhi)后,加上embedding_output 在(zai)經過(guo)LayerNorm 得到outputs size(16,32,768)
4.3.4 將上述(shu)得到(dao)的outputs 再和encoder_hidden_states 做交叉注意(yi)力(li),得到(dao)cross_attention_outputs size(16,32,768),將其經(jing)(jing)過(guo)一(yi)個(ge)升維(wei)全(quan)連接(jie)(jie)層(ceng)和一(yi)個(ge)gelu激活函數(shu)層(ceng),再經(jing)(jing)過(guo)一(yi)個(ge)降維(wei)全(quan)連接(jie)(jie)層(ceng)和droput層(ceng)、LayerNorm層(ceng),得到(dao)layer_output size(16,32,768)
4.4 embedding_output 經(jing)過(guo)Qformer之后得(de)(de)到query_output size(16,32,768),query_output經(jing)過(guo)一個linear(768,256),并將輸(shu)出使用F.normalize做L2范(fan)數(shu)進行歸一化(hua),得(de)(de)到image_feats size(16,32,256)
4.5 上述(shu)講(jiang)(jiang)的是圖像和query_tokens之間的計算(suan),接(jie)下(xia)來(lai)講(jiang)(jiang)訓練的文本也(ye)要經(jing)過Qformer做self-attention,得到text_output size(16,32,768),將text_output第二個維(wei)度(du)的第一維(wei)提取出來(lai),賦值給text_feat size(16,768),在經(jing)過一個降(jiang)維(wei)的全連接(jie)層得到text_feat size(16,256)
4.6
sim_q2t = torch.matmul(
image_feats.unsqueeze(1), text_feat.unsqueeze(-1)
).squeeze()
得到sim_q2t size (16,16,32), 得到每(mei)一(yi)張(zhang)圖像(xiang)與所有(you)文本之(zhi)間(jian)的(de)距離向量。每(mei)個距離向量找(zhao)一(yi)個最大值(zhi),得到每(mei)張(zhang)圖像(xiang)與所有(you)文本之(zhi)間(jian)的(de)距離表示 {sim_i2t, _ = sim_q2t.max(-1)} sim_i2t size (16,16)
sim_t2q = torch.matmul(
text_feat.unsqueeze(1).unsqueeze(1), image_feats_all.permute(0, 2, 1)
).squeeze()
得(de)到sim_t2q size(16,16,32),得(de)到每個(ge)文(wen)本與(yu)所有圖像的距(ju)離(li)向(xiang)量(liang)。每個(ge)距(ju)離(li)向(xiang)量(liang)中找(zhao)一(yi)個(ge)最大值,得(de)到每個(ge)文(wen)本與(yu)所有圖像的距(ju)離(li)表示{sim_t2i, _ = sim_t2q.max(-1)} sim_t2i size (16,16)
4.7 計(ji)算itc loss
targets = torch.linspace(rank * bs, rank * bs + bs - 1, bs, dtype=int).to(
image.device
)
loss_itc = (
F.cross_entropy(sim_i2t, targets, label_smoothing=0.1)
+ F.cross_entropy(sim_t2i, targets, label_smoothing=0.1)
) / 2
4.8 計算itm loss
sim_t2i 首先將對(dui)角(jiao)線的(de)值(zhi)賦值(zhi)為(wei)-10000,即(ji)蓋(gai)住與自己(ji)最相似的(de)距離(li),經過softmax得到weights_t2i size(16,16)代(dai)表(biao)每個文本(ben)對(dui)所有(you)圖像的(de)距離(li)概(gai)率
sim_i2t 首先將對角(jiao)線的(de)值賦值為-10000,即(ji)蓋(gai)住與(yu)自己最(zui)相似的(de)距離,經過softmax得到weights_i2t size(16,16)代(dai)表每張圖片對所有的(de)文(wen)本的(de)距離概率
從sim_t2i選出每個文本(ben)最相(xiang)似但不是(shi)匹配的圖像(使用torch.multinomial(weights_t2i[b], 1).item()),選出16個最相(xiang)似的圖片,合(he)并為
image_embeds_neg size(16,257,1408)
從sim_i2t選(xuan)出每張圖(tu)片(pian)最相似但不匹配的(de)文(wen)本(使用 torch.multinomial(weights_i2t[b], 1).item()),選(xuan)出16個最相似的(de)文(wen)本,合(he)并為
text_ids_neg size(16,32)
text_ids_all 是將兩個(ge)text_tokens 和 text_ids_neg 拼接起(qi)來(lai) size(48,32)
query_tokens_itm 是將query_tokens復制(zhi)三(san)次 size(48,32,768)
image_embeds_all 是將image_embeds 和(he) image_embeds_neg 和(he) image_embeds 拼接起(qi)來 size (48,257,1408)
text_ids_all 和(he) image_embeds_all 這(zhe)樣安排是為了只(zhi)有text_tokens和(he)image_embeds相對應(ying)(ying)的位置,文本和(he)圖(tu)片才一一對應(ying)(ying)
將text_ids_all query_tokens_itm image_embeds_all 一(yi)并送入(ru)Q-former中
第(di)一步 先text_ids_all和query_tokens_itm 拼接起來,然后做self-attention得到outputs size(48,64,768)接著(zhu)經過linear dropout LayerNorm size 仍(reng)為(48,64,768)
第二步 將(jiang)上一步的outputs 選(xuan)取query_tokens 的序列長(chang)度(du)(32),得到query_attention_output size(48,32,768),與視覺特征
encoder_hidden_states size(48,257,1408) 做交叉注意力,在(zai)經過linear dropout LayerNorm 得到attention_output size(48,32,768)
attention_output經過ffn得到layer_output size (48,32,768)
第(di)三步(bu) 將第(di)一步(bu)得到(dao)的outputs 選(xuan)取(qu)query_tokens 的序列(lie)長度之后的序列(lie),送(song)入(ru)ffn 得到(dao)layer_output_text size(48,32,768)
第四(si)步 將outputs 和layer_output_text 利用concat拼接(jie)起來得到layer_output size(48,64,768)
這樣(yang)做(zuo)的(de)(de)目錄是(shi)(shi)(shi)突出(chu)query,讓query參(can)與更多的(de)(de)學(xue)(xue)(xue)習,讓query作為(wei)中間(jian)的(de)(de)橋(qiao)梁(liang),與圖像特(te)征(zheng)交(jiao)互(hu),也與文(wen)本(ben)(ben)特(te)征(zheng)交(jiao)互(hu),最(zui)后經過(guo)12層(ceng)這樣(yang)的(de)(de)交(jiao)互(hu)學(xue)(xue)(xue)習,得(de)到(dao)Q-former的(de)(de)輸出(chu)layer_outputs size(48,64,768),接(jie)著再(zai)取前32個序列的(de)(de)特(te)征(zheng)vl_embeddings size (48,32,768),這樣(yang)設(she)計(ji)還是(shi)(shi)(shi)突出(chu)query的(de)(de)學(xue)(xue)(xue)習特(te)征(zheng)。最(zui)終利用(yong)vl_embeddings 去得(de)到(dao)圖像和(he)文(wen)本(ben)(ben)之間(jian)匹配(pei)的(de)(de)概率,vl_embeddings經過(guo)全連接(jie)層(ceng)和(he)取均值得(de)到(dao)logits size(48,2),標(biao)簽就是(shi)(shi)(shi)三組圖像和(he)文(wen)本(ben)(ben)特(te)征(zheng),只有第一組圖像和(he)文(wen)本(ben)(ben)匹配(pei),所以targets size(48),前16個為(wei)1,其余為(wei)零。再(zai)利用(yong)交(jiao)叉熵損失(shi)得(de)到(dao)itm 損失(shi)
4.9 計算(suan)itg loss
第一(yi)步 確定輸入,將text_tokens size(16,32)復制給(gei)decoder_input_ids,將其中每(mei)個句(ju)子的開頭設置為(wei)bert的起始編碼值(zhi)。然后將decoder_input_ids中padding的位置的數值(zhi)設置為(wei)-100,作為(wei)label。
第二步 將decoder_input_ids和視覺和query經(jing)過Q-former得(de)到的(de)query_output 再送(song)入(ru)Q-former,這里面特別強調(diao)的(de)是,需要將query_output中每一(yi)層(ceng)的(de)隱藏層(ceng)狀態和decoder_input_ids拼接起來作為(wei)k和v。再與(yu)decoder_input_ids做self-attention,得(de)到最(zui)終的(de)
encoder_outputs size(16,32,768),在經過ffn得到prediction_scores size(16,32,30523)
第三步 計算prediction_scores 與label的交叉熵損失