Software 2.0

元記事−
Software 2.0.
– Andrej Karpathy

ソフトウェア2.0

私は時には、人々がニューラルネットワークを単に「あなたの機械学習ツールボックスの別のツール」と呼んでいることを知っています。彼らはいくつかの長所と短所を持っています、彼らはここかそこそこで働き、時々あなたはKaggleの競争に勝つためにそれらを使うことができます。残念なことに、この解釈は完全に木の森を欠場する。ニューラルネットワークは単なる分類子ではなく、ソフトウェアの書き方の根本的な変化の始まりを表しています。それらはソフトウェア2.0です。

ソフトウェア1.0の「古典的なスタック」は、私たちがよく知っているものです。Python、C ++などの言語で書かれています。プログラマが書いたコンピュータへの明示的な指示で構成されています。コードの各行を書くことによって、プログラマは、プログラム空間内の特定の点を、望ましい動作で特定します。

対照的に、ソフトウェア2.0は、ニューラルネットワークの重みなど、はるかに抽象的な、人間に不親切な言語で記述することができます。人間はこのコードを書くことに関与していません。なぜなら、多くの重み(一般的なネットワークは何百万もあるかもしれません)があり、重みの直接のコーディングは難しいです。

代わりに、私たちのアプローチは、望ましいプログラム(例えば、 “入力の出力ペアの例を挙げる”、または “Goのゲームに勝つ”)の振る舞いにいくつかの目標を指定し、コードの大まかなスケルトンを書くことです検索するプログラム空間のサブセットを識別するニューラルネットアーキテクチャ(neural net architecture)であり、計算資源を使用してこの空間を検索し、動作するプログラムを探す。ニューラルネットワークの特定のケースでは、検索プロセスを、逆伝播および確率的な勾配降下を伴って(幾分驚くほど)効率的に行うことができるプログラム空間の連続したサブセットに限定する。

現実世界の問題の大部分は、プログラムを明示的に書くよりも、データを収集すること(または、より一般的には、望ましい行動を特定すること)がはるかに容易であるという性質があることが判明しています。このような場合、プログラマは2つのチームに分割されます。 2.0プログラマは手動でデータセットを管理、維持、マッサージ、クリーン、ラベル付けします。データセットが最適化によってSoftware 2.0コードにコンパイルされるため、各ラベル付きサンプルは文字通り最終システムをプログラムします。一方、1.0のプログラマーは、周辺ツール、分析、ビジュアライゼーション、ラベリングインターフェース、インフラストラクチャー、トレーニングコードを維持しています。
進行中の移行

この進行中の移行の具体的な例を簡単に見てみましょう。これらの各分野では、ここ数年で、明示的なコードを記述して複雑な問題に対処しようとすることをあきらめ、代わりにコードを2.0スタックに移行させることで改善が見られました。

視覚認識は、機械学習のビットを先端に散在させた工学的特徴(例えば、SVM)で構成されていた。それ以来、大きなデータセット(ImageNetなど)を取得し、畳み込みニューラルネットワークアーキテクチャの空間を検索することにより、より強力な視覚的特徴を発見しました。最近では、アーキテクチャを手作業で行うことにも自信を持っておらず、それらについても調査を開始しています。

音声認識には多くの前処理、ガウス混合モデル、隠れマルコフモデルが必要でしたが、今日ではほとんどがニューラルネットで構成されています。 1985年からFred Jelinekに帰された、非常に関連してよく引用されたユーモラスな引用は、「私が言語学者を呼び出すたびに、音声認識システムのパフォーマンスが上がっています。

音声合成は、歴史的に様々なステッチングメカニズムで近づいてきたが、今日の最先端のモデルは、生のオーディオ信号出力を生成する大きなConvNets(例えば、WaveNet)である。

