princeton.log

Princeton 大学の Department of Computer Science に一年留学する日本人が、学んだことや感じたことを綴ります。

春学期の授業の振り返り

ご無沙汰しております。皆様、この大変な状況の中でいかがお過ごしでしょうか。
僕はというと、5/15に最後の課題を提出し、2ヶ月間にわたるオンライン留学、そして8ヶ月間の交換留学プログラムを終了しました。本当は日本に戻った後も毎週その様子をリポートしたかったのですが、環境の変化を言い訳にして先延ばしを続け、気づけば帰国後一つの記事も書くことなく留学の終わりを迎えてしまいました・・・
とはいえ、せっかく続けてきたブログなので、しっかりとした形で終わらせてあげたいという気持ちもあります。という訳で、今回は今学期の授業の振り返り、次回は留学生活全体の振り返りをして、このブログを締めくくりたいと思います。

オンライン授業と時差

個々の授業について掘り下げる前に、まずは2ヶ月間日本からアメリカのオンライン授業を受け続けた感想を書いていきたいと思います。
現在の日本とプリンストンの時差は13時間。つまり、ほぼほぼ真逆のタイムゾーンにいることになります。僕の今学期のプリンストンでの授業は全てアメリカでの午後に集中していて、日本時間に直すと午前2:00~6:00の間になっていました。正直あまり起きていたくない時間帯ではありますが、録画を提供してくれる授業が少なく、またせっかくの機会なのでしっかり質問したりしたいなあという思いもあったため、出来るだけリアルタイムで出席できるように頑張ってみることにしました。
という訳で、3月の下旬から僕は超極端な早寝早起き生活を始めました。毎日午後8時には寝て、午前2時に起きて授業を受ける。半年前の僕が聞いたらギョッとしそうなスケジュールですが、時差ボケが残っていたこともあり、始めた当初はそこまで苦ではありませんでした。むしろ、午前6時には全て授業が終わり、1日が自由に使えるという状況を楽しんですらいた気がします。
しかし、そんな生活も長くは続きませんでした。家族と一緒にご飯を7~8時くらいに食べていると、まず就寝時間が9時、10時にずれ込んで行きます。そのうち日本の友人とのオンライン飲み会なんかも始まり、だんだんと普通に夜更かしをするようになっていきました。2時から5時まで授業なのに、気づいたら1時まで起きてしまっていてこの後どうするか悩んだことも何度かあります。いっそのこと授業が終わるまで寝ない、という選択肢も何度か試したのですが、ほぼ徹夜の状態で午前4時や5時になるとほとんど授業が理解できないということがわかり、結局最後の方はたとえ1~2時間でも授業の前には必ず寝るようにしていました。
2時間だけ寝て、午前2時のアラームで飛び起き、家族を出来るだけ起こさないように急いで音を止めてからZoomを開く日々。貴重な経験ではありましたが、最後の週までくると正直かなり辛かったです。結局、授業を寝過ごしたのは1回だけで済みましたが(自分でいうのも何ですが結構偉いと思います)、あと2週間授業が続いていたら耐えられなかったと思います。ちゃんと朝に起きて夜に寝られるって素晴らしいことですね。

個々の授業の振り返り

ここからは、秋学期の記事と同様に、とった授業を一つずつ振り返っていきたいと思います。

PHI 371 Philosophical Foundations of Probability and Decision Theory

概要

様々な確率に関するパラドクスを取り上げ、Bayesian Confirmation Theory などの基本的な定理を使ってそれらのパラドクスを検証していくような内容でした。
例えば、中間レポートでは以下の Ravens Paradox と呼ばれるものを扱いました。

  • 黒いカラスを見ると「世の中の全てのカラスは黒い」という仮説が確からしくなる気がする
  • ということは、カラスでなくて黒くないものを見ると、「世の中の全ての黒くないものはカラスでない」という仮説を確かめられるはずだ
  • 「世の中の全ての黒くないものはカラスでない」は 「世の中の全てのカラスは黒い」と論理的に等しい
  • ということは、カラスでなくて黒くないものを見ると、「世の中の全てのカラスは黒い」という仮説を確かめられるはずだ

つまり、みなさんが家のクローゼットを開けて、黒くないTシャツを見つけるたびに、世の中の全てのカラスが黒いことを確認できるというわけです。本当にこんなことが起こるのでしょうか。おかしいとしたら、どこが間違っているのでしょうか。みなさんはどう思いますか?

感想

