こんな夢を見た

修士学生による自然言語処理研究の記録。主にDeep LearningやEmbedding関連論文の軽い自分用まとめとして。内容に誤りが含まれている場合があります。お気軽にご指摘ください。

新たなRNNと自然言語処理

先月のとある勉強会で使ったスライドを今更ながら貼ります。 そこそこの「seq2seqやAttentionほどは脚光を浴びていない、RNNの基礎部分の改良や知見」を載せることを趣旨にしています。

口頭のみでの説明も多かったり、読み込みが浅かったり、量重視だったりして、スライドの各説明は特に詳しくないです。まだまだ十分に検証されていないことや納得しきれない(論文著者の)言明も多々ありますので、読む際は、ふわふわと話半分に小耳に挟むくらいがちょうどいっか〜と思って読んでください。

需要と質はさておき英語版もあります。

Deep Learningの教材

Deep Learningを勉強するにあたって内容がまとまっている教材についてリスト化しました。
無論ここに挙げたもの以外にも充実した教材は多数存在します。また、全てを読んだり観たりしたわけではありませんので、コメントは参考程度に考えてください。

(追記) ときどき追記/編集していきます。

(以下、一部敬称略)

Bengio オンライン本

現在Web上で閲覧可能。
いつか出版される。終盤はまだ執筆中。
これ一冊で根っこの理論はバッチリそう。天下のBengioさんなので情報の信頼性、網羅性、深みは高い。全部やると分量すごい。

Nielsen オンライン本

ニューラルネットの基礎を理解するのに良さそう。逆伝搬、なぜクロスエントロピーが良いのか、なぜ任意の関数を近似できるのかなどについて。分量は比較的少なめ。
4章だけでも見る(遊ぶ)価値あり。ブラウザ上でダイナミックにNNをいじりながら学べる。
日本語訳は有志によるもの。

Goldberg レポート

The tutorial covers input encoding for natural language tasks, feed-forward networks, convolutional networks, recurrent networks and recursive networks, as well as the computation graph abstraction for automatic gradient computation.

Embeddingの雄 Goldbergさんによる新しめのまとめ。NLPerとしてNNを抑えたい、くらいならこれで十分すぎるくらいの内容。全部で60ページ強。

Cho レポート

RNN機械翻訳などで活躍中のChoさんによるまとめ。

Udacity. Deep Learning 講義

Udacityのオンライン講義。GoogleのTensorFlowを使いながら学ぶらしい。

Deep Learning Summer School 2015 動画 & スライド

Bengio, Manning, Socher, Googfellowさんなどのそうそうたるメンバーによる講義。
90分講義が30本。他である程度基礎を理解してから観たほうがなお良さそう。

Hinton 講義 ビデオ & スライド & レポートノート

  • CSC321 Winter 2014 - Course information Introduction to Neural Networks and Machine Learning
  • Neural Networks for Machine Learning - Coursera
  • Geoffrey Hinton

Hintonさんによる大学/Coursera講義。2014年のものと2012年のもの。rmsPropについての(初出の?)情報があるのもこの講義スライド中。

Socher 講義 ビデオ & スライド & レポートノート

Stanfordの講義。Richard Socherさんと豪華なゲスト講師によってNLPでのDLの応用を広く最先端まで追う。かなり良い。
ビデオもスライドもレポートpdfもある。各回の推奨論文も。

Li & Karapathy 講義 レポートノート

Stanfordの講義。こちらも豪華にLiとKarapathyさん。画像NN専門の講義ではなく、画像の分類問題を題材にしながら、SVMSGD、逆伝搬などでNNを基礎から積み上げていく感じ。ビデオもスライドも無いけど、コードや画像付きのレポートノートがとっつきやすそう。

Nando de Freitas 講義 ビデオ & スライド

Oxfordの講義。Machine Learningと題しているが、大半はDeep Learning。

Cao 講義 スライド

  • Deep Learning for Computer Vision and Natural Language Processing
  • Liangliang Cao, James Fan

