去年の4月くらいから、論文を読む事が出来るようになった、という気がしている。 もう一年以上前の話なんだが。なんとなくその事をブログに書いてなかったな、と思ったので、ここに書いておく。

論文を読む、というのは、みんなやっている、と主張はするものだ。 ちゃんと理解できているかは怪しいものだが、 一方でその区別もそんなにはっきりとはしていないので、 誰が論文は読めて誰が読めてないのかもよく分からない。 論文の分野にもよるからますます一概には言えない。

ただ、機械学習の仕事では論文を読むのは重要な日常業務の一つで、 この能力が明らかに不足している人というのはかなり居る。 明確な境界を決めるのは無理だけれど、明らかに足りてない場合は明白に分かるし、皆が言う程はこの能力は簡単な物では無い。

実際、自分も2015年ころには、この論文を読む能力が低くて困っていた。 2017年の4月頃には読めるようになったな、と感じるようになっていたので、 この二年間くらいに身に着けた能力という事になる。 そんな比較的最近に身に着けた能力なので、 この能力を身につける難しさみたいなのはもうちょっとみんな語ってもいいんじゃないかなぁ、と思う。

機械学習の入門記事などで一番欠けているのが、この論文を読む、という事についての話なんじゃないか、と思ってる。必要性とかどうしたら出来るようになるのか、とか。 必要性とか実務との関わりはいつか別エントリで書くとして、ここでは論文を読むという事について話をしたい。

論文は読んでいくとだいたいは、一番重要な部分がなんだかよく分からない。 これを自分で克服する能力があるか無いかの差はすごく重要で、 これは訓練して身につける類の特殊技能だと思う。

そこらのプログラマが「週末は論文を読んだりして勉強してますよ」とかいうやつは、だいたいこの重要な所をさっぱり分かってないまま誤魔化しているだけだ。たぶん。

論文を読む能力とは何か、という事を考えるにあたり、 まず大切な事は、論文にはわかりやすい論文と分かりにくい論文がある、という事だ。 中には誰がどうやったって分からない論文、というのもある。

こういう、論文のわかりやすさのスペクトルの中から、 どれくらい分かりにくい論文まで理解出来るのか、というのが論文を読む能力という事になる。 だから本質的に、論文を読む能力というのは程度問題だ。

ただ一方で、だいたいこの位は読めてほしい、というコンセンサスもある程度はある。 例えば、トップカンファレンスなどのように厳しく査読されていて、 これは特別分かりにくいという訳でも無いような、 いわゆる普通の論文くらいの分かりにくさをちゃんと克服出来るか、 というのが、論文を読む事が出来るか、という基準だと思う。 そういうのをここでは「普通の論文」と呼ぼう。

関連論文を読む難しさ

普通の論文を読む難しさはいくつかある。

まず、論文単体では理解できない、というのが難しさとしてある。 論文はだいたいは既存の研究を踏まえた上で、何か新しい事をやる物だ。 だから既存の研究を踏まえてないと分からない事が多い。 だから普通の論文を読んで理解する為には、その分野についての知識が必要になる。

どうやってその分野の知識を得るか、というと、普通は関連論文を遡る事になる。 ここには2つ難しさがある。

  1. 関連論文の数が多くてどれを読んだらいいか分からない
  2. 一つ遡った論文はまた違う論文達を前提とするのでさらに遡る必要があり、これがどんどん続いてしまう。

この2つをどう克服していくべきか、というのは、かなり総合的な話に思う。

カンを磨く

関連論文がたくさん挙げられてどれを読んだらいいか分からない、という問題に対しては、とりあえずカンで選ぶ、という事になると思う。

何度も「これが重要かな?」と予想してみて、実際に読んで、あたったり外れたりを繰り返す。そうするとだんだんこの予想はうまくなる。(気がする)

他にも後述するように、関連分野に関する理解を深めるというのも大切。

根本原理的な常識の底上げ

どんどん遡っていかないといけない、という問題に対処するには、「ここ」まで遡ればあとは分かる、 というような地点をちゃんと作っておくのが一つの対策と思う。 この地点が今読みたい論文から近ければ近い程、遡らなきゃいけない論文は少なくて済む。

遡っていく時にかならず通る論文、というと、根本原理的な論文が多い。

根本原理的な理解を得る為には、関連論文を読みまくるというだけでは不十分で、 根本原理から様々な論文を統一的に理解する、という作業もする必要があると思う。 いろいろな機会でそういう事を様々なレベルでやっておく事で、 ある論文があった時に遡るべき統一原理みたいなのを、その論文のわりと近い所で見つけられるようにする。 これがうまく行けば、遡る数はかなり減らせると思う。

この統一的な理解をするという作業は、 後述する数式の理解みたいな能力も高めてくれると思う。

