princeton.log

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

今学期プリンストンで受けた授業の振り返り

この記事はISer Advent Calendar の18日目です。 f:id:liwii:20191217164336j:plainf:id:liwii:20191217164339j:plain プリンストンは先週の金曜日から冬休みなので、休みを使って叔父と叔母の住むシアトルにきています。めちゃくちゃ雨が降る気候、美しい港、思ったより悪めの治安・・・今まで訪れたどの都市ともやっぱり違って面白いです。
冬休みの後には試験があったり、レポートの提出期限が来たりするのですが、基本的に秋学期の授業はもうこれですべて終わりです。せっかく学科の同期のAdvent Calendar に入れてもらったので、今日はCSの授業を中心に今学期に受けた授業を振り返っていきたいと思います。

COS 326 Functional Programming

概要

文字通り、関数型プログラミングについての授業です。OCamlという関数型言語を題材に、

  • OCaml自体の言語仕様
  • OCamlで書いた関数についての証明
  • 関数型言語の特徴を生かしたプログラムの実装(言語処理系、並列処理など・・・)

を主に扱います。 教えてくださったのはAndrew Appel先生。 Modern Compiler Implementation in ML という著書が有名で、東大の授業でも使われています。

授業HP

COS 326: Functional Programming (Fall 2019)

受講理由

日本にいた時から知っていた先生の授業を受けてみたかった、というのが大きいです。また、この授業が春学期に予定されている Programming Language という大学院生向けの授業の履修要件であったことも理由の一つです。OCamlによる関数型プログラミング自体は東大でもやっていたのですが、日本で受けた授業がどのくらいこちらの授業の内容をカバーしていたのか自信がなかったので履修を決めました。

感想

結論から言えば、難しくはなかったです。少なめに見積もっても、授業でやったことの7割程度はすでに東大でやったことだったと思います。
基本的なOCamlの言語仕様については当然すでに触れていましたし、証明は機械的に関数適用を置き換えていけば明らかなものが多かったのであんまり頭を使うことがなかったような気がします。ちょっと後悔もありますが、そのおかげで色々辛かった最初の2ヶ月を乗り切れた面もあるのでよしとしましょう。
とはいえ、東大ではやっていなかったものもあります。例えば課題は割と実用的なアプリケーションっぽいを作るものが多く、うまいこと並列処理をしながら与えられたHTMLの束にインデックスを貼ったり、遅延評価を使って無限の大きさのスプレッドシートを作ったりするのは楽しかったです。 また、東大にいた時よりもModuleなど一部の機能についての理解は深まった気はしますし、来学期にやるであろう「プログラムについての証明」の入門編としても辛すぎずちょうどよかったのかなあとも思います。
余談ですが、Appel先生はなぜかプリンストンの3年生にあんまり人気がありません。別に授業が悪いとは思わなかったので不思議に思っていたのですが、よくよく聞いたら2年生むけの(ほぼ)必修授業を受け持って、先生の専門に全然関係ないので適当にやっていたかららしいです。どこかで聞いたことある話だな・・・

COS 429 Computer Vision

概要

コンピューターに画像or動画を投入してなんか情報を得ようぜ!っていう分野の授業です。CGなどの画像・動画を作りだすComputer Graphicsとはまた違う分野らしいです。
講義の2/3はComputer Visionの世界で使われてきた古典的なアルゴリズム機械学習を含む)についての説明、残りの1/3はディープラーニングの基礎とそのComputer Vision への応用、という流れで講義が進みました。
担当はOlga Russacovsky 先生。女性の先生です。 ImageNetというデータセットとその上での画像認識コンペティションについてまとめた論文のFirst Authorで、13721 という意味のわからない量の引用があります。

授業HP

COS 429, Fall 2019: Course Home

受講理由

実は東大の先生に1人だけプリンストンの先生を紹介していただいたのですが、その先生はComputer Graphicsの先生でした。当時は違いがわかっていなかったので、せっかくなのでということでComputer Visionを受講しました。

感想

前半はかなり面白かったです。割と単純なアルゴリズムでも、顔認証などの一見複雑な問題に対してかなり高い精度が出せるのが驚きでした。
一方で、後半のディープラーニングの授業はかなり基礎的な内容が多く、僕でももともと知っていることが多く退屈でした。さらに、前半で説明された多くの問題は結局ディープラーニングのネットワークに突っ込んだ方が高い精度が出たりすることもわかって残念でした。しかし、この時代に「コンピューターサイエンスを専攻しています」と名乗るためにはやはりディープラーニングの基本の基本くらいは頭に入れておいた方がいいような気がするので、それができたのはよかったです。
宿題は「顔認証プログラムを作れ」などの一見大変そうなものが多かったのですが、蓋を開けてみるとほとんどの部分をTAさんが書いてくれていて、ところどころある Fill here! って書いてあるところを埋めるだけでよかったのでそんなに大変ではありませんでした。それでいて結構視覚的にわかりやすく結果が出たので、毎回楽しむことができました。ディープラーニングのBackpropagation (逆伝播) を自分で実装する課題もあり、頭でわかっていたつもりの内容についてさらに理解が深まりました。
ちなみに、去年まではディープラーニング以外の課題は全てMATLABで書かれていたそうですが、今年全てコードをPythonに入れ替えたそうです。TAの皆さんの尽力に頭が下がります。彼らの多くは中国からきた僕と年の近いPh.Dの1年生なので、僕ももっと頑張らないとなあという気持ちになりますね。
これから期末試験の代わりのFinal Projectがあります。僕は友達の韓国人と一緒にやる予定です。彼はTensorflowのContributorで、話せば話すほどすごいなあと思える人なので、一緒にプロジェクトができるのがとても楽しみです。

