ディープラーニングのための GPU講習会- 九州大学スーパーコンピュータシステム ITOによる実習 -ディープラーニング基礎
山崎和博
NVIDIA, ディープラーニング ソリューションアーキテクト

ディープラーニングとはディープラーニングの基本と処理の流れ

AGENDA

ディープラーニングを支えるソフトウェア

本日使用するフレームワーク:
Chainer&ChainerMN

ディープラーニングとはディープラーニングは機械学習の一分野
人工知能（AI）
マシンラーニング（機械学習）

ディープラーニング（深層学習）

4

ディープラーニングとは多数の層から構成されるニューラルネットワークがベース
隠れ層

入力層

出力層

十分なトレーニングデータを与え学習させることで複雑な問題を解くことができるようになる
5

ディープラーニングを加速する3つの要因

DNN

BIG DATAGPU“ Google’s AI engine also reflects how the world of computer hardware is changing.

(It) depends on machines equipped with GPUs… And it depends on these chips morethan the larger tech universe realizes.”
6ディープラーニングの基本と処理の流れ

人工ニューラルネットワーク
基本単位
人工ニューロン（パーセプトロン）

y

w1x1

w2

w3x2x3

人工ニューロンをたくさんの層として組み合わせる

各層にそれぞれ重みパラメータを持つ

y=w1x1+w2x2+w3x3

人工ニューラルネットワーク

8

人工ニューラルネットワーク
活性化関数

tanh

ReLU

人工ニューロン（パーセプトロン）x1x2x3

sigmoid

活性化関数(activation function)

w1
w2

y

Fz

次の層

w3

y=w1x1+w2x2+w3x3

z=F(y)
F: activation function
9人工ニューラルネットワーク
基本構造のまとめ各ユニット（ノードとも）の出力は、各層の重みと積算され次の層へ
活性化関数

各ノードは入力された値を合計して出力10人工ニューラルネットワーク
基本構造のまとめ各ユニット（ノードとも）の出力は、各層の重みと積算され次の層へ活性化関数

各ノードは入力された値を合計して出力11ディープラーニングの2つのフェーズ
学習(training):
猫

フィードバックにより重みを調整
猫
犬

犬

蜜穴熊

推論(inference):モデル

狸

学習した結果を用いる

犬
モデル
12

ディープラーニングの学習フロー
トレーニングデータ

4.誤差が小さくなるまで繰り返す1.入力されたデータにしたがい結果を出力

出力
“dog”
“cat”
“human”“tiger”

3.誤差を用いてネットワークを更新

2.期待結果との違いを誤差として計算

誤差

正解ラベル
“cat”
“dog”
“monkey”“lion”
13

ディープラーニングの学習フロー
トレーニングデータ

4.誤差が小さくなるまで繰り返す

1.入力されたデータにしたがい結果を出力

出力
“dog”
“cat”
“human”“tiger”

3.誤差を用いてネットワークを更新

2.期待結果との違いを誤差として計算

誤差

正解ラベル
“cat”
“dog”
“monkey”“lion”
14

誤差の計算トレーニングデータ

出力
出力“tiger” 80%“tiger”“lion” 20%

出力

正解ラベル

80%

0%

20%

100%

“tiger”

誤差

期待結果との差などを誤差として計算“lion”
15

誤差の計算トレーニングデータ

出力
出力“tiger” 80%“tiger”“lion” 20%

誤差の例: 交差エントロピー(cross entropy): 入力がtigerかを示す正解(0 or 1): 入力がlionかを示す正解(0 or 1): 入力がtigerと予測した確率: 入力がlionと予測した確率
16

ディープラーニングの学習フロー
トレーニングデータ

4.誤差が小さくなるまで繰り返す

1.入力されたデータにしたがい結果を出力

出力
“dog”
“cat”
“human”“tiger”

2.期待結果との違いを誤差として計算

3.誤差を用いてネットワークを更新

誤差

正解ラベル
“cat”
“dog”
“monkey”“lion”17

重み更新
勾配降下法による更新
誤差 E
ニューラルネットワークの内部状態（＝重み）に応じて誤差は変動

誤差を最小化する重みが最適解

最適解

現在値

重み w

18

重み更新
勾配降下法による更新
誤差 E
傾きが正（＝右上がり）なら値を減少させる

傾きが負（＝右下がり）
なら値を増加させる

wn

最適解

wm

重み w

19

重み更新
勾配降下法による更新
勾配ベクトルにより重みを逐次更新

誤差 E

傾きが正（＝右上がり）
なら値を減少させる

傾きが負（＝右下がり）
なら値を増加させる

wn

最適解

wm

重み w

20

ディープラーニングの学習フロー
トレーニングデータ

4.誤差が小さくなるまで繰り返す

1.入力されたデータにしたがい結果を出力

出力
“dog”
“cat”
“human”“tiger”

2.期待結果との違いを誤差として計算

3.誤差を用いてネットワークを更新

誤差

正解ラベル
“cat”
“dog”
“monkey”“lion”
21

誤差逆伝播法を更新したい直接計算することが容易ではないが必要
22

誤差逆伝播法を直接考えるのではなく、を考える

23

誤差逆伝播法はとしてのみ出現するのでとできる
24

誤差逆伝播法を更新したいは次の層の複数要素に影響
25

