40
Chainer ででで Deep Learning 2016/11/9 みみみみ Python みみみ #18

Chainerで学ぶdeep learning

Embed Size (px)

Citation preview

Page 1: Chainerで学ぶdeep learning

Chainerで学ぶDeep Learning

2016/11/9 みんなの Python 勉強会 #18

Page 2: Chainerで学ぶdeep learning

自己紹介• 名前• 舛岡英人 (@hidetomasuoka)

• 略歴• 株式会社ソピア(現アクセンチュア)入社

• 中小企業向け ERP のスクラッチ開発を提案からサポートまですべてを担当• 株式会社 Preferred Infrastructure 入社

• 各製品の提案からサポートまですべてを担当• 株式会社 Intimate Merger に出向

• 株式会社 レトリバ創業メンバー

Page 3: Chainerで学ぶdeep learning

自己紹介• 社外活動• PyConJP 2016 スタッフ

• 招待講演担当• Chainer OSS 活動

• community イベントのリード

Page 4: Chainerで学ぶdeep learning

会社概要株式会社レトリバ• 設立: 2016 年 8 月• 場所:東京都千代田区大手町• 役員:代表取締役 社長 河原 一哉   取締役      西鳥羽 二郎• 従業員数: 11 名• 事業内容:ソフトウェア製品の開発・販売• ミッション:お客様の課題を最先端の技術で解決する• HP:https://retrieva.jp/• Twitter:@retrieva_jp

Page 5: Chainerで学ぶdeep learning

アジェンダ• ディープラーニングブームの背景• ディープラーニングの導入• ディープラーニングフレームワーク Chainer の紹介• ディープラーニングをどうやって学ぶか

Page 6: Chainerで学ぶdeep learning

ディープラーニングブームの背景

Page 7: Chainerで学ぶdeep learning

機械学習の典型的なプロセス

7

(0, 1, 2.5, -1, …)(1, 0.5, -2, 3, …)(0, 1, 1.5, 2, …)

特徴ベクトル

グラフィカルモデル

分類 / 回帰SVM/LogReg/PACW/ALOW/Naïve Bayes/CNB/DT

RF/ANN…

クラスタリングK-means/Spectral Clustering/MMC/L

SI/LDA/GM…

構造分析HMM/MRF/CRF…

分野に依存しない抽象化データ 様々な手法理論を適用

機械学習

文書

画像 センサー

行動履歴

様々な様式の生データ

特徴抽出

Page 8: Chainerで学ぶdeep learning

文章からの特徴抽出• 例:固有名詞を取り出してニュース記事の特徴とする

8

2020年の東京五輪・パラリンピックの主会場となる新国立競技場をめぐり、安倍晋三首相は、総工費が2520億円に膨らんだ建設計画を見直す考えを17日に表明する方向で最終調整に入った。競技場を19年のラグビーワールドカップ(W杯)の主会場にする計画は断念する。同日、東京五輪・パラリンピック組織委員会会長の森喜朗元首相と会談し、計画見直しへの協力を求める方針だ。

2020年の東京五輪・パラリンピックの主会場となる新国立競技場をめぐり、安倍晋三首相は、総工費が2520億円に膨らんだ建設計画を見直す考えを17日に表明する方向で最終調整に入った。競技場を19年のラグビーワールドカップ(W杯)の主会場にする計画は断念する。同日、東京五輪・パラリンピック組織委員会会長の森喜朗元首相と会談し、計画見直しへの協力を求める方針だ。単語 頻度東京五輪 2パラリンピック 2新国立競技場 1安倍晋三 1・・・ ・・・

機械学習アルゴリズム

文章からの固有名詞の抽出は固有表現抽出( Named Entity Recognition; NER )という

Page 9: Chainerで学ぶdeep learning

画像からの特徴抽出• 例: Histogram of Gradient (HoG 特徴量 )

http://www.vlfeat.org/overview/hog.html

機械学習アルゴリズム

各ピクセルでの勾配を小ブロック(セル)単位でまとめてヒストグラム化

各セルでのヒストグラムを(正規化して)すべてまとめる

Page 10: Chainerで学ぶdeep learning

精度をあげるのが職人技•精度をあげるためには特徴抽出が重要•特徴抽出は難しい• タスクごとに最適な特徴抽出方法は異なる• 機械学習コンテストは最後は特徴抽出のチューニング勝負

•これまで様々な特徴抽出方法が研究されてきた• 自然言語: n-gram/BoW  画像: SIFT/SURF/HOG/PHOW/BoVW• その他にも様々なヒューリスティックが存在

