2024.05.28

GPT-4oを使って画像を分析してみた

TL;DR

  • OpenAIは、2024/05/13にGPT-4oをリリースしました。GPT-4oは、画像とテキスト、音声などを同時に処理することができるモデルで、従来よりも高速な実行が可能です。
  • GPT-4 Turbo with visionで行ったように、GPT-4oのAPIを利用してグラフの解説を試したところ、ある程度はもっともらしい解説は可能ですが、やはり正確な数値の読み取りなどには課題が残る結果となりました。
  • 特にChatGPTでは、入力した画像だけではなく、既に学習済みの知識をカンニングしている可能性があります。ペンギンの性別や種のラベル、体重の数値を入れ替えた場合、これらの事前知識に影響されたと思われる回答が得られました。

はじめに

こんにちは、グループ研究開発本部・AI研究室のT.I.です。先日5/13に、OpenAIは新しいGPT-4o(omni)をリリースしました。GPT-4oは、画像、テキスト、音声などを同時に処理することができるモデルで、従来のGPT-4よりも高速に生成可能です。特に日本語のなどの非英語圏の言語のトークン化が効率化されており、日本語の文章生成がこれまで以上にサクサクと進むのが使っていて気持ちいいです。詳細については、公式のBlog(Hello GPT-4o)を見ていただくとして、このBlogでは、以前にGPT-4 Turbo with visionで実験した(そして微妙な結果だった)データサイエンティストの分析業務(なのか?)のグラフの解説について、GPT-4oを使った場合の結果を比較してみたいと思います。

GPT-4 with vision
さて、GPT-4 TurboからGPT-4o(omni)へのアップデートで、画像認識はどのように変わったでしょうか?

GPT-4o(omni)とOpenAI API

OpenAIはGPT-4oのAPIも同時に提供しています。APIを使うことで色々なサービスに組み込むことができ、実験にも便利なので早速使ってみましょう。APIの使い方は、以前のBlogで解説したGPT-4 Turbo with visionとほぼ同じです。OPENAI_API_KEYを取得しておき、環境変数で設定した上で、利用するモデル名を変更するだけです。

from openai import OpenAI

client = OpenAI()

model_name = "gpt-4o"
prompt = "この画像について解説してください"
image_url = 'https://www.gmo-jisedai.com/wp-content/uploads/yasaka-1024x768.jpg'

response = client.chat.completions.create(
  model=model_name,
  messages=[
    {
      "role": "user",
      "content": [
        {"type": "text", "text": prompt},
        {
          "type": "image_url",
          "image_url": {
            "url": image_url
          },
        },
      ],
    }
  ],
  max_tokens=1200,
)

print(response.choices[0].message.content)

試しに以前にSakana AIの進化論的モデルマージを解説したBlogで試した京都の八坂神社の写真を使ってみます。

八坂神社

この画像は、日本の京都にある八坂神社の正門の一つである「西楼門」を示しています。八坂神社は古くから京都の守護神として信仰されている神社で、特に歴史と文化的な価値が高い場所です。

画像の詳細について:

  • 正面に見えるのは「西楼門」で、朱色と白の鮮やかな色彩が特徴です
  • 門の前には数段の階段があり、その上に参拝者や観光客が何人か写っています。
  • 左右には緑色の窓を持つ建物が見えます。
  • 前方の道路には車が通っており、現代的な交通の風景が対比されています。
  • 周囲には多くの木々が茂っており、自然の中に神社が位置していることがわかります。

八坂神社は初詣や桜祭り、祇園祭などの大規模な祭事の際に多くの人が訪れるスポットで、地元の人々や観光客にとって重要な場所です。