ある分野群を理解する為のスタートとなる根本原理というのは、 階層的になっていると思う。 最後には集合論にたどり着くのだが、 いつも集合論まで遡る訳にも行かない。 だから集合論まで遡って理解出来るようになったら、 次は測度論までで理解出来るようになり、 測度論までで理解出来るようになったら実解析までで理解出来るようになり、 と、どんどんスタートラインを近づけていく必要はあると思う。

現実的な時間内に自分の中のスタートラインまでたどり着けるくらい、 スタートラインを近くしておく必要がある。 これは論文を読める、という条件の一つに思う。

専門分野とすでに読んだ論文を増やす事

関連論文の中にすでに読んだ物があれば、それは飛ばす事が出来る。 ただ論文はたくさんあるので、ランダムで読んだら偶然当たる、という事はあまり無い。 そこで当たる為には「その分野」の論文をたくさん読んでおく必要がある。

つまり、何か目的があってある論文を読む必要がある時に、 読まなきゃいけない関連論文を減らす方法として、 その分野の論文をあらかじめ読みまくっておく、というのがある。

一つの分野に対して、その分野の様々な論文を読み、 そこから参照されている論文もいろいろたどって読んでおくと、その分野で重要な論文の幾つかはすでに読んだ、という状態になる。 その分野で重要な論文なら、これから新しく読むであろう論文でもきっと参照されている事が期待出来る。

新しい論文を読む時に、読まなくてはいけない参照されている論文は、 まだ自分が読んでないやつだけに絞れる。 この数がある程度少ない、というのも「普通の論文が読める」という条件の一つと思う。

根本原理がより広い分野を理解する為の一般的な方向とするなら、 専門分野の読んだ論文を増やすのは詳細な具体例をたくさん集めるという方向と言える。

何かの目的を持ってある論文を読む、という事を考えよう。

その分野の重要な論文を一通り押さえていれば、 その論文の中であまり見かけない論文をたくさん参照している所の説明は、 その論文特有の話という事が分かる。

また、割と定番となる論文を参照して説明している所は、 その論文の、分野の中の位置づけを理解するのに役に立つ。

その時の自分の目的に対して、どの論文を遡っていくべきか、 という事を考える時に、これらの事は重要なヒントとなる。

そうやって自分の専門とする分野に関しては、 関連論文のセクションを読んでいくだけで地図のような物を描ける状態、 というのが、その論文を読んでいくには必要な事と思う。

この、専門分野が自分の中で確立されていて、 その分野については多くの論文をすでに読んでいる、 という状態である事も「論文が読める」という条件の一つだと思う。

どの位の広さの分野の論文を読めたら「論文が読める」と言えるか?

前述のように、ある分野の論文を読みまくっておく事がその分野の論文を読む条件なのだとすれば、 当然だがある専門分野の論文が読めるからといって、他の分野の論文は、やはり読めないという事になる。 だから論文を読む、という能力は、分野に依存する能力だとは思う。 つまり、「論文を読める」というよりは、「XXXの分野の論文を読める」という方が正しい表現ではなかろうか。

で、ある一つのすごい狭い分野だけ読めたら論文が読める、と言うだろうか? 個人的には狭すぎると、そうは言わない気がする。

一方で全部の分野の論文が読める、って事もありえない。

どのくらいの広さの分野の論文を読めたら「論文が読める」と言って良いかはよく分からない。 ただ、同じ学会に出るような関連分野で、その中の関わりが深い所くらいは読めてほしい、みたいなコンセンサスはある気もする。

自分が押さえておく専門の範囲をどれくらい広く取るかは個人差があり、たくさんの専門分野を持っている、いろんな事を知っている人、というのもいれば、すごい狭い分野に特化する人もいる。

論文を読む能力という点に限って言えば、広い分野の論文を読める人の方が、論文を読む能力は高い、と言えるだろう。 一方で特定の分野に特化して結果を出すタイプの人も実際いるし、 結果を出せばどっちでも良い、という話もある。

教科書による勉強

この「関連論文を遡る事を途中で打ち切る」為に、その分野の定番教科書を学んでいる、というのが有効な事がある。 「この教科書さえやっていれば、どの論文も少し遡るだけでそこから先はもうわかっている」 という状態を作れる事がある。 その場合、この定番教科書をちゃんとやった、 というのが、「論文を読む事が出来る」という条件の一つとなる。

教科書による勉強は、関連論文を読む難しさの他にも、 後述する「式を追う難しさ」の対策にもなるので、なかなか重要度は高い。

一方で先端の所には教科書がなかったり、あっても出来が悪かったりするので、 どこらへんからは論文のみで行くか、とかはあんまり自明じゃない。

早く読む大切さ

