LLMを使った画像認識について調べた内容をまとめた記事です。
画像とテキストを入力してテキストを得る仕組み
Vision Transformerで画像エンコード、CLIPで ベクトルを写像、LLMでデコード・テキスト出力する前提です。
ざっくりした流れは(1)画像を分割したパッチごとにベクトル化(トークン化)する。(2)画像全体の要約ベクトルを得る。(3)画像ベクトルをテキストプロンプトの埋め込みベクトルと同一空間に写像(4)デコードして回答を得る、です。
(1)画像を分割したパッチごとにベクトル化(トークン化)する。
入力画像を分割してそれぞれを線形射影しベクトル化する。この時点のベクトルは意味情報ではなく画像のピクセル的な特徴量を低次元に圧縮したもの。またこの際位置情報が失われるため、位置情報も別でベクトル化する。
Q:このベクトルにはどんな情報が入っているか。
-> ピクセル単位の画像情報で、意味的な情報ははいっていない。
(2)画像全体の要約ベクトルを得る。
Vision Transformerの仕組みを前提とする線形射影したベクトルと位置情報のベクトルを整列したものをtransformer層に入力し画像全体の要約ベクトルを生成する。この時点のベクトルは画像全体の意味ベクトルであり、テキストプロンプトは影響しない。画像情報の要約は学習時の重みに基づいて実施される。
Q:分割した画像の情報をどういうアプローチ、優先順位で取捨選択しているか
-> 学習時の重みに基づいて取捨選択する。
Q:この時点でテキストプロンプトが画像ベクトルに影響するか
-> しない。
(3)画像ベクトルをテキストプロンプトの埋め込みベクトルと同一空間に写像
下記のようなアプローチがある。画像とテキストが同一空間でトークンとして扱われるため、同じ文脈で扱えるようにする処理である。
- CLIP:画像埋め込みとテキスト埋め込みを別々に得て、コントラスト学習で空間を整列させる。
- BLIP-2:画像ベクトルをQ-Formerで抽出 → LLMの入力次元にプロジェクション。
- LLaVA:画像ベクトルをMLPで直接LLMの埋め込み空間へ。
(4)デコードして回答を生成する
上記のプロセスでエンコードした情報をLLMに入力する。出力は最も確率の高い次のトークンを予測することで自然言語を生成する。
Q:座標出力が苦手なのはなぜか
-> 大きく3つの要因が重なっている。
- まず座標つき画像は高コストなので学習データにほとんど含まれていないため。
- 次に座標自体がネクストトークンプレディクションの仕組み上扱いにくい。これはつまり、座標のそれぞれの値が複数のトークンに分割されるため誤差が蓄積しやすく厳密な計算が難しいためと、座標の数値はトークン上非常に似ているため似ているもの同士で混ざりやすく取り違えなど起きやすいためである。
- 画像ベクトルを生成する際に厳密な位置情報が失われるため。