CodeIQ MAGAZINECodeIQ MAGAZINE

Chainer v2.0 αで拡張された機能とは?──ニューラルネットワークを実装するためのライブラリ「Chainer」を学ぼう!

2017.03.24 Category:勉強会・イベント Tag:

  • 43
  • このエントリーをはてなブックマークに追加

Preferred Networksが開発したニューラルネットワークを実装するためのライブラリ「Chainer」。2月23日、Chainer v2.0αがリリースされた日の夜、第4回目のMeetupが開催された。その様子をリポートする。 by 馬場美由紀 (CodeIQ中の人)

Chainer v2.0ではどんな機能が拡張されるのか

今回のイベントのメインセッションは、この日最後に登壇した得居誠也さんによる「Chainer v2.0 α リリースについて(仮)」。Chainer v2.0 αがリリースされた約4時間後の発表ということで、参加者たちの関心も高かった。

現在、ディープラーニングのフレームワークは新しい世界に突入しているが、Chainerとは他のフレームワークとの最大の違いは、約1年半前ダイナミックなグラフを作るアプローチを検討していること。

他のフレームワークもようやくそのアプローチをとるようになってきた。Chainerはこのフィールドではパイオニアと言っても過言ではない。今回までの発展の歴史は以下の通り。

2015年6月:v1.0リリース
2015年9月:v1.3(CuPy)
2015年11月:v1.5(Link/Chain、CuPy in Cython)
2016年6月:[MinPy]
2016年7月:v.1.11(Trainer)
2017年1月:[PhTorch、TensorFlow Fold]
2017年2月 v2.0αリリース

またv2.0αと共に、以下もリリースされる。

  • ChainerRL(beta):Reinforcement learning(強化学習のライブラリ)
  • ChainerMN(to apper):分散環境におけるChainerでの学習ネットワーク

まだ具体的なリリース日は決まっていないが、なるべく早く出す予定だ。このようにChainerは機能が増え、ツール群も拡充している。

3月中にはβ版、そして4月にv2.0.0をリリースする予定となっている。v2が正式リリースされるまでは、v1の現行のChainerの開発は続ける。

しかしv2がリリースされるとメインストリームの開発はv2にシフトし、それ以降、v1はバグフィックスなどをするのみとなる。

続いてv2.0αの使い方を紹介する。インストールは従来までのpip install chainerではなく、pip install chainer --preと書くこと。また一番、大きな変更として、CuPyが別パッケージとなること。

CuPyはGitHubにリポジトリがあるが、先述したようにChainerのv1開発は続けるので、今はまだCuPyをChainer v1のリポジトリで開発されることになっている。

GPUを使いたい場合は「pip install cupy」でCuPyをインストールすること。あとの使い方は基本的に同じだ。

その他の変更点として、Unified Configurationでは「chainer.config」と「chainer.global_config」というオブジェクトで一括管理する形になる。

configはスレッドローカルな設定で、global configはプロセスワイドな設定となっている。global configを変更するとすべてのスレッドに影響する。configの設定がなければ、自動でglobal configを読みに行く。デフォルトではconfigは何も設定されていない。

Chainerの組み込みで影響のある項目は以下の通り。

  • debug
  • enable_backprop
  • train
  • tyepe_check
  • その他(use_cudnn,deterministic: to be added)

これまでtrainモードでは今後ユーザーはフラグを自分で管理する必要がなくなる。自分で変更するときは、次のようなプログラムを書けばよい。デバッグモードについても同様に処理できる。

あとは細かい話で、APIが削除されたり変更されたりしているが、この辺はリリースノートを参照してほしい。

今後、1カ月後にβ版、2カ月後に製品版をリリースするが、そこで考えている大きめの変更を紹介する。

まずはOptimaizerへの変更。この変更が入るとパラメータごとにアップデートルールというオブジェクトが付くようになる。パラメータごとに学習レートやフックファンクションなどが設定できるようになる。

次にUninitialized variableという機能の強化。そしてvolatile flagという機能については削除される予定となっており、グラフを作らないという挙動はconfig flagで制御するようになる。

さらに、PyCharm-freindly Link/Chain APIsという明示的にattributeを代入するような構文で登録できるAPI発行を加えようとしているそうだ。

