#15 – Neural Machine Translation by Jointly Learning to Align and Translate

Neural Network における “Attention” の概念をうみだした機械翻訳の論文 “Neural Machine Translation by Jointly Learning to Align and Translate” を森田が紹介します。

今回は根性不足によりあまり編集しておりません。聞き苦しい部分はご容赦ください。

 

#13 – HyperLogLog in Practice

確率的アルゴリズム HyperLogLog に関する論文 “HyperLogLog in Practice” を 森田が紹介します。感想などはハッシュタグ #misreadinghello@misreading.chat にお寄せください。

Follow up

PyTorch, Chainer and Forking

Episode 13 の雑談で “PyTorch は Chainer のフォークである” というニュース記事の主張について議論しましたが、その後調べ直したところいくつか森田の勘違いがあったので現状の理解を改めて書いておきます。

まず PyTorch のソースコードや Git レポジトリの log を見るかぎり, ライセンスやコメント、コミットログや明らかなコードの重複など、はっきりとしたフォークの証拠はありません。(API の模倣については当事者による論文のドラフトなど何箇所かで言及されています。)

ウェブを検索してみると、以下のツイートが証言としてリンクされていました。

他の関係者の発言は見つかりませんでした。唯一の証言であるこの J 氏のツイートを信じるなら、フォークされたのはどうも autograd だけのようです。一方で、そもそもフォークではないと主張する証言もみつかります。

どちらの主張が正しいのでしょうか。

フォークを主張する J 氏は PyTorch への数個のコミット履歴をもつ、コードレベルでは比較的カジュアルなコントリビュータです。一方フォークでないと主張する A 氏は継続的なコミットを続ける top contributor件の autograd コードを最初にコミットとしたのもこの A 氏です。発言者の credibility という点では、フォークでないと主張する A 氏に軍配があがるのではないでしょうか。

はっきりとしたコードの類似性がないと書きましたが、実物を比べてみましょう。PyTorch での最初の Autodiff 実装はこのコミットです。一方、同時期の Chainer (1.13.0) の実装はこれ。グラフのトラバース先をキューにつめながら反復的に gradient を解決していく基本のアプローチは同じですが、表層的なコードの様子は随分違うのがわかると思います。

これは無理もない話です。Autograd のコードはどうしてもベースとなる Tensor 計算用の API に引きずられます。Chainer はその計算に CuPy というライブラリを使っています。(先に登場したバージョン 1.13.0 の時点ではまだ Chainer の一部でした。) 一方の PyTorch は Lua Torch 由来の C ライブラリをラップして使っています。

どちらも NumPy を模している点では似ていますが、drop in の互換性があるとは思えません。特に初期の PyTorch に含まれる Tensor 実装は極めて制限されたものでした。PyTorch にチェックインされた時点の autograd はごく短い単純な実装でしたから、互換性の低い CuPy を Torch に入れ替えて使えるようにするよりは Torch 向けに自分で書いてしまった方が簡単に見えます。

フォークというのはソフトウェアとして切り出しやすい単位で行わないと有り難みがなく、Autograd はその単位としてやや筋悪なのです。そういう意味でも “Autograd のコードがフォークである” とする J 氏の証言は疑わしく思えます。なお J 氏は同じツイートで “のちにコードは pure C の高速バージョンに書き直された” と言っていますが、これも厳密には間違いです。現状の PyTorch の autograd は C++ で書かれており、かつ演算単位では Python にフォールバックする可能性もある “pure C” とは程遠いものだからです。

というわけで PyTorch の Chainer フォーク説はよく似せられた API とひとつのツイートが生み出した都市伝説であるというのが自分の結論です。

フォークかどうかはさておき、API のようなソフトウェアデザインの重要な部分で PyTorch が Chainer を真似しているのは事実です。これはサンプルで引き合いにだされる NN モジュールだけでなく、 Variable や Function といったクラス、forward, backward メソッドの在処など autograd のレイヤについても言えます。ただしこれらが純粋に Chainer 由来なのか、Harvard の NumPy Autograd のような他の実装にも共通するパターンなのかについては、もう少し調査しないとわからないですね。


追記

記事を書かれた中田さんからお返事をいただきました。論拠となったのは先のツイートではなく、Facebook AI の中の人の Reddit 上の発言とのことです。

#11 – The Story in the Notebook

Jupyter Notebook の利用実態を調査した “The Story in the Notebook: Exploratory Data Science using a Literate Programming Tool” と “Exploration and Explanation in Computational Notebooks” を森田が紹介します。感想などはハッシュタグ #misreading か hello@misreading.chat にお寄せください。

 

 

#09 – Automatic Differentiation in Machine Learning: a Survey

自動微分のサーベイ論文 “Automatic differentiation in machine learning: a survey” を 森田が PyTorch のコードを読みつつ紹介します。感想などはハッシュタグ #misreadinghello@misreading.chat にお寄せください。

