自然言語処理を独習したい人のために

東京都立大学自然言語処理研究室(小町研)に入学する人たちは、入学後に自然言語処理・機械学習・プログラミングの基礎勉強会を行なうため、特に事前に学習することはありませんが、入学前に勉強しておいたほうがよいことはあるか、と問い合わせがあるので、自然言語処理の独習用の情報を書いておきます。(主に情報系以外の学部生を対象にしています。)

近年の深層学習の発展に伴ってニューラル機械翻訳をはじめとした深層学習の研究をしたいという人がうちの受験希望者の大半ですが、深層学習の研究をしたい人はプログラミングと数学と英語のすべてがある程度できなければいけません。どれか1つでも足りないものがあれば、ほとんど研究できないと思ってください。これらは現在ほぼ未習の人が入学してから勉強して追いつけるものではないので、深層学習の研究がしたい、という場合はよくよく考えたほうがいいです。東大中山研の深層学習の研究がやりたい人へもご覧ください。ちなみに、深層学習の開発がしたい、という場合は特にハードルは高くありません(GitHub に転がっている PyTorch や TensorFlow のソースコードを使って手元のデータで何か動かしてみる程度であれば、少しプログラミングができれば、数学はさっぱり分からず、英語もちっとも読み書きできなくても OK、という意味です)。

数学

ほとんどの大学の入学試験で微分積分・線形代数が必須となっているので、理工系の学部1年生程度の微分積分・線形代数の知識は身につけましょう。機械学習(最適化数学)を勉強するに当たって、微分積分・線形代数の知識が必要になります。微分積分・線形代数については研究室でフォローアップはしませんし、大学でも基礎講義はない(履修できるが単位にならない、という意味ではなく、そもそも 日野キャンパスでは補習的な授業は開講されていない)ので、大学院入試がきっかけだと思って、入学前に勉強しておいてください。

自然言語処理で用いられる機械学習では高校数学の範囲は全て登場します。もどりま表を確認してください。よく使うのは「ベクトル(内積)」「連立方程式」「確率(同時確率・条件付 き確率、確率変数・確率分布)」「数列(等差数列・極限)」「微分(対数関数・指数関数の導関数、合成関数の微分、関数の極大・極小および最大・最小)」 「行列(固有値、逆行列)」あたりです。人文系の人は、高校の教科書と大学受験の参考書でよいので、復習しましょう。未習の人は苦しいかもしれませんが、もしこれらの数学を勉強するのがどうしても無理な場合、東大の言語情報科学専攻のように人文系を対象とした大学院に進まれたほうがよいと思います。ちなみに本学の情報科学域は2020年に実施される夏季入試から「確率・統計」も専門科目に追加されました。

小町は哲学科から情報科学研究科に専攻を変えたため、M1のとき「行列のテンチ」が分からず(漢字も知らず、かつ漢字を聞いてもなんのことか分からない)、授業中先生に質問したくらいですが、学部1年生程度の線形代数をちゃんと勉強していれば、「行列の転置」は知っているものと思います(そんな自分が博士後期課程では行列演算を駆使した研究テーマに携わることになったので、将来は分からないものです)。NAIST は情報科学・数学・プログラミングの基礎講義を大学が用意してくれるので、入学前に知識が十分になくても大丈夫です。基礎知識に不安がある人は、NAIST に進学しましょう。

ちなみにいわゆる文系から自然言語処理に専門を変えてその後ソフトウェアエンジニアまたは研究者として活躍している人は、ほとんど大学受験までは理系だった(が、実際に入った大学は文系だった)か、東大や京大のように文系でも数学の2次試験のある大学出身か、あるいは在学中に独学でプログラミングをしていたか、あるいはその全てです。大学受験でも数学を勉強していない(高校のときは文系クラスだった)かつプログラミングも大学院に入ってから勉強するつもりだ、という人は、睡眠時間3時間で1年以上勉強するくらいの覚悟が必要です。うちの大学院に合格した人文系出身の人は、大学院入試の1ヶ月前は毎日10時間以上数学を勉強した、と言っていましたが、大学受験で理系の数学の勉強をしていない場合は、2019年現在はそれでも合格は難しいと思います。

研究室として特に数学の補習は行なっていませんが、受験生は「マセマ」を使って勉強したりしているようです。個人的には以下のような本に登場する例題が理解できる程度の基礎知識があればいいと思っています。

    • これなら分かる最適化数学・これなら分かる応用数学教室

    • プログラミングのための線形代数・プログラミングのための確率統計

英語

自然言語処理に限らず情報工学分野ではほとんどの最新の研究成果は英語で発表されるため、英語で論文を読むことが必須です。ソフトウェアエンジニアとして就職する場合も、英語で発表された論文を読んでプログラムとして実装する、ということが主な業務になったりするので、英語の読解能力は必須であると考えてください。具体的には大学院入学前に TOEIC 650 以上、修士を卒業するころには TOEIC 785 以上を目指しましょう。もっとも、ここ10年で学生の英語力は格段に向上し、人文系出身の人は TOEIC 785点は普通にあり、時々900点台もいる、という状況だと思いますので、人文系の人にとってはあまり気にならないと思います。2018年度の博士前期課程の入試から、理工系出身でない人には TOEIC 785点以上または TOEFL iBT 72点以上(いずれも CEFR B2 相当)を求めることにしました。