画像を入れただけで着色できる線画着色Webサービス「PaintsChainer」

今回のMeetupではChainerに関連したLTも行われた。最初のLTはPFNのChainer開発チームの米辻泰山さんによる発表。タイトルは「PaintsChainerについて」。米辻さんは16年5月半ばにPFNに入社。同年、アマゾン・ピッキング・チャレンジのハードウェアのメカニックとして参加している。

PaintsChainerとは、画像を入れると着色できる「線画着色Webサービス」。サービスを開始してから、非常に反響を呼んでいる。イラストレーターの中には着色ツールとして使いこなしている人もいる。

このサービスをどうやって作ったのか。OpenCVからイラスト画像から線画を抽出、そしてその逆をキャラネットワークに学習させるという教師付学習をさせるという方法を行った。

教師と正解のセット、つまり線画と着色済みのセットが必要になるため、着色済みの線画から頑張って抽出することにした。

ネットワークの形はU-netを採用。テストデータを回してみた結果、「肌色はわかるけど、それいがいは分からない」という結果に。そこでアドバーザリアル・ネット(アド婆)を使うことに。

アド婆は本物の画像とニューラルネットワークが着色した画像の差を学習して、指摘をしてくるというもの。再構成ロスとGANロスの比率をいろいろいじったり、ファインチューニングしてみることで、色がうまく付けられるようになった。

そこで128pxの着色結果を基により、2段目でより高解像度(512×512px)を着色するネットワークも学習させることに。2段目は時間がかかり、不安定になるため、Adversarial Networkを使うことはやめた。

現在、Webサービスとして公開していてソースコードもGitHub上で公開。さらに学習済みモデルの公開している。ローカルに構築してくれた人もいる。公開したところ、これまで経験したことないぐらいバズった。今は1カ月で250万PV。ユニークアクセスで95万UU。ユーザーは日本人が一番多くて全体の35~36%。一時期、中国人ユーザーが50%超えているときもあった。アメリカ、香港、ベトナムなど10カ国で記事になっている。

今後の展望は、より使いやすくしていくこと。また動画もできるようにしたいし、アプリも作りたい。課題はモデルの調教。ここでもう少し細かいところをできるようにしたいとのことだ。

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

続いては、PFN藤田康博さんによる「ChainerRL について」。ChainerRLとは深層強化学習(Deep reinforcement learning)のライブラリ。2月20日よりGitHubで公開されている。

ChainerRLによる強化学習とは、エージェントが環境とのインタラクションを通じて報酬を最大化する行動を学習するというもの。そこでまず、環境を定義する。環境を初期状態にリセットして、最初の観測を返す。

そしてエージェントからのアクションを受け取り、次の観測と報酬とそのインタラクションが終了したかどうかというフラグを返す。これで環境の定義が完了する。

次にChainerによって学習するモデル(Q-functionやPolicy)を定義する。Q-functionとはエージェントが取る各行動の価値を予測するネットワークである。ポリシーは行動の確率分布を返す関数である。

作ったモデルとChainerのオプティマイザー、アルゴリズムごとに必要なパラメータなどを渡してエージェントを作る。エージェントはアルゴリズムごとに定義。そしてインタラクションのループをベタに書き、ひたすら回すことでエージェントの学習ができる。

ChainerRLのクイックスタートガイドを用意しているので、興味のある人はぜひ、動かしてほしい。ChainerRLはまだβ版。改善してほしいフィードバックはもちろん、欲しい機能やアルゴリズムなどの意見も求めていると語った。

遺伝研スパコンでChainerを使いたおして溜まったノウハウ紹介

続いてのLTはシステム計画研究所の北島哲郎さんによる「遺伝研スパコンでChainer」。北島さんはAI関係の案件を受託・共同研究のスキームでやっている。最近は主にAI×(bio)informaticsの分野を担当している。

大学共同利用機関法人 情報・システム研究機構 国立遺伝学研究所(国立遺伝研)は、遺伝情報の解析に適したスーパーコンピュータを設置しており、アカデミアに対して無償で公開している。同スパコンは民間企業の所属している人でもアカデミアとの共同研究であれば一部有料化されるところもあるが、ほぼ無料で利用可能だ。