どうやって読む論文を減らすのか、という軸とは別に、 どうやってたくさんの論文を読むか、という軸もある。 つまり読む速さが早ければ良い、という話。

むちゃくちゃ読むのが早ければ、すべてを読む、という事も可能かもしれない。 むちゃくちゃ早くなくても、早ければ早い程多くの論文を読めるので、 よりどの関連論文を読むべきか?という選択の難しさは軽減される。 読むか悩んだら読んじまえ、という訳だ。

さらに読むのが早ければ、いろんな論文を読む事が出来るようになる。 そうすれば読む経験値は上がるし、関連分野の知識も深まるし定番のすでに読んだ論文のストックも多くなる。 だから読むのが早くてひたすら大量に読んでいれば、大抵の問題は片付くという気もする。

そういう訳で、論文を読む速度がある一定の水準である事も、「論文を読める」という条件の一つだと思う。 そして「論文が読める」と言った時には、この速度は非研究者が思う感覚よりは、ずっと高い水準を要求されていると思う。

普通の論文を読むには関連論文をかなりたくさん読まないと普通は理解出来ない。 だからぶわーっと関連論文を読んでいく能力というのは、「論文を読める」という条件に入っている。

一つの論文だけを単体で読む事が出来る能力なんて存在しない。 火力は正義。

式を追う難しさ

論文を読む難しさには、関連論文がいっぱいある、という難しさの他に、そもそも追うのが難しい、という事もある。 典型的なのは式変形。

論文は普通、途中式をたくさん飛ばして書く。 これを追うのは明らかにある種の能力が必要で、 これが一定水準を超えている事も「論文が読める」という条件になると思う。

また、変形出来るだけじゃなくて、式を「解釈する」のも難しさがある。 解釈が簡単な物もあれば、原理的に分かるはずが無い、という程難しい物もある。 これまた程度の問題で、どの位分かりにくい物が解釈できればOKかは決まった線は無い。 ただ定番の論文の式くらいは解釈出来る必要がある。

式変形を自分で追えるようになったり、式の意味を自分で理解出来るようになる為には、 幾つかの方法がある。

定番の変形を覚えておく

「その分野ではよく出てくるパターンの式変形とか数学とか手法」という物がある。 これは、一度どこかでやっておかないとその場では分からない(事が多い)。 だからあらかじめやっておく必要がある。

教えてくれる人が居るなら、一番手っ取り早いのは、どう変形したらいいのか教えてもらう事だと思う。 で、それを何度か自分でやってみて覚える。

この方法は身近にやってる人がいないと取れないが、 やってる人がいたらとても有効だと思う。 という事で関連分野の論文を読んでいて、 ちゃんと数式とか追っている人と知り合いかどうかは結構重要。

そういう人と知り合い、というのはだいたいは、自身もそういう人である、という必要がある。 だから、自分も自分の専門分野の式変形を追っていて、 定番の式変形とかは知っている必要がある。 論文を読める、というのは、そういう交友関係とか場があるかどうか、という事を含んでいると思う。 ボッチでもめっさ優秀なら大丈夫かもしれないし、 一定の水準まで到達したあとはボッチでも行けるかもしれないが、 ボッチは不利だとは思う。

また、教科書とかに解説がある場合もある。 そういう場合には教科書にある定番の式変形を教科書の補助を借りつつ自分でやって、習得しておく、という手が使える。ぼっちでも安心。

教科書を、理解するのを目的に読むのと、論文を読めるようになる為にこうした事を訓練する為に読むのでは、結構読み方も選ぶ本も違うと思う。 PRMLとかが内容的に古くても未だに薦める人が多いのは、 この論文を読む為の定番の式変形とかを練習して覚えるのによく書けていて、 より新しい代替があまり無いからだと思う。

なんにせよ、教科書で主要なやつは出来るようになっておく、というのは良い方法だ。(良い教科書があれば)

普段から計算している大切さ

式を追う能力とかは、やっていると慣れていき、一定水準からあまり上達はなくなり、 サボってるとだんだんと落ちていく類の物に思う。

だから覚えておく程重要じゃない式変形とかでも、 定期的に手を動かしてやっておく習慣が必要だと思う。 論文を読む為の体力づくりとして、計算を実際にやる、しかも定期的に、 しかも結構ごつい奴。

式を解釈する能力も計算をしていると養われている所があるので、 結局ごつい計算をたまにやるのは必要な事だと思う。

定期的ってのがどれくらいの頻度かはよく分からない。 自分は半年くらいサボる事もある気はするが、だいたい2〜3ヶ月に一回くらいは結構手を動かす期間を設けている気がする。

