yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2103.00020] Learning Transferable Visual Models From Natural Language Supervision [paper-reading] #57

Open yoheikikuta opened 3 years ago

yoheikikuta commented 3 years ago

論文リンク

https://arxiv.org/abs/2103.00020

公開日(yyyy/mm/dd)

2021/01/05

概要

OpenAI が発表した DALL·E の中で reranking にも使われていた CLIP (Contrastive Language-Image Pre-training) の論文。 Web 上のテキストから特別な annotation を使わずに pre-training して成功を収めた NLP を vision でも実現した。 vision Transformer で試されたような画像再構築は pre-training として良い方法ではないことが分かっているので classification 的な枠組みにしたいが、CLIP では (image, caption text) のペアを準備し、それぞれを encode した特徴量を contrastive に用いることでそれを解決する。 具体的には、pre-training は batch size N 分だけの (image, caption text) の特徴量を使い、それぞれの特徴量次元をつぶすように掛けることで N x N の similarity を作り、そのうち対角成分が正しい組み合わせなので対角成分が 1 で非対角成分が 0 になるように学習をする。予測時には画像 1 枚の特徴量に対して、問題合わせて M 個のテキスト特徴量を作って similarity が最大のものを選ぶ、ということをする(これはモデルの再学習などは必要ないが、問題に合わせてテキストをどう作るかを決める必要がある)。 これは zero-shot 予測(この論文では unseen data に対するクラス予測)が可能で、ImageNet 1000 クラスでも top-1 accuracy が 76.2% という性能を発揮。言葉で画像を説明する action recognition などのタスクは特に強く、一方で衛生画像分類のように専門的で複雑だったり、人工的に生成した画像のオブジェクトを数えるような抽象的なタスクだったりは苦手としている。 pre-training した画像 encoder の特徴量も優秀で、従来モデルの特徴量と比べても、logistic regression で downstream タスクを解いたときに明確に良い性能を発揮している。 (image, caption text) は 400M ほど準備している。各種 downstream タスクとの overlap していて leak の可能性がないかなども調べていて、十分に小さそうという結論も出している。その他色々実験もしている。

公式実装:https://github.com/openai/CLIP

yoheikikuta commented 3 years ago

DALL·E と同時に公開されたもので、こちらは論文と実装もいくらかは公開されてるので、DALL·E を理解するためにもこれも読んでおこうとなった。

個人的に zero-shot(もう少し限定的には unseen dataset に対する classification だけど)をやってたときにやっぱ普通の分類の枠組みじゃ難しいな〜と感じてたので、それに対する解決方法の一つという意味でも論文の内容に興味を持っていた。

yoheikikuta commented 3 years ago

論文のモチベーションは NLP で成功した Web テキストを使った pre-training を vision でも実現したいというもの。

vision Transformer でも同じようなモチベーションがありそうで画像の再構築などを試していたけどあまり良い性能が出ずに supervised pre-training になっていた。画像情報だけでなんとかするのは難しい(何を予測するようにすればいいのかの設計が難しい)ので、いっそのこと caption text を使おうという戦略。 一方で、caption text を使うというのは別に新しくもない話。画像からの caption 生成とかね。このようなテキストの生成は自由度は高いけど、自由度が高いゆえにそれを学習するのが「良い」方法なのかというのは疑問が残る。例えば「これは犬の写真です」という caption と「犬が写っている」という caption は同じような意味だけど、それを学習時にうまく準備したり評価したりするのは簡単ではない。 ということで良い感じに classification 的に解ける pre-training の方法を考案(してそれを大規模に学習)するというのはまだ十分には成功してない取り組みである。

機械学習は自分が始めたときが画像分類の方が盛んで色々なアイデアも先行しててそれが NLP にも流入してた印象だけど、最近は NLP での成果が画像の方に持ち込まれることも多い印象。万物は流転しますね(違そう)。

yoheikikuta commented 3 years ago

