EMNLP2015読み会を開催しました

海野 裕也
リサーチャー

2015-11-02 10:59:34

海野です。10/24に、リクルートテクノロジーズさんの会議室で、EMNLP2015読み会を開催しました。
10件の発表と、およそ40人の参加者が集まりました。
昨年も開催しましたが、規模が2倍程度になり、この分野への注目度が伺えます。

特にEmbeding系の論文が多かったらしく、EMNLPのEはEmbeddingのEではないか、という皮肉があったそうです。
10本の発表中、2本がattentionベースの手法で、Embedding、RNNに続いて次のトレンドになりつつあるのかなという感触を得ました。

当日のTwitterの様子は、togetterにまとめました

最後に、会場提供や運営を手伝っていただいた、リクルートテクノロジーズ様と、@yag_aysさんに感謝いたします。

続きを読む »

Chainer Meetup #0 を開催しました。

preferred

2015-10-19 13:57:49

2015年10月14日に、Chainer Meetup #0を開催しました。

こんにちは、PFI エンジニアの舛岡です(前回の松元さんに習い自己紹介を後ろに書きました)。製品事業部で、何でも屋として仕事をしています。research ブログに投稿する日が来るとは思ってませんでした。

Meet Upの概要

今回のMeet Upは、「開発陣がコントリビュータの方に会ってみよう」をコンセプトに開催をしました。(開発陣の2名が出張でいないという・・・・)。そのため、コントリビュータの方を招待し、13名の方に参加して頂きました。

まず始めに得居さんから、Chainer 1.5の開発方針について話をし、その後、参加者の皆様に以下の内容でLTをして頂きました。

  • Chainerをどのような場面で使用されているのか?
  • Chainerの良いところ
  • Chainerの改善点・もっとこうしてほしい

LTの総括

Chainerをどのような場面で使用されているのか?
  • RNN/CNNのプロトタイピング
  • 画像認識(研究/ウェブサービス)
  • 自動翻訳
  • 為替市場の時系列データ分析
  • 音声認識

など

Chainerの良いところ
  • 環境構築が簡単
  • 可読性が高い
  • 複雑なネットワークを構築できる
  • 入力データを柔軟に変更できる

など

Chainerの改善点・もっとこうしてほしい
  • Save/load機能
  • もう少し速度がほしい
  • コミュニティの強化:交流会増やして欲しい
  • ベンチマークが欲しい

などなど

発表資料

以下は、発表資料(アップされたのもののみ)です。

@beam2d


@mitmulさん


@jnoryさん



@sinhrksさん

@jnishiさん


@y-tag
https://docs.google.com/presentation/d/1d2VTgaPpdHM2dgSNX7HEL2K-_YgditTa2wuqoejxD5Q/edit?usp=sharing

@odashi

@kikusu

感想

Chainerがどのような場所で使われているか、どういう課題があるかを知ることができました。
今後も継続的にこのようなイベントは行う予定です。
詳細が決まり次第ご連絡します。

 

画風を変換するアルゴリズム

mattya

2015-09-10 18:38:02

Deep Neural Networkを使って画像を好きな画風に変換できるプログラムをChainerで実装し、公開しました。
https://github.com/mattya/chainer-gogh

こんにちは、PFNリサーチャーの松元です。ブログの1行目はbotに持って行かれやすいので、3行目で挨拶してみました。
今回実装したのは”A Neural Algorithm of Artistic Style”(元論文)というアルゴリズムです。生成される画像の美しさと、画像認識のタスクで予め訓練したニューラルネットをそのまま流用できるというお手軽さから、世界中で話題になっています。このアルゴリズムの仕組みなどを説明したいと思います。

概要

2枚の画像を入力します。片方を「コンテンツ画像」、もう片方を「スタイル画像」としましょう。
コンテンツ画像とスタイル画像

このプログラムは、コンテンツ画像に書かれた物体の配置をそのままに、画風をスタイル画像に変換した画像を生成します。

生成された画像

いろいろな例を見てみましょう。コンテンツ画像は先ほどの猫の画像で、左がスタイル画像、右が生成された画像になります。
Screen Shot 2015-09-10 at 2.03.20 PM

Screen Shot 2015-09-10 at 2.03.35 PM

美術作品をスタイル画像とすると、その画風をかなり良く再現してくれます。色合いだけでなく、小さめの空間パターンまで似せて生成されます。ここには載せないですが漫画作品やゲーム画面なども面白い結果を生み出してくれます。

Screen Shot 2015-09-10 at 2.03.29 PM

スタイル画像は絵である必要はありません。美しく生成するのは難しいですが…
他にも寄木細工のような工芸品や、ロマネスコブロッコリーのようなフラクタル系の画像もスタイル画像として優秀でした。