機械翻訳は、通常、フレーズベースの統計手法を用いたアプローチですが、ニューラルネットワークは急速に支配的になりつつあります。私のお気に入りのアーキテクチャーは多言語設定で訓練されています。単一のモデルがソース言語からターゲット言語に変換され、弱く管理された(または完全に監督されない)設定に変換されます。

ゲーム。明示的に手作業でコーディングされたゴー・プレイ・プログラムは長い間開発されてきましたが、AlphaGo Zero(ボードの生の状態を見て移動を演じるConvNet)は今ではゲームの最も強力なプレイヤーになっています。私は、他の分野でも非常に似通った結果が得られると期待しています。 DOTA 2、またはスタークラフト。

データベース。人工知能以外の伝統的なシステムでも、移行の初期のヒントが見られます。例えば、「学習指数構造の場合」は、データ管理システムのコアコンポーネントをニューラルネットワークに置き換え、キャッシュ最適化されたBツリーを最大70%高速処理しながら、メモリのオーダの大きさを節約します。

上記のリンクの多くにはGoogleでの作業が含まれています。これは、Googleが現在、ソフトウェア2.0のコードに大きなチャンクを書き直す最前線に立っているからです。 「すべてを統治する1つのモデル」は、個々のドメインの統計的な強さが世界を一貫して理解するように合併された、これがどのように見えるかを早期に説明します。
ソフトウェア2.0の利点

複雑なプログラムをSoftware 2.0に移植することを好む理由は何ですか?明らかに、簡単な答えは、実際にはよりよく働くということです。しかし、このスタックを好む多くの便利な理由があります。 Software 1.0のメリットのいくつかを見てみましょう(ConvNetと思う:Software-1.0と比較して:生産レベルのC ++コードベース)。ソフトウェア2.0は:

計算上均一です。典型的なニューラルネットワークは、第1の順序で、行列乗算とゼロでの閾値処理(ReLU)の2つの演算のサンドイッチで構成されています。かなり異質で複雑な古典的なソフトウェアの命令セットと比較してください。少数のコア計算プリミティブ(例えば、行列乗算)に対してソフトウェア1.0の実装を提供するだけで済むので、さまざまな正確性/性能保証を行う方がずっと簡単です。

シリコンに焼き付けるのが簡単です。当然のことながら、ニューラルネットワークの命令セットは比較的小さいので、これらのネットワークをシリコンに非常に近く実装することはかなり容易である。カスタムASIC、ニューロモルフィックチップなどがあります。低消費電力のインテリジェンスが私たちの周りに広がると、世界は変わるでしょう。例えば、小さくて安価なチップには、事前に準備されたConvNet、音声認識装置、およびWaveNet音声合成ネットワークがすべて、小さなプロトタイプに統合されていることがあります。

一定の実行時間。典型的なニューラル・ネット・フォワード・パスの各反復では、まったく同じ量のFLOPSが必要です。あなたのコードはいくつかの広がったC ++コードベースをとって取ることができる異なる実行パスに基づいてゼロの可変性があります。もちろん、動的な計算グラフを持つことはできますが、実行フローは通常は依然としてかなり制限されています。このようにして、意図しない無限ループで自分自身を決して見つけられないこともほぼ保証されます。

一定のメモリ使用。上記に関連して、動的に割り当てられたメモリはどこにもありません。したがって、ディスクへのスワップの可能性もほとんどなく、コード内で狩らなければならないメモリリークもあります。

それは非常にポータブルです。行列の乗算のシーケンスは、古典的なバイナリやスクリプトと比べて、任意の計算構成で実行する方がはるかに簡単です。

それは非常に機敏です。もしあなたがC ++のコードを持っていて、誰かがあなたを2倍速くしたいなら(必要に応じてパフォーマンスを犠牲にして)、新しい仕様のためにシステムをチューニングすることは非常に簡単です。しかし、ソフトウェア2.0では、ネットワークを利用し、チャネルの半分を削除し、再トレーニングして、速度が2倍になり、少し悪化します。魔法です。逆に、より多くのデータ/計算を取得した場合は、チャンネルを追加して再訓練するだけですぐにプログラムを改善できます。