これは哲学科の授業なので、「哲学の授業受けてましたって言えたらかっこよくね?」と思って受講を決めたのですが、割と初等的な確率の数式を用いて議論をすることが多く、あんまり哲学をやっている感はなかったです。その分Reading がとっつきやすかったり、授業中のディスカッションについていきやすかったりしたので、あんまり苦しまないで済んでよかったのかもしれません。
それでも、「この定理には、『未来に起こることを知っていたらこの確率は1』と書いてあるけど、そもそも『知っている』ってどういうことなんだろう?」などの定性的な議論をすることも多く、自分が普段やっている学問と少し違った切り口を感じることはできました。一緒に授業を受けている哲学専攻の学生がめちゃくちゃ教授に食ってかかっているのを見るのも面白かったですね。
そしてこの授業が一番オンラインになったことが残念だった授業でもあります・・・ そもそもディスカッションの時間が大幅に縮小された上に、オンラインだと議論に切り込むタイミングを取るのが難しく、日本に帰ってきてからの授業ではほぼ議論に参加することができませんでした。せっかくの機会を活かせず残念ですが、また似たようなことができたらぜひリベンジしたいと思います。

COS 488 / MAT 474 Introduction to Analytic Combinatorics

概要

様々なデータ構造の性質について、定量的に検証する授業でした。例えば「ランダムに生成された二分木の平均の高さは?」や「ランダムに生成されたバイナリ文字列の中で0が4つ連続する確率は?」などが授業で扱われた問題です。
具体的には、様々なデータ構造を生成関数として表現し、その関数同士を足したり掛けたりしてより大きいデータ構造を作っていくという手法をどんどん掘り下げていきました。後半になればなるほど、近似式で答えを表すことが多くなっていくのですが、その場合でも最高次の項の係数までは具体的に導出することを求められました。
そしてここが最大のポイントなのですが、キャンパスが閉鎖される前から授業は全て録画済みのYouTubeビデオで行われました。僕たちが受けていた授業ビデオおよび課題は全て以下の二つのページで公開されているので、興味があって時間もある方はチェックしてみてはいかがでしょうか。

Introduction to the Analysis of Algorithms by Robert Sedgewick and Philippe Flajolet

Analytic Combinatorics Philippe Flajolet and Robert Sedgewick

感想

流石に秋学期に数学をやらなさすぎたことを反省してとった授業でしたが、「数学っぽいことをやる」という目的は達成できたように思います。単純な微分積分や無限級数などについて学部に入ったばかりの頃に学んだことを思い出すことができましたし、毎週の課題によって英語で数学の答案を書くことにもなれた気がします。
授業の内容も非常によかったと思います。今まで僕が知っていたような方法だと数え上げるのが難しい複雑な構造でも、後半になって新しい定理を導入するにつれてどんどん簡単な式で表せるようになっていったのが面白かったです。(それと同時に宿題を解くのが簡単になっていったのも嬉しいところですね)
実は僕は履修を決めた当初はこの授業が全てビデオ講義であることを知らず、それを知らされた時には少しがっかりもしたのですが、今になって思えばビデオ講義も悪くなかったなあと思います。講義が全てYouTubeに上がっているおかげで、キャンパスにいた間は柔軟に時間を使えましたし、日本に帰ってきてからもちゃんと日の出ている時間帯に授業を受けることができました。
ちょっと残念だったのは担当の先生と直接話す機会があまりなかったことですね・・・この授業を担当されている Robert Sedgewick 先生は赤黒木などの有名なデータ構造を考案した大変すごい方なのですが、ビデオ授業なこともあってほとんどお会いする機会がなく、実際に対面できたのは3回ほどでした。お忙しいのか、オフィスアワーとして指定された時間に伺っても不在だったこともあり、非常に悲しかったです。またいつかどこかでお会いできるといいなあ・・・

COS 510 Programming Languages

概要

大学院の授業その1。授業の名前から受ける印象とは少し違い、プログラムの形式的検証の授業でした。前半はシンプルな定理の証明を通して Coq という定理証明系の使い方について学び、後半は Coq を使って実際にプログラムの性質について検証を行いました。例えば最終課題では、C言語で書かれたハッシュテーブルを使ったプログラムが予期した動作をすることを Coq 上で証明しました。

感想

秋学期にとった授業の中で一番好きな授業でした。Coqを使った証明はパズルのようで非常に面白く、課題の量が多くてもほとんど苦になりませんでした。特に最後のC言語のプログラムに関する証明がしっかりできたときの快感は言葉では表しきれません。しかし、悪い意味でもパズルを解く感覚で臨んでしまい、しっかり証明の全体像を描かないまま色々な手段を気づいたら証明ができていた、ということも多々ありました。中には証明はできたものの意味はよくわかっていない定理なんかもあります。これからはこういうところを改善していかなければならないなと思っています。
担当だった Andrew Appel 先生にも非常にお世話になりました。先学期も Appel 先生の授業を履修していたため、幸いなことに名前を覚えていただき、直接アメリカの大学院の仕組みについて解説していただいたり、夏休みの間に学部生が Coqを使って参加できるプロジェクトを紹介していただいたりしました。本当に先生の授業を一年間続けて履修して良かったなあと思います。おそらく僕が将来研究する分野もこの辺りになると思うので、先生のご厚意に報いられるようしっかりと勉強していきたいと思います。

