BLIP-2: Salesforce は、フリーズされたビジュアル エンコーダーと LLM モデルのパラメーターに基づいたマルチモーダル大規模モデルの効率的なトレーニングを提案します

  • 論文リンク: https://arxiv.org/abs/2301.12597

  • プロジェクトコード: https://github.com/salesforce/LAVIS/tree/main/projects/blip2

  • 体験アドレス:https://huggingface.co/spaces/Salesforce/BLIP2

  • ドキュメント紹介: https://huggingface.co/docs/transformers/main/en/model_doc/blip-2

  • 微調整リファレンス: https://github.com/salesforce/LAVIS

  • ハギングフェイススペースアドレス:https://hf.co/spaces/Salesforce/BLIP2

ここ数年、ビジュアル言語事前トレーニング (VLP) は、モデルがますます大きくなるたびに SOTA を継続的に更新してきましたが、エンドツーエンドのトレーニング方法のため、事前トレーニング中に大量の計算コストが必要になります。トレーニング。2022 年 11 月に ChatGPT がリリースされて以来、人々は大規模モデルの「創発能力」、特にゼロショット能力 (微調整なしの直接予測) をますます認識するようになりました。LLM のパラメータは膨大であるため、微調整のコストは非常に高くなります。そのため、この記事で言及したアダプタ戦略、LoRA、BLIP-2 など、LLM パラメータを凍結する研究と応用が際限なく現れています。 。

BLIP-2の紹介

この論文で提案する BLIP-2 手法は、新しいマルチモーダル事前トレーニング モデルのフレームワークであり、そのアイデアは、軽量のクエリ トランスフォーマー (クエリ トランスフォーマー、Q フォーマー) を追加して、視覚モデルと言語モデルの間のモダリティのギャップを埋めることです。モデル全体では、Q-Former が唯一のトレーニング可能なモジュールですが、画像エンコーダーと言語モデルは常にフリーズされたままです。

2 段階の事前トレーニングが使用されます。最初の事前トレーニング段階では、視覚言語表現学習を実行します。これにより、Q-Former はテキストに最も関連性の高い視覚的特徴を学習するようになります。2 番目の事前トレーニング段階では、Q-Former の出力を LLM に接続し、LLM を通じてその視覚表現を自然言語で解釈するように Q-Former をトレーニングすることで、視覚から言語への生成学習を実行します。

BLIP-2 の主な利点は次のとおりです。

BLIP-2 は、固定パラメータを持つ事前トレーニングされた画像モデルと言語モデルを効果的に利用します。モーダル間のギャップは、表現学習ステージと生成学習ステージの 2 つのステージで事前トレーニングされた Q-Former を使用して埋められます。BLIP-2 は、視覚的な質問応答、画像の言い換え、画像テキストの検索など、さまざまな視覚言語タスクで SOTA パフォーマンスを実現します。

LLM の強力な機能 (OPT、Flant5 など) のサポートにより、BLIP-2 は、自然言語命令に従ってゼロショットの画像からテキストへの生成を実行するように促されるため、視覚的な知識推論、視覚的な対話、などが実現できます。

BLIP-2 は、パラメーター固定の単峰性モデルと軽量の Q-Former を使用しているため、既存の SOTA よりも効率的です。たとえば、BLIP-2 は、Flamingo よりも 54 分の 1 少ないトレーニング可能なパラメータを使用しながら、ゼロショット VQAv2 のパフォーマンスを 8.7% 上回っています。さらに、BLIP-2 は、VLP パフォーマンスを向上させるために、より優れた単峰性モデルを組み込むことができる一般的な方法です。

BLIP-2 モデルの構造

Q-Former は、画像エンコーダーと LLM の間のモダリティのギャップを埋めるトレーニング可能なモジュールとして機能します。入力画像の解像度に依存しない固定次元の出力特徴を画像エンコーダから抽出します。図 2 に示すように、Q-Former は、同じセルフ アテンション レイヤーを共有する 2 つのトランスフォーマー サブモジュールで構成されています: (1) 視覚的特徴抽出のための固定パラメーターを使用して画像エンコーダーと対話するイメージ トランスフォーマー、(2) 同時にテキスト エンコーダーとテキスト デコーダーをモデル化するテキスト トランスフォーマー。学習可能なクエリ埋め込みのセットが、イメージ トランスフォーマーへの入力として作成されます。クエリはセルフ アテンション レイヤーと対話し、クロス アテンション レイヤーを通じて画像特徴と対話します。クエリは、同じセルフアテンション レイヤーを介してテキストと対話することもできます。事前トレーニング タスクに従って、クエリとテキストの対話を制御するためにさまざまなセルフ アテンション マスクが適用されます。著者は、bert-base の事前トレーニングされた重みを使用して Q-Former を初期化し、クロスアテンション層はランダムに初期化されます。Q-Former には、合計 1 億 8,800 万個のパラメータが含まれています。クエリの埋め込みもモデル パラメーターとみなされます。