Screen Shot 2015-09-10 at 2.03.24 PM
正直ここまでできるとは思ってなかったのですが、新聞や設計図のような画像でも、そのスタイルを抽出することができました。特に、新聞の文字もどきを塗りに使っているところや、設計図のカクカクした感じが猫の輪郭に当てはまっているのには感動です。

元論文や、こちらのサイトなどにも面白いサンプルが多数掲載されているので、もっと見たい方はご覧になってみてください。また、これらの例は全部上のリンクのchainer-goghで生成できるので、興味のある方はぜひ自分で作ってみてください。

アルゴリズムの解説

モデル

このアルゴリズムはCNN(convolutional neural network)を使って画像を生成します。
このCNNとしては予め物体認識で訓練したニューラルネットを使用し、これ以上の学習は行いません
caffeのmodel zooにILSVRCなどの画像認識ベンチマークで好成績を収めた学習済みモデルが多数公開されており、それを使います。Chainerはこれらのcaffemodelを読み込むことができるのです。

上でお見せした生成例は、VGG 16-layerのCNNモデルを使用しています。これは、次のような構造になっています(後半のFC層などは省略)。

使用したCNNの構造

書かれている数字は[チャネル数*縦*横]を意味します。入力画像はRGBの三色なのでチャネル数が3ですが、層が進むとチャネル数が増えていきます。縦横解像度はこの図は256*256を例にしましたが、変えても動作します。
本アルゴリズムでは中間層である①〜④からの出力を使用します。

CNNの中間層

猫の画像をこのCNNに入力し、中間層の出力を可視化すると次のようになります。
猫画像を入力した時の中間層
①~④は、上のVGGの図と対応します。中間層はもっとチャネル数が多いですが、その中から3つのチャネルの画像を選び出して描いています。
CNNの場合、深い層まで進んでも空間的な位置関係は保たれる(④の場所でもかろうじて猫にみえる)ことは重要です。④で左上の方にある出力は、入力画像でも左上の方の特徴を表しています。これは、CNNが画像のローカルなフィルタ操作を繰り返しかけていることに起因する特徴です。

Deep Neural Networkは層が進むにつれて、タスクにとって重要な特徴量を強調するように情報処理が進んでいくと言われています。
そのことを④の512*32*32のデータのみを使って入力を復元することで、調べてみます。
④からの復元
この絵から分かるのは、まず、CNNを10層以上進んでも、元画像のかなりの情報が残っているということです。一方で、色合いや質感は、元画像から少し変わっています。このことは、もともとこのCNNが物体認識のタスク用で、多少色合いや質感が変わっても物体は同じ物体とみなしてほしいため、その情報を、形などの情報と比較して相対的に弱めているからと考えられます。
本研究のアイデアは、この情報が弱まっている部分を、別の画像の画風に置き換えてやれば、コンテンツ画像の形状を保ったまま別の画風に画像を変換できるのではないか、ということになります。

スタイル行列

画風の情報を表現するために、スタイル行列という概念を導入します。これがこの論文の一番のポイントです。
この行列は、同じ中間層の各チャネル間の相関を計算したものです。入力画像で言えば、チャネルはRGBの各色に対応するので、赤と緑の相関など、つまり「画像全体でどんな色が使われているか」という情報を表すことになります。もう少し層が進めば、「どれくらいの太さの線で書かれているか」といった情報を取り出すことが出来、より深い層で統計すると「どの色とどの色が隣り合って描かれやすいか」「どのようなテクスチャが使われているか」といった情報が反映されると考えられます。

猫画像における、VGGの①〜④の各中間層でスタイル行列を計算したものを可視化すると、以下のようになります。
cat_style
この行列の2行3列目は、チャネル2とチャネル3の相関をとったものになります。
ここに、色合い、筆のタッチなどの画風情報が埋め込まれることになります。

目的関数

中間層④の出力をコンテンツ画像と同じようにしつつ、スタイル行列はスタイル画像と似せてやることで、ゴッホ風猫画像を生成できると考えられます。
すなわち、このアルゴリズムで最小化したい目的関数は、
中間層のコンテンツ画像とのズレ + スタイル行列のスタイル画像とのズレ
という形になります。

前者のコンテンツ画像とのズレは、物体のおおまかな配置や形状が合うようにしたいので、抽象的な情報が抽出されてる深い層で値の差を測ります。ここを浅い層で差をとってしまうと、ピクセル単位の細かいズレに鋭敏になってしまい、大胆な画風の変更が出来なくなってしまいます。

