John Carmack:プログラミングに費やした1週間の休暇

先週Facebookで公開され、 人気を博した John Carmackの投稿の翻訳に注目してください。



長い休憩の後、私はついに別の休暇をとることに決め、それをプログラミングに費やしました。 1週間の間、私は通常の仕事のプレッシャーからかけ離れて、隠者モードで落ち着いて仕事をすることができました。 妻は私に数年間そのような休暇をとるように寛大に申し出ましたが、休暇と私は基本的に弱い相性のものです。



Oculusでの現在の作業後の風景の変化として、C ++でニューラルネットワークのゼロからの実現をいくつか書きたかったので、厳密にOpenBSDシステムを使用してこれを行う予定でした。 私の友人の誰かが、これはかなりランダムなテクノロジーのセットであることに気づきましたが、最終的にはすべてうまくいきました。



私は仕事でOpenBSDを使用する必要がなかったという事実にもかかわらず、私はいつもそのアイデアが好きでした-それは全体的なビジョンを持ち、品質と職人技に重点を置いた比較的ミニマルで独立したシステムです。 Linuxは多くの機能を備えていますが、整合性はLinuxについてのものではありません。



私はUnixの熱烈なファンではありません。 このオペレーティングシステムでは良い仕事をしていますが、WindowsのVisual Studioでは最適です。 古いUnix学校のスタイルで仕事に没頭する週は、私にとっては完全に興味深いものになると思っていました。 それはレトロコンピューティングの精神における一種の冒険でした-fvwmviはしばらくの間私の親友になりました。 注意-vimではなく、BSDの本当のviです。



結局、私はシステムを望みどおりに深く探ることができませんでした-95%の時間をvi / make / gdbで単純なアクションのみを実行しました。 インターネットを検索せずに、システム自体ですべてを実行しようとしたため、 マニュアルページの高品質を高く評価しました。 Tektronix端末のように、30年以上前に遡ったものへのリンクを見るのは面白かったです。



C ++サポートが標準に達していないことに少し驚きました。 G ++はC ++ 11をサポートしていませんでしたが、LLVM C ++はgdbでうまく機能しませんでした。 Gdbが2回以上クラッシュしました-C ++の問題のために私には思えます。 ポートを介して最新バージョンにアップグレードすることは可能ですが、基本システムのみを使用することにしました。



振り返ってみると、「フルレトロ」な方法ですべてをANSI Cで書かなければならなかったと思います。私の人生では、多くの古いプログラマーのように、次のように考える日がしばしばあります。 C ++は一般的に考えられているほど良くありません... "。 私は彼についてとても気に入っていますが、純粋なCで小さなプロジェクトを書く負担はありません。



おそらく、次の休暇では、1つのemacsのみを使用するようにします。これはプログラミング文化のもう1つの重要な層であり、適切に知ることができませんでした。



私はほとんどの機械学習アルゴリズムがどのように機能するかについて非常に一般的な理解を持っています。線形分類器と決定木を書かなければなりませんでしたが、何らかの理由で常にニューラルネットワークを避けました。 機械学習に関するファッショナブルな「誇大広告」が私の中に懐疑的な人の注意を喚起したのではないかと心の底から思っています。



レトロなテーマに固執し続けて、私はJan Lekunによる古い出版物をいくつか印刷し、まるで山小屋にいるかのようにすべての作業をオフラインで行うつもりでしたが、それはすべて、Stanford CS231N YouTubeコースの多くの講義をレビューしたという事実で終わりました。便利です。 私が時間を浪費することを正当化することは通常困難であるという事実のために、私はビデオ講義を見ることはめったにありませんが、休暇中はそれを買う余裕があります。



共有すべきニューラルネットワークについて価値があると思うことはないと思いますが、理論的に「本」の知識を実際の経験に変えることができたのは、私にとって非常に生産的な週でした。



私の仕事では、従来のアプローチを使用しました。最初に、粗く「ハッキングされた」コードを書いてすぐに結果を取得し、次に、学んだ教訓に基づいてゼロから新しい実装を記述します-このようにして、両方の実装が機能し、必要に応じて、それらを互いに比較できます( クロスチェック )。



最初は、 バックプロップ法を数回誤解しました-ターニングポイントは数値微分との比較でした! ニューラルネットワークのトレーニングは、そのさまざまな部分が完全に正しくない場合でも行われることは興味深いように思えました。受信したサインがほとんどの場合正しいままである限り、事態はしばしばさらに進みます。



多層ニューラルネットワークの結果のコードに満足しました。 これは、今後の実験で簡単に使用できる形式になっています。 はい、深刻なことのために、既存のライブラリを使用する必要がありますが、実際には、コードの各行を記述した.cppファイルと.hファイルを手元に置いておくと便利な場合が多くあります。 畳み込みニューラルネットワーク( conv net )のコードは、「動作するが、多数のハックがある」フェーズのみに到達できることが判明しました。明確で柔軟な実装を作成するために、さらに1〜2日費やすことができました。



畳み込みを追加する前にMNIST手書きの デジタル化 サンプルのデータベース)で最初のニューラルネットワークをテストしたとき、 非畳み込みNNの指定値よりもはるかに良い結果が得られたことは興味深い1998年のLeCunの比較で示されています-100ノードの1層のテストセットでのエラーの約2%に対して、当時のより広く深いネットワークでは3%です。 ここでのポイントは、 ReLUSoftmax 、初期化の改善など、最新のベストプラクティスにあると思います。



これは、ニューラルネットワークの最も印象的な特性の1つです。それらはすべて非常に単純であるため、画期的な成果は多くの場合、わずか数行のコードで表現できます。 どうやら、コンピューターグラフィックスの世界からのレイトレーシングにはいくつかの類似点があり、 物理ベースのライトトランスポートレイトレーサーを迅速に実装し、必要なデータと十分な忍耐力を持っている場合、最新のイメージを作成できます実行結果を待ちます。



いくつかのトレーニングパラメータを研究することで、 オーバートレーニング/生成/正則化の原理をよりよく理解しました。 休暇の最後の夜に、私はアーキテクチャに触れず、ハイパーパラメータで遊んでみました。 結局のところ、「 彼女がトレーニング中」 集中力を維持することは、コンパイル中 」の古典的な場合よりもはるかに困難であることが判明しました。



Oculusでの仕事に新しいスキルを適用する適切な機会を見つけるために、両方を調べます。



私の不在中に私のメールボックスと職場が何に変わったのかを考えることすら怖いです-明日も会いましょう。



All Articles