こしあん
2024-12-13

論文まとめ:Expanding Performance Boundaries of Open-Source Multimodal Models with Model, Data, and Test-Time Scaling


56{icon} {views}

3行要約

  • オープンソースのマルチモーダル大規模言語モデル「InternVL 2.5」を公開し、商用モデルとの性能差を縮めることを目指した。
  • ビジョンエンコーダ、言語モデル、データセットサイズ、推論時間などのスケーリングが性能に与える影響を調査し、大規模なビジョンエンコーダが学習データへの依存を軽減することを発見した。
  • InternVL 2.5はMMMUベンチマークで70%を超える精度を達成し、高品質なデータと効果的なスケーリング戦略がオープンソースモデルの性能を大幅に向上させることを示した。

論文要約By Gemini1.5 Pro

Expanding Performance Boundaries of Open-Source Multimodal Models with Model, Data, and Test-Time Scaling

この論文は、オープンソースのマルチモーダル大規模言語モデル(MLLM)であるInternVL 2.5について述べています。

この論文において解決したい課題は何?

商用モデルとオープンソースモデルの性能差を縮め、高性能なオープンソースMLLMを提供すること。

先行研究だとどういう点が課題だった?

既存のオープンソースMLLMは、商用モデル(GPT-4o、Claude-3.5-Sonnetなど)と比較して性能が低い。また、CoT推論が苦手で、データの質の問題も抱えていた。

先行研究と比較したとき、提案手法の独自性や貢献は何?

  • (1) 新たなオープンソースMLLMであるInternVL 2.5を公開。
  • (2) ビジョンエンコーダ、言語モデル、データセットサイズ、推論時間など、MLLMの様々な構成要素のスケーリングが性能に与える影響を調査。
  • (3) 大規模なビジョンエンコーダが、MLLMのスケールアップ時の学習データへの依存を軽減することを発見。データの質の重要性と、テスト時スケーリングの有効性を示した。MMMUベンチマークで70%を超える精度を達成した初のオープンソースMLLM。

提案手法の手法を初心者でもわかるように詳細に説明して

InternVL 2.5は、「ViT-MLP-LLM」パラダイムに基づき、画像エンコーダ(InternViT)、MLPプロジェクタ、大規模言語モデル(LLM)を組み合わせたアーキテクチャです。高解像度画像をタイル分割し、各タイルをInternViTで処理、その出力をMLPプロジェクタでLLMの入力形式に変換し、LLMでテキスト生成を行います。学習は3段階:(1)MLPプロジェクタのみを学習 (2) 必要に応じてInternViTをLLMと共同学習 (3) 全モデルを命令データでファインチューニング。さらに、学習効率向上の為、複数サンプルを連結するデータパッキング戦略を採用。また、LLMの異常動作を防ぐため、データフィルタリングパイプラインで低質サンプルを除去しています。

提案手法の有効性をどのように定量・定性評価した?

MMMU、MMMU-Pro、MathVista、MATH-Vision、MathVerse、OlympiadBenchなどの多様なベンチマークで評価。MMMUでは70.1%を達成し、オープンソースモデルとして初の70%超えを達成。他のベンチマークでも先行研究や商用モデルに匹敵する性能を示した。また、データフィルタリングの有効性も確認。

この論文における限界は?

長文応答生成時や実世界の複雑なインタラクションにおいて、GPT-4o等の商用モデルと比較して、ユーザー体験の点で改善の余地がある。また、幻覚の問題も完全には解決されていない。

次に読むべき論文は?

論文中で比較対象として挙げられている、GPT-4o [192]、Claude-3.5-Sonnet [8]、Gemini-1.5-Pro [200]、Qwen2-VL [246]などの論文。

コードはhttps://github.com/OpenGVLab/InternVLで公開されています。

手法

  • 以前のバージョンと同様に、Pixel Unshuffleを適用し、448×448画像タイルによって生成される1024個のビジュアル・トークンを256個のトークンに削減。
  • InternVL 1.5は既存の単一画像とテキストで訓練していたが、InternVL 2.0と2.5は複数画像とビデオデータを導入。
  • MLP Projector:視覚特徴を抽出し、LLMに橋渡しする
    • LLMに接続し、MLPをウォームアップした後、Next Token Predictionで学習

Vision Encoder

  • V1.0とV1.2では、448×448の固定解像度で学習したが、その後動的解像度の学習に切り替え
  • V1.5では、ViTの最後の3層を削除し、ローカル情報よりグローバルアラインメントを優先。ViTが6Bであっても、実際は5.5Bの45層
  • InternViT-300M。6BのViTモデルを蒸留

学習戦略:動的高解像度化

動的高解像度化。GPTに数式読ませてコード化したもの

  • 単一画像では、アスペクト比がなるべく歪まないようにタイルを選択
  • 複数画像または動画では、画像当たりのタイル数に応じて比例配分する
import math
from PIL import Image

