資料 : {(影像,文字)} : OpenAI 2021 一月
現在是2021年的12月
為了介紹下一篇medium:用CLIP達成文字操弄/生成影像,這邊鋪一些路,以防一篇文章所講太廣、又冗又長。
這篇 medium 將簡介 OpenAI 在今年一月五日發表了兩個方法的核心精神
- CLIP: Connecting Text and Images (cited by 405 at 2021 Dec 7)
- DALL·E : Creating Images from Text (cited by 202 at 2021 Dec 7)
在 CLIP、DALL·E 兩篇文章皆是在使兩個領域的資料:n個(句子, 影像)配對,其中分別的任務如下
- CLIP : 評量(句子, 影像)的相似程度
- DALL·E : 用句子生成影像
而這兩個方法的演算法都很簡單,接下來這邊用很簡單的方式來講這兩個演算法中最核心的概念
註:這篇文章只講我想講的部分,跳過很多細節
CLIP
arxiv : Learning Transferable Visual Models From Natural Language Supervision
在進入CLIP演算法前,我們先來看一下傳統的簡單分類問題。
在傳統分類問題中,我們期望影像經過影像特徵萃取模型後的輸出,在對應標籤上是最大的那個。
而在CLIP 中,一筆資料有兩個領域的資訊
要媒合這兩個領域的資訊,OpenAI做的事情很簡單
第 i 筆資料的
* 文字通過文字特徵萃取模型(E_T)得到文字編碼 (T_i)
* 影像通過影像特徵萃取模型(E_I)得到影像編碼 (I_i)
在同一訓練batch中,期望
* cos(I_i, T_i) > cos(I_i,T_j) ∀ i != j
上面那行用白話來說,是希望自己的文字、自己影像編碼的餘弦相似度,要贏過自己的編碼與其他人的另一個領域編碼的餘弦相似度
我的敘述方式跟原本的損失函數有點出入,細節可以看下方虛擬碼
在CLIP訓練完後,可以直接用使用兩個編碼模型來做Zero-Shot分類預測
在上圖中
- 將 ImageNet 的1000類別的文字填入 {object} 處,經過了文字特徵萃取模型後得到了1000個句子向量{T_i | 1≤i ≤ 1000}
- 計算影像向量 I_1
- argmax_i (I_1 · T_i) 最高者則為預測結果
如下圖所示,該方法在ImageNet的1000類分類任務中可以達成 76.2% 的Top-1 準確度,論文中也有提到能達到95%的 Top-5 準確度。
在CLIP的模型在2021年初釋出後,到同年年底就已經有許多用文字操弄影像的任務,他們使用了CLIP的模型去計算損失函數,以此來控制影像輸出要跟某個文字相近
我看到的一些比較好的方法有下方六個
- StyleCLIP (三月)
- CLIPDraw (六月)
- VQ-GAN+CLIP (七月)
- StyleGAN-NADA (八月)
- StyleCLIPDraw (十一月)
- CLIPstyler (十二月)
展示如下
上方的結果,以額外資料來說僅需要一張影像 & 一段文字即可產出
註 : CLIPDraw 不輸入影像
CLIP就介紹到這邊了,用文字操弄/生成影像的演算法則留至下篇medium
DALL·E
上一小節CLIP 的任務是衡量文字與影像是否相近,而 DALL·E 是要直接用文字生成影像
在講 DALL·E 之前,我們先看一個存在許久的任務:
生成下個字 (next word prediction)
在文本生成中,目標是要找到一個函數,其任務是輸入前 t-1 個文字,預測第 t 個文字。
例如:p_θ(x_t | ”<start>今天天氣真好,外面”)
在字典中存在了許多字,每個字都會屬於字典中的某個索引,我們要預測在上方文本後續應該接什麼字的索引,x_t 中預測的索引要符合資料的分布,像是x_t, x_{t+1}, x_{t+2}, x_{t+3}為”出太陽<end>”應該會是蠻符合資料分布的輸出,而”大閘蟹<end>”、”下大雪<end>”等則應該會是不符合資料分布的輸出。
雖然這任務叫做下個"字"生成,但是除了文本生成外,在其他領域也有相同任務:
- 影像任務中,PixelRNN 用以前的像素值預測下個像素值為何
- 聲音任務中,WaveNet 用以前的聲音強度值預測下個時間點的聲音強度值為何
- 強化學習的 Model Based 導向中,World Models 用現在的狀態,預測如果做了某個動作後下個時間點的狀態會為何
回到DALL-E
接下來的介紹參考自此youtube影片 :
DALL-E: Zero-Shot Text-to-Image Generation | Paper Explained
在 DALL·E 前的前置任務是 VQ-VAE
VQ-VAE能夠先學習以CNN為基底的影像自編碼器(AE : auto-encoder),與一般的AE不同之處,其會額外訓練一個向量對照表{e_1, …, e_K}
VQ-VAE將影像經過 encoder 後,不是直接送 decoder,而是做將其替換為對照表中的某個向量,其步驟如下
- 將影像送入 encoder,得到形狀為 H x W x C的張量,有 H x W 個維度為C的向量
- 將每個向量去查對照表,與對照表中的哪根向量最相近,則將其替換成該向量
- 將替換過的張量丟入decoder
訓練完VQ-VAE後,能讓原本 256 x 256 x 3 的影像,離散化成用 m = 32 x 32 個索引(index)去表示。訓練完後的VQ-VAE模型就固定住不動。
原本其一筆資料為 (句子, 影像),經前處理後得到(n 個文字的索引, m個影像特徵索引)
與前面介紹的文本生成比較起來
- 原本的生成任務要
> 輸入前 i-1 個索引
> 預測第 i 個索引 - 而DALL·E 要
> 輸入所有的文字索引 & 前i-1個影像特徵索引
> 預測第 i 個影像特徵索引
這任務其實跟原本的預測任務沒什麼不同
- 在於增加了要先訓練一個影像資訊壓縮器VQ-VAE
- 且輸入額外增加另一個領域的資訊
- next word prediction 模型骨架採用自家的 gpt-3
僅此而已
小結
OpenAI 在今年一月提的兩個方法的簡介在這邊結束,兩個方法的核心精神其實都非常簡單;困難的部分在於資料集大小、模型的大小、混和精度運算、分散式訓練、實作上的細節等等
- 在 CLIP 中,有400百萬個(文字, 影像)配對,最大的模型參數量為63百萬,batch大小 32768
- 在DALL·E中,有3.3百萬個(文字, 影像)配對,最大的模型參數量為1200百萬,batch大小 512
對一般人來說,我們沒有這麼好的機器去訓練模型,蠻幸運的是CLIP有釋出模型,而DALL·E則尚未。
註:跟 DALL·E 大約同時期發表;核心精神相似,且有釋出模型的研究為2020 12月的 VQ-GAN,有興趣者請詳閱
註:實作上的細節,我這篇文章完全沒提到,請自行觀看原論文、其他解說
而CLIP釋出的模型在後來被拿去用在文字操弄影像的任務上有很好的成果,這就是我下一篇 medium 要講的主題。