テスラAIディレクター:33年前にルカンのニューラルネットワークを再現したが、今とあまり変わらない

テスラAIディレクター:33年前にルカンのニューラルネットワークを再現したが、今とあまり変わらない

最近、Tesla AI のシニアディレクターである Andrej Karpathy 氏が、非常に興味深いことを行いました。彼は、Yann LeCun 氏らによる 1989 年の論文を再現したのです。 1 つは楽しみのためであり、もう 1 つは、過去 33 年間にディープラーニングの分野でどのような興味深い変化が起こったか、そして当時 Lecun 氏を妨げていたものが一体何であったかを知るためです。さらに、2055年の人々が今日のディープラーニング研究をどのように捉えるのかについても期待しているという。

1989 年、Yann Lecun らは「手書きの郵便番号認識へのバックプロパゲーションの適用」という論文を発表しました。この論文は、私の知る限り、バックプロパゲーションを使用してトレーニングされたエンドツーエンドのニューラル ネットワークの最も初期の実世界への応用であるため、歴史的な重要性があると思います。

論文リンク: http://yann.lecun.com/exdb/publis/pdf/lecun-89e.pdf

データセットとニューラル ネットワークは比較的小さいですが (7291 枚の 16x16 グレースケール デジタル画像、1000 個のニューロン)、この論文は 33 年経った今でも関連性があります。データセットを提示し、ニューラル ネットワークのアーキテクチャ、損失関数、最適化について説明し、トレーニング セットとテスト セットの実験的な分類エラー率を示しています。これは非常に有名で、現代のディープラーニング論文として分類できますが、33 年前の論文です。そこで私は、楽しみのためだけでなく、この演習をディープラーニングの進歩の本質に関するケーススタディとして使用するために、論文を再現することにしました。

成し遂げる

私はできる限り論文に忠実に従い、PyTorch で細部まで再現しようとしました。次の GitHub リポジトリを参照してください。

複製リンク: https://github.com/karpathy/lecun1989-repro

元のネットワークは、1988 年に Bottou と LeCun によって提案されたバックプロパゲーション シミュレータ SN (後に Lush と命名) を使用して Lisp で実装されました。その論文はフランス語だったので読めませんでした。しかし、構文的には、現在の PyTorch と同様に、高レベル API を使用してニューラル ネットワークを指定できます。

現代のソフトウェア設計では、ライブラリ設計は次の 3 つの部分に分かれています。

1) 多次元テンソルの基本的な数学演算のための高速 (C/CUDA) 汎用テンソル ライブラリ。

2) 順方向計算グラフを追跡し、逆方向パスの操作を生成する autograd エンジン。

3) 一般的なディープラーニング操作、レイヤー、アーキテクチャ、オプティマイザー、損失関数などを含む、スクリプト可能な (Python) ディープラーニング高レベル API。

電車

トレーニング中、7291 個のサンプルで構成されるトレーニング セットに対して 23 回のパスを実行し、合計 167693 個のサンプル/ラベルがニューラル ネットワークに提示されます。元のネットワークは、SUN-4/260 ワークステーション (1987 年にリリース) で 3 日間トレーニングされました。現在、この実装を MacBook Air (M1) CPU でわずか 90 秒で実行できます (約 3000 倍の高速化)。私の conda は、Rosetta エミュレーションではなく、ネイティブ amd64 ビルドを使用するように設定されています。 PyTorch が M1 のすべての機能 (GPU と NPU を含む) をサポートできれば、加速効果はさらに大きくなる可能性があります。

また、コードを純粋に A100 GPU で実行してみましたが、トレーニングはさらに遅くなりました。これは、ネットワークが小さすぎる (4 層の convnet、最大 12 チャネル、合計 9760 個のパラメーター、64K MAC、1K アクティベーション) ことと、SGD が一度に 1 つの例しか使用していないことが原因であると考えられます。とはいえ、この問題を最新のハードウェア (A100) とソフトウェア インフラストラクチャ (CUDA、PyTorch) で本当に解決したいのであれば、GPU の使用率を最大化するために、例ごとの SGD からフルバッチ トレーニングに切り替える必要があります。この方法により、トレーニングのスピードがさらに約 100 倍向上する可能性があります。

