2018年 PFN夏季インターンシップのコーディング課題公開

楠本充
エンジニア

2018-07-18 11:32:38

PFN 2018夏季インターンシップの選考で用いたコーディング課題を github 上で公開しました。

https://github.com/pfnet/intern-coding-tasks

PFN の楠本です。PFN では毎年8,9月前後に2ヶ月間の長期インターンシップを行っています。コーディング課題はその選考で応募者のプログラミング能力や問題解決能力を見るために出題させて頂いているものです。PFN のインターンシップでは機械学習をはじめとする幅広い分野で応募を行っているため、今年は「機械学習・数理」「バックエンド」「フロントエンド」「プロセッサ/コンパイラ」「Chainer」の5種類のコーディング課題を用意し、応募者の希望するテーマに応じてこのうちのいずれかを解いていただく形にしていました。

今年は去年を大きく上回る数の応募を国内外双方からいただくことができました。それに伴い、インターン生の受け入れ人数も去年よりもさらに拡充する形になりました。

今年の問題は以下のような構成になっています。

  • 機械学習・数理課題: ニューラルネットワークの敵対的入力(Adversarial Example)のアルゴリズムを実装し、性能を報告するためのレポートを記す課題。
  • バックエンド課題: 与えられたログファイルを分析するツールを作る課題。
  • フロントエンド課題: セミナー発表のような動画に対して、発表内容のアノテーションを行うウェブサービスのプロトタイプを作る課題。
  • プロセッサ/コンパイラ課題: 行列積コードの最適化と、行列積回路の設計を行う課題。
  • Chainer 課題: モデルの学習を行うコードを Chainer で実装する課題。

コーディング課題では毎年、出題者が趣向を凝らした問題を作成しています。これらの課題が、興味のある分野を実践的に学ぶための練習問題になれば幸いです。

私は今年の機械学習・数理課題の出題に携わりました。少し余談になりますが、課題を作る際に意識していたことについて書きたいと思います。他の課題ではまた話が違ってくるかもしれませんが、共通しているところもありそうです。

  • 前提知識があまり無くても解けるようにする: PFN では幅広い分野の方々を募集しています。そのため、機械学習そのものの経験や知識が無くても課題を一通り解けるように問題を設定したり、問題文を記述するようにしています。また、特定の知識を持っている人が有利になりすぎるということがあまりないようにも配慮しているつもりです。
  • 実際の研究に近いような設定にする: 深層学習のような分野の研究では「何か良いテーマを見つけて手法を考える → 実装する → 出てきた結果をまとめ、考察を与える」という過程を繰り返しますが、このうち「実装して考察する」という流れを短期間で一通り辿れるような設定にしています。大学の授業の課題のような感じに近いかもしれません。
  • できるだけ興味深いテーマを問う: 機械学習・深層学習の分野では日々研究が進んで面白い結果が次々に出ているので、それに少しでも触れられるような課題を設定しているつもりです。今回の課題である Fast Gradient Signed Method という手法は、シンプルな手法でありながらランダムよりも遥かに強い攻撃手法であるという点で興味深いものだったと思います。
  • 時間が掛かりすぎないようにする: 学業に支障が出ると良くないので、実力が十分あれば1~2日程度で終わるような分量にすることを目標にしています。

提出されたコードは様々な観点から評価するようにしています。単に実装されたコードが正しいのかどうかだけではなく、コードが読みやすいものになっているか、単体テストなどの検証のためのコードが適切に書かれているか、他人がコードの追試をしやすいようになっているか、といった要素も考慮するようにしています。
実験ではコードを書いて動かしたら終わりではなく、手法がどの程度うまくいったのかを評価し、なぜそのような結果になったのかを考察するのが重要になります。特に、複数人で一つの課題に取り組む際にはそれら(評価・考察)を他のチームメンバーに共有することも大事になるでしょう。レポートでは結果の評価と考察ができているかを評価するようにしています。

これらの課題を見て PFN に興味を持っていただけた方は、ぜひ来年のインターンシップへ応募することを検討していただければ幸いです。また、PFN ではフルタイムの採用も通年で行っておりますので、こちらもご検討をよろしくお願いします。

Preferred Networks における研究活動

秋葉 拓哉
リサーチャー

2018-06-08 14:36:39

こんにちは、新しく執行役員兼 Chief Research Strategist に就任した秋葉です。就任の挨拶を兼ねて、PFN における研究活動に関する考えを共有したいと思います。

PFN における研究とは何か?

何が研究であり何が研究でないかという境界を引くのは非常に難しく、またそれを積極的に行う意味もありません。研究とは「研ぎ澄まし究めること」を語義とし、一般に、物事について深く調査・考察を行い事実を解明したり発明を行ったりすることを指します。

PFN では挑戦的であり不確実性の高いプロジェクトが大部分を占めており、ほぼ全てのプロジェクトが少なからず研究的側面を伴います。深層学習関連のコア技術の研究開発は勿論、その応用に関してもデータやタスクに応じた適切な手法の選択や非自明な工夫がなければ上手くいかないことが殆どです。また、ロボティクス、コンピュータビジョン、自然言語処理等のような多分野の技術を組み合わせることにより新たに出てくる課題もあります。それに加えて、クラスタの設計やそのリソース管理、及びディープラーニングフレームワークに関しても、深層学習特有の要求を満たし、便利かつ高性能にするために、多くのことを考え試行錯誤をしています。

そのような中でも、特に研究的側面を強く持つプロジェクトには、以下のようなものがあります。

  • 論文となるような学術的研究
  • デモンストレーションの制作と展示
  • コンペティションへの参加
  • 社会での未解決問題の解決

このような分野でも、既に素晴らしい成果が出ています。論文に関しては、ICML, CVPR, ACL, CHI など、幅広い分野のトップ会議に論文が継続的に採択されるようになりました。また、数が増えているだけでなく、ICRA’18 にて論文が Best Paper Award on Human-Robot Interaction を受賞したり、ICLR’18 にて論文が Oral に選ばれたりと、世界的に極めて高い注目を集める論文を出すことに成功しています。デモンストレーションとしては、CEATEC 2016 や ICRA 2017 等で制作したものを展示しました。コンペティションとしても、Amazon Picking Challenge 2016 や IPAB 創薬コンテスト等で優れた成果を残しています。

PFN はなぜ研究をするのか?

PFN のような企業で、今すぐ直接お金に結びつかないような研究をする意味はあるのでしょうか?例えば、論文を書こうと思えば貴重な業務の時間をごっそりと使ってしまうことになるし、それを出版すれば社外の人たちに技術を教えてしまうことになります。こう考えると、学術的研究や論文執筆は、会社にとってマイナスの活動のようにすら見えます。

実際には、PFN においてそのような研究活動は極めて重要視されており、今後もなお重点的に強化を行っていく予定です。コンピュータや AI 分野のビジネスでは、しばしば「Winner takes all」といったことが言われます。このような領域では、ビジネスに国境がなく、中途半端では生き残ることはできません。世界でトップクラスの技術を持ちリードを保ち続ける必要があります。従って、我々は、研究活動を通じ技術力を中心とした競争力を持ち続けることがビジネス上で極めて重要だと考えています。また、現実的には、優れた特許ポートフォリオを構築するといったことも重要です。

また、「よそから出てくる論文の実用化に注力する方が効率的ではないのか?」という疑問もよく聞きます。しかし、論文が出てきて我々の目に止まるタイミングでは、世界のトップは必ずもっと進んでしまっています。そして、論文を読んで得られる情報はかなり限られており、試行錯誤したり著者に問い合わせながら再現に成功したり、他のデータセットへの適用を通じて論文に書かれていない手法のネガティブな性質について把握したりするのには、さらにかなりの時間がかかります。パーソナルコンピュータの父として知られるアラン・ケイの「未来を予測する最善の方法は、それを発明することだ」という言葉は、実際にいくつかの分野で世界をリードしたりトップに迫ったりといった成果を出すことができている我々にとって、大きな実感があります。

更に、単に社内で研究を行うことだけでなく、成果をコミュニティに発表し還元することも重要視しています。一つには国内外でのプレゼンスを得るという目的もあります。それに加えて、我々の発表した技術に基づいた研究や我々の発表に触発された研究が社外でも行われることにより、トータルで考えて我々に必要な技術の発展が加速されると考えています。そのため、OSS としてソフトウェアを公開したり、研究に使ったコードやデータなども積極的に公開しています。また、アカデミックなコミュニティへ貢献するため、学会や論文誌の査読も業務で行えるようにしています。

