機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Prototypical Contrastive Learning of Unsupervised Representationsを読んだのでメモ

はじめに

Prototypical Contrastive Learning of Unsupervised Representationsを読んだのでメモ.

気持ち

近年流行しているContrastive Learning(例えばSimCLR)はpositive pairとnegative pariを元となるデータ点が等しいかどうかで識別的に分類することで表現学習を行う. この論文ではそのようなinstance-wiseなcontrastive learningでは例えどんなに似たデータだったとしても異なるデータとして扱うためデータに内在するsemanticな構造を得られないと考え,instance-wiseではなくprototypical contrastive learningを提案する.

一言で言ってしまえば,contrastive learningとself-labeling(DeepClusterなど)の組み合わせ.

Prototypical Contrastive Learning

データセットX=\{x_1,x_2,\dots,x_n\}で定義する. 学習対象のモデルをf_\theta,v_i=f_\theta(x_i)とする. 従来のinstance-wise contrastive learningでは次の損失を最小化する.

\displaystyle
\mathcal{L}_\text{InfoNCE}=\sum_{i=1}^n-\log\frac{\exp(v_i\cdot v_i'/\tau)}{\sum_{j=0}^r\exp(v_i\cdot v_j'/\tau)}

v_i'i番目のデータに対する埋め込みで,v'_jは一つのpositive pairの埋め込みとr個のnegative pairの埋め込みを含む. \tauは温度パラメータ.

prototypical contrastive learningではこのv'の代わりにprototype cを利用する. さらにハイパーパラメータ\tauをprototype毎の集中度\phiに置き換える.

ここでの目的は下記の対数尤度の最大化として表現される.

\displaystyle
\theta^\ast=\underset{\theta}{\mathrm{arg}\max}\sum_{i=1}^n\log p(x_i;\theta)

ここでは仮定として,観測されたデータ\{x_i\}_{i=1}^nは潜在変数C=\{c_i\}_{i=1}^kに関係があるとし,対数尤度を次のように書き直す.

\displaystyle
\theta^\ast=\underset{\theta}{\mathrm{arg}\max}\sum_{i=1}^n\log p(x_i;\theta)=\underset{\theta}{\mathrm{arg}\max}\sum_{i=1}^n\log\sum_{c_i\in C}p(x_i,c_i;\theta)

これを直接的に最適化するのは困難であるため,次の下界を考える.

\displaystyle
\sum_{i=1}^n\log\sum_{c_i\in C}p(x_i,c_i;\theta)=\sum_{i=1}^n\log\sum_{c_i\in C}Q(c_i)\frac{p(x_i,c_i;\theta)}{Q(c_i)}\geq\sum_{i=1}^n\sum_{c_i\in C}Q(c_i)\log\frac{p(x_i,c_i;\theta)}{Q(c_i)}

Q(c_i)\sum_{c_i\in C}Q(c_i)=1を満たす分布. この不等式はJensenの不等式から得られる. 等式は\logの中身が定数の場合に成り立ち,そこからQ(c_i)=p(c_i;x_i,\theta)が得られる.

定数-\sum_{i=1}^n\sum_{c_i\in C}Q(c_i)\log Q(c_i)を無視することで次の式の最大化として考えられる.

\displaystyle
\sum_{i=1}^n\sum_{c_i\in C}Q(c_i)\log p(x_i,c_i;\theta)

最適化は次のEMアルゴリズムで実現される.

  • E-stepではp(c_i;x_i,\theta)の推定を行う.これはv_i'=f_{\theta'}(x_i)上のk-meansとして実行される.prototype c_ii番目のクラスターのセントロイドとし,p(c_i;x_i,\theta)=\mathbb{1}(x_i\in c_i)として計算する.この時のf_{\theta'}(x_i)はMoCoと同様にmomentum encoderを利用する.
  • M-stepではE-stepで得られたp(c_i;x_i,\theta)=\mathbb{1}(x_i\in c_i)を前述の目的関数の下界に代入して\thetaについて最大化する.

ここではp(x_i,c_i;\theta)に対し事前分布として一様分布を仮定することで次のように書き直す.

\displaystyle
p(x_i,c_i;\theta)=p(x_i;c_i,\theta)p(c_i;\theta)=\frac{1}{k}\cdot p(x_i;c_i,\theta)

さらにp(x_i;c_i,\theta)に対して等方性のガウス分布を仮定する.

\displaystyle
p(x_i;c_i,\theta)=\exp\left(\frac{-(v_i-c_s)^2}{2\sigma_s^2}\right)/\sum_{j=1}^k\exp\left(\frac{-(v_i-c_j)^2}{2\sigma^2_j}\right)

これを目的関数に代入すると,下記の目的関数が得られる.

\displaystyle
\theta^\ast=\underset{\theta}{\mathrm{arg}\min}\sum_{i=1}^n-\log\frac{\exp(v_i\cdot c_s/\phi_s)}{\sum_{j=1}^k\exp(v_i\cdot c_j/\phi_j)}

ただしここではvcのl2ノルムが1に正規化されていることを仮定した. また,practicalなところとして従来のInfoNCEをコストに加える,k-meansによるセントロイドの計算は複数回繰り返すというのが効いたらしく,最終的な目的関数は以下のようになる.

\displaystyle
\mathcal{L}_\text{ProtoNCE}=\sum_{i=1}^n-\left(\log\frac{\exp(v_i\cdot v_i'/\tau)}{\sum_{j=0}^r\exp(v_i\cdot v_j'/\tau)}+\frac{1}{M}\sum_{m=1}^M\log\frac{\exp(v_i\cdot c_s^m/\phi_s^m)}{\sum_{j=0}^r\exp(v_i\cdot c_j^m/\phi_j^m)}\right)

ここまで説明が保留されていた\phiだが,これはprototype c内のデータに対するmomentum encoderの出力\{v'_z\}_{z=1}^Zを使って次のように計算される.

\displaystyle
\phi=\frac{\sum_{z=1}^Z|v_z'-c|_2}{Z\log(Z+\alpha)}

\alphaは小さいクラスタが不当に大きな\phiをもたないようにするためのパラメータ. 意味するところとして,相対的に分散が大きいクラスタは類似度が高くなりにくく,分散が小さいクラスタは低くなりにくいということ.

まとめ

実験結果を見ると,semi-supervisedの評価で異様に精度を向上させている. 論文の気持ちから,目的関数はprototypeを使った項だけで済まして欲しかった. そういった意味で,prototypeを使ったcontrastive lossのみの精度も気になる.