COS 529 Advanced Computer Vision

概要

大学院の授業その2。その名の通り、秋学期に開講されていた Computer Vision の発展版です。カメラ画像からの三次元点群の復元や、ディープラーニングを使って与えられた画像に関する質問に答える技法 (Visual Question Answering) など、幅広いトピックを扱いました。

感想

こちらも非常に楽しかったです。秋学期に受講した学部生向けの Computer Vision では、色々な手法が紹介されてもなぜそれでうまくいくのかの解説がほとんどないことが多かったのですが、こちらの授業ではしっかりと手法の背景まで解説してくれることが多かった気がします。また課題についても、Computer Vision では渡されたプログラムの穴を埋めるだけのことが多かったのですが、今回は課題の解説のPDFのみを渡されて、まっさらな状態から指示通りに動くシステムを作らねばならなかったので非常に歯ごたえがありました。しかし当然その分だけ時間もかかり、例えば Visual Qustion Answering では最初に書いたコードが全くうまく動かず、丸二日かけてデバッグをしたりしました。今となってはいい経験ですね。
この授業には自由に実験をしてPDF8枚にまとめるという最終課題があり、僕はイギリスからの交換留学生二人と一緒に取り組みました。僕たちが選んだテーマは「人工データを使った人の動作の学習」です。
f:id:liwii:20200607163131p:plain こんな感じで人の3Dモデルが動いている動画をたくさん生成して、これらを使って学習することでリアルな動画の中で人の動作を検出できないか試しました。結果としては、少なめのリアル動画を訓練データとして使った場合と同じくらいの精度が出ました。
僕はビデオの生成係だったので、上のような白い人間が動いている動画をたくさん作っては実際の学習を担当するチームメイトに渡していました。これは完全に余談ですが、ノリでプロジェクト名を "Naked People" にしてしまったので、僕は送る動画のファイル名は全て "naked-videos.zip" という名前でした。何も知らない人が見たら大変な誤解をしてしまいそうですね・・・
とはいえ、今回は最終的な成果にそれなりに貢献できた気がします。僕は先学期の Computer Vision の課題ではパートナーに頼りっぱなしでほとんど仕事ができていなかったので、そのリベンジが果たせて良かったです。また、イギリスの二人とも最終課題のために帰国後も連絡を取り合い、非常に仲良くなることができました。またすぐ会いに行ったりできるようになるといいなあと思います。

Independent Work

概要

プリンストンの3年生が受講する個人プロジェクト授業、 Independent Work。僕は今学期は Brian Kernighan という先生にアドバイザーをお願いして、YAML という形式のファイルからパワーポイントのプレゼンテーションを生成するプログラムや、生成されるプレゼンテーションをリアルタイムでプレビューできるプログラム、そして二つのプレゼンテーションファイルの差分を表示するコマンドラインツールを作りました。 Image from Gyazo

github.com

github.com

(今 GitHubに上がっているバージョンにはバグがあるかもしれませんが、大目に見てください・・・)

感想

Kernighan 先生は現在のコンピューターの基礎を作った一人と行っても過言ではない方で、プリンストンへの留学が決まった時から是非お会いしたいと思っていました。そんな方と直接お話しできるだけでも嬉しいのに、まさか定期的にお会いしてアドバイスをいただけるとは思ってもいませんでした。 実際の週に一回のミーティングも、帰国前も帰国後も変わらず、僕の作っているツールに対して「こんなものを足してみたらいいんじゃないか」など具体的な提案をいただいたり、時には先生が日本に行った時の経験について話していただいたりなど、夢のような時間でした。一生忘れることのない経験になったと思います。
一方で、本題であるプロジェクトには少し悔いが残っています。いい感じの Python のライブラリを見つけてしまったので、そこまで苦労することなく当初予定していた内容は実装できてしまい、残った時間で何をしようか思案していたら学期が終わってしまいました。せっかく色々アドバイスをいただける環境だったのだから、もっと頑張って色々挑戦すれば良かったなあと思ってしまいますが、終わってしまったものは仕方ありません。幸い、自分でこれから使っていこうと思える程度には完成したので、これから使いながら直していきたいと思います。

最後に授業を受けてからもう1ヶ月近く経っているので、ところどころ記憶があやふやなところがありますね・・・まあ雰囲気だけでも伝わって欲しいです。
次回はいよいよブログの最終回です。みなさんもう少しだけお付き合いください。