AIチャットサービス「ChatGPT」のモデルの1つ、GPT-4oは、人間から受け取ったテキストをまず「トークン」に処理した後、AIが扱いやすい数値ベクトルに変換して計算を行います。画像でも同様の処理を行いますが、その際にどのような処理をしているのか、プログラマーのオラン・ルーニー氏が推測しました。

A Picture is Worth 170 Tokens: How Does GPT-4o Encode Images? - OranLooney.com

https://www.oranlooney.com/post/gpt-cnn/

GPT-4oが高解像度の画像を処理する際は、画像を512x512ピクセルのタイルに切り分けて処理し、1タイル当たり170トークンを消費します。この「170トークン」という数字に着目したルーニー氏は、「OpenAIが使う数字にしては中途半端すぎる」と指摘し、なぜ170という数字が出てくるのかを調査しました。

仮説として、各タイルが170個の特徴ベクトルに変換され、それが連続する形で並べられているというものが考えられるそうです。GPT-4oのようなディープラーニングモデルが画像を扱う際は、画像のピクセル情報を直接処理するのではなく、高次元のベクトル空間にマッピングしてから処理する方がより効率的なためです。



画像をベクトル空間にマッピングする単純な方法として、まず512x512の画像を64個の「ミニタイル」に分割する方法があります。各ミニタイルは64×64ピクセルで、それぞれRGBの3つのカラーチャネルを持っています。これらのピクセルを平坦に並べると、64×64×3の1万2288次元に変換されます。この状態は、512x512の画像が64個の連続した1万2288次元のベクトル(ミニタイル1個分)に変換されたと表現できます。これを処理するには64トークンで済みます。

ただし、上記の処理方法は非効率です。またルーニー氏はGPT-4oが処理する次元数も1万2288であると仮定していますが、上記の方法ではミニタイルが64個並ぶため、170個並べて処理しているはずのGPT-4oとも一致しません。ルーニー氏は近似値を出す処理方法として畳み込みニューラルネットワークのアーキテクチャの1種である「YOLO」を紹介しました。

YOLOはピクセルを平坦に並べるのではなく、最小13×13のグリッドに並べて処理を終えるのが特徴です。13×13は169です。ところが、ルーニー氏がYOLOアーキテクチャに基づいて実験したところ、GPT-4oは5x5以下では完璧なパフォーマンスを発揮するのに、それ以上になると性能が落ち始め、13×13ではほとんど埋め込みベクトルを処理できないことがわかりました。



GPT-4oは実際にどのような処理をしているのか、ルーニー氏は1つの仮説を立てました。

ルーニー氏の仮説は、GPT-4oは画像をいくつかのグリッドに分割して処理しているというものです。まずは画像全体を1回処理し、次に画像を3×3に分割して処理し、今度は5×5に分割して処理し……といった具合です。これを数式にすると、1 + 3^2 + 5^2 + 7^2 + 9^2 = 1 + 9 + 25 + 49 + 81 = 165となり、前提の170に近づきます。これに2×2のグリッドともう1つの「1」を加えると170になり、前提と合致するというのがルーニー氏の主張。



GPT-4oが5×5のグリッドまでしか完璧に処理できないということを加味すると、以下のように最大でも5×5のグリッドに分割して処理している可能性も考えられます。この場合、1つのタイルごとに3トークン、分割する処理ごとに1トークンを消費すると考えると、3 × (1^2 + 2^2 + 3^2 + 4^2 + 5^2) + 5 = 170となり、合致します。



ただ、ルーニー氏は「これは数字的には十分満足できるものではありません」と指摘し、さらにGPT-4oがOCR(画像内の文字のテキスト化)を上手にこなす理由も説明できないと述べています。

最後にルーニー氏は「埋め込みベクトルへのマッピングにはYOLOのようなアーキテクチャと非常によく似たアプローチがあるようです。170トークンというのは画像を処理するのに必要な計算量の近似値ではなく、正確に計算された上で算出されたものだと思いますが、真相は不明です。画像をグリッドに分割して処理する仮説は私が思いついた最高のものですが、すっきりしたものではないため、もう少ししっくりくる理論をお持ちの方のご意見をぜひお聞かせください」とまとめました。