近い考えを持った手法として Learning Visual N-Grams from Web Data https://arxiv.org/abs/1612.09161 という論文で提案された visual N-gram というものがある。 これは Wikipedia とかでよく出てくる N-gram (N = 1 ~ 5) を準備して、それを embedding した特徴量と与えられた画像の特徴量を使って学習することで、画像 -> text N-gram を予測できるようにするものになっている(ちゃんと読んでないのでだいぶ雑な説明)。 これは予測可能な text N-gram は最初から given ではあるが、その数はとても多いので、いい感じに学習できたとすればあまり遭遇したことのない画像が来ても近しい text N-gram を返せるという思想である。

visual N-gram は 100M とかのデータで学習していてこの論文においても一つのベンチマークとなっているが、テキストの特徴量をちょっとした embedding matix を使うだけだったりしてあまり rich ではない。一方で最近の論文では Transformer などを使っているものがあるけどデータ量が 1,2 桁小さかったりする。

O(100M) のデータと NLP の有力なモデルを使ってちゃんとやりましょうというのがこの論文となる。 これだけ書くと大したことやってなさそうだけど、論文ではかなり色々なことをやってるし示唆に富んだ内容もあるので、読んでいて結構面白かった(アイデアが革新的かというとそこまでではない気もするけど)。

yoheikikuta commented 3 years ago

モデルの説明に関しては論文の図を見るとある程度把握できる。

画像とテキストの encoder はそれぞれ別個に準備。論文ではいくつかのモデルを試したりしてるけど、例えば画像が vision Transformer でテキストが Transformer encoder とか。 それぞれで (画像, その画像に対応する caption) の特徴量を抽出し、同じ次元 d になるように変換行列をかまして両方とも d 次元の特徴量にする。さらに norm が 1 になるように normalize もしておく。 これを batch size N それぞれで実施すると、それぞれ (D, d) というサイズの行列が出来上がるので、特徴量次元方向が潰れるように行列積を取って (N, N) の cosine similarity 行列を作成する。 正しいペアは対角成分で、それ以外の非対角成分は正しくないペアと考えることができる。それゆえに対角成分を 1 で非対角成分を 0 にするように学習をする。具体的には、画像軸方向の D 次元ベクトルの集まりと見たときに、cross entropy loss を計算し、同様にテキスト軸方向でも計算して足し合わせたものを total loss として学習する。

この組み合わせの classification で学習するっていうのは適度な難易度だし負例も入ってきて学習としてなかなか良い感じのセットアップじゃないかと思った。 モデルの細かいところとかテキストの encoder のところとかの詳細(辞書とか tokenize どうしてるかとか)は本質的に難しいことはないので割愛。

予測の場合にどう使うかは面白い。 画像 1 枚に対して、テキストを M 個準備してその中で最も類似度の高いものを取り出すという方式になる。 つまり、ImageNet だったら 1000 クラスのテキストを準備してその特徴量を抽出して、そのなかで画像特徴量と最も類似度が高いものを選ぶというものになる。 これはモデルを再学習する必要はなく、問題設定によってテキスト M 個の選び方を変えることで柔軟なタスクに適用できる、ということを意味している。逆に言えば問題に合わせてテキスト M 個を準備しなければならない、という話でもあるのだが、これによってクラス数が fix された classification ではないモデルを実現していて、面白いなと思った。

yoheikikuta commented 3 years ago

この予測の仕組みは結構面白いけど、テキストの準備の仕方には工夫が必要となる。

例えば、最もナイーブには犬クラスを予測したかったらテキストとして "dog" などを準備すればよいと考えたくなる。 これは必ずしも間違いではないが、テキスト encoder はウェブから収集した (image, caption text) の caption text の分布に依存した特徴量を抽出するようになる。この場合、単なる "dog" よりも例えば "a photo of a dog" の方が適しているということも生じうる。

実際にそうなっていて、公式実装で予測モデルを動かしたときに、女性の写真に対して "a photo of a woman" だとうまく類似度が最大になるが、 "woman" だけだとこれが最大にならずに "rocket" が最大になったりする。