このように八坂神社の西楼門であることを判別して回答してくれました。ChatGPTの以前のバージョン(注)では、具体的な寺社の名前をぼかして解説してくれたことを考えると、GPT-4oは画像解析においてもより具体的な情報を提供してくれるようです。数段だと少々この高さを登るのはきついのではとか、桜祭りって何だろうとかツッコミどころは残ってはいますが。(参考:八坂神社主な神事・行事 https://www.yasaka-jinja.or.jp/event/)

(注) OpenAIは「GPT-4 Turbo」を4/9にアップデートしました。前回のSakana AIの解説記事では、「八坂神社」と特定できていませんでしたが、実は4/9のアップデート前のバージョンを使用していました。アップデート後のGPT-4 Turboを利用すると「八坂神社」と特定できるようになっており、GPT-4 Turboも性能向上が確認できます。

グラフの解説結果を比較してみた

さて、本題のグラフの解説結果を比較してみます。写真と同様に以前のBlogで解説した内容を使ってみます。比較するモデルは以下の2つのAPIです。

  • GPT-4o APIのモデル名はgpt-4o (gpt-4o-2024-05-13)
  • GPT-4 Turbo APIのモデル名はgpt-4-turbo (gpt-4-turbo-2024-04-09)

なお、評価にあたって注意ですが、複数回実行し典型的な1つを回答例として紹介しています。どの回答も何らかの不備・問題があるので、意図的に変なものを選んでいるわけではありませんのでご了承ください。また、OpenAIが日々モデルを微調整・改良をしているのか判断できませんが、時間を空けて実行すると回答の傾向が変わることがあります。先ほどの八坂神社の写真も、GPT-4oのAPIを利用した当初は以前同様に具体的に八坂神社と断定しなかったものの、いつの間にか具体的な名前を回答するようになりました。

URLから画像を指摘する場合は先ほどのコードで実行できますが、ローカルのファイルを使う場合は以下の通りです。

import os
import base64
import requests

api_key = os.environ.get('OPENAI_API_KEY')
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}

image_path = 'some_image_file.png'

base64_image = encode_image(image_path)

model_name 'gpt-4o-2024-05-13'
prompt = "データサイエンティストとして、このデータ分析の結果の図からポイントを簡単に説明してください。"

payload = {
    "model": model_name,
    "messages": [
        {
        "role": "user",
        "content": [
            {
            "type": "text",
            "text":prompt,
            },
            {
            "type": "image_url",
            "image_url": {
                "url": f"data:image/jpeg;base64,{base64_image}"
            }
            }
        ]
        }
    ],
    "max_tokens": 1200
}


response = requests.post(
    "https://api.openai.com/v1/chat/completions",
    headers=headers,
    json=payload)

print(response.choices[0].message.content)

最初のお題は、Palmer Penguins Datasetを使った、ペンギンの種(Adelie, Chinstrap, Gentoo)と性(Male, Female)ごとの体重の分布をboxenplotで示したグラフです。見てわかるようにGentooが最も重く、AdelieとChinstrapは同じ程度、また、どの種でもオスが重い傾向にあります。

ペンギンの体重の箱ひげ図

データサイエンティストとして、このデータ分析の結果の図からポイントを簡単に説明してください。

それぞれのモデルの回答例の以下の通りです。

GPT-4oによる解説

この図は、パート別の体重分布を示すボックスプロットで、3つのペンギンの種類(Adelie, Chinstrap, Gentoo)における性別(Male, Female)ごとの体重(Body Mass[g])がプロットされています。以下が主なポイントです:

全般的な傾向:

  • 全てのペンギンの種類において、一般的にオスの体重がメスよりも重い傾向があります。

Adelie:

  • オスの体重(青)は約3,600gから5,000gの範囲内で、多くのデータポイントが4,000g前後に集中しています。
  • メスの体重(オレンジ)は約2,800gから4,200gの範囲内で、多くのデータポイントが3,500g前後に集中しています。

Chinstrap:

  • オスの体重(青)は約3,200gから4,800gの範囲内で、主に3,800gから4,200gに集中しています。
  • メスの体重(オレンジ)は約2,900gから4,000gの範囲内で、主に3,400gから3,800gに集中しています。