ちなみに話したり書いたりというアウトプットができるととてもよい(海外でインターンシップをしたい人などはアウトプット能力必須)ですが、博士後期課程に進学しない場合は、必ずしも論文を英語で書く必要はないので、ひとまず読解能力(論文に書かれている内容を他人に説明できるくらい理解して、プログラムに落とす能力)を身につけるようにしましょう。

国際会議に採択されると英語で発表しないといけないので、TOEIC 785点以上ある人はそこまで気にすることはないと思いますが、採択が決まってから研究室内で英語の特訓をしたり、オンライン英会話などを利用して英会話のレッスンを受けたりする人が多いです。

英語力がそれなりにある(目安としては TOEIC 785点以上)場合、自然言語処理は海外にインターンシップまたは留学に行く機会もふんだんにありますが、大学院から自然言語処理に専門を変えた場合は専門知識が足りずに行けない、あるいは就職活動とバッティングして行けない場合が多いので、海外に行ってみたい人は博士後期課程への進学を検討してください。D1/D2 は余裕があるので数ヶ月〜1年程度海外の大学・研究機関等に行くことは可能ですし、進学予定であれば就職活動をしなくてよいので、M2 の時期に行くことができます。

プログラミング

大学院入試ではプログラミング能力について問われる(合否に関係する)ことはほとんどありませんが、入学後にプログラミング能力がどれくらいあるかによって、研究のスピードが大きく異なります。自然言語処理分野で多く使われている言語は、Python・Java・C++ といったところです。当研究室では、Python を「公式」言語とし、デフォルトは Python で書いています。他に得意な言語・好きな言語がある場合は、それを大事にされるとよいかと思いますが、どの言語でもよいので、リファレンスを見なくてもやりたいことがすらすら書けるくらいの言語を一つ作ってください(複数の言語に手を出してどれも中途半端になるより、一つの言語でも使いこなせているほうが、遥かに望ましいです)。

プログラミングについて自信がない人は、入学前にたとえば CodingBat にある問題(Python と Java のみ)や Codecademy を全部解いてみて、何も見ないですらすらと解けるようになるまで繰り返してください。参考書としては「みんなの Python(第4版)」を勧めています。ウェブで参照できるものとしては「お気楽 Python プログラミング入門」(Algorithms with Python)がよいでしょう。

2016年度からは、情報系以外の出身の人(ソフトウェア開発経験がない人)にはAizu Online Judge (AOJ) の Introduction to Programming (ITP) の全てと、「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」の「基礎編」の問題を入学前に解いてきてもらうことをお願いしています。この本は AOJ 準拠で、AOJ はプログラムをサーバに送ると勝手に採点してくれるので、独習に適しています(ただし、Python だと時間切れになってしまう問題がときどきあるので、Python でやる場合は全部完璧に解こうとはしない方がいいと思います)。この本の「基礎編」は情報系の学部2年生修了時相当の情報科学に関する基礎知識ですので、この部分は独習する必要があります。ちなみに本学の情報科学域は2020年に実施される夏季入試から「データ構造とアルゴリズム」も専門科目に追加されましたが、内容はこの本に載っている内容でカバーされます(あるいは「アルゴリズムイントロダクション」の「第1巻」と「第2巻」、特に「第1巻」をご覧ください)。

機械学習

現在9割以上の自然言語処理の研究では機械学習を用いた手法が提案されています。従って、機械学習は自然言語処理の研究をするに当たっては、避けて通れない道です。新入生は高村「言語処理のための機械学習入門」(コロナ社, 2010)を半年かけて読み、演習問題を全部解きますので、もし独習されたい方はそちらをお読みください(読むだけでなく、演習問題も飛ばさず全て解きましょう。全部の問題に、解答がついています)。

内容が難しすぎる、と感じる場合は恐らく数学の基礎知識が不足しているので、入学前に機械学習の勉強を独学でがんばるよりは、数学の勉強をしてみてください(機械学習は、研究室の中で基礎勉強会を行なうので入学後でもよいですが、微分積分や線形代数に関しては、研究室の中でも大学の中でも講義・演習がないので、入学後に勉強することが困難であるためです)。

「言語処理のための機械学習入門」は読んだけど、そこからプログラミングすればいいのか分からない、と思う人は、「Python 機械学習プログラミング」を読むとよいです。一通り実践的な機械学習の仕方を追うことができます。

自然言語処理

入学後にもう一度学び直すので、あえて独習する必要はありませんが、独習されたい場合は Python による日本語自然言語処理 をお勧めします。実際のプログラムもついているので、実行しながら学ぶことができます(ただし、記述が古いため、そのままでは動かないようですし、今は歴史的使命を終えている気がします)。独習に向いているのは言語処理100本ノックですが、入学後に新入生は全員解きます。

研究に関してはACL Anthology というサイトに自然言語処理の論文誌・国際会議の発表論文がほぼ網羅されているので、この中の論文タイトルをざっと見てみたり、おもしろそうなタイトルの論文を見つけたら中を読んでみたりしてください。お勧めは ACL, NAACL, EMNLP, COLING, TACL です。

本を1冊挙げるなら黒橋「自然言語処理」(放送大学出版, 2019)をお読みください。薄いながら、しっかり必要な分野をカバーしています。深層学習については「深層学習による自然言語処理」(講談社)を読んでください。2015年くらいまでの状況しかカバーしていませんが、研究の雰囲気が分かるよい本です。