論文を読む、という観点での話をしよう。 論文を読む時には、式変形をサボる場合も多いと思う。 ただ、たまに論文を読む時に式変形をちゃんと追う、という事もやっておかないと、 この能力が保てない。 数式を追う能力を高める為にも理解する能力を高める為にも、普段から筋トレしておく必要がある。 論文を読む中で論文を読む為の筋トレをする。

また、最初に論文を読めるようになる為には、論文を読みつつ論文を読む中で筋トレするのは無理ゲーな事も多い。 論文を読む事自体が出来ない時に、ついでに筋トレするとか言うのはスパルタ系のやり方だと思う。

ゆとりとしては、最初は論文とは別の、もっと簡単な所で筋トレしておく方が良いと思う。 という事で筋トレが明らかに足りてない時は、教科書とか、より行間が埋めやすい所で練習しておく方が良い気がする。

また、ある程度基礎力がある時でも、ぬるい所で筋トレする方が楽なのは間違い無い。 だからたまに教科書とかで筋トレする方が、論文読みながら筋トレするよりも、 弱い雑魚相手に無双出来る感じで良いと思う。

逆説的だけど、計算を普段からやるような環境にいないと計算は出来るようにならなくて、 計算出来るようになっていないと、論文は読めない。

数学を学ぶ

物によっては、そもそも数学をちゃんと学ばないと理解出来ない、という式変形や式もある。 という事で数学自体が必要な事がある。

また、論文自体を理解するだけならその数学は必須では無いという場合でも、 その分野の数学をちゃんとやっておく方が理解がずっと簡単、という場合は結構ある。 よくあるパターンとしては、その周辺の話題が数学の方でよく定式化されていて、 論文に書かれていない背景が分かる、みたいな奴。 必須では無いがヒントがふんだんにある、という場合は、ヒントの方をたくさん見る方がずっと理解は容易になる。 数学を学ぶのは論文を読むより難しい事をやっている、と誤解されがちだが、 むしろ遠回りしてそのぶん簡単にする作業という気がする。 簡単にする為のヒントを集めているというか。 どれだけヒントを集める必要があるかはその人による。

どれだけ数学側に時間掛けてるかは、どれだけ自分の理解する能力に不足を感じているか、 という事を表している気がする。 自分はかなり数学を学ぶのに時間を掛けている方だと思う。 それは裏返せば論文読む能力が低くて困っているので、 時間はかかるがより簡単な方法を模索していると言える。

さらに、数学を勉強する事は式変形や式の解釈の訓練の集まりみたいな物なので、 式変形力とか行間を埋める能力を鍛える為にも数学の勉強は有効な事が多い。 論文の式変形を追ったり行間を埋めたりしているだけで十分な鍛錬になるとは限らない。 そういう場合は数学だ。たぶん。

自分の場合を振り返る

自分の場合、PRMLの勉強会が良かったと思う。 あれは参加者がみんな物理のドクター持ちとかでちゃんと理解してたし、 一回の時間も13時〜18時くらいと相当長い。結構ゴツい。 あれを一年やったのは論文読む能力を相当上げた。

やっぱり自分で本読むだけじゃなくて、 しっかりしたメンバーで輪読的な事をするのは自分には凄く大切だったなぁ、と思う。 これは普通は大学院とかで経験を積むべき事なんだろうけれど、 自分は修士卒だがそれくらいでは全然足りなかった。 自分は平均的な修士卒くらいの訓練はしてたと思うから、 たぶん自分に限らず普通の修士卒では足りてないと思う。

だから逆に言うと修士卒のプログラマは、 機械学習に必要なレベルの論文読み能力を得る為には、 卒業後どこかで、こういう訓練を一年くらいうやる必要があると思う。

また、論文をたくさん読むのは実務で鍛えられた所に思う。 仕事で関連論文をたくさん読んだら、たくさん読むメリットみたいなのが分かるようになった気がする。 その結果、それまでよりも関連論文をすぐにたくさん読む癖がついた。 2015年の仕事でたくさん読んだ時から論文を読む量は一気に増えて、 それから2年くらいで論文を読んだ量はだいぶ水準に到達した気はする。

数学に関してはDudley のReal Analysis and Probabilityをやったあたりでだいぶ論文読む力が上がった。 関数解析の基礎と実解析は、機械学習の論文読む能力に直結していると思う。 この本を最初に読むのは普通のプログラマには無理だと思うからその前にいろいろ勉強する必要はあると思うが、 この本くらいのレベルの事をやったかどうか、 というのは一つの基準になると思う。

こうして見ると論文読む能力というのは相当に高い水準を要求されるよなぁ。 みんな論文を読んでる、とは主張するが、そのレベルは人によって大きく異なる。 そして機械学習の仕事をやる上で一番重要なのは、論文がちゃんと読めるかどうかだと思う。