bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

『微分可能プログラミング』はどこから来たのか

はじめに(8/3追記)

この記事を一旦書いたあと、重要な追加証言が得られたため、追記修正しています。結論もやや変わっていますが、現時点のほうがより正確です。

本編:ここから

ディープラーニングが現在これだけ流行っている1つの要因は、TensorFlowやPyTorchなどのフレームワークが非常に便利だからです。ニューラルネットワークの設計、訓練、そして分類などの推論がフレームワークを使えばとても簡単に行なえます。

普通に使っている人達は、これらのフレームワークを『ツール』あるいは『ライブラリ』だとみなしていると思います。でも実際のところ、これらはプログラミング言語です。より正確に言えば、すべてのディープラーニングフレームワークディープラーニング計算用DSL(Domain-Specific Language、ドメイン特化言語)と見なせます。このDSLは大抵、Pythonなど他の汎用言語への埋め込み型で定義されています。

これらDSLに共通して言える特徴が微分可能性です。そのDSLで書かれたプログラムは自動で微分できて、その微分の結果に依って内部のパラメータを自動更新できるのです。

あるとき、僕はネット上のどこかで"differentiable programming language"と書いたwebページを見かけました。それがいつだったか、どのサイトだったかははっきり覚えてないのですが、2017年頃だったと記憶してます。

その後、今年チューリング賞も獲ったディープラーニングの父の1人であるYann LeCunがこんな記事Facebookに投稿しました。2018年1月7日のことです。

OK, Deep Learning has outlived its usefulness as a buzz-phrase.
Deep Learning est mort. Vive Differentiable Programming!
(雑な訳:OK、ディープラーニングはバズフレーズになって、便利なものを遺してくれた。
ディープラーニングはお亡くなりになった。微分可能プログラミング万歳!)

そして、この記事が結構バズりました。

この記事が有名になりすぎたのか、ちょいちょい「LeCunが『微分可能プログラミング』を考えついた」と書いた文章を見かけるようになり、結構戸惑いました。しかもその後、かの Gordon Plotkin(プログラム言語理論研究の大家です)が “Some Principles of Differential Programming Languages”というタイトルの基調講演を、POPL’18という、 プログラム言語理論のトップカンファレンスでしていたのを知りました。この講演が2018年1月初旬。なので、LeCunが起源という噂とは矛盾します。

それで、僕はこのフレーズのオリジナルは何なのかを調べ始めました。折しも今年の3月にPlotkin先生が来日していて、そのおかげで重要なヒントを先生からもらうことができました。

イデアの起源

Plotkin先生がこのアイデアを最初に知ったのは2015年のChris Olahのブログ記事だそうです。ニューラルネットと、関数型言語に登場する型システムって実は似てるんじゃない? といった趣旨の記事なんですけど、そこには"differentiable functional programming language"(微分可能関数型プログラミング言語)というフレーズが登場します。

僕自身が調べて、これ以上前に"differentiable programming"の類の言葉を見つけることはできませんでした。 せっかくなので、Chris Olahにも直接メールを出して、このフレーズは誰かを参考にしたのか聞いてみました。その返事がこちら(もちろん、彼女の掲載許可は取っています)。

I'm not aware of any discussion of "differentiable programming" exactly prior to my post, although it's possible there are things I am unaware of.
I do think there were similar ideas floating around. For example, Leon Bottou has a line in this paper drawing analogies between neural nets and list manipulation in LISP.
(雑な訳:私の記事より本当に前に"differentiable programming"の議論をしたものは知りません。私が気づいてない可能性ももちろんあるけど。
似たようなアイデアはいろいろ漂ってたとは思います。Leon Bottouはこの論文で、ニューラルネットLISPのリスト操作が似てる、と言うようなことを書いています。)

ちなみに、Olahの記事にはYann LeCunもコメントしています。なので、彼は少なくともこの記事は読んでいますね。

