ひとことで言うと
三つ組比較の距離学習は、基準となるアンカー 、同じ対象の正例 、別の対象の負例 を同時に埋め込み、アンカーから見た正例の距離が負例より小さくなるよう学習する方法です。クラスを直接分類するより、検索や照合で使う距離の順序を直接調整できます。
試着室で「この服は自分に似合う服より近く、別人の服より遠い」と三着を並べて判定するイメージです。絶対的な正解座標を教えるのではなく、二つの距離の順位を教えます。
なぜ必要か
ペアだけを扱う損失は、似た組を近づける・異なる組を離すという個別の条件を置きます。三つ組では、同じアンカーに対して正例と負例を並べるため、「正例のほうが負例より近い」という相対的な条件を一度に表せます。FaceNetはこの形が、同一人物の埋め込みを一点に押しつぶすのではなく、他人との距離関係を保ちながら同一人物の分布を許せる点を動機として説明しています。
ただし、三つ組を大量に作ればよいわけではありません。正例がすでに十分近く、負例が十分遠い三つ組は制約を満たして損失が0になり、更新に寄与しません。逆に、学習初期から最も極端な負例だけを選ぶと、FaceNetが報告するように悪い局所解や埋め込みの崩壊につながり得ます。負例の選択が、式の飾りではなく学習の実効性を決めます。
負例は「別クラスなら何でもよい」ではありません。現在の埋め込みで正例との距離に近い候補を、ラベルの整合性と学習段階を見ながら選ぶ必要があります。
仕組み
埋め込み関数を 、距離を 、マージンを とすると、三つ組の制約は次です。 は正例と負例の距離に要求する余白です。
制約に違反した分だけを損失にするなら、三つ組 の損失は次の形です。 は、すでに条件を満たした三つ組を0にするヒンジ演算です。
ここで問われるのは正例・負例それぞれの絶対距離ではなく、二つの距離の差です。FaceNetでは、アンカーから遠すぎず、しかし正例よりは遠い負例をsemi-hard negativeと呼び、マージンの内側にあるそのような負例を選びます。バッチ内マイニングでは、各アンカーとの距離行列を作り、同一対象から正例候補、別対象から負例候補を取り出して、そのバッチ内で有効な負例を選びます。全データから最難例を探すより現実的で、誤ラベルなど極端な例の影響も抑えやすい設計です。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 三つの役割 | anchorは基準、positiveは同じ対象、negativeは別対象 | positiveとnegativeを単に「近い・遠い」と固定する |
| ペア形式との差 | 正例距離と負例距離の相対的な順序を要求する | 三つ組はクラス分類器そのものだとする |
| 負例マイニング | 易しい負例は損失0、最難例は初期の崩壊に注意 | 常に全データの最難例を使う |
| バッチ内選択 | ミニバッチ内で距離を比較して有効な三つ組を作る | バッチ内なら負例選択は不要とする |
実装で確かめる
次のコードは、2次元埋め込みから三つ組損失を計算します。loss=0 の組は制約を満たすため、マイニングでは残りの有効な組を優先します。
import numpy as np
anchor = np.array([[0.0, 0.0], [0.0, 0.0]])
positive = np.array([[0.2, 0.0], [0.2, 0.0]])
negative = np.array([[0.5, 0.0], [0.8, 0.0]])
margin = 0.2
d_pos = np.sum((anchor - positive) ** 2, axis=1)
d_neg = np.sum((anchor - negative) ** 2, axis=1)
loss = np.maximum(d_pos - d_neg + margin, 0.0)
print(loss)
1組目は正例距離が 、負例距離が なので、マージンを含む差は となり損失0です。2組目は負例がさらに遠く、同じく0です。このような組ばかりなら学習信号がないため、実際の訓練では同一バッチ内から正例に近い負例を探します。
取り違えやすいもの
| 用語 | 三つ組比較との切り分け |
|---|---|
| ペア形式の距離学習 | 二つの例の関係を個別に扱う。三つ組は同じアンカーから正例と負例を相対比較する |
| Siamese network | 重み共有を使うネットワーク構成の呼び名。三つ組は入力の比較単位と制約の呼び名 |
| triplet network | 三つの入力枝で距離比較を学習する構成。損失の考え方を指す場合もある |
| hard negative | アンカーに近すぎる負例。最難例を常に使うと初期学習が不安定になり得る |
| semi-hard negative | 正例よりは遠いが、マージン内に残る負例。FaceNetが採用した選択の考え方 |
想起チェック
三つ組を構成する三つの役割は何か
anchorが基準、positiveが同じ対象、negativeが別の対象です。学習するのは、anchorからpositiveへの距離がnegativeへの距離より小さいという順位です。
易しい負例ばかりだと何が起きるか
制約をすでに満たすため、ヒンジ損失が0になり、勾配を生む三つ組が減ります。
FaceNetのsemi-hard negativeはどの位置の負例か
正例よりはアンカーから遠い一方、マージンの内側に残る負例です。最難例を無条件に選ぶのではありません。