1. はじめに
いらっしゃいませ。
- 本記事のゴール:
- Contrastive Learning の概要を数式アリでざっと理解 & イメージを付ける
- Supervised Contrastive Learning との違いを理解
- 背景:
- sequential recommendation の論文を読んでいた時に Contrastive Learning に遭遇
いよいよ本題に入っていきますよ~。
Supervised Contrastive Learning の生みの親である下記の論文をもとに解説。
出典:Supervised Contrastive Learning
作者:Prannay Khosla, Piotr Teterwak, Chen Wang, Aaron Sarna, Yonglong Tian, Phillip Isola, Aaron Maschinot, Ce Liu, Dilip Krishnan
2. Contrastive Learningとは?
根幹にあるアイデア
「似ているものを近づけ、異なるものを遠ざける」
データ間の相対的な関係を利用して表現を学習。
1. 自己教師あり学習
2. 教師あり学習 ← 拡張ver.
これら2種類があるが、まず自己教師ありの方が先に出現。
この記事では、
1 → 自己教師あり Contrastive Learning
2 → 教師あり Contrastive Learning
と呼称。
応用分野例
- 画像認識 (ImageNet 事前学習 → 転移学習)
- 自然言語処理 (Sentence-BERT, CLIP)
- 音声認識や動画理解
- レコメンド
3. Contrastive Learningの準備
まずデータ拡張 (Data Augmentation)
自己教師あり学習は教師なし学習に分類されるので、正解のラベルがない
→ 正解のラベルを、ルールベースでデータ拡張を行うことで作りに行く
- $N$ 個のサンプルとラベルの組 $\lbrace x_k, y_k\rbrace_{k=1...N}$ をランダムに抽出。
↓ - 訓練に用いる対応するバッチを組成。
- $2N$ 個のペア $\lbrace \tilde{x}_\ell, \tilde{y}_\ell\rbrace_{\ell=1...2N}$
※$\tilde{x}_{2k}$ と $\tilde{x}_{2k-1}$ はサンプル $x_k$ に対する2種類のランダムな拡張(ビュー)で、$\tilde{y}_{2k-1} = \tilde{y}_{2k} = y_k$
ポイント:
データ拡張をすることでラベルを生成し、教師あり学習に近づける。
出てくる用語
- アンカー (Anchor): 基準となるサンプル
- ポジティブ (Positive): アンカーと「意味的に同じ」サンプル
- ネガティブ (Negative): アンカーと「異なる」サンプル
例:
- Anchor:チワワ
- Positive:柴犬
- Negative:ネコ、ウサギ
引用: "Supervised Contrastive Learning", Khosla, P., Teterwak, P., Wang, C., Sarna, A., Tian, Y., Isola, P., Maschinot, A., Liu, C., Krishnan, D., (NeurIPS'20)
4. 自己教師ありContrastive Learning
代表的な損失関数の定式化は以下:
$$
L^{\text{self}} = \sum_{i \in I} L^{\text{self}}_i = - \sum_{i \in I} \log \frac{\exp (z_i \cdot z_{j(i)} / \tau)}{\sum_{a \in A(i)} \exp (z_i \cdot z_a / \tau)} \tag{1}
$$
- $z_\ell = Proj(Enc(\tilde{x}_\ell)) \in \mathbb{R}^{D_P}$:埋め込み(Embedding)
- 「$\cdot$」:内積
- $\tau \in \mathbb{R}^+$:パラメータ
- $A(i) \equiv I \setminus {i}$ :アンカー $i$ 以外のインデックス集合
つまり、
- 分子:アンカーとポジティブの類似度が大 ⇒ 損失 小
- 分母:アンカーとネガティブの類似度が小 ⇒ 損失 小
→ 分子を大きく、分母を小さくするように埋め込みを学習する仕組み
ハードポジティブ/ネガティブと暗黙的マイニング
-
ハードポジティブ: 同じクラスだが遠いサンプル
-
ハードネガティブ: 違うクラスだが近いサンプル
-
例:
- 「犬」と「狼」は見た目が似てる → ハードネガティブ
- 「犬」の中でも柴犬とグレートデーンは違って見える → ハードポジティブ
先ほどの 式(1) には、暗黙的なハードマイニングが含まれている。
なぜなら、
- ハードポジティブの場合
- 類似度が小 → 分子が小 → 損失が大
- ハードネガティブの場合
- 類似度が大 → 分母が大 → 損失が大
となるため、明示的なハードマイニングが不要。
従来手作業で行っていたこともある、ハードマイニングが自動で行える というメリットがこの式にある (暗黙的なハードマイニング)
5. 教師ありContrastive Learning
自己教師ありとの違い
- 自己教師あり: 1サンプルにつき「1つのポジティブ」を形成
- 教師あり: 同じクラスのサンプルすべてをポジティブにできる
損失関数の定式化
2種類ありますが、実際使われているのは(2)の方。
$$
L_{\text{sup}}^{\text{out}} = \sum_{i \in I} L_{\text{out,i}}^{\text{sup}} = \sum_{i \in I} \frac{-1}{|P(i)|} \sum_{p \in P(i)} \log \frac{\exp(z_i \cdot z_p / \tau)}{\sum_{a \in A(i)} \exp(z_i \cdot z_a / \tau)} \tag{2}
$$
$$
L_{\text{sup}}^{\text{in}} = \sum_{i \in I} L_{\text{in,i}}^{\text{sup}} = - \sum_{i \in I} \log \lbrace \frac{1}{|P(i)|} \sum_{p \in P(i)} \frac{\exp(z_i \cdot z_p / \tau)}{\sum_{a \in A(i)} \exp(z_i \cdot z_a / \tau)} \rbrace \tag{3}
$$
- 式(2): log の外に和を置く ($L_{\text{sup}}^{\text{out}}$)
- 式(3): log の中に和を置く ($L_{\text{sup}}^{\text{in}}$)
→ 実験では $L_{\text{sup}}^{\text{out}}$ の方が安定し、高性能
なぜ(2)の方が高性能なのか?
原文:
我々は、この差は勾配構造の違いに起因していると推測しています。つまり、$L_{\text{sup}}^{\text{out}}$ では、ポジティブに対する正規化項(すなわち $1/|P(i)|$)が、マルチビュー化バッチにおいて損失に寄与するポジティブ間のバイアスを取り除く役割を果たします。これに対して、$L_{\text{sup}}^{\text{in}}$ も同じ正規化項を含んではいますが、それが log の内部にあるため、全体の損失には単なる加法定数として寄与するにとどまり、勾配には影響しません。その結果、正規化効果が働かないため、$L_{\text{sup}}^{\text{in}}$ の勾配はポジティブの偏りに敏感になり、学習が最適でなくなるのです。
→ 平均を取ることによる正規化効果は、logを取った後に行う方が、「損失に寄与するポジティブ間のバイアスを取り除ける」ので良いのでは?と考えられる。
このあたりの詳しい解析が気になったら是非論文へ。
補足:Triplet Loss との関係
- トリプレットロス: ポジティブ1つ+ネガティブ1つ → SupConの特殊形