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