コロンビア大の講義。スライドのみ。画像寄り

Schmidhuber 講義

Schmidhuberさんの講義。NN特化ではない。内容は充実しているけどこれだけで学習するには易しくなく不向きかも。

Hugo Larochelle 講義

Sherbrooke大の講義の補助用に挙げられている動画。英語。小分けにされた各トピックが10分前後で用意されている。

岡谷さん本

この本でしか味わえない充実感。基礎からSGD、自己符号化器、CNN、RNN、ボルツマンマシンまでと、盛りだくさんの内容を体系的に解説。

日本語書籍。引用紹介文のとおり、基本的なことが一通りそろっていて読みやすい。岡谷教授の専門は画像。

人工知能学会誌本

日本語書籍。人工知能学会誌での深層学習についての連載を大幅に加筆修正して出版。RBMなどNNを基礎から踏まえ、各分野でのプラスαの使われ方について述べる感じ。幅広く分野を抑えたい人向け。

伊庭さん本

ディープラーニングの基礎となるニューラルネットワークの理論的背景から人工知能との関わり、最近の進展や成果、課題にいたるまでを詳しく説明します。「進化」と「学習」をキーワードとして、人工知能の実現へのアプローチや知能の創発についてを説明する、ニューラルネットや進化計算による学習の基礎的なところから分かりやすく説明する、「進化計算」を用いた「深層学習」への取り組みを説明する、などです。

Ke-Lin Du 本

明快な問題解説から始めて歴史的な脈絡を追って最新の研究まで紹介しているらしい。

Schmidhuber レポート

Schmidhuberさんが、1940年頃-現在までのNNについてきっちり歴史を追いながら俯瞰。
本文は35ページ。引用のみで53ページ使っているほど律儀に引用しているので、各テーマについて文献を探したいときにも有用そう。

Deep Learning Tutorials with Theano

DLフレームワークTheanoを使いつつDLの各コンテンツについて説明していくスタイル。Theano使うつもりなら、ここで合わせて馴染むと有用。

DL4J Deep Learning for Java

JavaベースのDLフレームワークのDeeplearning4j (DL4J) のサイト。DLの各コンテンツについて記事がある。DL4J使うつもりなら当然特に有用。

colah's blog

図解も含めた説明でとっつきやすい。あれこれのテーマについてそれぞれまとめている。

  • Calculus on Computational Graphs: Backpropagation - August 31, 2015
  • Understanding LSTM Networks - August 27, 2015
  • Visualizing Representations: Deep Learning and Human Beings - January 16, 2015
  • Groups & Group Convolutions - December 8, 2014
  • Visualizing MNIST: An Exploration of Dimensionality Reduction - October 9, 2014
  • Understanding Convolutions - July 13, 2014
  • Conv Nets: A Modular Perspective - July 8, 2014
  • Deep Learning, NLP, and Representations - July 7, 2014
  • Fanfiction, Graphs, and PageRank - July 6, 2014
  • Neural Networks, Manifolds, and Topology - April 6, 2014

DEEP LEARNING FOR NATURAL LANGUAGE PROCESSING - memkite

NLPの諸分野に使われているDL論文を挙げたリスト。

DeepLearning.net

更新がもうなされていないので古いけど論文リストは有用。2010年頃のDLの盛り上がりの時期の論文メイン。

Awesome-rnn

Recurrent neural networksを各分野の各テーマで用いた論文リスト。近年のランドマーク的なものに絞っていて良い。

2015 PFIインターン

8/3から9/30までの2ヶ月間、株式会社Preferred Infrastructureでのインターンシップに参加してきました。
今後、PFI & PFNのインターンに興味を持つ方の役に立つかもしれないので、一応記録に残すことにします。ほとんどは選考の個人的な話です。

エントリーと選考

