chainerで学ぶdeep learning
TRANSCRIPT
Chainerで学ぶDeep Learning
2016/11/9 みんなの Python 勉強会 #18
自己紹介• 名前• 舛岡英人 (@hidetomasuoka)
• 略歴• 株式会社ソピア(現アクセンチュア)入社
• 中小企業向け ERP のスクラッチ開発を提案からサポートまですべてを担当• 株式会社 Preferred Infrastructure 入社
• 各製品の提案からサポートまですべてを担当• 株式会社 Intimate Merger に出向
• 株式会社 レトリバ創業メンバー
自己紹介• 社外活動• PyConJP 2016 スタッフ
• 招待講演担当• Chainer OSS 活動
• community イベントのリード
会社概要株式会社レトリバ• 設立: 2016 年 8 月• 場所:東京都千代田区大手町• 役員:代表取締役 社長 河原 一哉 取締役 西鳥羽 二郎• 従業員数: 11 名• 事業内容:ソフトウェア製品の開発・販売• ミッション:お客様の課題を最先端の技術で解決する• HP:https://retrieva.jp/• Twitter:@retrieva_jp
アジェンダ• ディープラーニングブームの背景• ディープラーニングの導入• ディープラーニングフレームワーク Chainer の紹介• ディープラーニングをどうやって学ぶか
ディープラーニングブームの背景
機械学習の典型的なプロセス
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…
分野に依存しない抽象化データ 様々な手法理論を適用
機械学習
文書
画像 センサー
行動履歴
様々な様式の生データ
特徴抽出
文章からの特徴抽出• 例:固有名詞を取り出してニュース記事の特徴とする
8
2020年の東京五輪・パラリンピックの主会場となる新国立競技場をめぐり、安倍晋三首相は、総工費が2520億円に膨らんだ建設計画を見直す考えを17日に表明する方向で最終調整に入った。競技場を19年のラグビーワールドカップ(W杯)の主会場にする計画は断念する。同日、東京五輪・パラリンピック組織委員会会長の森喜朗元首相と会談し、計画見直しへの協力を求める方針だ。
2020年の東京五輪・パラリンピックの主会場となる新国立競技場をめぐり、安倍晋三首相は、総工費が2520億円に膨らんだ建設計画を見直す考えを17日に表明する方向で最終調整に入った。競技場を19年のラグビーワールドカップ(W杯)の主会場にする計画は断念する。同日、東京五輪・パラリンピック組織委員会会長の森喜朗元首相と会談し、計画見直しへの協力を求める方針だ。単語 頻度東京五輪 2パラリンピック 2新国立競技場 1安倍晋三 1・・・ ・・・
機械学習アルゴリズム
文章からの固有名詞の抽出は固有表現抽出( Named Entity Recognition; NER )という
画像からの特徴抽出• 例: Histogram of Gradient (HoG 特徴量 )
http://www.vlfeat.org/overview/hog.html
機械学習アルゴリズム
各ピクセルでの勾配を小ブロック(セル)単位でまとめてヒストグラム化
各セルでのヒストグラムを(正規化して)すべてまとめる
精度をあげるのが職人技•精度をあげるためには特徴抽出が重要•特徴抽出は難しい• タスクごとに最適な特徴抽出方法は異なる• 機械学習コンテストは最後は特徴抽出のチューニング勝負
•これまで様々な特徴抽出方法が研究されてきた• 自然言語: n-gram/BoW 画像: SIFT/SURF/HOG/PHOW/BoVW• その他にも様々なヒューリスティックが存在
•精度をあげるにはデータに合わせたチューニングが必要
11
2012 年画像認識コンテストでDeep Learning を用いたチームが優勝
→ILSVRC2012優勝チーム Supervison の結果 [Krizhevsky+ ‘12]
衝撃的な出来事• 限界と思われた認識エラーを 4割も減らした (26%→16%)• 特徴抽出を行わず、生の画素を NN に与えた翌年の同コンテストの上位チームはほぼ 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]
音声認識の分野では
10 年間の停滞していたが、DL登場により劇的に精度が向上した
ニューラルネットワークが利用されたタスクデータ 画像タスク カテゴリ
分類顔検出 生成 ゲーム AI シーン認識
動画 画像 +自然言語
音声 + 動画カテゴリ分類
動作認識 キャプション生成
表現学習 音声認識
自然言語 音声 化合物表現学習 翻訳 質問応答 会話検出 QSAR
( 活性予測 )
応用分野音声検索画像キュレーションeコマース自動運転ロボティックス医療画像マーケティング
ディープラーニング導入
x1
xN
・・・・・・
h1
hH
・・・・
ニューラルネットワーク(多層パーセプトロン)
kM
k1
yM
y1
ForwardBackward
・・ ・・
入力層 隠れ層 出力層文書
画像
センサー
チューリップ
異常確率 50%
カテゴリ:政治
Forward Propagation (順伝播)• 入力層(グレー)に値を与え、順方向に計算を進める• Forward 計算の過程で損失
(Loss) とエラーを計算する• 通常エラーは計算グラフの最後のユニット(緑)での値を指す• 計算グラフの途中の値をエラーに加えても良い
• Loss は各ユニットの値や各レイヤーのパラメータの関数になっている
Forward
Backward Propagation (誤差逆伝播)• 計算グラフの末端のユニット(緑)にエラーを与え、逆方向に計算を進める• Backward の過程で各パラメータについてのエラーを計算する
Backward
x1
xN
・・・・・・
h1
hH
・・・・
ニューラルネットワーク(多層パーセプトロン)
kM
k1
yM
y1
ForwardBackward
・・ ・・
入力層 隠れ層 出力層文書
画像
センサー
チューリップ
異常確率 50%
カテゴリ:政治
代表的なニューラルネットワーク (1)Convolutional Neural Network
• 畳み込み層とプーリング層を交互に重ねた構造をしたニューラルネットワーク• 主に画像解析で利用されている• 畳み込み層
• 前層の近傍のユニットのみと結合している• ユニット間で重みを共有
• プーリング層• ユニットの活性をまとめる• 最大値をとる (Max Pooling) か平均値をとる (Average Pooling)のが一般的
畳み込み層プーリング層
同じ色の結合は重みが等しい
代表的なニューラルネットワーク (2)Recurrent Neural Network
• 中間層の活性が、前層と前時刻の自分自身の活性により決定される•音声・動画・自然言語などの可変長データの解析に利用されている• 中間層のループ部分を時間方向に展開すると通常のフィードフォワードニューラルネットとみなせる
ディープラーニングの応用例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
ディープラーニングの応用例画像生成• 文字を”描く“ニューラルネット• 入力と同じ「雰囲気」の数字が出力されている。同じ数字でも、最左画像と生成画像は異なる事に注意
入力 生成結果
Kingma, Diederik P., et al. "Semi-supervised learning with deep generative models." Advances in Neural Information Processing Systems. 2014. の実験を弊社で再現
•絵を”描く“ニューラルネットhttp://soumith.ch/eyescream/
典型的な 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)
DeepLearning フレームワークの構成要素変数( n次元配列)層計算グラフ最適化アルゴリズム
順伝播逆伝播
ニューラルネット変数 層
正解データも入力の一部とみなすと見通しが良い
途中で分岐してもよい( 一般にはDAG)
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
ディープラーニングフレームワーク Chainer の紹介
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コードで記述可能
計算グラフ構築のパラダイム:Define-and-Run• 計算グラフを構築した後に、データを計算グラフに順伝播する• 計算グラフ構築方法はフレームワークにより異なる• prototxt, yaml ファイル , Lua スクリプト etc.
•多くの深層学習フレームワークが採用• Caffe/Torch/Theano ベースのフレームワーク
• 長所• メモリ管理の必要がほとんどない• 計算グラフの最適化を暗黙的に行える
•短所• 1訓練ループの中では計算グラフを変更できない
f g
x f g
計算グラフ構築
データフィード
計算グラフ構築のパラダイム:Define-by-Run• データの順伝播とそのデータに対する計算グラフの構築を同時に行う• 長所
• 順伝播を通常のプログラムで記述できる• コントロールフロー(条件分岐、 for ループ)を計算グラフ構築に利用可能• 設定ファイル用のミニ言語を作る必要がない
• 訓練データごとに異なる計算グラフを変更可能• 短所
• 訓練データ全体に渡る最適化は自明ではない• 計算グラフを動的に構築するので、メモリ管理が必要
x yf
x = chainer.Variable(...)y = f(x)z = g(x)
zg
データフィード= 計算グラフ構築
Chainer はこのパラダイムを採用
LSTM を Chainer をつかって実装する( 1 )
入力層 LSTM 出力層• LSTM(Long short-term memory) は、RNN(Recurrent Neural Network) の拡張として 1995 年に登場した、時系列データ (sequential data) に対するモデル、あるいは構造(architecture) の1種です
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)
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層)
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 出力層
各層に値をセットする
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)
使用するネットワークを定義する
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 というアルゴリズムを使って最適化する
ディープラーニング学ぶにはどうするか?
ディープラーニングを学ぶことができるサイト• 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
Chainer Playground
まとめ• ディープラーニングブームの背景• ディープラーニングの概要• Chainer での実装方法•今後自分でディープラーニングを学ぶ方法