どのような研究を推進していくのか?

深層学習を中心として、コンピュータビジョン、自然言語処理、音声認識、ロボティクス、コンパイラ、分散処理、専用ハードウェア、バイオインフォマティクス、ケモインフォマティクスといった、幅広い分野での研究を行っており、これを以下のような理念に基づき強化していきます。

正しくクレイジーに

全ての研究は現在だけでなく未来を見据えて行われるべきです。研究の価値も、今の常識だけで判断するべきではありません。「そんな計算が重い方法は実用的じゃないよ」といったことや「今はそんな処理したい人いないよ」といったことは、必ずしもネガティブではありません。例えば、我々は昨年、1024 台の GPU を用いた分散処理により画像認識モデルを高速に学習するというプロジェクトを成功させ、世界的に大きな注目を集めました。達成した速度が常識外れだっただけでなく、1024 台の GPU を一度に使うと言った実験の規模自体も常識外れでした。1024 台の GPU を使って日常的な学習を行うといったことは現実的ではないかもしれません。それでは、このような研究の価値は無いのでしょうか?

計算機は未だに速くなり続けています。特に、深層学習に関しては、専用チップの開発も盛んです。OpenAI の調査によれば、深層学習の大規模なトレーニングで使われる計算力は、3.5 ヶ月で倍という急速なペースで上がっています。今は馬鹿げた計算力に見えるそのような設定も、数年のうちに当たり前のように使える状況が来る可能性は高いでしょう。未来を見据え、そのような状況では何が起こるのかといったことを知り、そこでの課題を解決したり新たにできることを模索したりといったことに早く乗り出すことは、非常に重要だと考えています。1024 台の GPU を用いた上述の実験はその第一歩であり、プライベートスーパーコンピュータと並列分散計算チームを持つ強みを活かしながら、大規模な実験を促進し、このような規模での実験を当たり前のように感じられるぐらいの環境を作りたいと考えています。

世界とグラウンディングする

全ての研究は何らかの意味で世界の最先端を目指すべきです。技術力は、世界的にリードを持つことにより大きな価値に繋がります。社内だけでなく、積極的に外を向き、論文が世界的に高く評価されたり、世界的なコンペティションで高い順位を取ったり、注目を集め講演に呼ばれたり、といったことを目指すべきだと考えています。実際には、全ての研究プロジェクトで世界をリードするようなことは難しいかもしれません。しかし、世界トップをしっかり意識し目指すことで、自分たちの相対的な位置を知ることができます。

また、世界的なコミュニティに食い込むことも非常に重要です。社外の世界トップを走る人たちと知り合いになり、無視できない存在だと認識してもらうことで、有益な情報の交換ができます。そのためにも、外部発表を推奨しており、貢献をしたメンバーの顔がしっかり外に出るようにしています。

積極的に展開する

全ての研究は小さく閉じこもることなく積極的な展開を目指すべきです。例えば、研究を論文にすることは非常に重要なマイルストーンですが、それは完成ではありませんし、それだけを目標にするべきではありません。深層学習では共通の技術が異なる応用分野を跨がり力を発揮することがあります。PFN には幅広い分野に取り組む人がいるという利点を活かし、研究のスコープを狭く捉えず、人を巻き込み、幅広い展開を目指してほしいです。また、新たなソフトウェアを開発したり社内のソフトウェアにフィードバックしたりして人が利用できる形にすることも可能であれば検討するべきです。社内での実務に成果を還元できれば素晴らしいでしょう。トップ会議への論文採択数は重要視していますが、一方で、論文の本数や論文が採択された会議のランクのみから研究開発活動を評価することはしないつもりです。

もちろん、全てを自分でやる必要はありません。世界のトップレベルに食い込んでいくためには、自分の能力的な強みとモチベーションを存分に発揮することが必要です。従って、自分が持っていない能力は積極的に人に頼ることも検討するべきです。これは技術領域のみでなく、研究のまとめ方に関してもです。せっかく面白い研究開発をやっていても、論文執筆の経験を持たないためどうやって論文にしていいか分からなかったり、誤解が原因で学会投稿で過小評価され採択に繋がらないこともあります。論文の執筆方法や徹底したサーベイ、正しい比較実験の仕方などについて、基礎研究で活躍してきた研究のベテランが社内に多く存在することを活かしていけるようにしたいと考えています。

PFN で研究開発をする魅力は?

リサーチャー・エンジニアとして PFN における研究開発に携わる良さとは何でしょう?

最も魅力的な点の 1 つは、PFN の対象とする深層学習を中心とした技術領域の特徴として、個人及び組織的な卓越した技術力が、本当に必要とされており、非常に重要であるということです。個人としても組織としても技術力の差が成果に反映されやすいという意味で、高い技術力を持つことが高い価値に直接的につながります。個人として高い技術力を持つこと、そしてチームとしてさらなる力を発揮することが非常に高く評価されます。これは、技術力に自信を持つ人や、技術力の向上にモチベーションを持つ人に、とても良いことであると感じます。

取り組み方が非常にフレキシブルな点も魅力だと考えています。100% の時間をピュアな基礎研究に費やすメンバーも今では複数人いてチームも構成しており、増強していく予定です。一方で、実務的な課題にも触れながら研究活動を行っているメンバーも多数います。また、アカデミアとの共同研究も積極的に行われていますし、社会人博士としてパートタイムで大学院に通い専門性を磨くメンバーもいます。

研究開発活動を促進するための社内制度にも気を使っています。会社がメンバーを信頼して大きな裁量を与え、足りない社内制度や資産があればフレキシブルに対応するなど、新しいチャレンジを積極的に支援しています。例えば、20% ルールにより、全てのメンバーは 20% までの時間を自分の裁量で使うことができます。これにより、誰でも思いついたアイディアをすぐに試すことができます。強いモチベーションやユニークなアイディアを持つ取り組みがボトムアップに出てくることを期待しています。

PFN が取り組む深層学習を中心とした技術領域では、アルゴリズムからソフトウェアフレームワーク、研究支援ミドルウェア、そしてハードウェアまで、その全てが重要になってきます。深層学習、強化学習、コンピュータビジョン、自然言語処理、バイオインフォマティクス、高性能計算、分散システム、ネットワーク、ロボティクス、シミュレーション、データ解析、最適化、異常検知といったような幅広い専門を持つ人が社内の近い位置にいて、気軽に情報交換ができる点もとても魅力的だと思います。分からない事柄について教えてもらったり、実務上出てくる問題を交換したり、一緒に研究に取り組んだりすることができます。

終わりに

最後に、少し個人的な抱負を書かせてください。今回、執行役員兼 Chief Research Strategist という身に余る大役を頂戴しました。能力面でもそれ以外でも心から尊敬できるメンバー達が素晴らしいチームとなり活躍しているこの会社で、私なんかにこのような大役が務まるのかという不安もあり、引き受けていいものか迷いました。

私は前職ではアカデミアでの研究者でしたが、企業での研究にも学生時代から興味を持ち、海外の企業研究所でのインターンにも複数回参加していました。その中で一度、インターン期間中にレイオフが起こり、自分のメンターも含めてその研究所に所属していた全研究者が解雇になるという様子を目の当たりにしたことがあります。企業での研究を意義あるものに保つ難しさを実感しました。

そのような経験を踏まえて考えても、私は PFN は企業として研究活動をするべきだと思います。それを健全な状態に保ち価値に繋げるのは決して簡単なことではないと思いますが、そのような部分にもし私の色々な場所での経験や考えを活かして貢献できるのであれば、それは非常に刺激的かつ意義のあることだと感じ、新たなポジションで頑張ってみることにしました。

また、研究とエンジニアリング、深層学習と分散計算など、複数面の得意分野を融合させることのできる自分の強みや、勝ちにこだわり戦略を練り遂行できる自分の強みを、今後はより広範囲で活かしていければと考えています。

PFN では、このような研究開発活動に興味を持ち一緒に取り組んでくれるメンバーをリサーチャー・エンジニアとして募集しています

ChainerMNのクラウド環境向け新機能とAWSにおける性能評価

Shuji Suzuki

2018-05-25 17:00:23

※この記事はChainer Blogの抄訳です

Chainer にマルチノードでの分散学習機能を追加するパッケージであるChainerMN に、ネットワークスループットが低いシステム向けの以下の2つの機能をv1.2.0とv1.3.0で追加しました。

  • Double bufferingによる通信時間の隠ぺい機能
  • 半精度浮動小数点数(FP16)によるAll-Reduce機能

