PFIインターン2015 参加報告

8/3-9/30の期間、Preferred Infrastructure (PFI)のインターン(PFNと合同)に参加しました。 参加報告のために、凍結していたこのブログを解凍します。

応募から選考まで

PFIという会社については、学部の頃から存在は知っていました。 周りでインターンに応募する人もいたりして、夏にインターンをやっていることも、おぼろげながら感じ取っていました。 ただ、当時の僕は、専門的能力もなかったので、自分には関係ない世界かな、とも思っていました。

その後、留学したり大学院を変えたり紆余曲折あって、自然言語処理NLP)の研究をすることにしました。 PFIの話もよく耳にするようになり、何だか先進的で面白いことをやっている会社だなと思っていました。 そのような面白い会社で、実際にどんなことをしているのか、是非見てみたいと思いました。 それから、僕は、頑張らなくても大丈夫な環境にいると、だらけてしまう性質があります。 自ら環境を積極的に変えていかなければならないことは、それまでの経験から身にしみて感じていたので、 この機会にインターンに挑戦し、自分を奮い立たせようと思いました。

応募後は、書類選考の後に、Skype面接がありました。 面接では、自己紹介をしたり、事前に提出した課題に関して質問を受けたりしました。 自分の考えが浅かったり、喋りが苦手なところもあって、これはダメだと思ったのですが、 なんとか拾っていただいたようです。

テーマ決め

インターンが始まる前に、テーマの大枠を決めるためにSkypeでミーティングがありました。

唐突ですが、僕がNLPの研究をしようと思ったのは、アニメキャラを具現化したいからです。 アニメキャラの具現化のためには、視覚や音声など様々な要素がありますが、 中でも、対話できることが最も重要な要素だと思っています。 そのような目標があることはメンターの方々にも、折にふれて伝えていました。

そして、ここにきて、Recurrent Neural Network (RNN)を使って文生成ができるという話が盛り上がっています。 RNNを使って、画像のキャプションを生成したり、対話文が生成できるというのが、最近のホットな話題です。 RNNが生成する文が、これまでの生成手法による文に比べて優れているかと言われれば、様々な意見があると思います。 ですが、RNNは非常に簡単に実装できるのでアイディアをすぐに試せること、 ベクトルの演算により組み込みたい情報を簡単に組み込めるということは、確かな利点ではないかと思います。 そこで、キャラとの対話を念頭において、RNNによる文生成に関して何かするという方向性になりました。

インターン開始後

文生成がテーマだということで、最初の2週間ほどは、適当に文を生成して遊んでいました。 遠い昔のことなのでよく覚えていませんが、キャラに何かを喋らせたり、キャラを合成したり(?)していた気がします。

文を生成して遊べるようなツールはすぐに作れました。これは、ひとえにChainerの力であると言えます。 僕はそれまでTheanoを主に使っていましたが、RNNのコードを書くことに関して言えば、Chainerが圧倒的に開発効率が高かったです。 Chainerがなければ、僕のインターンは、また違ったものになっていたでしょう。

文生成だと漠然としているので、最終発表に向けて、一つはっきりしたテーマを決めることになりました。 キャラとの対話では、口調などのキャラ付けが、重要な要素のひとつです。 特にアニメキャラなどでは、他との差別化のために、言葉遣いがかなり特徴的だったりします。 そこで、そのような言葉遣いによるキャラ付けを自動的に学習することがテーマになりました。 手法としては、Variational Autoencoder (VAE)を使うことにしました。 VAEは色々なことに使える手法ですが、例えば、手書き数字画像のアナロジー生成ができることが知られています。 今回のテーマも、同じアイディアに基づくものでした。 僕が知る限り、VAEをNLPに適用した例を見たことがありません。 なので、どのような結果になるか、自分自身とても興味深いテーマでした。

試行錯誤の連続

他のインターン生の方に教えていただいたりしたおかげで、実装はわりと早く終わりました。 しかし、深層学習の辛いところは、コードを書いて終わりではなく、上手く行くパラメータを見つけなければならないことです。 パラメータによってすごく良い結果が出たり、逆に全然だめだったりします。 どうすれば良いパラメータを見つけられるのか誰も知らないけれど、かといってノウハウが全く無いわけではなく、魔術的だとよく言われます。 1つのパラメータを試すのにかかる時間が長く、パラメータを全通り試して明確な結論を導くことができないので、研究テーマ的には苦しいところです。

今回、色々なパラメータを試したのですが、最終発表の10日前になっても、全然見せられるような結果が出ていませんでした。 今度こそと思ってもやっぱり上手くいかず、精神的にはかなりつらい日々が続きました。 ドキュメンタリー番組でよくある、ハッピーエンドに向けた逆境の時期なのだと、自分に言い聞かせていました。 このままだと、最終発表で土下座することになると思っていたのですが(もちろんメンターの方々は優しくしてくれました)、ある日偶然、上手く行く方法を発見しました。 確かに、言われてみれば上手く行きそうな方法なのですが、見つけられたのは、ただラッキーだったと思います。 とにかく、発表までに、最低限何か動くものができたかなという感じになりました。 ただ、上手く行っているのは非常に限定的な状況なので、まだまだ解決すべき問題が山積しています。

最終発表は、スライドが抜けてしまったり、説明がグダグダになってしまったところもありましたが、 なんとか期日までに成果をまとめることができて良かったです。 後日、コードなどを公開できればと思います。

インターンで得たもの

インターンを通じて、企業で働くということがどういうことか、少し想像ができるようになったと思います。 エンジニアの仕事を間近でみるのは、今回が初めての機会でした。 エンジニアといえば、製品のコードを書いたり、アイディアを実験したりする仕事だというイメージがあります。 ですが、顧客とのコミュニケーション能力やビジネス的な感覚なども必要で、純粋に技術的なことは一部にすぎないのだと感じました。 技術的なこと以外にも、もっと幅広く様々なことを知らねばという思いが強くなりました。

また、学生生活を進める上での考え方が大きく変わりました。 生活が研究室で閉じていると、論文を書いて採択されることが無条件で尊いことだという考え方になってきます。 ですが、インターンで色々なものを見て、研究をして論文という形で成果を出していくのは、数ある生き方の一つに過ぎないのだと思いました(当たり前ですが)。 あえて研究をするという選択をする以上、論文を書くこと自体が生活の目的になっていないか、 本当に自分がやりたい研究テーマに取り組んでいるか、強く意識するようになったと思います。

最後に、アニメキャラと対話できるようにするのが僕の夢であると述べましたが、 漠然と思っていただけで、正直なところ、自分の手では実現できないだろうと思っていました。 ですが、今回のインターンでは、関係するテーマに、2ヶ月間真剣に取り組ませもらえました。 この機会に、夢の実現に向けて、もう少し真剣に考えてもよいのではないかと思うようになりました。 これが個人的には一番の収穫でした。

おわりに

今回のインターンは、技術的に成長できたことはもちろん、自分の考え方が大きく変わる機会だったと思います。 それから、本郷の周辺で毎日美味しいものを食べられたのが最高に幸せでした。 今いるNAISTでは、お店選びに迷うような贅沢ができず、本当に困っています。 Red Bullも毎日飲ませていただきました。冷蔵庫に補給してくださった方々、どうもありがとうございました。 PFI/PFN関係者の方々、他のインターン生の皆さん、2ヶ月間大変お世話になりました。 とても有意義な体験をさせていただき、ありがとうございました。