プログラム合成 – コードが自己書きすることを実現する
プログラム合成 - 自己書きするコードの実現
バズワードから直感へ(パート⅓)
おそらく聞いたことはあるけれど、完全に理解していない用語の一つが「プログラム合成(program synthesis)」です。これはAIがコードを書くための取り組みとして位置づけられることが多いです。この記事は、この概念を解明するための3部作の第1部です。ここでは、「プログラム合成」の意味的本質に焦点を当てます。明快さと分かりやすさを目指していますが、読みやすさのために一部の技術的な詳細は省略される場合があります。
「プログラム合成」を理解するためには、まず「プログラム」という用語に取り組む必要があります。では、まずは「プログラム」とは一体何なのかを考えてみましょう。
プログラム
基本的に、プログラミングとはコンピュータに何をするか指示することです。スマートフォンでリマインダーを設定したり、ソーシャルメディアの写真をカスタマイズしたり、トラフィックを最適化したり、このVoAGIの記事を設定したりするのは、すべてプログラミングです。理解を共有するために、プログラミングの三要素を見てみましょう:
- プログラマーはタスクを
プログラム
に変えます。 プログラマー
が与えるプログラム
は、インタープリター
が理解するものです。- インタープリターは
プログラム
を受け入れて処理を行います。
なぜプログラミングを学ぶ時間を費やすのでしょうか?それは、コンピュータが私たちには到底及ばない能力を持っているからです。一枚の写真からパノラマ写真を手動で繋ぎ合わせる必要はありませんし、私は電話のおかげで友人たちの誕生日をすべて覚えているわけではありません。ブログを直接皆さんに届けることもできません。
- PyTorchを使用して畳み込みニューラルネットワークを構築する
- 「AGENTS内部 半自律LLMエージェントを構築するための新しいオープンソースフレームワーク」
- 「大規模な言語モデルを使用した顧客調査フィードバック分析の強化」
プログラム合成
プログラム合成は、プログラミングを容易にするシステムです。GCCはアセンブリコードの記述を不要にし、スマートフォンのオペレーティングシステムは一枚の写真からパノラマ写真を作成します。このページの上部にある小さな緑色の「公開(publish)」ボタンをクリックすると、この記事がすべて送られてきます。プログラム合成により、あなたはプログラミング言語の強化バージョンで作業することができます。それを「Program++」と呼びましょう。これは元のプログラムよりも簡単です。
この合成器は中間人のような役割を果たし、あなたのProgram++を元のプログラムに変換します。この合成器をインタープリターと組み合わせると、高度なインタープリター「Interpreter++」が得られます。このアップグレード版は、あなたのProgram++(一般的には仕様と呼ばれることが多い)を受け取り、タスクを実行します。このプロセスは再帰的です。合成器とインタープリターの層を追加することで、プログラミングがますます容易になります。そのため、プログラム合成は単に「簡単なプログラミング」ということです。
現代のプログラム合成
プログラム合成の技術は、プログラム++/仕様
をできるだけシンプルにする芸術です。ChatGPTやCoPilotなどの最近のプログラム合成技術は、高レベルの要件からコードを生成し、「手書き」のコードの必要性を減らし、人為的なエラーを最小限に抑えることができます。
プログラムとプログラム合成の定義ができたら、問題についても正確に定義する必要があります。
問題
さて、プログラマはどのようにプログラムを書いて、インタープリタがタスクを正しく行うようにするのでしょうか?
タスクとしての仕様
タスクはさまざまな方法で指定できます。例えば、サラダを作るためのさまざまなレシピをイメージしてください。プログラムの正確さを検証するには、さまざまな基準を考慮する必要があります。サラダが美味しいかどうか、健康的かどうか、見た目が良いかどうかなどです。しかし、多くの現実のタスクの微妙なニュアンスは、計算的な理解から逃れてしまうことがしばしばあります。
問題としての仕様
仕様またはspec
は、人間とコンピュータがどのようなことを行う必要があるかについて合意するための方法です。入出力(単にI/Oとも呼ばれる)は、人間とコンピュータの両方に理解される形式です。
他の形式の仕様もあります。たとえば、最大化する目的関数、コンピュータの動作に対する制約のセット、または自然言語の文などです。ただし、そのspec
をどのように書くかには多くの自由度があります。異なるspec
は、異なる視点、構文、または粒度レベルで同じ問題を説明することができます。たとえば、数のリスト(L)をソートしたい場合、次のように提供することができます:
- 一連のI/Oペア: In₁[
3,2,1
] Out₁[1,2,3
] | In₂[0,-1,2
] Out₂[-1,0,2
] | In₃[5,8,100
] Out₃[5,8,100
] | In₄[9
] Out₄[9
] … - 1つの文:「整数のリストを昇順でソートします。」
- 数学的な関数: f( X ) = x₁≤ x₂≤ x₃ … ≤ xₙ
- 再帰的な定義: Sorted(L) ⇔ L[1] ≤ min( L[2:n] ) ∧ Sorted( L[2:n] )
同様に、サラダを作るためのspecは次のようになります:
- I/Oペア: In₁[
レタス
,トマト
,キュウリ
] Out₁[サラダ
] | In₂[キュウリ, シーザー
,トマト
] Out₂[サラダ以外
] - 自然言語:
レタス、トマト、キュウリを組み合わせる
- 制約ベース:
少なくとも1つの緑の野菜と1つのタンパク質のソースを含める必要があります。
正確さ
spec
があれば、コンピュータはプログラムを実行して入力から対応する出力を生成するかどうかを自動的に判断することができます。このプロセスを検証と呼びます。
今、シンプルな検証ツールが簡明な回答を提供します:True または False。 is_sorted( [1,2,4] ) =
True。組み合わせた要素 [tomatoes
, caesar
] はサラダの材料ですか? False。しかし、私たちはもう少し進化させることができます — いくつかの検証ツールは、単純なバイナリ回答を超えて、プログラムの実行結果の評価指標やスケールに入り込んでいます。
論理から学習へ
従来、プログラム合成は厳密な論理ルールやアルゴリズム的推論によって支配されている分野でした。しかし、機械学習技術の導入により、その風景は急速に変化しています。学習ベースのアプローチへのシフトは、プログラム合成の速度、精度、効率を革新しています。
多様なアプローチ:プログラム合成の分類 プログラム合成は一つの答えだけではありません。タスクのニーズに応じて、異なるアプローチや合成のタイプがより有利になることがあります。いくつかのタイプを探ってみましょう。
- 演繹合成 — 伝統的な方法。 形式手法、論理的なフレームワーク、アルゴリズム原理に依存します。高い精度を持ちますが、計算リソースを多く必要とする場合があります。信頼性が最も重要なクリティカルなシステムに適しています。
- 帰納的合成 — 現代的な方法。 主に機械学習技術とヒューリスティック手法によって推進されます。速度と適応性に優れていますが、演繹的な方法の厳密な精度に欠けることがあります。急速な開発サイクルとミッションクリティカルでないアプリケーションに最適です。
- 確率的合成 — 現実主義的な方法。 仕様や環境の不確実性に対処するために確率モデルを利用します。バランスの取れたアプローチを提供しますが、望ましい信頼性を達成するために微調整が必要な場合があります。一定の不確実性や変動が予想されるアプリケーションに適しています。
最後にいくつかの考えを述べさせてください…
人間の能力を超えたプログラム合成
私たちは制限する必要はありません。 私たちは、さらに進化し続ける合成ツールを構築することを目指しています!! 目標は、人間の能力を単に再現することではなく、現在の人類が対処できない新しい解決策を見つけ出すことです。これにより、医療、金融、そして宇宙の解読さえも新しい地平を切り拓く可能性があります…
さらなる読み物と参考資料
- 演繹合成に関するアルマンドの講義ノート ↩︎
- ニューロシンボリックプログラム合成に関する2021年の調査 ↩︎
- AlphaCodeによる競技プログラミング ↩︎
- コードでトレーニングされた大規模言語モデルの評価 ↩︎
- 機械学習と構成的意味論を結びつけるパーシー・リャンによる研究 ↩︎
- ニューラルセマンティックパーシングに関するACL 2018のチュートリアル ↩︎
- 子供はハッカーである ↩︎
- 認知の確率モデル ↩︎
- アルマンドのプログラム合成の定義と歴史に関する講義ノート ↩︎
- プログラム合成の最小限のガイド
- Microsoftのメンバーによるプログラム合成に関する2017年の調査 ↩︎
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「画像の匿名化はコンピュータビジョンのパフォーマンスにどのような影響を与えるのか? 伝統的な匿名化技術とリアルな匿名化技術の比較」
- ディープラーニングライブラリーの紹介:PyTorchとLightning AI
- 「Now You See Me (CME) 概念ベースのモデル抽出」
- 効果的な小規模言語モデル:マイクロソフトの13億パラメータphi-1.5
- 「BlindChat」に会いましょう:フルブラウザおよびプライベートな対話型AIを開発するためのオープンソースの人工知能プロジェクト
- 「コンテキストに基づくドキュメント検索の強化:GPT-2とLlamaIndexの活用」
- 「AIはどれくらい環境に優しいのか?人間の作業と人工知能の二酸化炭素排出量を比較する」