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

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

 

続きを読む »

分散深層学習パッケージ ChainerMN 公開

秋葉 拓哉
リサーチャー

2017-05-09 06:28:29

Chainer にマルチノードでの分散学習機能を追加するパッケージ ChainerMN のベータ版を公開しました。

ChainerMN とは

ChainerMN は Chainer の追加パッケージで、Chainer を用いた学習を分散処理により高速化できます。柔軟で直感的に利用できる Chainer の利便性をそのままに、学習時間を大幅に短縮できます。1 ノード内の複数の GPU を活用することも、複数のノードを活用することもできます。既存の学習コードから数行の変更で ChainerMN を利用可能です。ChainerMN は既に社内の複数のプロジェクトで実証が行われています。

Chainer を用いた通常の学習における 1 イテレーションは下図のように Forward, Backward, Optimize の 3 つのステップからなります。

ChainerMN はこれに、下図のように、通信を行う All-Reduce のステップを挿入します。All-Reduce のステップでは通信を行い、全ワーカーが Backward で求めた勾配の平均を計算し全ワーカーに配ります。Optimize のステップでは、この平均の勾配が利用されます。全ワーカーは学習開始後は常に同じパラメータを持ちます。

下図は以前に行った大規模ベンチマークの結果です。ChainerMN で 128 GPU を利用し画像分類の学習を約 100 倍高速化することができました。詳しくはこちらの記事をご覧ください。

利用方法の概要

以下、ChainerMN の利用方法の概要を紹介します。詳しくはドキュメントをご覧ください。

セットアップ

ChainerMN をインストールする前に、CUDA-Aware MPI, NVIDIA NCCL のセットアップが必要です。

CUDA-Aware MPI

ChainerMN は MPI を利用しており、MPI は CUDA-Aware 機能が利用できる必要があります。CUDA-Aware 機能をサポートするオープンソースの MPI には Open MPI, MVAPICH などがあります。以下は Open MPI を CUDA-Aware でインストールする例です。

./configure --with-cuda
make -j4
sudo make install

複数ノードで利用する場合、InfiniBand 等の高速なインターコネクトの利用を推奨します。

NVIDIA NCCL

NCCL はノード内の GPU 間の集団通信を高速に行うためのライブラリです。こちらを参考にビルド・インストールし、環境変数を適切に設定して下さい。

ChainerMN

ChainerMN は pip よりインストールできます。

pip install chainermn

 

学習コードの変更

ChainerMN を利用した分散学習を行うためには、既存の Chainer による学習コードに変更を加える必要があります。ドキュメント内のチュートリアルでは順を追ってこの手順を説明しています。

以下では、そのうちの最も重要なステップである、コミュニケータの作成と、オプティマイザの置き換えについて説明します。

コミュニケータ

コミュニケータは以下のように作成します。

comm = chainermn.create_communicator()

通信はこのコミュニケータを通じて行います。コミュニケータからは、参加しているワーカー数や自分がその何台目か(rank と呼ばれます)などの情報を得ることができます。

オプティマイザ

ChainerMN は Chainer のオプティマイザを置き換えることによりワーカー間の通信処理を挿入します。以下は通常の Chainer のコードで Adam のオプティマイザを作成している部分です。

optimizer = chainer.optimizers.Adam()

ChainerMN では、以下のように create_multi_node_optimizer 関数を呼び出して、通信処理が追加されたオプティマイザを作成します。

optimizer = chainer.optimizers.Adam()
optimizer = chainermn.create_multi_node_optimizer(optimizer, comm)

create_multi_node_optimizer によって作成されたオプティマイザは、通信処理が追加されている以外は通常のオプティマイザと同様に扱うことができます。

実行

mpiexec または mpirun コマンドを用いて学習スクリプトを起動します。以下は localhost 内で MNIST example を 4 プロセスで起動する例です。

mpiexec -n 4 python train_mnist.py

終わりに

以上、ChainerMN の利用法を駆け足で紹介しました。かなりの部分を省略しているので、実際に利用される際にはドキュメントを見て頂ければと思います。

ChainerMN は今後、通信と計算のオーバーラップ、ワーカー間の非同期な計算、勾配の圧縮による通信効率化、耐障害性などの課題に取り組み、改善を続けていく予定です。

人工知能技術の健全な発展のために

Hiroshi Maruyama

2017-04-12 15:53:06