はじめは、PFIインターンも知っていましたが、エントリーする気は全然なく呑気に暮らしていました。とはいえ、インターンのテーマのひとつでもあった自然言語処理のDeep Learningには少なからず興味がありました。このブログを書き始めたのも、今年の5月頭からです。
そうしていると、ある日とある研究員さんに勧められました。そんなそんな受かるはずもないと渋っていると「ああいう選考は、受かったら本人が大変な思いをする人を帰すためにあるだけだからとりあえず受けといたらいいんだよ」と言われ、なるほどいい言葉だと思ってエントリーすることにしました。今思い起こしても、現実的な真理はさておき、なるほどいい言葉です。
この思いつきが5月15日(金)で、インターンの応募締切は翌々日の17日(日)でした。急いでアピールポイントをかき集めたものと履歴書と志望動機書を用意しました。アピールポイントの方は、過去の他企業との共同研究の話と、冬に行った他企業のインターンコンペの話と、自然言語処理関連の研究経験を載せて、プログラミング言語Pythonだけ一応まともに使えて他はだめですとも書きました。このブログのURLも載せました。また、いつぞやの小町先生の言っていたことを思い出して、C言語もTAやってました、というような小さい小さい情報も一応は書いておきました。志望動機の方は、Deep Learningの知見とか勘を盗ませてくださいよ、開発経験無いんですが興味はあるんです、新たな環境って単純に良いですよね、あたりの気持ちをある程度ちゃんと仕立てた文で書きました。 履歴書には写真不要だったのですが、昔の誰かインターン生のブログ記事で写真を貼ったと書いてありました。自分の履歴書を見ると写真欄が空いていて、これまた寂しい気もしたので自分も貼ってみました。手元にある固い写真は暗い写真ばかりだったので、Facebookのプロフィールに設定しているようなフランクな写真を貼りました。本来要らない写真を貼るくらいだからこれくらいしても問題あるまいという、変に勢いづいた出来心からでした。

しばらくすると書類選考通過の連絡が来て、面接を受けられることになりました。また、事前課題ということで、基本的な機械学習関連のスクリプトを幾つか書くのと、謎の素性データを用いてそこそこの精度の二値分類を達成するべしという課題でした。後者の方は適当な手法であっというまに規定の精度は出るもので、オプション課題としてもう一段階上の精度が設定されていました。オプションやりすぎないで学業優先してね、と書かれていたので、結局はその精度は達成しないまま提出しました。なんにせよずっとは取り組むつもりがなかったので、早めに取り組んで、パッパと終えて締切よりそこそこ早く提出しました。「まだ余力を残しているな」と思われる幸いを狙った浅はかな計略からでもありました。
面接の方は、自分は仙台にいる身なのでSkype面接で済ませてもらいました。内容は基本的には、自己紹介、それへの質問、事前課題(のコード)の説明、それへの質問、今後(短期的そして長期的に)なにをやりたいかという質問、あたりでした。全て完璧にいったかというとそうではなく、幾つか良くなさそうな対応もしちゃいましたが、ビビらず堂々と話し続けられればそれでいいのではと思います。コードや手法の説明がちゃんと出来るか、というのが結構大事で、コード自体も超高速化とかするよりは普通に読みやすい形で書ければそれで良さそうでした。でも内包表記ぐらいはほいほい使ってしまっても問題なさそうでした。自分がPFIの面接としてイメージしていた「さて、この処理をこのメモリでこの速度でこういう感じにするにはどうする?」というプロコンチックなゴリゴリアルゴリズム問題は今回はありませんでした。自分としては大いに助かりました。来年以降はもちろんどうなるか分かりません。
後から社員さんに聞きましたが、もっともっと皆応募してほしいということでした。自分のような、ダメもとの思いつき滑り込み応募のSkype面接で事前課題は普通の出来、という感じでも受かったりすることはあるくらいです。とりあえず重く考えすぎず応募してみるのが大事だと自分も思います。

何はともあれ無事合格し、通わせてもらいました。

本当はこれ以降のことを重く書くべきかもしれませんが、自分はおそらく「業務上知り得た内容」の線引きが未熟ですし、下手な誤解を与えることもしばしばですので、これ以降の内容については控えめにしようと思います。

