齋藤 俊太
経歴:Keio Univ. (Bachelor, Master, D進)
→UC Berkeley (Visiting Student Researcher)
→Keio Univ. (Ph. D. in Engineering 取得)
→Facebook, Inc. (Contractor)
→Preferred Networks, Inc. (Researcher)
専門:Computer Vision
仕事:Chainerの開発、CV系応用研究
Researcher at Preferred Networks, Inc.
博論:“Semantic Segmentation for Aerial
Imagery with Convolutional Neural Network”
Founded : March. 2014
Office : Tokyo, San Mateo
Employees : ~80(8割以上が研究者又はエンジニア)
Investors : FANUC, Toyota, NTT
AutomotiveHumanoid Robot
Consumer Industrial
Cloud
Device
Photo
Game
Text
Speech
Infrastructure
Factory
Robot
Automotive
Healthcare
Smart City
Industry4.0
Industrial IoT
Powerful
☑ CUDA
☑ cuDNN
☑ NCCL
Flexible
☑ Convolutional Network
☑ Recurrent Network
☑ Many Other Components
☑ Various Optimizers
Intuitive
☑ Define-by-Run
☑ High debuggability
CUDAを用いたGPU計算のサポート
cuDNNによる高速な学習/推論
NCCLを用いた高速なマルチGPU学習をサポート
N次元の入力に対応したConvolution, Deconvolution, Pooling, BN, 等
LSTM, Bi-directional LSTM, GRU, Bi-directional GRU, 等のRNNコンポーネント
ニューラルネットワークで使われる多くのレイヤ定義、各種ロス関数
SGD, MomentumSGD, AdaGrad, RMSProp, Adam, 等の最適化手法が選択可能
複雑なネットワークの記述が容易
Pythonライブラリであるためエラー箇所の特定が容易:デバッグしやすい
様々なNNの学習で共通する部分を抽象化、一連の学習フローを簡易に記述可☑ Simple APIs
目的関数を設計
• 何を学習させる
のか、を考える
• ロス関数などの
形で定義する
勾配の計算
• ネットワークの
パラメータにつ
いての目的関数
の勾配を求める
最適化
• 計算した勾配を
用いてネット
ワークのパラ
メータを最適化
問題に合わせて
自分で設計
x
y
_ ** 2
2 * _ _ * _ _ + _ z
_ + _
計算グラフの定義と、
定義に従って計算を実
際に行うコードが別に
存在
静的 実際に計算を行うコー
ド自体が計算グラフの
定義として扱われる
動的
by
 Define-and-Run(静的グラフ)
まず計算グラフを構築し、構築した計算グラフにデータを流すという、2ステッ
プから成る(Caffe, theano, TensorFlowなど)
 Define-by-Run(動的グラフ)
