コード開発に適用される機械学習


16

私のバックグラウンドは機械工学ですので、この分野に対する私の無知をお許しください。

プログラミングとソフトウェア開発を本当に楽しんでいます。また、最近、スタンフォード大学のAndrew Ng教授が教える無料のオンラインMachine Learning(ML)クラスを受講しました。ここにリンクします

この教授が、MLが決して影響を与えない分野を見つけるのは難しいと言うのを聞いたことがあります。

質問

私の質問は、機械学習をコード開発に適用するためにこれまでにどのような研究が行われてきたかということです。デバッグはどうですか?

可能であれば、リソース/ソース/科学論文を含めてください。

多くの場合、ML およびソフトウェア開発(またはプログラミング)を検索すると、MLアプリケーションのソフトウェア開発(またはプログラミング)の結果につながるため、これを検索する運はありませんでした。


コードを記述するコードについての質問ですか、それとも機械学習を実装するためのコーディング技術についての質問ですか?
ロバートハーベイ

コードを記述したり、コードを改善したり、コードの誤りをチェックしたりするコード(MLコード)(Web開発、数値ソルバーなど)。機械学習を実装するためのテクニックではありません。
チャールズ

これが起こることは決してないというわけではありませんが、高レベルのプログラミング言語は、遅い化学的に活性化された制御ユニットを持つ人間にとって、コンピューターの指示を容易にするように設計されています。最も基本的なレベルでは、MLはマシンが何をすべきかを決定するマシンです。将来的には、もろい水袋用に設計された言語は、人間自身と同じくらい不要になるでしょう。
ジミージェームズ

この質問は、人工知能サイトに移行されることになっています。
キンタムニア

これは実際には本当にクールな質問です!
リースジョンズ

回答:


6

ファジングは、機械学習を適用できるテスト方法です。ファジングは、自動化された探索的テストの領域でテストする方法です。多数の入力を実行してエラーを探すことにより、ソフトウェアの欠陥を見つけようとします。未処理の例外は最も単純なカテゴリですが、スマートな実装ではMLを使用して疑わしい出力を見つけることができます。ただし、プロセスをより効率的にするために、このドメインでMLが主に使用されます。これはMLを使用することで機能し、「興味深い」入力でトレーニングすることにより、考えられるすべての入力をテストしません。(失敗の原因となる可能性のある異種の入力。)


面白い。したがって、この種のコードテストのカテゴリに該当しますか?RJBの答えは、テストよりも開発に関するものなので、もう少し気に入っています。ただし、テスト/デバッグは依然として有用です。
チャールズ

うん。それは間違いなくテスト領域にあり、十分な人がそれを試したことはありませんが、クラウドコンピューティングがますます普通になるにつれて、実行可能な技術として勢いを増しています。自分でマシンのクラスターを取得し、1週間テストを実行してから、次回までクラスターを破棄するのが簡単になりました。
ラバーダック

4

はい。このエリアは現在暑いです。「ビッグコード」と呼ばれ、DARPAは4,000万ドルを投入しました。 http //www.darpa.mil/program/mining-and-understanding-software-enclaves。Fan GrantのProphetおよびGenesisシステムなど、この助成金からいくつかの印象的な結果が出ています。これは、正しいパッチの学習モデルを使用してプログラムのバグを自動的に修正できます。Martin Vechevと彼の学生Veselin Raychevもこの分野の先駆者です。おそらく最も印象的な結果はJSNice(http://jsnice.org/)であり、これは「JavaScriptコードを最小化する」ことができます。

全体として、大きなコードのアイデアはその期待に応えていませんでした。データはあまりにもまばらなので、変数名よりもはるかに興味深いことを学ぶことができません。私はまだこのDARPAプログラムから一部資金提供を受けていますが、私の研究室ではほとんど作業をやめています。その点について、DeepCoderについて最後に聞いたのは、プログラム合成の最新技術と比較してかなり哀れな結果が得られるということです。

自動プログラミングのための最も成功したツールは、SMTソルバーなどの非MLメソッドに依拠しています。PL会議(例:PLDI、POPL、OOPSLA)または学術ソフトウェアエンジニアリング会議(例:ICSE、FSE、ISSTA、ASE)の手順をご覧ください。多くの例があります。


3

マイクロソフトは、ディープラーニングを使用して、特定の入力および出力からメソッド本体を予測するDeepCoderを開発しています。それが私が知っている唯一の例です。

私はことを伝えることができメタ遺伝的プログラミングは同様の野心を持つ研究分野ですが、私は私が精通しているためにそれについて十分に知っていると言うことはできません。

遺伝的プログラミングは2015年にmuScalpelが1つのプログラムから別のプログラムに機能を移植するソリューションを進化させ、両方のユニットテストを一種のトレーニングセットとして使用してニュースになりました。


これは、遺伝モデルを使用してアルゴリズムを生成するようなものです。コード開発を支援するアプリケーションを知っていますか?私は、純粋に機械駆動型(遺伝子ベースのモデル)ではなく、人間と機械が一緒に働くことを考えています。これは具体的に聞こえるかもしれませんが、私はこの分野に慣れていないので、ほとんど興味があります。
チャールズ

確かにあなたは正しい、私は誤解している、私はMLを使用してMLを行うことについてあまりにも再帰的に考えていた:) #edited
RJB

2

