LLM 除了不純聊天,現在的模型甚至在按下 Enter 前你可以上傳圖片、語音對話,讓模型讀取圖片或聽懂不同語言,並且理解這些原始資料。這種可以處理不只文本的模型,叫做多模態模型,這類的模型是怎麼做到這樣的事?
從我們輸入一個關於圖片的需求後,按下 Enter,這裡有兩種可能:
最有可能的是,我們平常使用的 LLM 可能只是一個 Agent 入口,就如我們前一篇文提到,他會先判斷我們的意圖,並呼叫多模態模型來解決涉及圖片的需求。也有可能我們使用的 LLM 本身就是一個多模態模型,他能夠直接處理圖片需求。
那什麼是多模態模型呢?在多模態的模型中,會先將圖片也轉為數字意義上的編碼,以此編碼來尋找相近的文字意義。例如,如果上傳了一張照片要詢問 LLM 這個圖片的意思是什麼,LLM 實際上在做的事情是,將圖片轉為編碼,接著以編碼找出意義上最接近的文字進行生成。
事實上圖片辨識並不是今天才有的技術,在以前就有 Computer Vision 的技術嘗試為看到的圖片做分類標籤,例如工廠的不良品檢測,都是 Computer Vision 可以處理的範圍。但以前的圖像辨識與現今的多模態模型辨識有什麼不同?以前的圖像辨識更著重在抓取圖片中的特徵,藉此來分類說這可能是什麼事物,但多模態模型更著重在產生無限可能的圖片或從圖片抽取出一個無限可能的情境。
那相比於文字要轉成編碼,圖片轉成編碼的做法是什麼?我們知道,圖片在電腦底層,是有一個個像素所構成,而像素,就是小到不能再小的單一顏色點。就像是我們以前非常貼近的看映像管電視,就會發現其實畫面上充斥著三原色的點點。而在電腦中,圖片也是一樣的,只是現代的解析度允許照片由更多點點組成、且對顏色的顆粒度支援也更廣。
今天如果 LLM 要理解一張圖片,也是從一個個像素開始,將像素想像成文字一般,一顆顆的讀取並考量到單一像素附近的其他像素,構成前後文。但這套做法並不可行,因為在現代高解析度的圖片環境裡,這樣的做法等於一張 4k 高解析的照片,每一次都要處理 3840 x 2160 個像素資料,約 8294400 個像素,類比為文字就是 7 套哈利波特的資料量。
為了解決這個問題,實際上多模態在處理圖片之前,會先將圖片透過一個處理器(Encoder),將圖片進行分割壓縮,讓實際要處理的像素數量沒有這麼多。分割壓縮的處理器並不單單只是讓圖片降低解析度,只是降低解析度無法將同一張圖又變回原本的樣子。能讓分割壓縮後的圖片轉為原本圖片的處理器,又稱做 Decoder,這兩個處理器各自都是一個模型,Encoder 模型會讓 f(圖片) = 壓縮資訊,而 decoder 模型,會讓 f(壓縮資訊)= 圖片,其中兩者希望達成的目標,就是原始圖片在經過 Encoder 又經過 Decoder 後,能跟原始圖片多接近。
要怎麼訓練這一對模型做到這樣的事情呢?因為 Encoder & Decoder 的成對關係,Encoder 只是 Decoder 的反向操作,故我們可以先視為只要訓練一個 Decoder 即可。首先,我們先從一個全然都是雜訊的圖片開始,就好比 f(x) = ax + b 一樣,先隨機猜測一個結果。接著,去評估若減去一部份的雜訊,能離正確圖片有多接近,如同前幾篇文中提到的 Loss Function。而最佳化目標是,找出原始雜訊經過好幾步減去什麼樣的最佳雜訊後,能最接近原始圖片者的模型。而為什麼選擇是減去特定雜訊,而非直接預測原始圖片呢?相比於直接生成一個有意義的圖片去比對,生成一個雜訊減去來接近最佳結果是更容易做到的。
這樣的 Decoder 可以怎麼被訓練,去哪裡找一大堆雜訊的照片,所幸加工圖片的訓練資料是可以人為產生的,只要將一張原始圖片加上雜訊,就可以得到一對訓練資料了。今天將加上雜訊的加工圖片丟進 Decoder,他應該求得該雜訊。因為加工圖片減去雜訊,就是原圖。雖然上述我們都稱這個壓縮資訊為雜訊,但其實其抽象含意上,與文字資料中的向量非常相似,只是視覺化後在圖片上看起來會像是雜訊一樣。
換言之,今天 Decoder 的相反操作 Encoder 能將一張圖片轉為這種雜訊編碼型態,而他在文字向量上是可以去比對媒合看是否有數學意義上的相似度。所以我們才能夠將一張圖片丟進多模態模型是,能夠被給予文字的解釋。
有了一對 Encoder & Decode,那如果今天指按輸入一串文字,按下 Enter,就產生一張圖片是怎麼生成的呢?差別在,Decoder 的訓練過程,同時將雜訊與對應的文字結果一起加入訓練,就可以得到一個原始圖片與文字配對的訓練結果。
影片辨識可以理解成一段有時間序的圖像辨識,而如圖像辨識,如果今天影像辨識目的是為了分類、標籤,到不一定就要有一個多模態 LLM 來進行判斷,我們可以透過 Computer Vision 來標記每偵的圖片,藉此來判斷這一段影像可能的分類。
但如果今天是要辨識或生成一段無限可能的情境影片呢?影片生成簡直是以上的集大成了,看似一樣的邏輯,加上時間的維度讓需要的計算量來到更高的境界。即便將每一偵的圖片壓縮,還是要處理圖片之間隨著時間發展的 Attention 計算。假設 24fps,且每一偵經 Encoder 壓縮後 64×64 個分塊,一分鐘的影片中就會需要,1440 偵 × 64 × 64 = 600w 個分塊要處理。處此之外,如果每一個分塊要計算其上下文,就還會有 64^2 × 1440 + 1440^2 ×64×64 的天文數字要處理。
要怎麼去減少與分段這些天文數字的分塊處理量,就是影片辨識生成的最大挑戰。例如在辨識領域中,混合 Computer Vision 與 LLM 來做判斷,又或者可以怎麼設計可略過的辨識偵數,就會是設計關鍵。
除了圖片外,現在的多模態模型還能處理語音,當今天在介面中按下錄音,錄了一段話按下 Enter 送出後,背後發生了什麼事?多模態模型會多一步將語音檔轉為一小小段的語音切片(Tokenizer),經過多模態模型的辨識,生成另外一段段結果的語音切片後,在透過反向的轉換器(Detokenizer)轉回原本的語音即可。
但有別於文字分塊之容易,我們可以以詞、以字首字尾等等容易定義得多,語音要能分塊,應該要以什麼方式被切?以取樣嗎?但以取樣來處理,就會遇到跟圖片像素一樣的問題,一小段記錄就會有超長的處理單位。還是更簡單一點,直接將語音辨識成一段文字,並用文字來處理即可?但語音涵蓋了除了字面之外,還有語氣、音調等等的情境,所以只是轉文字是不夠的。看到成對的處理器,可以借鑑圖片的經驗,訓練一個 Detokenizer,它能夠將語音轉為數字編碼的結果,再轉回原本的語音。而在語音辨識的訓練中,畢竟語音還是語言的一環,可以進一步結合語言學的知識,提供一組是真的以發音單位為切分的資料作為高品質的資料訓練來源,讓 Tokenizer 能夠學習怎麼將一段聲音訊號切得有語言學上的意義。
而上述作法甚至還可以混合使用,有沒有可能,訓練不同對 Tokenizer & Detokenizer,當有一段語音進來時,將其被分解成不同層級的切塊,有語言意義上的一組組切塊,再細化到只是聲音層級上的更小切塊,以此來節約一開始就要切成很小的切塊來進行預測,加速語音的辨識跟生成效率。
相比於文字,圖片、語音、影像最初面臨的問題都是處理量的大幅提升,接著又進一步到可以透過什麼前後處理,讓不同載體被轉為縮小的數字意義,透過 LLM 再進行生成,以減少所需的處理量,就變成多媒體的辨識與生成關鍵。
但換言之,就如有一天硬體性能達到新的突破,我們可以訓練出大型語言模型,也許有一天硬體與能源資源又來到新的境界,最終又會回到原本沒有效率但最精準的處理方式也不一定。