あおのたすのブログ

Deep Learningと自然言語処理と機械学習に興味がある大学院生のブログ。最近は強化学習・Semi-Supervisedなどに興味が出てきた。

PFNに入社して1年が経ちました

Googlerの皆様のブログを発端として、自分も感化されて記事を書いてみます。
note.mu

medium.com

ctrl-x-s.blog


今回書きたいのは主に:

  1. どうやって自分がPFNに入ったか
  2. この1年PFNでどんなことをやっていたか

を振り返りたいと思います。

学生時代(中学生・高校生〜)

自分がPFNに入社するまでの話をする前に、中学生の頃に話をさせてください。(どれだけナルシストナンダ)

中学生の頃、僕はウェブサービスを作るのが好きでした。
父親からもらったPCで簡単なhtmlを書いたり、掲示板をカスタマイズしたりしていました。

全くプログラミング分からなかったので、PHPの本を買って勉強して、
ウェブサービスを作って、はてなブックマークのホットエントリーに入るかどうか、にすべてをかけていました。
当時、Google検索エンジンに興味を持ち、自然言語処理という技術らしいということを知り、
自然言語処理に興味を持つようになります。

当時はMashup Awardなどコンテストに応募してたりしていました。
gihyo.jp


また個人サービスを作っている方も多く、
satoru.net
ropross.net
読んだ本を記録して、新しい本に出会おう - 読書メーター
など個人で活躍されている方々を尊敬な眼差しで見ていました。

ウェブサービス時代

大学生の頃もウェブサービスなど作っていて、ある時思いました。
Webサービスを開発している会社が本気を出したら、僕の作っているサービスはすぐ作ることが出来るだろうし、
僕が今やっていることは意味あることなのだろうか・・・


そこで自然言語処理を使っているGoogleのようなコピーできないサービスを作ることに価値があるし、
自分も自然言語処理を勉強したいと思い始めます。

自然言語処理に興味がありつつ、名古屋工業大学の学部時代の卒論は独学でParagraph Vectorに関するテーマを選択したのですが、
限界を感じ、将来は、機械学習に関わる会社(PFIとか)で就職したいと思っていたので、学部時代は悶々としていました。
推薦で大学院に進学したのですが、このまま大学院の2年間を過ごしていいのだろうか・・・と悩みました。

将来、機械学習の会社に就職したいと思っていたので、思い切って休学し、NAISTの松本研に入学し直します。

NAIST時代

自然言語処理の研究室である「NAIST 松本研究室」に入学しました。
(その間、東京のベンチャーでウェブ関係の会社で半年間、正社員で働いたり、お世話になりました)

NAIST入学を決意した年くらいにYANSに参加しました。
YANSとは、自然言語処理の分野の若手の会(合宿形式)のことです。
そこで現在の職場の海野さん(@unnonouno)とたまたま、同じ部屋で泊まることになります。
YANS中で同じ部屋になり、寝る前にChainerのこととか質問したり、LSTMのバッチ学習法について話して、関わりができました。
当時LSTMをバッチ処理するためにはpadding処理をする必要があり、直接話を聞けたのはとても貴重な体験でした。

PFNインターン時代

NAIST修士1年の時にインターンシップに応募し、2ヶ月間お世話になりました。
周りの同期がめちゃくちゃ優秀な人が多く、充実したインターンシップでした。

その反面、同期が優秀過ぎてツライ思いをしつつ、
PFNに就職したい気持ちと、PFNに対する不安(周りが優秀でツライのでは・・・)がありつつ、応募には悩みました。

正直、インターン2ヶ月間の中で自分が満足いくような実績が出来たわけではないので、正社員として応募するときは悩みました。

修士2年の言語処理学会の若手懇親会(YANS懇)で、当時Appleで働いていた羽鳥さん(後にPFNに入社)と話をして、
メンヘラな悩みを相談しました。

以下のような会話をした気がします。
自分
「僕、インターンシップ経験したんですが、技術的にPFNで働ける気がしないし、就活悩んでいます」

羽鳥さん
「ん〜まあ技術的に突出している部分があると良いけど、企業としては1人増えることで、1つ考え方の視点が増えること、多様性が増えること、が大事なので、あまり技術的に今足りていなくても、技術的なことは後からカバーすれば良いのでは?」

