第2学期感想


今学期は4つの授業を取った。


アルゴリズムの解析 (Analysis of Algorithm)

大学院レベルのアルゴリズム入門授業。漸近記法、二分木から始まり、ソート、貪欲法、動的計画法、グラフ探索、bipartite maching、最大流問題、複雑性クラスを扱うのはたぶんセオリー通り。

特殊なのは、そこでとどまらず、線形計画法・整数計画法の定式化、双対問題への変換、それとハッシュの仕組みまで扱ったこと。ここまで内容を詰め込んだアルゴリズムの授業は初めて見た気がする。TAすら「先学期別の教授で取ったが、グラフで終わった」と言っていた。それぐらい詰まってた。お陰で、日本の大学でも似た授業をやっていたが、より統一的に理解できたと思う。

教授はハーバードPhDの優秀な方で、授業中の発言でミスをしないようにものすごく気をつけていた。数えてたけど1学期中に2回しかミスしていないと思う(授業中に訂正していた)。最大流(Max-flow)問題は重要な問題だからこの分野でのimprovementはすぐにニュースになると話しているときメッチャ活き活きしててあーアルゴリズムってこういう人が研究するんだなァという印象であった。

宿題は鬼だった。まず仕様が雑。TA曰く毎年変えてるらしく、おそらく教科書からコピペしてコピペが不完全だからいくつか曖昧な点が残っているのかと思われる。引用されたコードが間違っていてerrataを探すのも慣れた。あと、いくつかの問題はどう考えても難しすぎてまともに解けなかった。しかもTAがヒントを与えるのは教授に禁止されているようで、最終課題は教授に直に2回聞きに行って2回目(※〆切2時間前)にやっとヒントをくれた。これは効果的な教育法ではないと思う。

講義はめちゃくちゃ早い。講師が質問あるかと聞いてもたいてい質問なしで進むので、最初は英語力不足で僕だけが理解できていないのかと思っていたけれど、中間試験がどうやらトップ5に入っていたことから考えると、たぶんみんな質問すら考えつく時間がなかったのかと思われる。先学期取ったクラスメイトに聞いてみたら「(英語は聞き取りやすいのに)グラフ以降の話はマジで何言ってるのか全然わからなかった」と言っていた。

そんな感じでストレスフル極まりなかったが、講義の説明自体は大変素晴らしかった。特に動的計画法最小全域木の説明は教科書よりよっぽど分かりやすかったと思う。講義受けてから(というより、宿題をこなしてから)グラフがそれほど怖くなくなった。コーディングインタビューの良い練習になったと思う。


ベイジアン統計(Bayesian Statistics)

10とか20とかしかデータ行がない状態で、いかに破綻のない確率的な推論をするか、を扱う講義。この授業だけはCSではなく統計学部。

医者と臨床データを扱ったとき、ディープラーニングが全く上手く行かないことに非常に強い興味を持った。データ数が少なすぎるのだ。そしてコロンビアにはDavid Bleiという超ウルトラ有名なBayesian Statisticsの研究者(引用数一万8000超)がいて、彼とピザを食べる会で出会った時にディープラーニングとか興味ないんですか?と聞いたら興味ないと言っていて驚いたのだ。詳しく聴くともう少しニュアンスがあった。彼曰く、自分は何にでも興味がある、もちろんニューラルネットワークにも興味はある、しかし優先順位というものがあり、いま興味がある研究課題だけで手一杯(だいぶ前なので多少曖昧である)。一方、彼の指導するPhD生が今年ディープラーニングベイジアン統計を組み合わせたモデルを提唱していたりするので、医療が残る限り今後もこの分野は手法として有効で有り続けると踏んだ。問題意識はそんなところだ。

コロンビア統計学科には Andrew Gelman というベイズ統計学の超大家がいて、当然ながら教科書は彼の書いたBaysian Data Analysis だった。面白かったのは学部生(複数)からの教科書の評価が悪かったことだった。彼らから見るとしょっちゅう「*.*節を参照せよ」と飛ばされるし、説明がたまにいまいちパッとしなかったりで不満らしい。僕も5章以降はまともに読まなかった(というより読んだけど印象に残っていない)。

ただ載っている実例はどれも面白かった。特に2.7節の「腎臓ガンの死亡率分布」の例は全データ分析者が見ておくべきぐらいの価値があると思った。「死亡率が高い地域」がカリフォルニア以外に集中しているが、不思議なことに死亡率が「低い」地域もカリフォルニア以外に集中している。蓋を開けてみたら他州は小さい街ばかりでレアイベントの確率が高く評価されていた、ではどういう推論ならば妥当か、としてガンマ分布/ポワソン分布を使ってそこそこ妥当な数値を算出するというもの。