後者のスタイル画像とのズレは、浅い層でも深い層でも差を測ります。細かい筆のタッチのような情報は浅い層で、大きめの空間パターンは深い層で取り出すという狙いです。

画像の更新則

目的関数が定まったので、あとは確率勾配降下法などで最適化を行います。
画像をCNNに通して中間層を求める処理、中間層の相関を計算する処理、コンテンツ画像・スタイル画像とのズレを計算する処理はすべてChainerのFunctionで書かれているので、backward()を呼び出すだけで各パラメタを動かすべき方向を計算できます。

一般のニューラルネットの学習と異なるのは、動かすパラメタがニューラルネットの結合荷重ではなく、入力画像の方だということです。今回のアルゴリズムではニューラルネットは固定されています。
入力画像はまず乱数で作ったノイズ画像からはじめて、backwardで計算した勾配を利用して最適化していきます。chainer-goghでは、ニューラルネットの学習によく用いられるAdamを使って最適化しています。この部分も、ChainerのOptimizer機能を使えば、update()を呼ぶだけでパラメタの更新をやってくれます。
更新されていく猫

画像が生成されていく様子を動画にしてみました。まずスタイル画像の模様を全体に描いて、それを少しずつコンテンツ画像にマッチするように変化させていくという描画方法をするようです。おそらく、スタイル画像とのズレのほうが浅い層から誤差が伝搬してくるので、先に最適化されるのだと考えられます。

結果の分析

さて、本当にこのゴッホ猫が、中間層出力がコンテンツ画像と似つつ、スタイル行列はスタイル画像と似ている、という状態になっているのかを確認してみましょう。

まず、猫画像の中間層出力とスタイル行列を再掲します。
cat_cnn

cat_style

次に、ゴッホ画像です。

gogh_cnn

gogh_style

最後に生成したゴッホ猫です。

goghcat_cnn

goghcat_style

ちょっとわかりづらいですが、中間層④の出力は、ゴッホよりも猫に近いこと、そしてスタイル行列は①〜④まですべてゴッホの方に近いことが確認できます。こうして、形状をコンテンツ画像から、画風をスタイル画像から受け継いだ画像が誕生したわけです。

おわりに

画像の自動生成は、Deep Learning研究者の一つの夢であり、多くの研究者が研究しているテーマです。
現在成功しているアプローチは大きく分けて2つあります。

まず1つ目は、オートエンコーダー(画像を低次元のベクトルに符号化するNNと、符号から画像に戻す復号NNを両方同時に学習する)を使う方法で、訓練データの画像が符号の空間で正規分布のようなきれいな分布をしていれば、逆に符号側を正規分布からサンプルし、それを復号NNで画像化してあげれば、それっぽい画像が生成されるだろうという発想です。VAEやAdversarial networkを使った研究が有名ですが、このアプローチは”もやっと”した画像が生成される事が多く、手書き数字や顔画像の生成はうまくいっているものの、より大きく複雑な画像生成はそれほど成功していません。
Adversarial
Adversarial networkで生成した自動車、動物、船

2つ目のアプローチは画像を反復的に改良していく方針で、物体認識NNが「犬」と判断するような方向に入力画像の方を動かしていけば犬の画像が描けるだろうという発想になります。ちょっと前に流行ったDeep Dreamがこれにあたります。
しかし、あれは”もやっと”はしていなくても、グロテスクな画像を生成してしまう傾向にありました(まだ見たことない人はDeep Dreamで検索してみましょう)。これは、自然な画像とは似ても似つかなくても、物体認識NNを騙せてしまうことに原因が有ります。

今回紹介した研究は2つ目のアプローチですが、Deep Learningを使って”もやっと”もグロくもない画像を生成することができます。もちろんコンテンツ画像とスタイル画像を入力に必要としているので全自動ではないのですが、コンテンツ画像は深い層の出力のみ、スタイル画像はスタイル行列のみしか情報を使っていないので、画像の完全自動生成に一歩近づいたと言えるのではないでしょうか。今後の発展に要注目です。

怪我をしても歩ける6足歩行ロボットの学習

KumeAyaka

2015-08-31 17:34:43

こんにちは。コロンビア大学の久米です。7月からの2ヶ月間、ロボットと機械学習をテーマにインターンをしました。この記事は先日、ustreamで発表した内容のダイジェスト版となっています。

インターンでは、6本脚ロボットが脚を失ってもすぐに新しい歩き方を学習する方法の実装を行いました。具体的にいうと、Natureで2015年に発表された、Robots that can adapt like animals(PDF)の再現実験です。ロボットの組み立て、シミュレーション(事前学習)、手法の実装、実験をしました。