さらに言えば、同じ画像に対していろんなテキストのパターンを準備してその ensemble を取るということもできる。 例えば "a bad photo of a {}" と "a graffiti of a {}" と "a {} in a video game" のそれぞれで類似度を計算して多数決でどのクラスかを決めるということもできる。実際にこの論文ではそういう手法で 5 point も性能が上がったと報告している。 ちなみに公式実装では ImageNet 1000 クラスの場合に 80 個くらいテンプレートを準備している。

この辺の不安定さは実際に使う場合には難しさもあるが、問題設定が単純な classification から拡張された感もあって、なかなか面白い。

yoheikikuta commented 3 years ago

pre-training 用のデータは Web から集めた 400M の (image, caption text) のペアで、これを WebImageText と呼んでいる。

モデルの評価は、上述のように再学習なしで色々なタスクを解けるので、zero-shot 予測(この論文では unseen dataset に対する classification を指す)を様々な downstream タスクで実施することで測る。繰り返しになるが、このときに予測時のテキストの準備は ensemble のためのテンプレートと、予測したいクラスのテキストを組み合わせて作ることになるので人手で準備する必要がある(ただしモデルの再学習は必要なし)。

特徴量抽出器としての性能も測るため、pre-training した画像 encoder を用いて、downstream タスクで特徴量を抽出し、それを logistic regression で学習・評価することもしている。これはテキストの特徴量は使わないが、学習した特徴量空間は元々テキストと同じ空間なので、いい感じに semantic な要素を取り込んで学習してくれてれば画像だけで特徴量抽出器として使った場合も性能を発揮してくれるだろうという期待かと思われる。

yoheikikuta commented 3 years ago

まず、pre-training 後に zero-shot 予測でどれくらいの性能を叩き出せるかの実験。 ちょろっと紹介した visual N-gram と比べると非常に良い結果を出している。ImageNet 1000 クラスの top-1 accuracy が 76.2% というのはかなり驚いた。ちなみに 20210207 時点での最高精度は top-1 が 90.2% で top-5 が 98.8% らしい。

論文でも書いているが、これは全然フェアな比較ではない。 データもモデルも投入してる計算機資源も全然異なるし、visual N-gram では ImageNet 1000 クラス全部を予測できるわけでない(text n-gram を作るときに ImageNet 1000 クラス全部が含まれてるわけではないので、原理的に当てられないクラスもある。n-gram に含まれるクラスだけに限ると 35.2% らしい)。

フェアな比較ではないということはおいといて、この CLIP の性能はなかなか凄いと思う。 この結果だけを見ると、pre-training にこれと同様の (image, caption text) に相当するものが含まれているので leak になってるんじゃないかという疑いもあるが、これは論文でも確かめられていて、データの overlap はあるが典型的には 10% 未満でその効果も対してないと示している。

yoheikikuta commented 3 years ago

この zero-shot 予測の性能はなかなか凄いので、supervised training したものと比較したくなる。 各種 downstream タスクで、ResNet50 モデルを supervised training したものを比較した結果が以下。

ImageNet を含む 27 タスク中 16 タスクで CLIP が上回るというなかなか驚きの結果となっている。 タスクの性質を眺めてみるのも結構面白くて、CLIP が上回るのは例えば Kinectics700 のような action recognition で、これはテキストで説明できる余地が単なる class 予測よりも大きいからだろうと考察している。 STL10 とかは学習データが少なくてテストデータが多いので CLIP 有利なタスクと思う。一方で苦手なのは専門性が高くて複雑な衛生画像分類とか、人工的に生成した画像における object 認識的なタスクとか。この辺はモロに pre-training のデータ分布を反映している感じがするね。

yoheikikuta commented 3 years ago

zero-shot の性能だけでもなかなか驚くべきレベルだけど、比較がシンプルな ResNet なのでその意味では昨今の最高精度からはだいぶ低いものにはなっている。