なぜこれが面白いと感じたかというと、僕はベイズ統計と言ったら単に「データを集めるのが高価すぎてできない」(田んぼ12コで限界)というユースケースで使うものだと思っていたが、1000人の人口で1人が稀な病気で亡くなった(罹患率0.1%)というような変えようのない数値自体にも取り組む方法を与えたと思ったから。医療統計と相性が良いとは思っていたがこれほどとは。

講師は授業で扱う内容のコンテキストを説明するのがとにかく下手な人で、授業後に宿題を解いてて「ああこれのことを言っていたのか」となることが常だった。矢継ぎ早に話すもんだから、他の学生もあまり理解しながらノート取れてなかったと思う。予習?他で追われてて無理です。

ただ、この授業で良いなと思ったのは宿題で扱うほぼ全ての問題についてアプローチを授業中に説明することである。教授レベルに統計知識のある人が宿題レベルの問題にどうアプローチするのか非常に面白かったし、いくつかの手法は僕のような統計初心者からするとout-of-boxだった。

アルゴリズムとも共通するが、「教科書に書いてあること」をわざわざ講師が説明することは、形式的な話の場合は結構意味がある。というのも大抵その手の教科書は破壊的に読みにくく、記号の表記を変えたり説明の順番を変えたりしながら2度、3度通すと理解できたりするからだ。講師も「たぶんこっちの表記のほうがわかりやすい」とあえて教科書と異なる記法を用いることが度々あり、その点で有用だった。

この授業は、僕の人生の中でほぼ唯一期末試験が上手く行った気がする。今学期はTAをやっていたおかげで、百名以上の生徒答案を見て、どういう回答が点数付きやすいか理解できた。試験中、問題文がよく分からないとき、ティールの自伝に出てきた「落ちてくるナイフを落ち着いてつかむ」という表現を思い出しながら、気持ちを立て直し既知事項から推論していた。


Operating System 2

この授業だけは取ってちょっと後悔した。コロンビア大学の OS 1 の授業は、大学内でも悪名高い難易度を誇ることで有名である。CPUスケジューラーを書く課題では、この課題に必要な知識を整理したTAのブログポストが存在するぐらいだ。僕はその授業で先学期Aを取ったのでちょっと調子に乗っており、「まあ2も行けるやろ、1の続編だし」と軽い気持ちで向かってしまったのであった。

海外の大学において、同じ名前を冠したクラスであっても 1 と 2 は全く別物だ。たとえ同じ講師であっても。1は単に実装力とコミットメントが試されるが、2はそれに加えて発想力が試される。そしてクラスのスケジュールの関係上、2週間目に良い研究テーマを思いついていなければもうその授業は終わっていると言っていい(実際、僕以外にも「ああ、何があったのか、手に取るように分かるな.....」と思うような発表はあった)。

まず、チームメイト探しに困窮した。最初の2週間で2−4人で自由にチームビルディングしろとの教授のお達しがあり、公式の掲示板にチームメイト募集をかけるも誰も反応しない。後々判明したのだが過半数のチームは既に授業を取る時点でチームビルディングを済ませており、わずか9−10人ほどがチームをどう組むかという戦いになっていた。OSでTAをしていた優秀な学部生に個人的にメールを送るも「なんかいい研究テーマ思いつかないからドロップするつもり、メンゴメンゴ」と断られ(実際彼は履修しなかった)、チームビルディング最終日に残った3人(全員1人チーム)でチームビルディングを要請するもコダワリの強い学部生氏Bが「ごめん、俺友人以外のプログラマ信用できないんだよね、友人抜けたから俺一人でやるわ」と謎の理由により1人チームを選択、結果的に残った一人のみと組むことになった(ちなみにその離脱した彼は最終プレゼン日に居たのにプレゼンしなかったのでどうなったのか不明)。

そしてそのチームメイトが忙しい子であまり貢献できず、理解のための時間もとれず、何とか実装を試すも様々な設定トラブルに見舞われたようでタスクを与えてもこなせず、ほぼ僕一人で全てこなし結果的にボロボロの期末レポートとプレゼンをして終わった。


この授業の失敗は、とにかく「代替となる別のクラス探しを途中で打ち切ったこと」にある。卒業のためには1つ研究レベルのクラスを取らなければならず、実はもう一つの候補授業が存在した。だがOS2が最初の説明でそこそこ面白そうだったので、もう片方の候補授業の初回に行かなかったのだ(その授業を取った友人曰く「研究テーマ思いつかなければ別に提出しなくてもいいよ、別ので補おう」という更に柔軟な方針だったらしい)。その候補授業は1人での研究が基本の授業だったので、もし両方の授業を取っていれば、チームビルディングの失敗を察して離脱できたのではないかと思われる。プランBの大切さを思い知った学期であった。結果的に成績は A - だった。これでも凌いだほうだと自分ではホッとしている。