スパコンといえば、巨大規模の計算を高速で処理するもの。入力データ量自体は少なく、計算量が多いタスクに使うことが一般的だ。例えばMD(分子動力学計算)のインプットは通常KBから高々MB単位。その他計算タスクもデータ量は少ない傾向にある。なので通常スパコンは大容量データの扱いが不得手なサービス設計になっていることが多い。

例えばFOCUS(計算科学振興財団)のスパコンではストレージ10GBにつき月額300円で、1TBのストレージを借りると月額3万円にもなる。しかもこれに計算コストがかかる。

遺伝学計算はデータ量が多い。足回りの良いストレージが大容量必要なため、遺伝研ではデフォルトで1人1TB、1教室当たり30TBまで無料で使える。これはディープラーニング向きというわけだ。遺伝研スパコンのハードウェア構成は次の通り。

GPU積んでいるのは小規模ノードだけで、大規模な前処理は他のノードを活用している。GPUインスタンスは次の通り。

1ノードにつき1GPUとなっており、現時点では複数ノード連携した処理は不可能である。したがって分散版Chainerも使えない。1GPUで追いつかない場合は、よそのマシン(東工大のTsubame2.5やさくら高火力、AWS、Azureなど)を使うことになる。

Chainerを遺伝研でと考えている人は多いが、社内環境と感覚を合わせるため、Anaconda環境上にcuDNNをインストールした。そして環境変数を設定してcuDNNのパスを通し、GPUノード上でChainerをインストールする。ここが重要となる。

本番ジョブを処理するには、ホームストレージを共有し、環境は独立したノードとする。実行先ノードにスクリプトを転送し、起動する。この辺りの管理は自動的にやってくれる。スクリプト内でcuDNNにパスを通す必要があるが、それ以外は個別タスクごとに考えればよい。

タスクを組むときの要注意点は、メインのファイルシステムを直接読むと遅いこと。そのためシーケンシャルの読み書きは早いのですが、ランダムアクセスは遅くなる。ランダムアクセスで使うファイルは/tmpにコピーすること。

また時々GPUタスクがストールすることもある。I/Oに限らず、遺伝研スパコンは安定性が微妙な印象なので、ありとあらゆる処理にエラー検出を入れることも忘れてはならない。

Chainerで会話できるカノジョを作る

4本目のLTはAcroquest Technolgyでデータ分析、ディープラーニングの仕事をしている山本大輝さんの「Chainerを使ったらカノジョができたお話」。

クリスマスに近いある日、毎年彼女が欲しいと思うが、そんなに簡単にできるはずがない。そこでChainerでカノジョを作ることにした。

まずはそもそもカノジョとは何かを定義。理想的なカノジョ=癒やしをくれるもの。そこで必要となるカノジョの要素は会話だと考え、会話ができるカノジョのデータセットを作った。

カノジョを作る方法

1. ニューラルネットワークを作る
  - Neural Conversational Model

2. データセットを作る
  - カノジョ会話用botを作る

3. Slackにのせる(コマンドインタフェースじゃ面白くないので)
  - Slackで実用的なカノジョにする。この辺りについては、12月25日のブログを見ればソースを公開しているので参照してほしい。

Neural Conversation Modelは、Seq2eqをベースとした会話モデル。Seq2seqは翻訳でよく利用されているモデルで、入力の分割は形態素解析を使っている。文章が終わりましたよということを投げると、応答としてWXYZという。これで話しかける文書と回答が返ってくる仕組みができる。

Chainerを使った理由は、動的ネットワークを組みやすい、他のライブラリと比べて、RNNを作りやすい、比較的書き慣れていたということが挙げられる。

データセット作成については、ラノベか何かを読み、手動で会話を集めた。というのも自動でやる良い解法が見つけられなかったからだ。1対1の会話文が1つのデータになっている(連続した会話はできない)。

そして最後に作ったbotをSlackと連携させた。Slack都の連携は難しいイメージがあったが、PythonにSlackを連携させるライブラリがあるのでそれを使った。インストールは「pip install Slackbot」。話しかけるとそれに応じてリプライを返せる仕組みになっている。

本Botの工夫ポイントは、自分の名前を呼んでくれること。そのほかにも「お嫁さんにしてください」とかいろいろ会話がなされるので、少し満足できる。