Gentoo:

  • オスの体重(青)は約4,800gから6,600gの範囲内で、主に5,500g前後に集中しています。
  • メスの体重(オレンジ)は 約4,200gから6,000gの範囲内で、主に5,000g前後に集中しています。

GPT-4 Turboによる解説

このボックスプロット図は、ペンギンの三種類(アデリー、チンストラップ、ジェンツー)におけるオスとメスの体重分布を示しています。以下のポイントに気を付けてデータを解釈できます:

種ごとの体重差:

  • アデリー:オスの体重がメスよりわずかに重い傾向にありますが、両者の体重分布は比較的近いです。
  • チンストラップ:体重に関してもオスの方が重い傾向にありますが、こちらもアデリー種と同様、差は小さいです。
  • ジェンツー:オスの体重が明らかにメスより重く、他の二種と比べても差が大きいことが分かります。

種間での体重差:

  • アデリーおよびチンストラップ種は体重が比較的似ており、3500gから4500gの範囲で多くのデータが分布しています。
  • ジェンツー種は体重が全体的に重く、5000g近くから6000g以上に及ぶ個体も観測されています。

体重分布の幅と外れ値:

  • 各種のオスとメスの体重には多少のばらつき(分布の幅)が見られ、特にジェンツー種のオスの体重に幅があることが示されています。
  • 外れ値は点で表示されており、特にジェンツー種で顕著ですが、その他の種にもいくつか外れ値が存在することが確認できます。

この図から、ペンギンの種によって性別間及び種間の体重に顕著な違いが存在することが読み取れます。データの詳細な分析により、これらの違いが環境因子、食習慣、遺伝的要素などによるものかさらに探求することができるでしょう。

ChatGPTの回答で問題がある箇所を赤字で強調しました。比較するとGPT-4oの方が具体的な数値が多い傾向がありました。ただ、個々の数値を見ると、少々不正確な数字が多くあまり厳密性が高いとは言えません。性別ごとの傾向や種ごとの傾向については、概ね問題なく解説しているようです。また、意地悪で出していることもありますが、ボックスプロットではなく、boxenplot(letter-value plot)です。これは、一般的なボックスプロットよりもデータの分布をより詳細に可視化することができるので便利です。ただし、データの分布が中心以外に偏っている場合には、violin plotなど別の可視化手法を検討した方が良いです。なお、GPT-4oの一部の回答で「ボックスエンプロット」という単語を出したことがありますが、その後の解説で箱ヒゲなどボックスプロットの解説を始めてしまうなど、一貫性がない回答で不正確でした。

次のお題は、食事と運動の種類別に運動の継続時間と心拍数を比較したものです。

食事と活動の種類ごとの心拍数の時間依存性

それぞれのモデルによる回答例の以下の通りです。

GPT-4oによる解説

この図は、「休息」、「歩行」、「ランニング」という異なる活動において、時間の経過に伴う「脈拍」の変化を示しています。また、「脂肪なし」と「低脂肪」という2つの異なる食事が用いられています。それぞれの食事の影響が脈拍にどのように現れるかが比較されています。

以下が主要なポイントです:

休息時:両方の食事(脂肪なし、低脂肪)において、脈拍はほとんど同じレベルに保たれています。
時間が経つにつれて若干の増加は見られますが、大きな差はありません。

歩行時: 歩行においても両方の食事で脈拍は比較的安定していますが、脂肪なしの食事の方が若干高い傾向にあります。増加の度合いは休息時と比較して少し大きいです。

ランニング時: ランニングでは、両方の食事において脈拍が時間と共に大幅に上昇しています。特に、「脂肪なし」の食事をしている場合、脈拍の増加が顕著です。1分、15分、30分の順に大幅な上昇が見られ、特に30分経過後には脈拍に大きな差が出ています。