ChainerMNは高速なネットワークを持つスーパーコンピュータやMicrosoft Azureのようなシステムを想定して開発してきたため、高速なネットワークのない環境では高い並列性能を達成するのが難しいという問題がありました。しかし、これらの機能を使うことで、GTC2018で発表したようにAmazon Web Services (AWS)のような一般的なシステムでもChainerMNによって高い並列性能を達成することができるようになりました。

 

背景

データ並列による分散深層学習においては、学習時間のうちノード毎に計算したgradientの和を計算するAll-Reduceにかかる時間が支配的になります。以前、我々が実施した1024 GPUを利用した大規模な学習では、スーパーコンピュータでも利用される高速なインターコネクトであるInfiniBandと高速なAll-Reduceを実現可能なNVIDIA Collective Communications Library (NCCL)を利用することで解決しました [1]。一方、AWSのような一般的なシステムはInfiniBandのような高速なインターコネクトがないため、通信に時間がかかってしまいます。この結果、ノード数を増やしても学習が速くならない場合がありました。これらを解決するためにChainerMN v1.2.0, v1.3.0でdouble bufferingによる通信時間の隠ぺい機能とFP16によるAll-Reduce機能の2つを追加しました。

 

Double bufferingによる通信時間の隠ぺい機能

この機能は、計算(foward, backward, optimize)と通信(All-Reduce)をオーバーラップすることで通信にかかる時間を隠ぺいし、全体の計算時間を短縮する機能です。通常のChainerMNの場合、1イテレーションは下図のように forward, backward, All-Reduce, optimize の 4 つのステップからなります。

一方、double bufferingによる通信時間の隠ぺい機能を使うと以下のように計算の部分と 通信の部分をオーバーラップすることができます。

この際、optimizeには一つ前のイテレーションのgradientを利用して行います。これにより、精度に影響がでる可能性が考えられます。しかし、後ほど示す実験の通り、ImageNetの学習の場合、実際はほとんど精度を低下させずに学習を行うことができます。

この機能は以下のようにマルチノード用のoptimizerを作成していた部分で、double_buffering=Trueとするだけで使用できます。

optimizer = chainermn.create_multi_node_optimizer(optimizer, comm, double_buffering=True)

現在、この機能はpure_ncclのcommunicatorにのみ対応しています。

FP16によるAll-Reduce機能

v1.2.0のChainerMNはFP32のAll-Reduceにのみ対応していましたが、v1.3.0ではFP16にも対応しました。これにより、FP16のモデルでもChainerMNを利用して分散学習を実行することができるようになりました。All-ReduceにFP16を用いた場合、FP32のときと比較して、通信量が半分になるため、All-Reduceの大幅な時間短縮を期待できます。

また、計算においてFP32を使っていても、All-ReduceだけはFP16を利用し、All-Reduceにかかる時間を短縮するということも同時にできるようになりました。これは我々が1024 GPUを利用したImageNetの学習で利用したテクニックです[1]。

FP16のモデルの場合は特に変更を加えなくても、FP16のAll-Reduceが利用されます。また、計算とAll-Reduceで違うデータタイプを使用したい場合は、以下のようにcommunicatorを作成する際に、allreduce_grad_dtype='float16'とすることで利用することができます。

comm = chainermn.create_communicator('pure_nccl', allreduce_grad_dtype='float16')

この機能も現在はpure_ncclのcommunicatorにのみ対応しています。

実験結果

2つの新機能により、高い並列性能を得られることを示すために、ImageNet の画像分類データセットを使って性能を測定しました。CNN のモデルとしては ResNet-50 を使いました。実験には、低速なネットワークとしてPFNのスーパーコンピュータであるMN-1の10 Gb Ethernetと、AWSを利用しています。詳しい実験の設定については記事末尾の付録をご覧ください。

10Gb Ethernetによる評価

下記の図では、MN-1を利用し、InfiniBand FDRと10 Gb Ethernetを使った場合、さらに10 Gb Ethernet上で2つの新機能を使った場合の3通りで、GPU 数を増やしたときのスループットを示しています。

この図に示す通り、10 Gb Ethernetを使った場合、GPU数が増えても性能が上がっていないことがわかります。一方、新機能を使った場合は、線形に性能向上が得られており、理想的な高速化が達成できています。また、下記の表に32GPUを使って90 epochまでの学習を5回実行した際の平均validation accuracyと平均学習時間を示します。

Validation Accuracy (%) 学習時間 (hour)
InfiniBand FDR 76.4 6.96
10 Gb Ethernet 76.4 21.3
10 Gb Ethernet + Double Buffering
+ FP16 Allreduce
75.8 7.71

精度に関しては、2つの新機能を使ってもほとんど影響が出ていないことがわかります。また、学習時間については10 Gb Ethernetと2つの新機能を使った場合には、InfiniBand FDRを使った場合に比べて11%しか計算時間が増加しませんでした。このことから、2つの新機能を使うことで、InfiniBand のような高速なネットワークを利用しなくても、精度を維持したまま高い並列性能を得られることがわかりました。

AWSによる評価

AWSの検証ではp3.16xlargeを利用しました。このインスタンスは最新のGPUであるV100を8個搭載しています。このインスタンスを利用してGPU 数を増やしたときのスループットを以下の図に示します。

どれだけ並列性能がでているかの指標として並列化効率が良く用いられます。今回の実験の場合、基準となるスループットを\(t_0\)、基準から\(n\)倍のGPUを使用したときのスループットを\(t\)とすると、並列化効率\(e\)は以下のように計算できます。
$$e = t/(t_0*n)$$
この並列化効率が1(100%)に近いほど高い並列性能を達成していることを示しています。

この実験においては、8GPUを基準とした32GPUを利用した場合の並列化効率は96%となり、新機能を使うことにより高い並列化性能を達成できることがわかります。

今後の展望

今後、ChainerMNは多くの学習モデルにおいてデータ並列では実現できない多様なモデルの並列化に対応するために、モデル並列をはじめとした機能や、耐障害性を向上するための機能を追加していく予定です。また、我々のチームではChainerMNの開発だけでなく, ChainerとCuPyを含めた高速化、P100を1024機搭載したMN-1やV100を512機搭載した次のクラスタを全台使うような大規模実験に関する研究開発を行っています。このような分野に興味のある方のご応募お待ちしております。

付録

性能測定の詳細について

実験設定

データセット:ImageNet-1k
モデル:ResNet-50 (入力画像サイズ 224×224)

スループット測定時の設定

バッチサイズ:64
学習率:固定
Data augmentation:Goyal et al. [2]と同じ手法を利用
最適化:Momentum SGD (momentum=0.9)
Weight decay: 0.0001
測定回数:400イテレーション

90エポックまで学習させたときの設定

バッチサイズ:30エポックまで各 GPU が 64、その後、128
学習率:5エポックまでGradual warmup、30 エポックのとき0.2 倍、60エポック、80エポックで0.1倍
Data augmentation:Goyal et al. [2]と同じ手法を利用
最適化:Momentum SGD (momentum=0.9)
Weight decay: 0.0001
エポック数:90 エポック
この設定は基本的にGoyal et al. [2]をベースに、Smith et al. [3]のテクニックを利用した設定になっています。

10Gb Ethernetによる検証に使用した実験環境

実験環境
最大4ノード、計 32 GPUs
ノード
GPU: 8 * NVIDIA Tesla P100 GPUs
CPU: 2 * Intel Xeon E5-2667 processors (3.20 GHz, 8 cores)
ネットワーク: InfiniBand FDR
学習データの保存先:ローカルディスク

AWSによる検証に使用した実験環境

実験環境
最大4ノード、計 32 GPUs
ノード(p3.16xlarge)
GPU: 8 * NVIDIA Tesla V100 GPUs
CPU: 64 vCPUs
ネットワーク: 25 Gbps のネットワーク
学習データの保存先:RAM disk

References

[1] Akiba, T., et al. Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes. CoRR, abs/1711.04325, 2017.
[2] Goyal, P., et al. Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. CoRR, abs/1706.02677, 2017.
[3] Smith, S. L., et al. Don’t Decay the Learning Rate, Increase the Batch Size. CoRR, abs/1711.00489, 2017.

NIPS’17 Adversarial Learning Competition に参戦しました

秋葉 拓哉
リサーチャー

2018-04-11 19:01:39