•精度をあげるにはデータに合わせたチューニングが必要

Page 11: Chainerで学ぶdeep learning

11

2012 年画像認識コンテストでDeep Learning を用いたチームが優勝

→ILSVRC2012優勝チーム Supervison の結果 [Krizhevsky+ ‘12]

衝撃的な出来事• 限界と思われた認識エラーを 4割も減らした (26%→16%)• 特徴抽出を行わず、生の画素を NN に与えた翌年の同コンテストの上位チームはほぼ Deep Learning ベースの手法

Page 12: Chainerで学ぶdeep learning

Neural Net ブーム• 様々なコンペティションで DL が既存手法を凌駕• 16%(‘12) → 11%(‘13) → 6.6%(’14) → 4.8%('15) → 2.9%

('16)• 各企業が DL研究者の獲得競争• Google/FaceBook/Microsoft/Baidu

•実サービスも DL ベースに置き換えられる• Siri/Google 画像検索

GoogLeNet のアーキテクチャ↓http://research.google.com/archive/unsupervised_icml2012.html

Google Brain による猫認識↑[Le, Ng, Jeffrey+ ’12]

Page 13: Chainerで学ぶdeep learning

音声認識の分野では

10 年間の停滞していたが、DL登場により劇的に精度が向上した

Page 14: Chainerで学ぶdeep learning

ニューラルネットワークが利用されたタスクデータ 画像タスク カテゴリ

分類顔検出 生成 ゲーム AI シーン認識

動画 画像 +自然言語

音声 + 動画カテゴリ分類

動作認識 キャプション生成

表現学習 音声認識

自然言語 音声 化合物表現学習 翻訳 質問応答 会話検出 QSAR

( 活性予測 )

応用分野音声検索画像キュレーションeコマース自動運転ロボティックス医療画像マーケティング

Page 15: Chainerで学ぶdeep learning

ディープラーニング導入

Page 16: Chainerで学ぶdeep learning

x1

xN

・・・・・・

h1

hH

・・・・

ニューラルネットワーク(多層パーセプトロン)

kM

k1

yM

y1

ForwardBackward

・・ ・・

入力層 隠れ層 出力層文書

画像

センサー

チューリップ

異常確率 50%

カテゴリ:政治

Page 17: Chainerで学ぶdeep learning

Forward Propagation (順伝播)• 入力層(グレー)に値を与え、順方向に計算を進める• Forward 計算の過程で損失

(Loss) とエラーを計算する• 通常エラーは計算グラフの最後のユニット(緑)での値を指す• 計算グラフの途中の値をエラーに加えても良い

• Loss は各ユニットの値や各レイヤーのパラメータの関数になっている

Forward

Page 18: Chainerで学ぶdeep learning

Backward Propagation (誤差逆伝播)• 計算グラフの末端のユニット(緑)にエラーを与え、逆方向に計算を進める• Backward の過程で各パラメータについてのエラーを計算する

Backward

Page 19: Chainerで学ぶdeep learning

x1

xN

・・・・・・

h1

hH

・・・・

ニューラルネットワーク(多層パーセプトロン)

kM

k1

yM

y1

ForwardBackward

・・ ・・

入力層 隠れ層 出力層文書

画像

センサー

チューリップ

異常確率 50%

カテゴリ:政治

Page 20: Chainerで学ぶdeep learning

代表的なニューラルネットワーク (1)Convolutional Neural Network

• 畳み込み層とプーリング層を交互に重ねた構造をしたニューラルネットワーク• 主に画像解析で利用されている• 畳み込み層

• 前層の近傍のユニットのみと結合している• ユニット間で重みを共有

• プーリング層• ユニットの活性をまとめる• 最大値をとる (Max Pooling) か平均値をとる (Average Pooling)のが一般的

畳み込み層プーリング層

同じ色の結合は重みが等しい

Page 21: Chainerで学ぶdeep learning

代表的なニューラルネットワーク (2)Recurrent Neural Network

• 中間層の活性が、前層と前時刻の自分自身の活性により決定される•音声・動画・自然言語などの可変長データの解析に利用されている• 中間層のループ部分を時間方向に展開すると通常のフィードフォワードニューラルネットとみなせる

Page 22: Chainerで学ぶdeep learning

ディープラーニングの応用例Deep Q Network* (深層学習で強化学習)

* Mnih, Volodymyr, et al. "Human-level control through deep reinforcement learning." Nature 518.7540 (2015): 529-533.** Caffe で Deep Q-Network を実装して深層強化学習してみた http://d.hatena.ne.jp/muupan/20141021/1413850461*** PFI インターン 2014 最終発表 http://www.ustream.tv/recorded/5315339922

Page 23: Chainerで学ぶdeep learning

ディープラーニングの応用例画像生成• 文字を”描く“ニューラルネット• 入力と同じ「雰囲気」の数字が出力されている。同じ数字でも、最左画像と生成画像は異なる事に注意

入力 生成結果

Kingma, Diederik P., et al. "Semi-supervised learning with deep generative models." Advances in Neural Information Processing Systems. 2014. の実験を弊社で再現

•絵を”描く“ニューラルネットhttp://soumith.ch/eyescream/

Page 24: Chainerで学ぶdeep learning

典型的な Neural Network(多層パーセプトロン)

x1

xN

・・・・・・

h1

hH

・・・・

kM

k1

yM

y1

f1f2 f3

W2/b2W1/b1

tM

t1

損失関数で評価正解ラベル入力

ForwardBackward

出力

・・ ・・ ・・ 学習すべきパラメータ• W1:1層目のパラメータ行列• b1:1層目のバイアス項 • W2:2層目のパラメータ行列• b2:2層目のバイアス項

Forward更新式• h = f1(x) = Sigmoid(W1x+b1)• k = f2(h) = Sigmoid(W2h+b2)• y = f3(k) = SoftMax(k) f3i(k) = exp(ki)/Σ_{j} exp(kj)

Page 25: Chainerで学ぶdeep learning

DeepLearning フレームワークの構成要素変数( n次元配列)層計算グラフ最適化アルゴリズム

順伝播逆伝播

ニューラルネット変数 層

正解データも入力の一部とみなすと見通しが良い

途中で分岐してもよい( 一般にはDAG)

Page 26: Chainerで学ぶdeep learning

minibatch j

訓練の流れEpoch 1

Epoch N

Epoch 2

Epoch i

Epoch i

全訓練データをシャッフルminibatch 1

Forward

minibatch 2

パラメータ更新

時刻• Epoch (Iteration) :全訓練データを 1巡する事→ 各訓練データは Net に N回与える• Solver : Net を訓練するモジュール• minibatch :少数の訓練データをまとめたもの

26

パラメータ更新

minibatch jBackward

Page 27: Chainerで学ぶdeep learning

ディープラーニングフレームワーク Chainer の紹介

Page 28: Chainerで学ぶdeep learning

Chainer 概要• 製作者:得居誠也、開発: Preferred Networks http://chainer.org/• バージョン: 1.0.0 ( 2015 年 6 月 9 日)       1.17.0 ( 2016 年 11 月 9 日現在)• ライセンス: MIT• 言語: Python ( pip install chainerでインストール可)

• 依存モジュール: Python2.7+/3.4+/ 3.5.+、Numpy1.9+/1.10/1.11、 Six1.9+

• CUDA依存モジュール: CUDA6.5+• 特徴

• Powerful: CUDA・マルチGPU対応• Flexible:ほぼ任意のアーキテクチャーを実現可能• Intuitive:計算グラフを通常の Pythonコードで記述可能

Page 29: Chainerで学ぶdeep learning

計算グラフ構築のパラダイム:Define-and-Run• 計算グラフを構築した後に、データを計算グラフに順伝播する• 計算グラフ構築方法はフレームワークにより異なる• prototxt, yaml ファイル , Lua スクリプト etc.

•多くの深層学習フレームワークが採用• Caffe/Torch/Theano ベースのフレームワーク

• 長所• メモリ管理の必要がほとんどない• 計算グラフの最適化を暗黙的に行える

•短所• 1訓練ループの中では計算グラフを変更できない

f g

x f g

計算グラフ構築

データフィード

Page 30: Chainerで学ぶdeep learning

計算グラフ構築のパラダイム:Define-by-Run• データの順伝播とそのデータに対する計算グラフの構築を同時に行う• 長所

• 順伝播を通常のプログラムで記述できる• コントロールフロー(条件分岐、 for ループ)を計算グラフ構築に利用可能• 設定ファイル用のミニ言語を作る必要がない

• 訓練データごとに異なる計算グラフを変更可能• 短所

• 訓練データ全体に渡る最適化は自明ではない• 計算グラフを動的に構築するので、メモリ管理が必要

x yf

x = chainer.Variable(...)y = f(x)z = g(x)

zg

データフィード= 計算グラフ構築

Chainer はこのパラダイムを採用

Page 31: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する( 1 )

入力層 LSTM 出力層• LSTM(Long short-term memory) は、RNN(Recurrent Neural Network) の拡張として 1995 年に登場した、時系列データ (sequential data) に対するモデル、あるいは構造(architecture) の1種です

Microsoft Office ユーザー
図が通常のRNNの説明になっているので、LSTMの図を加えると良いと思います。例えばこの記事のhttp://qiita.com/t_Signull/items/21b82be280b46f467d1b、https://qiita-image-store.s3.amazonaws.com/0/60969/ad3d229e-3dda-e8ad-eeff-4a8b447e22d3.pngなど
Page 32: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する( 2 )

class RNN(Chain): def __init__(self): super(RNN, self).__init__( embed=L.EmbedID(1000, 100), # word embedding mid=L.LSTM(100, 50), # the first LSTM layer out=L.Linear(50, 1000), # the feed-forward output layer )

def reset_state(self): self.mid.reset_state() def __call__(self, cur_word): # Given the current word ID, predict the next word. x = self.embed(cur_word) h = self.mid(x) y = self.out(h) return y

rnn = RNN()model = L.Classifier(rnn)optimizer = optimizers.SGD()optimizer.setup(model)

Page 33: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する(3 )

class RNN(Chain): def __init__(self): super(RNN, self).__init__( embed=L.EmbedID(1000, 100), # word embedding mid=L.LSTM(100, 50), # the first LSTM layer out=L.Linear(50, 1000), # the feed-forward output layer )

def reset_state(self): self.mid.reset_state() def __call__(self, cur_word): # Given the current word ID, predict the next word. x = self.embed(cur_word) h = self.mid(x) y = self.out(h) return y

入力層 LSTM 出力層

DL の層を定義する(今回だと右のような 3層)

Page 34: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する(4 )

class RNN(Chain): def __init__(self): super(RNN, self).__init__( embed=L.EmbedID(1000, 100), # word embedding mid=L.LSTM(100, 50), # the first LSTM layer out=L.Linear(50, 1000), # the feed-forward output layer )

def reset_state(self): self.mid.reset_state() def __call__(self, cur_word): # Given the current word ID, predict the next word. x = self.embed(cur_word) h = self.mid(x) y = self.out(h) return y

入力層 LSTM 出力層

各層に値をセットする

Page 35: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する( 5 )

class RNN(Chain): def __init__(self): super(RNN, self).__init__( embed=L.EmbedID(1000, 100), # word embedding mid=L.LSTM(100, 50), # the first LSTM layer out=L.Linear(50, 1000), # the feed-forward output layer )

def reset_state(self): self.mid.reset_state() def __call__(self, cur_word): # Given the current word ID, predict the next word. x = self.embed(cur_word) h = self.mid(x) y = self.out(h) return y

rnn = RNN()model = L.Classifier(rnn)optimizer = optimizers.SGD()optimizer.setup(model)

使用するネットワークを定義する

Page 36: Chainerで学ぶdeep learning

LSTM を Chainer をつかって実装する(6 )

class RNN(Chain): def __init__(self): super(RNN, self).__init__( embed=L.EmbedID(1000, 100), # word embedding mid=L.LSTM(100, 50), # the first LSTM layer out=L.Linear(50, 1000), # the feed-forward output layer )

def reset_state(self): self.mid.reset_state() def __call__(self, cur_word): # Given the current word ID, predict the next word. x = self.embed(cur_word) h = self.mid(x) y = self.out(h) return y

rnn = RNN()model = L.Classifier(rnn)optimizer = optimizers.SGD()optimizer.setup(model)

上記で設定したモデルをSGD というアルゴリズムを使って最適化する

Page 37: Chainerで学ぶdeep learning

ディープラーニング学ぶにはどうするか?

Page 38: Chainerで学ぶdeep learning

ディープラーニングを学ぶことができるサイト• Chainer• http://docs.chainer.org/en/stable/tutorial/index.html• https://github.com/hido/chainer-handson

• NVIDIA • https://nvidia.qwiklab.com/tags/Deep%20Learning

• Google• https://www.tensorflow.org/versions/r0.11/tutorials/index.html

Page 39: Chainerで学ぶdeep learning

Chainer Playground

Page 40: Chainerで学ぶdeep learning

まとめ• ディープラーニングブームの背景• ディープラーニングの概要• Chainer での実装方法•今後自分でディープラーニングを学ぶ方法