GPT4 vs Claude3 vs Llama3 数理統計篇
はじめに
Meta社が4月19日にLlama3を発表しました。
オープン・ソース・モデルでありながら、クローズド・モデルと同等の性能が報告されています。
これを受けて、LPUを開発するGroq社が一部界隈で話題になっています。
LPUとは、GPUに比べ爆速な推論を実現する計算処理ユニットです。
同社はLPUを用いて、ChatGPTのようなチャット型AIサービスGroqを提供しています。
Groqの裏側ではGroq社が自社開発したモデルではなくオープン・ソース・モデルが動いており、その1つにLlama3が追加されたことから、ChatGPTやClaudeと同等性能かつ、遥かに速いレスポンスを備えたAIが登場するのではないか、との期待が高まり、一部界隈で注目が集まっています。
とは言え、Llama3+Groqってぶっちゃけどのくらい速いの? 回答精度はどうなの? と気になります。
本記事では、取り急ぎ雑にGPT4とClaude3と比較してみました。
Gemini1.5との比較もそのうちできればと。
比較内容
手元にあった数理統計の教科書から適当に(入力トークン数が少なくて済みそうな問題を)20問選んで、それぞれGPT4-Turbo、Claude3-Opus、Llama3-70BのAPIにリクエストします。
同時に各問題のリクエスト処理にかかった時間を計測しておきます。
具体的な問題一覧は後述。
# | モデル | API提供元 |
---|---|---|
1 | gpt-4-turbo | OpenAI API |
2 | claude-3-opus-20240229 | Anthropic API |
3 | llama3-70b-8192 | Groq API |
Claude3にはシステムプロンプトがないので、Claude3のプロンプトには、GPT4でシステムプロンプトに書いている内容も含めてリクエストしました。
また、Llama3は正式には日本語対応していないため、回答を日本語で生成するようシステムプロンプトで指示をしています。
import openai
import anthropic
from groq import Groq
import time
def call_gpt(prompt):
"""OpenAI APIのGPT4-Turboにリクエスト"""
sys_prompt = """
あなたは統計の専門家です。#[問題]について、#[回答方法]に沿って回答を出力してください。
#[回答方法]
回答過程を一歩ずつ論述する。
"""
# Start the timer
start_time = time.time()
completion = openai.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": sys_prompt},
{"role": "user", "content": prompt}
]
)
# End the timer
end_time = time.time()
processing_time = end_time - start_time
# Extract output
output = completion.choices[0].message.content
return (output, processing_time)
def call_claude(prompt):
"""Anthropic APIのClaude3-Opusにリクエスト"""
# Start the timer
start_time = time.time()
message = client.messages.create(
model="claude-3-opus-20240229",
max_tokens=1024,
messages=[
{"role": "user", "content": prompt}
]
)
# End the timer
end_time = time.time()
processing_time = end_time - start_time
# Extract output
output = message.content[0].text
return (output, processing_time)
def call_groq(prompt):
"""Groq APIのLlama3-70Bにリクエスト"""
sys_prompt = """
あなたは統計の専門家です。#[問題]について、#[回答方法]に沿って回答を出力してください。
#[回答方法]
回答過程を一歩ずつ論述する。回答は日本語で出力する。
"""
# Start the timer
start_time = time.time()
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": sys_prompt,
},
{
"role": "user",
"content": prompt,
}
],
model="llama3-70b-8192",
)
# End the timer
end_time = time.time()
processing_time = end_time - start_time
# Extract output
output = chat_completion.choices[0].message.content
return (output, processing_time)
比較結果
図にはモデルごとに全20問のリクエスト処理時間をプロットしました。縦軸は秒単位です。
推論速度ではLlama3-70Bが圧勝です。
噂に違わずGroqが爆速であることが分かります。
また、GPT4-TurboよりClaude3-Opusの方がやや速いかな、という印象です。
次に回答精度を見ていきます。
問題一覧は以下です。統計検定2級〜準1級・1級レベルの問題です。
# | 問題 |
---|---|
0 | #[問題][0,6]上の一様分布の密度関数、期待値、分散を求めよ。 |
1 | #[問題][0,6]上の一様分布においてチェビシェフの不等式が成立することを示せ。 |
2 | #[問題]ポアソン分布の分散の式を証明せよ。 |
3 | #[問題]負の二項分布の確率密度関数を導出せよ。 |
4 | #[問題]正規分布の再生性を証明せよ。 |
5 | #[問題]二項分布の再生性を証明せよ。 |
6 | #[問題]ポアソン分布の再生性を証明せよ。 |
7 | #[問題]2つの壺A、Bの中に3個のボールを投げ入れる。壺Aの中に入ったボールの数をX、ボールの入っている壺の数をYとすると、XとYの同時確率分布を求めて、XとYは無相関であるが独立ではないことを示せ。 |
8 | #[問題]あるデパートの注文服売場の販売員のところへ来る1時間あたりの来客数は |
9 | #[問題]母集団分布がパラメータ |
10 | #[問題]確率変数 |
11 | #[問題]確率変数 |
12 | #[問題]ガンマ関数の漸化式とベータ関数からベータ分布の平均と分散を求めよ。 |
13 | #[問題]XとYは互いに独立な区間(0,1)上の一様分布に従う確率変数とする。U=XY、V=X/Yと変換した時の(U,V)の同時密度関数を求めよ。また、Vの周辺密度関数を求めよ。 |
14 | #[問題]確率変数 |
15 | #[問題]確率変数 |
16 | #[問題] |
17 | #[問題] |
18 | #[問題] |
19 | #[問題]二項分布の成功確率 |
1つ誤算だったのが、各モデルの生成回答に含まれる式の記法がバラバラで非常に読みにくい点。
全ての回答を詳細に確認はできていないものの、パッと眺めた限り総合的に一番優れているのはClaude3-Opusの印象。
Llama3-70Bの計算ミスが他より多かったのは、そもそもの性能の問題として数値計算が苦手なのか、プロンプトを日本語で入力したからなのか、今回の結果だけで判断するのは難しい。
- GPT4-TurboよりもClaude3-Opusの回答の方が日本語の文章として読みやすい。
- Llama3-70Bの回答には英語と日本語が混在したり、絵文字が登場したりする。
- #1の問題はGPT4-TurboもClaude3-Opusも正解だが、Claude3-Opusの回答の方がシンプルで分かりやすい。GPT4-Turboの回答は冗長。Llama3-70Bは分散の計算を間違えている。
- #8の問題はClaude3-Opusのみ正解。GPT4-Turboは求め方は合っているのに途中で終わってしまって最終的な解が出ていない。Llama3-70Bも求め方は合っているが途中で計算ミスしている。
- #10の問題は3モデルとも間違えているものの、Claude3-Opusはプロンプト中の
と\lambda を取り違えたから答えも間違っただけで導出ロジック自体は正しい。GPT4-TurboとLlama3-70Bの回答は嘘。\frac{1}{\lambda}
Discussion