と僕のメンヘラな悩みに優しく答えて頂き、勇気を出して応募しました。


その他、修士2年の時に、PFN以外の会社の見学をさせていただいたりして、とても勉強になりました。


(現在の採用プロセスと自分の時は少し違うため、こうすれば受かる!みたいなテクニックはないのですが、
 例えば、Chainerで再現実装を上げている人であったり、学会で面白い発表している人であれば、
 パーソナリティがわかりますし、インターン参加したい人は少し意識すると少し有利になるかも?しれません)

PFN時代

入社後のことを書きます。
言語処理をNAISTではやっていたのですが、入社後は、音声認識に関する仕事をしています。
音声認識は、 Speech to Textのタスクなので自然言語処理も関わりあるタスクで面白いです。
例えば、(自分の)自然言語処理では、あまりリアルタイム性を求められることは少なかったのですが、
音声になると特にリアルタイム性が求められます。

入社して半年くらいは、以下のお掃除ロボットの展示デモの音声認識部分の仕事をしていました。
projects.preferred.jp
CEATECという展示会で個人向けロボットの展示を行いました。
散らかった部屋をロボットが深層学習で認識をして、どこに何があるのか、どう掴めば良いのか、どこにどう置けば良いのかを自動で判断するデモです。
「パーソナルコンピュータのようにパーソナルロボットを普及させる」というのが会社のVisionです。

この1年はわりと音声関連のプロジェクトに関わらせて頂きました。

研究

今年1年では一応1本論文を出すことが出来ましたが(査読中)、来年度はもっとと表に出る仕事をやっていきたいです。
1年で1本は通せるようになりたいです。

PFNでは、最先端の研究をするチームも存在していて、彼らの研究は国内でもトップクラスの研究をやっていると思います。

openreview.net

openreview.net

以下、自分が入社して感じたPFNのポジティブな面です。

PFNのポジティブな面

社内の人材が豊富

社内の人材が相当豊かです。
NAIST時代も同期には濃厚な人材に恵まれて、とても楽しかったのですが、それ以上に濃厚な同期が居ます。
これは就職したら、少なくとも社内の方が、研究室時代よりは多様性があり、楽しい、というのはある気がします。

経営陣の判断が早い

恐らく200人規模の会社とは思えないほど経営判断が早い気がします。
また、チーム間の隔たりがありません。
部署間の隔たりがありすぎて、社外の方が協力しやすい、みたいな企業では無いです。

PFNのネガティブな面

入社前までは、Twitterで読んだ論文の感想などつぶやいたりしていたのが、
社内Slackでコミュニケーションが完結するので、Twitterにつぶやいたりするのが減った気がします。
それだけ、社内のメンバーが面白く、社内コミュニケーションだけで自尊心が保たれる、とうことかもしれません。

また、ベンチャーなので制度的に未熟な点があると思います。
これは一見ネガティブかもしれないのですが、自分たちで制度を作っていけるという意味では良いのかもしれません。

最後に

もし昔の自分のように、応募に悩んでいる人いたら一度、インターンシップ・採用に応募お願いします。
www.preferred-networks.jp


また自然言語処理の夏のYANSの運営も今年も関わる予定なので、ぜひ皆さん参加してください。
yans.anlp.jp

Twitterもやっています。
twitter.com

PFN夏インターンシップに参加してきました

今年の夏のインターンシップでPreferred Networksのインターンシップに参加してきました。
期間は8月〜9月の2ヶ月間でした。

※この記事は選考のこととか、インターンの日常のことを書いてあるだけで、技術的なことは書いてません><
具体的な内容などはPFNのブログの方を見てみてください!

エントリーと選考

まずはエントリーの書類を書き上げて、その後リモートでコーディングテストを受け、
後日Skype面接を行って、合格の通知をいただきました。

2年前のインターンシップに実は応募していたのですが、書類の段階で落ちてしまった経緯があるので、
書類は気をつけて書きました。