4月10日の日経ITproの記事「 AIベンチャーの雄が総務省の開発指針に反対する理由」で、総務省主導で推進されているAIネットワーク社会推進会議とその開発原則分科会からPFNが離脱したことを、取り上げていただきました。私とのとりとめのないインタビューを適切にまとめてくださった日経ITpro浅川記者に深く感謝いたします。また、その記事に対して、はてなブックマーク、NewsPicks、FacebookなどのSNSを通して多くのコメントを下さった方にも感謝の意を表します。ありがとうございます。離脱の理由は記事にある通りですが、総務省の方々も私達の立場を真摯に受け止めてくださっていて、実りのある議論を続けてくださっています。その上で、今後の議論を深めるために、いくつかの点について補足したいと思います。

汎用人工知能と特化型人工知能

現在、人工知能という言葉は大雑把には、

  • 汎用人工知能(「強い」人工知能とも呼ばれ、自意識・創造性などあらゆる面で人間と同等以上の知性を示す、いわゆる「人工知能」)と、
  • 特化型人工知能(ある特定のタスクで知性を示すソフトウェア、あるいはそれを組み込んだ自動機械)

のどちらかまたは両方を指す言葉として使われています(より詳細には、様々な知能の定義があり、百人いれば百通りの定義があるようです)。文脈によってどの意味であるかが明確であればよいですが、そうでないと混乱の元になります。

汎用人工知能がいずれ実現することは間違いないでしょう。汎用人工知能が社会に与えるインパクトは計り知れず、そのために私達の社会がどのように準備しておくべきか、今から議論することには大変意味があると思います。しかし、汎用人工知能が実現可能になるまでには、まだいくつもの未解決問題を解かねばなりません。過去約60年にわたる人工知能の研究において、探索、推論、知識表現など多くの技術革新がありました。最も最近のブレークスルーは深層学習です。これら様々な革新的な技術の積み重ねがあるにもかかわらず、汎用人工知能の実現は、今見えている技術の延長上には無い、というのが私達の認識です。

汎用人工知能の実現が、人工知能研究の究極のゴールだとすれば、特化型人工知能は機械をより知的にするための営みから生まれてきた技術だといえるでしょう。「より」知的という意味は、それまでは機械にできないと思われていたことができるようになる、ということです。初期の人工知能研究では、例えば手段目標分析(means-ends analysis)という探索技法が盛んに研究されました。これは数学の定理証明など「高度に知的な」問題を解くのに用いられ、当時の人工知能の成功例とされましたが、今では乗換案内における探索アルゴリズムなどに実装され、日々使われている手法です。他にもコンパイラに使われる形式言語理論、オブジェクト指向やモデリング言語に使われる概念階層など、人工知能研究から発生した手法は、現在では多くのシステムの中で道具として使われています。すなわち、特化型人工知能とは「その時代における情報技術の最先端を指す言葉」と捉えてもよいでしょう。その意味では、最近注目を浴びている深層学習も、いずれは日々のプログラミングの中で当たり前のように使われる道具になっていくでしょう。特化型人工知能とは、自動車や洗濯機などと同様、道具に過ぎないのです。

深層学習の持つポテンシャル

その一方で、PFNが注力している深層学習は情報技術の世界を大きく変えてしまうポテンシャルがあると、私達は考えています。それは、応用領域の爆発的拡大と、そもそも情報システムのあり方の革新に現れてきます。

深層学習の技術は、当初は画像認識において、高い認識精度を得たことで注目を浴びました。現在では、音声認識や機械翻訳においても広く使われるようになってきているのはご承知のとおりです。PFNでは、深層学習を特にIoTなど物理世界との接点で応用しようとしています。自動運転のための画像認識バラ積みロボットの学習深層強化学習による自動運転、同じく深層強化学習によるドローンの制御深層生成モデルによる異常検知がんの診断などは、今までPFNが深層学習の応用を試みて成功してきた分野です。また、最近話題になったものとして、線画の自動着色があります。しかし、これらは氷山の一角に過ぎません。深層学習の応用分野はこれからも爆発的に増えていくと考えています。特に、産業用機器の制御など組み込み分野では、より高い精度、より高度な制御を行うために今後は深層学習を使わないシステムは考えにくくなってくるでしょう。

深層学習は同時に、ハードウェアからシステム開発の方法論、さらには業界のエコシステムまで、情報システムそのもののあり方も変えていきます。1990年代からつい最近にいたるまで、コンピュータといえばほとんどがインテルのx86アーキテクチャに基づくものでした。一方、現在深層学習を使っている多くの企業は、GPUを使っています。PFNでも、石狩にあるさくらインターネットのデータセンターに、数百個規模のGPUクラスタからなる計算基盤を構築していただいて、これを日々使っています。しかし、私達はGPUが究極のアーキテクチャとは考えていません。これから多くのハードウェアのイノベーションが起きるでしょう。

