お久しぶりです.ソリングです.東京工業大学大学院の情報工学系で機械学習の勉強をしています.私の研究テーマは「自己教師あり学習(Self-supervised Learning)」についてです.自己教師あり学習の代表的な手法である「対照学習(Contrastive Learning)」について勉強したので記事にまとめます.
自己教師あり学習とはなにか
自己教師あり学習とは,簡単にいえばデータセットから教師を作り,それを予測することにより学習を行う方法です.
英語で頭文字をとってSSLと略されることもありますが,これは「Semi-supervised learning(半教師あり学習)」と混同される可能性があるので,SSLという表現が出てきた場合,どちらを指しているのかは文脈から判断しましょう.本記事ではSSLという表現が出た場合,断りがなければ自己教師あり学習を指します.
類似の概念
自己教師あり学習を理解するためには,類似の概念である「教師あり学習(Supervised learning)」,「教師なし学習(Unsupervised learning)」,「半教師あり学習(Semi-supervised learning)」について理解すると良いでしょう.
教師あり学習
データ$x$とそれに対応する教師$y$が与えられており,$x$をもとに$y$を予測する学習方法.例えば,「分類」などがある.
教師なし学習
データ$x$のみが与えられており,データ$x$が持つ構造や分布を学習する手法.例えば,「クラスタリング」などがある.
半教師あり学習
データ$x$について,それに対応する教師$y$が一部のデータだけに与えられている学習方法.一部はデータ$x$のみが与えられており,教師が与えられていない.
自己教師あり学習
データ$x$について,$x$から何らかの方法で教師$y$を作成し,それをもとに訓練する方法.例えば,Mask Predictionなど.
注意点
特に,教師なし学習と自己教師あり学習は混同されやすいので注意が必要です.教師なし学習では,教師という概念を使用しません.自己教師あり学習では,教師は与えられていませんが,自分でデータから教師を作成します.
自己教師あり学習のメリット
自己教師あり学習はラベルのアノテーションが減らせるという利点が存在します.従来の教師あり学習においては,画像に大量にアノテーションをつける必要があるという問題点が存在しています.CIFAR10はまだ60000枚ですが,ImageNetは100万枚など,アノテーションコストが枚数に比例して多くなるという問題点があります.
JFT-300M(Google社内製のデータセット)はインターネットからスクレイピングした3億枚の画像とラベルがあるデータセットですが,これもノイズが多いという問題点があります.
それに対して,自己教師あり学習は,「事前に人間のつけたラベルがなくても訓練できる」という明確な利点が挙げられます.自己教師あり学習で得た潜在表現をファインチューニングすることにより,少ないラベル付きデータでも効率的に学習できるようになります.
対照学習(理論)
自己教師あり学習には「マスク予測」「Data2vec」などの様々な方法が提案されていますが,今回は対照学習に絞って解説します.
コンセプト
対照学習のコンセプトは,「同じものは潜在空間上で近くに,違うものは潜在空間上で遠くに」です.
サンプル$x$に何かしらの変形$f_1$を加えて得られるサンプル$X=f_1(x)$と,サンプル$y$に何かしらの変形$f_2$を加えて得られるサンプル$Y=f_2(y)$について考えます.また,ニューラルネットワーク$g$について,$X, Y$から得られる潜在表現をそれぞれ$X'=g(X), Y'=g(Y)$とします.
このとき,$x=y$ならば$g(X)$と$g(Y)$の「離れ具合」が小さくなるように,逆に$x\neq y$ならば$g(X)$と$g(Y)$の「離れ具合」が大きくなるように$g$を学習しよう,というのが対照学習の基本的な考え方です.この離れ具合にも様々な定式化が考えられますが,一般的に使用されるのは内積を用いたContrastive Lossです.
Contrastive Loss(導入)
ここでは,2つのベクトルの「離れ具合」を「内積」を用いて定量化します.$d$次元の潜在空間上にある2つのベクトル$x, y \in \mathbb{R}^d$の内積は,2つのベクトルの「なす角(高次元だと想像するのが難しいですが……)」が小さいほど,「長さ」が大きいほど値が大きくなるという性質があります.直感的には,内積が大きいほど2つのベクトルが「近い」ことになります.
さて,$x=y$のときの$X'^{\top}_1 Y'$を大きく,$x\neq y$の$X'^{\top}_1 Y'$を小さくすれば「同じものは潜在空間上で近くに,違うものは潜在空間上で遠くに」という理念に一致した状態になると言えます.
一般に,$n$個のベクトル$X'_1, X'_2,\cdots,X'_n \in \mathbb{R}^d$について,$Y'_1$と$X_i$の内積は$Y'^{\top}_1 X_i$で表されます.$Y'^{\top} X_1$は大きく,$Y'^{\top} X_i (i=2,\cdots,n)$は小さくなるように目的関数を設計します.数学的な扱いやすさから,以下の式が一般的に使用されています.ただし,$X=[X'_1 \quad X'_2 \quad \cdots \quad X'_n]$とおきます.ここで,$\tau$は温度と呼ばれるハイパーパラメータです.
$$ L(Y_1', X) = -\log \dfrac{\exp(Y_1'^{\top} X_1/\tau)}{\sum^{n}_{i=1} \exp(Y_1'^{\top} X_i/\tau) } $$
この$\log$の引数に注目すると,「同じものは潜在空間上で近くに,違うものは潜在空間上で遠くに」という理念が満たされていることがわかります.一般的に損失関数は小さくするものですから,数式上ではマイナス1倍しています.