MiniGPT-4:使用先進的大型語言模型提升 AI 視覺語言理解能力
一、項目的背景與動機
今年初的OPEN AI的GPT-4展示出了前所未有的多模態(tài)能力。比如GPT-4能夠解釋一個有趣的圖為什么好笑。圖片是一個松鼠拿著一個相機,按照人類的理解松鼠一般是吃堅果的,但我們不會想到松鼠會像一個人一樣用照相機,這正是這張圖片有趣的地方。
另外一個非常出名的有趣的demo是主持人像GPT-4輸入了一張照片,這張照片是一個網(wǎng)站的簡單草圖,GPT-4能夠通過識別這張照片輸出一段構建網(wǎng)站的代碼,并且這個代碼最終是能夠成功運行的,并生成出了這個網(wǎng)頁。
這樣的能力是之前所有的多模態(tài)模型,包括比如DeepMind’s Flamingo或是Saleforce’s Blip-2,都完全無法實現(xiàn)的。但是OpenAI沒有給出任何GPT-4的技術細節(jié),當時在OpenAI官方的technology report里,沒有放出任何關于模型參數(shù)、模型大小、計算資源或是數(shù)據(jù)庫構建等信息,沒有人知道他們是怎么實現(xiàn)的。
因此我們非常好奇,GPT-4這樣非常神奇,非常強大的能力背后的秘密來源是什么?因為我們做deep learning的核心是數(shù)據(jù)。可能一個比較直觀的想法就是也許他們有一個非常復雜非常大的數(shù)據(jù)庫,這個數(shù)據(jù)庫涵蓋了各方面的多模態(tài)數(shù)據(jù),比如GPT-4能夠根據(jù)網(wǎng)站的草圖寫網(wǎng)站代碼,那么是否他們的數(shù)據(jù)庫就含有通過網(wǎng)站草圖構建網(wǎng)站代碼這樣一一對應的數(shù)據(jù)對?;蛘咚麄冇幸恍┟孛艿哪P徒Y(jié)構能夠?qū)崿F(xiàn)這樣的能力,亦或者GPT-4的語言能力遠勝于之前的所有模型。
在回答這個問題之前,先來介紹一下我們之前做的多模態(tài)相關工作ChatCaptioner。當時我們做了一個大型語言模型之間的對話系統(tǒng)。我們用這樣的一個對話系統(tǒng)去生成一張圖片更詳細的描述。當時是市面上第一家做大型語言模型對話的工作。
我們當時發(fā)現(xiàn)一個非常有意思的點,當時最強的多模態(tài)態(tài)模型Blip-2沒有辦法直接生成一張圖片的詳細描述,比如上圖右側(cè)是幾只小貓在籃子里的圖片,如果我們直接問Blip-2請詳細描述這張圖片,它是無法詳細描述的,它只能說圖片中有一個籃子,里面有小貓。但實際上它是能夠看得到這張圖片的詳細信息的,如果我們嘗試以這張圖片的細節(jié)信息去問它,籃子是什么顏色?它會回答籃子是棕色。這個籃子有幾只小貓,它會說有四只小貓。因此這個模型是能夠看到或者獲取到這些信息的。
基于這個問題我們用ChatGPT,使用Prompt提示工程的方法,讓ChatGPT持續(xù)的就一些圖片的細節(jié)進行提問。ChatGPT常見的使用方法是使用它回答問題,但我們反其道而行之,讓它自動提問,這個過程我們稱為automatic questioning自動詢問。如何實現(xiàn)這個過程呢?我們告訴ChatGPT我有張圖你看不到它(因為ChatGPT本身不具備多模態(tài)的能力),但是你可以問我這個圖的問題,我可以回答你,你的任務就是要通過向我提問,讓你能夠最大化地了解這個圖片的詳細信息。這樣,ChatGPT便能基于一張它無法看到的圖片提出一些關于圖片細節(jié)的問題,同時Blip-2回答ChatGPT提出的問題。
最后兩個模型之間進行多輪對話后,再讓ChatGPT總結(jié)對話,生成一段非常詳細的描述,原本Blip-2會說籃子里面有貓,但現(xiàn)在它便能回答圖片里有一個圓形的編織籃,有四只黑白相間的小貓在里面,籃子是棕色的,放在綠色的草地上。
之后基于這個工程,我們將它擴展到了video上,如果大家感興趣可以掃圖片上的二維碼獲取到相關代碼,代碼庫在github上大概有300多星。
在這項工作中,我們發(fā)現(xiàn)Blip-2的視覺能力非常強,它能夠獲取到很多圖片的細節(jié),并描述出,但它的語言能力卻是弱項,它無法遵循用戶的語言指令去執(zhí)行任務。因此我們產(chǎn)生了一個想法,語言能力是它的多模態(tài)能力中的一個瓶頸,如果我們將其視覺能力更進一步提升,那么就能得到一個更為強大的視覺語言模型?;氐阶畛蹶P于GPT-4視覺識別能力來源的猜想,更強大的視覺語言能力是否就能夠具備GPT-4這樣的能力。
二、實現(xiàn)MiniGPT-4的過程
為了驗證這個猜想,我們提出了MinGPT-4。
給出一張簡單的圖片,一個火烈鳥站在水面上的logo。我們首先使用Blip-2模型的視覺能力模塊(由一個Q-Former+ViT組成),且不訓練它。我們再加入當時最強的開源語言模型,伯克利的Vicuna,同樣也不訓練它。我們使用一個可訓練的線性層將Blip-2視覺模塊的輸出映射到Vicuna的輸入空間。同時不僅僅輸入圖片數(shù)據(jù),也需要輸入文本數(shù)據(jù)。最終我們希望這個模型能夠根據(jù)輸入的圖片內(nèi)容和具體文本提問或者介紹生成一個詳細的回應,這樣我們就得到一個非常簡單的系統(tǒng)。
但這個系統(tǒng)如何訓練它呢?最初我們采用經(jīng)典的預訓練方法,使用Image Caption數(shù)據(jù)庫,包括Laion,CC,和SBU。模型的輸入就是一張簡單的圖片,模型的輸出要回歸到數(shù)據(jù)庫中的圖片描述。其中有一個例子:一個女生要彎腰穿過樹林的圖片,其中有比較簡短的圖片描述:Young woman trekking through the forest。在這一階段,我們大概使用4張A80、A100的顯卡跑了10個小時,我們的模型就能夠看懂圖片。
接下來我們給出一個示例,輸入一張圖片,內(nèi)容是一個人和一只狗,模型能夠輸出A man sits with his dog on the ,一個人和他的狗坐在一起。雖然這個模型能夠看懂圖片,但其生成語言的能力還是有所欠缺。因為MiniGPT-4的語言能力來自開源的模型,且我們并未進一步訓練。這個開源模型本身的語言能力是接近于ChatGPT的,但我們將這個視覺數(shù)據(jù)輸入到模型中時,它的講話能力便受到很大的影響,大家可以看到對話中模型并未完整地生成對話。
在進一步的測試中,當前模型最大的問題在于語言生成的不完整,此外它還容易生成重復的語言,并反復重復,最終達到生成字符數(shù)的上限。另外我們發(fā)現(xiàn)現(xiàn)在這個系統(tǒng)非常喜歡講韓語,用英語提問,它的答案內(nèi)容會在英語和韓語中間來回切換,還附帶一些意義不明的字符。
但如果我們的提示工程較為詳細,這個模型還是能夠生成一些較為準確的輸出,但模型不太穩(wěn)定,因此我們需要找到一個方法來修復這個問題。
為什么會有這個問題?實際上我們發(fā)現(xiàn)我們的訓練數(shù)據(jù)和最終測試使用的數(shù)據(jù)存在著非常大的差異,原因在于這個模型的訓練數(shù)據(jù)是較為傳統(tǒng)的數(shù)據(jù)庫,訓練方法也較為傳統(tǒng)。訓練時輸入一張圖,并給出一個描述,但實際測試我們是以多模態(tài)聊天的方式進行測試,不僅僅輸入圖片還會輸入文字,我們希望這個模型能說會道,回答的范圍要盡可能詳細,這樣的模型用戶才能滿意。
因此我們盡可能縮小兩者之間的差異,這樣就進入了第二個階段。我們需要一個文本內(nèi)容較長,且符合人類喜好的數(shù)據(jù)庫,在當時,這樣的數(shù)據(jù)庫并不存在,因此我們需要自行建立,這個過程又分為三步:
第一步,基于我們已經(jīng)訓練好的這個模型,給定一張圖片,輸入一段Prompt:給出盡可能多的細節(jié),輸出你看到的東西。模型可以不太穩(wěn)定地生成一段文字,同時我們對生成內(nèi)容的長度進行檢查,并生成第二段內(nèi)容。將第一段內(nèi)容和第二段結(jié)合生成一段關于圖片細節(jié)的描述,但同樣存在噪音。比如語言的切換、奇怪的符號,這些是無法通過調(diào)整Prompt來優(yōu)化的。因此我們運用ChatGPT做后處理。我們告訴ChatGPT我們有一段有語病的話,ChatGPT要去修復這個段落中的語病,移除任何重復的句子、無意義的符號、非英語的句子,重寫不完整的句子,并要求它按照我們的格式輸出,讓其幫我們修復第一步拿到的數(shù)據(jù)中的語病。但ChatGPT也并不完美,也會生成一些錯誤的內(nèi)容。
第三步,獲取到ChatGPT的輸出,人工標注了500個結(jié)果,雖然還是有問題但這些問題變得有規(guī)律可尋,將錯誤類型分類,并針對類型寫了一些強規(guī)則的代碼,把錯誤自動抓取,并通過規(guī)則改正與修復錯誤。
針對一些長尾的錯誤,像數(shù)據(jù)質(zhì)量太差,無法被修復,我們通過檢測錯誤數(shù)據(jù)的特征,直接剔除。
最終我們得到右下角所示的數(shù)據(jù)庫,輸入一個老人照片,能夠輸出詳細的描述。經(jīng)過一系列處理,我們最終得到了大約3500對圖文對。
數(shù)據(jù)庫建設完成后,我們使用數(shù)據(jù)庫進行訓練,第一個訓練階段時,通過簡單的圖片生成比較短的文本,盡可能減少訓練與測試之間的差異。因此二階段我們將圖片使用模板包裝,盡可能去模擬真實的測試環(huán)境,將模型回歸新建數(shù)據(jù)庫。
第二個階段總共有數(shù)據(jù)3500對,訓練時間大概是7分鐘左右,訓練前模型只能生成半句話,訓練后同樣的問題,便能生成一段較長的描述,之前的問題已經(jīng)被很好的規(guī)避,最終得到了我們上線的Mini GPT-4的模型。
三、MiniGPT-4具備的能力demo
接下來展示一些Mini GPT-4所具備的能力。輸入一張國內(nèi)樂隊音樂會現(xiàn)場的照片。輸入問題便能通過一句話得到描述,它就會說圖上是一對音樂家在玩電吉他,在一大群觀眾面前,觀眾在看他們表演,并且也在用相機拍照,后面有個屏幕用中文展示著這個樂隊的名字,整個氛圍是非常生動有力量的。
另外,Mini GPT-4也可以解釋圖片幽默的地方,一只很累的狗躺在地上看起來很累,也能看到上面寫的字,并理解笑點。
此外,這個模型也具備了類似于GPT-4的閱讀網(wǎng)站建設草圖,生成網(wǎng)站代碼的能力。
輸入一張新奇臺燈的圖片,讓它寫一個廣告,它可以輸出一段非常有吸引力的文案。
輸入一張奇怪的圖片,一個仙人掌在一個冰湖上,問這個圖在現(xiàn)實世界中常見嗎?它會說這個圖在現(xiàn)實中非常少見,幾乎不可能看到仙人掌在冰面上,這個圖有可能是電腦創(chuàng)作,或者有可能是偽造的照片。
輸入一張《教父》電影的劇照,它能看得懂這是《教父》的照片,輸出一段劇情介紹。
輸入一張照片,照片上是一個植物,這個植物有點問題,我們問植物怎么了?我應該怎么辦呢?它首先能看得到植物上有棕色的斑點,并且知道這是由真菌感染造成的,然后它會告訴你可以用殺真菌的藥劑去治療你的植物,以及具體的步驟。
四、存在的不足
接下來進入Limitations的討論環(huán)節(jié),因為Mini GPT-4是基于開源模型而來,因此也存在一些問題。一個典型的例子是當我們給一張餐廳內(nèi)部裝潢的照片并讓它詳細描述這張照片,大概可能有70%—80%的概率情況下,這個模型會說桌子上有白色的桌布,而實際上照片里并沒有桌布。
這個模型它能看得到這個圖里有什么東西,但是它看不清這個東西區(qū)域在哪里,看不到位置信息。比如問這個攝影師是在圖片左邊還是在右邊,就給出了錯誤的答案。
在之前的解釋圖片為什么好笑和構建網(wǎng)站的demo中講到,Mini GPT-4是能夠看得見圖片里的文本的,但是有個前提就是這個文本要夠大。如果這個文本不夠大,模型不但無法識別,還會幻想編造出一些完全不符的東西。
五、問答環(huán)節(jié)
Q1:第二階段的數(shù)據(jù)訓練中圖文對數(shù)據(jù)量是3500,其中的Prompt的類型有多少,如果有很多種類型的話,都是人工設計的嗎?
A1:我們就是寫了一個Prompt,讓ChatGPT生成Prompt的同義詞和近似的句子,具體的數(shù)量最終使用了4個。
Q2:如果有多個圖片輸入怎么辦?
A2:我們在訓練的時候其實是沒有在多個圖片輸入。但是我們的模型是能夠輸入多個圖片,每一張圖片都會轉(zhuǎn)成32個token并查詢具體的內(nèi)容,但這樣多圖片的能力并不強,因此我沒有對此進行訓練。但我們的模型具備這樣的能力。
Q3:如果只用第二階段數(shù)據(jù)訓練效果是怎么樣的呢?
A3:這個問題其實關于第一階段訓練和第二階段訓練,他們具體都是做什么。ChatGPT第一段是GPT3去在一個非常龐大一個數(shù)據(jù)庫上補一圈,第二階段是在GPT3上的基礎上做instruction翻譯,加上一些訓練,我們的模型也是如此。一般模型訓練也是如此,第一個階段的訓練目的是為了讓模型獲得新知識看懂一張圖,第一階段需要大量數(shù)據(jù),它需要訓練16個小時,四張卡。
然后第二階段的目的是第一個第一階段不一樣,第二階段并聚焦在如何讓這個模型學習到新知識。第二個階段的目的其實是改變模型的行為方式,因此我們使用少量數(shù)據(jù)去調(diào)整模型生成結(jié)果的行為,重新提升模型原有能力。如果只進行第二階段的訓練,這個模型是無法直接使用的,第二階段的前提是模型能夠識別圖片能力的基礎之上的。
Q4:第二個階段的數(shù)據(jù)需求量比較小,是不是跟lima的結(jié)論類似?
A4:這個模型訓練也是如此。
Q5:對于具體的文本,比如數(shù)字公式有比較好的方法。
A6:首先一個專門的數(shù)據(jù)庫,比如說有現(xiàn)在會有一些專門的OCR數(shù)據(jù)庫,然后有一些專門的數(shù)學這樣數(shù)據(jù)庫。我覺得如果在專門的數(shù)據(jù)庫上翻譯,肯定會有一定的提升。我們現(xiàn)在的模型的分辨率不夠大比如說你給一個草稿紙上面都是數(shù)學公式的話,如果給一個224的像素格式,肯定是不足以能夠看清這個上面的數(shù)學公式。兩方面,一方面是圖像格式要高清。第二個方面,可能專門的一些數(shù)據(jù)庫翻譯效果更好。
Q6:圖像的編碼對于Prompt非常關鍵,對于圖像的編碼通過是完整編碼還是細節(jié),現(xiàn)在是否有更好的方式?
A7:這個模型就是一個標準的Vit加上Q-Former,輸出總是32個token,這個方法挺好,但是我個人會覺得它更像是什么?有個邏輯總結(jié)圖片信息,再輸入到后面的模型中,如果把上Q-Former丟掉會更好,但我個人更喜歡另一種做法。