プログラミングモデル、あるいはソフトウェアのレイヤでは、「深層学習フレームワーク」という技術が群雄割拠でしのぎを削っている段階です。PFNでもご存知の通り深層学習フレームワークChainerを開発していて、これはNVIDIA、Intel、IBMなど主要なITベンダーにサポートされていますし、世界で戦える技術だと自負しています。このようなフレームワーク、すなわち深層学習に基づくプログラミングモデルを使いこなせることが、これからのITエンジニアの必須スキルとなることでしょう。

さらに今後、

  • 深層学習を用いたシステム開発のための方法論、すなわちお客様の要求をどのように深層学習の問題として表現し、訓練データや学習環境を用意し、評価やデバッグを行い、運用するかという知識体系(今までのソフトウェア工学に代わる体系)、
  • 深層学習によって作成される学習済みモデルの知的財産の保護、
  • あるいはシステム開発や学習済みモデルをめぐる新しいビジネスのエコシステム

など、情報技術の現在の常識が、すべての局面において大きく変わっていくことでしょう。

人工知能技術の健全な発展のために

「人工知能」という言葉がひとり歩きする中で、人工知能に対する過度な期待と、その裏返しである脅威論が、多くの人々の判断を歪ませているように思います。私たちは、今の技術がどのレベルにあり、どのような発展が想定されているかを正しく理解し、その知識に基づいて社会がどうあるべきかを議論しなければなりません。

深層学習が世の中を大きく変えていく中で、私達が世界の中で競争力を失わずに、なおかつ人類社会の発展に貢献するために何ができるのか、私達人工知能技術に携わるものが、その現状と展望を正しく発信するように、戒めていきたいと思います。

 

深層強化学習による自動駐車の実装

Shiba Shintaro

2017-03-22 19:15:13

初めまして! PFN でアルバイトをさせてもらっている芝慎太朗です。普段は東京大学大学院で行動神経科学の研究をしています。僕が去年取り組んでいた、「車が自ら駐車場に向かい停止する」自動駐車プロジェクトについて報告します。まずはこちらのアニメーションをご覧ください。(アニメーションがうまく再生されない場合は画像をクリックしてください)

We implemented self-driving car that parks itself using deep reinforcement learning. The English slide is available at SlideShare!

背景

深層強化学習は、2015年から非常に注目され始めた人工知能技術であり、深層学習と強化学習を組み合わせたものです。深層強化学習によって、それまでできなかったような複雑なタスクにおいてもコンピューターが人を上回り始めました。プロ棋士を破ったことで一躍話題になった Google DeepMind による囲碁の人工知能 AlphaGo もこの技術を使っています。最近では スマッシュブラザーズにおいても威力を発揮し 話題になりました。

深層強化学習は制御タスクとの相性がよく、実際に PFN でもぶつからない車の自動運転ドローンの制御などに成功してきました。

PFN が CES 2016 で展示した自動運転(参照)では、アルゴリズムとして深層強化学習ブームの火付け役となった Deep Q Network(以下DQN)を用いています [Mnih et al., 2015]。ニューラルネットワークへの入力は、LIDAR(wikipediaによる解説)を模した近接物への距離と角度センサー、直前の行動、現在の車のスピードとステアリング(ハンドルの曲がり具合)でした。

しかし自動運転技術を現実に応用することを考えると、一般に距離センサーよりもカメラの方が安価という特徴があります。一方で、距離の計算が必要になるためカメラ画像の方が制御は難しくなると考えられます。実際、つい最近も ブラウザ上で動作するような簡単な自動運転デモ が公開されたばかりですが、これも距離センサーを使用しており、使用しているニューラルネットは3層程度の簡易なものです。
距離センサー・カメラそれぞれに得意・不得意な状況や利点・欠点があるので一概にどちらを用いるべきとは言えませんが、いずれにせよ、距離センサーに頼らずカメラ画像のみを用いて車を制御するようなアルゴリズムの研究開発は非常に重要です。

本プロジェクト

このプロジェクトでは、距離センサーではなく、車に取り付けられたカメラによる主観的な画像の入力によってend-to-endのアルゴリズムで車を制御できないか、ということに挑戦しました。具体的なタスクとして選んだのは駐車です。すなわち、車を駐車スペースに移動して停止させます。

アルゴリズムとしては DQN の改善版である Double DQN を使用しました。Double DQN は行動価値の見積もり値である Q 値の過大評価を防ぎ、ニューラルネットの発散を防ぐことで学習を安定させるという特徴があります [Hasselt et al., 2015]。詳しくは解説スライド(この投稿の最後にリンクが貼ってあります)や元論文をご覧ください。

まずは環境の定義です。今回は実機や既存のシミュレータを使用せず、簡単な車の物理シミュレータを自分で実装しました。このシミュレータはアクセル、ブレーキ、ハンドルの曲がり具合を受け取り、牽引力、空気抵抗、転がり抵抗、遠心力、制動力、コーナリング力を計算し、車の位置、速度、加速度を更新します。車や駐車スペースの大きさと、車が探索できる地面の範囲なども定義しました。次の図は、シミュレーションされた環境を上から見た俯瞰画像です。黒い長方形が駐車スペース、赤と黄色の長方形が車(黄色が前)になります。


次にエージェントへの入出力を定義します。エージェントは環境の状態を入力として受け取り、アルゴリズムにしたがって適切な行動を選択します。現実世界に例えるなら車に乗っている人に相当するでしょう。行動はアクセル、ブレーキ、ハンドルを左右に曲げることの組み合わせで全部で9種類用意しました。状態としては、環境を車から見た主観画像と、現在の車のスピードとステアリング(ハンドルの曲がり具合)を使用しました。つまり、車の現在位置や駐車スペースまでの距離を直接知ることはできません。

主観画像は、車を中心に3方向または4方向に設置されたカメラ画像を用意し、車の周りをぐるりと見渡せるようにします。次の画像はカメラが4台の場合の主観画像です。画像の大きさはニューラルネットに入力する直前で 80 x 80 に縮小します。わかりやすいように中心に先ほどと同様の俯瞰画像を載せました。


エージェントは、画像の入力に合わせて適切な行動を選択し、車を駐車スペースに導いてそこで停車することが求められます。状態がカメラ台数分の画像と、画像でないパラメータ(現在の車のスピードとステアリング)からなるため、ニューラルネットの構造を工夫して以下のようにしました。この図はカメラが3台の場合に使用されたニューラルネットワークです。図中の Convolution とは、画像を処理するための畳み込みニューラルネットを示します。


最後に報酬を定義しておきます。「車が駐車スペースに向かい、その中で停止する」、すなわち「車ができるだけ長く駐車スペースの内側にいる」ことを学習するような報酬の与え方を考えます。いろいろな設定を試しましたが、最終的に

  • 車が駐車スペースの内側にいる場合、+1
  • 車が地面の外にいる場合、-1
  • その他の場合、0.01 – 0.01 * ゴールまでの距離

というふうに設定してみました。
その他の細かい設定や、他に試した報酬の設計などは末尾のスライドをご覧ください。

結果

GeForce GTX TITAN X 上で約一週間ほど学習を回し続けた結果、冒頭で示したように、車が自動で駐車スペースに向かい停止するように学習できました。次のアニメーションは冒頭と同じもので、左が車の軌跡、右が実際にニューラルネットワークに入力された画像です。

しかしながらやはりタスクの難しさもあって、このまま学習を続けていくと車が地面をぐるぐる回り続けたり、パラメタによっては学習途中でニューラルネットの出力が発散してしまったりという場合もありました。こちらも詳細はスライドを見ていただければと思います。


考察

深層強化学習を用いて、主観画像の入力から自動駐車を学習できました。画像を入力して車を制御するのは、距離や角度のセンサーよりも一段階難しいタスクです。実は、このプロジェクトも距離などを入力にして学習させるところから始めました。距離を直接入力した場合には安定してすぐに学習できたものの、主観画像では Q 値の発散や、うねうねと動き続ける車が誕生したりとなかなか安定しませんでした。

原因として考えられることの1つに、畳み込み層で車や駐車スペースの場所がうまく検出しきれていない可能性があります。先にCNNから位置を回帰するような事前学習をおこなってその重みを初期値として使うことや、一度 CNN 部分の出力を可視化してみることも有用でしょう。

また学習を安定させるために、アルゴリズムの変更も効果的かもしれません。例えば A3C [Mnih et al., 2016] や TRPO [Schulman et al., 2016] を使ってみたり、モンテカルロ法と組み合わせた学習などは試す価値があると考えられます。

実際にはいきなり始めから主観画像を入力したわけではなく、上で少し述べたように、簡単なタスクから徐々に難しくしていました。また、報酬の設計を変更しつつ、駐車スペースの位置や車の初期設定を変えながらカリキュラム学習をしたりと細かい実験を試しています。これらの詳細が知りたい方は上記のスライドを見ていただければと思います。

まとめ