この図からは、特に高強度の運動(ランニング)において、「脂肪なし」の食事が脈拍の増加を引き起こしやすいという傾向が読み取れます。休息や歩行といった低強度の活動では、食事の違いによる脈拍への影響は比較的少ないようです。

GPT-4 Turboによる解説

この図は、休息、歩行、走行時の心拍数を示していて、食事の種類(無脂肪と低脂肪)による違いを比較しています。以下は、データから読み取れる主要なポイントです。

休息時: どちらの食事グループも心拍数は比較的安定しており、1分、15分、30分と時間が経過しても大きな違いは見られません。無脂肪食のグループは低脂肪食のグループと比べてわずかに低い心拍数を維持しています。

歩行時:両グループの心拍数は休息時より少し上昇していますが、大きな違いは見られません。また、時間が経過しても心拍数に大きな変化はありませんが、無脂肪食を摂っているグループの方が若干心拍数が低めです。

走行時: ここで顕著な差が見られます。特に無脂肪食のグループでは、時間と共に心拍数が顕著に上昇しています。15分に入ると急な増加が見られ、30分ではさらに増加しています。対照的に、低脂肪食のグループは、少し心拍数が増加するものの、無脂肪食ほどの急激な上昇は見られません。

この図は、運動強度が増すにつれて、食事の脂肪含有量が心拍数に与える影響が異なることを示唆しています。特に、高強度の運動(走行)時に無脂肪食を摂っているグループの心拍数の増加が大きいことがわかります。これにより、食事内容によって心拍数の反応が異なる可能性があることが示されています。

今回は具体的な数値はあまり出ていませんが、運動量と食事の違いについての傾向を概ね問題なく解説することができました。

次の課題は系外惑星(exoplanet)を観測手法と発見された距離の関係を示したグラフです。通常のボックスプロットに加えて、個別の点がプロットされているので、厳密ではありませんが観測された件数の分布もわかります。

系外惑星観測手法と発見された距離の関係

それぞれのモデルによる回答例の以下の通りです。

GPT-4oによる解説

この図は、さまざまな方法によって発見された系外惑星の距離分布を示すボックスプロットです。横軸は対数スケールで距離(distance)を示し、縦軸は惑星を発見するために使用された方法(Method)を示しています。いくつかのポイントを挙げます:

  • Radial Velocity: 距離が比較的近い範囲(約10から100のオーダー)で多くの発見があり、ボックスプロットの範囲も狭いことから、近距離での多くの検出が示されています。
  • Imaging: 距離の広い範囲にわたって検出されていますが、特に100から1000以上の範囲で多くの検出が集中しています。
  • Eclipse Timing VariationsおよびTransit: Eclipse Timing Variationsはほんの少しのデータポイントで、この方法自体が比較的少ないことがうかがえます。Transit法は広い範囲にわたってデータが分散しており、特に一部のデータがかなり遠距離で発見されたことを示しています。
  • Astrometry:非常に狭い距離範囲でのみデータが存在しており、この方法が特定の距離範囲での検出に特化していることが示唆されます。
  • その他の方法(Transit Timing Variations, Orbital Brightness Modulation, Microlensing, Pulsar Timing, Pulsation Timing Variations):それぞれ比較的限られた距離範囲で検出が行われており、特定の距離において有効であることがうかがえます。

この図全体として、発見方法ごとに検出距離に特徴があることがわかります。特定の方法は特定の距離範囲で有効であり、他の方法は異なる距離範囲で効果的であることが視覚化されています。

GPT-4 Turboによる解説

