ディープラーニングの導⼊入と
ディープラーニングフレームワーク
Caffe・Chainerの紹介
株式会社Preferred Networks
⼤大野健太 oono@preferred.jp
2015/9/1⽇日本神経回路路学会主催セミナー
「Deep Learningを使ってみよう!」
更更新履履歴
• 2015/8/26:初版公開
• 2015/8/30:資料料の⼀一部を補⾜足資料料とする。インストールに関する記述を追加
⾃自⼰己紹介
• ⼤大野健太(@delta2323_)
• 経歴:数理理科学研究科・修⼠士課程(共形幾何)
• → 2012.3 PFI → 2014.10 PFN
• 所属:研究班(理理論論解析・ライフサイエンス・Chainer開発メンバー)
• ブログ:http://delta2323.github.io
• 最近の活動
• NIPS2014読み会・ICML2015読み会主催
• ⽇日経ビッグデータ短期連載「ディープラーニングのビジネス活⽤用を探る」
• 「この1冊でまるごとわかる! ⼈人⼯工知能ビジネス」寄稿
3
アジェンダ
• ディープラーニングの導⼊入
• ディープラーニングフレームワーク:Caffe
• ディープラーニングフレームワーク:Chainer
x1
xN
・・・・・・
h1
hH
・・・・
ニューラルネットワーク(多層パーセプトロン)
k
M
k1
y
M
y1
Forward
Backward
・・
・・
5
⼊入⼒力力層 隠れ層 出⼒力力層
⽂文書
画像
センサー
チューリップ
異異常確率率率50%
カテゴリ:政治
機械学習の典型的なプロセス
6
(0,        1,  2.5,  -‐‑‒1,  …)
(1,  0.5,      -‐‑‒2,    3,  …)
(0,        1,  1.5,    2,  …)
特徴ベクトル
グラフィカルモデル
分類/回帰
SVM/LogReg/PA
CW/ALOW/Naïve  
Bayes/CNB/DT
RF/ANN…
クラスタリング
K-‐‑‒means/Spectral  
Clustering/MMC/L
SI/LDA/GM…
構造分析
HMM/MRF/CRF…  
分野に依存しない
抽象化データ
様々な⼿手法
理理論論を適⽤用
機械
学習
⽂文書
画像 センサー
⾏行行動履履歴
様々な様式の
⽣生データ
特徴
抽出
⽂文章からの特徴抽出
例例:固有名詞を取り出してニュース記事の特徴とする
7
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
• その他にも様々なヒューリスティックが存在
9
10
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)
• 各企業がDL研究者の獲得競争
• Google/FaceBook/Microsoft/Baidu
• 実サービスもDLベースに置き換えられる
• Siri/Google画像検索索
GoogLeNetのアーキテクチャ↓
11
http://research.google.com/archive/un
supervised_icml2012.html
Google Brainによる猫認識識↑
[Le, Ng, Jeffrey+ ’12]
ニューラルネットワークが利利⽤用されたタスク
データ 画像
タスク カテゴリ
分類
顔検出 ⽣生成 ゲームAI シーン認識識
動画 画像+
⾃自然⾔言語
⾳音声+動画
カテゴリ
分類
動作認識識 キャプ
ション⽣生成
表現学習 ⾳音声認識識
⾃自然⾔言語 ⾳音声 化合物
表現学習 翻訳 質問応答 会話検出 QSAR
(活性予測)
応⽤用分野
⾳音声検索索
画像キュレーション
eコマース
⾃自動運転
ロボティックス
医療療画像
マーケティング
代表的なニューラルネットワーク(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/53153399
15
ディープラーニングの応⽤用例例
画像⽣生成
• ⽂文字を”描く“ニューラルネット
• ⼊入⼒力力と同じ「雰囲気」の数字が出⼒力力されて
いる。同じ数字でも、最左画像と⽣生成画像
は異異なる事に注意
⼊入⼒力力 ⽣生成結果
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
・・・・
k
M
k1
y
M
y1
f1
f2
f3
W2/b2
W1/b1
tM
t1
損失関数で評価
正解ラベル⼊入⼒力力
Forward
Backward
出⼒力力
・・
・・
・・
学習すべきパラメータ
• W1:1層⽬目のパラメータ⾏行行列列
• b1:1層⽬目のバイアス項
• W2:2層⽬目のパラメータ⾏行行列列
• b2:2層⽬目のバイアス項
17
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)
Deep Learningフレームワークの構成要素
Caffe Chainer
変数
(n次元配列列)
Blob Variable
層 Layer Function
計算グラフ Net (FunctionSet)
最適化
アルゴリズム
Solver Optimizer
順伝播
逆伝播
ニューラル
ネット
変数 層
18
正解データも⼊入⼒力力
の⼀一部とみなすと
⾒見見通しが良良い
途中で分岐して
もよい
(⼀一般にはDAG)
活性化関数に関する注意
• 論論⽂文では層の中で活性化関数を含む事が多いが、実装では活性化関数を層の⼀一つとして実現する
ことが多い
Y=σ(WX)
W
X
X
WX
Y
W
σ
19
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:少数の訓練データをまとめたもの
20
パラメータ更更新
minibatch j
Backward
Forward Propagation (順伝播)
• 計算グラフの先頭のユニット(緑)に値を与え、
順⽅方向に計算を進める
• Forward計算の過程で損失(Loss)とエラーを計
算する
• 通常エラーは計算グラフの最後のユニット
(紫)での値を指す
• 計算グラフの途中の値をエラーに加えても
良良い
• Lossは各ユニットの値や各レイヤーのパラメー
タの関数になっている
Forward
Chain Rule(連鎖律律)
• Forward Propagationがy = f(x; θ)の場合を考える
• θ : Layerのパラメータ(例例:全結合層の重み)
• 損失をLとすると、連鎖律律より
• (エラー), (勾配)と書くと
→ エラーは活性と逆向きに伝播する
x y
活性の
伝播⽅方向
エラーの
伝播⽅方向
θ
Backward Propagation(逆伝播、誤差逆伝播)
• 計算グラフの末端のユニット(紫)にエラーを
与え、逆⽅方向に計算を進める
• Backwardの過程で各パラメータについてのエ
ラーを計算する
Backward
パラメータの更更新
• Backwardにより得られた各パラメータについ
ての勾配δθを⽤用いてパラメータθを更更新
• 最も単純なのは確率率率的勾配法
• θ ← θ – η δθ (η : 学習率率率)
• 更更新式には様々なバリエーションがある
• 例例:学習率率率が更更新ごとに変化する
• 例例:過去の勾配も利利⽤用する
• SGD / Momentum / AdaGrad / ADADELTA /
RMSprop / Adam etc…
http://imgur.com/a/Hqolp
フレームワークごとのGithub Starsの⽐比較
https://twitter.com/fchollet/status/63589
1305084796929を元に作成
PyLearn2
紫下線はTheanoをベース
としたフレームワーク
• ディープラーニング導⼊入
• Caffe
• Chainer
Caffe概要
• 製作者:Yangqing Jia(現Google)、メンテナンス:Berkeley⼤大学 (BVLC)
• ライセンス:BSD 2 clause
• バージョン:0.9999(2014年年8⽉月9⽇日)、rc2(2015年年2⽉月21⽇日)
• ⾔言語:C++, CUDA、バインディング:Python, Matlab
特徴
• Expressive architecture : CPU/GPUの変更更が設定ファイル(prototxt)を1⾏行行変えれば良良い
• Extensible code : 最初の1年年で1000⼈人の開発者にforkされる
• Speed : NVIDIA K40GPU1台で毎秒60M枚の画像を処理理可能(Supervision + IO Cache)
• Community : 学術界、スタートアップ、産業界での⼤大規模利利⽤用、画像、⾳音声、マルチメディア
27
http://caffe.berkeleyvision.org
Video Intelligence Box
• ⼈人物検出・属性判定を搭載したカメラ
• IoTデバイス上での⾼高度度解析を実現した例例
• 属性判定に深層学習(Caffe)を使⽤用
• バッテリー内蔵で数時間稼働可
28
インストールについて
• ドキュメント
• 公式:http://caffe.berkeleyvision.org/installation.html
• Wiki (⾮非公式) :https://github.com/BVLC/caffe/wiki
• Wikiの⽅方が嬉しい情報が多い(AWS/AMIの利利⽤用⽅方法など)が、公式ではないので注意
• 動作確認済OS:Ubuntu, Mac OS X, RHEL, CentOS, Fedora
• Mac OS(10.9以上)ならばCUDAは7.0以上推奨(libc++関連)
• Windowsも対応版がある(⾮非公式*)
* fork レポジトリ:https://github.com/niuzhiheng/caffe
詳細は事前資料料「Caffeのインストールについて」参照
http://www.slideshare.net/KentaOono/20150706-jnns-caffeinstall
CPU版インストール概要
• インストール⼿手順
1. Caffeの依存ライブラリのインストール
2. Makefile.configの作成(CPU_ONLY := 1追加の修正が必要)
3. Caffeのインストール
4. PythonからCaffeを利利⽤用するための作業 ← スクリプト参照
• CPU Only版Caffeのインストールスクリプト(AWS・Ubuntu14.04インスタンスで確認)
• https://github.com/delta2323/JNNS2015-tutorial/blob/master/caffe/cpu/install.sh
• rootユーザーのホームディレクトリに置き、上記コマンド実⾏行行すると、caffeユーザー(パス
ワードはユーザー名と同⼀一)を作成し、/opt/caffeにCaffeをcaffeユーザーでインストールし
ます
30
$ cd
$ sudo bash ./install.sh
GPU版インストール概要
• インストール⼿手順
1. CUDAのインストール ← GPU版だけの作業、ここが超⻤⿁鬼⾨門
2. Caffeの依存ライブラリのインストール
3. Makefile.configの作成 ← CPU_ONLYの変更更は必要なし
4. Caffeのインストール
• インストール⼿手段は⼤大きく分けて2通り
• AWSのGPUインスタンス上でCaffeコミュニティーが提供するAMIを利利⽤用する
• GPUインスタンスを利利⽤用できるなら、この⽅方法が楽かつ確実
• ⾃自前でマシンを⽤用意し、⼿手動でGPU版Caffeをインストールする
• インストールしたいマシンが既にある場合 / インストール⼿手順を体験したい場合
Caffeの使⽤用⽅方法
• コマンドラインツールとして利利⽤用
• prototxt(後述)の記述のみ、“プログラム”の必要なし
• ライブラリ・モジュールとして⾃自作プログラム内で利利⽤用
• C++ / Python / Matlabで利利⽤用可能
32
全体の流流れ(画像分類の例例)
画像データ
データ変換
convert_imageset
変換済データ
(LMDB/LDB)
Solver設定
(solver.prototxt)
訓練/テスト⽤用Net
(train_val.prototxt)
デプロイ⽤用Net
(deploy.prototxt)caffe train
Solver中間状態
(.solverstate)
重みファイル
(.caffemodel)
caffe test
アプリケーション
XX_classification
AをBに⼊入⼒力力
A内でBをパス指定
A B
A B
prototxt:いわゆる設定ファイル
• 3種類
• 訓練、テスト⽤用のNetの構成:train_val.prototxt
• 訓練時のSolverの設定:solver.prototxt
• 訓練に⽤用いる訓練⽤用のNetのprototxtを指定する
• デプロイ⽤用のNetの構成:deploy.prototxt
• Protocol Buffersを⽤用いて実現
GoogLeNetのprototxt
2000⾏行行以上ある↓
https://github.com/BVLC/caffe/pull/1367/files
34
Protocol Buffer:Googleが開発している構造化
データのシリアライズフォーマット。データ構造を
定義する⾔言語(IDL)を備えており、そこから様々
な⾔言語での構造化データの定義を⽣生成できる
prototxtの記述(1):Train/Test⽤用のNet
Train/Test
mnist
ip
loss
label
Net
Layer
Blob
data
ip
データはData Layer
として抽象化
損失関数はLoss Layer
として抽象化
LayerでTop Blob
とBottom Blobを指定
35
caffe/docs/tutorial/net_layer_blob.mdより
prototxtの記述(2):Deploy⽤用Net
Net
ip
prob
Deploy
data
ip
prob
Layer
Blob
Layerに挟まれないBlobは
テンソルで指定
36
prototxtのパラメータは何を与えれば良良い?
• prototxtのパラメータに対応するデータ構造は
Protocol Bufferで⽣生成
• パラメータ定義のための専⽤用⾔言語があると思
えば良良い
• src/caffe/proto/caffe.proto
• パラメータの意味はコメント参照
• 正確な使い⽅方の把握はコードを⾒見見るしかない
• 例例:LayerParameter
• 例例:InnerProductParameter
・・・
・・・
prototxt(抜粋)
prototxtの記述(3):Solverの設定
net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: GPU
(確率率率的)勾配降降下法
に関するの設定
訓練500イテレーショ
ンごとにテストを100
イテレーション実施
5000イテレーション
ごと学習モデルを保存
GPUモード
利利⽤用するネットワークを指定
コマンドラインからの実⾏行行
• 訓練
• build/tools/caffe train --solver solver.prototxt [--snapshot
snapshot.solverstate]
• テスト
• build/tools/caffe test --model train_val.prototxt --weight
network.caffemodel
• ベンチマーク
• build/tools/caffe time --model train_val.prototxt
• 学習済モデルを利利⽤用して画像分類
• build/examples/cpp_classification/classification.bin deploy.prototxt
network.caffemodel mean.binaryproto labels.txt img.jpg
ソースコードは
caffe/tools/caffe.cpp参照
Caffe Model(.caffemodel)
• 学習途中 or 学習終了了時のNetの状態をバイナリ形式で保存したもの
• Caffe Modelの保存間隔はsolver.prototxtのsnapshotで調節可能
• 学習済みの.caffemodelはModel Zoo(後述)で公開可能
デモ:example(MNIST)の実⾏行行
• ⼿手順の詳細・exampleの解説は公式
ドキュメントを参照
• http://caffe.berkeleyvision.org/
gathered/examples/mnist.html
データセットの準備
$ cd $CAFFE_ROOT
$ ./data/mnist/get_mnist.sh
$ ./examples/mnist/create_mnist.sh
CPUでの実⾏行行に変更更
examples/mnist/lenet_solver.prototxtの以下の⾏行行を変更更
solver_mode: GPU → solver_mode: CPU
実⾏行行
$ ./examples/mnist/train_lenet.sh
41
配布AMIで実験可
⾃自作プログラムからCaffeを利利⽤用する
• 訓練済学習モデルの利利⽤用や独⾃自の学習⽅方法(強化学習との組み合わせなど)をする時に必要
• prototxtを読み込み、Solver(訓練時)やNet(デプロイ時)のインスタンスを作成するのが良良い
• 使⽤用⽅方法はコマンドラインツールやExampleを参考
• 訓練
• C++:tools/caffe.cppのtrain関数
• Python:examples/01-learning-lenet.ipynb
• 学習モデルの利利⽤用
• C++:example/cpp_classification, example/hdf5_classification
• Python:python/classify.py
訓練済モデルをModel Zooで公開可能
• Caffeの学習済ネットワーク(model)・パラメータ(weights)利利⽤用する フレームワーク
• BVLC-trained models:BVLC公式のモデル
• レポジトリのmodels/以下にある
• ILSVRCで上位⼊入賞した主要なモデルは公開されている
• Community models:ユーザーが⾃自由に公開できるモデル
• wikiページで公開されている
• BVLCが公開するモデルは制限なしに利利⽤用できる ("released for unrestricted use")
• 使⽤用⽅方法はexamples/cpp_classification/ classification.cpp(C++), examples/00-
classification.ipynb(Python)を参考
デモ:ModelZooの訓練済モデルの利利⽤用
• bvlc_reference_caffenetのcaffemodelを⼊入⼿手
• imagenetのmeanfileを作成
• synsetを⼊入⼿手
• cpp_classificationにより画像を分類 (C++)
• classify.pyにより画像を分類(Python)
Caffe2
• Yangqing Jia(Caffeの著者)によるCaffeの試験的再実装
• Caffeが依存するライブラリが膨⼤大になる
• アーリーアダプター⽤用で多くの機能が未実装(CuDNN対応など)
• Caffeとの関係がどうなるかは未定
• 特徴
• 画像解析だけでなく、機械学習全般への汎⽤用性を志向
• 機能モジュールに分解(caffe-core, caffe-image, caffe-gpu, caffe-etc)
• インターフェースの単純化
まとめ
• Caffeは最も利利⽤用されているディープラーニングフレームワークの⼀一つです
• ネットワーク・最適化アルゴリズムの設定をprototxtで記述し、コマンドラインツールから訓
練・テスト・デプロイが可能です
• Python / Matlabから利利⽤用可能で、特にPythonはiPython notebookでの実例例が充実しています
• 訓練済の学習モデルはレポジトリやModel Zooで公開され、制限なしで利利⽤用可能です
• ディープラーニング導⼊入
• Caffe
• Chainer
Chainer概要
• 製作者:得居誠也、開発:Preferred Networks、Preferred Infrastructure
• バージョン:1.0.0(2015年年6⽉月9⽇日)、1.3.0(2015年年9⽉月2⽇日予定)
• ライセンス:MIT
• ⾔言語:Python(pip install chainerでインストール可)
• 依存モジュール:Python2.7+/3.4+、Numpy1.9+、Six1.9+
• CUDA依存モジュール:CUDA6.5+
特徴
• Powerful:CUDA・マルチGPU対応
• Flexible:ほぼ任意のアーキテクチャーを実現可能
• Intuitive:計算グラフを通常のPythonコードで記述可能
http://chainer.org
分散深層強化学習による⾃自動運転制御
https://research.preferred.jp/2015/06/distributed-deep-
reinforcement-learning/
深層学習フレームワークの現状
固定⻑⾧長データから可変⻑⾧長データへ
x
1
x
N
h
1
h
H
k
M
k
1
⼊入出⼒力力 応⽤用 機械学習⼿手法 アーキテクチャ
これまでの主流流 固定⻑⾧長 画像・⾳音声 分類・回帰 全結合, CNN
これからの主流流 可変⻑⾧長 映像・⾳音声
⾃自然⾔言語・センサー
強化学習
プログラム実⾏行行
RNN, LSTM,
NTM
CNN(LeNet)*
RNN LSTM **
50
* Deep Learning Tutorials http://deeplearning.net/tutorial/lenet.html
** Graves, Alex, et al. "A novel connectionist system for unconstrained handwriting recognition.
" Pattern Analysis and Machine Intelligence, IEEE Transactions on 31.5 (2009): 855-868. Figure 11
LSTM=Long Short-term Memory
NTM=Neural Turing Machine
深層学習フレームワークの現状
アーキテクチャの複雑化
• 深層学習で扱われるアーキテクチャーの複雑化
• GoogLeNet, NTM, Recursive Net, LSTM …
• 既存フレームワークではネットワーク記述が困難
Chainer Caffe
167⾏行行 2058⾏行行
GoogleNetのアーキテクチャ定義の必要⾏行行数
(2012)AlexNet*, 7層 ↑
(2014) GoogLeNet**, 22層→
51
* ImageNet Classification with Deep Convolutional Neural Networks
http://www.image-net.org/challenges/LSVRC/2012/supervision.pdf
** Szegedy, Christian, et al. "Going deeper with convolutions." arXiv preprint arXiv:1409.4842 (2014).
CPU版インストール
pip:pythonのパッケージ管理理ツール
six:Python2とPython3の差異異を吸収
し、同⼀一のコードが2/3両⽅方で動くよう
にするモジュール。2  *  3  =  6でsix
コマンド例例
$ apt-get update
$ apt-get upgrade
$ pip install -U six
$ pip install chainer
詳細は事前資料料「Chainerのインストールについて」参照
http://www.slideshare.net/KentaOono/chainer
GPU版インストール
• インストール⼿手順
• CUDAのインストール
• ChainerでGPUを利利⽤用する際に必要な依存
ライブラリのインストール
• chainer-cuda-depsというモジュールで
まとまっているのでこれをpipすれば良良
い
• Chainerのインストール(CPU版と同様)
コマンド例例
$ apt-get update
$ apt-get upgrade
$ pip install chainer-cuda-deps
$ pip install -U six
$ pip install chainer
example(MNIST)の実⾏行行
コードの⼊入⼿手(配布AMIでは不不要)
$ wget https://github.com/pfnet/chainer/archive/v1.2.0.tar.gz
$ tar xzf v1.2.0.tar.gz
$ python chainer-1.2.0/examples/mnist/train_mnist.py
CPU実⾏行行
$ python chainer/examples/mnist/train_mnist.py
GPU実⾏行行 <device id>は利利⽤用するGPUのID(nvidia-smiで確認可能、⼤大抵は0)
$ python chainer/examples/mnist/train_mnist.py -g <device id>
配布AMIで実験可
計算グラフ構築のパラダイム: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はこの
パラダイムを採⽤用
Chainerの構成要素(1):Variable / Function
• Variable:n次元配列列(ndarray/GPUArray)のラッパー
• x = chainer.Variable(numpy.ndarray(...))
• 元の配列列はx.dataに格納される
• Function:Variableの操作の基本単位
• Variable(s)を受け取り、Variable(s)を出⼒力力する
• Functionは⾃自分がどのVariableを⼊入⼒力力としたかを記憶する
• 出⼒力力のVariableは⾃自分がどのFunctionから出⼒力力されたかを記憶する
x yf
x = chainer.Variable(...)
y = f(x)
z = g(x)
zg
Forwardと同時に計算グラフを構築
x = chainer.Variable(...)
y = chainer.Variable(...)
z = x**2 + 2*x*y + y
z.backward()
実際には Splitノードが⾃自動的に挿⼊入される
x
y
_ ** 2
2 * _ _ * _
_ + _ z
_ + _
構築した計算グラフ上でBackward
x = chainer.Variable(...)
y = chainer.Variable(...)
z = x**2 + 2*x*y + y
z.backward()
z(x, y)のx, yに関する勾配が⾃自動的に計算される
それぞれの勾配はx.grad, y.gradに格納される
x
y
_ ** 2
2 * _ _ * _
_ + _ z
_ + _
例例:MNISTによる多層パーセプトロンの訓練
# Model definition
model = FunctionSet(
l1=F.Linear(784, 100),
l2=F.Linear(100, 100),
l3=F.Linear(100, 10)).to_gpu()
opt = optimizers.SGD()
opt.setup(model)
# Forward computation
def forward(x, t):
h1 = F.relu(model.l1(x))
h2 = F.relu(model.l2(h1))
y = model.l3(h2)
return F.softmax_cross_entropy(y, t)
# Training loop
for epoch in xrange(n_epoch):
for i in xrange(0, N, batchsize):
x = Variable(to_gpu(...))
t = Variable(to_gpu(...))
opt.zero_grads()
loss = forward(x, t)
loss.backward()
opt.update()
順伝播時に計算グ
ラフを動的構築
計算グラフ上
で逆伝播
例例:Recurrent Language Model
# Model definition
model = FunctionSet(
emb=F.EmbedID(1000, 100),
x2h=F.Linear( 100, 50),
h2h=F.Linear( 50, 50),
h2y=F.Linear( 50, 1000))
opt = optimizers.SGD()
opt.setup(model)
# Forward computation of one step
def fwd1step(h, w, t):
x = F.tanh(model.emb(w))
h = F.tanh(model.x2h(x) + model.h2h(h))
y = model.h2y(h)
return h, F.softmax_cross_entropy(y, t)
# Full RNN forward computation
def forward(seq):
h = Variable(...) # init state
sum_loss = 0
for curw, nextw in zip(seq, seq[1:]):
x = Variable(curw)
t = Variable(nextw)
h, loss = fwd1step(h, x, t)
sum_loss += loss
return sum_loss
h h
x,t
lo
ss
x,t
lo
ss
h
fwd1step
RNNの1ステップ
の計算
Chainerの構成要素(2):FunctionSet, Optimizer
FunctionSet:パラメータ化されたfunctionをまとめあげるクラス
主な使い⽅方
• functionのパラメータをまとめてGPUに転送する
• functionのパラメータと勾配をまとめてOptimizerに受け渡す
Optimizer:最適化アルゴリズム
l 主要なアルゴリズムを提供:SGD, MomentumSGD, AdaGrad, RMSprop, ADADELTA, Adam
l パラメータや勾配の操作も可能:weight decay, gradient clip,
例例:MNISTによる多層パーセプトロンの訓練
# Model definition
model = FunctionSet(
l1=F.Linear(784, 100),
l2=F.Linear(100, 100),
l3=F.Linear(100, 10)).to_gpu()
opt = optimizers.SGD()
opt.setup(model)
# Forward computation
def forward(x, t):
h1 = F.relu(model.l1(x))
h2 = F.relu(model.l2(h1))
y = model.l3(h2)
return F.softmax_cross_entropy(y, t)
# Training loop
for epoch in xrange(n_epoch):
for i in xrange(0, N, batchsize):
x = Variable(to_gpu(...))
t = Variable(to_gpu(...))
opt.zero_grads()
loss = forward(x, t)
loss.backward()
opt.update()
パラメータ・勾配を
まとめてGPUへ転送
Optimizerにパラ
メータ・勾配をま
とめてセット
柔軟なグラフ操作(1):unchain_backward
• 変数yより前のグラフを切切り落落とす
• yより前にはエラーが伝搬しない
• truncated BPTTを実装するのに便便利利
x f y g z
y g z
y.unchain_backward()
x = Variable(…)
y = f(x)
z = g(y)
y.unchain_backward()
BPTT:Back Propagation Through Time
RNNを時間⽅方向に展開したネットワーク上で逆伝播
をする操作(通常最初の時刻まで逆伝播する)
truncated BPTT
BPTTで逆伝播時に遡る時刻を途中で打ち切切る⼿手法
柔軟なグラフ操作(2):Volatile変数
• 計算グラフを構築しない変数
• ⾃自分を出⼒力力した関数を覚えていない
• ⾃自分を⼊入⼒力力して利利⽤用した関数は⼊入⼒力力したこ
とを覚えていない
• 誤差逆伝播が不不要な時や⼀一部分でのみ⾏行行う時に
有⽤用(例例:テスト時)
• volatile属性へのセットで変更更可能
x = Variable(..., volatile=True)
y = f(x)
y.volatile = False
z = h(y)
x f y g z
Volatile
Volatile:揮発性の
⾮非
Volatile
Volatile
⾮非
Volatile
Volatile性は関数適⽤用
で引き継がれる
Caffe Reference Modelサポート
• Caffe Model Zooで提供されているBVLC
Reference ModelをChainerのfunctionとして利利
⽤用可能
func =
CaffeFunction('path/to/bvlc_reference_
caffenet.caffemodel')
x = Variable(…)
y, = func(inputs={'data': x},
outputs=['fc8'])
CuPy:GPU版NumPy
• cupy.ndarray:numpy.ndarrayの配列列操作のサ
ブセットをサポート
• Elementwiseカーネル、Reduction カーネルを
記述可能
• CPUコードとGPUコードの統⼀一的な記述をサ
ポート
def softmax(x)
xp = get_array_module(x)
y = x – x.max(axis=1, keepdims=True)
y = xp.exp(y)
return y / y.sum(axis=1, keepdims=True)
⼊入⼒力力に応じて
numpy/cupyを選択
xp=numpy/cupy
いずれでもOK
まとめ
• ChainerはDefine-By-Runのコンセプトに基づいたPythonベースのディープラーニングフレーム
ワークです
• データの順伝播時に計算グラフを動的に構築することで、柔軟なネットワーク構築が可能です
• NumPy互換のGPU多次元配列列ライブラリCuPyをバックエンドに持つことで、CPUとGPUで統⼀一
的なコードの記述をサポートします
Copyright  ©  2014-‐‑‒
Preferred  Networks  All  Right  Reserved.
補⾜足資料料
ディープラーニングの応⽤用例例
定量量的構造活性相関(QSAR)での成功* **
71
* Multi-task Neural Networks for QSAR Predictions
George E. Dahl, Navdeep Jaitly and Ruslan Salakhutdinov
http://arxiv.org/abs/1406.1231
** http://blog.kaggle.com/2012/10/31/merck-
competition-results-deep-nn-and-gpus-come-out-to-play/
• 19アッセイでの化合物の活性をDeep NNを⽤用
いて同時に予測、これまでの予測精度度を超え
る結果を得る*
• ほぼ同様の⼿手法で同研究Gr. がMerck 主催の化
合物活性予測のコンペティションで優勝**
x
1
x
N
h
1
h
H
k
M
k
1
y
M
y
1
k
M
k
1
y
M
y
1
k
M
k
1
y
M
y
1
タスク
1
タスク
2
タスク
3
(参考)protoファイルからC++コード⽣生成と⽣生成コードの利利⽤用
build/src/caffe/proto/caffe.pb.h
・・・
・・・
src/caffe/proto/caffe.proto
src/caffe/layers/inner_product_layer.cpp
Caffeで定義済のLayer
• 画像認識識関連(畳み込み・プーリング・正規化など): vision_layers.hpp
• [De]ConvolutionLayer/Im2ColLayer/LRNLayer/[CuDNN]PoolingLayer/SPPLayer…
• 基本的な操作(Blobの変形など): common_layers.hpp
• ConcatLayer/SplitLayer/EltwiseLayer/ReshapeLayer…
• データフィーダーの抽象化: data_layers.hpp
• DummyDataLayer/HDF5DataLayer/ImageDataLayer/MemoryDataLayer…
• 損失関数: loss_layers.hpp
• AccuracyLayer/EucledianLossLayer/SigmoidCrossEntropyLayer/SoftmaxLayer…
• Elementwiseな操作(活性化関数など): neuron_layers.hpp
• AbsLayer/ExpLayer/LogLayer/DropoutLayer…
(参考)⾃自作のLayerを作成する(例例:MyLossLayer)
• 変更更箇所
• caffe.proto(パラメータ定義)
• loss_layers.hpp(Layer宣⾔言)
• 追加コード
• my_loss_layer.cpp(CPU実装)
• my_loss_layer.cu(GPU実装)
• test_my_loss_layer.cpp(テストコード)
• 命名規則はある程度度統⼀一されているので可能な
限りそれに従うのが良良い
caffe.proto
train_val.prototxtを改造
Chainer実装済のFunction(chainer.functions パッケージ)
Parameterized function:Pythonのクラスとして提供
• BatchNormalization Convolution2D Linear LSTM PReLU ReLU Inception, InceptionBN
• ⾃自然⾔言語処理理関係: EmbedID Bilinear HierachicalSoftMax NegativeSampling
Non-parameterized function:Pythonの通常の関数として提供
• 基本的な演算:basic_math identity matmul sum
• 活性化関数:dropout leaky_relu sigmoid softmax softplus tanh
• 損失関数:accuuracy cross_covariance mean_squared_error sigmoid_cross_entropy
softmax_cross_entropy
• 配列列操作:concat copy reshape split_axis
• 画像認識識関連:max_pooling_2d average_pooling_2d spatial_pyramidal_pooling
local_response_normalization
• サンプリング:gaussian
unchain_backwardによるTruncated BPTTの例例
I
0.2
am
0.3
+
メモリ上に
動的に展開
76
for i in xrange(jump*n_epoch):
x_batch = numpy.array(…)
y_batch = numpy.array(…)
state, loss = fwd1step(x_batch, y_batch, state)
accum_loss += loss
if i % bprop_len == 0:
optimizer.zero_grads()
accum_loss.backward()
accum_loss.unchain_backward()
accu_loss = 0
optimizer.update()
unchain_backwardによるTruncated BPTTの例例
I
0.2
am
0.3
+
77
for i in xrange(jump*n_epoch):
x_batch = numpy.array(…)
y_batch = numpy.array(…)
state, loss = fwd1step(x_batch, y_batch, state)
accum_loss += loss
if i % bprop_len == 0:
optimizer.zero_grads()
accum_loss.backward()
accum_loss.unchain_backward()
accu_loss = 0
optimizer.update()
unchain_backwardによるTruncated BPTTの例例
I
0.2
am
0.3
+
参照されていない変数は
本当はGCで回収される
78
for i in xrange(jump*n_epoch):
x_batch = numpy.array(…)
y_batch = numpy.array(…)
state, loss = fwd1step(x_batch, y_batch, state)
accum_loss += loss
if i % bprop_len == 0:
optimizer.zero_grads()
accum_loss.backward()
accum_loss.unchain_backward()
accu_loss = 0
optimizer.update()
unchain_backwardによるTruncated BPTTの例例
I
0.2
am
0.3
+
a
0.5
+
boy
1.0
+
79
for i in xrange(jump*n_epoch):
x_batch = numpy.array(…)
y_batch = numpy.array(…)
state, loss = fwd1step(x_batch, y_batch, state)
accum_loss += loss
if i % bprop_len == 0:
optimizer.zero_grads()
accum_loss.backward()
accum_loss.unchain_backward()
accu_loss = 0
optimizer.update()
unchain_backwardによるTruncated BPTTの例例
I
0.2
am
0.3
+
a
0.5
+
boy
1.0
+
80
for i in xrange(jump*n_epoch):
x_batch = numpy.array(…)
y_batch = numpy.array(…)
state, loss = fwd1step(x_batch, y_batch, state)
accum_loss += loss
if i % bprop_len == 0:
optimizer.zero_grads()
accum_loss.backward()
accum_loss.unchain_backward()
accu_loss = 0
optimizer.update()

日本神経回路学会セミナー「DeepLearningを使ってみよう!」資料