機械学習の国際学会 NIPS’17 に併設され Kaggle で開催されたコンテスト「NIPS’17 Adversarial Learning Competition」に PFN のメンバーで参加し、4 位入賞を果たすことができました。その結果、NIPS’17 に招待され発表を行い、手法についての論文も執筆し公開しました。ソースコードも公開しています。本記事では、具体的にどういった内容のコンテストだったかや、我々がどのようなアプローチで取り組み 4 位入賞を達成したのかについて紹介します。

 

Adversarial Example とは?

Adversarial example [1, 2, 3] は深層学習を実用化していく上での最も大きな課題の 1 つとして考えられている非常にホットな研究分野です。画像認識を例に取ると、元画像に対し人が気づかない程度の僅かな変更を加えるだけで、CNN による画像認識を大きく誤動作させることができることが知られています。

上の画像は adversarial example の例です(出典 [2])。左の元画像にはパンダが写っており、CNN もパンダであると正しく分類できています。真ん中に描かれているのは悪意を持って作られたノイズです。右の画像も、我々人間には一見して左のものと同じパンダの画像に見えます。しかし、実際にはノイズがわずかに重ねられており、右の画像を CNN に分類させると、パンダではなくテナガザルの画像であると非常に高い確度をもって誤判定してしまいます。

 

NIPS’17 Adversarial Learning Competition

今回開催された NIPS’17 Adversarial Learning Competition は、その名の通り、adversarial example に関するコンテストです。攻撃トラックと防御トラックの 2 種目を順番に説明します。

 

攻撃トラック

画像を入力として受け取り、悪意を持ってノイズを加え画像を adversarial example に変換し出力するプログラムを提出します。防御トラックに提出された画像分類器をどれだけ騙せるかが得点になります。具体的には、防御トラックに提出された全画像分類器に対するエラー率の平均がスコアになります。できるだけ強い adversarial example を作る手法を開発することが目的になります。

 

防御トラック

画像を入力として受け取り、分類結果を出力するプログラムを提出します。攻撃トラックに提出された全攻撃プログラムが生成した全画像に対する精度の平均がスコアになります。できるだけ adversarial example に騙されにくい画像分類器を作ることが目的になります。

 

ルール詳細

画像は複数用意されています。また、攻撃トラックのプログラムには実行時にパラメータ ε が渡され、ノイズの大きさは ε までにしなければなりません。具体的には、画像の各ピクセルの各 R, G, B の値を ε まで変更することが許されます。別の言い方をすると、ノイズの L∞ ノルムを ε 以下にする必要があります。攻撃トラックは non-targeted と targeted の 2 部門に分かれていますが、本記事では我々が参加した non-targeted 部門についてのみ紹介しています。詳しくは以下のコンテストの公式ページ [4, 5, 6] をご覧ください。

 

標準的な Adversarial Example の作り方

我々は攻撃トラックに参加しました。まずは、標準的な adversarial example の作り方について説明します。最も有名な手法である FGSM  (fast gradient sign method) [2] をはじめとする既存のほとんど全てのアプローチは、大まかに以下を行います。

  1. 画像分類器に対象画像を分類させる
  2. 誤差逆伝播を画像まで行い、画像に対する勾配を計算する
  3. 得られた勾配を用いて画像にノイズを加える

このステップを 1 度だけ行うか繰り返すか。誤差逆伝播に用いるロス関数をどのように定義するか。勾配をどのように用いて画像を更新するか。こういった部分が工夫され、強い adversarial example を生成する手法が開発されてきました。今回のコンテストでも、攻撃トラックに参加したほとんどのチームはこういったアプローチを用いました。

 

我々の手法について

概要

我々は現在主流となっている上述のアプローチと大きく異なる、「adversarial example を直接生成するニューラルネットワークを作る」というアプローチを取りました。

攻撃を行う際の処理は、ニューラルネットワークに画像を入れるだけです。出力された画像がそのまま adversarial example となります。

 

攻撃ネットワークの学習方法

このアプローチでのキモは、当然、このニューラルネットワークをどのように作るかという点になります。以下、我々が作る adversarial example を出力するニューラルネットワークを「攻撃ネットワーク」と呼びます。以下を 1 イテレーションとして、これを繰り返すことによって攻撃ネットワークを学習しました。

  1. 攻撃ネットワークによって adversarial example を生成する
  2. 既存の学習済み画像分類 CNN に生成した adversarial example を分類させる
  3. CNN 上で誤差逆伝播を行い adversarial example に対する勾配を計算する
  4. そこからさらに攻撃ネットワークで誤差逆伝播を行い、攻撃ネットワークを勾配を用いて更新する

攻撃ネットワークのアーキテクチャとしては fully convolutional なものを設計し用いました。なお、これと類似したアプローチは以下の論文 [7] で提案されています。

 

攻撃を強化するテクニック

より強い adversarial example を生成するために、攻撃ネットワークのアーキテクチャや学習方法の工夫を試み、multi-target training, multi-task training, gradient hint などのテクニックを開発しました。詳しくは論文をご覧ください。

 

データ並列とモデル並列を組み合わせた 128 GPU での分散学習

学習に非常に時間がかかってしまう点を解決し、攻撃ネットワークのアーキテクチャをより大規模にするため、ChainerMN [8] を用いて 128 GPUでの分散学習を行いました。特に、攻撃ネットワークの方が分類ネットワークよりも大規模なため GPU メモリの都合上バッチサイズを小さくしなければいけない点、上述の multi-target training により分類ネットワークはワーカー毎に異なるものを用いている点などを考慮し、標準的なデータ並列に加えて、ChainerMN の最新機能であるモデル並列機能を組み合わせて用い、効果的な並列化を実現しました。

 

生成された画像

我々のアプローチでは、手法だけでなく、生成された adversarial example も非常に個性的なものになりました。

左列が元画像、真ん中の列が生成された adversarial example、右の列が生成されたノイズ(元画像と adversarial example の差)です。以下の 2 つの特徴が見て取れます。

  • パンダの毛の質感のような細かい模様をキャンセルするノイズが生成されており、画像がのっぺりとしている。
  • ジグゾーパズルのような模様が付加されている。しかも、一様にではなく、元画像を上手く活用して効果的に模様を付加している。

この 2 つの特徴により、多くの画像分類器はこの adversarial example をジグゾーパズルとして分類してしまうようです。興味深いのが、我々は特にこのようなジグゾーパズル風の画像を生成するように学習を行ったわけではないという点です。画像分類器を騙す画像を作るという目的関数のもと攻撃ネットワークの学習を行ったところ、攻撃ネットワークが自動的にこのようなジグゾーパズル風の画像を生成することが効果的であると学習したことになります。

 

結果について

我々の最終順位は約 100 チーム中 4 位となりました。優勝を目指し取り組んでいただけあり非常に残念ではありますが、4 位までが入賞とされ、NIPS’17 のワークショップに招待され発表を行いました。

また、コンテスト主催者の方々のお誘いにより、共著でコンテストに関する論文を執筆しました。Ian Goodfellow や Samy Bengio など、業界で知らない人の居ないビッグネームと一緒に論文を出す経験ができました [9]。また、ソースコードも GitHub にて公開しました [10]。

  • [9] Alexey Kurakin, Ian Goodfellow, Samy Bengio, Yinpeng Dong, Fangzhou Liao, Ming Liang, Tianyu Pang, Jun Zhu, Xiaolin Hu, Cihang Xie, Jianyu Wang, Zhishuai Zhang, Zhou Ren, Alan Yuille, Sangxia Huang, Yao Zhao, Yuzhe Zhao, Zhonglin Han, Junjiajia Long, Yerkebulan Berdibekov, Takuya Akiba, Seiya Tokui, Motoki Abe. Adversarial Attacks and Defences Competition. CoRR, abs/1804.00097, 2018.
  • [10] pfnet-research/nips17-adversarial-attack: Submission to Kaggle NIPS’17 competition on adversarial examples (non-targeted adversarial attack track) : https://github.com/pfnet-research/nips17-adversarial-attack

我々は結果こそ 4 位だったものの、アプローチが大きく異ることに起因して実行時間の性質が他のチームと全く違うため、コンテスト終了前から他の参加者の注目を集めていました。下図が上位チームのスコアと実行時間の表になります。我々のチームだけ、実行時間が桁違いに短いことがわかります。これは、我々の手法は攻撃時に前向き計算のみを行うので計算時間が短いのに対し、他のチームはほぼ全て画像に対する勾配を用いる方法を使っており前向き計算と後ろ向き計算を繰り返していたためです。