下の動画を御覧ください。6本脚ロボットは、6本の脚を使って歩行します。左側の動きが通常時の動き方です。歩行中、脚を一部失ってしまうこともありえます(下の写真)。そうすると右側の動画のように同じように脚を動かすだけでは、前向きに歩くことができなくなってしまいます。

今までの方法では、ロボットが脚を損失した状態で前進する歩き方を見つけるためには、事前に色々な状況に対して歩き方を設定しておくか、学習するとすればたくさんの時間がかかっていました(強化学習など)。
提案手法では、脚がなくなってしまっても数回から数十回程度の試行で前進する方法を発見することができます。下の方に結果を掲載していますが、実際に実験してみると、1本脚の先がなくなったり、2本の脚が動かなくなっても、5種類の歩き方を試しただけで前進の方法を発見しました。

手法のコンセプトは次のような感じです。
まずは、健康な状態の時に色々な歩き方を試しておきます(事前学習)。上手く前進できなくなった時には、事前に覚えていた歩き方の中からいくつか試して、良い方法を発見します(Adaption step)。

propose

事前学習

実際の歩き方は36個のパラメーターを指定して決定するので、歩き方は膨大に存在します。
色々な状況に対処するためには、ただ良い歩き方を記憶するだけではなく、色々な状況に対して良い歩き方を記憶する必要があります。論文では「各脚の着地時間」をその指標にし、パフォーマンスのマップを作成しています。つまり、各脚の着地時間という6次元の値に対して、着地時間も5通りに離散化して、各脚0%,25%,50%,75%,100%に分類し、合計で15625通りの状況を想定します。

下の図が、このマップを2次元に表したもので、脚1と2の着地時間によって、大きい四角形の場所が決まり(左下ほど着地時間が少ない)、3と4の着地時間によって、各大きい四角形の中の小さな四角形の場所を決定、5と6については小さい四角形の中の場所を決定します。
各脚の着地時間に応じて場所が決定し、そこにパフォーマンスとパラメーターを記憶していきます。

map

jizeng

事前学習のやり方
  • 一つの歩き方を試す
  • 歩き方の距離(パフォーマンス)と各脚の着地時間(状況)について計測する
  • その状況の距離が今まで記録されていなければマップに記録する。記録されていても、今回の方がパフォーマンスが良ければ記録を上書き、悪ければこの歩き方は捨てる
  • 今までに記録されている歩き方を少し変化させて歩き方を試す(上に戻る)

何千万回もの試行が必要なため、事前学習は実機ではなくシミュレーション上で行います。

事前学習の結果

シミュレーションは、Open Dynamics Engine(ODE)という物理シミュレーターを使って行いました。

私は実際に 5188万4543回のシミュレーションを行って、マップを作成していきました。
Amazon AWSを使って並列実行し、10日間位で学習しました。

params
この図は、横軸がシミュレーション回数で、縦軸がマップの中で埋まったマスの個数です。
仮に全部埋まったとしたら15625マスですが、新しいパラメーターを既存のパラメーターから作っていくことと、動きようがない部分(0,0,0,0,0,0)なども存在するので全部は埋まりません。
result1

これらが、マップの途中経過です。回数の下の数字は最大値と平均値です。図は、最終マップの最大値を1(赤)とした時のそれぞれのマスのパフォーマンスを示しています。初めの1000万回くらいで、マップのマスの数自体は増えなくなりますが、パフォーマンスは向上しているのがわかります。

Adaption step

mboa4
実際にロボットが壊れてしまった時には、マップの中から新しい歩き方を試します。
その時には、今歩いている方法はあまり良くないので、それに似た歩き方を避けて、かつパフォーマンスが高そうな歩き方を探していきます。

mboa3
(論文より引用)

初めは壊れたロボットでの歩き方については、実際には試していないため確信度は全て最低レベルで、パフォーマンスは事前学習の時の値です。
一度実際に歩くと、マップ上で既に観測された歩き方に近い歩き方は、確信度が高くなっていき、それと同時にパフォーマンスも観測された値に応じて更新されていきます。マップの更新にはBaysian optimizationを使います。

実験結果

最後に、実験結果の動画です。

動画の見方

脚(6個の数字): 動画の歩き方において各脚がマップの中のどこにいるかを示しています。
各脚0-4までの数字。(着地時間 0%:0 25%:1 50%:2 75%:3 100%:4)

パフォーマンス:計測した値

期待MAX:更新されたパフォーマンスマップでの最高値

パフォーマンスマップの1.0は事前学習での最高値(0.17)。
色々な歩き方を試すうちにマップがどんどん下方修正されていきます。

