無教師の双曲線コントラスト損失を修正する:どこが問題か?

Reddit r/MachineLearning / 2026/5/5

💬 オピニオンDeveloper Stack & InfrastructureIdeas & Deep AnalysisModels & Research

要点

  • 投稿者は、ImageNet-1kで「無教師の双曲線コントラスト損失」を実装しようとしたが、単純なユークリッド系の無教師コントラスト損失の方が大きく良い結果になったと述べています。
  • 共有された実装では、`dist` によりローレンツ多様体上の(双曲線)距離をペアワイズに計算し、`logits = -distance / temp` の形でロジットを作ったうえで、インデックス対応のラベルに対してクロスエントロピーを計算しています。
  • 報告されている1-NN精度は、双曲線埋め込みが57%、コサインのベースラインが64%で、バッチサイズ2048・学習率1e-4という条件です。
  • 投稿者は、双曲線損失の設定に何が誤っているのか、特に `expmap` と `projx` を用いてローレンツ多様体上に埋め込みを保つ手順が妥切かどうかを含めて助けを求めています。
  • 要点として、双曲線のコントラスト学習の目的関数や数値・多様体上の詳細を正しく定式化するのは難しく、実装上の些細な選択がユークリッドやコサインより性能を落とし得る、という点が示されています。

みなさんこんにちは、

ImageNet-1k データセットに対して、教師なし双曲線コントラスト損失(Unsupervised Hyperbolic Contrastive Loss)を実装しようとしています。私の結果では、単純なユークリッドの教師なしコントラスト損失のほうが双曲線版よりもはるかに良いです。問題の理解にご協力ください。埋め込みがローレンツ多様体上にあることを保証するために expmap() と projx() を使用しています。以下が私のコードです -

def hb_contrastive_loss(z, z1, model, temp=0.07):

z_to_neighbor = model.manifold.dist(z.unsqueeze(1), z1.unsqueeze(0))

labels = torch.arange(z.size(0), device=z.device)

logits = -z_to_neighbor / temp

loss = F.cross_entropy(logits, labels)

return loss

現在の結果(1-NN accuracy):

双曲線 = 57%
コサイン = 64%

その他の情報(関連があれば):
バッチサイズ = 2048
LR = 1e-4

により投稿 /u/arjun_r_kaushik
[リンク] [コメント]