資料 : {(影像,文字)} : OpenAI 2021 一月

湯沂達(Yi-Dar, Tang)
Taiwan AI Academy
Published in
8 min readDec 9, 2021

--

現在是2021年的12月

為了介紹下一篇medium:用CLIP達成文字操弄/生成影像,這邊鋪一些路,以防一篇文章所講太廣、又冗又長。

這篇 medium 將簡介 OpenAI 在今年一月五日發表了兩個方法的核心精神

在 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訓練架構,(右)numpy版CLIP虛擬碼

在CLIP訓練完後,可以直接用使用兩個編碼模型來做Zero-Shot分類預測

Zero-Shot Prediction

在上圖中

  • 將 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的模型去計算損失函數,以此來控制影像輸出要跟某個文字相近

我看到的一些比較好的方法有下方六個

  1. StyleCLIP (三月)
  2. CLIPDraw (六月)
  3. VQ-GAN+CLIP (七月)
  4. StyleGAN-NADA (八月)
  5. StyleCLIPDraw (十一月)
  6. CLIPstyler (十二月)

展示如下

上方的結果,以額外資料來說僅需要一張影像 & 一段文字即可產出

註 : CLIPDraw 不輸入影像

CLIP就介紹到這邊了,用文字操弄/生成影像的演算法則留至下篇medium

DALL·E

arxiv : Zero-Shot Text-to-Image Generation

上一小節CLIP 的任務是衡量文字與影像是否相近,而 DALL·E 是要直接用文字生成影像

在講 DALL·E 之前,我們先看一個存在許久的任務:

生成下個字 (next word prediction)

在文本生成中,目標是要找到一個函數,其任務是輸入前 t-1 個文字,預測第 t 個文字。

p_{\theta}(x_t | x_1, x_2, \cdots, x_{t-1})

例如:p_θ(x_t | ”<start>今天天氣真好,外面”)

在字典中存在了許多字,每個字都會屬於字典中的某個索引,我們要預測在上方文本後續應該接什麼字的索引,x_t 中預測的索引要符合資料的分布,像是x_t, x_{t+1}, x_{t+2}, x_{t+3}為”出太陽<end>”應該會是蠻符合資料分布的輸出,而”大閘蟹<end>”、”下大雪<end>”等則應該會是不符合資料分布的輸出。

若想要看 next word prediction 的經典方法,推薦閱讀 GPT-2, GPT-3

雖然這任務叫做下個"字"生成,但是除了文本生成外,在其他領域也有相同任務:

  • 影像任務中,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,而是做將其替換為對照表中的某個向量,其步驟如下

  1. 將影像送入 encoder,得到形狀為 H x W x C的張量,有 H x W 個維度為C的向量
  2. 將每個向量去查對照表,與對照表中的哪根向量最相近,則將其替換成該向量
  3. 將替換過的張量丟入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 個影像特徵索引
p_{\theta}({\color{blue}I_i} | {\color{green}T_1, \cdots, T_n}, {\color{blue} I_1, \cdots, I_{i-1}})

這任務其實跟原本的預測任務沒什麼不同

  • 在於增加了要先訓練一個影像資訊壓縮器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 要講的主題。

Next Medium : 用CLIP達成文字操弄/生成影像

--

--

湯沂達(Yi-Dar, Tang)
Taiwan AI Academy

Self supervised writer. Ask question to myself. Transfer the meaningful path as an article.