2021年2月28日 星期日

Contrastive Predicting Coding (CPC): 一種 unsupervised representation learning 的方法

本文要介紹的是 Contrastive Predicting Coding (CPC) [1],目的是利用 unsupervised learning 的方法從高維度的資料中(例如圖片)學習出一組特徵表示法。在現實生活中我們擁有的資料很多,但是標註好的資料極少,因此 unsupervised representation learning 的價值便是學到資料本身帶有的資訊(也就是學到的特徵表示),便可以將其用在真正的應用之中。

本文描述問題的方式是如何利用現有的資訊 context \(c\) 來預測未來的高維度資料 \(x\)。傳統預測利用 MSE 或 cross-entropy 等 unimodal(單峰分布)的 loss function 並不管用,而生成模型通常很耗計算資源,往往也沒有妥善利用 context 的資訊,因此本文作者提出的論點是 \(p(x|c)\) 無法最佳地找出 \(c\) 與 \(x\) 之間的共通資訊;作者用的是 mutual information 來描述 \(c\) 與 \(x\) 中的共通資訊: \[ I(x;c) = \sum_{x,c}p(x,c)\ log\frac{p(x|c)}{p(x)} \] 

Contrastive Predictive Coding 介紹

Contrastive Predictive Coding

上圖為原文中的架構圖。首先針對輸入 \(x_t\),用一個非線性編碼器(可以為一個類神經網路)\(g_{enc}\) 產生一個特徵向量 \(z_t\),再利用一個 auto-regressive 模型 \(g_{ar}\) 來產生到目前為止的 context \(c_t\)。得到 \(t\) 時間的 context 以後,就可以用其來預測未來的資料。(註:前面提過本文不想直接預測未來 \(k\) 個時間的 \(x_{t+k}\),而是想要讓 \(x\) 與 \(c\) 的 mutual information 越大越好。)因此這邊此優化問題變成是要找到最好的 \(c_t\) 使得 \(f_k(x_{t+k}, c_t)\) 最大: \[ f_k(x_{t+k}, c_t) \propto \frac{p(x_{t+k}|c_t)}{p(x_{t+k})} \] 作者用的是 log-bilinear model: \[ f_k(x_{t+k}, c_t) = exp(z_{t+k}^T W_k c_t) \] 其中 k 為未來的時間點,\(W_k\) 可為固定的矩陣或是類神經網路。此式子的直觀意義為在給定到目前為止的 context \(c_t\) 的情況下,我如果拿正確的 \(z_{t+k}\) 會讓 \( f_k(x_{t+k}, c_t)\) 的值比較大,也就是 \(x_{t+k}\) 與 \(c_t\) 的 mutual information 比較大,而如果隨便拿一個 \(x\) 或對應的特徵向量 \(z\) 會使得這個值很小。因此我們需要一個 loss function 來學習這個關係,也就是本文用到的 InfoNCE loss。

InfoNCE loss

在訓練的時候一次拿 N 個樣本 \(X = \{x_1, x_2, \cdots , x_N\}\),其中只有一個正樣本由 \(p(x_{t+k}|c_t)\) 採樣,其他 N-1 個為 \(p(x_{t+k})\) 採樣的負樣本。而 InfoNCE loss 函數為: \[ L_N = -\mathbb{E}\ [log \frac{f_k(x_{t+k}, c_t)}{\sum_{x_j} f_k(x_j, c_t)}] \] 這個 loss 函數在經過推導後會與 mutual information 形成以下關係: \[ I(x_{t+k}, c_t) \geq log(N) - L_N \] 因此讓此 loss 函數最小就能讓 mutual information 最大,這也就是此 loss function 設計的巧妙之處。 

如何運用 CPC 產生圖片的特徵,並用特徵來訓練分類器?

實驗用的是 ImageNet 的圖片。本文的作法是將 \(256 \times 256\) 的圖片轉換成 \(7 \times 7\) 的 grid,每個 grid 的長寬都是 64 個像素。Context 用來預測同個 column 不同 row 的 grid。

CPC for images
 

每個 grid 的特徵向量為 1024 維,因此一張 \(256 \times 256\) 圖片的特徵表示向量為 \(7 \times 7 \times 1024\),最後加上 average pooling 變成 1024 維的向量以後,用一個線性層來訓練分類器。在這個實驗中圖片的 label 就只用來訓練這個線性層的分類器,因此在缺乏 label 的時候就不怕需要訓練的參數數目太多了。用此方法在 ImageNet Top-1 ACC 的正確率為 48.7%,雖然離 supervised learning 的結果還差很遠,但跟其他 unsupervised learning 方法比已經進步非常多了。之後還會寫更多關於 unsupervised representation learning 的文章,而到目前為止(2021 年 2 月)的最新發展已經與 supervised learning 方法的結果非常接近了。

參考資料

[1] Representation Learning with Contrastive Predictive Coding

沒有留言:

張貼留言