
OpenAI創設チームメンバー:ソフトウェア2.0とは何か?
TechFlow厳選深潮セレクト

OpenAI創設チームメンバー:ソフトウェア2.0とは何か?
将来、汎用人工知能(AGI)を開発するときには、必ずソフトウェア2.0が使われるだろう。
執筆:Andrej Karpathy(OpenAI 創設メンバー、元テスラAI部門責任者)
翻訳:OneFlowコミュニティ、ywh1bkansf
Andrej Karpathyは、AIの波がなぜ本当に重要なのかを最も早く明確に説明した人物の一人である。彼はAIとはコンピュータをプログラミングする新しい強力な方法であり、将来汎用人工知能(AGI)を開発するとすれば、それはソフトウェア2.0を使って行われると考えている。
以下は、Andrej Karpathyが2017年に発表した記事の全文である:
私は時々、人々がニューラルネットワークを「機械学習ツールボックスの中の一つのツールにすぎない」と見なしていることに気づく。確かに長所も短所もあり、特定分野では有効で、Kaggleコンペティションで勝つ助けにもなるだろう。だが残念ながら、このような見方は完全に「木を見て森を見ず」である。ニューラルネットワークは単なるもう一つの分類器ではない。それは私たちがソフトウェアを開発する方法に関する根本的な変化の始まりなのである。それがソフトウェア2.0なのだ。
私たちはソフトウェア1.0にはすでに慣れ親しんでいる——これはPythonやC++などのプログラミング言語で書かれたものだ。プログラムはプログラマーがコンピュータに対して与える明示的な命令から成り立っている。各コード行を書くことで、プログラマーは特定の望ましい振る舞いを持つプログラム空間上の一点を決定している。

一方、ソフトウェア2.0は、より抽象的で人間が理解しづらい言語(例えばニューラルネットワークの重みなど)によって開発される。誰も直接このコードを書くことはできない。なぜなら膨大な数の重み(しばしば百万単位)が必要であり、(私も試してみたが)重みを直接書き下すのはある意味極めて困難だからである。

その代わりに、我々はプログラムの振る舞いに対して目的(例:「データセット内の入出力対に一致すること」、あるいは「囲碁で勝つこと」)を定め、プログラムの骨格(例:ニューラルネットワークの構造)を記述することで、探索可能なプログラム空間のサブセットを定義し、その後、計算リソースを用いてその空間内で適切なプログラムを探し出すのである。
ニューラルネットワークの場合、探索はプログラム空間の連続的なサブセットに制限され、逆誤差伝播法(バックプロパゲーション)と確率的勾配降下法(SGD)を用いて探索を行う。驚くべきことに、この探索手法は非常に効果的である。