通常の行列演算をする感覚で順伝播処理をすると同時に、逆伝播用の計算グラ
フが構築される(Chainer, DyNet, PyTorchなど)
# 構築
x = Variable(‘x’)
y = Variable(‘y’)
z = x + 2 * y
# 評価
for xi, yi in data:
eval(z, (xi, yi))
# 構築と評価が同時
for xi, yi in data:
x = Variable(xi)
y = Variable(yi)
z = x + 2 * y
データを見ながら
違う処理をしてもよい
Define-and-Run Define-by-Run
Convolutional Networkを書く方法1
import chainer
import chainer.links as L
import chainer.functions as F
class LeNet5(chainer.Chain):
def __init__(self):
super(LeNet5, self).__init__()
with self.init_scope():
self.conv1 = L.Convolution2D(1, 6, 5, 1)
self.conv2 = L.Convolution2D(6, 16, 5, 1)
self.conv3 = L.Convolution2D(16, 120, 4, 1)
self.fc4 = L.Linear(None, 84)
self.fc5 = L.Linear(84, 10)
S
※V2対応コードへ変更したため発表
時の資料とは若干異なります
Convolutional Networkを書く方法2
class LeNet5(chainer.Chain):
def __init__(self):
super(LeNet5, self).__init__()
net = [('conv1', L.Convolution2D(1, 6, 5, 1))]
net += [('_sigm1', F.Sigmoid())]
net += [('_mpool1', F.MaxPooling2D(2, 2))]
net += [('conv2', L.Convolution2D(6, 16, 5, 1))]
net += [('_sigm2', F.Sigmoid())]
net += [('_mpool2', F.MaxPooling2D(2, 2))]
net += [('conv3', L.Convolution2D(16, 120, 4, 1))]
net += [('_sigm3', F.Sigmoid())]
net += [('_mpool3', F.MaxPooling2D(2, 2))]
net += [('fc4', L.Linear(None, 84))]
net += [('_sigm4', F.Sigmoid())]
net += [('fc5', L.Linear(84, 10))]
net += [('_sigm5', F.Sigmoid())]
for name, layer in net:
if not name.startswith('_'):
with self.init_scope():
setattr(self, name, layer)
self.forward = net
def __call__(self, x):
for n, f in self.forward:
if not n.startswith('_'):
x = getattr(self, n)(x)
else:
x = f(x)
return x
※V2対応コードへ変更したため発表
時の資料とは若干異なります
モデルの学習
model = LeNet5()
model = L.Classifier(model)
# データセットはリスト([]でアクセスでき、__len__を持てば良い)
dataset = [(x1, t1), (x2, t2), ...]
# データセットから batchsize 個のデータを束ねて返してくれるイテレータ
it = iterators.SerialIterator(dataset, batchsize=32)
# 最適化手法 (SGDをMomentumSGD, Adam, RMSplop, AdaGradなどに変えれば、容易に色々な
# 最適化手法を試すことが可
opt = optimizers.SGD(lr=0.01)
opt.setup(model)
updater = training.StandardUpdater(it, opt, device=0) # CPUで計算する場合はdevice=-1
trainer = training.Trainer(updater, stop_trigger=(100, 'epoch'))
trainer.run()
https://github.com/pfnet/chainer/tree/master/examples
CuPy: ChainerのGPUバックエンド(NumPy互換GPU Arrayライブラリ)
NumPyを使って書かれたコードをGPUで実行
ChainerMN: 分散深層学習用追加パッケージ
高いスケーラビリティ(128GPUで100倍の高速化)
ChainerRL: 深層強化学習ライブラリ
DQN, DDPG, A3C, ACER, NSQ, PCL, etc. OpenAI Gym サポート
ChainerCV: 画像認識アルゴリズム・データセットラッパーパッケージ
Faster R-CNN, Single Shot Multibox Detector (SSD), SegNet, etc.
【バックエンド/追加パッケージ】
MN
RL
CV
https://github.com/intel/chainer
CPU
CuPy
NVIDIA GPU
CUDA
cuDNN
BLAS
NumPy
Chainer
MKL-DNN
Intel Xeon/Xeon Phi
MKL
Intel Chainer Chainer with NumPy (MKL-Build)
Alexnet Forward 429.16 ms 5041.91 ms
Alexnet Backward 841.73 ms 5569.49 ms
Alexnet Total 1270.89 ms 10611.40 ms
およそ8.35倍の高速化!
https://github.com/intel/chainer
CUDA for Python
ChainerにおけるGPU計算を全て担当するライブラリが独立
NumPy互換APIで低コストにCPUコードをGPUへ移行
特異値分解などの線形代数アルゴリズムをGPU実行
KMeans, Gaussian Mixture ModelなどのExampleの充実
https://github.com/cupy/cupy
Chainer on Multi Nodes
Chainerの使いやすさはそのままに,複数GPU,複数ノード環境で高速
に学習することができる(現在はデータパラレルのみに対応)
GPU
GPU
InfiniBand
GPU
GPU
InfiniBand
ノード内通信(NVIDIA NCCLライブラリ)と
ノード間通信(CDUA-aware MPI)を活用し全体を最適化
InfiniBand
MPI
ChainerMN
pyMPI
NCCL
NVIDIA GPU
ノード内 ノード間
CuPy
使用するGPU数に対してほぼ線形な速度向上
既存のコードを多少書き換えるだけで利用できる(!)
optimizer = chainer.optimizers.MomentumSGD()
optimizer = chainermn.DistributedOptimizer(
chainer.optimizers.MomentumSGD())
• GPUサーバクラスタを用意
• 可能ならInfiniBandで接続されたクラスタがベター(その場合ドライバ
のインストールなどInfiniBandのセットアップを行う)
• 公式ドキュメント
https://chainermn.readthedocs.io/en/latest/installation/guide.html
にしたがって、必要ライブラリを全ノードにインストール
⁃ CUDA-aware MPI (OpenMPI or MVAPICH)
⁃ NVIDIA NCCL
⁃ MPI4py
https://github.com/pfnet/chainermn
Chainer + Reinforcement Learning
エージェントが環境とのインタラクションを通じて報酬を最大
化する行動を学習する
• Deep Q-Network (Mnih et al., 2015)
• Double DQN (Hasselt et al., 2016)
• Normalized Advantage Function (Gu et al., 2016)
• (Persistent) Advantage Learning (Bellemare et al., 2016)
• Deep Deterministic Policy Gradient (Lillicrap et al., 2016)
• SVG(0) (Heese et al., 2015)
• Asynchronous Advantage Actor-Critic (Mnih et al., 2016)
• Asynchronous N-step Q-learning (Mnih et al., 2016)
• Actor-Critic with Experience Replay (Wang et al., 2017) <- NEW!
• Path Consistency Learning (Nachum et al., 2017) <- NEW!
• etc.
https://github.com/pfnet/chainerrl/blob/master/examples/quickstart/quickstart.ipynb
Chainer + Computer Vision
新しい/自前
のモデルを既
存手法と比較
したい
https://github.com/pfnet/chainercv
Datasets
Pascal VOC, Caltech-
UCSD Birds-200-
2011, Stanford
Online Products,
CamVid, etc.
Models
Faster R-CNN, SSD,
SegNet (will add
more models!)
新しい(自前
の)データセッ
トで既存モデル
を学習させたい
https://github.com/pfnet/chainercv
https://github.com/pfnet/chainercv
https://github.com/pfnet/chainercv
 世界コンピュータ将棋選手権に出場、2位
 Ponanza(世界コンピュータ将棋選手権2連覇(2015, 2016))ベース
 Ponanzaが探索を行う指し手のオーダリングにDeep Learningを応用し
た技術を使用し、対Ponanzaで8割以上の勝率
Team PFN
Issei Yamamoto Akira Shimoyama
Team Ponanza
 線画の自動着色を行うWeb
サービス
 線画とその着色済み画像の
ペアを大量に用意
 線画+ヒントを入力にして、
着色後画像を出力する畳み
込みネットワークを訓練
 ただそれだけでは塗りにバ
リエーションが出ない…
 Adversarial lossを加えるこ
とでより自然で多様な塗り
を実現
https://paintschainer.preferred.tech
http://landinghub.visualstudio.com/visual-cpp-build-tools
https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/rdp/cudnn-download
https://www.continuum.io/downloads
https://github.com/pfnet/chainer
クラウドコンピューティング エッジヘビーコンピューティング
クラウドコンピューティングから、新しいコンピューティングへ
https://github.com/pfnet/chainer
セッションアンケートにご協力ください
 専用アプリからご回答いただけます。
decode 2017
 スケジュールビルダーで受講セッションを
登録後、アンケート画面からご回答ください。
 アンケートの回答時間はたったの 15 秒です!
Ask the Speaker のご案内
本セッションの詳細は『Ask the Speaker Room』各コーナーカウンタにて
ご説明させていただきます。是非、お立ち寄りください。

[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用