1989年の実験結果を再現する

オリジナルの論文では、次のような実験結果が示されています。

 評価: 分割トレーニング損失2.5e-3エラー0.14 %ミス: 10
評価: 分割テスト損失1.8e-2エラー5.00 %ミス: 102

しかし、23 回目のパスの後、トレーニング スクリプト repro.py は次のように出力します。

 評価: 分割列車損失4.073383e-03エラー0.62 %ミス: 45
評価: 分割テスト損失2.838382e-02エラー4.09 %ミス: 82

したがって、私は論文の結果を大まかに再現しただけであり、数字は正確ではありません。元のデータセットは時間の経過とともに失われているため、元の論文と同じ結果を得ることは不可能と思われます。そのため、はるかに大きな MNIST データセットを使用してシミュレートする必要がありました。そのデータセットの 28 x 28 桁を取得し、双線形補間を使用して 16 x 16 ピクセルに縮小し、そこから正しい数のトレーニング セットとテスト セットの例を置換なしでランダムにサンプリングしました。

しかし、論文の重み初期化スキームの説明が少し抽象的すぎる、PDF ファイルに書式エラーがある (小数点、平方根記号が消えているなど) など、正確な再現に影響する他の理由もあると思います。たとえば、論文では、重みの初期化は均一な「2 4 / F」から引き出され、F はファンインであると説明されていますが、実際には「2.4 / sqrt(F)」であり、sqrt は出力の標準偏差を維持するのに役立つと思います。 H1 層と H2 層の間の特定のスパース接続構造にも問題があります。論文では、この構造は「ここでは説明しないスキームに従って選択された」としか述べられていないため、重複ブロックのスパース性を使用して、ある程度の推測を行う必要がありました。

この論文では、tanh 非線形性も使用していると主張していますが、これは実際には ntanh(1) = 1 をマッピングする「正規化 tanh」であり、tanh の平坦な裾に少なくとも少しの勾配があることを保証するために、当時非常に人気があった縮小残差接続が追加されている可能性があるのではないかと心配しています。最後に、この論文では「ヘッセ行列の対角近似を使用するニュートン法の特別なバージョン」を使用しています。しかし、私は SGD を使用しました。なぜなら、SGD の方がはるかに簡単だからです。さらに、論文の著者らは「このアルゴリズムは学習速度の大幅な向上につながるとは期待されていない」と述べている。

新しいアプローチを試す

ここが私のお気に入りの部分です。それから33年が経ち、ディープラーニングはすでに非常に活発な研究分野となっています。ディープラーニングに関する現在の理解と 33 年間の研究開発経験を活用して、元の結果をどれだけ改善できるでしょうか?

私の最初の結果は次のとおりです。

 評価: 分割列車損失4.073383e-03エラー0.62 %ミス: 45
評価: 分割テスト損失2.838382e-02エラー4.09 %ミス: 82

まず、10 のカテゴリの単純な分類を行っていることは明らかです。しかし当時、これはターゲット -1 (負のクラスの場合) または +1 (正のクラスの場合) を持つ平均二乗誤差 (MSE) 回帰としてモデル化されており、出力ニューロンにも tanh 非線形性がありました。したがって、クラス ロジットを取得するために出力層の tanh を削除し、標準 (マルチクラス) クロス エントロピー損失関数に置き換えました。この変更により、トレーニング セットが完全にオーバーフィットされ、トレーニング エラーが大幅に改善されます。

 評価: 分割列車損失9.536698e-06エラー0.00 %ミス: 0
評価: 分割テスト損失9.536698e-06エラー4.38 %ミス: 87

出力層に(飽和した)tanh 非線形性と MSE エラーがある場合は、重みの初期化の詳細についてより注意する必要があると思われます。第二に、私の経験では、微調整された SGD は非常にうまく機能しますが、現在の Adam オプティマイザー (学習率 3e-4) は、ほとんどの場合、適切なベースラインであり、調整はほとんど必要ありません。

