e4exp / paper_manager_abstract

0 stars 0 forks source link

Program Synthesis with Large Language Models #614

Open e4exp opened 3 years ago

e4exp commented 3 years ago

本論文では、汎用プログラミング言語におけるプログラム合成のための、現世代の大規模言語モデルの限界を探る。 我々は、MBPPとMathQA-Pythonという2つの新しいベンチマークで、244Mから137Bのパラメータを持つモデルのコレクションを、少数ショットと微調整の両方の領域で評価した。 これらのベンチマークは、自然言語の記述から短いPythonプログラムを合成するモデルの能力を測定するために設計されています。

Mostly Basic Programming Problems(MBPP)データセットには、974のプログラミング・タスクが含まれており、エントリーレベルのプログラマーが解けるように設計されています。 MathQA-Pythonデータセットは、MathQAベンチマークのPythonバージョンで、より複雑なテキストからコードを合成するモデルの能力を評価する23914の問題が含まれています。 どちらのデータセットでも、合成性能はモデル・サイズに応じて対数線形的に変化することがわかりました。 我々の最大のモデルは,コードデータセットでの微調整を行わなくても,適切に設計されたプロンプトを用いた数回の学習により,MBPPの問題の59.6%の解を合成することができる. データセットの一部を取り出して微調整することで、ほとんどのモデルサイズでパフォーマンスが約10%向上した。 MathQA-Pythonデータセットでは、最大のファインチューニングを施したモデルで83.8%の精度を達成した。 さらに、モデルがコードについて対話する能力を研究し、人間のフィードバックを取り入れてソリューションを改善した。 その結果、人間からの自然言語によるフィードバックは、モデルの初期予測と比較してエラー率を半減させることがわかりました。 さらに、エラー分析を行い、モデルのどこが足りないのか、どのような種類のプログラムを生成するのが最も難しいのかを明らかにしました。最後に、プログラムの実行結果を予測するためにモデルを微調整することで、モデルの意味的な根拠を探ります。 その結果、最良のモデルであっても、特定の入力に対するプログラムの出力を予測できないことがわかりました。

e4exp commented 3 years ago

1 はじめに

プログラムの合成は,人工知能研究の長年の目標であり[Manna and Waldinger, 1971, Waldinger et al., 1969, Summers, 1977, Shaw et al., 1975, Pnueli and Rosner, 1989, Manna and Waldinger, 1975],古くは1940年代や50年代にまで遡る[Copeland, 2012, Backus et al., 1957]。 近年、プログラムを合成するための技術(記号的なものと「神経記号的なもの」の両方)に対する関心が再燃しているが[Balog et al., 2017, Devlin et al., 2017, Ellis et al., 2018, 2020, Odena et al., 2020]、これらの技術は主に、制限されたドメイン固有言語(DSL)[Gulwani, 2011]や、より完全な機能を備えているが、それにもかかわらず、特に合成を念頭に置いて設計されている言語[Odena and Sutton, 2020]に適用されている。 PythonやC++のような近代的な汎用言語は、ほとんどの場合、ターゲットとしては手が届きませんでした。これは不幸なことで,可能なダウンストリーム・アプリケーションのセットが大幅に制限されてしまうからである. 汎用言語の様々な領域の問題を対象とした合成手法は、初心者と熟練プログラマーの両方のワークフローに利益をもたらす新しいツールを可能にする可能性があります。

