LLM評価指標、HumanEvalとMBPPとは?
HumanEvalとMBPPとは(簡単に)?
HumanEvalは、プログラム合成の能力を評価するためのベンチマークです。Pythonのプログラミング問題を解くことができるかどうかを測定します。
一方、MBPP(Mostly Basic Python Problems)は、入門レベルのプログラマーが解けるように設計されたPythonのプログラミング問題の集合です。プログラミングの基礎や標準ライブラリの機能などをカバーしています。
MBPPは、HumanEvalと同じくプログラム合成の能力を評価するベンチマークですが、より基本的な問題に焦点を当てています。一方、HumanEvalはより複雑で多様な問題を含んでいます。
このように、HumanEvalとMBPPは同じ分野のベンチマークですが、それぞれ異なる難易度と範囲を持っています。自然言語処理システムのプログラム合成の能力を総合的に判断するには、サービス事業者のユースケースに従ってベンチマークの判断を行うことが望ましいでしょう。
詳しい説明は以下に記述。
参考サイト
HumanEval参考:
https://github.com/openai/human-eval
MBPP参考:
NLPについて
自然言語処理(NLP)は、人間の言語をコンピュータに理解させる技術のことです。NLPは、検索エンジン、チャットボット、翻訳システムなど、私たちの日常生活に欠かせないサービスを提供しています。
しかし、NLPの能力は、言語だけにとどまりません。最近では、NLPの一種である言語モデルが、プログラミングの能力も持つことが分かってきました。言語モデルとは、ある文脈において、次に来る単語や文字の確率を予測するモデルのことです。例えば、「今日はいい天気だから」という文が与えられたとき、「散歩に行こう」という続きが高い確率で予測されます。
言語モデルは、大量のテキストデータから学習します。その中には、プログラミング言語で書かれたコードも含まれています。そのため、言語モデルは、自然言語だけでなく、プログラミング言語も一種の言語として扱うことができます。そして、プログラミング言語の文法や構造を学習した言語モデルは、プログラム合成と呼ばれるタスクに挑戦することができます。プログラム合成とは、ある仕様や要求に従って、コードを自動的に生成するタスクのことです。
プログラム合成は、人間のプログラマーにとっても難しいタスクです。しかし、言語モデルは、驚くべき成果を示しています。例えば、OpenAIが開発したCodexという言語モデルは、GitHub Copilotというサービスの中核を担っています。GitHub Copilotは、プログラマーがコードを書く際に、自動的に候補や提案を出してくれるサービスです。Codexは、GitHub上の公開されたコードから学習した言語モデルであり、PythonやJavaScriptなどのさまざまなプログラミング言語に対応しています。
では、Codexや他の言語モデルのプログラム合成の能力をどうやって評価するのでしょうか?そのためには、標準的なベンチマークタスクが必要です。ベンチマークタスクとは、ある能力を測定するための問題集や評価基準のことです。例えば、自然言語処理では、GLUEやSuperGLUEというベンチマークタスクがあります。これらは、文章理解や推論などのさまざまなタスクを含んでおり それぞれのタスクに対する正答率や精度などで性能を評価します。
HumanEval
プログラム合成におけるベンチマークタスクの一つがHumanEvalです。HumanEvalはOpenAIが提案したものであり 164個のPythonのプログラミング問題から構成されています。各問題は、関数のシグネチャ、ドキュメンテーション、本体、および複数のユニットテストからなります。言語モデルは、関数のシグネチャとドキュメンテーションから、関数の本体を生成することが求められます。そして、生成されたコードがユニットテストに合格するかどうかで性能が評価されます。
HumanEvalは、プログラム合成の能力を評価するためのベンチマークタスクとして優れていますが 一方で、ある問題点も指摘されています。それは、HumanEvalの問題が人間によって作成されているため 人間のプログラミングスタイルや癖に影響されている可能性があるということです。例えば、人間は変数名やインデントなどに個人差がありますが 言語モデルはそれらを模倣する必要はありません。また、人間は自分の得意な分野や興味のある分野に偏って問題を作成するかもしれませんが 言語モデルはより広範な分野に対応する必要があります。
MBPP(Mostly Basic Python Problems)
そこで、HumanEvalとは異なるアプローチでプログラム合成の能力を評価するためのベンチマークタスクが提案されました。それがMBPP(Mostly Basic Python Problems)です。MBPPは、約1,000個のPythonのプログラミング問題から構成されていますが HumanEvalと違って、人間ではなく機械によって自動生成されています。MBPPは、入門レベルのプログラマーが解けるように設計された問題を含んでおり プログラミングの基礎や標準ライブラリの機能などをカバーしています。各問題は、タスクの説明、コードの解答、および3つの自動テストケースからなります。言語モデルは、タスクの説明からコードの解答を生成することが求められます。そして、生成されたコードが自動テストケースに合格するかどうかで性能が評価されます。
MBPPは、HumanEvalと同じくプログラム合成の能力を評価するためのベンチマークタスクですが より基本的な問題に焦点を当てています。一方、HumanEvalはより複雑で多様な問題を含んでいます。
HumanEvalとMBPPの比較
HumanEvalとMBPPは、プログラム合成の能力を評価するためのベンチマークタスクですが それぞれ異なる特徴や難易度を持っています。それらを比較してみましょう。
まず、問題数についてです。HumanEvalは164個の問題から構成されていますが MBPPは約1,000個の問題から構成されています。これは、HumanEvalの約6倍の問題数です。MBPPは、機械によって自動生成された問題なので、人間が作成するよりも多くの問題を用意することができます。また、MBPPは、さまざまな分野やトピックに関する問題を含んでおり、言語モデルの汎用性を評価するのに適しています。
テスト例
この問題では、数のリストを受け取って、その数の二乗の和を返す関数を作成することが求められます。この問題を解くには、リストの要素をループで回して、二乗して足し合わせるだけで十分です。このように、MBPPの問題は、言語モデルにとって簡単なケースやルールが多くあります。
最後に、問題の評価方法についてです。HumanEvalとMBPPは、それぞれ異なる方法で生成されたコードの正しさを判定します。HumanEvalは、各問題に対して複数のユニットテストを用意しており 生成されたコードがそれらに合格するかどうかで評価します。ユニットテストとは、コードの一部分が正しく動作するかどうかを確認するためのテストコードのことです。例えば、上記の回文判定の問題では、以下のようなユニットテストがあります。
assert is_palindrome("racecar") == True
assert is_palindrome("hello") == False
assert is_palindrome("A man, a plan, a canal, Panama") == True
これらのテストコードは、`is_palindrome`という関数に様々な文字列を入力して、期待される結果が返ってくるかどうかを検証します。生成されたコードがこれらのテストコードに合格すれば、正しいと判定されます。
一方、MBPPは、各問題に対して正解のコードが用意されており 生成されたコードと正解のコードが同じ出力をするかどうかで評価します。正解のコードとは、機械によって自動生成されたものであり タスクの説明に従って正しく動作することが保証されています。例えば、上記の二乗和計算の問題では、以下のような正解のコードがあります。
def sum_of_squares(numbers):
# Your code here
result = 0
for num in numbers:
result += num ** 2
return result
このコードは、数のリストを受け取って、その数の二乗の和を返すことができます。生成されたコードがこのコードと同じ出力をするならば、正しいと判定されます。
まとめ
HumanEvalとMBPPは、プログラム合成の能力を評価するためのベンチマークタスクです。HumanEvalは人間によって作成された複雑で多様な問題を含んでおり ユニットテストによって評価します。MBPPは機械によって自動生成された基本的な問題を含んでおり 正解のコードによって評価します。両者は補完的な関係にあり 自然言語処理システムのプログラム合成の能力を総合的に測定するには 両方のベンチマークタスクを利用することが望ましいでしょう。