読者です 読者をやめる 読者になる 読者になる

あおのたすのブログ

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

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に参加したり、
自然言語処理界隈の人に相談してみると幸せになれるかもしれない。


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

mecab-ipadic-neologdを使ってみた

MeCab用の辞書、mecab-ipadic-neologdが凄いという話を聞いたので、使ってみる。

github.com

基本的にREADMEを読めば分かる。すんなりインストールできた。

# インストール
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd


# 更新
git pull
./bin/install-mecab-ipadic-neologd -y


# 辞書の場所をチェックする
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"


# 実行
mecab -d `mecab-config --dicdir`"/mecab-ipadic-neologd"

10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。
10日	名詞,固有名詞,一般,*,*,*,10日,トオカ,トオカ
放送	名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
「	記号,括弧開,*,*,*,*,「,「,「
中居正広のミになる図書館	名詞,一般,*,*,*,*,中居正広のミになる図書館,*,*,wikipedia_keyword,
」	記号,括弧閉,*,*,*,*,」,」,」
(	記号,括弧開,*,*,*,*,(,(,(
テレビ朝日系	名詞,固有名詞,*,*,*,*,テレビ朝日系,*,*,wikipedia,
)	記号,括弧閉,*,*,*,*,),),)
で	助詞,格助詞,一般,*,*,*,で,デ,デ
、	記号,読点,*,*,*,*,、,、,、
SMAP	名詞,固有名詞,一般,*,*,*,SMAP,スマップ,スマップ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
中居正広	名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
篠原信一	名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
過去	名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い	名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす	動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕	名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ	動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS