あおのたすのブログ

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

YANS2019に参加してきました / 運営してきました

今年もNLP若手の会 (YANS)に参加してきました。
自分は、入社のきっかけがYANSだったこともあり、わりとYANSに思い入れがあります。
PFNに入社して1年が経ちました - あおのたすのブログ

今年でYANS委員は2年目でした。
2年交代(?)という慣習があるため恐らく今年で最後の運営だったのだと思います。
3年前のYANSではハッカソンが無かったりして、参加者として少し悲しい気持ちだったがあったり、入社のきっかけがハッカソンだったりしたので、
YANSのハッカソンの企画に対して強い思い入れがあり今年もハッカソンを運営しました。

ハッカソンの内容としては、
①Kaggleハッカソン(過去のKaggleのNLPのタスクで精度勝負するハッカソン
アノテーションハッカソンアノテーションを各チームで行い、学習データを作り、モデルの精度で勝負するハッカソン
③自由テーマ(テーマは自由に何かを作るハッカソン
の3つを用意しました。

ハッカソンには30人近くの人が参加していただきました。
Kaggleハッカソンでは、Quoraのコンペのデータを使いました。
詳しいデータ / ルールなどは以下を御覧ください。
github.com
Kaggleハッカソンが参加者が1番多く個人的に意外でした。またNLPerでもKaggleメダル持ちが多く(全体で1チーム1人人)これも驚きでした。

今年はGoogle colabを計算機環境として使って頂きました。
(去年はAWSを用意したのですが、GPUはお金掛かるので・・・)
そのためKaggleハッカソン参加者には、ポスター発表を聞きながらPCを開いて人が居て申し訳なかったです。
(colabは90分セッション切れると途中計算が止まってしまうルールがあるので・・・)
今年のYANSスケジュール的に作業できる時間が少ない中、参加者の皆さんは色々な手法を試していただいて、運営側も勉強になりました。

また②アノテーションハッカソンは、YANS委員の他に

  • 三浦さん (RLS)
  • 内橋さん (LPIXEL, オムニス, mixi)
  • 山本さん (早大)
  • 久保さん(TIS)

に運営を手伝って頂き感謝です。

実はYANS開催の1ヶ月前に持ち込み企画で「アノテーションハッカソン開催出来ないですかね?」と依頼を頂いて、1ヶ月で準備していただきました。

YANSに参加して感動したことについて色々あるので、以下に列挙します。

  • 若い人が多い: 参加者に学部生が多く「若いな〜〜〜!」と思うほど自分もおじさんになっていました(26歳:体年齢 34歳)
  • 起業している人が多い:自分の会社をやっている or 経営関わっている人が多い
  • 牛久さんがすごい:オムロンの牛久先生が凄いんですよね・・・去年YANSで招待講演していただいて今年も参加していただいて嬉しいですし、話していて「なるほど、鋭いですね」「なるほど〜全くそのとおりで〜〜」と会話の中で相手を持ち上げつつ、明快な回答をしてくださったりして神様の会話術だなと思いました。社内だと秋葉さんも同じ印象を受けて神様になる人は会話も上手いんだなと思いました。
  • ハッカソンみんな真面目に取り組んでくれる:本当に今年はスキマ時間が無く、辛いハッカソンだったのですが、皆さん作業が早く色々試行していただいて、勉強になりました。

また、東大・赤崎くんがメインで夜セッションとして「NLP若手の悩めるキャリア」というパネルディスカッションをしました。
自分はニコニコ風プレゼンの準備したりとかを少し手伝いました。
進路悩む若手にとって有意義なイベントになったのではないでしょうか。


反省点:

  • 自分が発表していない:運営やり始めた去年から自分は発表していないです。ちゃんと発表しないと駄目ですね・・・
  • 研究ハッカソン出来なかった:研究者が研究のネタを思いつく / 試行できるような機会になるハッカソンが出来たら良いな〜〜と思っていたのですが、今年はその企画まではいけなかったです。ざんねん。この遺志を木の葉隠れの里の皆さんが引き継いでくれますよに・・・


ということでYANS委員は毎年募集しています。
少しでも興味ある / やる気のある人はこっそり自分まで教えて下さい。

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