画像 encoder から抽出した特徴量を入力とした supervised training をした logistic regression でも他のモデルと比較している。 こちらは他のモデルでも同等の条件になるので、最新のモデル (EfficientNet with Noisy Student とか) と比較をする。

downstream タスクの平均を縦軸(異なるタスクの精度平均に意味があるのかは置いておいて)にして、計算量を横軸にしてプロットした結果が以下。左側が先行研究に合わせた 12 dataset での結果で、右側がこの論文で使っている 27 dataset での結果。 明確に良いことに加えて、モデルサイズをデカくしたときにかなりきれいに精度が伸びていることも見て取れる。同程度の計算量の ResNet より vision Transformer の方が明確にいいんやねぇ。

最初はこの結果がちょっと信じられなくてなんかテキストの特徴量も使ってるのかなと思ったりした。 公開してるコードを確認しても画像の encoder しか使ってないので、これは画像とテキストを同じ特徴量空間で学習することでテキストの方の情報(ナイーブには semantic な情報)も考慮した画像特徴量が抽出できるようになっていて、それが画像特徴量のみを用いた分類に対しても有効になっているということなんだろうね。まだちょっとほんとかな?って思ってる部分もあるけど、なかなかに面白い結果。

ここでは平均してるので、個別に比べた結果が以下。 比べてるのは ImageNet で良い性能を発揮するモデルで、ここまではっきりした差を見せつけられると既存のモデルが ImageNet に overfit してる印象も受けるね。

yoheikikuta commented 3 years ago

もう一つ面白い結果が、やはり CLIP の予測は(期待通り)様々な分布に対しても有効であるというもの。 以下は、バナナに対して、ImageNet で学習したモデルは ImageNet で出てくるバナナにしか強くなくて、例えばバナナのスケッチなどは全然当てられないが、CLIP の zero-shot 予測は高い精度を誇っていることを示している。 先ほどの話ともつながるが、バナナという文字の semantics に対してよく抽象化した上で捉えることができてるのではないかと期待できる(もちろん単に大量に学習したデータの中にこういうタイプの画像も含まれていたということもあるだろうけど、それにしてもなかなか impressive な結果である)。

この辺りの学習した特徴量についての考察は面白そうだけど、基本的にこの論文では予測精度の話にフォーカスしてるので、色々遊べそうなところだなと感じている。

yoheikikuta commented 3 years ago

ちょろっと話に出た、pre-training のデータが downstream タスクのデータを含んでいて leak になってるのでは?という点に関してもいくつか検証をしているのでそこも見てみる。基本的な方針としては、downsteam タスクに pre-training と同じようなものが含まれていればそれによって精度がブーストされるはずなので、似てる画像のみと似てない画像のみの subset を作ってその間の精度を比較しよう、というものになっている。

具体的にやってる作業は以下

その結果が以下。 左が縦軸が (似てる画像のみで測定した精度) - (似てない画像のみで測定した精度) になっている。前者は数が少ない(横軸を見るとわかるように、大体 10% 未満)ので検定をしても confidence interval は間延びしがちだが、有意なものの数は多くはなく、しかも上振れ下触れ両方あるのでそこまでの影響力はなさそうという判断。 右が縦軸が (全体精度) - (似てない画像のみで測定した精度) で、ほとんどが 0.5% 未満でありやはりそこまでの影響力はなさそうと判断している。

検証方法としては似てる画像を見つける detector 依存になったりしてめちゃくちゃ exact なわけではないけど、それよりも appendix で触れている特徴量空間の性質(semantic が同じような画像は特徴量空間で凝集する)とかが面白いなと思った。

yoheikikuta commented 3 years ago

その他にも大量に色々実験をしてるけど、自分の興味がある部分は一通り理解したのでこんなもんかな。

最後に limitation の話をしていて、以下のようなものが挙げられている。

yoheikikuta commented 3 years ago

ということで理解したい分は理解できたので終了。 classification に対するテキスト情報を使った拡張になっていそうで、面白い論文だと思った。特徴量空間の性質とかも遊べそうなことが色々あるし、今後の発展が楽しみ。