また、ある参加者によって公開された PageRank 風の解析によると、我々のチームがトップのスコアとなりました。これは、我々の攻撃が、特に上位の防御チームに対して効果的だったことを示唆しています。他と傾向が異なる攻撃であったため防御が難しかったのではないかと思います。なお、優勝チームが手法を解説した論文 [11] はコンピュータビジョンの国際学会 CVPR’18 に採択され spotlight セッションにて発表予定とのことです。

 

終わりに

このコンテストへの参加は、会社の 20% プロジェクトとしてスタートしました。その後、軌道に乗ってきたため、優勝を目指して本腰を据えて取り組みたいと考え調整を行い、終盤は業務時間のほぼ 100% をこのコンテストに使いました。PFN では、他にも Amazon Picking Challenge や IT 創薬コンテストなどのコンテストに会社として参加してきており、こういったコンテストへの挑戦を推奨する雰囲気が有ります。私はこういったコンテストへの参加が大好きなので、今後も社内の課題と関連を持つコンテストを上手く選んで定期的にこういった活動を続けていきたいと考えています。また、社外のコンテストに限らず、社内でも精度や速度をチューニングするタスクが重要な場所で出て来ることが少なくなく、こういったコンテストで養われる能力が活用できる場があります。

PFN では、こういった領域や活動に興味を持ち一緒に取り組んでくれるメンバーをエンジニア・リサーチャー及び夏季インターンとして募集しています。夏季インターンの募集は 4/30 締切ですので、お忘れなきようお願いします。

「コンピューターサイエンスのすべての分野に精通していること」という応募資格に込めた想い

Toru Nishikawa

2018-02-27 16:00:55

※PFNの募集要項は、本ブログの内容をふまえ、適切に意図が伝わるよう一部更新しました


PFN代表の西川です。

今回は、SNS上でもたびたび話題(炎上?)になっているPFNの応募資格について、改めてご紹介したいと思います。
PFNの採用募集ページに書かれたリサーチャーの条件には、「コンピュータサイエンスのすべての分野に精通していること」という一文があります。この条件は、PFIの時から、リサーチャーの応募資格として常に掲げてきました。

その背景にある想いは、コンピュータサイエンスの研究をする上では、一つの分野だけでなく、幅広い分野について深い知見を有することが極めて重要である、ということです。たとえば、データベースの研究をする上では、トランザクション処理の理論や関係代数について詳しく知っているだけではなく、データベースを動かすコンピュータアーキテクチャ、ストレージ、また、今では分散データベースが一般的になってきているので、コンピュータネットワークについての知見も持っていることが必要不可欠です。深層学習を研究する上では、いまや、一台のコンピュータを使って実現するだけでは競争力が持てず、効率の良い並列処理が必須です。フレームワークを作る上では、コンピュータアーキテクチャや言語処理系の仕組みを理解していることが不可欠です。ドメイン特化した言語を作るような場面では、プログラミング言語理論についての理解がなければ、建増し建築のような言語が簡単にできてしまいます。強化学習においては、シミュレーションや、レンダリングの技術を洗練させていくことも重要です。

このように、一つの分野を知っているだけではもはや強みを出すことはできない時代になってきています。どのような分野と分野を融合したら新しい技術が生み出されるのか、最初から予見するのは難しいことです。私たちには、最先端の技術を切り拓いていくミッションがあります。そのために、すべての分野へ精通するべく、技術を追求していくことが極めて重要だと考えています。

精通という日本語は、その分野について広い知識や深い理解を持つことを示しています。必ずしも、その分野のトップカンファレンスに論文を出せるということを示しているわけではありません(そのためには、知識や理解だけでなく、新しい研究をするという重要な能力が必要になります。そして、そのような能力を身につけていくことも重要だと思います)。また、すべてを知り尽くしているということを表しているわけでもありません。むしろ、すべてのことを知り尽くしていると言い切れる人は、サイエンティストではないと思います。コンピュータサイエンスは今まさに急速に発展している分野であり、その進化を常に追い求めていくことは、極めて重要な姿勢だと考えています。

時にはSNSなどで「コンピュータサイエンスのすべての分野に」という部分が、誤解されたり、面白おかしく茶化されたりするようなことも散見されますが、この応募資格に込めたメッセージは、依然としてPFNの文化を形成する上では重要なことだと思っており、変えるつもりはありません。しかし、この応募資格について、誤解を生まないような表現を新たに考えていくことも必要だと考えています。

この10年間、コンピュータサイエンスの領域も急速に広がってきています。この流れはさらに加速するでしょう。また、コンピュータサイエンスの枠にとどまらず、様々な分野を融合することによって、新しい研究分野もできてくるでしょう。ですので、次のような要素を加味して考える必要があると思います。

  • 現時点でのコンピュータサイエンスのすべての分野に詳しいということよりも(もちろん広い分野を知っていることは必要ですが)、これから生まれてくる新しい分野、コンピュータサイエンスの発展の動きを吸収することのほうが、今後は重要になることを考え、現時点での知識よりも、学ぶ意欲を重要視します
  • コンピュータサイエンスだけでなく、ソフトウェア工学、ライフサイエンス、機械工学など、他の分野についても理解を深めていくという姿勢を評価します
  • 新しい技術の組み合わせによるイノベーションをおこすため、人工知能分野の専門家だけでなく、多様な専門性を持つメンバーを歓迎します


これまでは、この条件は、リサーチャーのみに適用していました。しかしPFNでは、リサーチャーもエンジニアも、分け隔てなく、一丸となって、新しい技術を切り拓いていくことが重要だと考えています。リサーチャーもエンジニアリング的な素養が必要ですし、エンジニアも研究について理解をしていく必要があります。ですので、リサーチャー・エンジニア関係なく、これを応募資格にしようと考えています。

 

また私は、大切な、すべてのPFNのメンバーが、新しい技術を切り拓くために全力を尽くせる環境を作っていくことも重要だと考えており、それは今後も継続的かつ積極的に取り組んでいきます。

 

PFNでは、多様な専門分野を持った人材を募集しています。興味を持ってくださった方は、ぜひご応募ください。
https://www.preferred-networks.jp/ja/job

Chainerの可視化・実験管理を支援するChainerUIを公開

ofk
エンジニア

2017-12-20 10:58:59

Chainer上の実験中の学習ログの可視化や実験管理機能を追加するパッケージ、ChainerUIを公開しました。

ChainerUIは、多くのChainerユーザが持つ「学習中の実験ジョブの進捗を手軽に知りたい」、「複数の実験ジョブの手軽に管理したい」ニーズに応えるために開発しました。
具体的には、下記の機能を備えています。

  • 学習ログの可視化
  • 実験履歴閲覧
  • 実行中の実験に対する操作 (スナップショット・学習ハイパーパラメーター修正)

本パッケージは、Chainerの学習用Trainerを監視するChainer extensionとして機能するものです。このChainer extensionを有効化した実験を、Webブラウザからリアルタイムで監視、制御することができます。複雑な依存関係がないため、Trainerを用いる既存の実験スクリプトに簡単に導入できます。

学習ログの可視化


Chainerで実験中のLossやAccuracy等の学習ログを、Webブラウザで可視化することができます。表示する項目は、ユーザが任意に指定できます。

実験管理機能


Chainerを使った複数の実験を1つの画面に一覧表示することができます。各実験には、実験条件を表示することができます。また、ブラウザ上から実行中の実験に対して、スナップショット保存の実行や、ハイパーパラメータの修正が可能です。

セットアップおよび実行

ChainerUIのインストール後、セットアップを行います。

pip install chainerui
chainerui db create
chainerui db upgrade

プロジェクトを登録しサーバーを実行後、Webブラウザでhttp://localhost:5000/にアクセスします。プロジェクトの登録はサーバー起動後にも行うことができます。

chainerui project create -d PROJECT_DIR [-n PROJECT_NAME]
chainerui server

学習ログの可視化

Chainer標準のLogReportが出力するlogファイルを監視し、実験中の学習ログを表示します。下記はtrain_mnist.pyを使用した場合の実行例です。

chainerui project create -d path/to/result -n mnist
python train_mnist.py -o path/to/result/1

“mnist” プロジェクトに “…/result/1” という名前の実験が加えられ、”path/to/result/1”に出力されるlogファイルのデータをグラフに表示します。

実験管理機能