実験では、著者は 32 のクエリ埋め込みを使用しました。各クエリの次元は 768 (Q-Former の隠れ次元と同じ) です。Z は出力クエリを表します。Z のサイズ ( 32 × 768 ) は、画像特徴のサイズよりもはるかに小さいです (たとえば、ViT-L/14 のサイズは 257 × 1024 です)。これらの構造と事前トレーニング目標を組み合わせることで、クエリはテキストに最も関連性の高い視覚情報を抽出することができます。

BLIP-2 は学習段階を表します

表現学習段階では、Q-Former が固定パラメーターで画像エンコーダーに接続され、[画像とテキスト] のペアを使用して事前トレーニングされます。目標は、クエリがテキストの最も関連性の高い視覚表現を抽出できるように Q-Former をトレーニングすることです。BLIP からインスピレーションを得て、同じ入力とモデル パラメーターを共有する 3 つの事前トレーニングされた目標が共同で最適化されます。各ターゲット タスクは、異なるアテンション マスキング戦略を採用して、クエリとテキストの間の相互作用を制御します (図 2 を参照)。

  画像とテキストの対照学習 (ITC): ITC は、画像表現とテキスト表現を調整して相互情報を最大化することを学習します。この目標は、正と負の [画像とテキスト] のペア間の類似性を比較することで達成されます。画像変換器からのクエリ表現 Z をテキスト変換器からのテキスト表現 t と位置合わせします。ここで、t は [CLS] 文字の出力埋め込みです。Z には複数の出力埋め込み (クエリごとに 1 つ) が含まれるため、最初に各クエリ出力と t の間のペアごとの類似度を計算し、次に最も高いものを画像とテキストの類似度として選択します。情報漏洩を避けるため、単峰性セルフアテンションマスキングマトリックスを採用しています。エンドツーエンドの方法と比較して、固定パラメーターを使用した画像エンコーダーを使用するため、GPU ごとにより多くのトレーニング サンプルをトレーニングできます。したがって、BLIP のモメンタム キューの代わりにバッチ内の負の例を使用します。

  画像に基づいたテキスト生成 (ITG) : ITG 損失は、入力画像に基づいてテキストを生成するように Q-Former をトレーニングします。Q-Former の構造では、画像エンコーダーとテキスト文字間の直接対話が許可されていないため、テキストの生成に必要な情報は、まずクエリによって抽出され、次にセルフ アテンション レイヤーを通じてテキスト文字に渡される必要があります。したがって、クエリでは、テキストに関連するすべての情報を取得するために視覚的特徴を抽出する必要があります。UniLM と同様に、クエリとテキストの間の相互作用を制御するために、マルチモーダル因果セルフ アテンション マスキング マトリックスを採用しています。クエリは相互に認識できますが、テキスト文字は認識できません。各テキスト文字には、すべてのクエリとその前のテキスト文字が表示されます。また、デコードタスクに通知する最初のテキストとして、[CLS] 文字を新しい [DEC] に置き換えました。

  画像とテキストのマッチング (ITM) : ITM は、画像とテキスト表現の間のきめ細かい位置合わせを学習することを目的としています。これは、モデルが [画像とテキスト] のペアがポジティブ (一致) であるかネガティブ (不一致) であるかを予測する必要があるバイナリ分類タスクです。双方向のセルフ アテンション マスキング マトリックスを使用すると、すべてのクエリとテキストが相互に認識できます。したがって、Z を埋め込んだクエリはマルチモーダルな情報を取得します。各クエリ埋め込みは 2 クラスの線形分類器にマッピングされてロジットが取得され、すべてのクエリのロジットが平均されてマッチング スコアが出力されます。

BLIP-2 生成前トレーニング段階

生成事前トレーニング段階では、Q-Former (パラメーター固定画像エンコーダーを備えた) がパラメーター固定 LLM に接続され、LLM の生成能力をキャプチャします。図 3 に示すように、クエリ埋め込み Z は、全結合層 (FC) を使用して LLM テキスト埋め込みと同じ次元に線形マッピングされます。次に、マッピングされたクエリの埋め込みが、ソフト キューとして機能する入力テキストの埋め込みの前に結合され、後続の生成のために Q フォーマーから抽出された視覚的表現に基づいて LLM が条件付けされます。Q-Former は言語関連の視覚表現を抽出するように事前にトレーニングされているため、無関係な視覚情報を削除しながら、最も有用な情報を LLM に提供する情報媒体として効果的に使用できます。これにより、LLM が視覚言語の調整を学習することから解放され、壊滅的な忘却の問題が軽減されます。

  著者は、デコーダベースの LLM とエンコーダ-デコーダベースの LLM の 2 種類の LLM を試しました。デコーダベースの LLM の場合、言語モデリングの損失は事前トレーニングに使用されます。凍結 LLM のタスクは、Q-Former の視覚的表現に基づいて条件付けされたテキストを生成することです。エンコーダ デコーダ ベースの LLM の場合、プレフィックス言語モデリング損失が事前トレーニングに使用され、テキストが 2 つの部分に分割されます。プレフィックス テキストと視覚的表現は LLM エンコーダの入力として使用され、サフィックス テキストは LLM エンコーダの入力として使用されます。は、LLM デコーダの生成ターゲットとして使用されます。