本プロジェクトの結果はまだ様々な状況で完全に対応できるものではありませんが、深層強化学習によってカメラ画像のみで自動駐車が実装できる可能性を示したものだと言えます。今後の方向性としては、学習アルゴリズムを変更して学習を安定させたいです。シミュレーションだけではなく、実機でも実現できれば非常に面白いと思います。

僕は現在も他のプロジェクトに取り組みながらアルバイトを続けています。初めからプログラミングや強化学習ができたわけではなく、自分で勉強しつつ、わからないところをメンターに教えていただきながら、大変恵まれた環境で進めることができたプロジェクトでした。学生の皆さんも興味があればアルバイトやインターンに積極的に飛び込んでいってみてはいかがでしょうか。

深層強化学習ライブラリChainerRL

Yasuhiro Fujita

2017-02-16 19:10:47

Chainerを使った深層強化学習ライブラリChainerRLを公開しました. https://github.com/pfnet/chainerrl

PFNエンジニアの藤田です.社内でChainerを使って実装していた深層強化学習アルゴリズムを”ChainerRL”というライブラリとしてまとめて公開しました.RLはReinforcement Learning(強化学習)の略です.以下のような最近の深層強化学習アルゴリズムを共通のインタフェースで使えるよう実装してまとめています.

A3CでAtari 2600のゲームをプレイするexampleや,

DDPGでヒューマノイドロボットの制御を学習するexampleなどがあります.

以下では簡単にChainerRLの使い方を説明します.

まず,強化学習を使って問題を解くには,解きたい問題(”環境”と呼びます)をしっかり定義する必要があります.環境の定義の仕方は,OpenAIが公開している強化学習ベンチマーク環境のGym(https://github.com/openai/gym)のインタフェースに従っています.Gymの環境で動かすこともできますし,インタフェースを揃えればオリジナルな環境で動かすこともできます.基本的にはresetとstepという2つのメソッドが実装されていれば十分です.

env = YourEnv()
# reset は環境をリセットして現在の観測を返す
obs = env.reset()
action = 0
# step は環境にアクションを送り,4つの値(次の観測,報酬,エピソード終端かどうか,追加情報)を返す
obs, r, done, info = env.step(action)

深層強化学習では,状態から行動を決める方策(Policy)や,状態や行動の価値を予測する価値関数(V-function,Q-function)をニューラルネットで表現し,そのパラメータを学習します.ChainerRLでは,これらは単に__call__を実装したChainerのLinkとして表現されます.

class CustomDiscreteQFunction(chainer.Chain):
    def __init__(self):
        super().__init__(l1=L.Linear(100, 50)
                         l2=L.Linear(50, 4))
    def __call__(self, x, test=False):
        h = F.relu(self.l1(x))
        h = self.l2(h)
        return chainerrl.action_value.DiscreteActionValue(h)

class CustomGaussianPolicy(chainer.Chain):
    def __init__(self):
        super().__init__(l1=L.Linear(100, 50)
                         mean=L.Linear(50, 4),
                         var=L.Linear(50, 4))
    def __call__(self, x, test=False):
        h = F.relu(self.l1(x))
        mean = self.mean(h)
        var = self.var(h)
        return chainerrl.distribution.GaussianDistribution(mean, var)

このように作ったモデルやChainerのOptimizer,アルゴリズムごとに必要な引数を渡して”エージェント”を作ります.エージェントは環境とのインタラクションを通じてデータを集めながらモデルの学習を行います.

q_func = CustomDiscreteQFunction()
optimizer = chainer.Adam()
optimizer.setup(q_func)
agent = chainerrl.agents.DQN(q_func, optimizer, ...)  # 残りの引数は省略

エージェントを作ったら,自分で学習ループを書いて動かすか,

# Training
obs = env.reset()
r = 0
done = False
for _ in range(10000):
    while not done:
        action = agent.act_and_train(obs, r)
        obs, r, done, info = env.step(action)
    agent.stop_episode_and_train(obs, r, done)
    obs = env.reset()
    r = 0
    done = False
agent.save('final_agent')

あるいはあらかじめ用意されている学習用関数に渡せば学習が行なえます.

chainerrl.experiments.train_agent_with_evaluation(
    agent, env, steps=100000, eval_frequency=10000, eval_n_runs=10,
    outdir='results')

とりあえず動かしてみるためのクイックスタートガイドを用意しました. https://github.com/pfnet/chainerrl/blob/master/examples/quickstart/quickstart.ipynb

ChainerRLはまだベータ版ですが,強化学習に興味がある方はぜひ試してもらってフィードバックをいただけるとありがたいです.ライブラリとしての使いやすさや,新しいアルゴリズムの追加など,今後も改善を続けていこうと思います.