この図は異なる方法による太陽系外惑星(エキソプラネット)の検出距離のデータを示しています。各ボックスプロットは、特定の検出方法によって検出された惑星の距離の分布を表しています。

  • 放射速度法 (Radial Velocity):この方法で検出された惑星は主にごく近い距離にあります。中央値が低く、分布も狭いです。
  • イメージング (Imaging):比較的近い距離に集中しているものの、幅が広がっており、より遠い距離の惑星も含みます。
  • 食のタイミング変動 (Eclipse Timing Variations) と トランジット法 (Transit): 食のタイミング変動は比較的少数のデータポイントで、トランジット法はより多くのデータポイントを持ちますが、どちらも距離の範囲が広いです。
  • 天体位置学 (Astrometry) と トランジットタイミングの変動 (Transit Timing Variations):これらの方法では非常に狭いデータ範囲を見ますが、距離自体は広範囲に渡っています。
  • 軌道の明るさの変調(Orbital Brightness Modulation)、マイクロレンズ (Microlensing)、パルサータイミング (Pulsar Timing)、脈動タイミング変動 (Pulsation Timing Variations) :マイクロレンズは特に遠距離の惑星を検出するのに有効であり、他の3つの方法もより遠距離の惑星に有効であることを示しています。特にパルサータイミングは非常に遠い距離で惑星を検出する能力を持っています。

この図は、エキソプラネット検出方法がどの距離でどれだけ有効かを理解するのに有用です。それぞれの方法が最も効果的な距離範囲が異なっており、それによって科学者たちは様々な種類の惑星系を研究する上で情報を得ることができます。

全体的な回答としては両方とも無難な感じに収まっているのですが、やはり具体的な数値には注意が必要で、広範囲に渡るという表現も何と比較してなのか微妙なので除外した方が良いと思います。また、専門用語に関しても果たしてこのような翻訳で良いものか微妙なものが多いです(天体物理は専門外なのでチェック漏れがあるかもしれせんが)。Radial Velocityの一般的な訳語は「視線速度」ですが、ここでは「放射速度」と訳しています。Astrometryに関しても、「天体位置学」よりもカタカナの「アストロメトリ」の方が一般的な様です。これらの専門用語に関しては、無理に翻訳しない方が無難だと思います。(どうしてもというなら括弧で直訳を入れるものありかと)