BLIP-2の用途

Step1. トランス環境のインストール

pip install git+https://github.com/huggingface/transformers.git

ステップ2、テストデータを収集する

入力画像が必要です。ニューヨーカー誌は、読者を対象に漫画のキャプション コンテストを毎週開催しています。そこから漫画の画像を取得し、テストのために BLIP-2 に送ります。

漫画アルファベットコンテストのリンク:
https://www.newyorker.com/cartoons/contest#thisweek

import requests
from PIL import Image

url = 'https://media.newyorker.com/cartoons/63dc6847be24a6a76d90eb99/master/w_1160,c_limit/230213_a26611_838.jpg'
image = Image.open (requests.get (url, stream=True).raw).convert ('RGB')  
display (image.resize ((596, 437)))

ニューヨーカーの漫画

ステップ3. モデルをロードする

入力画像を取得したので、入力を処理するために事前トレーニングされた BLIP-2 モデルと対応するプリプロセッサが必要です。利用可能なすべての事前トレーニング済みチェックポイントのリストは、Hugging Face Hub で見つけることができます。ここでは、27 億個のパラメータを持つ Meta AI の事前トレーニング済み OPT モデルを使用して、BLIP-2 チェックポイントをロードします。

from transformers import AutoProcessor, Blip2ForConditionalGeneration
import torch

processor = AutoProcessor.from_pretrained ("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained ("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16)

BLIP-2 モデルをロードするために Auto API (AutoModelForXXX など) をまだ使用できないことに注意してください。これは Hugging Face ではまれなことです。Blip2ForConditionalGeneration を使用して BLIP-2 モデルを明示的にロードする必要があります 。モデルを自動的に取得することはまだ可能ではありませんが、 AutoProcessor この場合は を使用して一致するハンドラー クラスを取得 できますBlip2Processor

GPU を使用してテキスト生成を高速化できます。

device = "cuda" if torch.cuda.is_available () else "cpu"
model.to (device)

いくつかの具体的なケースを見てみましょう

画像キャプションの生成

まず、BLIP-2 がゼロショットからニューヨーカーの漫画画像の字幕を生成できるかどうかを見てみましょう。画像にキャプションを付けるには、モデルにテキスト キューを提供する必要はなく、前処理された入力画像のみを提供する必要があります。テキスト プロンプトがなければ、モデルは BOS から画像キャプションの生成を開始します (シーケンスの開始)。

inputs = processor (image, return_tensors="pt")

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"two cartoon monsters sitting around a campfire"

これは、ニューヨーカー スタイルの漫画画像でトレーニングされていないモデルの驚くほど正確な説明です。

写真の字幕を生成するためのプロンプトが表示されます

また、テキスト キューを提供することで画像のキャプションを拡張することもできます。その後、モデルは画像に与えられた手がかりの単語を補います。

prompt = "this is a cartoon of"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"two monsters sitting around a campfire"
prompt = "they look like they are"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"having a good time"

ビジュアルクイズ

ビジュアル Q&A に使用する場合、プロンプトは特定の形式「質問: {} 回答:」に従う必要があります。

prompt = "Question: What is a dinosaur holding? Answer:"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=10)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"A torch"

チャットベースのヒント

最後に、会話の各ラウンドの質問と回答をつなぎ合わせることで、ChatGPT のようなエクスペリエンスを作成できます。私たちはモデルに手がかり (「恐竜が持っているものは何ですか?」など) を尋ねると、モデルはそれに対する答え (「トーチ」など) を生成し、それをダイアログに埋め込むことができます。次に、別のラウンドを実行して、コンテキストを確立します。ただし、コンテキストが 512 トークンを超えないようにする必要があります。これは、これが BLIP-2 で使用される言語モデル (OPT および T5) のコンテキスト長であるためです。

context = [
   ("What is a dinosaur holding?", "a torch"),
   ("Where are they?", "In the woods.")
]
question = "What for?"
template = "Question: {} Answer: {}."

prompt = "".join ([template.format (context [i][0], context [i][1]) for i in range (len (context))]) +" Question: "+ question +" Answer:"

print (prompt)
Question: What is a dinosaur holding? Answer: a torch. Question: Where are they? Answer: In the woods.. Question: What for? Answer:

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=10)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
To light a fire.

参考文献:

[1] https://baijiahao.baidu.com/s?id=1759140009156263839&wfr=spider&for=pc

おすすめ

転載: blog.csdn.net/wshzd/article/details/130845416