私の質問は、機械学習をコード開発に適用するためにこれまでにどのような研究が行われてきたかということです。デバッグはどうですか?

関連する質問は、コード生成とコンパイルのための機械学習技術に関するものです(トランスパイラーコンパイラーを想像できるからです)は、自動的に「開発コード」(実際にはコードを書く)をいくつかの高レベル言語から)。

MILEPOST GCCなど、それに関するいくつかの論文がありました。

また、デバッグや静的ソースコード分析(またはあらゆる種類の静的プログラム分析)のための機械学習技術に関する論文をGoogleで検索することもできます。)のます。

質問に関連する人工知能のブートストラップに関するJ.Pitratのブログも参照してください。


1

Communications of the ACMの数学を使った金Makingけに関する最近の記事で、Erik Meijerはシステムおよびインフラストラクチャグループ、Googleシニアフェロー、Jeff Deanを引用しました。

Googleが今日ゼロから作成された場合、その多くはコード化されずに学習されます。

この記事では、研究分野での最近の活動に関する概要を説明しています。有料の壁の背後にありますが、コーディングと機械学習/統計の理論的な類似点に興味がある場合は、読む価値があります。記事の最後にある参照リストも役立つかもしれません。

例として、この記事ではWebの確率的プログラミングであるWebPPLについて言及しています


0

機械学習を使用してマイクロサービスをデバッグする1つの使用例を次に示します。機械学習を使用してマイクロサービスのパフォーマンスデータを分析するいくつかの取り組みを文書化しました。マイクロサービスの負荷テストから収集されたパフォーマンスデータからデシジョンツリーをトレーニングし、環境問題に関する洞察を与え、パフォーマンスバグの診断と修正に役立つツリーを調査しました。


0

コーディング関連のすべての機械学習トピックに関する非常に広範な読書リストを見つけました

ご覧のように、人々は機械学習をコーディングに適用しようとしていますが、あらゆる種類のコーディングやデバッグを処理できるマシンだけでなく、常に非常に狭い分野で行っています。
この回答の残りの部分では、比較的広い範囲の「デバッグ」マシンと、これがまだ実際に試行されていない理由に焦点を当てます(トピックに関する私の研究が示す限り)。


回答の長い部分を編集しました。要約すると(次の部分で重要です)、現在の機械学習の方法論、人間が学習できるもの、機械も同様です。物理的な領域(CPU速度、マシンのサイズなど)によってのみ制限されます。学習アルゴリズム自体の適用の制限は想定されていません。

機械学習をコード開発に適用するためにこれまでに行われた研究は何ですか?デバッグはどうですか?

ここでの問題は、不可能ということではなく、非常に複雑なトピックです。

人間は、誰もが同意する普遍的なコーディング標準の定義に近づいていません。SOLIDのような最も広く合意された原則でさえ、どれだけ深くそれ実装されなければならない。すべての実用的な目的のために、金銭的(または時間的な)制約がない限り、SOLIDに完全に従うことはできません。これは、ほとんどの開発が行われる民間部門では不可能です。SOLIDはガイドラインであり、厳密な制限ではありません。

善悪の客観的な尺度がない場合、どのようにして機械に正/負のフィードバックを与えて学習させることができますか?
せいぜい、多くの人にマシンに自分の意見を言わせることができ(「これは良い/悪いコードです」)、マシンの結果は「平均的な意見」になります。しかし、それは必ずしも正しい解決策と同じではありません。可能ですが、保証されているわけではありません。

第二に、特にデバッグのために、特定の開発者が特定のタイプのバグ/ミスを導入する傾向があることを認識することが重要です。間違いの性質は、場合によってはそれを導入した開発者の影響を受ける可能性があります。

例えば、私は職場で他人のコードのバグ修正に頻繁に関与しているため、各開発者が犯しがちなミスを予想しています。特定の問題を考えると、dev Aは構成ファイルの更新を忘れる可能性が高いことを知っていますが、dev Bはしばしば不適切なLINQクエリを書き込みます。開発者に基づいて、最初に構成ファイルまたはLINQに目を向けることがあります。
同様に、私はいくつかの企業でコンサルタントとして働いてきましたが、特定の種類の企業に向かってバグの種類が偏っている可能性があることがはっきりとわかります。私が最終的に指摘できるのは難しくて速い規則ではありませんが、明確な傾向があります。

機械はこれを学ぶことができますか?開発者Aは構成を台無しにし、開発者BはLINQクエリを台無しにする可能性が高いことを認識できますか?もちろんできます。前に言ったように、人間が学べることは何でも、機械でも学べます。
しかし、マシンにあらゆる可能性を教えたことをどのように知っていますか?どのようにして小さな(つまり、グローバルではない)データセットを提供し、それがバグの全範囲を表しているという事実を知ることができますか?または、代わりに、普遍的に使用可能なデバッガを作成するのではなく、特定の開発者/企業を支援する特定のデバッガを作成しますか?

機械学習デバッガーを求めることは、機械学習シャーロックホームズを求めるようなものです。それを作成することは確かに不可能ではありませんが、多くの場合、デバッガ/シャーロックであるという中核的な理由は、主題ごとに異なる主観的評価に依存し、信じられないほど幅広い知識/可能性のある欠陥に触れます。
すぐに証明可能な正しい/誤った結果がないため、機械を簡単に教えて、機械が順調に進んでいることを確認することは困難です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.