確信度は青ほど低く、実測されると赤色になっていきます。

最後の方にでてくる相対的パフォーマンスマップというのが、ロボットがその時に持っているパフォーマンスマップの最大値を1としたときのパフォーマンスマップです。

このように、わずか数回の試行で、前進方法を学習することができました!2つ目の実験のように、実際には1回目で良い歩き方を発見した場合でもまずは、もっと良い歩き方がないか探します。調べているうちに全体のパフォーマンスが更新されていって、期待されるパフォーマンスが下がってきて、一回目の歩き方が良い歩き方だということが発覚します。

事前学習のシミュレーションの精度はどうしても完璧というわけにもいかないのですが、それでもこのように成果がでました。
この手法を用いれば、状況が変わった時に、改めて学習をするのではなく、理想的な状況(シミュレーション)にたいして学習を行えば、すぐに色々な状況に対処できるため、常に人間の監視下にいるわけではないロボットに対して応用できれば、突然の事故などに対応できると思います。

ICML2015読み会を開催しました

大野 健太
エンジニア

2015-08-31 08:31:28

大野です。夏も終わりますね。

先日8月20日に、株式会社ドワンゴ様のセミナールームにて、ICML2015読み会を開催いたしました。

トップレベルの会議に投稿された論文を真正面から紹介する勉強会でしたので、どの位の方々が興味を持つのか不安がありましたが、幸いにも前回のNIPS2014読み会に引き続き、100名近くの方に参加していただきました。休憩時間も含めて多くのディスカッションや質問がなされていたようです。懇親会にも40名近くの方々が参加していただきました、懇親会では、発表もしていただいた神嶌さんによるKDDの参加報告も行われました。

また、今回初めての試みとして、当日の様子をドワンゴ研究開発チャンネルにて生放送配信しました。私の予想をはるかに超えて、のべ1000名弱の方が来場したようです。ご視聴いただきありがとうございました。配信に関する感想なども今後の参考にさせていただきます。

参加者、発表者、視聴者の皆様のご協力で充実した勉強会になったと考えております。ご参加いただきありがとうございました。また、会場提供及び生放送配信をしていただいたドワンゴ様には改めてお礼を申し上げます。今回の勉強会を踏まえて、今後も機械学習の勉強会を継続して開催していきたいと考えておりますので、ご賛同・ご協力いただけると大変ありがたいです。

アンケート結果

続きを読む »

機械学習の経済学:クラウドはIoTの夢を見るか

hido
Chief Research Officer

2015-08-21 07:16:37

比戸です。夏の思い出、もう作りましたか?

今回はPreferred Networksのポジショントークをします。と言っても、ディープラーニングではなく、Internet of Thingsのほうです。

前回IoT関連のブログ「のび太とインターネット・オブ・シングス」を書いてから1年半弱、枯れたバズワードどころか、IoTはあらゆる業界を巻き込んだムーブメントになりつつあります。ちょうど昨日発表された、ガートナーの2015年度版ハイプサイクルでも、去年に続きハイプカーブの頂点に位置付けられていました。

IoTではコネクションとデバイスの管理、プロトコルの互換性、セキュリティについての議論が盛んですが、それは脇において、我々はいつも通りデータ解析の話をしたいと思います。 興味は「クラウドコンピューティングはIoT向けデータ解析でも唯一の主役となるのか?」です。 結論はずばり「そんなにうまくはいかないよ、特にインダストリアルな、機械学習頼みの応用ではね。」です(ほら、ポジショントークっぽくなってきた)。

続きを読む »

巨人たちが語るディープラーニングの未来(翻訳記事)

hido
Chief Research Officer

2015-08-12 11:37:56

比戸です。スムージーの美味しい季節ですね。

今回は「ディープラーニングの未来」というパネルディスカッションに関するブログの翻訳をお送りします。この業界の有名人が多数参加していて、とても興味深い内容だったため、日本のコミュニティでも共有できたらと思ったのです。

それは2015年7月に開かれた機械学習の国際会議・ICML内のDeep Learning Workshopの企画でした。元記事はワークショップ主催者のKyunghyun Cho氏のBrief Summary of the Panel Discussion at DL Workshop @ICML 2015です。ご本人の許可を得られたので、以下に日本語訳を掲載します。なるべく原文に忠実に訳したつもりですが、分かりづらい部分は意訳が入っているため、もし誤りがあればご指摘下さい。

— ここから翻訳

<はじめに>

ICML 2015で開かれたワークショップのフィナーレは、ディープラーニングの未来についてのパネルディスカッションだった。数週間に及ぶワークショップ主催者間のメール往復と議論の末、我々は以下の6人のパネリストを招いた。