済んだことを悔やんでも仕方がないので、知識として何を学んだのかを振り返る。僕が選んだテーマはRaspberry Pi 3上での遅延評価というものだ。最初は遅延改善だったのだが、リソースを考慮して単なるmeasurement studyにした。Raspberry Pi 3はクレジットカード・サイズの非力なマシンで、仮想マシンとは比較的縁遠い。だが世の中にはこのRPI3でクラウドを作りたいという人たちがいて、先行研究には50台以上のパイを繋いで仮想ネットワークのテストベッドにする、ということをしている人たちが居た。AWSとは比べ物にならないほど安い。クラウドとなると仮想マシンを使うのは定石であり、もしRPI3上でも充分な速度で仮想マシンが動くのならばそれを活かした新しいユースケースが考えられる。Type-1 virtualizationは既にいくらか報告があるがType-2 virtは珍しい。僕の問題意識はそんなところだった。

しかし、ネット上では仮想マシンを動かすためのソフトウェア(KVM)をRPI3上で動かすことに成功した人がまるでいなかった。RPI2ではいくつか報告があったのだが、RPI3は2とは起動過程が異なり成功しない。ということで「どうすればKVMが動くのか」について数ヶ月かけてカーネルパニックを散々見つつ色々試したのであった。結果として、カーネル開発者たちとのメールを通して開発プロセスがどうなっているのかが想像付くようになった。

そして、 OS 1 は本当に入門だったんだな(あれだけ鬼のように難しくても)と思うに至った。具体的には I/O の勉強が全然足りてない。ioctl()を使ってデバイスファイルごしに操作したりするのは良い経験になった。




C++ライブラリの設計(Design Using C++)

C++という言語でライブラリを作る授業。講師がなんとあのC++を開発したBjarne Stroustrup氏本人で、彼が今取り組んでいるモダンなC++仕様について講義で色々話を聞くことができた。彼がたまに語るベル研究所時代の思い出話は面白かった。

3人チームだったのだが、この授業はチームメイトが最高に良かった。まず、講師の制約が面白かった。「修士学生3人のチームは許さない。学部生を必ず1人入れること」。彼曰く、heterogeneousなチームのほうが最終結果がよくなるらしい。実際にこれは僕らのケースでもアタり、僕は中国人の友人と使いやすいMatrix LibraryかGraph Libraryでも作ろうかと話していたのだが、掲示板で見つかった学部生のWebやりたいという強い要望によりWeb App Frameworkを作ることになった。恐ろしいことに、Web App Frameworkを作り初めてから1ヶ月後、授業でBoost開発者が作ったMatrix Libraryの設計に関する話があり、Graph Libraryの課題が出された。もしあのままMatrix Libraryを作っていたとすると...考えただけで怖くなる話である。

その学部生は非常にリーダーシップのある子で、コンセプトを決めたらすぐにタスクを割り振り、非常に円滑に進んでいった。僕は前述のOSで心を苦しめていたこともありC++に熱中し、ライブラリもガンガン調べて追加し、結果として103 commits / 887,380 ++ / 354,683 -- という最大貢献者になった。結果として「Pythonのように自動ローディングを行えるWeb App Framework」という特殊なしくみを備えたものが完成し、performance(RPI3の遅延評価の経験が役立った)も非常に良い結果が出、最終プレゼンではBjarneから Compete with yourselfとのお言葉を貰い、採点者であるTAも満足げだった。結果はチームメイト全員Aで、全員で昼食を共にし、正門前で写真を取り(その学部生は今年卒業)、Great results, great teamとの友人談、大変思い出に残る授業となった。


総括

これだけ書いてもまだまだ書き足りないことに驚いた。何にせよ濃い授業たちであった。GPAとしてはOSがAマイナスであとの3つがAということで、この学期の平均GPAは3.91となった。

さて、学部生のLinkedInを見ていてアッと思うことがあった。彼らは卒業までに30コマ近くの授業を履修する。僕は先学期から合わせてたかが8コマ取っただけだが、生まれ変わったように感じる。アメリカのTrainingのすごさに驚く。Stanfordとかの留学生の話を聞いているともっとヤバイ気もする(もちろん授業によるが)。

東大の理情、京大の情報もTrainingとしては同じくらいヤバイところだが、比べると残念ながら企業との連携、あとクラブ化ができていない。こっちのTAはどいつもこいつもGoogleFacebookAppleインターンしており、自分の書くコードや知識に関して強い責任と向上心を持っている。議論掲示板は企業の勧誘プラットフォームとアカウント情報を共有している。インターンした学生たちは優秀な友人たちをごく自然な流れでリクルーターに紹介する。彼らにとってFacebookは"isnt as prestigious as you think"らしい。

飛び級や楽単も少ない。楽単自体は悪いことではない。現に僕が組んだ学部生はスタートアップを始めてかなり成功している。飛び級はメッチャいいことだ。大学院生だけに授業を限定する理由なんて何もない。現にOS1の僕のチームメイトは学部2年生だった。