その後2016年に、Atılım Güneş Baydinによる"Diffferentiable Programming"と題した講演があったようです。BaydinはOlahの記事を参照しつつ、"differentiable programming"というフレーズを何回も使っています。

さらにこの中ではDavid Dalrympleのエッセイも参照していて、ここでも"differentiable programming"という言葉を使っています。やはり、ニューラルネットと関数型プログラムが似ている、という話を書いています。
彼にもぜひアイデアの起源を聞いてみたいと思ってるんですけど、Twitterのアカウントしか見つからなかった……ので、詳細を聞けるかどうかはまだわかりません。
記事を一旦公開した後、Dalrymple氏と連絡が取れました。色々話を聞くことができたんですが、この件については以下のような証言をしてくれました。

I definitely got the idea from Olah's blog. I also have strong reason to believe LeCun read my essay before popularizing the perspective, and I think it was a substantial influence. But I'd bet LeCun also read Olah's blog already so I don't want to take much credit, except for streamlining the phrase by removing the word "functional".
(雑な訳:私はこのアイデアを間違いなくOlahのブログから得ました。また、LeCunがこれを広める前に私のエッセイを読んだ、と思える強い理由があって、なのでそれなりの影響はあったと思います。でもLeCunはOlahのブログも読んでいただろうし、たくさん手柄を主張したりはしたくありません。ただし、”functional"という単語をそのフレーズから抜いたのは私の影響だと思います。)

その証言をブログで公開していいか、と聞いてみたところ、少しの逡巡があって、以下のコメントも含めてくれ、と頼まれました。

I cited Olah's blog in the manuscript I sent to EDGE.org, but the editors removed the citation with the justification that references to outside works are against the editorial policy of EDGE.org (which prioritizes self-containedness over other intellectual virtues like giving credit where credit is due). Removing the citation then made it seem like I was implicitly claiming novelty in the essay and I regret that.
(雑な訳:私は EDGE.org (注:彼のエッセイが載ったメディア)に送った原稿にはOlahのブログへの参照を入れていましたが、外部の文献を参照するのは EDGE.org の編集方針に反する(必要なクレジットを入れるなど知財面をきれいにするより、自己完結していることに重きを置く)という理由で編集者によって削除されました。削除によって私がエッセイで暗に新規性を主張したかのようになってしまい、後悔しています。)

彼が誠実であろうとすることに、僕は敬意を評します。

ちなみに、Baydinは2018年にサーベイ論文も書いていて、この中で、"differentiable progamming"の提唱者としてChris Olah, David Dalrymple, そして Yann LeCun の3人を挙げています。

と言ったあたりなので、 僕の調べた限りだと、Chris Olahがこのアイデアを思いついた一番最初で、David Dalrympleがそのアイデアから『微分可能プログラミング』("differentiable programming")というフレーズを生み出しました。Yann LeCun は起源ではないですが、このアイデアを大きく普及させたのは間違いなく彼の功績です。

謝辞

記事を書くにあたり、こちらの不躾な質問に快く回答下さった Gordon Plotkin先生とChris Olah、そして David Dalrymple に感謝します。

追記

英語版も書いたよ。 bonotake.github.io

追記2

微分可能プログラミングって昔からある自動微分と何が違うん?」って質問を頂いたのですが、というか割と想定質問だったんですけども、「深層学習の文脈で同じようなものに別の名前をつけた」とか「深層学習を一般化したら昔から自動微分と言われるようなものになった」っていうのが一番近しいのかもしれないです。そんで、深層学習向けに自動微分よりも拡張されたものになっています。
恐らくですが、本文中でも紹介したBaydinらのサーベイ論文を読むのが一番わかり易いかも。

追記3

TensorFlowなどのフレームワークが実際back propagationのときにどういう「微分」をしてるか、は↓の「ゼロディー」にめっちゃくちゃ平易に解説してあるので読んでみてください。

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。