続きを読む »

Deep Learningと音声認識

preferred

2015-07-16 13:00:10

西鳥羽です。こんにちは。

本日セミナーで「Deep Learningと音声認識」という内容で(ustreamで公開されているけども)社内セミナーで紹介させて頂きました。タイトルは前回の「Deep Learningと自然言語処理」に被せてます。

Broadcast live streaming video on Ustream

こちらがその資料になります。尚、セミナーでは「話し言葉コーパス」とすべきところを「書き言葉コーパス」としてしまっていました。資料では訂正してあります。

また、個々の参照は以下の通りです。

CTC関数に関しては以下が詳しいです。Chainerで実装してますがちゃんと動くようになったら公開したいですね。

分散深層強化学習でロボット制御

mattya

2015-06-10 16:50:33

新入社員の松元です。はじめまして。

“分散深層強化学習”の技術デモを作成し、公開いたしました。ロボットカーが0から動作を学習していきます!
まずはこの動画を御覧ください。

以下で、動画の見どころと、使っている技術を紹介します。

動画の見どころ

Screen Shot 2015-06-10 at 1.09.41 PM
Car 0(○の付いている車)が右折カーブの手前で減速する様子(右画面の白いバーのところが、ブレーキのところで赤くなっている。ニューラルネットはブレーキが最も多く報酬が得られると推測していることがわかる)。速い速度ほど報酬は大きいが、カーブを曲がりきれず壁にぶつかってしまうので学習が進むとカーブ手前でのみ減速するようになる。

Screen Shot 2015-06-10 at 1.18.49 PM
目の前に車がいるときは一時停止して、いなくなってから加速する。
エチオピアには本当にこのような交差点があるらしい。

Screen Shot 2015-06-10 at 1.22.24 PM
ぎりぎりですれ違う2台。学習途中ではすれ違いきれずにぶつかって倒れてしまうこともある(早送りシーン中に人が写っているのは、倒れたり詰んだりするたびに起こしていたためです)。

この動画で使われている技術について少し解説をしたいと思います。

強化学習

このデモにおけるロボットは、強化学習という手法で学習しました。
よくあるロボットの制御では、ある状況でどの行動をとるべきかのルールを人間が作り、そのルールに従って制御を行ったり、ロボットの取るべき軌道を予め人間が設計しておいて、その目標とのズレが最小になるように制御を行います。しかし、あらゆるシチュエーションに対してとるべき行動を設計するのはとても大変です。それに、臨機応変に軌道を変更することができません。
そこで、強化学習では、目標とするロボットの最適な動きを正解として与える代わりに、ロボットの各行動に対して報酬を与えます。今回の課題では、道にそって速い速度で進んだときにプラスの報酬を、壁や他の車にぶつかったり、道を逆走したときにマイナスの報酬(罰)を与えています。
ロボットはどのように行動するとどれくらいの報酬が得られそうかを学習していき、最も多くの報酬が得られそうな行動を選択することで、結果的に最適な行動をとることができるという仕組みです。これによって、「障害物が何mの位置に来たら、ハンドルを何度に回す」みたいなルールを人間が設計しなくても、自然とそのような行動を獲得してくれるわけです。

センサー

ロボットはセンサーを使って自分の今の状態を認識します。
Screen Shot 2015-06-10 at 10.45.28 AM
このデモでは、車は周囲32方向に仮想的なセンサビームを飛ばしていて、壁、他車、道路の中心線までの距離と角度を取得しています(図のcar 0が出している黄色い線がビームを表している。正確には遠距離センサ16本と近距離センサ16本に分かれている)。現実の自動運転車に搭載されているレーザー距離センサーをイメージしています。
そのセンサ情報に現在速度とハンドル位置、直近3ステップの自車の行動を加えて、合わせて273個の数を入力として受け取ります。右上のグラフにそれが可視化されていますが、車はこの情報だけから、今どの行動(アクセル、ブレーキ、左右ハンドル、バック)を取るべきかを決定しなければなりません。このような多様かつ多数のセンサ情報をうまく統合して適切な判断を行う問題はセンサフュージョンと呼ばれていて、これからのスマートデバイスや機械制御などに必須となる技術と考えられています。

ちなみに、学習開始時点では、ロボットはどのセンサ入力が何の入力を表しているのか、どの行動がどういう結果をもたらすのかを全く分かっていない状態から始まります。人間は「壁との距離」とか「アクセル」とか言われればその意味を理解できますが、ロボットは、まずはそこから学んでいかないといけないというハードな問題設定です。

Q-learning