課題もある。とにかくデータセットが少ない。増やす方法を考える必要がある。また時々、知らない単語が混じると精度が悪化すること。Beam Searchを使うと少し会話の精度が増す。

いずれにしてもChainerを使うとこんな感じで気軽で会話Botを作ることができる。

ディープラーニングでいろいろ遊んでみよう

5本目のLTはネクストの石田陽太さんの「CHAINERフレンズ ディープラーニング、たーのしー!」。石田さんは技術の無駄遣いが趣味。

HOME!’sでもディープラーニング利用し、DCGANでありそうな間取り図を生成するなど、活用しているが、今回はプライベートで遊んでいる事例を発表した。

最初のチャレンジはディープラーニングでおそ松さんの六つ子は見分けられるのか。おそ松さん顔検出器の作成し判別用のデータセットを作るのに、LdibとかOpenCVを用い、Chainerを使ってCNNで判別。約86%の精度で判別できた。思ったより精度が高かった。

次にアニメパートごとに作画監督の判別にチャレンジした。作画監督とはアニメーターが描いたものをチェックし、アニメの全体の作画のクオリティを担保する役割を担う。題材にしたアニメは「SHIROBAKO」。

データセットは被写体に影響されないよう、同一人物、主人公の宮森あおいの顔を学習させた。劇中の宮森のシーンをすべてスクリーンショットし、OpenCVのアニメ顔の検出器で切り取り、作画監督が重複しない話数で分割した。

Network in Networkモデルで4クラス分類。約75%の精度で判別可能だった。詳しくはブログで紹介している(「作画監督 AI」で検索)。

うまくいっていないものもあった。ガルパンの戦車の検出&型式判別にもチャレンジしたが、物体検出器の精度と再現率が低かった。データセット枚数が足りないのが要因だろう。

画像生成系にもチャレンジ。DCGANで新ポケモン生成するという遊びをした。ポケモンGOを国内で捕獲できる142種類のポケモンをすべてゲットし、さまざまなポーズ、アングルかスクリーンショットをとってデータセットを作った。DCGANで生成すると、妖怪みたいなモノが一杯できた。Chainer実装を利用し、キャラ生成に使えるかとも思ったが、あまりきれいには使えなかった。

続いてマリメッコ風のファブリック生成にもチャレンジした。マリメッコとはフィンランドのファッションブランドで、独創的なデザインが特徴だ。まずはデータセットを100枚ぐらい突っ込み、DCGANで生成。色合いは再現できたが、デザインは全く生成できなかったため、pix2pixによる生成することに。線画を抽出してアウトプットに近づけるように学習させた。イラストや画像を基に着色してマリメッコ風にした。

このように自分でデータセットを作ると楽しいことができる、ぜひ、遊んでみてほしい。ただ注意して欲しいのは著作権問題。学習に使うデータセットの著作権だが、著作権法第47の7によると、情報解析を目的に限定するならば既存の著作物も権利処理もなく利用可能だが、公衆に公開するのはNGとなっている。

次に生成物の著作権侵害について。データセットにある画像と似ていると、作った画像が著作権侵害している可能性がある。AI生成物の著作権侵害については、情報財検討委員会で議論されているが、AI生成物も人が作ったモノと同様に判断されるので、著作権侵害に注意してほしい。

今後、Chainer Meetupの開催頻度はもう少し頻繁になっていくという。また参加者のレベルに合わせたイベントも開催される予定だ。関心のある人はぜひ、参加してみては。情報は次のSlackで発信されるという。こちらで受け付けてもらえるので、ぜひ、アクセスして情報を入手しよう。

Chainer User Groupを設置

Chainer MeetupはChainer開発チームと舛岡さんで行ってきたが、それだけでは人が足りなくなってきた。そこでChainer User Groupを立ち上げ、Chainerユーザーを増やし、ノウハウを溜めていくことにしたという。

もちろん、同Meetupをはじめとするイベントの運営もユーザーグループで行っていく。日本語ノウハウページの作成、ロゴやスライドのデザインなど。Chainerのユーザーをしっかり増やしていく活動をしていく。関心のある人はこちらのユーザーグループのサイトを参照しよう。

  • 43
  • このエントリーをはてなブックマークに追加

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