def calculate_tiles_multi_image(n_max, N_images):
    """
    Calculate the maximum number of tiles assigned to each image in a multi-image dataset.

    Parameters:
        n_max (int): Maximum number of tiles allowed for the entire dataset.
        N_images (int): Total number of images in the dataset.

    Returns:
        list: List of tile counts for each image.
    """
    tiles_per_image = [max(1, math.floor(n_max / N_images)) for _ in range(N_images)]
    return tiles_per_image

def dynamic_high_resolution_multi(images, n_max=10, S=448):
    """
    Implements the dynamic high-resolution algorithm for multi-image datasets.

    Parameters:
        images (list): List of input images (PIL.Image.Image objects).
        n_max (int): Maximum number of tiles allowed for the entire dataset.
        S (int): Tile size (default is 448).

    Returns:
        dict: Dictionary where keys are image indices and values are lists of tiles.
    """
    N_images = len(images)
    tiles_per_image = calculate_tiles_multi_image(n_max, N_images)
    all_tiles = {}

    for idx, (image, num_tiles) in enumerate(zip(images, tiles_per_image)):
        W, H = image.size
        aspect_ratio = W / H

        # Determine grid dimensions
        best_i, best_j = None, None
        min_diff = float("inf")
        for i in range(1, n_max + 1):
            for j in range(1, n_max + 1):
                if i * j >= num_tiles:
                    grid_aspect_ratio = i / j
                    diff = abs(grid_aspect_ratio - aspect_ratio)
                    if diff < min_diff:
                        min_diff = diff
                        best_i, best_j = i, j

        # Resize image
        W_new = S * best_i
        H_new = S * best_j
        resized_image = image.resize((W_new, H_new), Image.ANTIALIAS)

        # Split into tiles
        tiles = []
        for i in range(best_i):
            for j in range(best_j):
                left = i * S
                upper = j * S
                right = left + S
                lower = upper + S
                tile = resized_image.crop((left, upper, right, lower))
                tiles.append(tile)

        # Limit to num_tiles
        all_tiles[idx] = tiles[:num_tiles]

    return all_tiles

# Example usage
if __name__ == "__main__":
    # Load a list of example images
    input_images = [Image.open(f"image_{i}.jpg") for i in range(1, 4)]  # Replace with your image paths
    n_max = 15  # Maximum tiles allowed for the entire dataset

    tiles_dict = dynamic_high_resolution_multi(input_images, n_max)

学習戦略:単一モデルの学習

段階的にファインチューニングする。インクリメンタル学習を導入

Stage 1.5の目的

  • 視覚エンコーダの視覚的特徴抽出能力を向上させたい
  • 特に多言語OCRデータや数学チャートなど、ウェブスケールのデータセットでは比較的少ないドメイン(例:LAION-5B)に対して、より包括的な情報を捉えることを可能
    • 多言語OCRやチャートの理解がほしければViTのファインチューニングは必要

学習戦略:プログレッシブスケーリング

InternVL2.5の新規要素で、小さいLLMで学習したViTを大きなLLMに訓練し、プログレッシブに学習することで効率的な学習を実現。

より大きなモデルを学習する場合、以前のステージから最適化されたInternViTモジュールが再利用されるため、ステージ1.5をスキップできる。

学習の強化

  • 実世界のシナリオに対応するために、ランダムなJPEG圧縮(75-100)をData Augmentationとして導入
  • 損失の再重み付け:NTP損失の重み付けでよく使われる。両方を使う
    • トークン平均化:サンプル内の平均ロスを最初に計算
    • サンプル平均化:サンプルをまたいで平均を計算
  • 各手法の欠点
    • トークン平均化:より多くのトークンを持つ応答に偏った勾配が生じ、ベンチマークを低下させる可能性
    • サンプル平均化:短い応答を優先させてユーザーエクスペリエンスに悪影響
  • 2乗平均をとって両者のバランスを取る

データセットの構成

  • モダリティごとにData Augmentationを変える
    • 画像ではJPEGのData Augmentationが必要だが、動画では動画内の画質を一定にするためにAugmentationをしない
  • モダリティごとに最大タイル数を変える
  • 全体のデータ構成。モダリティもデータ数も増加

マルチモーダルデータパッキング

  • 訓練時のトークン数を有効に活用するために、複数のサンプルを長いシーケンスに結合することでパディングを減らす
  • バイナリサーチを使って、選択や探索を行う

悪いサンプルの除外

  • 一番ユーザー体験に影響度の高い課題は、同じ文章が反復生成されること
  • これらはデータの質に起因するもので、少量入っただけで全体に影響が出る
  • LLMベースの品質スコアリングを行い、低品質のものをフィルタリング

結果

定量評価の記述がだいぶ長いので割愛して紹介

V2.5からは、CoTの効果が明確に出るようになった

動画ではフレーム数に対してスケールするようになった

マルチリンガルの性能も高い

所感

  • GPT-4oやGeminiの再現をしようとすると大変だなぁ!と印象


Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です