上記logファイルと同じディレクトリにあるargsファイルを一覧に表示します。このargsファイルはkey-value形式のJSONファイルです。下記はtrain_mnist.pyに対して、起動引数をargsファイルに保存するサンプルコード(抜粋)です。

# [ChainerUI] import chainerui util function
from chainerui.utils import save_args

def main():
    parser.add_argument('--out', '-o', default='result',
                        help='Directory to output the result')
    args = parser.parse_args()

    # [ChainerUI] save 'args' to show experimental conditions
    save_args(args, args.out)

実験中のジョブを操作するには、ChainerUIのCommandsExtensionを使用します。同じくtrain_mnist.pyに対するサンプルコード(抜粋)です。任意のタイミングでスナップショットを取ったり、学習率などのハイパーパラメータを修正することができます。

# [ChainerUI] import CommandsExtension
from chainerui.extensions import CommandsExtension

def main():
    trainer = training.Trainer(updater, (args.epoch, 'epoch'), out=args.out)

    # [ChainerUI] enable to send commands from ChainerUI
    trainer.extend(CommandsExtension())

コード全体は、examples/train_mnist.pyを参照してください。

公開の背景

ディープラーニングの応用によって、様々な課題に対するState-of-the-artが日夜目まぐるしく塗り替えられる現在、実験の可視化や管理の効率化は大きな課題となっています。そのため、効率化支援のアプリケーションが乱立する状況も生んでいます。

PFNは、Chainerユーザが上記の課題に悩まされることなく、心地よく実験をこなせることを望んでいます。このような背景から、本パッケージをChainerユーザの効率をよりいっそう高めるための公式ツールとして位置づけて公開します。

PFN2017夏インターンシップの成果

本パッケージは、PFN2017年夏インターンシップに参加した稲垣さんと小林さんの開発成果です。

多くのリサーチャーやエンジニアを抱えるPFN社内では、以前から効率的な機械学習の実験の実施が課題となっていました。しかしながら、各々個人の工夫に頼っていたのが実情でした。そこで、「実験の効率化を支援するためのフロントエンド・アプリケーション」をインターンシップの課題として位置づけて開発を開始しました。

フロントエンド・エンジニアとしてタッグを組んだおふたりは、2か月という短い期間ながらも社内に溶け込み、要件調整から設計・実装まで自発的にプロジェクトを進めました。そしてインターンシップ終了後もPEとして継続的にコミットを続けた上、社内での4ヶ月間のドッグフーディングを経ることで、本日の公開を迎えています。

今後の展望

PFNはChainerUIをChainer製品群の1つとして位置づけ、今後も積極的に開発を進めていく予定です。以下の機能の実装が予定されています。

  • グラフの出力機能
  • 操作コマンドExtensionの拡充 etc

また、PFNでは最先端の研究開発成果物を、エンドユーザに届けるスキルを持ったフロントエンド・エンジニアを募集しています。

化学、生物学分野のための深層学習ライブラリChainer Chemistry公開

Kosuke Nakago

2017-12-18 11:41:05

* English blog is also written here.

Chainer [1]を使った、化学、生物学分野のための深層学習ライブラリ Chainer Chemistry を公開しました。

 

本ライブラリにより、分子構造に対して簡単に深層学習(Deep learning)を適用することができるようになります。

例えば、化合物の分子構造を入力とした毒性の予測や、HOMO(最高被占軌道)レベルの回帰予測など、様々な化学的性質の予測に深層学習を適用することができます。

なお本ライブラリの開発にあたっては、PFN2017夏インターンシップに参加した京都大学の秋田大空さんにも実装に携わっていただきました。

 

特長

様々なGraph Convolutional Neural Network のサポート

Graph Convolutional Network (詳しくは下記参照)の登場により、”グラフ構造”を入力として深層学習が適用できるようになりました。Graph Convolutional Networkは現在盛んに研究がおこなわれていますが、本ライブラリでは今年発表されたばかりの論文も含めいくつかのネットワークを追実装しています。

現時点では以下のモデルが実装されています。

  • NFP: Neural Fingerprint [2, 3]
  • GGNN: Gated-Graph Neural Network [4, 3]
  • WeaveNet: Molecular Graph Convolutions [5, 3]
  • SchNet: A continuous-filter convolutional Neural Network [6]

 

データの前処理部分をライブラリ化・研究用データセットのサポート

様々なデータセットを共通のインターフェースで使えるように、ソフトウェアを設計しています。また、研究用によく使用されるデータセットに関してはライブラリ内でダウンロード・前処理を行うことができます。

現時点では以下のデータセットをサポートしています。

  • QM9 [7, 8]: 9個までのC、O、N、F原子とH原子から構成された有機分子に対して、B3LYP/6-31GレベルのDFT(密度汎関数法)で算出されたHOMO/LUMOレベル、内部エネルギーなどの物性値をまとめたデータセット
  • Tox21 [9]: 12種類のアッセイに対する毒性をまとめたデータセット

 

学習・推論コードのExample code を提供

ライブラリの使い方がわかるよう、モデルの学習コード・推論コードのExampleも公開しています。すでに実装済みのモデル・データセットに対して手軽に訓練・推論を試してみることができます。

 

背景

材料探索・創薬などの応用分野では、分子構造を入力とするシミュレーションが重要な位置を占めます。中でも量子力学的効果を高い精度で取り込みたい場合に用いられるDFT(密度汎関数法)のようなシミュレーション手法は、特に大きな分子に対して、膨大な計算量を要求することが知られています。このため、有用な新物質の候補となる多数の分子構造に対してシミュレーションを行うのが困難です。

そこで機械学習分野では、これまでに実測・計算されたデータを学習することにより、未知の分子の物性値を予測するというアプローチでの研究がおこなわれています。ニューラルネットワークを用いることにより、量子シミュレーションよりも高速に物性値の予測ができることが期待されています。

 

 

Cite from “Neural Message Passing for Quantum Chemistry”, Justin et al. https://arxiv.org/pdf/1704.01212.pdf

 

化合物に対して深層学習を適用することを考えた場合、その入出力をどのように扱うかということが問題となります。これは、通常の深層学習手法が固定長のベクトル値データを入力とするのに対し、分子構造は可変長で分岐やループを持ちうるデータ形式、つまりグラフであるためです。しかし、近年グラフ構造を扱うことのできるGraph Convolutional Neural Network が提案され、注目を集めています。

 

Graph Convolutional Neural Network とは

Convolutional Neural Network (畳み込みニューラルネットワーク)は、局所的な情報のみで計算を進める畳み込み層の導入によって、画像分類、セグメンテーションや画像生成などの分野で成功をおさめました。

Graph Convolutional Neural Network では、同様にグラフ上で近いノードに対する畳み込み演算を導入することにより、グラフ構造の取り扱いを可能にしています。

How graph convolutions work

CNNが画像を入力とするのに対し、Graph CNNではグラフ構造(分子構造など)を入力として深層学習を行います。

 

グラフ構造を入力とするGraph Convolutional Neural Network は、分子構造にかぎらず、ソーシャルネットワークや交通網などに広く適用でき、ここ最近研究が進んできています。例えば、文献[10] では画像、[11]ではナレッジベース、[12]では交通量予測にGraph Convolutionを適用しています。

Graph Convolutional Networkに関しては、以下のブログでもわかりやすく説明されています。

 

対象ユーザー

  1. Deep learningの研究者
    本ライブラリでは、最新のGraph Convolutional Neural Network の追実装を行っています。
    今後、Graph Convolutionは計算科学に限らず、様々な分野への適用が考えられる技術なので、ぜひ様々な方に使っていただきたいです。
  2. 物質探索・創薬などの研究者
    本ライブラリを用いることにより、様々な化合物に対する物性値予測のモデルを構築することができます。

 

今後の予定

本ライブラリはまだベータ版で、開発を行っているところです。今後は以下のような機能をサポートしていきたいと検討しています。

  • Pre-trained modelを提供し、推論だけでの使用をサポート。
  • データセットの拡充
  • モデルの追加

Tutorial も用意しているので、ぜひ試してみてフィードバックをいただけるとありがたいです。

 

参考文献

[1] Tokui, S., Oono, K., Hido, S., & Clayton, J. (2015). Chainer: a next-generation open source framework for deep learning. In Proceedings of workshop on machine learning systems (LearningSys) in the twenty-ninth annual conference on neural information processing systems (NIPS) (Vol. 5).