より具体的に比較すると、ソフトウェア1.0では、人が設計したソースコード(例:.cppファイル)を、正しく動作するバイナリにコンパイルする。一方、ソフトウェア2.0のソースコードは通常二つの部分からなる:1)期待される振る舞いを定義するデータセット、2)大まかな構造は決まっているが詳細を埋める必要のあるニューラルネットワークの構造。ニューラルネットワークの訓練プロセスとは、まさにこのデータセットを最終的なニューラルネットワークというバイナリにコンパイルするプロセスなのである。今日、多くの実用的な場面で、ニューラルネットワークの構造および訓練システムはますます標準化され、商品化されているため、活発な「ソフトウェア開発」の大部分は、ある種の形でラベル付きデータセットの整理・拡張・調整・クリーニングへと変わってきている。これにより、ソフトウェアの反復開発のプログラミングパラダイム自体が根本的に変わり、開発チームは二つに分かれることになる:ソフトウェア2.0のプログラマー(データアノテーター)がデータセットの編集と拡張を行い、少数のエンジニアが訓練インフラや分析・可視化・アノテーションインターフェースなどを維持管理する。
現実世界の多くの問題において、データを収集する(より広く言えば、期待される振る舞いを定義する)ことは、明示的にプログラムを書くよりもはるかに簡単であることがわかっている。上記に加え、以下に述べるソフトウェア2.0の多数の利点があるため、産業界では大量のコードがソフトウェア1.0からソフトウェア2.0へと移行している最中である。ソフトウェア1.0が世界を飲み込んでいたように、今度はソフトウェア2.0(AI)がソフトウェア1.0を飲み込んでいる。
変革の進行中
この変革が実際に進行している具体領域の例を見てみよう。過去数年間、これらの分野では、複雑な問題を明示的にコードで解決しようとする試みを諦め、代わりにソフトウェア2.0へと移行してきたことがわかる。
-
画像認識:従来の画像認識は特徴量エンジニアリングが中心で、最後に少し機械学習(SVMなど)を加える程度だった。しかし、ImageNetのような大規模データセットと畳み込みニューラルネットワークの構造空間での探索により、より強力な視覚特徴が発見された。最近では、手書きのネットワーク構造ですら信用しなくなり、同様の探索手法で最適な構造を探すようになっている。
-
音声認識:昔の音声認識は前処理、ガウス混合モデル、隠れマルコフモデルなど多くの工程を要したが、現在ではほぼニューラルネットワークのみで済む。関連する有名なジョークとして、1985年のFred Jelinekの言葉がある。「言語学者を一人解雇するたびに、私の音声認識システムの性能が上がる」。
-
音声合成:かつて音声合成は様々な連結技術を用いていたが、現在ではWaveNetのような最先端の大規模畳み込みネットワークが、生のオーディオ信号を直接生成できる。
-
機械翻訳:機械翻訳は以前は統計的フレーズベースの手法が主流だったが、ニューラルネットワークが急速に支配的地位を占めている。私が最も好むネットワーク構造は多言語学習に関連するもので、一つのモデルが任意の言語から任意の言語へ翻訳でき、ごく弱い教師ありまたは完全に教師なしでも動作する。
-
ゲーム:長期間、将棋や囲碁のプログラムは手作業で書かれてきたが、現在AlphaGo Zero(盤面の生情報を観測して自己対戦する畳み込みネットワーク)が囲碁分野で最強のプレイヤーとなっている。DOTA 2やスターカRAFTなど他の分野でも同様の結果が出ると予想される。
-
データベース:AI分野外の伝統的なシステムでも、ソフトウェア2.0への移行の初期兆候が見える。例えば、「インデックス構造の学習」では、既存のデータ管理コアコンポーネントをニューラルネットワークで置き換え、キャッシュ最適化されたBツリーに比べて最大70%高速化し、メモリ使用量を1桁削減できた。
上記の研究の多くがGoogleによるものであることに気づくかもしれない。これはGoogleが自社のコードを大量にソフトウェア2.0に移行している先駆者的存在だからである。「万能モデル」というビジョンは、さまざまな分野の統計的手法を統合し、世界を一貫して理解する全体像を描いている。
ソフトウェア2.0の利点
なぜ複雑なプログラムをソフトウェア2.0に移植しようとするのか?もちろん、一番簡単な答えは「実際によく機能するから」である。しかし他にも多くの理由がある。ソフトウェア2.0(畳み込みニューラルネットワーク代表)とソフトウェア1.0(プロダクションレベルのC++コードベース代表)を比較したとき、ソフトウェア2.0の利点は次の通りである:
-
均質な計算:典型的なニューラルネットワークは行列乗算と線形整流関数(ReLu)の二つの操作だけから成る。従来のソフトウェアの命令は明らかに複雑で異質的である。そのため、ソフトウェア1.0で実装すべきコアコード(例:行列乗算)が非常に限定されており、正しさや性能の検証がはるかに容易になる。
-
チップに優しい:ニューラルネットワークに必要な命令セットが相対的に小さいため、カスタムASICやニューモルフィックチップなど、ハードウェア上での実装が容易になる。低消費電力のスマートデバイスが周囲にあふれるとき、世界は大きく変わるだろう。例えば、事前学習済みの畳み込みネットワーク、音声認識、WaveNet音声合成ネットワークを安価で小型のデバイスに搭載し、他の機器と接続できるようになる。
-
定数時間の実行時間:典型的なニューラルネットワークの順方向伝播では、必要な計算量(FLOPs)が非常に一定である。手書きの複雑なC++コードで見られるような実行分岐は、ソフトウェア2.0には存在しない。動的グラフが必要な場合もあるが、実行フローは厳密に制限される。その場合でも、予期しない無限ループに陥ることはまずない。
-
定数レベルのメモリ消費:上記と関連して、動的メモリ割当がないため、ストレージとのスワップがほとんど起こらず、メモリリークの可能性もない。
-
高い移植性:従来のバイナリやスクリプトと比べ、一連の行列乗算操作はさまざまなコンピュータ環境で実行しやすい。
-
アジャイル開発:C++を書いていて、開発速度を2倍にしろと言われた場合(性能を犠牲にしてよい)、システムを調整するのは簡単ではない。しかしソフトウェア2.0では、計算グラフの半分のパスを削除して再訓練すれば、精度はわずかに落ちるが2倍速く訓練できるモデルが得られる。これは驚くべきことだ。逆に、より多くのデータと計算資源を得れば、計算グラフを拡大して再訓練することで、すぐに実際の性能を向上させられる。
-
モジュール融合による最適化:従来のソフトウェアは複数のモジュールに分割され、共通関数、API、エンドツーエンド方式で通信する。しかしソフトウェア2.0では、相互作用する2つのモジュールが独立に学習されていたとしても、後からシステム全体で逆誤差伝播を行うことができる。ブラウザがページ読み込み速度を高めるために底層命令を自動設計したり、OpenCVのようなコンピュータビジョンライブラリが特定データに応じて振る舞いを自動調整したりする。ソフトウェア2.0ではこれらは基本的な操作となる。
-
あなたより優れている:最後に最も重要な点として、多くの分野でニューラルネットワークが生成するコードは、あなたや私が書くコードよりも優れている。少なくとも現時点では、画像・動画・音声などの分野ではそうである。
ソフトウェア2.0の欠点
ソフトウェア2.0にはいくつかの欠点もある。最適化が完了すると、実用的には非常に効果的な巨大ネットワークが得られるが、なぜそれが機能するのかを説明するのは難しい。多くの分野で、理解しやすいが精度90%のモデルを選ぶか、理解不能だが精度99%のモデルを選ぶかの二者択一を強いられる。
ソフトウェア2.0は直感的でない、恥ずかしいエラーを起こすことがある。さらに悪いことに、「静かに失敗する」こともある。例えば、訓練中に偏ったデータを意図せず取り込んでしまうと、データが百万件規模になると、原因を分析・チェックすることが極めて困難になる。
最後に、ソフトウェア2.0特有の奇妙な性質が次々と発見されている。例えば、敵対的サンプルや攻撃サンプルの存在は、ソフトウェア2.0の説明不可能性をさらに顕在化している。
ソフトウェア2.0のプログラミング
ソフトウェア1.0のコードは人が直接書く。ソフトウェア2.0のコードは評価基準(例:「訓練データを正しく分類すること」)に基づいて最適化によって得られる。原理が不明瞭だが、性能を繰り返し評価できるプログラムであれば、人間が書くコードよりも最適化によって得られるコードの方がはるかに優れている。