強化学習には様々なアルゴリズムがありますが、今回はQ-learning + ε-greedyというベーシックな手法を使いました。
Q-learningでは、ある状態sである行動aをとったときに、将来にわたってどのくらいの報酬が得られそうかを表す関数Q(s, a)を学習します。
もし、Qが完全にわかっていたなら、状態sで取るべき行動は次のようにして決定できます。
行動の候補a1, a2, …があったとして、Q(s, a1), Q(s, a2), …を求め、最もQが大きくなったaを選ぶ。
Q関数は将来に渡る報酬の期待値をあらわすので、その行動が最も多くの報酬を生むことになります。

しかし、学習の開始時点では、Q関数は全くわかっていません。そのような状況では、Qが最大になるaを選んだとしても、それが最適な行動である保証は全くありません。Q関数を学習するためには、いろいろなシチュエーションを体験して、ある行動がどのくらいの報酬に結びつくのかを学ぶ必要があります。そのために、最初はランダムに動いて経験を貯めます。ある程度学習が進むと、(学習中の)Q関数が最大になるような行動が、そこそこ良い行動を表すようになっていきます。
そこで、ある割合εでランダムな行動を、1-εでQが最大になるような行動を選択します。これをε-greedy法といいます。「基本的には現在把握している最善の行動をとって、ときどき違うことも試してみる」というイメージです。

Deep Reinforcement Learning

Q-learningは古くから使われている手法ですが、昔は小さいサイズの問題にしか適用できていませんでした。例えばロボットが直面する状態が100通りしかなくて、行動も5通りしかないとしたら、Q関数は、100*5の表を埋めていくことで学習できます。Q(s, a)は表のs行a列目になるわけです。
ここで、状態1番のときに行動3番をとったら、10点の報酬がもらえて、状態が20番に移ったとしましょう。このとき、Q(1, 3) (状態1で行動3をとったときに将来得られそうな報酬の期待値)は、10 + max{ Q(20, a) }と考えることができます。10は今得られた報酬で、max{ Q(20, a) }は次の状態20のときに、現在わかっている最善の行動をとったときに得られる将来の報酬期待値になります。そこで、Q関数をあらわす表の1行3列目の値を10 + max{ Q(20, a) }に近づけます。この操作を繰り返すことで、この表は次第に正しいQ(s, a)に近づいていきます。

さて、今回のロボットは273成分の入力を受け取ります。これがロボットの認識する状態になるわけですが、各センサの値が0か1だとしても、2^273 ~ 10の82乗もの状態数になります。Q関数を表で表すならこれだけの数の行数が必要になりますが、とても不可能です。

そこで、表を使う代わりに、状態sを与えたら各aに対するQ(s, a)を出力するようなニューラルネットワークを使います。近年のDeep Learning(深層学習)技術の発展により、画像データのような数万成分の入力から、数千成分の出力を出すような巨大なニューラルネットが学習可能になりました。強化学習分野にDeep Learningを適用して有名になったのが、DeepMind社の発表したAtariのゲームをプレイする”DQN”(Deep Q-Network)です。
参考:昨夏のインターンでDQNの再現と改良に取り組んだ。
http://www.ustream.tv/recorded/53153399

今回の問題では273成分から5成分への7層(273-600-400-200-100-50-5)のニューラルネットを用いました。図の左下の白と赤のバーが、ニューラルネットの出力したQ(s, a)になります。

Screen Shot 2015-06-10 at 12.57.37 PM

学習には、もちろん、昨日発表したあの、Chainerが使われています!!!Chainerサイコー!!

ニューラルネットが入力をどのように変換していくのかを解析することは容易でないですが、出現しない状態を見ないようにしたり、よく似た状態をひとまとめにするなどして効率的に情報処理を行っていると考えられます。この性質により、見たことがない状態に直面しても、そこそこ適切な答えを返すことが出来るという力(汎化能力)を持ちます。
動画中で突然現れた障害物にも対応できているのは、この能力のおかげと言えます。
Screen Shot 2015-06-10 at 1.29.09 PM
四角い小さな障害物がランダムに存在していた環境で学習したら、丸い大きな障害物が突然現れる環境にも汎化して適応することが出来る。

Deep Learning のフレームワーク Chainer を公開しました

beam2d
リサーチャー

2015-06-09 15:09:35

こんにちは、得居です。最近は毎晩イカになって戦場を駆けまわっています。

本日、Deep Learning の新しいフレームワークである Chainer を公開しました。

Chainer 公式サイト
GitHub – pfnet/chainer
Chainer Documentation

