之前筆者在介紹BLIP2的博文[1]中,曾經(jīng)介紹過采用Q-Former融合視覺語義向量和LLM的方法,BLIP2工作中由于只采用了圖文對(Image-Text Pair)數(shù)據(jù),因此其in-context能力欠缺,few-shot效果不佳。而在Flamingo [2] 這個工作中,作者從互聯(lián)網(wǎng)數(shù)據(jù)中收集了大量的圖文交織(Image-Text Interleaving)數(shù)據(jù),這為Flamingo提供few-shot、in-context能力提供了基礎(chǔ)保障,雖然Flamingo中采用Perceiver Resampler和Gated cross-attention的方法融合多模態(tài)信息目前不是主流(主流還是Q-Former),但其論文中提到的數(shù)據(jù)構(gòu)建方式,模型結(jié)構(gòu)消融實驗等仍然能提供很多有意義的參考。我們接下來開始對Flamingo進(jìn)行介紹。
Flamingo [2] 和 BLIP2 [3] 都是嘗試將已預(yù)訓(xùn)練好的視覺特征編碼器(如ViT、Resnet等)和已預(yù)訓(xùn)練好的大語言模型(LLama、OPT等)進(jìn)行結(jié)合的工作,從而使得大語言模型可以交織文本和視覺進(jìn)行輸入(如圖片、視頻等),最終輸出文本,我們稱之為MLLM(多模態(tài)大語言模型),讀者可在博文 [1] 中得到更多相關(guān)的背景信息,在此不再累述。Flamingo采用了所謂的感知重采樣(Perceiver Resampler)技術(shù)和門控交叉注意力技術(shù)(Gated Cross-Attention)進(jìn)行視覺多模態(tài)信息和LLM的融合,整體結(jié)構(gòu)如Fig 1.所示,其中視覺編碼器和LLM都是固定參數(shù)而不在訓(xùn)練中更新,感知重采樣器將變長的視覺向量轉(zhuǎn)換成定長的多模態(tài)語義向量,通過門控注意力單元將信息融入固定的LLM中,最終實現(xiàn)輸入中可混合多模態(tài)信息而輸出文本信息。
Fig 1. Flamingo的框架圖,主要由視覺編碼器(vision encoder)、感知重采樣器(perceiver resampler)、LLM和交織在LLM中的門控交叉注意力層(gated xattn-dense)組成。
其中感知重采樣器和門控注意力單元的結(jié)構(gòu)如Fig 2所示,其中的視覺編碼器采用NFNet(NormalizerFree ResNet),作者先在圖文對數(shù)據(jù)上采用CLIP的方式對NFNet進(jìn)行預(yù)訓(xùn)練,隨后進(jìn)行參數(shù)固定。如果視覺端輸入是視頻,則按照1 fps進(jìn)行采樣后將NN幀進(jìn)行視覺特征提?。ㄈ羰菆D片輸入,則N=1),注意到此時position embedding按照幀粒度組織,即是統(tǒng)一幀的不同patch共用一個position embedding以建模幀間序列信息。爾后對多幀的特征進(jìn)行展開、拼接,作為transformer的k和v,而采用一個可學(xué)習(xí)的query向量作為transformer的q輸入,這個思路可參考博文 [1],不在此展開,具體偽代碼可見Code 1。感知重采樣機(jī)制的一個好處就是,可以將變長的視頻輸入轉(zhuǎn)變?yōu)槎ㄩL的輸入,此處定長的輸入長度為64。
門控注意力單元的設(shè)計,則是在原先固定的LLM結(jié)構(gòu)的每一層基礎(chǔ)上疊加了門控單元,門控單元由交叉注意力機(jī)制和門控結(jié)構(gòu)、FFW交替組成,其中交叉注意力的k和v都是感知重采樣器的輸出,而q則是文本輸入。為了保證在訓(xùn)練初始階段模型和原先的LLM不至于偏差太遠(yuǎn),作者采用了門控機(jī)制,具體來說就是將新層的輸出乘上一個可學(xué)習(xí)的t,將LLM的原先輸入與其加和,只需要在初始化時候?qū)?span>
即可確保初始化時候和原先LLM無太大偏差。作者對在訓(xùn)練過程中每一LM層的
變化進(jìn)行了可視化,見Fig 3.可發(fā)現(xiàn)兩個規(guī)律,第一隨著層數(shù)加深,門控值則更大,第二隨著訓(xùn)練過程,門控值也逐漸變大,這個倒是符合我們的認(rèn)識,淺層提取基礎(chǔ)特征而深層則更加富有語義信息,因此在深層中的門控更大有利于引入更多的視覺語義信息。
Fig 2. Flamingo中采用的感知重采樣器和門控交叉注意力模型結(jié)構(gòu)。
def perceiver_resampler(
x_f, # The [T, S, d] visual features (T=time, S=space)
time_embeddings, # The [T, 1, d] time pos embeddings.
x, # R learned latents of shape [R, d]
num_layers, # Number of layers
):
"""The Perceiver Resampler model."""
# Add the time position embeddings and flatten.
x_f = x_f + time_embeddings
x_f = flatten(x_f) # [T, S, d] -> [T * S, d]
# Apply the Perceiver Resampler layers.
for i in range(num_layers):
# Attention.
x = x + attention_i(q=x, kv=concat([x_f, x]))
# Feed forward.
x = x + ffw_i(x)
return x
def gated_xattn_dense(
y, # input language features
x, # input visual features
alpha_xattn, # xattn gating parameter – init at 0.
alpha_dense, # ffw gating parameter – init at 0.
):
"""Applies a GATED XATTN-DENSE layer."""
# 1. Gated Cross Attention
y = y + tanh(alpha_xattn) * attention(q=y, kv=x)
# 2. Gated Feed Forward (dense) Layer
y = y + tanh(alpha_dense) * ffw(y)
# Regular self-attention + FFW on language
y = y + frozen_attention(q=y, kv=y)
y = y + frozen_ffw(y)
return y # output visually informed language features
Code 1. 感知重采樣器和門控交叉注意力單元的偽代碼。
Fig 3. 注意力層中和FFW的門控值在不同層的變化趨勢。
說完了模型結(jié)構(gòu)上的改動,我們還需要關(guān)注到本工作中的數(shù)據(jù)構(gòu)建,在本工作中,作者不僅僅構(gòu)建了圖文對數(shù)據(jù)(LTIP),而且還構(gòu)建了視頻對數(shù)據(jù)(VTP)和圖文交織數(shù)據(jù)。圖文交織數(shù)據(jù)(M3W: Interleaved image and text dataset)指的是圖片和文本進(jìn)行多次交織組成的數(shù)據(jù),圖片會穿插在文本上下文中,而不是簡單的圖文一對一的關(guān)系數(shù)據(jù)。作者通過解析大概4.3千萬個網(wǎng)頁的DOM,構(gòu)建了圖文交織數(shù)據(jù),如Fig 4.所示,圖片穿插在了文章上下文中,而上文和下文可能和該圖片都由語義關(guān)聯(lián)。
Fig 4. 來自于網(wǎng)頁上的圖文交織數(shù)據(jù)示例,注意到相關(guān)的圖片會穿插在文本之間,上文和下文都可能和該圖片有語義關(guān)聯(lián)。原網(wǎng)頁來自 [4]。
怎么對圖文交織數(shù)據(jù)進(jìn)行建模也是一個值得關(guān)注的點(diǎn),如Fig 5 (b) 所示,一張內(nèi)嵌到文本中的圖片可能和上文或者下文或者兩者都產(chǎn)生語義關(guān)聯(lián),在Flamingo中作者選擇按照概率采樣后續(xù)文本作為成對文本,亦或者反過來選擇前繼文本。從圖文交織數(shù)據(jù)中可以組成多個成對數(shù)據(jù),如Fig 5 (a)所示,此時通過門控交叉注意力單元中的掩膜設(shè)置,可以同時對該圖文交織數(shù)據(jù)中出現(xiàn)的多個成對數(shù)據(jù)進(jìn)行建模,具體原理見 [5]。當(dāng)然,這里對圖文交織數(shù)據(jù)的應(yīng)用會比較樸素,只考慮以某個圖片為中心的局部單向語義信息,而沒有考慮到全局信息的建模,相當(dāng)于還是簡單將圖文交織數(shù)據(jù)去局部組織圖文對數(shù)據(jù)進(jìn)行訓(xùn)練。
在交叉注意力單元中采用這種方式,雖然一次性只能讓圖片直接關(guān)注到一個相關(guān)聯(lián)的文本,但是通過后續(xù)的LM單元的自注意力模塊,能同時建模任意數(shù)量的圖片輸入和文本輸入,實現(xiàn)圖文交織數(shù)據(jù)作為輸入的對話,當(dāng)然也就能支持BLIP2所欠缺的few-shot功能了。這里的做法,按照筆者的認(rèn)識,相當(dāng)于就是交叉注意力單元只負(fù)責(zé)建模圖文局部的語義對齊,而圖文交織數(shù)據(jù)全局的信息對齊則由緊接著的LM完成。
Fig 5. 在Flamingo中應(yīng)用圖文交織型數(shù)據(jù)的方法,由于嵌入到文本中的圖片可能和上文、下文產(chǎn)生語義關(guān)聯(lián),在本工作中采用按一定概率的方式采樣后續(xù)文本進(jìn)行應(yīng)用。
Flamingo的效果從benchmark測試看是能吊打很多few-shot和zero-shot數(shù)據(jù)集的sota方法的,受限于篇幅筆者不會展開。在文中作者做了很多堅實的消融實驗,去驗證Flamingo的各種設(shè)計的效果,如Fig 6.所示,主要對幾點(diǎn)進(jìn)行了消融:
是否采用全量數(shù)據(jù)? 特別是對M3W圖文交織數(shù)據(jù)的有無進(jìn)行了消融,我們發(fā)現(xiàn)圖文交織數(shù)據(jù)能提供大約17%的提升。是否采用門控機(jī)制?實驗證明采用門控機(jī)制能帶來月8%的提升。采用交叉注意力層的頻率?實驗證明每一層都引入門控交叉注意力層效果是最好的。是否采用感知重采樣單元引入視覺信息?實驗證明該設(shè)計能帶來約4%的提升。視覺編碼器的選擇同樣對結(jié)果影響巨大。是否固定LLM的參數(shù)?實驗證明固定LLM反而能帶來最好的效果,而讓LLM隨著訓(xùn)練一起進(jìn)行(會采用massive text數(shù)據(jù)集一起訓(xùn)練)反而效果會差8%左右,筆者估計是訓(xùn)練過程需要平衡多個目標(biāo)導(dǎo)致的,如何讓LLM也能訓(xùn)練起來可能也是一個值得關(guān)注的點(diǎn)。
Fig 6. 對Flamingo的消融實驗。
Reference
[1]. https://blog.csdn.net/LoseInVain/article/details/136013909, 《BLIP2——采用Q-Former融合視覺語義與LLM能力的方法》
[2]. Alayrac, J. B., Donahue, J., Luc, P., Miech, A., Barr, I., Hasson, Y., … & Simonyan, K. (2022). Flamingo: a visual language model for few-shot learning. Advances in Neural Information Processing Systems, 35, 23716-23736. aka Flamingo
[3]. Li, Junnan, Dongxu Li, Silvio Savarese, and Steven Hoi. “Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models.” arXiv preprint arXiv:2301.12597 (2023). aka BLIP2
[4]. https://baijiahao.baidu.com/s?id=1761390872940868294&wfr=spider&for=pc
[5]. https://blog.csdn.net/LoseInVain/article/details/119530520