Follow-up and Correction

  • PyTorch の論文は 2017 の Autodiff Workshop で発表されていたようです。
  • 10:25 あたりで計算途中の変数が Tensor になっていると言っていますが、Variable の間違いです。

 

Notes on Episode 07

Truffle の最適化が一般的なコンパイラの最適化と大きく異なるところは, Truffle では個々のオブジェクト (AST のノード) ごとにメソッドの実行時プロファイルを集計しているところです。大半のコンパイラは、関数などのコード単位でプロファイルをとり、オブジェクト (receiver やその他の引数) ごとにプロファイルを分類はしません。

なぜこの性質が重要なのでしょうか。論文中の例にならい “+” 演算子を実装した AST ノード AddNode の例で考えてみましょう。この AddNode は引数が数値型か文字列か、あるいは独自の “+” を定義したクラスのオブジェクトかで挙動が変わるとします。もしコンパイラがコード単位で、たとえば AddNode#execute() という単位で実行時情報・・・ここでは引数の型・・・を集めるなら、あるプログラムの中に数値のプラスと文字列のプラスが現れた時点で AddNode#execute() は多態的なコードを生成する必要が生まれます。

Ruby, JS など動的なゲスト言語の AST は、ホスト言語である Java から見るとどうしても多態的になってしまうです。

Truffle では、文字列を扱う関数 F と数値を扱う関数 G の中で登場するプラス演算子の AST ノードがそれぞれ独立して実行時の情報を集めます。おかげで F の中では文字列を連結するコードを、G の中では数値を加算するコードを、生成することができます。

一般的なプログラムではあまり重視されていないオブジェクト単位の実行時プロファイルが、どうして Truffle では重要なのでしょうか。それは Truffle の AST がゲスト言語にとっての「コード」だからです。AST インタプリタとして実装されたゲスト言語がふつうの最適化コンパイラがやるようなコード単位の実行時プロファイルを集めたいと思ったら、AST の上にそのデータを置くのは自然なことです。

Truffle はそうしたデザインを前提として、最適化のためのヒントである実行情報をAST のオブジェクトとの間でやりとりする API を提供しました。それらの API をある種の instrincis として特別に解釈し、ふつうのコンパイラにはできないような最適化が可能になるのです。

 

#07 – One VM to Rule Them All

Graal VM のデザインを説明した論文 One VM to rule them all を森田が紹介します。

Graal VM のデザインを説明した論文 “One VM to Rule Them All” を森田が紹介します。感想などはハッシュタグ #misreading か hello@misreading.chat にお寄せください。

Follow-up and Correction

#05: Agile CPU / Versioned Golang

アジャイルなCPU開発とGoの次世代バージョン管理。

森田が紹介するのは CPU をアジャイルの流儀で開発しようと主張する An Agile Approach to Building RISC-V Microprocessors, 向井が紹介するのは Go の次世代バージョン管理システムのデザインを解説した Go & Versioning です。感想などはハッシュタグ #misreading か hello@misreading.chat にお寄せください。

An Agile Approach to Building RISC-V Microprocessors

Go & versioning

Miscellaneous

Correction

  • Maven 3 Processor のクロック切り替え所要時間を 20 秒と言っていますが 20 ナノ秒の間違いです。20 秒で切り替わっても何も嬉しくないですね・・・
  • SATの正式名称は Boolean Satisfiability Problemでした。言い間違えました。

 

#04: Filesystem on NVM / Self-Driving Car on Dessert

向井が紹介するのは Linux 上に不揮発性メモリ用のファイルシステムを実装、評価した NOVA: A Log-structured File System for Hybrid Volatile/Non-volatile Main Memories, 森田が紹介するのは 2005 年の自動運転自動車レースで優勝したクルマのシステムを概観する Stanley: The Robot that Won the DARPA Grand Challenge です。
感想などはハッシュタグ #misreading などにお寄せください。

NOVA: A Log-structured File System for Hybrid Volatile/Non-volatile Main Memories

Stanley: The Robot that Won the DARPA Grand Challenge

Miscellaneous:

#03: New Grads Struggle / Data Scientists Strive

新入社員の苦労とデータサイエンティストの苦悩

森田が紹介するのは新入社員が職場に慣れて活躍するまでの苦労について調べた Ramp-up Journey of New Hires: Tug of War of Aids and Impediments, 向井が紹介するのはデータサイエンティストの生態について調べた Data Scientists in Software Teams: State of the Art and Challenges です。どちらも Microsoft Research の研究者 Thomas Zimmermann と仲間たちが同社内で行った調査に基づく論文。Microsoft の舞台裏を覗き見ることができる・・・かもしれません。感想などはハッシュタグ #misreading などにお寄せください。

Ramp-up Journey of New Hires: Tug of War of Aids and Impediments

Data Scientists in Software Teams: State of the Art and Challenges

Misc.

Correction