誤差逆伝播法
いろいろ計算すると、処理対象層の情報なので計算可能となる。
繰り返し処理により計算可能

26

誤差逆伝播法を更新したい

27

誤差逆伝播法
トレーニングデータ

処理のイメージ

誤差

誤差を逆方向に伝えて、各層の重み行列を更新する
28

ディープラーニングの学習フロー
トレーニングデータ

4.誤差が小さくなるまで繰り返す

1.入力されたデータにしたがい結果を出力

出力
“dog”
“cat”
“human”“tiger”

2.期待結果との違いを誤差として計算

3.誤差を用いてネットワークを更新

誤差

正解ラベル
“cat”
“dog”
“monkey”“lion”
29

学習プロセスの単位: ミニバッチ
全トレーニングデータ（バッチ）
ミニバッチ#3
ミニバッチ#2
ミニバッチ#1

ミニバッチ単位で誤差を計算し更新

ミニバッチ#1
誤差
誤差
誤差
誤差30

学習プロセスの単位: エポック
全トレーニングデータ（バッチ）
ミニバッチ#3ミニバッチ#2
ミニバッチ#1

全トレーニングデータを使った1サイクルをエポック(epoch)と呼ぶ

ミニバッチ#3
ミニバッチ#2
ミニバッチ#1
誤差
誤差誤差
誤差
誤差誤差
31

ディープラーニングを支えるソフトウェア

ディープラーニング フレームワーク
GPUで高速化されたディープラーニング フレームワークが多数存在

Mocha.jl

ディープラーニング フレームワーク
https://developer.nvidia.com/deep-learning-frameworks

33

NVIDIA DEEP LEARNING プラットフォーム
アプリケーション

本日使用する
Image Classification Object Detection
フレームワーク
COMPUTERVISION

フレームワーク

ディープラーニング
SDK

Voice Recognition

Translation

Recommendation
Engines

Sentiment Analysis

BEHAVIORSPEECH AND AUDIO

Mocha.jl

cuDNN

TensorRT

cuBLAS

cuSPARSE

cuFFT
NCCL

DEEP LEARNING

Tesla
V100

GPU プラットフォーム
CLOUD

MULTI-GPUMATH LIBRARIES
Tesla
P40/P4

Jetson TX2GPU

DRIVEPX2

DGX-1

SERVER34本日使用するフレームワーク:
CHAINER&CHAINERMN

35

CHAINER

Pythonベースのディープラーニング フレームワーク• Preferred Networks社によって開発•最新はv4.0.0 (2018/05/08時点)

https://chainer.org/• NumPyインターフェース互換のGPU用
https://github.com/chainer/chainer
数値計算ライブラリCuPyで計算を高速化• 柔軟に記述でき、デバッグしやすく、直感的• Define-by-Run方式(後述)の先駆者
36

CHAINER

ソフトウェアスタックのイメージ

http://www.slideshare.net/unnonouno/chainer-59664785から引用

37

CHAINER

特徴的な実行方式: Define-by-Run# Define-and-Run# 計算グラフを構築後に、計算を実行# Define-by-Run# 計算グラフの構築と実行が同時

x = Variable(‘x’)
w = Variable(‘w’)
y = x * w

for xi, wi in data:
x = Variable(xi)w = Variable(wi)y = x * w

for xi, wi in data:eval(y, (xi, wi))

データに応じて処理を分岐することが容易

38

CHAINER

特徴的な実行方式: Define-by-Run# Define-and-Run# 計算グラフを構築後に、計算を実行# Define-by-Run# 計算グラフの構築と実行が同時

x = Variable(‘x’)
w = Variable(‘w’)
y = x * w

for i, (xi, wi) in enumerate(data):
x = Variable(xi)w = Variable(wi)if i % 2 == 0:y = x * welse:
y = x + w

for xi, wi in data:eval(y, (xi, wi))

39

CUPY
GPUで動作するNumPy互換の数値計算ライブラリ• CUDAで高速化された数値計算ライブラリ• 最新はv4.0.0 (2018/05/08時点)• NumPy互換のI/Fを持つ• CPUで実装したコードをシームレスにGPU化

https://cupy.chainer.org/
https://github.com/cupy/cupy• もとはChainerの内部モジュールとして開発• 現在は単独でも提供されている• インストールコマンドは pip install cupyなど

40

CUPY
GPUで動作するNumPy互換の数値計算ライブラリ
NumPyコードCuPyコード

import numpy

import cupy

x = numpy.array([1,2,3], numpy.float32)
y=x*x
s = numpy.sum(y)print(s)x = cupy.array([1,2,3], cupy.float32)
y=x*xs = cupy.sum(y)print(s)41CHAINERMN
Chainerをベースとした分散学習用ライブラリ• マルチノードでの分散学習をサポートするための追加パッケージ

https://github.com/chainer/chainermn• 最新はv1.2.0 (2018/05/08時点)• CUDA-aware MPIやNCCLなどのライブラリを利用して実装• 大規模なクラスタでも非常によくスケールする

42

まとめ
• ディープラーニングはニューラルネットワークを基本としている• 学習では、勾配法や誤差逆伝播法を用いて、パラメータを更新• さまざまなフレームワークがあり、用途に応じて使い分けることも重要

www.nvidia.com/dli