[2] Duvenaud, D. K., Maclaurin, D., Iparraguirre, J., Bombarell, R., Hirzel, T., Aspuru-Guzik, A., & Adams, R. P. (2015). Convolutional networks on graphs for learning molecular fingerprints. In Advances in neural information processing systems (pp. 2224-2232).

[3] Gilmer, J., Schoenholz, S. S., Riley, P. F., Vinyals, O., & Dahl, G. E. (2017). Neural message passing for quantum chemistry. arXiv preprint arXiv:1704.01212.

[4] Li, Y., Tarlow, D., Brockschmidt, M., & Zemel, R. (2015). Gated graph sequence neural networks. arXiv preprint arXiv:1511.05493.

[5] Kearnes, S., McCloskey, K., Berndl, M., Pande, V., & Riley, P. (2016). Molecular graph convolutions: moving beyond fingerprints. Journal of computer-aided molecular design, 30(8), 595-608.

[6] Kristof T. Schütt, Pieter-Jan Kindermans, Huziel E. Sauceda, Stefan Chmiela, Alexandre Tkatchenko, Klaus-Robert Müller (2017). SchNet: A continuous-filter convolutional neural network for modeling quantum interactions. arXiv preprint arXiv:1706.08566

[7] L. Ruddigkeit, R. van Deursen, L. C. Blum, J.-L. Reymond, Enumeration of 166 billion organic small molecules in the chemical universe database GDB-17, J. Chem. Inf. Model. 52, 2864–2875, 2012.

[8] R. Ramakrishnan, P. O. Dral, M. Rupp, O. A. von Lilienfeld, Quantum chemistry structures and properties of 134 kilo molecules, Scientific Data 1, 140022, 2014.

[9] Huang R, Xia M, Nguyen D-T, Zhao T, Sakamuru S, Zhao J, Shahane SA, Rossoshek A and Simeonov A (2016) Tox21 Challenge to Build Predictive Models of Nuclear Receptor and Stress Response Pathways as Mediated by Exposure to Environmental Chemicals and Drugs. Front. Environ. Sci. 3:85. doi: 10.3389/fenvs.2015.00085

[10] Michaël Defferrard, Xavier Bresson, Pierre Vandergheynst (2016), Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering, NIPS 2016.

[11] Michael Schlichtkrull, Thomas N. Kipf, Peter Bloem, Rianne van den Berg, Ivan Titov, Max Welling (2017) Modeling Relational Data with Graph Convolutional Networks. arXiv preprint arXiv: 1703.06103

[12] Yaguang Li, Rose Yu, Cyrus Shahabi, Yan Liu (2017) Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting. arXiv preprint arXiv: 1707.01926

 

実センサを搭載したロボットカーの深層強化学習による自律制御

Megumi Miyashita

2017-12-12 12:24:19

はじめに

はじめまして。PFNで夏季インターンに続き、アルバイトをしている宮下恵です。普段は東京農工大学大学院で強化学習に関する研究をしており、ものづくりやロボットに興味があります。

「実センサを搭載したロボットカーの深層強化学習による自律制御」について報告させていただきます。

 

続きを読む »

ニューラルネットの逆襲から5年後

岡野原 大輔

2017-11-28 11:39:04

私が2012年にニューラルネットの逆襲当時のコメント)というのをブログに書いてからちょうど5年が経ちました。当時はまだDeep Learningという言葉が広まっておらず、AIという言葉を使うのが憚られるような時代でした。私達が、Preferred Networks(PFN)を立ち上げIoT、AIにフォーカスするのはそれから1年半後のことです。

この5年を振り返る良いタイミングだと思うので考えてみたいと思います。

 

1. Deep Learning Tsunami

多くの分野がこの5年間でDeep Learningの大きな影響を受け、分野特化の手法がDeep Learningベースの手法に置き換わることになりました。NLP(自然言語処理)の重鎮であるChris Manning教授もNLPで起きた現象を「Deep Learning Tsunami」[link] とよびその衝撃の大きさを表しています。

その適用範囲は最初想定されていた画像認識、音声認識分野だけにとどまらず、機械翻訳、生物情報処理、最適化、ロボティクスなど多岐にわたっていきました。

 

2. Deep Learning Frameworkの登場

2012年当時はDeep Learningの研究開発をしようと思った時、使える代表的なライブラリはTorchとTheanoしかありませんでした。その後、2013年末にYanqing Jiaが博士論文を書く過程で作ったCaffeが登場し、2015年6月には弊社PFNからChainerを発表、2015年9月にはGoogleからTensorFlowがリリースされます。その後も各会社がそれぞれのDeep Learning Frameworkを発表していきました。

Chainerは開発者の得居がGW明けに突然作ってきて、使ってみると簡単にかけるものだと驚いたのを覚えています。それまではC++やGoで書いていたのですが、その時とは雲泥の差でした。numpyをはじめとしたpythonの強力な数値計算/データ解析用ライブラリ群の力も合わせpythonによりDeep Learningの研究開発をする流れが急速に広まりました。

また、Chainerが最初に唱えたDefine-by-Runの考え方はコミュニティに受け入れられ、その後PyTorchやTensorFlow Eager execusionなどでも採用され影響を与えていきました。

今ではPythonで数十行から数百行コードを書くだけで、複雑なネットワークを持ったモデルを分散学習することができ、CPU、GPUどちらであっても気にせず、簡単に書くことができます。

 

3. 強化学習との融合

深層学習は強化学習と融合し、大きなブレークスルーをもたらしました。DQNによりAtari2600の様々なゲームが人間と同レベルでプレイできるように学習できることが大きな話題となりました。

元々強化学習は、教師あり学習とは違って、環境からのスカラー値の報酬のみで複雑な制御を獲得できる有望な手法でした。さらに深層学習により価値関数や方策(状態に応じてどの行動を選択するか)の表現力が大きく上がると、これまで困難と思われた問題を次々解けるようになりました。その中でもAlphaGo[オリジナル, AlphaGo Zero]がトップ棋士をやぶったことは大きなマイルストーンとなりました。

弊社もCES2016で強化学習を利用したロボットカーの自動運転のデモンストレーションなどでその可能性について世の中に示していきました[link]

強化学習は未だに学習、利用ともに様々な課題がありますが急速に研究が進んでおり今後ますます重要になるでしょう。最近の強化学習については、Deep RL Bootcampの資料などが参考になるでしょう。

 

4.  研究の爆発

DNNは最初は限られた研究グループのみが研究成果をあげていましたが、現在は世界中の企業、研究グループが次々と研究成果をあげるようになっています。どこの国や地域、企業でもいいアイディアさえあれば、すぐに大きなインパクトをあげられるようになっています。

これにはarxivなどのオープンジャーナルが大きな役割を果たしています。以下にarxivの関連カテゴリ(cs.AI,cs.LG,cs.CV,cs.CL,cs.NE,stat.ML)への投稿数のグラフをあげます[link より図を引用]

これまで研究は国際学会やジャーナル論文が中心でしたが、いつでも誰でも投稿できるオープンジャーナルが登場し、研究プロセスは非常に加速されました。発表された論文が数日後に別の論文で引用されることも珍しくありません。

また、論文と一緒に実験用コードをgithubなどで公開することで、さらに知識の共有が進むようになりました。

一方、オープンジャーナルでは査読がなく論文は玉石混交となり、質が下がるという危惧はあります。しかし注目された研究はすぐに世界中で追試がされチェックされ、怪しいところがあるとRedditなどで指摘されたりします。また、今後はコメントツール(例:Librarian)などを標準が使うことが普及すればさらに論文の信頼性を担保できるようになるかもしれません。

また、大量の論文が投稿され全部追うことは難しくなり、論文キュレーションツールとして、話題になっている論文をまとめるarxiv sanity preserverdeeplearn.orgなども登場しています。

私も読んだ論文の中から面白そうなものはをツイートしていますが、それでも重要な論文を見逃すことがよくあるほど、研究成果が爆発的に出てきています。

 

5. 生成モデル

Deep Learningは、生成モデルでも大きなブレークスルーを起こしました。

例えば、VAE(変分自己符号化器)は連続変数を潜在変数とした場合でも誤差逆伝搬法だけで効率的に学習できるものであり衝撃的でした。

そして二つのニューラルネットワークを競合させて学習するGAN(敵対的生成モデル)がこれまでの生成モデルではできなかった高精細な画像を生成できることは非常に大きなインパクトを与えました。

GANは学習が難しいため、登場から1年間は殆ど後続の研究がなかった中、DCGANが自然な画像生成モデルの学習に成功し、実写と変わらないレベルの画像を生成できることを示しました[最近のGANの生成例,イラストの生成例]   。一方で、GANはその学習の難しさからダイエット本や英語本と同じように多くの研究を生み出しています(GAN Zoo)。