そこで、最適化がパフォーマンスに影響を与えていないことをより確信するために、学習率が 3e-4 の AdamW に切り替え、トレーニング中に学習率を 1e-4 に下げました。結果は次のとおりです。

 評価: 分割列車損失0.000000e+00エラー0.00 %ミス: 0
評価: 分割テスト損失0.000000e+00エラー3.59 %ミス: 72

これにより、SGD よりもわずかに改善された結果が得られます。ただし、デフォルトのパラメータでは重みが少し減少し、過剰適合を防ぐのに役立つことも覚えておく必要があります。過剰適合は依然として深刻なため、入力画像を水平または垂直に 1 ピクセルシフトするという単純なデータ拡張戦略を導入しました。ただし、これはデータセットのサイズの増加をシミュレートするため、チャネル数も 23 から 60 に増やす必要がありました (元の設定でチャネル数を単純に増やしても、結果が大幅に改善されないことを確認しました)。

 評価: 分割列車損失8.780676e-04エラー1.70 %ミス: 123
評価: 分割テスト損失8.780676e-04エラー2.19 %ミス: 43

テストエラーからわかるように、上記のアプローチは役立ちます。データ拡張は、過剰適合に対抗するためのかなり単純で標準的な概念ですが、1989 年の論文では言及されていなかったので、おそらく少し後の革新なのでしょうか。オーバーフィッティングがまだ存在していたため、ツールボックスから別の新しいツール、ドロップアウトを取り出しました。パラメータ数が最も多いレイヤー (H3) の前に、0.25 の弱いドロップアウトを追加しました。ドロップアウトはアクティベーションをゼロに設定するため、アクティビティ範囲が [-1, 1] である tanh で使用するのはあまり意味がありません。そのため、すべての非線形性をより単純な ReLU アクティベーション関数に置き換えました。ドロップアウトによりトレーニング中にノイズが増えるため、80 回のパスでより長いトレーニングを行う必要があります。最終結果は次のとおりです。

 評価: 分割列車損失2.601336e-03エラー1.47 %ミス: 106
評価: 分割テスト損失2.601336e-03エラー1.59 %ミス: 32

これにより、テスト セットでは 32/2007 のエラーのみが発生します。元のネットワークで tanh を relu に置き換えるだけでは大きな効果が得られないことが確認されたため、ここでの改善のほとんどはドロップアウトによるものです。全体的に、1989 年に戻れば、エラー率は 60% (エラー 80 件から 30 件) 削減され、テスト セット全体のエラー率はわずか 1.5% になります。しかし、このメリットは「ただで手に入る」というわけではなく、トレーニング時間がほぼ 3 倍(3 日から 12 日)に増えました。ただし、推論時間には影響はありません。残りのエラーは次のとおりです。

さらに一歩進んで

しかし、MSE → Softmax、SGD → AdamW への移行を完了し、データ拡張、ドロップアウトを追加し、tanh を relu に置き換えた後、私は徐々にそれらの実装しやすいアイデアを放棄し始め、より多くのこと (重みの正規化など) を試しましたが、大幅に改善された結果は得られませんでした。

また、ViT を、パラメータ数とフロップス数がほぼ一致する「マイクロ ViT」に縮小しようとしましたが、畳み込みネットワークのパフォーマンスに匹敵することはできませんでした。もちろん、過去 33 年間に他の多くの革新も見られましたが、それらの多く (残差接続、レイヤー/バッチ正規化など) は大規模モデルでのみ機能し、主に大規模モデルの最適化を安定化するために使用されます。この時点で、ネットワークのサイズを増やすことでさらなる利益が得られる可能性がありますが、これによりテスト時の推論の待ち時間が長くなります。

データの改ざん

パフォーマンスを向上させるもう 1 つの方法は、データセットのサイズを増やすことです。ただし、これにはラベル付けに 1 ドルのコストがかかります。元のベースラインをもう一度示します。

 評価: 分割列車損失4.073383e-03エラー0.62 %ミス: 45
評価: 分割テスト損失2.838382e-02エラー4.09 %ミス: 82