さて、GPT-4oとGPT-4 Turboを画像の解析に使ってみましたが、やはり、数値の正確性などについてはあまり大幅な改善点は見られませんでした。Open AI APIの注意 (https://platform.openai.com/docs/guides/vision/limitations) にあるように画像の細かい位置や文字の読み取りには限界があります。したがって、ChatGPTに丸投げしてクロスチェックなしに使うのは注意が必要ですね。

グラフの解説結果を比較してみた・応用編

確かに数値などについては必ずしも正確ではありませんが、ある程度の精度でGPTは回答してくれます。しかし、よく考えてみると今回使っているデータセットは、一般的なチュートリアルで使われるような有名なものでした。もしかして、GPTは事前学習で使われたデータセットに関する一般的な知識を交えて回答しているのではないかと思い、少し実験してみました。

ペンギンの性別・種をシャッフルして、体重も変えてみた

まず、先ほどのペンギンのデータセットで、性別や種のラベルを入れ替えて体重のスケールを変換してみました。これまでの分析で見たように、一般的にはオスの方がメスよりも体重が重い傾向があり、Gentoo種のオスが最も重い傾向があるのですが、入力するグラフの画像はそれに反したものにしてみました。また、体重も適当にスケールを変換して、10 kgから20 kgと事前知識からかけ離れた数値にしてみました。

ペンギンの体重の箱ひげ図(シャッフル)
ペンギンの体重のBoxenplotですが、性別や種のラベルを入れ替えて、体重も適当に変換しています。

それぞれのモデルの回答例は以下の通りです。

GPT-4oによる解説

このボックスプロットは、異なるペンギン種(Gentoo、Adelie、Chinstrap)の体重(Body Mass)を性別(Female, Male)ごとに比較しています。以下が主なポイントです:

  • Gentooペンギン:メス(Female)は、体重の中央値が約11,500gで、体重の範囲は約10,500gから13,000g です。
  • オス(Male)は、体重の中央値が約12,500gで、体重の範囲は約11,000gから14,000gです。
  • Adelieペンギン:メス(Female)は、体重の中央値が約9,000gで、体重の範囲は約8,000gから10,500gです。オス(Male)は、体重の中央値が約10,000gで、体重の範囲は約8,500gから11,500gです。
  • Chinstrapペンギン:メス(Female)は、体重の中央値が約13,000gで、体重の範囲は約11,500gから14,500gです。オス(Male)は、体重の中央値が約14,000gで、体重の範囲は約12,500gから15,500gです。

全体的に、どの種においてもオス(Male)の方がメス(Female)よりも体重が重い傾向にあります。また、体重が最も重いのはChinstrapペンギンのオス です。

GPT-4 Turboによる解説

このボックスプロットは、異なるペンギン種(Gentoo、Adelie、Chinstrap)におけるオスとメスの体重(体質量)の分布を示しています。各ボックスプロットには、中央値(箱の中の横線)、四分位範囲(箱の形)、およびデータのばらつきを表す外れ値(丸い点)が表示されています。

ポイントの要約は以下の通りです:

  • 種別の違い:Gentoo種のペンギンは、他の二つの種(AdelieとChinstrap)よりも体質量が大きいことが明らかです。Adelie種とChinstrap種のペンギンは比較的似た体質量の範囲を持っていますが、中央値に細かい違いが見られます。
  • 性別による違い:すべての種において、オス(シアン色のボックス)の体重がメス(オレンジ色のボックス)より一般的に重い です。性別による体重差は、特にGentoo種で顕著です。
  • 外れ値の観察:いくつかの外れ値が観察されており、特にGentoo種ではオスとメスの両方で外れ値が多いです。これは個体によって体質量が大幅に異なることを示しています。

この解析は、ペンギンの種と性別によって体質量に顕著な違いがあることを示しており、生物学的および生態学的研究において重要な情報を提供することができます。

ボックスプロットと勘違いしている点は相変わらずで、既に指摘したようにGPT-4oは、細かい数値を読み取る傾向がありますが、その正確性に関してはやはり限界があります。また、図に反してオスの方がメスよりも体重が重いと回答したり、GPT-4 Turboに関しては、Gentoo種が最も重いと回答している点が気になります。これは、この図と矛盾した回答であり、ペンギンの一般的な知識をカンニングして回答していることが伺えます。

GPT-4oにペンギンの体重を質問した結果

これは実際にGPT-4oにペンギンの体重を質問した結果は上記の通りとなります。数値はペンギンデータセットとややズレてはいますが、オスの方が重たく、Gentooが最も重い数値を回答しています。先ほどのGPT-4oの回答はこれらの知識に影響されている可能性があります。実際のデータ分析でのミス(ラベルの取り違えや計算ミスなど)に気が付く際には、この種の知識は役にたつこともありますが、現状のChatGPTはそこまで深く考えて回答はしてくれませんね。

Zagara KrathulmをZargasとKursax別に比較してみた

2つ目の実験として、同様にペンギンのデータセットでありますが、種名や性別などをChatGPTに考えてもらった名状し難い感じの単語に変換してみました。また、数値にかんしても同様に謎の単位に変換しておきます。

ペンギンの体重の箱ひげ図(単語置換版)
元はペンギンの体重のBoxenplotですが、性別や種、単位などをChatGPTに考えてもらった謎の単語に変換しています。

よし、これならペンギンの知識は使えまいということで、それぞれのモデルを使っての回答例の以下の通りです。

GPT-4oによる解説

この図は、異なるカテゴリ(Ishtrogos、Krummalthu、Zixagas Zargas)における二つのグループ(Agsaris と Naxsara)のデータ分布を示したボックスプロットです。縦軸は Zagara Krathulm の値を示しています。

主なポイントは以下の通りです:

  • 中央値の比較:すべてのカテゴリにおいて、Agsaris の中央値(中央値)は Naxsara より高いです。特に Zixagas では、Agsaris の中央値が非常に高く、約1100付近にあります。
  • データのばらつき:どのカテゴリにおいても、Agsaris と Naxsara のデータのばらつきを比較すると、Agsaris のばらつきが大きくなっています。Ishtrogos と Zixagas では、Naxsara のデータが比較的狭い範囲に集中しています(四分位範囲が狭い)
  • 外れ値:ほとんどのカテゴリで Agsaris と Naxsara の両方に外れ値が見られます。ただし、Agsaris のカテゴリでは明確に高い外れ値が存在します(特に Zixagas)。
  • 分布の形状:Agsaris のデータはすべてのカテゴリで右に裾野が長い形状を示しています(右へ歪んでいる)。Naxsara のデータは 比較的左右対称またはバラツキが少ない形状を示しています。

これらのポイントから、Agsaris のデータは高くばらつきも大きいことがわかります。一方で、Naxsara のデータは集中しており中央値も低めです。

GPT-4 Turboによる解説

この図は、異なるグループ間での「Zagara Krathuin」(おそらく特定の測定値やスコアを指す)の分布を示すボックスプロットです。ボックスプロットはデータの中央値、四分位範囲(第一四分位数から第三四分位数まで)、そして外れ値を視覚的に示すために用いられます。以下は、データセットの解析から得られるポイントです:

  • 地域とサンプルグループ:データは「Ishrogos」、「Krummalthu Zargas」、そして「Zixagas」という三つの地域に分かれており、各地域で二つの異なるグループ(「Agsaris」と「Naxsara」)のデータが示されています。
  • 中央値の比較:「Agsaris」グループは、すべての 地域で「Naxsara」グループに比べて中央値が高いです。これは「Agsaris」の方が「Zagara Krathuin」の値が高いことを意味します。
  • 分布の広がりと一貫性: 「Ishrogos」地域では、両グループとも比較的一貫したデータ分布を示しており、箱の大きさが他の地域に比べ小さいです。「Krummalthu Zargas」と「Zixagas」では、箱の大きさが大きく、特に「Agsaris」グループで顕著です。これはデータの分散が広いことを示しており、一貫性が低い可能性を指摘しています。
  • 外れ値の観察:ほとんどのボックスプロットには外れ値が存在しており、特に「Zixagas」の「Agsaris」グループに多く見られます。外れ値の存在はデータセットにおける異常値や特異値を反映しており、データの精査が必要かもしれません。

この図を用いて、各地域およびグループ間における「Zagara Krathuin」の分布の違いを詳細に比較・分析することができます。地域やグループごとの戦略や政策を検討する際の一助となるかもしれません。

今度の場合、ペンギンの場合のようなカンニングをせずに回答してくれました。Naxsara(ナクサラ)よりもAgsaris(アグサリス)のZagara Krathulm(ザガラ・クラトゥルム)が高いことは理解してくれているようです。ただし、単語の意味が不明すぎるので、GPT-4 Turboは、Zargas(ザルガス)を地域のことかとハルシネーションをしていたり、Ishtrogos(イシュロゴス)をIshrogos(イシュロゴス)、Krathulm(クラトゥム)をKrathuim(クラトゥム)とスペルを間違っていたりします(Zargasで検索すると、何やら架空の地名として出てきますが、Zargas – Constructed Worlds Wiki)。 ChatGPTは日本語などのアルファベット以外の読み込みが苦手とされていますが、このような一般的ではないspellの場合でも、同様に読み込み精度が落ちるようです。どのような場合に役に立つか分かりませんが、事前学習のバイアスによる回答への影響を低減するには、この種のマスクが有効そうです。

Vision Language Model

さて、上記の内容だけだとちょっと手抜きな気がするので、そもそもVisual Language Modelとは何をやっているのか簡単に解説しておきます。基本的な構造としては、画像をLLMの入力に変換させるEncoderを組み合わせたものです。つい先日(5/14)に、Google I/Oで、Google がOpen VLMである、PaliGemmaを発表しました。また、MicrosoftもPhi3-visionを5/21に発表するなど様々なモデルが公開されています。(New models added to the Phi-3 family, available on Microsoft Azure)

具体的なモデル構造の例として、PaliGemmaを紹介します。これは、Geminiのopen版であるGemmaにPaLI-3 (https://arxiv.org/abs/2310.09199)というVLMを参考に開発されたものです。(PaLI: Pathways Language and Image model)ここで画像の入力に関しては、SigLIP Image Encoderというものを利用して、通常のテキストからのインプットを合わせて、Gemmaで処理をして文章を作成する構造となっています。

PaliGemmaの構造
PaliGemmaのモデル構造(Hugging Face Blogより)

前回のBlogで解説したSakana AIのEvoVLMでは、Open VLMであるLLaVA-1.6-Mistral-7Bを画像処理の部分はそのままに、下流のLLMのモジュールをShisa Gamma 7B v1と進化的モデルマージし作られたモデルでした。このように構成されているVLMの学習では、画像と対応するキャプションが振られたペアのデータを利用することで、文章と画像という異なったモーダル間の関係性を学習します。性能の良し悪しについては、一般的に、各種ベンチマークのスコアを使って評価します。

まとめ

今回新しくOpenAIが公開したGPT-4o(omni)のAPIを利用して、以前にGPT-4 Turbo with visionで試したと同様にグラフの解説をしてみました。GPT-4についても、公開当時(2023/11/06)のものから2024/04/09にアップデートされたバージョンを採用し、両者の問答を比較しました。GPT-4oの方が細かい数値を多く回答する傾向がありましたが、やはり正確性やデータサイエンスの知識には両者ともに限界があることが分かりました。更に、一般的な知識やデータセットに関する情報も回答に影響を与えることがあり、ちゃんと与えた画像を読み取っての回答しているのかと疑問も残ります。将来的にモデルの改善により飛躍的に精度が向上する可能性はありますが、現状ではそれほど劇的な改善ではないようです。

連日、新しいLLMが発表されClaude 3の方が、いやGeminiの方が賢い、みたいな話が飛び交っていますが、これらのAIは理解する能力を正しく持っているのでしょうか?というのも、結局、LLMが生成する文章の良し悪しの評価は難しく、その評価は曖昧で主観的なものにならざるを得ません。今回の実験でも、明らかに数値のミスや論理的な間違いなどは指摘できますが、同じプロンプトであっても、生成される文章は異なり優劣の判断も難しいです。

そのため典型的な生成AIの性能の判断では、多くはクローズド・エンド型の質問(Yes/Noや選択問題のように回答が限定されるもの)によるベンチマークテストを評価・比較することが多いです。この利点は、回答されたテキストの正確さを定量的に評価することができます。しかし、この種のスコアを目標にすると、結局ベンチマークをハックすることにならないかと懸念があります。実際、よく使われる数学能力のベンチマークテスト(GSM8k)に対して、テストと類似した問題をあらかじめ丸暗記しており、新しい問題に対しては性能を発揮できないこと可能性が指摘されています(“A Careful Examination of Large Language Model Performance on Grade School Arithmetic”)。また、CyberAgent Developers Blog (【画像から言語へ】生成AI(VLM)の現状とビジネス応用の壁を考える)では、生成AIのビジネス応用への難しさとして、この種の生成AIの性能評価の難しさについて指摘されています。生成AIは、確かにもっともらしい回答を生成できますが、利用者が正否を判断できない物事に利用することは怖いですね。ビジネスの課題や目標となる指標を適切に設定して活用する必要があります。

グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。皆さんのご応募をお待ちしています。

参考資料

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事