COS 432 Information Security

概要

これもその名の通り情報セキュリティについての授業です。前半は共通鍵暗号公開鍵暗号Diffie-Hellman 鍵暗号など、通信のセキュリティを支える基本的なアルゴリズムの紹介がメインでした。後半はWebセキュリティ、ネットワークセキュリティ、暗号通貨などのバラバラなトピックについてそれぞれ講義がありました。
講義をしてくださったのはEdward Feltein先生。アメリカの連邦取引委員界の最高技術者だった方らしいです。すごすぎてよくわからないですね。

授業HP

Information Security

受講理由

セキュリティに詳しい学科同期にFelten先生について教えてもらったのが理由の一つです。スイスから来た交換留学生たちも受講するということだったので、一緒に受けることにしました。

感想

今学期とった授業の中で一番好きかもしれません。まずFelten先生がカッコ良いです。シャツの袖をまくって一言一言はっきりと講義をするところが非常に様になっています。年をとったらああいう風になりたいなあと思わせてくれる人です。
授業の内容も非常にわかりやすくてよかったです。特に前半は、
「AがにBに第三者に情報を漏らさずにメッセージを送りたいとしよう。でも、『第三者に情報が漏れる』ってどういうことだろうか?ここでは、『中間攻撃者Mが◯と◯の違いを〇〇%以内の確率で見分けられること』と定義しよう」
といった感じで、「安全」や「秘密」という曖昧な問題をしっかり定義に落としこんで一歩ずつ話を前に進めていくことが多くて、楽しむことができました。
反面、後半の講義は個別のトピックを1回完結で1つづつ扱っていくので、ちょっと散漫な感じがしました。しかし、宿題は

  • キャプチャされたパケットを解析してネットワークの用途を分析する
  • 用意されたWebサイトの脆弱性を攻撃する
  • Virtual Box上の仮想マシンの中で仮想の殺人事件に関する証拠を探す

など、実践的なものが多くて楽しかったです。授業HPから誰でもダウンロードできるので、年末時間のある方は挑戦してみてくださいね。

HIS 270 | AMS 370 Asian American History

概要

アメリカのアジア系住民の歴史の授業です。19世紀の中国人排斥運動から始まり、1940年代の日系人強制収容、20世紀後半のベトナム系・カンボジア系の難民の話など、幅広い年代・民族をカバーしています。
講義に加えて少人数制の授業(Precept)もあり、毎週事前に資料を読んできてからその内容についてディスカッションを行います。
担当はBeth Lew-Wiliams先生。おじいさんが中国からの移民らしいです。

授業HP

なし(あるにはありますが、プリンストンのIDでログインしないと見られません)

受講理由

僕たちには一人一人Acadmic Advisorという担当の先生がついて、学期が始まる前にその先生と履修について相談することができます。僕の担当は Brian Kernighan先生という方なんですが、この方はコンピューターの世界の歴史に名が残るような偉大な方なので、僕はこの方のいうことならなんでも聞こうと思っていたのですが、いざ相談に行ってみると
Koki! せっかくだから Humanity の授業もとった方がいいよ!これとかいいんじゃない?」
と言って全く考えていなかった歴史の授業をオススメされました。僕はもともとコンピューターサイエンスの授業以外をとる気はあまりなかったのですが、せっかくオススメしていただいた授業を取らないわけにはいきませんでした。

感想

結論から言えば、これが一番とってよかった授業かもしれません。
メインのトピックはAsian Americanなんですが、実際は黒人やラティーノといった他のマイノリティも比較のために何度も登場するので、実際に学べるのはアメリカのマイノリティの差別の歴史です。いかにマイノリティが一貫しない論理に基づいて差別されてきたか、その差別がどのように収束していって、どのような形でまだ残っているか・・・ ある意味アメリカだからこそ学べるこの問題について学べたことは本当に意義深かったと思います。
また、全く新しい分野の授業を受ける経験ができたのもよかったです。週100ページの英語のリーディングに苦しみながらも手を抜きながら全体像を把握する方法を見つけたり、最初は全く発言できなかったディスカッションで徐々に下手くそな英語で授業に貢献できるようになったり、慣れない歴史のレポートの方向性をTAと話し合いながら見つけていったり・・・今まで経験したことに挑戦しながら、自分の成長を実感できた授業でした。