トレンドを捉える視点は重要である。ニューラルネットワークを「機械学習ツールボックスの中の便利な分類器」と見なすのではなく、「新興のプログラミングパラダイム」としてソフトウェア2.0を見るとき、その必然性が明らかになり、やるべきことがさらに多くあることもわかる。
具体的には、ソフトウェア1.0開発を支援するツール群(強力なIDE、構文ハイライト、デバッガー、プロファイラー、シンボルジャンプ、Git連携など)が多数発明されてきた。ソフトウェア2.0では、プログラミングはデータセットの蓄積・整理・クリーニングによって行われる。例えば、ニューラルネットワークが特定の極端なケースで失敗した場合、コードを書いて修正するのではなく、そのケースのデータを追加すればよい。
初のソフトウェア2.0対応IDEを開発するのは誰か?それはデータ収集、可視化、クリーニング、アノテーション、データ生成といったデータセット関連のすべてのワークフローで役立つべきだ。例えば、各サンプルの損失に基づき、ネットワークが誤ってラベル付けされていると疑う画像を提示したり、予測に基づいてラベル提案を行ったり、不確実性に基づいてアノテーションに適したサンプルを推薦したりするかもしれない。
同様に、GitHubはソフトウェア1.0時代で非常に成功したウェブサイトだった。ソフトウェア2.0時代のGitHubは可能だろうか?そのリポジトリはデータセットとなり、commitはデータラベルの追加・編集で構成される。pip、conda、dockerなどの従来のパッケージ管理・展開手段はソフトウェアの導入を容易にした。ソフトウェア2.0時代には、どのようにしてソフトウェアを効果的に展開・共有・インポート・実行できるだろうか?ニューラルネットワークにおけるcondaの対応物とは何だろうか?
要するに、低コストで繰り返し評価ができ、アルゴリズムの明示的設計が困難な分野では、ソフトウェア2.0がますます普及していくだろう。開発エコシステム全体を考え、この新しいプログラミングパラダイムにどう適応するかを考えると、多くのわくわくする機会が見えてくる。長期的には、このプログラミングパラダイムには明るい未来がある。なぜならますます明らかになってきたのは、もし将来汎用人工知能(AGI)を開発するなら、それは必ずソフトウェア2.0を使って行われるということだ。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News











