CLIP 備忘録

CLIPまとめ

モチベーション

  • GPT 3とかの辺りで Web 上のテキスト大量に使って学習させると、zero-shotでもすごいうまくいくという観測があり、同様のことをビジョンでも実現できないか
    • ただ、画像の一部をマスクして生成するような学習では上手くいかない
    • vision transformerはclassificationしかできない
  • 既存のモデルには制約が多い。分類モデルでは学習時に予測クラスを指定したらそれしか予測できない
    • ※metric learning等を用いれば、学習していないクラスをrejectすることはできるが、新しいクラスの追加には再学習が必要 結果達成したこと
  • zero-shotで画像分類のタスクに対応。テストデータの種類が変わっても(実写画像⇒イラスト画像)、他の分類器と比べると精度が著しく落ちることはない。

手法

  • web上のキャプション付きの画像4億組を使う。(画像の内容をテキストが説明してる)
  • 画像とテキストをそれぞれエンコードして、特徴空間上で同じ特徴量となるようにそれぞれのエンコーダを学習する
    • N個のキャプション付き画像に対し、画像をエンコードした特徴量を行方向、テキストをエンコードした特徴量を列方向に並べ、NxN行列を考える。
    • NxN行列の要素は対応する画像の特徴量とテキストの特徴量の内積
    • 対角成分は対応する画像とテキストの特徴量の内積となる。非対角成分は画像に対して別のキャプションが対応している。そこで、対角成分を1,非対角成分を0となるように行列全体でのロスを計算して、backpropする。
    • これだけ
  • 例えば分類問題の推論時には、ラベルに対応するテキストを自分で用意して、ある画像の特徴量とすべてのラベルのテキストの特徴量との内積をそれぞれ取り、argmaxが出力となる
  • 画像のエンコーダはいろいろ試した結果Vision Transformer(ViT)が一番よかった
  • テキストのエンコーダもtransformerだが、2019年に発表された論文の構造らしい(詳細は調べてない。特殊なわけではなさそう)

その他実験と発見

  • モデルは学習時のデータに大きく引きずられており、ラベルを用意するのだけはひと手間
    • ラベルのテキストとして[man]という単語を与えるよりも、[This is a photo of a man] と与える方がかなり性能は高い
    • web上にないと思われるデータ(航空写真や医用画像)の分類性能は他と比べると低い
  • この方法で学習したViTは、単体のエンコーダとしても優秀。このエンコーダを用いて得た特徴量を分類器にかけると、いい性能が観測された。
    • ※これは、テキストの情報も入れた特徴空間の方が、より表現力や意味を人間に近い形で達成できることを示唆していて、かなり面白いんじゃないかなと思います。classのone-hotじゃなくて、テキストをembeddingした特殊量を正解ベクトルとして学習するだけで、既存の分類器の性能も上げられそう
  • 既存のzero-shotの手法に比べ、性能が良いことに加え、同じ精度を達成するまでに必要な学習データの量も少なくて済む。

参考

blog: https://openai.com/blog/clip/

paper: https://arxiv.org/abs/2103.00020

code: https://github.com/openai/CLIP

Hikifune.fm (Ubieの方々がやってらっしゃるpodcast. きれいにまとまっていて、考察と指摘が大変面白かったです) https://github.com/yoheikikuta/hikifune.fm/blob/master/ep/011.md