「プログラマが本当に理解するには実装しないといけない」か

ジュンク堂池袋本店にて 10/11 に行われた「パターン認識機械学習」(PRML) 愛好家の集まり、じゃあなかった、トークセッションにのこのこ行ってきた、ばかりか前でしゃべってきた。ありがとうございました&お疲れ様でした>各位

PRML同人誌 『パターン認識機械学習の学習』(暗黒通信団) 刊行記念トークセッション 「今度こそわかる!? PRMLの学習の学習」
http://www.junkudo.co.jp/tenpo/evtalk.html#20121011_talk


参加して下さった上に感想までブログにしたためて下さった方には感謝感謝なわけだが、そういったブログの中で、@ さんがちょうど今気にしていたことを書かれていたので、ちょこっと紹介。

余談:PRMLの学習と実装に関する疑問について.
実装の話はトークセッションではあまり出て来なかったのだが,帰り際の電車の中で実装に関する疑問をふと思いついて「さっき訊いときゃよかった」と思ったので,折角なので書いてみる.

プログラマーなどは,アルゴリズムを自分で実装しないと本当に理解したことにならない,なんてことがよく言われるけれども,そういう環境で育った技術系の人がPRMLを読み始めると「書いてあることをひと通りまんべんなく実装しないといけない」みたいな感じになって,取っ掛かりとしては非常に辛いんじゃないかなーという個人的な印象がある.


全文は yag_ays さんの記事を参照してもらうとして、まず「実装によって理解が得られる」というのは本当のことかどうか。
PRML 読んでこんだけ実装しまくっている人間なら、この点について語ってもいいだろうw


例えば実装してみて初めて「あれー、このパラメータの初期値どうするんだろう。PRML には書いてくれてないな……」ということがわかったりする。あるいは、「肝心な更新式はどこに書いてあるんだろう。え? この演習問題解かないといけないの!?(汗」ということも。
実装するということは自ずと全てのステップを網羅することになる。一つでも飛ばしたら実装が完成しない。そのおかげで、気づいていなかった理解の漏れをチェックしてくれる効果はある。


よって、「実装によって理解が得られる」は真、というのは早とちり。
正確には、実装は「理解の漏れをチェックしてくれる効果」があるとしか言っていない。
その漏れを埋めるためにパラメータの初期値を行間から読み取ったり推測したり、演習問題を解いたりすることで初めて理解が得られるが、それは明らかに実装とは独立した話だ。推測したパラメータでうまくいくか検証するときには実装が役に立つが、それは他の人が実装したものでも良い*1


また、仮に実装ができて漏れているステップはなさそうな雰囲気だからといって、個々のステップの理解が完全であるかは保証してくれない。「たまたまあってる」なんてのはよくあることだし、「間違っているのに気づかない」なんてもっとよくあること(ぐさっ)。


さてそうなると、せいぜい「実装することによって理解を得るチャンスが増える」というくらいが正解なのだろう。少なくとも「自分で実装しないと本当に理解したことにならない」なんて気負う必要などどこにも無いということは断言してもいい。


それでもつい「実装しなければいけない」と思ってしまう背景には、「実装するのは時間がかかる」事情がある。価値は感じているけどやりたくないことを「〜しなければいけない」と活用変化することで、モチベーションを無理やり捏造しているわけだ。
しかし、一般に「〜しなければならない」という強迫観念は学習効果を下げるだけなことは、「宿題しなさい!」と怒られ続けた方々には今更証明の必要もないだろう。


実際、世の中的には「三度の飯よりコードを書くのが好きな連中」(※注:真実)だときっと思われているだろうサイボウズ・ラボの中の人でさえ、PRML 読んでこんだけ実装しまくっているのは約 1 名しかいないのである。
ここまで言えば「実装しなければいけない」なんて悩む必要はないことは十分納得してもらえるのではないかと思うのだがどうだろう。


そんな事情に最近ようやくちょっと気づいてきて、正直反省している。
「やっぱり実装するべき?」と聞かれた時、つい気楽に「実装してみたらいいんちゃう?」と答えてしまっていたが、そんな無責任な意見でもしかしたら何人か PRML を読むのを断念させてしまったのではないか、と。
コードを書くことに、このブログ記事を書くのと同じかそれより低いコストしか感じてない、つまり「実装するのは時間がかかる」なんて露も思ったことがなく、「ちゃっちゃと実装したほうが早い」という人なので、間違ってもこの人にそんな質問をしてはいけない。


と、だからといっていきなり「実装しなくてもいいんだ!」という方向に振り切れてしまうのも良いことではない気がするので、安定少数派な実装組の援護射撃もしておこう。


「実装」もノートの上で計算するのと同等な理解のための手段の1つである。それを使えるかどうかは人によるわけだが、いわゆるプログラマはその点で非常に有利な立場にいる。せっかく使えるのだから使わない手はない。


例えば、今ちょうど甘利さんの「情報理論」を読んでいて、今まで超苦手だった情報量やエントロピーという概念をボトムアップで定義してくれていて、なんだそういうことだったのか、もっと早く読めば良かった……! と大変感動しているわけだが、それはまた別の話。
それはともかく、「情報理論」の中に英文のエントロピーとして、1-gram のエントロピーは 4.15 ビット、2-gram のは 3.57 ビット、8-gram になると 2.35 ビット……という話が出てきて、特に 8-gram のエントロピーの計算に対しては「まことにご苦労様な話である」などと添えられている。
この本が最初に出版された 1970 年なら確かに気が遠くなるほど高価な機械とそれを扱う技術が必要だったろうが、今なら適当な PC の上で「へー本当かなあ」くらいの軽い気持ちで確認してみることができる。あなたがコードを書けたなら。


「実装しなければならない」と考えるのではなく、「理解のための手段として実装という手も使える。プログラマとして、これほど有利な立場は活かしたいところ」(非プログラマにはそもそもその選択肢がない)と考えれば、ずいぶん見え方が変わってくるんじゃあないだろうか。

*1:パラメータをあれこれ入れ替えて実験するには自分で実装したもののほうがやりやすいくらいのことはあるだろうが、そこは本質的ではないということは認めてもらえるだろう