モジュールは最適な全体に融合することができます。私たちのソフトウェアは、しばしばパブリック関数、API、またはエンドポイントを介して通信するモジュールに分解されます。しかし、最初に個別に訓練された2つのソフトウェア2.0モジュールが相互作用する場合、全体を簡単にバックプロパゲージすることができます。あなたのWebブラウザが低レベルのシステム命令10を自動的に再設計して、Webページを読み込む際の効率を上げることができれば、どれほど驚くべきことだと考えてください。 2.0では、これがデフォルトの動作です。

それはあなたよりも優れています。最後に、最も重要なことに、ニューラルネットワークは、貴重な業種の大部分であなたや私が思い付くことができるものよりも優れたコードです。現在のところ、画像/動画や音声/音声とは関係がありません。
ソフトウェア2.0の制限

2.0スタックにもいくつかの欠点があります。最適化の終わりにはうまくいく大規模なネットワークが残っていますが、どのように伝えるのは非常に難しいです。多くのアプリケーション分野では、われわれが理解している90%の正確なモデルか、そうでない99%の正確なモデルを使用するかの選択が残されます。

2.0のスタックは、直感的で恥ずかしいやり方で失敗する可能性があります。たとえば、訓練データに黙って黙って導入することで、サイレントに失敗する可能性があります。ほとんどの場合。

最後に、このスタックの特有のプロパティのいくつかをまだ発見しています。例えば、敵対的な例や攻撃の存在は、このスタックの直観的でない性質を強調しています。
2.0スタックでのプログラミング

ソフトウェア1.0は私たちが書いたコードです。ソフトウェア2.0は、評価基準(「このトレーニングデータを正しく分類する」など)に基づいて最適化によって作成されたコードです。プログラムが明白でない任意の設定bu

最適化によって人間が書くことができるコードよりもはるかに優れたコードを見つけることができるため、そのパフォーマンスを繰り返し評価することができます(たとえば、いくつかの画像を正しく分類しましたか、Goのゲームに勝ったかなど)。

私たちが見る傾向のあるレンズは重要です。ソフトウェア2.0を新しい学習プログラムのパラダイムと認識しているのであれば、単にニューラルネットワークを機械学習のクラスでかなり良い分類子として扱うのではなく、外挿がより明らかになり、はるかに多くの作業があることは明らかです。

特に、構文強調、デバッガ、プロファイラ、デフ、git統合などの機能を備えた強力なIDEなど、人間が1.0のコードを書くのを支援する膨大な量のツールを構築しました。プログラミングは、データセットの蓄積、マッサージ、およびクリーニングによって行われます。たとえば、ネットワークが何らかの困難または稀なケースで失敗した場合、我々はコードを書くことによってそれらの予測を修正するのではなく、それらの事例のより多くのラベル付きの例を含めることによって修正します。誰が、データセットの蓄積、可視化、クリーニング、ラベリング、および調達のすべてのワークフローを支援する最初のSoftware 2.0 IDEを開発する予定ですか?おそらく、IDEは、サンプル損失に基づいてネットワークが間違っていると思われる画像をバブルアップしたり、ラベルに予測を組み込んだラベル付けを支援したり、ネットワークの予測の不確実性に基づいてラベル付けする有用な例を提案します。

同様に、GithubはSoftware 1.0コードにとって非常に成功した家です。 Software 2.0 Githubのためのスペースはありますか?この場合、リポジトリはデータセットであり、コミットはラベルの追加と編集で構成されます。

短期/中期的には、ソフトウェア2.0は、繰り返し評価が可能で安価なドメインではますます普及するようになり、

アルゴリズムそのものを明示的に設計することが困難な場合です。そして長期的には、このパラダイムの未来は明るいです。なぜなら、AGIを開発するときには、ソフトウェア2.0で書かれていることがますます明らかになっているからです。