取り組んだこと

コールセンター用対話システム、という大目標につながるような研究(開発)をあれこれ行いました。最終発表ではNeural Conversational Modelに関して、少ないパラメータで色々検証してみたり、新たに拡張を行ってより良い返答文生成が行えるように(少なくともそう見えるように)した、という話をしました。
2ヶ月ある中でずっとそれに取り組んでいたわけではなく、他の出来立てホヤホヤ研究の追試や応用を行ったりもしていました。昨今のNeural Network系のアプローチでよくあるらしい、全然再現出来ない問題に悩まされたり大変でしたが、そういうどん詰まりに対してもメンターさんを始めとした皆さんは結構寛容でした。自分自身、軽々しく発案して実験して失敗してを力づくでひたすら繰り返す研究スタイルなので、割と性に合っていました。
毎日のようにGPUで学習を回して試行錯誤を繰り返していました。自分は育成ゲーが好きなようで、毎日「ああ、昨日回したあいつは天才に育っているかなあ」と思いながらの通勤時間徒歩10分が至高でした。そして通勤直後に「ああ、駄目なやつだ……」と悟ることで気持ちを静めるという、安定したルーティンを行えた毎日でした。

PFIという企業

色んな人材がいると思いました。分野別という意味合いで色んな人がいるというのはもとから予想していたのですが、研究-開発-運営?-営業というような縦の広さも感じました。後者はむしろ当たり前すぎることなのですが、自分の社会経験の薄さからすると、今まで研究開発側に偏った一面的なイメージでしかPFIという企業を見ていなかったなあと思わされました。 昔の誰かのインターン生の記事ではレッドブルが盛んであるというように聞いていましたが、そこまででもありませんでした。むしろ業界からすれば時間的にも余裕がある方の白めの企業に感じました。ちなみに自分はインターン中にレッドブルを一切飲まなかったので、インターンに黒みがあるとかいうこともありません。

まとめ

楽しかったです。研究室とは異なる世界で、自分の立ち位置を考える非常にいい機会になったと思います。また、2ヶ月で新しい尖ったものに飛びついて畳むというハイペースなこの気持ちは今後の研究生活にも役に立ちそうです。
ここまでお読みいただいた方、PFI & PFNの方々、それから他のインターン生の皆さん、ありがとうございました。

A Neural Conversational Model

A Neural Conversational Model
Oriol Vinyals, Quoc Le, arxiv 2015

seq2seqのNNを対話に応用。
sequence to sequence の元論文では機械翻訳で「翻訳前文」→「翻訳後文」で学習して、実際にその通りに実行していた。本論文では「ある発言」→「その後に相手がした発言」というペアで学習。

論文自体は非常にシンプル。seq2seqを知っている前提でササッと雑にモデル説明して実験。結果は、実際に人間と会話させてみた例をたくさん、と、ある質問に対する答え方を既存の対話システム(Cleverbot)http://www.cleverbot.com/と人間が比較してどっちがいいかという評価。
後者の評価ではとりあえずCleverbotにしっかり勝利。対話には疎いためCleverbotの性能に関してはさっぱり知らず、受け止め方がわからない……。
前者の会話例の方はなかなか面白い。本当にちゃんと文が出てくるものだと驚かされる。驚異的に会話が成り立っている部分もあれば、全体の文脈としては全く話にならないような部分もある。

少々はっきりとしなかったのは、入力は「直前の発言」のみなのか、という部分。それ以前の文脈も引き継ぐことは自然に可能だと思うのだけど、特に記述はない。自明な事柄ではないと思うんだけども。図1では入力部のContextに括弧書きで(Previous Sentences)と複数形で書いてあるが、これはあくまで「直前の発話文が複数なら、それらをまとめて」という程度の意味合いに思える。
しかし、そうだとすると会話文中で相手が「yes」とか「ok」とか言った時点で完全に文脈がきれいさっぱり消えるような気がするが、例ではそうなっていない。例2では人間が「ok」と言う機会が二度あるが、それに対するモデル側の返事は異なっている。確率的なモデルではないし、となるとやはり直前より前の文脈も入力にしているのだと思う(もしかしたらデータセット1のときのみかも)。

