閑得沒(méi)事,猜猜GPT-4o如何對(duì)圖像編碼 原創(chuàng)
GPT-4o收取170個(gè)Token來(lái)處理在高分辨率模式512x512的圖塊。在 ~0.75 個(gè)tokens/word的比例下,說(shuō)明一張圖片價(jià)值約為227個(gè)Token單詞。 170是一個(gè)奇怪的具體數(shù)字,OpenAI 在其定價(jià)中使用“20 美元”或“0.50 美元”等整數(shù),或使用 2 和 3 的冪作為其內(nèi)部尺寸。為什么在這種情況下選擇像170?OpenAI選擇170,若不是作為某種神秘定價(jià)策略的一部分,而圖像圖塊實(shí)際上真的被表示為170個(gè)連續(xù)嵌入向量??
Transformer模型對(duì)向量進(jìn)行操作,而不是離散Token。輸入必須是向量,否則Transformer的點(diǎn)積相似性就失去意義。Token來(lái)至于預(yù)處理,文本被轉(zhuǎn)換為T(mén)oken,Token令牌在到達(dá)轉(zhuǎn)Transformer的第一層之前,通過(guò)嵌入模型轉(zhuǎn)換為嵌入向量。
Llama 3 在內(nèi)部使用 4,096 個(gè)特征維度。假若有一句話被??BPE轉(zhuǎn)換??為12個(gè)Token,然后通過(guò)嵌入模型將每個(gè)標(biāo)記轉(zhuǎn)換為 4,096 維向量,從而產(chǎn)生一個(gè)12x4096 矩陣,這是Transformer的輸入。
OpenAI在2021年發(fā)布了CLIP嵌入模型。CLIP將文本和圖像嵌入到同一個(gè)語(yǔ)義向量空間中,允許使用余弦相似性來(lái)查找與文本字符串相關(guān)的圖像,或語(yǔ)義上與其他圖像相似的圖像。CLIP 將整個(gè)圖像嵌入為單個(gè)向量,而不是170個(gè)。
OpenAI喜歡2的冪,有時(shí)還混雜著3的單一因子。例如,使用1,536個(gè)用于 ada-002嵌入,或?qū)?,072個(gè)用于text-embedding-3-large。眾所周知,GPT-3自始至終使用12,288個(gè)維度。GPT-4o可能保留或增加了該參數(shù)。鑒于所有這些,GPT-4o 內(nèi)部使用的特征維度數(shù)量很可能是其中之一。
圖像是正方形的,因此可能由正方形的標(biāo)記網(wǎng)格表示。170非常接近13×13。那么是如何從512*512*3到13*13*12228?傳統(tǒng)的辦法是:
- 將 512x512 圖像劃分為 8x8 網(wǎng)格。
- 每個(gè)小塊是 64x64x3 ,將其展平為維度為 12,228 的向量
- 每個(gè)小塊會(huì)對(duì)應(yīng)一個(gè)嵌入向量
- 整個(gè)圖像就會(huì)被表示為 64 個(gè)連續(xù)的嵌入向量
可是64 ≠ 170。
那會(huì)不會(huì)是卷積神經(jīng)網(wǎng),該模型在成功處理圖像數(shù)據(jù)方面有著十多年的記錄,一起看看 2012 年推出的經(jīng)典 CNN AlexNet的架構(gòu):
再來(lái)看看YOLO的架構(gòu):
在這里,符號(hào)“xN”表示整個(gè)塊重復(fù)了 N 次。YOLOv3 的深度是AlexNet的 10倍,但在某些方面仍然非常相似。但關(guān)鍵的區(qū)別在于,它不會(huì)將圖像縮小為單個(gè)平面向量,而是停在 13x13 。之后就沒(méi)有完全連接的層了。
YOLOv3 的輸出實(shí)際上是169個(gè)不同的向量,它們排列在一個(gè)13x13網(wǎng)格中,每個(gè)向量的維度為1,024,每個(gè)向量代表在網(wǎng)格的特定單元格中或附近找到的對(duì)象的類(lèi)。這意味著 YOLO不會(huì)在圖像中只看到一個(gè)對(duì)象,而是可以在一次傳遞中看到多個(gè)對(duì)象。
若GPT-4o也是采用CNN,那么現(xiàn)在要做的就是玩一個(gè)連接點(diǎn)小游戲:如何從512x512x3使用標(biāo)準(zhǔn)CNN層到13x13x12228。
上面是有個(gè)研究人員提出一個(gè)可行或者可能的CNN架構(gòu),將已知的輸入大?。?3個(gè)RGB顏色通道512x512的圖像)連接到假設(shè)的輸出形狀( 13x13 嵌入每個(gè) 12,228 個(gè)維度的向量)。
當(dāng)然還有一種可能就是下圖,最終為12x12。
那就開(kāi)始來(lái)實(shí)驗(yàn)一下,好事者生成了如下的一些樣例圖片,然后以下面的提示讓GPT-4o來(lái)回答,"""Divide this image into a {k}x{k} grid and describe the shape and color of each cell. Report your results as a JSON array of arrays (no objects or row labels) and use all lowercase."""大概得意思就是將圖切分成k*k份,且返回形狀和顏色。
然而,事實(shí)上在5x5網(wǎng)格和更小的網(wǎng)格(例如 2x2 ,3x3, 4x4 )表現(xiàn)很好。隨后開(kāi)始迅速下降。到達(dá) 13x13時(shí),那只是運(yùn)氣。
但 5x5 網(wǎng)格結(jié)果具有啟發(fā)性。GPT-4o 確實(shí)可以跟蹤 25 個(gè)不同的物體及其在圖像中的絕對(duì)位置。也許基本概念是對(duì)的,最終應(yīng)該是5x5。那就再加上幾層唄。但是如何使用5x5和更小的網(wǎng)格,構(gòu)建輸出170個(gè)token。
接近 85 和 170 的一種方法是假設(shè)在一系列越來(lái)越細(xì)的級(jí)別(如金字塔)中對(duì)圖像進(jìn)行編碼。從一個(gè)嵌入向量開(kāi)始捕捉整個(gè)圖像的格式塔印象,添加3x3以捕獲左/中/右和頂部/中間/底部,然后添加 5x5 7x7 依此類(lèi)推。
如果添加一個(gè)最終 9x9 網(wǎng)格,則非常接近 170。如果為 512x512 添加一個(gè)臨時(shí) 2x2 網(wǎng)格,并假設(shè)有一個(gè)特殊 <|image start|> 標(biāo)記,可以得到一個(gè)完美的匹配:1+1^2+2^2+3^2+5^2+7^2+9^2=1+1+4+9+25+49+81=170。
鑒于齊納網(wǎng)格性能在此 5x5 之后開(kāi)始下降,這與證據(jù)并不完全一致。作為替代方案,可以嘗試將所有網(wǎng)格(偶數(shù)和奇數(shù))設(shè)置為 5x5 :
如果我們假設(shè)每個(gè)小圖塊有 3 個(gè)令牌,每個(gè)圖塊之間有一個(gè)分隔符,我們可以得到 170:3×(1^2+2^2+3^2+4^2+5^2)+5=170。
雖然這個(gè)靠猜測(cè),但與實(shí)證結(jié)果相吻合。金字塔策略具有很強(qiáng)的直觀力。它是一種在不同縮放級(jí)別下對(duì)空間信息進(jìn)行編碼的方式。這也許可以解釋為什么它在5x5網(wǎng)格和網(wǎng)格下方的表現(xiàn)如此之好,而在網(wǎng)格6x6以上表現(xiàn)卻如此糟糕。
上述假設(shè)都無(wú)法解釋的一件事是GPT-4o是如何進(jìn)行 OCR。CLIP 本身不能很好地執(zhí)行 OCR,然而,GPT-4o 顯然可以進(jìn)行高質(zhì)量的OCR,它可以轉(zhuǎn)錄長(zhǎng)文本塊、閱讀手寫(xiě)文本或被移動(dòng)、旋轉(zhuǎn)、投影或部分遮擋的文本。
從理論上講,OpenAI 可以構(gòu)建一個(gè)真正如此出色的模型,但這與其在齊納網(wǎng)格任務(wù)上相對(duì)較弱的性能不一致。如果它不能從圖像中讀出整齊 6x6網(wǎng)格中的36個(gè)符號(hào),它肯定無(wú)法完美地讀出幾百個(gè)文本字符。所以會(huì)不會(huì)OpenAI正在運(yùn)行一個(gè)現(xiàn)成的 OCR 工具,并將識(shí)別出的文本與圖像數(shù)據(jù)一起輸入轉(zhuǎn)換器??!
本文轉(zhuǎn)載自??魯班模錘??,作者:龐德公