これで MNIST データセット全体にアクセスできるようになったため、トレーニング セットのサイズを 7 倍 (7,291 から 50,000) に増やすことができます。追加されたデータだけを見ても、ベースライン トレーニングを 100 パス実行すると、すでにいくつかの改善が見られます。

 評価: 分割列車損失1.305315e-02エラー2.03 %ミス: 60
評価: 分割テスト損失1.943992e-02エラー2.74 %ミス: 54

さらにこれを現代の知識からの革新(前のセクションで説明したように)と組み合わせると、最適なパフォーマンスが得られます。

 評価: 分割列車損失3.238392e-04エラー1.07 %ミス: 31
評価: 分割テスト損失3.238392e-04エラー1.25 %ミス: 24

要約すると、1989 年には、データセットを単純に拡張することが、推論の遅延に影響を与えずにシステム パフォーマンスを向上させる効果的な方法でした。

反射

2022 年からのタイムトラベラーである私たちが、1989 年の最先端のディープラーニングから学んだことをまとめてみましょう。

  • まず、マクロレベルでは33年間であまり変化がありませんでした。私たちは、ニューロンの層で構成された微分可能なニューラル ネットワーク アーキテクチャを構築しており、バックプロパゲーションと確率的勾配降下法を使用してエンドツーエンドで最適化を行っています。 1989 年のネットワークが小さかったことを除けば、すべて非常によく似ています。
  • 今日の基準からすると、1989 年のデータセットはまだ幼稚なものでした。トレーニング セットは、わずか 7,291 枚の 16 x 16 グレースケール画像で構成されていました。今日のビジョン データセットには通常、Web から取得した数億枚の高解像度カラー画像が含まれており (Google には JFT-300M、OpenAI CLIP は 4 億枚の画像でトレーニングされています)、その数は数十億枚にまで増える可能性があります。各画像に含まれるピクセル情報は1000倍(384 * 384 * 3 /(16 * 16))に増加し、画像数は100,000倍(1e9 / 1e4)に増加し、大まかに言えば、入力されるピクセルデータは1億倍以上増加しています。
  • 当時のニューラル ネットワークもまだ「赤ちゃん」でした。パラメータは約 9760 個、MAC は 64K、アクティベーションは 1K 個でした。現在の(視覚)ニューラル ネットワークには数十億のパラメーターがありますが、自然言語モデルには数兆のパラメーターがある場合があります。
  • 当時は、ワークステーションで SOTA 分類器をトレーニングするのに 3 日かかりました。今では、ファンレス ラップトップでトレーニングするのに 90 秒しかかかりません (3000 倍高速)。フルバッチ最適化に切り替えて GPU を使用すると、速度は 100 倍以上向上します。
  • 実際、データセットとモデルのテスト時間を同じに保ちながら、最新のイノベーションに基づいてモデル、拡張、損失関数、最適化を微調整することで、エラー率を 60% 削減することができました。
  • データセットを拡大するだけで、適度な利益が得られます。
  • さらなる大幅な向上は、おそらくより大きなモデルから得られるはずであり、それには、ますます拡大する規模でトレーニングを安定させるために、より多くのコンピューティングと追加の研究開発が必要になるでしょう。もし私が 1989 年にタイムスリップし、もっと大きなコンピューターを持っていなかったら、システムをこれ以上改善することはできないでしょう。

この練習セッションが時間的に同じままであると仮定すると、これは 2022 年のディープラーニングにとって何を意味するのでしょうか? 2055 年から来たタイムトラベラーは、現在の Web のパフォーマンスをどのように見るでしょうか?

  • 2055 年のニューラル ネットワークは、マクロレベルでは 2022 年のニューラル ネットワークと本質的に同じになりますが、規模がはるかに大きくなります。
  • 今日のデータセットとモデルは冗談のように見えますが、2055 年には両方とも約 10,000,000 倍の大きさになります。
  • 週末のプロジェクトとして、パソコンで 1 分以内に 2022 SOTA モデルをトレーニングできます。
  • 今日のモデルは最適化されておらず、モデルの詳細、損失関数、機能強化、または最適化を変更してエラーを半分に減らすだけです。
  • 私たちのデータセットは非常に小さいので、拡大することで適度な利益を得ることができます。
  • コンピュータ インフラストラクチャを拡張し、それに見合った規模で効率的なトレーニング モデルの開発に投資しなければ、さらなる成果は得られません。