参考: Oriol Vinyals, Quoc Le, "A Neural Conversational Model" (arXiv:1506.05869 [cs.CL]) ざっと読んでの(非専門家の)感想

余談。
人工知能マシン、プログラマーに怒る(英語原文) や それに触れた人工知能が研究者に「人間らしくしろよ!」と怒り出しネット騒然 という記事がはてブで伸びていたが、この記事が言っていることは見当違いだと思う。原文自体も少々微妙だが、和訳で「copping a little attitude」を「怒りを示すこと」と訳したりして致命的にずれた感がある。原文は、示されている会話が本当は中略されているのに言明なしなのが非常に気になる(直前の"part of exchange"では流石に中略は省略できまい)。上手くいっていない部分について全く触れないし、燃やす気満々のように見える。

Sequence to Sequence Learning with Neural Networks

Sequence to Sequence Learning with Neural Networks
Ilya Sutskever, Oriol Vinyals, Quoc Le, NIPS 2014

不定長のシーケンス(単語列)を入力に不定長のシーケンス(単語列)をLSTMで出力。
機械翻訳の翻訳元の文を(深層の)LSTMで読み取っていって、その後に先の文を一単語ずつ出力していく形式。単語ではなく、""という文終了シンボルが出力されたらそこで打ち切り。それによって出力側の不定長にも対応。出力時には最初は入力文ベクトルを受け取って1単語目を出力、次にそのときのmemory cellに残ったベクトルと「さっき出力した(1単語目の)単語ベクトル」を入力として2単語目を出力、以下繰り返し。学習時には「さっき出力した単語」ではなく逐次「さっき出力すべきだった正しい単語ベクトル」を入力にする。
ちなみに入力文のエンコード用LSTMと出力用のLSTMは別ものとして学習するし使用する。

一単語ずつ出力する、と書いたが、実際には毎回各単語に対して(ソフトマックスで)出力確率を求めて、その最大確率をとるものを出力している。このときに最大確率だけでなく、k-bestの単語をとっていくビームサーチを行って、最終的な複数の単語列のうちでスコア最大のものを出力文として決定することもできる。そうした方が結果はよかった。処理時間はもちろん多めにかかる。(見落としただけかもしれないが、ビームサーチ時の最終的な単語列スコアをどう求めるかは書かれていなかった。単純な確率積だと「長い単語列が著しく確率的に不利になる問題」が起きてしまいそうだが、何か解決策があるのだろうか。昔何かで読んだような……)

また、おそらく今までやられていなかった試みとして「入力文を逆順にして読み取る」ということが行われている。そしてそれは性能向上にかなり貢献している。翻訳前の文の文頭の情報ができるだけ残った状態で、翻訳後の文頭部分を出力できると考えると、似たような構文をもっている言語間であれば一般的に通用しそうだ。その辺の言語ごとの検証とか、誰かやってくれていないだろうか。

実験結果としてはstate-of-the-artの性能に迫った。このモデル単体でも良い性能が出るが、一番性能がよかったのは既存の機械翻訳のモデルで出力候補文上位1000件を用意して、それを本モデルでリランキングするというスタイルだった。どこか別の論文でもリランキングがとても上手く決まるというのを見た気がするので、生成的なDNNは(計算コストの面から見ても)リランキングモデルがかなりフィットしているのかもしれない。
入力文反転、アンサンブル、ビームサーチ、どれもばっちり性能向上に貢献していることが見れる結果で清々しい。コスパのよさでいうと、入力文反転>>>アンサンブル>ビームサーチとなりそうだ(学習計算量と実行時の計算量が入り交じっているが)。

LSTMが深層になっているのだけど、その構造がいまいち明確には書かれていないように思う。イメージはできたけど、それが本当に正しいのか不安。図がほしい。