🎨

VLM用の合成instructionデータセットを作ろう

2024/12/03に公開

1人ローカルLLMアドベントカレンダーの3日目です。

ローカルLLMやマルチモーダルモデルの学習やデータセット周りについて書いていく予定なので、興味がある方は明日以降も読んでいただけると嬉しいです!
https://qiita.com/advent-calendar/2024/local-llm

要約

  • 画像からVLM用のinstructionデータセットを合成した
  • 合成したデータセットでVLMを学習した

https://huggingface.co/datasets/Kendamarron/japanese-photo-instruction
https://huggingface.co/Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-LoRA

目的

VLM用のinstructionデータセットはOpenAIの規約に抵触しているものが多く、ライセンスの問題がないデータは一問一答形式のものがほとんどです。

私が以前作成したLlama-3.2-11B-VisionとLlama-3.1-Swallow-8B-v0.1をChatVectorでマージしたモデルはeosトークンの出力が不安定なので、実際に使うにはSFTが必要になるのですが、Llama-3.2の性能を維持した上で学習できるデータがありませんでした。

そこで、性能を維持できるような品質の合成instructionデータセットを構築することが今回の目的になります。

実施内容

  1. 画像からキャプションを生成
  2. キャプションを参照したマルチターンの会話を生成

画像データ

画像にはこちらのデータセットを利用させていただきました。

https://huggingface.co/datasets/ThePioneer/japanese-photos

こちらのデータセットでは、日本で撮影された1万枚以上の写真がCC0ライセンスで公開されています。

キャプション生成

キャプション生成にはQwen/Qwen2-VL-7B-Instructを使用しました。

プロンプト

この写真について、言葉だけで説明できるように詳細な説明を提供してください。色合いや形状、オブジェクトの位置関係、記載されている内容などももれなくすべて含めてください。

instructionデータセットの生成

キャプションからinstructionの生成にはQwen/Qwen2.5-32B-Instruct-AWQを使用しました。

プロンプトは以下のような感じです。

プロンプト

与えられたキャプションから、画像について会話をしているユーザーとAIアシスタントの会話を作成してください。

<condition>

  • 日本語で作成すること
  • ユーザーは画像に関連した指示をAIアシスタントに行う
  • ユーザーの発言は「USER: 」のあとに、AIアシスタントの発言は「ASSISTANT: 」のあとに出力すること
    </condition>

<caption>
{example['caption']}
</caption>

完成したデータセットはこちらになります。

https://huggingface.co/datasets/Kendamarron/japanese-photo-instruction

大半が「この写真」で始まるのは気になりますが、マルチターンにしたことである程度多様性は生まれているのかなと思います。

とはいえ、ここら辺は改善の余地ありですね

結果

今回作ったデータセットでVLMの学習もやってみました。

以前、Chat VectorでLlama-3.2-11B-VisionにSwallowの重みを加えて作成したモデルがあります。詳細はこちらの記事をご覧ください

https://huggingface.co/Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-Merge

このモデルには繰り返しが頻発したり、eosトークンを出力せずに生成が止まらなくなることが多いなどの問題があり、これらは少量のデータでも学習すれば解消すると思っていましたが、良さそうなデータが見つからずにそのままにしていました。

せぅかくなので、今回作ったデータセットでこのモデルをファインチューニングしてみます。

学習にはUnslothのこちらのノートブックを使用しました。

データセットのフォーマット部分だけ変更しています。

完成したモデルはこちらになります。

https://huggingface.co/Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-LoRA

出力はこんな感じです。


プロンプト: これはなんですか?

モデル 出力
meta-llama/Llama-3.2-11B-Vision-Instruct この画像は、日本の奈良県の奈良市にある大仏殿(だいぶつでん)であると推測されます。画像から大きな仏像が見えるため、仏教の施設であると推測されます。画像の背景には、奈良公園(ならこうえん)と奈良市内を走る国道308号が見えます。国道308号は、奈良市内を走る国道24号の支線で、奈良公園の南東に位置しています。国道308号は、奈良
Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-Merge(学習前) これは奈良県奈良市にある東大寺の鐘楼です。鐘楼は鐘を吊るすために建てられた塔で、東大寺の鐘楼は高さ約50メートル、直径約5メートルあります。鐘楼の鐘は国の重要文化財に指定されています。鐘楼の鐘は、東大寺の僧侶が毎日打ち鳴らすことで、仏教の教えを広める役割を果たしています。鐘楼は東大寺のシンボル的な建物として知
Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-LoRA(学習後) これは奈良県の東大寺大仏殿の外観を写した写真です。木造建築で、屋根は緩やかな曲線を描いています。

学習後はeosトークンが出るようになっていますし、出力としても前より適切ですね!

HuggingFace Spaceに今回のモデルのデモを公開していますので、気になる方はお試しください。

https://huggingface.co/spaces/Kendamarron/Llama-3.2-11B-Vision-Instruct-Swallow-8B-LoRA

まとめ

今回は画像からVLMのinstructionデータセットを生成してみました。

日本語のVisionモデル用データセットはあまり多くないので、既存のVLMやLLMを使って増やしていきたいですね!

Discussion