私の経歴は機械工学ですので、この分野への無知をご容赦ください。
私はプログラミングとソフトウェア開発を本当に楽しんでいます。また、最近私はスタンフォード大学のAndrew Ng教授が教える無料のオンライン機械学習(ML)クラスを受講しました。リンク ここ 。
この教授が、MLが影響を与えない領域を見つけるのは難しいと言っているのを聞いたことがあります。
質問
だから私の質問は、機械学習をコード開発に適用するためにこれまでにどのような研究が行われたのですか?デバッグはどうですか?
可能であれば、リソース/情報源/科学論文を含めてください。
MLおよびソフトウェア開発(またはプログラミング)を頻繁に検索すると、ソフトウェア開発(またはプログラミング)の結果につながるため、私はこれを検索できませんでした。 )MLアプリケーションの。
ファジング は、機械学習を適用できるテスト方法です。ファジングは、自動化された探索的テストの領域でテストする方法です。多数の入力を実行してエラーを探すことにより、ソフトウェアの欠陥を見つけようとします。未処理の例外は最も単純なカテゴリですが、スマートな実装はMLを使用して疑わしい出力を見つけることができます。ただし、プロセスをより効率的にするために、このドメインではMLが主に使用されます。これは、MLを使用して、「興味深い」入力でトレーニングすることにより、可能なすべての入力のテストを回避することで機能します。 (失敗を引き起こす可能性のある類似しない入力)
はい。この地域は今暑いです。これは「ビッグコード」と呼ばれ、DARPAはそれに4000万ドルを投入します。 http://www.darpa.mil/program/mining-and-understanding-software-enclaves 。ファンロングの預言者や創世記のシステムなど、このパッチからいくつかの印象的な結果が得られました。これらは、正しいパッチの学習モデルを使用してプログラムのバグを自動的に修正できます。マーティン・ベチェフと彼の学生であるベセリン・レイチェフもこの分野の先駆者でした。おそらく、最も印象的な結果はJSNice( http://jsnice.org/ )であり、「JavaScriptコードを最小化することができます。
全体として、ビッグコードのアイデアはその約束を果たしていません。データがまばらすぎて、変数名よりも興味深いものを学習できません。私はまだこのDARPAプログラムから一部資金を提供されていますが、私の研究室はほとんどその作業を停止しています。その点で、DeepCoderについて最後に聞いたのは、最新のプログラム合成と比較してかなり悲惨な結果が得られるということです。
自動プログラミング用の最も成功したツールは、SMTソルバーのような非MLメソッドに依拠しています。 PL会議(例:PLDI、POPL、OOPSLA)または学術ソフトウェアエンジニアリング会議(例:ICSE、FSE、ISSTA、ASE)の議事録を見ると、多くの例が表示されます。
Microsoftは DeepCoder を開発して、ディープラーニングを使用して、指定された入力と出力からメソッド本体を予測しています。それが私が知っている唯一の例です。
Meta-Genetic Programming は同様の野心を持つ研究分野であると言えますが、知識があるほど十分に知っているとは言えません。
遺伝的プログラミングは2015年にニュースになりました-- muScalpel は、両方のユニットテストを一種のトレーニングセットとして使用して、あるプログラムから別のプログラムに機能を移植するソリューションを進化させました。
だから私の質問は、機械学習をコード開発に適用するためにこれまでにどのような研究が行われたのですか?デバッグはどうですか?
関連する質問は、コードの生成とコンパイルの機械学習手法に関するものです( transpilers および compilers は、コードを自動的に「開発」するための方法として実際にコードを作成する方法として想像できるためです)いくつかの高レベルの言語)。
これについては、たとえば MILEPOST GCC など、いくつかの論文が発表されています。
また、デバッグまたは静的ソースコード分析(またはあらゆる種類の 静的プログラム分析 )のための機械学習手法に関する論文をググることもできます。
また、質問に関連する 人工知能のブートストラップに関するJ.Pitratのブログ も参照してください。
私は すべてのコーディング関連の機械学習のトピックに関する広範なリーディングリスト を見つけました。
ご覧のように、人々はコーディングに機械学習を適用しようとしていますが、常に非常に狭い分野で、あらゆる方法のコーディングやデバッグを処理できるマシンだけではありません。
この回答の残りの部分では、比較的広い範囲の「デバッグ」マシンと、なぜこれがまだ実際に試行されていないのか(トピックに関する私の研究が示す限り)に焦点を当てています。
回答の長い部分を編集しました。まとめると(次の部分で重要です)、現在の機械学習の方法論を踏襲すると、人間が学習できるものは何でも、機械も同様です。私たちは、物理領域(CPU速度、マシンのサイズなど)によってのみ制限され、学習アルゴリズム自体の適用範囲の制限ではありません。
機械学習をコード開発に適用するためにこれまでに行われた研究は何ですか?デバッグはどうですか?
ここでの問題は、それが不可能であることではなく、信じられないほど複雑なトピックであることです。
人間は、誰もが同意する普遍的なコーディング標準を定義することすらしていません。 SOLIDのような最も広く合意されている原則でさえ、どれくらい深く実装する必要があるかについての議論の源です。すべての実用的な目的のために、 SOLID財政的(または時間的)制約がない限り、ほとんどの開発が発生する民間部門では不可能である場合を除き、完全に遵守することは不可能です。SOLIDはガイドラインであり、ハードリミットではありません。
正誤の客観的な尺度がない場合、機械に正/負のフィードバックを与えて学習させるにはどうすればよいでしょうか?
せいぜい、多くの人がマシンに自分の意見を与えることができ(「これは良い/悪いコードです」)、マシンの結果は「平均的な意見」になります。しかし、これは必ずしも正しい解決策と同じではありません。可能ですが、そうであるとは限りません。
次に、特にデバッグの場合、特定の開発者が特定のタイプのバグ/ミスを導入する傾向があることを認識することが重要です。間違いの性質は、場合によってはそれを導入した開発者の影響を受けることがあります。
たとえば、私は仕事で他の人のコードのバグ修正に頻繁に関与しているので、各開発者がどんな種類の間違いを犯しやすいかについて、一種の期待を抱いています。特定の問題を考えると、開発者Aは構成ファイルの更新を忘れがちですが、開発者Bは、不適切なLINQクエリを書き込むことがよくあります。開発者に基づいて、私は最初に設定ファイルまたはLINQに目を向けるかもしれません。
同様に、私は現在コンサルタントとしていくつかの会社で働いていましたが、バグの種類が特定の種類の会社に偏っている可能性があることをはっきりと見ることができます。結論を述べることは難しいことではありませんが、明確な傾向があります。
機械はこれを学習できますか?開発者Aが構成を台無しにする可能性が高く、開発者BがLINQクエリを台無しにする可能性が高いことを理解できますか?もちろんできます。前に言ったように、人間が学ぶことができるものは何でも、機械も学ぶことができます。
しかし、マシンにあらゆる可能性を教えたことをどのようにして知っていますか?小さな(つまり、グローバルではない)データセットを提供し、それがバグの全範囲を表すという事実を知るにはどうすればよいでしょうか。または、代わりに、普遍的に使用できるデバッガーを作成するのではなく、特定の開発者/会社を支援する特定のデバッガーを作成しますか?
機械学習デバッガを要求することは、機械学習シャーロックホームズを要求することに似ています。作成することはおそらく不可能ではありませんが、多くの場合、デバッガ/シャーロックであるという根本的な理由は、主体ごとに異なる主観的な評価に依存しており、信じられないほど多様な知識/潜在的な欠陥に触れています。
すぐに証明できる正しい/正しくない結果がないため、マシンを簡単に教えることができず、マシンが順調に進んでいることを確認することが困難です。
Communications of the ACMの最近の記事で 数学を使用して収益を上げる Erik Meijerは、システムおよびインフラストラクチャグループのGoogleシニアフェローであるJeff Deanを引用しています。
Googleが今日ゼロから作成された場合、その多くはコード化されずに学習されます。
この記事では、研究分野における最近の活動について概説します。有料の壁の背後にありますが、コーディングと機械学習/統計の理論的な類似点に興味がある場合は、読む価値があるかもしれません。記事の最後にあるリファレンスリストも参考になるでしょう。
例として、この記事は WebPPL、Webの確率的プログラミング を参照しています。
機械学習を使用してマイクロサービスをデバッグする1つの使用例を次に示します。 機械学習を使用したマイクロサービスパフォーマンスデータの分析 でいくつかの取り組みを文書化しました。ここで、マイクロサービスの負荷テストから収集されたパフォーマンスデータから決定ツリーをトレーニングし、環境問題に関する洞察を与えてくれたツリーを研究しましたパフォーマンスのバグを診断して修正します。