しかし、私が伝えたい最も重要な傾向は、GPT のような基本モデルの出現により、特定のターゲット タスク (数字認識など) に応じてニューラル ネットワーク全体を最初からトレーニングするという設定が、「微調整」によって時代遅れになるということです。これらの基本モデルは、大規模なコンピューティング リソースを持つ少数の組織によってトレーニングされ、ほとんどのアプリケーションは、ネットワークの一部に対する軽量な微調整、迅速なエンジニアリング、またはデータとモデルをより小さな専用の推論ネットワークに抽出するオプションの手順を通じて実現されます。

この傾向は今後も活発になると思います。もう一度ニューラル ネットワークをトレーニングしたくないと仮定してみましょう。 2055 年には、10,000,000 倍の大きさのニューラル ネットワーク ブレインに話しかけて何らかのタスクを実行できるようになります。リクエストが十分に明確であれば、リクエストは承認されます。

もちろん、ニューラル ネットワークを自分でトレーニングすることもできますが、なぜそうする必要があるのでしょうか?

<<:  ディープラーニングの台頭から10年:OpenAIのイノベーターたち

>>:  Google: パフォーマンスの低い微調整モデルを捨てず、平均重量を計算してパフォーマンスを向上させる

推薦する

AI業界は大きな変化を遂げています。AI科学者がMVPになるには

20 年前、人工知能の研究に興味を持つ人は、主に大学や非営利の AI 研究所に限られていました。 A...

データ分布の正規性を判断するための11の基本的方法

データ サイエンスと機械学習の分野では、多くのモデルはデータが正規分布していると想定しているか、デー...

パンデミック中の人工知能技術の5つの主要な応用

デジタルセンチネル現在、上海では多くの場所にデジタル監視装置が配備されており、出入国する人は健康コー...

Minglue TechnologyのCTO、Hao Jie氏との独占インタビュー:ビッグモデルも破壊され、製品の臨界点を見つける必要がある!

ゲスト | ハオ・ジエインタビュー | 袁偉執筆者 | Yun Zhao 「短期的な価値を過大評価し...

...

2024 年のエネルギー管理における AI のトレンドトップ 10

アクセンチュアのレポートによると、エネルギー分野で AI を活用することで、2035 年までにエネル...

AIと「喧嘩」したくない?人々はどんなスマートホーム体験を望んでいるのでしょうか?

スマートホームの発展過程で、その定義は何度も変化してきました。当初のリモートコントロールの概念から、...

Apache Flink トークシリーズ - PyFlink のコアテクノロジーを公開

皆さんこんにちは。本日のサミットで Apache PyFlink のコア技術を皆さんと共有できること...

将来ロボットは人間の皮膚を持つようになるかもしれないが、その外見はかなり恐ろしい

ロボットは科学者の主な研究分野となっており、この分野の技術が進歩し続けると、ロボットがこの社会の主な...

IEEE年末AIレビュー:ネットユーザーがGPT-3に悪態をつくよう教える、DeepMindが再びロボットを作る

[[442763]] 2021年、「人工知能の奇跡」はもはや単なる物語ではありません!年末が近づく中...

Appleとオレゴン州立大学がAutoFocusFormerを提案: 従来のグリッドを廃止し、適応型ダウンサンプリング画像セグメンテーションを使用

従来の RGB 画像はラスター形式で保存され、ピクセルは画像全体に均等に分散されます。ただし、この均...

ドローンによるマッピング:建設業界の再考

[[392894]]建設業界は技術変革の瀬戸際に立っています。建設業界では新しい技術の導入が遅れるこ...

...

独学で機械学習エンジニアを目指す人のための 10 の戒律

コードを書くのは少し憂鬱になるので、色に囲まれる必要があります自己規律や自己学習という言葉を軽く受け...

...