主に気をつけた点としては、

  • どんなことをやりたいのか具体的に
  • 実績は特にあるわけではないが, Chainerでこんなコード書きましたみたいなアピールを書きました

前回落ちた時はやりたいことをフワッと書きすぎたので、今回は気をつけました。

参加してみて

今年のインターンシップ生は14人だったので、インターン生同士の交流も楽しかったです。
インターンシップ生はバラエティーにとんだ人たちで、普段関わる分野ではない人が多くて良かったです。
(優秀すぎてこっちは辛いってのもありましたが…)

自分はエントリーの書類で海野さん(@unnonouno)がメンターが良いと書いたのですが、その希望が通って
主メンターは海野さん、副メンターは福田さんでした。

やってことは対話系のテーマだったのですが、詳しくは割愛…
2ヶ月あれば色々凄いことができるぞっと意気込んでいた8月でしたが、もっと計画的に過ごせばよかったかなと最後は思いました。

PFNについて

普段自分は自然言語処理の研究室にいるのですが、PFNには強化学習をやってる人がいたり、
画像処理、ロボット、ドローンについてやっている人が居て普段交流の無い分野の人が多く、
しかもその分野を詳しく知ってる方が多いので刺激的でした。

他分野のこともサクッと質問できる環境は魅了的だと思います。
毎週論文紹介の勉強会があり、岡野原さんが論文紹介したり他の人が面白い論文を紹介してくれます。

一日一本レッドブルが無料で飲めます。いい会社。
東京の大手町オフィスなのでランチが選べる。いい会社。

今後

PFNで遠隔でChainer関連のバイトをやる予定です。
自分は開発があまり得意ではないので、いい経験になりそうです。

Chainerのサンプルコードを集めてみた(メモ)

Chainerのサンプルコードは色んな所で公開されていますが、
一箇所にまとまっている所が少ない気がしたので、個人用にまとめておきます。

ここに載ってないサンプルコードがありましたら、
コメント欄か@aonotasまで教えて下さい!!

誰得かは分かりませんが,gitにもメモ用に作りました。
github.com

適宜更新していく予定です。
Chainer OfficialのTwitterアカウントが主な情報源です。

Official wiki page (some examples list)

こちらの公式Wikiも有用です。

他のサイト様では
chainerのサンプルコードを集めてみた(チュートリアルも追加) - studylog/北の雲
がサンプルコードのまとめとしては良いかもしれません。

更新履歴

  • (2016.08.19) 記事作成
  • (2016.09.31) Fully Convolutional Networksを追加しました(thanks: @nizumical )

画像・動画系

DeepPose

R-CNN


Fast R-CNN


Group-CNN


Fully Convolutional Networks

seiya-kumada.blogspot.jp

Selective Search


Faster art style transfer


illustration2vec


waifu2x

artificial Gogh/Picasso machine


Gogh (and Picasso)


VGG-net


image caption generation


covnet benchmark


NLP系

Recurrent Language Model


encoder-decoder MT


RNN文章学習


LSTM variants

char-embedding


BinaryNet


Deep Networks with Stochastic Depth


VAE,GAN系

VAE, GAN


Generative Adversarial Nets


fauxtorgaph to make generative fonts with GANs


強化学習系

Deep Q-Network

その他

ResDrop