この問題に対する新しいアプローチの可能性を示唆しているのが,研究文献から得られた2つの新たなテーマである(より詳細なレビューはセクション8を参照のこと). 第1に、大規模な言語モデルは、自然言語テキストを生成するための印象的な新しい能力を示しており[Brown et al., 2020, Raffel et al., 2019]、急速に拡大しているモデリングおよび推論タスクのセットを解決するための能力を示している[Devlin et al., 2019, big-bench collaboration, 2021]。 第2に、過去10年以上にわたり、機械学習アプローチがソースコードテキストに適用され、ソフトウェアエンジニアリングをサポートするさまざまな新しいツールが生み出されてきました[Allamanis et al. この作業には、CuBERT [Kanade et al., 2020]、CodeBERT [Feng et al., 2020]、PyMT5 [Clement et al., 2020]、code2vec [Alon et al., 2019]、およびコードで訓練された他のT5モデル [Mastropaolo et al., 2021]など、事前に訓練されたディープモデルが含まれています。 この2つのテーマを組み合わせると、自然言語用の大規模な言語モデルを、汎用言語でコードを合成するために活用できないかという問題が出てきます。 このようなモデルは、「トークン空間」でコードを出力するため、基礎となる言語の文法を明示的に符号化する必要はなく、データから学習することができる。 さらに、これらのモデルは大量のコードで学習することができるため、様々なライブラリがどのように相互作用するのか、人間が読める慣用的なコードとはどのようなものかを学ぶことができます。 最後に、大規模な言語モデルによって、より柔軟なタイプのプログラム仕様を検討することができます。 論理的制約や入出力例を用いてプログラムを指定するプログラム合成に関する古典的な研究[Gulwani et al.2017]とは対照的に、プログラムは短い自然言語記述によって指定することができ、場合によってはいくつかの(例えば、2または3の)入出力例と組み合わせることができます。 本論文では、大規模なTransformer言語モデルのコレクションを、汎用プログラミング言語で書かれた短いプログラムの合成に適用した場合の性能を研究しています。 問題とモデル出力の例を図1と図2に示す。 特に、本論文は以下のような貢献をしています。

我々の研究は、最近の2つの取り組みと密接に関連している。 1つ目はAPPSデータセット[Hendrycks et al., 2021]で、これはコーディングコンテストからの10,000問題のデータセットです。 Hendrycksら[2021]は、このデータで大規模な言語モデルを評価しており、具体的にはfinetuned GPT-2[Radfordら、2019]とGPT-Neo[Blackら、2021]、さらにGPT-3[Brownら、2020]による少数ショット予測を評価しています。 さらに、プログラミング競技会のデータに基づいてプログラム合成手法を学習・評価するためのデータセットがいくつか提案されている(8.3項)。 しかし,これらのベンチマークでの性能は一般的に低いものであった. これは、プログラミングコンテストの問題が、その問題を解くために必要な基本的なアルゴリズムを難解にするようなスタイルで書かれているためであると推測される。 これに対して、我々のデータセット「Mostly Basic Programming Problems」は、より基本的な、文字通りの問題の記述を含むように設計されています。 これにより、コードの生成や理解に直接関連する能力に焦点が当てられるようになったと考えています。

次に、独立して、Chenら[2021]は、GPT-3アーキテクチャに従ったコード上のトランスフォーマーLMであるCodexを発表し、簡単なプログラミング問題の新しいベンチマークでその合成性能を評価しました。 主な違いは、事前学習データの仕様と、モデルの性能を調査する方法にあります。 まず、我々のモデルのトレーニングセットは、プログラミングの質問と回答のサイトなど、コードを含むウェブページをややオーバーサンプリングしていますが(セクション3参照)、Chenら[2021]とは異なり、本稿で報告されている結果には、オープンソースコードの大規模なコーパスでのさらなる微調整ステップは含まれていません。 第二に、Chenら[2021]が導入したHumanEvalベンチマークは、名目上は我々のMBPPと似ていますが、いくつかの違いがあります。 小さな違いはプロンプトの種類です。 HumanEvalデータセットは一般的に望ましい機能のI/O例を含んでいますが、その数とフォーマットは一貫しておらず、プロのソフトウェアのdocstringsを模倣しています。 一方、我々のデータセットには、アサート文として書かれた3つのI/O例が一貫して含まれています。 また、MathQAデータセットでもモデルを評価しましたが、こちらは全く性格が異なります。 第三に、137Bまでのサイズのモデルの合成結果を報告する。 コードの微調整を行わない我々の一般的なLMであっても、数ショットの合成では無視できない性能を持つことがわかった。 また、非常に小さな(374項目)例のセットでそのモデルを微調整するだけで、合成タスクでの性能が劇的に向上することもわかった。 第四に、おそらく最も興味深いのは、我々のLMがどの程度インタラクティブなツールとして使用できるかを分析し、人間がこれらのモデルと対話することで成功率を大幅に向上させることができるという結果を示していることです。

最後に、このタスクにおける汎用言語モデルの性能を調査・理解するという目的に沿って、これらのモデルが生成したコードを評価できるかどうか、また、従来の数学的な単語問題を解決するコードを生成しても同様に効果があるかどうかについても調査しています。

e4exp commented 3 years ago

2 データセット

2つの新しいデータセットを作成した. 1つ目のMostly Basic Programming Problems (MBPP)は、全く新しいクラウドソースのプログラミングデータセットです。 2つ目は、MathQAデータセット[Amini et al., 2019]から派生していますが、問題の解答を短いPythonプログラムとしてキャストしています。

2.1 Mostly Basic Programming Problems

Mostly Basic Programming Problemsデータセットは、Pythonの基本的な知識を持つクラウドワーカーの内部プールにクラウドソーシングで構築された974の短いPythonプログラムを含んでいます。 クラウドソーシングの参加者には,短い問題文と,その問題を解決する自己完結型のPython関数1つと,その関数の意味的な正しさをチェックする3つのテストケースを書いてもらいました. また,参加者は3つのテストケースすべてに合格したグランドトゥルースのソリューションを提供しました. 参加者は,人間が説明なしでコードに変換できるような具体的な記述をするように指示されました. また,自己完結型のコード(つまり,自分自身で実行されるコード)を書き,コンソールに結果を出力しないように指示されました。 インターネットの参考資料の使用も認められています。 問題は,簡単な数値操作や標準的なライブラリ関数の基本的な使い方を必要とするものから,特定の注目すべき整数列の定義など,外部の知識を必要とするものまで多岐にわたっています. 図1は,問題文とそれに関連するテストケースの例と,その問題文に対応する最大のモデルのサンプルを示しています. データセットの内容をさらに特徴づけるために,質問のうち100問をランダムに抽出し,各質問に1つ以上の説明タグを割り当てました. これらの問題のうち,58% は数学的な性質のものであり(例:球体の体積を計算する),43% はリスト処理,19% は文字列処理,9% は整数列,2% はその他のデータ構造の使用を中心としたものでした. リファレンスソリューションのコード行数には,特に制限を設けませんでした. 平均値,中央値,最大値はそれぞれ6.8,5,50行でした. 自然言語による記述は、通常、それぞれ1文と短くなっています。 データセットを調査したところ,一般的ではない関数シグネチャが使用されていたり(リストとその長さを2つの別々の引数として関数に渡すなど),詳細が不足していたり,やや曖昧だったり(「Write a python function to count the number of squares in a rectangle」など),提供されているテストと対になっている関数で予期しない操作が行われていたりする問題がありました(floatをint型にキャストしてから返し,テストでは整数の比較を行うなど). そこで,質問の一部を手作業で検査,編集,刈り込みを行い,手作業で検証した426件の質問を作成し,これを編集済みデータセットと呼びます。 編集されたデータセットの各質問は,Pythonの標準的な関数のシグネチャを持ち,人間にとって曖昧さがなく,テストケースがテキストの説明を正確に反映していることを確認しました. ほとんどの実験を全データセットで行いましたが、セクション4.9では、編集済みデータセットのキュレーションの効果を分析しています。 後述の実験では、10個の問題を数撃ちゃ当たるで、500個の問題をテストデータセット(数撃ちゃ当たる推論と微調整モデルの両方を評価するために使用)、374個の問題を微調整で、残りを検証で使用しました。 編集済みデータセットを用いた評価では,オリジナルデータセットと編集済みデータセットの両方に登場する100個の問題を用いて,数撃ちゃ当たるでは10個の問題,微調整では374個の問題を同じように保持して比較を行いました. すべてのリファレンスコードがPython 3.6ですべてのテストに合格することをプログラム上で確認し,すべての問題をオープンソース化しました1.

image

2.2 MathQA-Python

MBPPの短い自然言語記述に比べて、我々の第2のデータセットは、異なる種類のプログラム合成タスクを代表しています。 MathQAデータセット[Amini et al., 2019]は、各データポイントが、数学的な単語の問題、その問題に対する複数の選択肢の答え、および正解を生成するドメイン固有の言語によるプログラムで構成されているデータセットである。 ソースコードでの事前学習がこのタスクに有用かどうかを評価するために、論文で与えられたドメイン固有言語のグランドトゥルースプログラムをPythonコードに変換することで、このデータセットをPythonプログラム合成のデータセットに変換します。 この変換後のデータセットを「MathQA-Python」と呼びます。 ループや条件分岐などの命令型制御フローの使用が多いMBPPと比較して、MathQA-Pythonには、ほとんどが直線的なコードでありながら、より複雑な自然言語記述が含まれている。 このデータセットの一例を図2に示します。 PythonコードとDSLコードの両方が、微調整と少数回の実験に使用されます。 少数精鋭の実験では、プロンプトでMathQAの問題の4つの例とそのPython(またはDSL)のソリューションを提供します。 モデルには、グランド・トゥルースの答えを計算するPythonまたはDSLコードを返すというタスクが与えられます。 サンプリングされたコードを実行して、意味的な正しさをチェックします。この正しさをチェックする方法では、MathQAデータセットをフィルタリングして、コードが宣言された数値解答に評価される問題のみを保持する必要があり、結果的に45%の問題が削除されました。 このフィルタリングの結果、23914個の問題が残り、そのうち19209個をトレーニングに、2822個を検証に、1883個をテストに使用しました。 DSLとPythonの間の変換は簡単で、それを実行するためのコードを提供しています2。

image

e4exp commented 3 years ago

3 モデルと方法

本論文で使用するモデルは、Webドキュメント、ダイアログデータ、Wikipediaを組み合わせて学習した密な左から右へのデコーダのみのTransformer言語モデル[Vaswani et al, 2017]です。 我々の実験は、2億4400万から1370億までの範囲の非埋め込みパラメータ・カウントを持つモデルを用いて行われた。 モデルの事前学習用データセットには,2.97Bの文書が含まれており,SentencePieceライブラリ[Kudo and Richardson, 2018]を用いて,32Kの語彙を持つ2.81TのBPEトークンにトークン化されています。 このデータには、質疑応答サイトやチュートリアルなど、コンピュータコードとテキストの両方が掲載されているWebサイトが含まれていますが、ソースコードファイル自体は、他のWebサイトにコードが登場する場合を除き、特に含まれていませんでした。 これらのコードとテキストを含むWebサイトは、トレーニング前のデータのうち、18.7BのBPEトークンを含む約13.8Mのドキュメントを構成しています。

MBPPとMathQA-Pythonの両方の合成機能を2つの体制でテストします。 まず、Brownら[2020]のように、数ショットのプロンプトを使用する。 図1(MathQA-Pythonの場合は図2)に示すように、プロンプトに対していくつかの例題を提示し、それらを連結して長いバージョンのプロンプトを作成します。 そして、このプロンプトを事前にトレーニングされたモデルに与え、完成させます。

次に、トレーニング・セットを用いてモデルの微調整を行う。 MBPPの場合、トレーニング・セットは非常に小さい(374例)ので、小さな学習率(最大のモデルで3e-5)で100ステップのみの微調整を行います。 MathQA-Pythonでは、より長い時間をかけて微調整を行いました。 実行結果は、ほぼ同様の方法で作成しました。 すべての合成実験において、トークン精度やBLEUのようなコード品質のプロキシではなく、サンプリングしたコードの機能的な正しさを測定しています(これについてはセクション4.7を参照)。 MBPPの合成実験では,コードを実行したときに一連のテストケースに合格するかどうかをチェックします(テストケースの例は図1を参照). テスト・データセットの各問題について、温度サンプリング(温度0.5)を使用して80個のコード・サンプルを生成し、そのサンプルに含まれるコードを意味的な正しさのテストに対して実行します。 MathQAの合成実験も同様である。 MBPPの実行実験では、モデルがコードを実行するのとまったく同じ結果を出すかどうかをチェックします。 greedy decoding(温度を0.0に設定)を使用して1つの近似的な最も可能性の高い世代を生成し、これをコードを実行して生成された文字列と比較します。