その後、通常の確率モデルの最尤推定による学習では,現実世界のデータにみられるサポート(確率密度値が0ではない)が低次元であるような分布を学習することができず[link]、GAN(の変種)が実現するOptimal Transport (最適輸送)やIntegral Probability Metricsを使わなければいけないということがわかり、Implicit Probabilistic Modelという名とともにGANが注目されました。

 

6. 理論解明

Deep Learningがなぜ学習できるのか、なぜモデルが大きいのに汎化性能が高いのか、何を学習できて何はできないのかといった問題に多くの研究者が取り組んできました。

もともとDeep Learningは非線形のモデルであり,パラメータ数が非常に大きく、従来の統計モデルや機械学習理論からは、謎に包まれていました。

完全な解明には至ってはいないものの分かってきたのは、Deep Learningの確率的勾配降下法(SGD)は極小解にはまりにくいだけでなく[link1 link2]、汎化性能が高いような幅が広い解を見つけられるということ[link]、またミニバッチ正規化[link]、スキップ接続[link]といったテクニックが学習を容易にし、適切なノイズを与えることで汎化性能をあげていることがわかってきています。

また、従来の機械学習の考え方ではパラメータ数が少ない方がモデルの複雑さは下がり、過学習しにくくなりますがDNNの場合、汎化性能はモデルが大きければ大きいほど高いことも予想されています[link]。

 

7. Software 2.0

またDeep Learningが工学的にも、「推論時と計算量と使用メモリ量が固定で済む」「モデルサイズを変えることで計算量と精度のトレードオフをスムーズにできる」「GPUのような並列処理向けプロセッサの開発が非常に容易になる」という利点があることも注目されてきました。

これをAndrej KarpathySoftware2.0と名付け、Deep Learningが単なる機械学習のツールではなく、ソフトウェアの作り方を変える大きなパラダイム・シフトを起こすと述べています。

 

今後について

それでは今後はどのようになっていくのでしょうか。未来の予測は難しく、5年前に予想した時は、Deep Learningがここまで広く適用されるということは予想できていませんでした。それでもしてみましょう。

 

1. 多数の教師なし学習の登場

現在、ディープラーニングが大きく成功しているのは正解ラベルがついたデータを使った教師あり学習です。一方、本当に難しい問題を解くには教師なし学習が重要になると考えられます。

Yann LeCunは講演の中で「知能をケーキに例えるなら、教師なし学習は本体であり、教師あり学習はケーキの飾り、強化学習はケーキ上のサクランボぐらいである。私達はケーキの飾りやサクランボの作り方はわかってきたがケーキ本体の作り方はわかっていない」

と述べています。

また、Geoffrey Hinton教授も[link]「脳のシナプスは10^14個あるが,人は10^9秒しか生きられない。サンプル数よりパラメータ数の方がずっと多いことになる。(これらのシナプスの重みを決定するためには)1秒あたり10^5個の制約が必要となり,多くの教師無し学習をしているとの考えに行き着く」と述べています。

世の中の膨大なデータの大部分は教師データがついていません。これらのデータを活かせる学習手法が望まれています。教師なし学習の中でも”pretext task”は、関係のなさそうなタスクを学習することで、その副作用として本当に学習したいことを学習することが増えています。現時点でも、様々なpretext taskが提案されています。おそらくpretext taskは一つだけではなく無数あり、それらを組み合わせて強力な学習を実現していると思われます[例, 表1に例多数]。しかし、これまで多くの教師なし学習手法が提案されているものの、それを使って教師あり学習、強化学習の性能を大きく向上する決定的な手法はまだ見つけられていません。

また、大きく成功するには学習データ数やモデルの大きさのスケールが数桁足りないという可能性があります。

人は1年間に10時間/日*3600秒/時*365日*10Hz=1.3億回の画像をみてそれらで予測学習や、補間学習、ノイズ除去学習をすることができます。

ただでさえ教師あり学習は人よりもサンプルを必要としているので教師なし学習でも大きな成果を生み出すには莫大な量のサンプルが必要になるかもしれません。

 

2.  微分不可能な要素を含んだNN

現在のディープラーニングは微分可能な構成要素を組み合わせて作られています。これにより誤差逆伝播法が可能となり、どれだけネットワークが複雑になっても、出力を修正するには各モジュールをどれだけ修正すればよいかが正確にかつスケーラブルに求めることができます。

一方で、微分不可能な構成要素も困難な問題を解くためには不可欠です。例えば、汎化するロジックやルールを獲得するためには、過学習につながる情報の中で不要な情報を捨てることが必要になります。これには複数の値を一つの値に縮約(contraction)する、または離散化するということが必要になります。

あの猫もこの猫もそのまま扱わずに「猫」という離散値を割り振ってその上でルールを学習すれば、誤った入力との相関を見つけることはありません。

一方、離散化は微分不可能な計算ですので、誤差逆伝播が使えません。しかし、この場合でも勾配の不偏推定量を求められる手法がいくつか登場しています[例 Relax]。

また、強化学習においても”環境”は微分不可能でそもそもどのような計算がされるのかはわかりませんが、これも同様に環境のダイナミクスをシミュレーションするNNを作り、伝播することができるでしょう。これは環境を想像する能力やデータから獲得した上でのモデルベース学習とも関係します。

離散変数によるゲートはconditional computationやmixture of expertシステムのように使うモジュールをダイナミックに選択し、そのモジュールだけ計算させることで計算量を劇的にさげることができます。

今後は、誤差逆伝播法だけではなく、離散変数での最適化も可能な離散/組み合わせ最適化法[link]、遺伝的アルゴリズムや、進化戦略[link], を使った手法も必要になるでしょう。

 

3.  メタ学習、継続学習

より複雑な問題を解くために、ある学習問題に他の学習結果を利用することが必要となります。今のようにある問題に対して特定の学習器で学習させるのではなく複数の問題、タスクを同時にまたは順番に一つの学習器を学習させることが重要となってきます。

一つの人工知能システムが非常に多くの問題を解けるようになる汎用人工知能システムに到達するにはまだ多くの問題を解く必要があり難しいですが、それでも関連するタスクを一緒に、または次々と学習していくことで一つの学習に必要なサンプル数を大幅に削減できたり、性能を大きくあげるといったことは可能になると考えられます。

カリキュラム学習、ブートストラップ学習といった、複数の学習を計画をたてて学んでいくことも今後大きく伸びていくことと考えられます。

 

4.  シミュレーションとの融合、説明可能性

現実世界の問題を解く上で、現実世界の様々な制約を克服するためにシミュレーション上で学習、検証することがより一層必要になります。その上、どのように計画を立てているのかを説明する上でもブラックボックスであるニューラルネットワークモデルの中の計算処理を説明するのではなく、実際に実現例を示し、シミュレーション上でこうなっているからと説明することが増えていくと考えられます。

今の生成モデルは、様々な条件付けをして生成をすることで滅多にとれないデータを生成し、その上で学習、検証することを可能にします。これは、システムに想像力を備えさせた上で、まだ経験していない環境で学習できることを可能とさせるでしょう。

 

5. 人や既存システムとの協調

これらAIシステムが実問題に適用されていく中で、いかに人と協調するか、既存システムと協調するかが重要となってきます。全ての問題を完璧に解くことが理想ですが、そうならなかった場合でも、解けている問題だけを担当させ、残りを人や既存システムが担当することが多くなるでしょう。

その場合、認識結果や理由をわかりやすくするだけでなく、制御できるようにチューナーのようなツマミが必要になるかもしれません。また、人が自分の感覚を拡張したと感じられるように、操作可能性や応答性が重要になります。人馬一体という言葉がありますが、そのように人がAIシステムを自由自在に扱うことができるようになることが必要となるでしょう。

2017年 PFN夏季インターンシップのコーディング課題公開

Kosuke Nakago

2017-07-27 09:54:00

* English blog is also written here.

PFNでは毎年8、9月に学生の方を対象とした2カ月間の長期インターンシップを実施しています。

今年も2017年のPFN 夏季インターンを募集したところ多数の応募をいただき、先日無事に選考が終了しました。

PFN 2017夏季 インターン募集

それに伴い、今回PFNのインターンコーディング課題をgithub上で公開しました。

https://github.com/pfnet/intern-coding-tasks

 

続きを読む »