PredNet (http://arxiv.org/abs/1605.08104 )


Siamese


support vector machine(SVM)


流体計算

Convolutional Autoencoder

introduced Chainer as "looks extremely promising". Really?

RNN to write Russian literature by modifying Chainer-user's code


(speed)Caffe reinforces its dominance, Torch7 and Keras move forward, Chainer appears.

github上で論文をまとめてくれているサイトまとめ(メモ)

(06/13 19:25 追記:バイオ系を追加しました)
(06/23 : 画像系を追加しました)
(09/30 : RNNのまとめを追加しました)

最近、github上でarxivの面白い論文(主にdeep learning系)をまとめている人が多いので、
自分の知っている有用なリンクをまとめておきます。

自然言語処理、強化学習とカテゴリごとにまとめてくれる人が居て有り難いですね。

自然言語処理系

  • NLPの論文

github.com

  • NLPの論文(感想も載せているので有り難い)

github.com

画像系

github.com

バイオ系

  • @delta2323_さんにバイオ系を教えていただきました!ありがとうございます。

github.com

機械学習 全般

github.com

RNNに関するまとめ

github.com


このブログの記事も随時更新しています。
aonotas.hateblo.jp


他にも有用な情報源を知っている方は@aonotasまで教えてもらえると嬉しいです。

ChainerでLSTMでミニバッチ学習する時に注意するべきこと

自然言語処理でSequence to Sequenceモデルを学習する時や、単純にLSTMで入力文を固定次元ベクトルを計算したい時に、
入力が可変長であるため、ミニバッチ学習をする時に工夫が必要です。
他のフレームワーク(TensorFlowやTheano)でも同じような工夫は必要だと思われます。


例えば、

  • A B C D E F G
  • A B C D E F G H I J

上記のような2つの入力があるとします。
1つ目は長さ7のSequenceで
2つ目は長さ10のSequenceとします。

オンライン学習で学習する場合は特に可変の入力でも問題ありません。
ミニバッチ学習する時に問題になるのは、
入力をmatrixで表現する時に

  • 0 1 2 3 4 5 6 -1 -1 -1
  • 0 1 2 3 4 5 6 7 8 9

このように1つ目の長さ7のデータに対して-1で空白を埋める必要があります。
空白を埋める行為をpaddingと呼びます。

さて、このpaddingをするだけで良いかと言うと、もう一工夫する方が良いです。
例えばLSTMで入力文から固定次元ベクトルhを計算する時を考えましょう。

LSTMは

  • 0 1 2 3 4 5 6 -1 -1 -1
  • 0 1 2 3 4 5 6 7 8 9

のデータを先頭から読み取っていきます。
まず[0, 0]を読み取ってLSTMの隠れ状態hを更新、
次に[1, 1]を読み取ってLSTMの隠れ状態hを更新、
次に[2, 2]を読み取ってLSTMの隠れ状態hを更新、
・・・
次に[6, 6]を読み取ってLSTMの隠れ状態hを更新、
次に[-1, 7]を読み取ってLSTMの隠れ状態hを更新、
次に[-1, 8]を読み取ってLSTMの隠れ状態hを更新、
最後に[-1, 9]を読み取ってLSTMの隠れ状態hを更新。

この隠れ状態hが最終的なベクトルになります。

しかし1つ目のデータにおけるhはpadding文字「-1」を読み取った時の隠れ状態hになっています。
本当なら1つ目のデータの固定次元ベクトルhは赤文字で示した隠れ状態のものであるはずです。
(-1が入力としてある時に状態hをほぼ更新しない学習をLSTMがしてくれれば良いのですが、本来の学習に影響が出てしまう可能性があります。)


そこでやることは、padding文字「-1」があったら前の隠れ状態hをそのまま伝搬させる、という処理を書きましょう。
Chainerのwhereを使って実現できます。


こちらのブログ記事で紹介されています。(とても分かりやすいのでおすすめです。)

studylog.hateblo.jp


c, h = lstm(c_prev, lstm_in) # 本来のLSTM
enable = Variable(x != -1) #xの-1であるかどうかのフラグを計算する
c_next = where(enable, c , c_prev) #x!=-1ならcを、x=-1ならc_prevをc_nextに代入
h_next = where(enable, h , h_prev) #x!=-1ならhを、x=-1ならh_prevをh_nextに代入


また単語ベクトルをChainerではEmbedIDを使うと簡単に用意できます。
padding文字「-1」をignore_labelに指定しておきましょう。

embed=L.EmbedID(n_vocab, n_units,ignore_label=-1), #ここで設定

本来whereでpadding文字-1の部分はbackwardしないので問題ないと思うのですが、
GPUでEmbedIDに-1を投げると挙動に困ったことがあるので、上記のようにignore_labelをしておきましょう。

まぁpadding文字を0と決めてあげれば問題ないのですが、
自然言語処理で辞書を作る時って最初の単語は0のインデックス渡すことが多いと思うので、個人的にはpadding文字を-1としています。

ミニバッチをもっと簡単にやる方法

データの長さを元にミニバッチを作成する
ミニバッチサイズ=2として、
ミニバッチ内の長さを統一してあげます。

ミニバッチ内のデータの長さを7のデータだけにする。

  • A B C D E F G
  • G Y L W B D G

長さ10のデータは10のデータでミニバッチを作成。

  • A B C D E F G H I J
  • B B W D E E R G H J

これが1番楽かもしれません。
ただ、NNに学習させるデータに偏りが生じるので、心配な人は上記のようにpaddingすると良いと思います。
paddingする場合もデータ長でソートしてあげて、ミニバッチを作成してあげた方がpaddingのサイズが小さくなりメモリ効率は良くなるはず。


(今後のTodo)
※Seq2SeqをChainerで実装してサンプルコードをまとめたい



また深層学習(+NLP)を実装する上で気をつけることが、PFIの海野さんの資料でとても良くまとまっています。

www.slideshare.net

Deep LearningとNLPの最新論文の情報を集める方法

(5/29 追記:Deep Learning のGoogleグループコミュニティを追加)
(6/8 追記:松尾研究室の勉強会ページを追加)
(6/13 追記:neural language notesを追加)

はじめまして。@aonotas(あおのたす)です。
Deep Learningと自然言語処理に興味があります。
好きなフレームワークはChainerです。


さて、Deep Learningが自然言語処理のタスクでも応用されています。
ACLやEMNLPなど国際会議でもタイトルに「Neural」が入ったものが多いですが、arxivにも査読前の論文がよくアップロードされています。
(スピードが早くて追いつくの大変ですよねorz)
そこで最新のDeep Learningの論文の集め方を紹介したいと思います。(あくまで私個人の方法です。皆さんどうしてるか教えてもらえると嬉しいです。)

  1. 面白い論文を紹介しているページを見る
  2. arxivをアンテナサイトに追加しておく
  3. Twitterで論文情報を集める

以下具体的な内容です。

面白い論文を紹介しているページを見る

arxivのDeep関連の論文を月別にまとめてくれている人がいます。
このページを眺めておくと最新のトピックも扱えるかもしれません。
とてもおすすめ。
github.com


arxivをアンテナサイトに追加しておく

arxivで有名な研究者(Deep MindやBengio先生, Hinton先生)がアップロードしたら通知を受け取れるようにしています。
ACL, EMNLP, NAACL, ICML, ICRLの国際会議はチェックしていますが、
arxivにも面白い論文が定期的に上がるので、有名な研究者さんが共著者に入っている論文はチェックしておくと良いかもしれません。
方法としては、「はてなアンテナ」にarxivを追加するだけです。
ちなみにPFNの岡野原さんに最新の論文のチェックの方法は?と聞いたらarxivで有名な人の論文一覧をチェックしているということでした。

チェックするURLは以下がおすすめです。
(好きな研究者の個人ホームページも良いと思います。)

他にもアンテナには追加していますが、個人的に気に入った論文の共著者の人をアンテナサイトに追加しておいて、
新しい論文が上がったらメールで通知を受け取っています。
※Google ScholarでBengio先生やHinton先生の論文チェックもしています。

Twitterで集める

Twitterで最近話題の論文を紹介している人が多いので、個人的には、
Twitterのアプリの通知をオンにしてiPhoneにその人がツイートすると通知が飛ぶようにしています(ストーカーっぽい)

twitter.com

twitter.com

以下は通知はオンにはしてませんが、フォローしておくと幸せになれるかもしれない。
twitter.com

twitter.com



以上、個人的な方法でした。
こんな方法で集めてます!!という口コミもお待ちしています。

05/29 追記

Google+のDeep Learningコミュニティで集める

id:tam5917 さんにコメントしていただき、Google+のコミュニティを教えてもらいました。
コメントありがとうございました!

Bengio先生が投稿していたり有用な情報源かもしれません。おすすめです。

plus.google.com

06/08 追記

東京大学の松尾研究室の勉強会ページも参考になります。

deeplearning.jp

06/08 追記

Deep Learningの有名な論文を引用数が多いものを主にまとめてあります。

github.com

06/13 追記

Deep Learningの論文のうちNLPに関するものがまとまっています。

github.com

自然言語処理がやりたくて大学院を休学した話

はじめまして。@aonotas(あおのたす)です。
現在NAIST(奈良先端科学技術大学院大学)の松本研究室の修士1年の学生です。


自分がなぜNAISTに入学したのか、をブログに残しておこうと思う。
(4月に入学して2ヶ月が経とうとしていて生活にも慣れてきたので)

学部→大学院→大学院休学→NAIST受験→入学の流れを書こうと思う。
自分は学部は名古屋工業大学という大学に通っていた。
情報系の学部で学部時代は授業とかは普通に出ながら、ウェブ系のプログラムを書くのが好きでiOSアプリやウェブサービスを1人で作って学部を過ごしていた。

決してプログラミングが好きという訳ではなく、何か作ることが好きな性格なので、情弱PHPerみたいな学生である。

さて、学部の研究室配属の時に「どうせやるなら自然言語処理っぽいことやりたいな〜」と思ったが、残念ながら自然言語処理だけを専門にしている研究室は自分の大学には無かった。なので、修士の先輩を見て研究室を選んで研究自体は独学で自然言語処理を勉強した。

独学で自然言語処理を勉強したと言っても、興味のある論文を読んで、当時流行っていたParagraph Vectorを使った研究(といっても大きい新規性があるわけではない)を卒論でやった。

1年間周りには自然言語処理の話をできる同期は居ないので、研究の相談をしたい時は結構辛かった。
(先輩に相談すれば相談にのってくれるが、自然言語処理に詳しい訳ではないので指導してもらえる、とまではいかなかった)


そんな中、大学院は外部の大学院を受けるべきかとも思ったが、
学部4年の夏くらいに同じ大学の大学院の推薦が貰えることになり、
推薦を断って外部に行く勇気は出なかったので、ズルズルと進学してしまった。

卒論が終わり3月くらいにYANSに参加した。

yans.anlp.jp

YANSに参加して自然言語処理を好きな学生さんや、企業の人と話してみて、めちゃくちゃ楽しかった。
今まで自然言語処理の話をできる人が研究室に居なかったので、自分としては新鮮であったし、こんなNLPerな人たちの環境で修士取るなら取るべきだな、とも思った。

それからは、推薦で合格していた大学院に4月に入学はしたが、
すぐ休学させていただき、自然言語処理の研究室を受験した。

受験する時に考えた研究室の候補は、

を考えていた。
結局NAISTのみを受験した。
理由としては、鶴岡研究室はとても優秀な先生&Doctorの学生さんが多いが、東京大学の大学院の入試をパスできても
研究室配属の希望で倍率がとても高くなるらしく、諦めてしまった。
(受験の項目が電気系の問題を勉強する必要があるのも諦めてしまった理由としてある)

首都大の小町研究室も先生が有名であるし、学生の方も優秀で何よりもやる気に満ち溢れる人が多いイメージだったが、
NAISTと比べた時に生活の金銭的問題と、周りに何も無いNAISTは何となく修行感が出てカッコイイのでは、という中二病でNAISTにした。
(ちゃんと吟味するべき)
今となっては東北大の乾研にも見学に行けばよかったな、、、とも思います。(NAISTがダメという意味ではなく見学に行かずに決めてしまったので)

NAISTに入学して研究室の環境にとても満足している。
ざっと魅力的に感じた点をまとめてみようと思う。

  • NLPの研究室である
  • 博士課程の学生からアドバイスを貰える
  • Deep LearningとNLPの研究をしている先輩が意外と多かった
  • 教授1名、准教授1名、助教授2名と先生が沢山いる(学部時代は先生1人だったので)
  • 学生寮の生活費が安い(寮は月1万程度)

NAISTには中村研究室もあるので合同の勉強会があったりして、色々勉強させてもらっている。
やっぱり研究は1人でやるものといえども、周りの仲間や先輩や先生は大事だと思っているので、
結果的にNAISTに入学して良かった。

もしも自然言語処理の研究をやりたい方、悩んでる方はYANSに参加したり、
自然言語処理界隈の人に相談してみると幸せになれるかもしれない。


今後ブログでも論文紹介とかしていけたらいいな…