Chainer は、ニューラルネットを誤差逆伝播法で学習するためのフレームワークです。以下のような特徴を持っています。

  • Python のライブラリとして提供(要 Python 2.7+)
  • あらゆるニューラルネットの構造に柔軟に対応
  • 動的な計算グラフ構築による直感的なコード
  • GPU をサポートし、複数 GPU をつかった学習も直感的に記述可能

ニューラルネットをどのように書けるか

次のコードは多層パーセプトロンの勾配を計算する例です。

from chainer import FunctionSet, Variable
import chainer.functions as F

# 多層パーセプトロンの定義
model = FunctionSet(l1=F.Linear( 784, 1000),
                    l2=F.Linear(1000, 1000),
                    l3=F.Linear(1000, 10))
def forward(x_data, y_data):
    x, t = Variable(x_data), Variable(y_data)
    h1 = F.relu(model.l1(x))
    h2 = F.relu(model.l2(h1))
    y  = model.l3(h2)
    return F.softmax_cross_entropy(y, t)

# 勾配計算
x_data, y_data = ...            # ミニバッチを初期化
loss = forward(x_data, y_data)  # 順伝播
loss.backward()                 # 逆伝播

ここで x_datay_data はともに NumPy または PyCUDA の配列です。順伝播の処理をそのまま書けば、あとは最終的な結果に対して backward 関数を実行することで、それまでに行った処理と逆順で誤差逆伝播が実行されます。この例はもっとも単純な例なので現れませんでしたが、順伝播の処理には分岐やループなど Python の制御構造を自由に含めることができます。

なぜ今新しいフレームワーク?

Deep Learning のフレームワークとしては Caffe, Theano/Pylearn2, Torch7 の 3 つが人気です。これらはフィードフォワードなネットワークを書くことが基本的な目標として開発されています。ですが、最近では Deep Learning の進展に伴い、より複雑なネットワークを柔軟に書けることの必要性が高まっています。そこで、この中でも特に自由度が高い Theano をベースに、新しいフレームワークがたくさん模索されています(例:Blocks, Keras, Lasagne, deepy など)。

これらのフレームワークを含め、既存の実装のほとんどは、一度ニューラルネット全体の構造をメモリ上に展開して、その処理を順に見てその通りに順伝播・逆伝播を実行するというアプローチを取っています。これは、独自のミニ言語に対するインタープリタを実装しているようなものです。例えば Caffe ならば Protocol Buffer で定義されたスキーマがミニ言語に対応します。Torch7 の場合には、コンテナと呼ばれる特殊なモジュールが制御構造の役割を果たします。Theano はより柔軟な定義が可能ですが、ループを書くために scan と呼ばれる特殊な機能を使います。このアプローチにおいて、より複雑な計算フローをサポートしようと思ったら、基本的にはこのミニ言語を拡充していく必要があり、学習コストや記述コストは高くなっていきます。基本的には今後、ニューラルネットの構造はさらに複雑化していくことを考えると、この展開は好ましくありません。

Chainer はこれとは異なるアプローチを取ります。Python をベースとしていますが、Theano は使いません。制御構造はすべて Python のものがそのままつかえます。Chainer は、実際に Python のコードを用いて入力配列に何の処理が適用されたかだけを記憶しておき、それを誤差逆伝播の実行に使います。このアプローチは、複雑化していく Deep Learning の研究・開発速度を保つために必要だと考えており、私たちが新しいフレームワークの開発に乗り出した理由です。

使い方

ドキュメントも同時に公開しました。チュートリアルとリファレンスを提供しています。チュートリアルでは、基本的な多層パーセプトロンの書き方から、リカレントネットの書き方、GPGPU の利用法などを紹介しています。今のところドキュメントはすべて英語のみとなっていますが、要望が大きければ日本語への翻訳も検討します。

また、公式リポジトリ内の examples ディレクトリの中にサンプルがいくつか入っています。こちらは、実際にデータの読み込みから学習までを Chainer で書く方法を知るのに適しています。

質問やバグ報告

Chainer はまだ公開されたばかりのフレームワークで、機能面ではまだまだ足りない部分もあります。PFI/PFN の Chainer 開発チームでは、これから継続的に開発を行い、定期的に新しいバージョンをリリースしていく予定です。プルリクエストも受け付けます(今のところ Contribution Guide のような文書はありませんが、今後用意する予定です)。

使用法やバグについての報告も随時受け付けます。使用法の質問については、Google Groupsを開設しましたので、こちらに投稿してください。また、バグの報告や修正については、GitHub の Issue やプルリクエストを登録していただければと思います。GitHub のアカウントをお持ちでない場合は、Google Groups へ投稿していただいても構いませんし、Twitter アカウント (@ChainerOfficial)にメンションを送って頂いても対応可能です。

12345...