この違いが国によるか、教科によるものかはよくわかりませんが、日本にいたら絶対に経験していないことは確かです。留学してよかったなあと思える授業でした。

IW08 Empowering the Citizen Scientist

概要

プリンストンのコンピューターサイエンスの3年生には、自分で考えたプロジェクトを学期を通して行い、プレゼン・レポート執筆をする Independent Work という授業があります。本当は全員が一人一人教授に直接自分のやりたいことをメールで伝えて、アドバイザーになってもらうのが理想なんですが、経験がないとなかなか難しいものです。そういう人に向けた授業がIndependent Work Seminarです。これに参加すると、あらかじめ用意されたトピックに基づいて8人ほどでまとめてアドバイスを受けられます。
僕が選んだテーマは、"Empowering the Citizen Scientist"。 研究組織に属さずに集まって科学的成果を出そうとしている "Citizen Scientist" のみなさんをコンピューターの力で助けようぜ!っていうのが主な内容です。
アドバイザーはDavid August先生。本当はコンパイラが専門らしいのですが、内容的にコンパイラについてやっている人はいなかったので、一般的な研究の進め方、発表の仕方についてアドバイスをいただきました。

授業HP

Independent Work Seminar Offerings - Fall 2019 | Computer Science Department at Princeton University

受講理由

こちらにきたばかりの時はアメリカの大学院にいくことを結構真剣に考えていました(今もなくはないです)。そして、そのためにはそろそろ何か研究のようなものを始めないとという焦りがありました。
そのためにIndependent Workはうってつけだったのですが、かといって何かアイデアがあるわけでもなかったので、適当なIndependent Work Seminar に入れてもらいました。

やったこと

ある友人がShojinmeat Projectという人工培養肉を作っている団体に所属しています。彼に何かできることはないかヒアリングをした上で、ディープラーニングを使った自動細胞カウンターを作りました。

感想

やっぱりただ宿題をやるのとはわけが違いますね・・・授業を受けながら自分でテーマを決め、データを集めて、実験して何かしらの結果を出すのは大変でした。例えばどんな困難があったかというと、

  • 使うデータセットを見つける前にテーマを提出してしまったのですが、そのあと全く細胞画像が見つかりませんでした。色々な人に聞きまくっていたらたまたまあった方に画像を提供していただけました。ありがたかった・・・
  • いただいたデータはただの画像なので、細胞の位置の正解データを手で付け足してあげる必要があります。最終的には、8000個以上の細胞の位置を手動でラベル付けしました。作業中はずっと頭の中が空っぽでした。
  • 始めた時はディープラーニングに不慣れだったので、正しい作法を覚えていくのが大変でした。自分のラップトップのCPUで学習をしようとしたらPCの動作が尋常じゃないくらいガクガクし、充電器を繋いでもなお充電が減っていくほど電力を消費し始めて頭を抱えたのはいい思い出です。
  • モチベーションを保つのが大変でした。なんとなく始めたプロジェクトだったので、10月あたりには「あれっ、俺これ全然やりたくないな・・・」という気持ちが芽生えてきて結構辛かったです。とは言え、成果がこんな風に目に見えるようになって来てからは楽しむことができるようになりました。 f:id:liwii:20191217164119j:plain 慣れない環境・慣れない分野で1から考えたプロジェクトがなんとなく形になった、ということは自信に繋がりました。 これから20ページの Final Paper を書かないといけないんですけど、頑張って乗り切りたいと思います。

    全体を振り返って

    全体的に言えば、授業は面白かったです。特に、Independent Workを中心として「ざっくりテーマが投げられてやることを自分で考える」課題が日本と比べて多く、それとしっかり向き合うことで力がついた気がします。
    反省点としては、

  • Application 寄りの授業ばっかりとってしまいました。全体的に授業自体が難しい、理解できないということはあまりなかったのですが、それは理論の授業をとっていないからな気がします。プリンストンは理論に強い学校だと周りの学生が口を揃えて言っているので、次回はもっと理論の授業を増やしたいです。
  • 授業を選ぶ基準が、「自分がやりたいから」というより「あの人が言ったから・・・」だったことが多かったように思います。特にComputer Visionは紹介してもらった先生になんとなく近づきたかったというだけがとった理由ですし、Independent Work もそれに寄せたテーマを選んだ部分があります。その結果途中だいぶ辛かったので、やはり自分の興味を優先するのは大事ですね・・・。来学期はもっと自分は何をやりたいのかをちゃんと考えて授業を選ぼうと思います。

今学期の振り返りはこんな感じですね。うまくいかなかった部分も多いですが、「まあ最初の学期だし」といって自分を慰めています。とりあえずはこれからのレポートと、迫り来る期末試験を乗り切りたいと思います。
Advent Calendar の方では、明日はEnjapmaくんがゲームの話をしてくれるそうです。お楽しみに!