SlideShare a Scribd company logo
1 of 62
Download to read offline
深層学習フレームワーク
Chainer の開発と今後の展開
得居 誠也 / MIRU2016@アクトシティ浜松
Preferred Networks, Inc. / 東京大学
2016/08/01
自己紹介
 得居 誠也 (Seiya Tokui)
 Preferred Infrastructure (2012-2014), Preferred Networks (2014-)
– 分散機械学習基盤 Jubatus
– maf (実験管理)
– Chainer (NN フレームワーク)
 東京大学 情報理工 コンピュータ科学専攻 博士課程 (2016-)
 興味
深層学習、表現学習、強化学習、生成モデル
コンピュータビジョン、言語処理、ロボティクス
2
AI 分野はオープンソースソフトウェア(OSS)に支えられている
思いつくものを挙げると
 多次元配列: NumPy/SciPy, R, Eigen::Tensor
 プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js
 機械学習: scikit-learn, LIBSVM/LIBLINEAR
 データ解析: Pandas, R (data frame)
 コンピュータビジョン: OpenCV, PCL, VLFeat
 自然言語処理: NLTK, gensim, mecab, CoreNLP
 音声認識: Kaldi, Julius
 深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer
 etc…
3
AI 分野はオープンソースソフトウェア(OSS)に支えられている
思いつくものを挙げると
 多次元配列: NumPy/SciPy, R, Eigen::Tensor
 プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js
 機械学習: scikit-learn, LIBSVM/LIBLINEAR
 データ解析: Pandas, R (data frame)
 コンピュータビジョン: OpenCV, PCL, VLFeat
 自然言語処理: NLTK, gensim, mecab, CoreNLP
 音声認識: Kaldi, Julius
 深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer
 etc…
4
研究における OSS の開発
 (ソフトウェア開発が本職ではない)学生や研究者が多く参加している
 そもそもアカデミックな組織が主体となって作っているものも多い
(Caffe, Theano, MXNet など)
 企業が主体となっている OSS でも学生や研究者が多くコミットしている
(Torch, TensorFlow, Chainer, etc.)
 背景として、最先端の研究に使われているという点がある
– 深層学習の業界は arXiv 先行で非常にスピードが速い
– 最先端を知る研究者自身が開発に参加していかないと研究スピードが追いつかない
– 再現や応用の敷居の高さによって後続研究が出てくるスピードが変わる(印象)
5
本発表の目的と内容
 深層学習に関わる学生・研究者の方々に、OSS 開発の実際のところを知っても
らい、どんどん参加できるようになってもらう
 とくに学生・研究者の方々からの深層学習フレームワークへの貢献を増やす
そのために以下の事柄について話します
 ニューラルネットのおさらい
 深層学習フレームワークの全体像
 Chainer の基本的な概念と使い方
 Chainer の OSS 開発
 Chainer の今後の展開
6
ニューラルネットのおさらい
7
ニューラルネット (NN)
本発表では、「深層学習」=「深い NN をつかった機械学習」とします
NN とは?
 意外と難しい言葉
 「シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、
学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデ
ル全般を指す」 (https://ja.wikipedia.org/wiki/ニューラルネットワーク)
こういう絵をよく書く
ニューラルネット (NN)
 現在よく使われるプロセッサでは、数値演算をベクトル化することで並列性を
高められる(CPU, GPU)
 ニューラルネットの 1 層分の結合は、行列積として書ける
 さらに並列性を高めるために、ミニバッチがよく使われる(複数のデータ点に
ついて一度に計算する)
これらを踏まえると、1 ユニットずつバラバラに書いた古典的な描像よりも、1 レ
イヤーを一つの単位にまとめたベクトル化された捉え方の方が、計算上扱いやすい
9
こういう絵の方が扱いやすい
各ノードは多次元配列を表す
ニューラルネット=計算グラフ
 最近はどんどん複雑なニューラルネットが扱われるようになっている
(encoder-decoder, attention, residual net, etc.)
 もともとの「脳のニューロンのモデル化」を離れて、「微分可能な演算をうま
く組み合わせたもの」になってきている
 この考え方をおしすすめると、ニューラルネット=計算グラフ となる
 たとえば、最小二乗法による線形回帰の損失計算は下の計算グラフで書ける
(これも広義にはニューラルネットと思える)
10
matmul + MSE
MSE: Mean Squared Error
ニューラルネットの学習:確率的勾配法
 確率的勾配降下法:パラメータ , 目的関数 として
 このように勾配の不偏推定量のサンプリングに基づく確率的最適化をここでは
「確率的勾配法 (stochastic gradient methods)」と呼ぶことにする
 勾配のランダムネスには二種類ある
– ミニバッチによるランダムネス:目的関数がデータ点ごとの関数の和で書かれるとき、
一部のデータ点に対してだけ勾配を計算すると、全体の勾配の不偏推定になる
– 計算過程のランダムネス:ニューラルネットの中にランダムな振る舞いをする演算を
入れる(例:dropout など)
– → どちらも計算グラフの枠組みで扱える
11
学習率 勾配の不偏推定
 合成関数の微分は、ヤコビ行列の積でかける
たとえば線形回帰の例では:
 このヤコビ行列の積を 1 つずつ計算する:自動微分
– cf.) 数値微分、シンボル微分(これらは違う手法!)
計算グラフの自動微分
12
matmul + MSE
計算グラフのリバースモード自動微分=誤差逆伝播法
 ニューラルネットの場合、微分をとりたい入力変数(=パラメータ)は高次元
で、出力変数(=目的関数値)はスカラー
 この場合、ヤコビ行列は右からかけていくのが効率的
 この方法を誤差逆伝播やリバースモード自動微分(高速自動微分)という
13
matmul + MSE
現代的なニューラルネット
 基本的には「(微分可能な)計算グラフ」と捉えるのがよい
 とくに、全結合層や畳込み層などパラメータを持つ線形変換が途中に含まれる
ものを指すことが多い
– そうでない場合は、たとえ勾配法で学習する場合でもニューラルネットと呼ばないこ
とが多いように思う
 ニューラルネットはどんどん複雑になっていっている
– 多層化:VGG, GoogLeNet, ResNet, …
– 組合せ:Encoder-Decoder, VAE, GAN, …
– 新しい演算:LSTM/GRU, soft attention, memory, dilated convolution, …
⇒ フレームワークの柔軟性がますます重要に
14
深層学習フレームワークの全体像
15
深層学習のフレームワーク
 数が多い!!!
 “Wikipedia:Comparison of deep learning software” に載っているもの:
Caffe, Chainer, CNTK, Deeplearning4j, MXNet, Neural Designer, OpenNN, SINGA,
TensorFlow, Theano, Torch, adnn, Blocks, CNNLab, ConvNetJS, Cortex,
CURRENNT, DeepCL, DeepLeanringKit, DeepLearnToolbox, DeepX, DSSTNE,
Faster RNNLM (HS/NCE) toolkit, GNU Gneural Network, IDLF, Keras, Lasagne,
Leaf, LightNet, MatConvNet, Neon, Neural Network Toolbox, Pylearn2, scikit-
neuralnetwork, Tensor Builder, TensorGraph, Theano-Lights, tiny-cnn, Torchnet,
Veles
 2014-2015 に特にたくさん公開され、今年は少し落ち着いてきたように思う
16
https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software
なぜニューラルネットにはフレームワークが必要?
NN 研究における要求:
 NN のトポロジーを柔軟に定義したい
 試行錯誤のサイクルを高速に回したい
– できるだけ NN の定義に依存するコードを減らしたい
(コードのごく一部を変更するだけでいろいろな NN を試したい)
– 計算性能も(研究者による最適化なしに)高くしたい
そのために必要なもの:
 勾配計算の自動化(自動微分)
 CUDA プログラミングの簡易化
 効率的な実行(計算の自動最適化)
 訓練ループにおける定型処理の抽象化
17
フレームワークでカバーしたい
NN フレームワークのソフトウェアスタック
18
デバイス特化の基盤
(e.g. BLAS, CUDA, OpenCL, cuBLAS)
デバイス特化の
NN 演算
(e.g. cuDNN)
多次元配列
(e.g. Eigen::Tensor, NumPy,
CuPy)
計算グラフの実装
NN 実装の抽象化
訓練・評価ループの実装
“Low level API”
“High level API”
“Backend”
NN フレームワークのソフトウェアスタック
19
デバイス特化の基盤
(e.g. BLAS, CUDA, OpenCL, cuBLAS)
デバイス特化の
NN 演算
(e.g. cuDNN)
多次元配列
(e.g. Eigen::Tensor,
NumPy, CuPy)
計算グラフの実装
NN 実装の抽象化
訓練・評価ループの実装
Theano
TensorFlow
Keras
TFLearn
Chainer
CuPyTorch
cuTorch
Torch.nn
たくさんあるフレームワークは何が違うのか
(少なくとも一定以上使われているものについては)それぞれ「売り」がある
 パフォーマンスが売り
Caffe, Theano, Torch, TensorFlow, MXNet, Neon
 スケーラビリティが売り
TensorFlow, MXNet
 ハックしやすさが売り
Chainer, Torch
 デバッグしやすさ・直感性が売り
Chainer
 コミュニティの規模が売り
Caffe, Theano, Torch, TensorFlow
細かい違いはもっといっぱいある
20
どれを選ぶか?
 自分のタスクに適したものを選ぶ
 一緒に使うほかのツールとの相性
で選ぶ(言語など)
 使い勝手、好みで選ぶ(重要)
PAKDD 2016
DLIF チュートリアル
http://www.slideshare.net/beam2d/differences
-of-deep-learning-frameworks
より詳しいフレームワーク間の違
いについては、PAKDD 2016 で発
表したチュートリアルの得居の資
料により詳しく書いています
S. Tokui, K. Oono, A. Kanemura
and T. Kamishima.
Tutorial on Deep Learning
Implementations and Frameworks.
21
Chainer の基本的な概念と使い方
22
Chainer のソフトウェアスタック
Python ベースの NN フレームワーク(太字部分が Chainer)
デバイス特化の基盤
BLAS, CUDA, cuBLAS, cuRAND
デバイス特化の
NN 演算
cuDNN
多次元配列
NumPy, CuPy
計算グラフの実装: Function/Variable
NN 実装の抽象化: Link/Chain, Optimizer, Serializer
訓練・評価ループの実装: Dataset, Trainer
“Low level API”
“High level API”
“Backend”
Chainer のインストール方法
 Python 2.7.6+, 3.4.3+, 3.5.1+ の環境で pip install chainer
 CUDA サポートを有効にするには、あらかじめ環境変数をセットしておく。
典型的な例:
 cuDNN (v2 ~ v5.1 に対応) のサポートを有効にするには、同様にあらかじめ
環境変数をセットしておく
 Chainer インストール後に CUDA/cuDNN を有効化・アップデートしたい場合、
一度 Chainer をアンインストール(pip uninstall chainer)してから、環
境変数を設定して再インストール
24
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
Chainer における計算グラフ
Variable が配列ノードを、Function が演算ノードを表す
 Variable は、配列(NumPy もしくは CuPy)を 2 つ保持する
– data が順伝播時の配列、grad が逆伝播時の配列(=勾配)
 Variable に Function を適用すると、Variable が返ってくる
– data に順伝播の結果が入っている
– この Variable は、過去の計算の履歴を覚えている
– 演算の履歴は、非巡回有効グラフ (DAG) の形をしている。つまり計算グラフ
 ロス(スカラー値)の Variable に対して backward() メソッドを呼び出す
と、計算グラフをたどって誤差逆伝播を実行する
このように Chainer では順伝播の計算時に動的にグラフを構築する
(動的計算グラフ、Define-by-Run)
25
import chainerimport chainer, chainer.functions as F, numpy as np
W = chainer.Variable(np.array(...))
b = chainer.Variable(np.array(...))
x = np.array(...)
y = np.array(...)
a = F.matmul(W, x)
y_hat = a + b
ell = F.mean_squared_error(y, y_hat)
print(ell.data) # => ロス値を出力
例:線形回帰
26
matmul + MSE
入力の準備(あとで grad を取り出
す場合はあらかじめ Variable にし
ておく)
順伝播の計算
例:線形回帰
27
matmul + MSE
a = F.matmul(W, x)
y_hat = a + b
ell = F.mean_squared_error(y, y_hat)
ell.backward() # ロスの勾配を計算
print(W.grad) # => W に対する勾配を出力
print(b.grad) # => b に対する勾配を出力
ニューラルネットのコンポーネント化: Link/Chain/ChainList
 Link: 順伝播のコード片と、それに紐づくパラメータをまとめたもの
– ニューラルネットのオブジェクト指向プログラミング
 Chain, ChainList: 順伝播のコード片と、そこで使われる Link をまとめたもの
– コンポーネントを階層化するもの
– これら自身も Link なので、入れ子にできる
– 子 Link を名前で管理するのが Chain, インデックス番号で管理するのが ChainList
これらには、ニューラルネットを扱う上での便利な機能もついている
 Link 階層内のすべてのパラメータを集めてくる
 Serializer を使ったパラメータのセーブ・ロード (npz, HDF5 に対応)
 階層内のすべての Link を指定した GPU のメモリに送る
28
例:全結合層
29
import chainer, chainer.functions as F
import numpy as np
class Linear(chainer.Link):
def __init__(self, n_in, n_out):
super().__init__(W=(n_in, n_out), b=n_out)
chainer.init_weight(self.W.data, None)
chainer.init_weight(self.b.data, 0)
def __call__(self, x):
xW = F.matmul(x, self.W)
return xW + F.broadcast_to(self.b, xW.data.shape)
matmul
Linear
+
※ ほぼおなじ機能が chainer.links.Linear として提供されているので、
普通はそれを使う
例:多層パーセプトロン
30
import chainer, chainer.functions as F, chainer.links as L
import numpy as np
class MLP(chainer.Chain):
def __init__(self):
super().__init__(
l1=L.Linear(100, 10),
l2=L.Linear(10, 1),
)
def __call__(self, x):
h = F.tanh(self.l1(x))
return self.l2(h)
Wx+b
Linear
Linear
MLP
tanh Linear
class Classifier(chainer.Chain):
def __init__(self, predictor):
super().__init__(
predictor=predictor)
def __call__(self, x, y):
y_hat = self.predictor(x)
loss = F.softmax_cross_entropy(y_hat, y)
accuracy = F.accuracy(y_hat, y)
chainer.report({'loss': loss, 'accuracy': accuracy}, self)
return loss
このような、ロス関数になっている Chain をよく使います
(後述の Optimizer はこれを直接使って最適化を行うことができる)
例:多クラス分類器
31
ロスや正解率をレポート(後述の機能で集計される)
report
predictor
Classifier
SCE
accuracy
 確率的勾配法の実装がいろいろ提供されている
SGD, MomentumSGD, AdaGrad, RMSprop, Adam, etc.
 使い方:あらかじめ最適化対象の Link を渡しておき、ロス関数とその引数を
update メソッドに渡すと一回分の更新を実行
数値最適化:Optimizer
32
model = L.Classifier(...)
optimizer = chainer.optimizers.SGD(lr=0.01)
optimizer.setup(model) # 最適化対象 model をターゲットリンクと呼ぶ
optimizer.update(model, x, y) # 引数はロス関数とその引数
訓練ループは以下の繰り返し
 ミニバッチを読み込む
 順伝播・逆伝播の計算
 Optimizer によるパラメータ更新
 現在の学習性能をチェックする
 定期的に訓練過程のスナップショットを取る
訓練ループの抽象化
33
Updater
Extension
Trainer
Dataset
Iterator
訓練ループ抽象化の概略
データセットはランダムアクセス可能なコンテナならなんでも OK
 配列そのままでもよいし、タプルや辞書のリストとかでもよい
Iterator がデータの読み方を決める
 シャッフルするかどうか、1回全データを読んだら終了するかしないか
 SerialIterator がデフォルト実装で、一般にはこれで OK
 MultiprocessIterator を使うとデータの読み込みをワーカープロセスで並列
化する(ディスクアクセスや前処理の並列化に有効)
Updater が Iterator と Optimizer(とそのターゲットリンク)を組み合わせ
て更新処理を行う
 ParallelUpdater を使うと複数 GPU によるデータ並列ができる
34
訓練ループ抽象化の概略:Extension
Trainer の訓練ループに処理を追加したい場合、Extension を追加すれば良い
 基本的にはただの関数(callable オブジェクト)
 デフォルトで提供される extension の例:
– Evaluator:評価用データをつかって学習中のモデルを評価する
– snapshot:訓練ループ全体のスナップショットを取る
– LogReport:report() 関数であつめたレポート値の平均を定期的にログに出力
– PrintReport:LogReport がとった統計値をコンソールに出力
– ProgressBar:訓練の進捗をコンソールに出力
 Extension は簡単に自作できます:例えば以下は学習率に自動減衰の例
35
@chainer.training.make_extension()
def adjust_learning_rate(trainer):
optimizer = trainer.updater.get_optimizer('main')
optimizer.lr = 0.01 / optimizer.t
より詳しくは
過去スライド参照
先日、研究室のセミナーで話したスライドに
MNIST サンプルの解説があります
とくに Trainer 部分につ
いては今日お話できなかっ
た部分がもう少し詳しく書
いてあります
ほかの公式サンプル (PTB,
ImageNet) も参考になるは
ずです
36
http://www.slideshare.net/beam2d/introduction-to-chainer
ここまでのまとめ
 現在では、ニューラルネットは計算グラフと思うのがよい
 いろいろなフレームワークにはそれぞれの売りがある
 Chainer は順伝播のときに動的に計算グラフを構築する
 Link/Chain を使ってニューラルネットをコンポーネント化し、再利用できるよ
うになっている
 訓練ループの抽象化は Dataset/Iterator, Updater, Trainer/Extension からな
る
 Extension を使って訓練ループに自由に処理を追加できる
Chainer の OSS 開発
38
オープンソースソフトウェアと深層学習
 オープンソースライセンスを採用しているソフトウェア
– オープンソースライセンスとしては、Open Source Initiative による定義を用いるの
が一般的 (The Open Source Definition, OSD)
 ほとんどの深層学習フレームワークは非コピーレフトのゆるやかなライセンス
にもとづくオープンソースソフトウェア
– Caffe: 2-Clause BSD license
– Theano, Torch: BSD license
– MXNet, TensorFlow: Apache 2.0 license
– Chainer: MIT license
 ここに挙げたフレームワークはすべて GitHub 上で開発が行われている
GitHub (github.com)
分散バージョン管理ツール Git のリポジトリホスティングサービス
GitHub リポジトリでは Git の機能が使えるほか、以下の機能が使える
 Issue トラッキング
– 任意のユーザがそのプロジェクトに関する問題を掲示板形式で議論できる
 Pull Request (PR)
– 管理者以外がソースコードに変更を加えたいとき、そのリクエストが送れる
– PR に対しては自動で issue ページが作られ、そこでその変更について議論できる
– 管理者であっても PR は送れる
 コードレビュー
– PR の変更行に対してコメントを追加したり、その場で議論できる
 などなど(ほかに Wiki をつくる、統計を見るなど)
40
例:コードレビュー
41
Chainer の開発に関わる人々
42
Chainer チーム
(コミッター、レビュワー)
※ PFN
PR コントリビューター
(現在計 67 名)
その他コントリビューター
(issue 報告など)
Chainer の開発に関わる人々
PFN 社内のみにいるのはおもにコアメンバー(コミッター)とレビュワー
 コミッター:リポジトリ本体に直接変更を加える権限を持つ人
– 送られてきた PR を本体にマージするのもコミッターの仕事
 レビュワー:PR のコードレビューをする人
もちろん社内にも(コアメンバー外の)Chainer ユーザーがたくさんいる
 ユーザーの中で特によく使ってくれている人たちがレビュワーになっている
 社内ユーザーは、社外のユーザーと同じように issue 登録したり PR を投げた
りする(オフラインでの相談もよくする)
43
Chainer の開発史(主要なもの)
2015/4 開発開始
2015/5 ロゴ策定、ドキュメント・ウェブサイトの準備等
2015/6 v1.0 公開
2015/7 v1.1: 型チェック機能, Caffe モデル読込, Python3 サポート
2015/9 v1.3: CuPy リリース
2015/11 v1.5: Link/Chain 追加, CuPy の Cython 化
2016/1 v1.6: 互換性ポリシーの導入(後方互換性サポートを開始)
2016/3 v1.7: デバッグモード、FunctionHook 追加
2016/5 v1.9: Weight initializer 追加、浮動小数点型サポートの拡大
2016/6 v1.10: Minor リリースポリシーの変更
2016/7 v1.11: Dataset/Trainer 追加
44
今のところ master ブランチで開発している
 非コミッターの場合、まず自分のアカウントに Chainer リポジトリをフォーク
してからブランチを作り、変更を加え、PR を送る
 PR を送ると、レビュワーがコメントを加え、PR 送信者がそれに答える
(コメントに返信するか追加の変更を加える)。これを収束するまで繰り返す
Chainer の開発の進め方
45
master ブランチ
機能 1 ブランチ
機能 2 ブランチ
PR/レビュー/マージ
v1.x.y リリース!
(タグ)
Chainer コアチーム/レビューチームのスケジュール
 毎週 1 日、顔を付きあわせて開発する時間をとっている(集中開発)
 隔週火曜日のリリースでも集まってリリース作業を行う
 毎リリース後に反省会と、次リリースの相談
 より長いスパンの予定についてもリリース後に議論
 これらとは別に、レビュワーチームと一緒にひたすらレビューする時間も週 2
回とっている(最近)
– PR レビューはどんどん加速していきたいと考えています
46
Chainer の開発環境
 Chainer の開発には GPU が載っているマシンが必要
– 特に全機能を触りうるコアメンバーは、GPU が最低 2 台載っているマシンが必要
 テストは自動化している:継続的インテグレーション (CI)
– OSS の場合、無料で利用できる CI サービスがいくつかある
– Chainer ではそのうち TravisCI (Linux, Mac) と AppVeyor (Windows) を利用中
– これらを使って同時にテストのコードカバレージ(テストで実行されるコードの行数
とその割合の計測)を coverage.io で行っている
– ただし、公開 CI はどれも GPU 未対応
 社内に GPU のあるサーバーを用意して、そこでも別に CI を回している
– Jenkins を利用
– 環境の仮想化に NVIDIA Docker を利用している
– セキュリティ上の理由で、この CI は PFN 社内開発者のみが見られる
47
Chainer の開発に貢献するには
大きく以下の貢献ポイント
 本体の開発
 サンプルの追加・改善
 ドキュメントの追加・改善
 リポジトリ外での貢献
48
Chainer への貢献:本体の開発
 変更を書いて、PR を送り、レビューに対応して、マージされる
 変更を書き始める前に、issue を作っておいて「自分これやります」と宣言して
おくこともある(他の人と同じ変更を重複して書くのを避けられる)
変更を書くときのポイント
 あらかじめ “Contribution Guide” を読んでおく!
– コーディングスタイルなど、PR を送る際のルールが書いてある
 コーディングスタイルに従う(チェックツールもある)
 変更に対応するテストを必ず書く
– 自明な typo 修正などとても小さな変更で正しさが明らかなものには必要ない
 機能追加の場合、ドキュメントを書く(重要!)
49
Chainer への貢献:本体の開発
変更の種類(上に行くほど簡単でおすすめ)
 小さなバグの修正:レビューもすぐ済み、低コストでマージされることが多い
 実装の改善(高速化など)
– レビュワーが検証する必要があるので、少し時間がかかる
– インターフェイスが変わらなければ、効果があるかぎりすんなりマージされやすい
 新しい Function, Link, CuPy 関数の追加
– ほかの変更と独立しているため、コンフリクトが起きにくい
– インターフェイスの検証が必要であり、またドキュメントも必要なので、レビューに
は時間がかかる
 コア機能の追加(例:Weight Initializer)
– レビューはもっともタフなものになる
– その代わりマージされたときの貢献度合いはもっとも高いといえる
50
Chainer への貢献:サンプル/ドキュメントの追加・改善
 既存サンプルの改善は、わりとすんなりマージされやすい
– ただし、機能の使い方が意図していないものだと時間がかかったり、却下されること
もある
 新しいサンプルの追加は、行数も多いためレビューには少し時間がかかる
– 「がっつり添削してもらえる」と考えることもできる
– Chainer は公式サンプルが不足気味なので、サンプル追加はとても歓迎されま
す!!!
– 公式サンプルに入っていないタスクならなんでも OK
 ドキュメントの改善はわりとすんなりマージされやすい
– 英語表現の改善、obsolete な内容の更新など
– どんな細かい変更でも歓迎します。おそらく貢献の敷居はドキュメントが一番低い
51
Chainer への貢献:リポジトリ外での貢献
ソースコードに変更を加える以外にも、Chainer コミュニティーへの貢献の仕方は
たくさんある
 バグや機能リクエストなどを issue に書く
 論文における実験の(追試)スクリプトを GitHub などにアップロードする
– 宣伝もできるとなおよし!
– 連絡していただければ、Chainer の公式 Twitter アカウントでツイートします(こち
らで見つけた場合に勝手にツイートすることもあります)
– 何かしらの方法で学習済みモデル(シリアライズしたもの)もアップロードしてくれ
るとさらにグッド
 フォーラムに質問を投げる、フォーラムの質問に答える
 使い方や機能、上に書いた「追試」などのブログを書く
 勉強会などで Chainer にまつわる発表を行う
52
Chainer への貢献:公開集中開発
 およそ月に 1 回のペースで「公開集中開発」を開催しています
 Chainer コアチームのメンバーと一緒にもくもくと開発する会
– 開発は、本体リポジトリへの PR/マージ を目標とするもののもが対象
– 本体の開発でも、ドキュメント・サンプルの改善・追加でも OK
 疑問点があったときにすぐ開発者に相談できるという点でおすすめです
53
学生・研究者がコードを公開する意味
 現状、論文の発表などの業績という点で、ソースコードを公開するインセン
ティブはあまり働いていない
 学生の場合には、開発の実績として就職活動の際には利用可能
 それに限らず、とくに深層学習においては研究の再現性が重要
– 再現するために必要な情報をすべて論文に書き切ることができない場合も多い(とく
にスペースの制限された会議論文などの場合)
– 再現に必要なスクリプトを公開すれば、その研究のフォロワーがつきやすくなると考
えられる(自分でチューニングをやりなおすことなく、関連研究や応用ができる)
– よって、スクリプトの公開は、論文の refer を増やす効果があると予想される
54
OSS 開発に参加する意味
 (とくに学生にとって)
PR を送ることは、自分のコードをほかの開発者に直接レビューしてもらえる機
会になる
 自分の研究分野で必要な機能を本体に積極的に取り込んでもらうと、その機能
を使う研究者・実務家が増える
– するとこの人たちが関連する機能をさらに公開したり PR を送ったりするようになる
– これらは最初に機能を書いた人にとってはただで利用できる機能ということになる
– Chainer 自体の公開も、根底にはこの狙いがある(クローズドに開発するよりも開発
スピードが上がるだろうという点)
55
Chainer の今後の展開
56
Chainer の学習・貢献をもっとスムーズにする
現状
 学習:公式チュートリアルとサンプルを読む(分量、バリエーションが足りて
いない)
 貢献:本体へ PR(敷居が高い)、GitHub にコードを上げる(検索性が悪い)
もっと段階的に入門から PR へのサポートをしたい
(幅広い層のユーザーをサポートしていきたい)
予定している学習・貢献段階の充実
 公式ドキュメント(今までどおり)
 Chainer 100 本ノック
 Chainer Blog
 Chainer プラグインリポジトリ(仮)
 PR(今までどおり)
(まだ企画・準備段階なので、具体的な形式・内容は未定です)
58
新しく実施予定
Chainer 100 本ノック
 Cf.) 言語処理 100 本ノック http://www.cl.ecei.tohoku.ac.jp/nlp100/
 Chainer を使って深層学習の研究をはじめるために必要な知識を学ぶための問
題集
 初学者向けの内容で、たとえば学生の方にまずこれをやって深層学習の実装上
の知識や Chainer の使い方を知ってもらう
59
Chainer Blog
 Chainer の使い方や example についてのブログ
 主な目的は example の充実で、このブログ上で公式 example でカバーされて
いない様々な応用について、Chainer のコードつきでタスクや手法の解説をし
ていきたい
 100 本ノックと比べると、すでに Chainer を触り始めている人向け
 余裕があれば Chainer の各機能についてのチュートリアルより突っ込んだ解説
などもしていきたい(cf. NVIDIA の Parallel Forall Blog)
60
Chainer プラグインリポジトリ(仮)
 Chainer の Function や Link などのある程度独立した機能を共有するサービス
 GitHub の本体リポジトリに PR を送らなくても、ほかのユーザと最新の手法実
装を共有する場所をつくりたい
– 現状でも GitHub の自分のリポジトリを作り、そこに実装を置いておくことは可能
– 多くの研究者・実務家が、論文の実験スクリプトや再現スクリプトを公開している
– しかし、これらは検索しづらいし、提供のされ方もバラバラ
– 専用のサービスに登録できるようにすれば検索・利用しやすくなり手法の再現・応用
の敷居がさらに下がる
 これはすでに自分のタスクのために Chainer を使っている人向け
61
まとめ
 ニューラルネット (NN) は誤差逆伝播できる計算グラフ
 NN のフレームワークは Backend、低レベルAPI、高レベルAPI からなる
 Chainer は Backend である CuPy と、動的計算グラフおよび訓練ループの抽
象化からなる
 Chainer の OSS 開発は PFN のコア開発者が主導して進めているが、外部から
の貢献が大きなウェイトを占めている
 学生や研究者がコードを公開したり、OSS 開発に参加することは、研究遂行上
も意味がある(と考えている)
 さらに Chainer の利用を広めていくために、リソースの提供を増やしていき、
また共有の仕組みも強化していく予定
62

More Related Content

What's hot

猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoderSho Tatsuno
 
Chainer の Trainer 解説と NStepLSTM について
Chainer の Trainer 解説と NStepLSTM についてChainer の Trainer 解説と NStepLSTM について
Chainer の Trainer 解説と NStepLSTM についてRetrieva inc.
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 Kenta Oono
 
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlowDeep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlowTadaichiro Nakano
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Ryosuke Okuta
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装Ryosuke Okuta
 
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Ohsawa Goodfellow
 
PythonによるDeep Learningの実装
PythonによるDeep Learningの実装PythonによるDeep Learningの実装
PythonによるDeep Learningの実装Shinya Akiba
 
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"Ken'ichi Matsui
 
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待Seiya Tokui
 
Practical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architecturesPractical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architecturesKoji Matsuda
 
GPU上でのNLP向け深層学習の実装について
GPU上でのNLP向け深層学習の実装についてGPU上でのNLP向け深層学習の実装について
GPU上でのNLP向け深層学習の実装についてYuya Unno
 
TensorFlowとCNTK
TensorFlowとCNTKTensorFlowとCNTK
TensorFlowとCNTKmaruyama097
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことRetrieva inc.
 
はじめての人のためのDeep Learning
はじめての人のためのDeep Learningはじめての人のためのDeep Learning
はじめての人のためのDeep LearningTadaichiro Nakano
 
Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~Yasutomo Kawanishi
 
Recurrent Neural Networks
Recurrent Neural NetworksRecurrent Neural Networks
Recurrent Neural NetworksSeiya Tokui
 
ディープラーニング最近の発展とビジネス応用への課題
ディープラーニング最近の発展とビジネス応用への課題ディープラーニング最近の発展とビジネス応用への課題
ディープラーニング最近の発展とビジネス応用への課題Kenta Oono
 

What's hot (20)

猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder
 
Chainer の Trainer 解説と NStepLSTM について
Chainer の Trainer 解説と NStepLSTM についてChainer の Trainer 解説と NStepLSTM について
Chainer の Trainer 解説と NStepLSTM について
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
 
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlowDeep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlow
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
 
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
 
Deep learning入門
Deep learning入門Deep learning入門
Deep learning入門
 
PythonによるDeep Learningの実装
PythonによるDeep Learningの実装PythonによるDeep Learningの実装
PythonによるDeep Learningの実装
 
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"
 
More modern gpu
More modern gpuMore modern gpu
More modern gpu
 
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
 
Practical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architecturesPractical recommendations for gradient-based training of deep architectures
Practical recommendations for gradient-based training of deep architectures
 
GPU上でのNLP向け深層学習の実装について
GPU上でのNLP向け深層学習の実装についてGPU上でのNLP向け深層学習の実装について
GPU上でのNLP向け深層学習の実装について
 
TensorFlowとCNTK
TensorFlowとCNTKTensorFlowとCNTK
TensorFlowとCNTK
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なこと
 
はじめての人のためのDeep Learning
はじめての人のためのDeep Learningはじめての人のためのDeep Learning
はじめての人のためのDeep Learning
 
Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~
 
Recurrent Neural Networks
Recurrent Neural NetworksRecurrent Neural Networks
Recurrent Neural Networks
 
ディープラーニング最近の発展とビジネス応用への課題
ディープラーニング最近の発展とビジネス応用への課題ディープラーニング最近の発展とビジネス応用への課題
ディープラーニング最近の発展とビジネス応用への課題
 

Viewers also liked

Introduction to DEEPstation the GUI Deep learning environment for chainer
Introduction to DEEPstation the GUI Deep learning environment for chainerIntroduction to DEEPstation the GUI Deep learning environment for chainer
Introduction to DEEPstation the GUI Deep learning environment for chainerRyo Shimizu
 
Overview of Chainer and Its Features
Overview of Chainer and Its FeaturesOverview of Chainer and Its Features
Overview of Chainer and Its FeaturesSeiya Tokui
 
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原Koji Shiraishi
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造Taku Miyakawa
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency APITaku Miyakawa
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaTaku Miyakawa
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1Taku Miyakawa
 
Chainer, Cupy入門
Chainer, Cupy入門Chainer, Cupy入門
Chainer, Cupy入門Yuya Unno
 
Introduction to Chainer
Introduction to ChainerIntroduction to Chainer
Introduction to ChainerShunta Saito
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 

Viewers also liked (14)

Introduction to DEEPstation the GUI Deep learning environment for chainer
Introduction to DEEPstation the GUI Deep learning environment for chainerIntroduction to DEEPstation the GUI Deep learning environment for chainer
Introduction to DEEPstation the GUI Deep learning environment for chainer
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
Overview of Chainer and Its Features
Overview of Chainer and Its FeaturesOverview of Chainer and Its Features
Overview of Chainer and Its Features
 
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on Java
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1
 
Chainer, Cupy入門
Chainer, Cupy入門Chainer, Cupy入門
Chainer, Cupy入門
 
Introduction to Chainer
Introduction to ChainerIntroduction to Chainer
Introduction to Chainer
 
一般向けのDeep Learning
一般向けのDeep Learning一般向けのDeep Learning
一般向けのDeep Learning
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 

Similar to 深層学習フレームワーク Chainer の開発と今後の展開

Chainerの使い方と 自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と 自然言語処理への応用Yuya Unno
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用de:code 2017
 
いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成Yoshi Sakai
 
全力解説!Transformer
全力解説!Transformer全力解説!Transformer
全力解説!TransformerArithmer Inc.
 
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hareDAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也harePreferred Networks
 
Mesh tensorflow
Mesh tensorflowMesh tensorflow
Mesh tensorflowkuroko
 
CVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNetCVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNetTakuya Minagawa
 
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Yuya Unno
 
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGAAn Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGALeapMind Inc
 
Statically detecting vulnerability under memory pressure using exhaustive search
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive searchRuo Ando
 
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)Yu Liu
 
MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習Preferred Networks
 
[part 2]ナレッジグラフ推論チャレンジ・Tech Live!
[part 2]ナレッジグラフ推論チャレンジ・Tech Live![part 2]ナレッジグラフ推論チャレンジ・Tech Live!
[part 2]ナレッジグラフ推論チャレンジ・Tech Live!KnowledgeGraph
 
201209 Biopackathon 12th
201209 Biopackathon 12th201209 Biopackathon 12th
201209 Biopackathon 12thSatoshi Kume
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest informationSony Network Communications Inc.
 
2018/02/27 Recurrent Neural Networks starting with Neural Network Console
2018/02/27 Recurrent Neural Networks starting with Neural Network Console2018/02/27 Recurrent Neural Networks starting with Neural Network Console
2018/02/27 Recurrent Neural Networks starting with Neural Network ConsoleSony Network Communications Inc.
 
20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについてPreferred Networks
 
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Yuya Unno
 

Similar to 深層学習フレームワーク Chainer の開発と今後の展開 (20)

Chainerの使い方と 自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と 自然言語処理への応用
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
 
いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成
 
全力解説!Transformer
全力解説!Transformer全力解説!Transformer
全力解説!Transformer
 
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hareDAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
 
Mesh tensorflow
Mesh tensorflowMesh tensorflow
Mesh tensorflow
 
Fpgax20180217
Fpgax20180217Fpgax20180217
Fpgax20180217
 
CVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNetCVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNet
 
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
 
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGAAn Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
 
Statically detecting vulnerability under memory pressure using exhaustive search
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive search
 
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
 
MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習
 
[part 2]ナレッジグラフ推論チャレンジ・Tech Live!
[part 2]ナレッジグラフ推論チャレンジ・Tech Live![part 2]ナレッジグラフ推論チャレンジ・Tech Live!
[part 2]ナレッジグラフ推論チャレンジ・Tech Live!
 
201209 Biopackathon 12th
201209 Biopackathon 12th201209 Biopackathon 12th
201209 Biopackathon 12th
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information
 
2018/02/27 Recurrent Neural Networks starting with Neural Network Console
2018/02/27 Recurrent Neural Networks starting with Neural Network Console2018/02/27 Recurrent Neural Networks starting with Neural Network Console
2018/02/27 Recurrent Neural Networks starting with Neural Network Console
 
20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて
 
Overview and Roadmap
Overview and RoadmapOverview and Roadmap
Overview and Roadmap
 
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
 

More from Seiya Tokui

Chainer v2 and future dev plan
Chainer v2 and future dev planChainer v2 and future dev plan
Chainer v2 and future dev planSeiya Tokui
 
Chainer v2 alpha
Chainer v2 alphaChainer v2 alpha
Chainer v2 alphaSeiya Tokui
 
Learning stochastic neural networks with Chainer
Learning stochastic neural networks with ChainerLearning stochastic neural networks with Chainer
Learning stochastic neural networks with ChainerSeiya Tokui
 
論文紹介 Pixel Recurrent Neural Networks
論文紹介 Pixel Recurrent Neural Networks論文紹介 Pixel Recurrent Neural Networks
論文紹介 Pixel Recurrent Neural NetworksSeiya Tokui
 
Introduction to Chainer
Introduction to ChainerIntroduction to Chainer
Introduction to ChainerSeiya Tokui
 
Chainer Update v1.8.0 -> v1.10.0+
Chainer Update v1.8.0 -> v1.10.0+Chainer Update v1.8.0 -> v1.10.0+
Chainer Update v1.8.0 -> v1.10.0+Seiya Tokui
 
Differences of Deep Learning Frameworks
Differences of Deep Learning FrameworksDifferences of Deep Learning Frameworks
Differences of Deep Learning FrameworksSeiya Tokui
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep LearningSeiya Tokui
 
Chainer Development Plan 2015/12
Chainer Development Plan 2015/12Chainer Development Plan 2015/12
Chainer Development Plan 2015/12Seiya Tokui
 
Towards Chainer v1.5
Towards Chainer v1.5Towards Chainer v1.5
Towards Chainer v1.5Seiya Tokui
 
Deep Learningの基礎と応用
Deep Learningの基礎と応用Deep Learningの基礎と応用
Deep Learningの基礎と応用Seiya Tokui
 
論文紹介 Compressing Neural Networks with the Hashing Trick
論文紹介 Compressing Neural Networks with the Hashing Trick論文紹介 Compressing Neural Networks with the Hashing Trick
論文紹介 Compressing Neural Networks with the Hashing TrickSeiya Tokui
 
Introduction to Chainer: A Flexible Framework for Deep Learning
Introduction to Chainer: A Flexible Framework for Deep LearningIntroduction to Chainer: A Flexible Framework for Deep Learning
Introduction to Chainer: A Flexible Framework for Deep LearningSeiya Tokui
 
論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative ModelsSeiya Tokui
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Seiya Tokui
 
Deep Learning技術の今
Deep Learning技術の今Deep Learning技術の今
Deep Learning技術の今Seiya Tokui
 
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding Model
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding ModelNIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding Model
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding ModelSeiya Tokui
 
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM Prediction
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM PredictionICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM Prediction
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM PredictionSeiya Tokui
 
Deep Learningの技術と未来
Deep Learningの技術と未来Deep Learningの技術と未来
Deep Learningの技術と未来Seiya Tokui
 

More from Seiya Tokui (20)

Chainer v3
Chainer v3Chainer v3
Chainer v3
 
Chainer v2 and future dev plan
Chainer v2 and future dev planChainer v2 and future dev plan
Chainer v2 and future dev plan
 
Chainer v2 alpha
Chainer v2 alphaChainer v2 alpha
Chainer v2 alpha
 
Learning stochastic neural networks with Chainer
Learning stochastic neural networks with ChainerLearning stochastic neural networks with Chainer
Learning stochastic neural networks with Chainer
 
論文紹介 Pixel Recurrent Neural Networks
論文紹介 Pixel Recurrent Neural Networks論文紹介 Pixel Recurrent Neural Networks
論文紹介 Pixel Recurrent Neural Networks
 
Introduction to Chainer
Introduction to ChainerIntroduction to Chainer
Introduction to Chainer
 
Chainer Update v1.8.0 -> v1.10.0+
Chainer Update v1.8.0 -> v1.10.0+Chainer Update v1.8.0 -> v1.10.0+
Chainer Update v1.8.0 -> v1.10.0+
 
Differences of Deep Learning Frameworks
Differences of Deep Learning FrameworksDifferences of Deep Learning Frameworks
Differences of Deep Learning Frameworks
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
 
Chainer Development Plan 2015/12
Chainer Development Plan 2015/12Chainer Development Plan 2015/12
Chainer Development Plan 2015/12
 
Towards Chainer v1.5
Towards Chainer v1.5Towards Chainer v1.5
Towards Chainer v1.5
 
Deep Learningの基礎と応用
Deep Learningの基礎と応用Deep Learningの基礎と応用
Deep Learningの基礎と応用
 
論文紹介 Compressing Neural Networks with the Hashing Trick
論文紹介 Compressing Neural Networks with the Hashing Trick論文紹介 Compressing Neural Networks with the Hashing Trick
論文紹介 Compressing Neural Networks with the Hashing Trick
 
Introduction to Chainer: A Flexible Framework for Deep Learning
Introduction to Chainer: A Flexible Framework for Deep LearningIntroduction to Chainer: A Flexible Framework for Deep Learning
Introduction to Chainer: A Flexible Framework for Deep Learning
 
論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
Deep Learning技術の今
Deep Learning技術の今Deep Learning技術の今
Deep Learning技術の今
 
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding Model
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding ModelNIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding Model
NIPS2013読み会 DeViSE: A Deep Visual-Semantic Embedding Model
 
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM Prediction
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM PredictionICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM Prediction
ICML2013読み会 Local Deep Kernel Learning for Efficient Non-linear SVM Prediction
 
Deep Learningの技術と未来
Deep Learningの技術と未来Deep Learningの技術と未来
Deep Learningの技術と未来
 

深層学習フレームワーク Chainer の開発と今後の展開

  • 1. 深層学習フレームワーク Chainer の開発と今後の展開 得居 誠也 / MIRU2016@アクトシティ浜松 Preferred Networks, Inc. / 東京大学 2016/08/01
  • 2. 自己紹介  得居 誠也 (Seiya Tokui)  Preferred Infrastructure (2012-2014), Preferred Networks (2014-) – 分散機械学習基盤 Jubatus – maf (実験管理) – Chainer (NN フレームワーク)  東京大学 情報理工 コンピュータ科学専攻 博士課程 (2016-)  興味 深層学習、表現学習、強化学習、生成モデル コンピュータビジョン、言語処理、ロボティクス 2
  • 3. AI 分野はオープンソースソフトウェア(OSS)に支えられている 思いつくものを挙げると  多次元配列: NumPy/SciPy, R, Eigen::Tensor  プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js  機械学習: scikit-learn, LIBSVM/LIBLINEAR  データ解析: Pandas, R (data frame)  コンピュータビジョン: OpenCV, PCL, VLFeat  自然言語処理: NLTK, gensim, mecab, CoreNLP  音声認識: Kaldi, Julius  深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer  etc… 3
  • 4. AI 分野はオープンソースソフトウェア(OSS)に支えられている 思いつくものを挙げると  多次元配列: NumPy/SciPy, R, Eigen::Tensor  プロット・可視化: Matplotlib, bokeh, ggplot2, D3.js  機械学習: scikit-learn, LIBSVM/LIBLINEAR  データ解析: Pandas, R (data frame)  コンピュータビジョン: OpenCV, PCL, VLFeat  自然言語処理: NLTK, gensim, mecab, CoreNLP  音声認識: Kaldi, Julius  深層学習: Caffe, Theano, TensorFlow, Torch, Neon, MXNet, CNTK, Chainer  etc… 4
  • 5. 研究における OSS の開発  (ソフトウェア開発が本職ではない)学生や研究者が多く参加している  そもそもアカデミックな組織が主体となって作っているものも多い (Caffe, Theano, MXNet など)  企業が主体となっている OSS でも学生や研究者が多くコミットしている (Torch, TensorFlow, Chainer, etc.)  背景として、最先端の研究に使われているという点がある – 深層学習の業界は arXiv 先行で非常にスピードが速い – 最先端を知る研究者自身が開発に参加していかないと研究スピードが追いつかない – 再現や応用の敷居の高さによって後続研究が出てくるスピードが変わる(印象) 5
  • 6. 本発表の目的と内容  深層学習に関わる学生・研究者の方々に、OSS 開発の実際のところを知っても らい、どんどん参加できるようになってもらう  とくに学生・研究者の方々からの深層学習フレームワークへの貢献を増やす そのために以下の事柄について話します  ニューラルネットのおさらい  深層学習フレームワークの全体像  Chainer の基本的な概念と使い方  Chainer の OSS 開発  Chainer の今後の展開 6
  • 8. ニューラルネット (NN) 本発表では、「深層学習」=「深い NN をつかった機械学習」とします NN とは?  意外と難しい言葉  「シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、 学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデ ル全般を指す」 (https://ja.wikipedia.org/wiki/ニューラルネットワーク) こういう絵をよく書く
  • 9. ニューラルネット (NN)  現在よく使われるプロセッサでは、数値演算をベクトル化することで並列性を 高められる(CPU, GPU)  ニューラルネットの 1 層分の結合は、行列積として書ける  さらに並列性を高めるために、ミニバッチがよく使われる(複数のデータ点に ついて一度に計算する) これらを踏まえると、1 ユニットずつバラバラに書いた古典的な描像よりも、1 レ イヤーを一つの単位にまとめたベクトル化された捉え方の方が、計算上扱いやすい 9 こういう絵の方が扱いやすい 各ノードは多次元配列を表す
  • 10. ニューラルネット=計算グラフ  最近はどんどん複雑なニューラルネットが扱われるようになっている (encoder-decoder, attention, residual net, etc.)  もともとの「脳のニューロンのモデル化」を離れて、「微分可能な演算をうま く組み合わせたもの」になってきている  この考え方をおしすすめると、ニューラルネット=計算グラフ となる  たとえば、最小二乗法による線形回帰の損失計算は下の計算グラフで書ける (これも広義にはニューラルネットと思える) 10 matmul + MSE MSE: Mean Squared Error
  • 11. ニューラルネットの学習:確率的勾配法  確率的勾配降下法:パラメータ , 目的関数 として  このように勾配の不偏推定量のサンプリングに基づく確率的最適化をここでは 「確率的勾配法 (stochastic gradient methods)」と呼ぶことにする  勾配のランダムネスには二種類ある – ミニバッチによるランダムネス:目的関数がデータ点ごとの関数の和で書かれるとき、 一部のデータ点に対してだけ勾配を計算すると、全体の勾配の不偏推定になる – 計算過程のランダムネス:ニューラルネットの中にランダムな振る舞いをする演算を 入れる(例:dropout など) – → どちらも計算グラフの枠組みで扱える 11 学習率 勾配の不偏推定
  • 12.  合成関数の微分は、ヤコビ行列の積でかける たとえば線形回帰の例では:  このヤコビ行列の積を 1 つずつ計算する:自動微分 – cf.) 数値微分、シンボル微分(これらは違う手法!) 計算グラフの自動微分 12 matmul + MSE
  • 14. 現代的なニューラルネット  基本的には「(微分可能な)計算グラフ」と捉えるのがよい  とくに、全結合層や畳込み層などパラメータを持つ線形変換が途中に含まれる ものを指すことが多い – そうでない場合は、たとえ勾配法で学習する場合でもニューラルネットと呼ばないこ とが多いように思う  ニューラルネットはどんどん複雑になっていっている – 多層化:VGG, GoogLeNet, ResNet, … – 組合せ:Encoder-Decoder, VAE, GAN, … – 新しい演算:LSTM/GRU, soft attention, memory, dilated convolution, … ⇒ フレームワークの柔軟性がますます重要に 14
  • 16. 深層学習のフレームワーク  数が多い!!!  “Wikipedia:Comparison of deep learning software” に載っているもの: Caffe, Chainer, CNTK, Deeplearning4j, MXNet, Neural Designer, OpenNN, SINGA, TensorFlow, Theano, Torch, adnn, Blocks, CNNLab, ConvNetJS, Cortex, CURRENNT, DeepCL, DeepLeanringKit, DeepLearnToolbox, DeepX, DSSTNE, Faster RNNLM (HS/NCE) toolkit, GNU Gneural Network, IDLF, Keras, Lasagne, Leaf, LightNet, MatConvNet, Neon, Neural Network Toolbox, Pylearn2, scikit- neuralnetwork, Tensor Builder, TensorGraph, Theano-Lights, tiny-cnn, Torchnet, Veles  2014-2015 に特にたくさん公開され、今年は少し落ち着いてきたように思う 16 https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software
  • 17. なぜニューラルネットにはフレームワークが必要? NN 研究における要求:  NN のトポロジーを柔軟に定義したい  試行錯誤のサイクルを高速に回したい – できるだけ NN の定義に依存するコードを減らしたい (コードのごく一部を変更するだけでいろいろな NN を試したい) – 計算性能も(研究者による最適化なしに)高くしたい そのために必要なもの:  勾配計算の自動化(自動微分)  CUDA プログラミングの簡易化  効率的な実行(計算の自動最適化)  訓練ループにおける定型処理の抽象化 17 フレームワークでカバーしたい
  • 18. NN フレームワークのソフトウェアスタック 18 デバイス特化の基盤 (e.g. BLAS, CUDA, OpenCL, cuBLAS) デバイス特化の NN 演算 (e.g. cuDNN) 多次元配列 (e.g. Eigen::Tensor, NumPy, CuPy) 計算グラフの実装 NN 実装の抽象化 訓練・評価ループの実装 “Low level API” “High level API” “Backend”
  • 19. NN フレームワークのソフトウェアスタック 19 デバイス特化の基盤 (e.g. BLAS, CUDA, OpenCL, cuBLAS) デバイス特化の NN 演算 (e.g. cuDNN) 多次元配列 (e.g. Eigen::Tensor, NumPy, CuPy) 計算グラフの実装 NN 実装の抽象化 訓練・評価ループの実装 Theano TensorFlow Keras TFLearn Chainer CuPyTorch cuTorch Torch.nn
  • 20. たくさんあるフレームワークは何が違うのか (少なくとも一定以上使われているものについては)それぞれ「売り」がある  パフォーマンスが売り Caffe, Theano, Torch, TensorFlow, MXNet, Neon  スケーラビリティが売り TensorFlow, MXNet  ハックしやすさが売り Chainer, Torch  デバッグしやすさ・直感性が売り Chainer  コミュニティの規模が売り Caffe, Theano, Torch, TensorFlow 細かい違いはもっといっぱいある 20 どれを選ぶか?  自分のタスクに適したものを選ぶ  一緒に使うほかのツールとの相性 で選ぶ(言語など)  使い勝手、好みで選ぶ(重要)
  • 21. PAKDD 2016 DLIF チュートリアル http://www.slideshare.net/beam2d/differences -of-deep-learning-frameworks より詳しいフレームワーク間の違 いについては、PAKDD 2016 で発 表したチュートリアルの得居の資 料により詳しく書いています S. Tokui, K. Oono, A. Kanemura and T. Kamishima. Tutorial on Deep Learning Implementations and Frameworks. 21
  • 23. Chainer のソフトウェアスタック Python ベースの NN フレームワーク(太字部分が Chainer) デバイス特化の基盤 BLAS, CUDA, cuBLAS, cuRAND デバイス特化の NN 演算 cuDNN 多次元配列 NumPy, CuPy 計算グラフの実装: Function/Variable NN 実装の抽象化: Link/Chain, Optimizer, Serializer 訓練・評価ループの実装: Dataset, Trainer “Low level API” “High level API” “Backend”
  • 24. Chainer のインストール方法  Python 2.7.6+, 3.4.3+, 3.5.1+ の環境で pip install chainer  CUDA サポートを有効にするには、あらかじめ環境変数をセットしておく。 典型的な例:  cuDNN (v2 ~ v5.1 に対応) のサポートを有効にするには、同様にあらかじめ 環境変数をセットしておく  Chainer インストール後に CUDA/cuDNN を有効化・アップデートしたい場合、 一度 Chainer をアンインストール(pip uninstall chainer)してから、環 境変数を設定して再インストール 24 export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
  • 25. Chainer における計算グラフ Variable が配列ノードを、Function が演算ノードを表す  Variable は、配列(NumPy もしくは CuPy)を 2 つ保持する – data が順伝播時の配列、grad が逆伝播時の配列(=勾配)  Variable に Function を適用すると、Variable が返ってくる – data に順伝播の結果が入っている – この Variable は、過去の計算の履歴を覚えている – 演算の履歴は、非巡回有効グラフ (DAG) の形をしている。つまり計算グラフ  ロス(スカラー値)の Variable に対して backward() メソッドを呼び出す と、計算グラフをたどって誤差逆伝播を実行する このように Chainer では順伝播の計算時に動的にグラフを構築する (動的計算グラフ、Define-by-Run) 25
  • 26. import chainerimport chainer, chainer.functions as F, numpy as np W = chainer.Variable(np.array(...)) b = chainer.Variable(np.array(...)) x = np.array(...) y = np.array(...) a = F.matmul(W, x) y_hat = a + b ell = F.mean_squared_error(y, y_hat) print(ell.data) # => ロス値を出力 例:線形回帰 26 matmul + MSE 入力の準備(あとで grad を取り出 す場合はあらかじめ Variable にし ておく) 順伝播の計算
  • 27. 例:線形回帰 27 matmul + MSE a = F.matmul(W, x) y_hat = a + b ell = F.mean_squared_error(y, y_hat) ell.backward() # ロスの勾配を計算 print(W.grad) # => W に対する勾配を出力 print(b.grad) # => b に対する勾配を出力
  • 28. ニューラルネットのコンポーネント化: Link/Chain/ChainList  Link: 順伝播のコード片と、それに紐づくパラメータをまとめたもの – ニューラルネットのオブジェクト指向プログラミング  Chain, ChainList: 順伝播のコード片と、そこで使われる Link をまとめたもの – コンポーネントを階層化するもの – これら自身も Link なので、入れ子にできる – 子 Link を名前で管理するのが Chain, インデックス番号で管理するのが ChainList これらには、ニューラルネットを扱う上での便利な機能もついている  Link 階層内のすべてのパラメータを集めてくる  Serializer を使ったパラメータのセーブ・ロード (npz, HDF5 に対応)  階層内のすべての Link を指定した GPU のメモリに送る 28
  • 29. 例:全結合層 29 import chainer, chainer.functions as F import numpy as np class Linear(chainer.Link): def __init__(self, n_in, n_out): super().__init__(W=(n_in, n_out), b=n_out) chainer.init_weight(self.W.data, None) chainer.init_weight(self.b.data, 0) def __call__(self, x): xW = F.matmul(x, self.W) return xW + F.broadcast_to(self.b, xW.data.shape) matmul Linear + ※ ほぼおなじ機能が chainer.links.Linear として提供されているので、 普通はそれを使う
  • 30. 例:多層パーセプトロン 30 import chainer, chainer.functions as F, chainer.links as L import numpy as np class MLP(chainer.Chain): def __init__(self): super().__init__( l1=L.Linear(100, 10), l2=L.Linear(10, 1), ) def __call__(self, x): h = F.tanh(self.l1(x)) return self.l2(h) Wx+b Linear Linear MLP tanh Linear
  • 31. class Classifier(chainer.Chain): def __init__(self, predictor): super().__init__( predictor=predictor) def __call__(self, x, y): y_hat = self.predictor(x) loss = F.softmax_cross_entropy(y_hat, y) accuracy = F.accuracy(y_hat, y) chainer.report({'loss': loss, 'accuracy': accuracy}, self) return loss このような、ロス関数になっている Chain をよく使います (後述の Optimizer はこれを直接使って最適化を行うことができる) 例:多クラス分類器 31 ロスや正解率をレポート(後述の機能で集計される) report predictor Classifier SCE accuracy
  • 32.  確率的勾配法の実装がいろいろ提供されている SGD, MomentumSGD, AdaGrad, RMSprop, Adam, etc.  使い方:あらかじめ最適化対象の Link を渡しておき、ロス関数とその引数を update メソッドに渡すと一回分の更新を実行 数値最適化:Optimizer 32 model = L.Classifier(...) optimizer = chainer.optimizers.SGD(lr=0.01) optimizer.setup(model) # 最適化対象 model をターゲットリンクと呼ぶ optimizer.update(model, x, y) # 引数はロス関数とその引数
  • 33. 訓練ループは以下の繰り返し  ミニバッチを読み込む  順伝播・逆伝播の計算  Optimizer によるパラメータ更新  現在の学習性能をチェックする  定期的に訓練過程のスナップショットを取る 訓練ループの抽象化 33 Updater Extension Trainer Dataset Iterator
  • 34. 訓練ループ抽象化の概略 データセットはランダムアクセス可能なコンテナならなんでも OK  配列そのままでもよいし、タプルや辞書のリストとかでもよい Iterator がデータの読み方を決める  シャッフルするかどうか、1回全データを読んだら終了するかしないか  SerialIterator がデフォルト実装で、一般にはこれで OK  MultiprocessIterator を使うとデータの読み込みをワーカープロセスで並列 化する(ディスクアクセスや前処理の並列化に有効) Updater が Iterator と Optimizer(とそのターゲットリンク)を組み合わせ て更新処理を行う  ParallelUpdater を使うと複数 GPU によるデータ並列ができる 34
  • 35. 訓練ループ抽象化の概略:Extension Trainer の訓練ループに処理を追加したい場合、Extension を追加すれば良い  基本的にはただの関数(callable オブジェクト)  デフォルトで提供される extension の例: – Evaluator:評価用データをつかって学習中のモデルを評価する – snapshot:訓練ループ全体のスナップショットを取る – LogReport:report() 関数であつめたレポート値の平均を定期的にログに出力 – PrintReport:LogReport がとった統計値をコンソールに出力 – ProgressBar:訓練の進捗をコンソールに出力  Extension は簡単に自作できます:例えば以下は学習率に自動減衰の例 35 @chainer.training.make_extension() def adjust_learning_rate(trainer): optimizer = trainer.updater.get_optimizer('main') optimizer.lr = 0.01 / optimizer.t
  • 36. より詳しくは 過去スライド参照 先日、研究室のセミナーで話したスライドに MNIST サンプルの解説があります とくに Trainer 部分につ いては今日お話できなかっ た部分がもう少し詳しく書 いてあります ほかの公式サンプル (PTB, ImageNet) も参考になるは ずです 36 http://www.slideshare.net/beam2d/introduction-to-chainer
  • 37. ここまでのまとめ  現在では、ニューラルネットは計算グラフと思うのがよい  いろいろなフレームワークにはそれぞれの売りがある  Chainer は順伝播のときに動的に計算グラフを構築する  Link/Chain を使ってニューラルネットをコンポーネント化し、再利用できるよ うになっている  訓練ループの抽象化は Dataset/Iterator, Updater, Trainer/Extension からな る  Extension を使って訓練ループに自由に処理を追加できる
  • 38. Chainer の OSS 開発 38
  • 39. オープンソースソフトウェアと深層学習  オープンソースライセンスを採用しているソフトウェア – オープンソースライセンスとしては、Open Source Initiative による定義を用いるの が一般的 (The Open Source Definition, OSD)  ほとんどの深層学習フレームワークは非コピーレフトのゆるやかなライセンス にもとづくオープンソースソフトウェア – Caffe: 2-Clause BSD license – Theano, Torch: BSD license – MXNet, TensorFlow: Apache 2.0 license – Chainer: MIT license  ここに挙げたフレームワークはすべて GitHub 上で開発が行われている
  • 40. GitHub (github.com) 分散バージョン管理ツール Git のリポジトリホスティングサービス GitHub リポジトリでは Git の機能が使えるほか、以下の機能が使える  Issue トラッキング – 任意のユーザがそのプロジェクトに関する問題を掲示板形式で議論できる  Pull Request (PR) – 管理者以外がソースコードに変更を加えたいとき、そのリクエストが送れる – PR に対しては自動で issue ページが作られ、そこでその変更について議論できる – 管理者であっても PR は送れる  コードレビュー – PR の変更行に対してコメントを追加したり、その場で議論できる  などなど(ほかに Wiki をつくる、統計を見るなど) 40
  • 42. Chainer の開発に関わる人々 42 Chainer チーム (コミッター、レビュワー) ※ PFN PR コントリビューター (現在計 67 名) その他コントリビューター (issue 報告など)
  • 43. Chainer の開発に関わる人々 PFN 社内のみにいるのはおもにコアメンバー(コミッター)とレビュワー  コミッター:リポジトリ本体に直接変更を加える権限を持つ人 – 送られてきた PR を本体にマージするのもコミッターの仕事  レビュワー:PR のコードレビューをする人 もちろん社内にも(コアメンバー外の)Chainer ユーザーがたくさんいる  ユーザーの中で特によく使ってくれている人たちがレビュワーになっている  社内ユーザーは、社外のユーザーと同じように issue 登録したり PR を投げた りする(オフラインでの相談もよくする) 43
  • 44. Chainer の開発史(主要なもの) 2015/4 開発開始 2015/5 ロゴ策定、ドキュメント・ウェブサイトの準備等 2015/6 v1.0 公開 2015/7 v1.1: 型チェック機能, Caffe モデル読込, Python3 サポート 2015/9 v1.3: CuPy リリース 2015/11 v1.5: Link/Chain 追加, CuPy の Cython 化 2016/1 v1.6: 互換性ポリシーの導入(後方互換性サポートを開始) 2016/3 v1.7: デバッグモード、FunctionHook 追加 2016/5 v1.9: Weight initializer 追加、浮動小数点型サポートの拡大 2016/6 v1.10: Minor リリースポリシーの変更 2016/7 v1.11: Dataset/Trainer 追加 44
  • 45. 今のところ master ブランチで開発している  非コミッターの場合、まず自分のアカウントに Chainer リポジトリをフォーク してからブランチを作り、変更を加え、PR を送る  PR を送ると、レビュワーがコメントを加え、PR 送信者がそれに答える (コメントに返信するか追加の変更を加える)。これを収束するまで繰り返す Chainer の開発の進め方 45 master ブランチ 機能 1 ブランチ 機能 2 ブランチ PR/レビュー/マージ v1.x.y リリース! (タグ)
  • 46. Chainer コアチーム/レビューチームのスケジュール  毎週 1 日、顔を付きあわせて開発する時間をとっている(集中開発)  隔週火曜日のリリースでも集まってリリース作業を行う  毎リリース後に反省会と、次リリースの相談  より長いスパンの予定についてもリリース後に議論  これらとは別に、レビュワーチームと一緒にひたすらレビューする時間も週 2 回とっている(最近) – PR レビューはどんどん加速していきたいと考えています 46
  • 47. Chainer の開発環境  Chainer の開発には GPU が載っているマシンが必要 – 特に全機能を触りうるコアメンバーは、GPU が最低 2 台載っているマシンが必要  テストは自動化している:継続的インテグレーション (CI) – OSS の場合、無料で利用できる CI サービスがいくつかある – Chainer ではそのうち TravisCI (Linux, Mac) と AppVeyor (Windows) を利用中 – これらを使って同時にテストのコードカバレージ(テストで実行されるコードの行数 とその割合の計測)を coverage.io で行っている – ただし、公開 CI はどれも GPU 未対応  社内に GPU のあるサーバーを用意して、そこでも別に CI を回している – Jenkins を利用 – 環境の仮想化に NVIDIA Docker を利用している – セキュリティ上の理由で、この CI は PFN 社内開発者のみが見られる 47
  • 48. Chainer の開発に貢献するには 大きく以下の貢献ポイント  本体の開発  サンプルの追加・改善  ドキュメントの追加・改善  リポジトリ外での貢献 48
  • 49. Chainer への貢献:本体の開発  変更を書いて、PR を送り、レビューに対応して、マージされる  変更を書き始める前に、issue を作っておいて「自分これやります」と宣言して おくこともある(他の人と同じ変更を重複して書くのを避けられる) 変更を書くときのポイント  あらかじめ “Contribution Guide” を読んでおく! – コーディングスタイルなど、PR を送る際のルールが書いてある  コーディングスタイルに従う(チェックツールもある)  変更に対応するテストを必ず書く – 自明な typo 修正などとても小さな変更で正しさが明らかなものには必要ない  機能追加の場合、ドキュメントを書く(重要!) 49
  • 50. Chainer への貢献:本体の開発 変更の種類(上に行くほど簡単でおすすめ)  小さなバグの修正:レビューもすぐ済み、低コストでマージされることが多い  実装の改善(高速化など) – レビュワーが検証する必要があるので、少し時間がかかる – インターフェイスが変わらなければ、効果があるかぎりすんなりマージされやすい  新しい Function, Link, CuPy 関数の追加 – ほかの変更と独立しているため、コンフリクトが起きにくい – インターフェイスの検証が必要であり、またドキュメントも必要なので、レビューに は時間がかかる  コア機能の追加(例:Weight Initializer) – レビューはもっともタフなものになる – その代わりマージされたときの貢献度合いはもっとも高いといえる 50
  • 51. Chainer への貢献:サンプル/ドキュメントの追加・改善  既存サンプルの改善は、わりとすんなりマージされやすい – ただし、機能の使い方が意図していないものだと時間がかかったり、却下されること もある  新しいサンプルの追加は、行数も多いためレビューには少し時間がかかる – 「がっつり添削してもらえる」と考えることもできる – Chainer は公式サンプルが不足気味なので、サンプル追加はとても歓迎されま す!!! – 公式サンプルに入っていないタスクならなんでも OK  ドキュメントの改善はわりとすんなりマージされやすい – 英語表現の改善、obsolete な内容の更新など – どんな細かい変更でも歓迎します。おそらく貢献の敷居はドキュメントが一番低い 51
  • 52. Chainer への貢献:リポジトリ外での貢献 ソースコードに変更を加える以外にも、Chainer コミュニティーへの貢献の仕方は たくさんある  バグや機能リクエストなどを issue に書く  論文における実験の(追試)スクリプトを GitHub などにアップロードする – 宣伝もできるとなおよし! – 連絡していただければ、Chainer の公式 Twitter アカウントでツイートします(こち らで見つけた場合に勝手にツイートすることもあります) – 何かしらの方法で学習済みモデル(シリアライズしたもの)もアップロードしてくれ るとさらにグッド  フォーラムに質問を投げる、フォーラムの質問に答える  使い方や機能、上に書いた「追試」などのブログを書く  勉強会などで Chainer にまつわる発表を行う 52
  • 53. Chainer への貢献:公開集中開発  およそ月に 1 回のペースで「公開集中開発」を開催しています  Chainer コアチームのメンバーと一緒にもくもくと開発する会 – 開発は、本体リポジトリへの PR/マージ を目標とするもののもが対象 – 本体の開発でも、ドキュメント・サンプルの改善・追加でも OK  疑問点があったときにすぐ開発者に相談できるという点でおすすめです 53
  • 54. 学生・研究者がコードを公開する意味  現状、論文の発表などの業績という点で、ソースコードを公開するインセン ティブはあまり働いていない  学生の場合には、開発の実績として就職活動の際には利用可能  それに限らず、とくに深層学習においては研究の再現性が重要 – 再現するために必要な情報をすべて論文に書き切ることができない場合も多い(とく にスペースの制限された会議論文などの場合) – 再現に必要なスクリプトを公開すれば、その研究のフォロワーがつきやすくなると考 えられる(自分でチューニングをやりなおすことなく、関連研究や応用ができる) – よって、スクリプトの公開は、論文の refer を増やす効果があると予想される 54
  • 55. OSS 開発に参加する意味  (とくに学生にとって) PR を送ることは、自分のコードをほかの開発者に直接レビューしてもらえる機 会になる  自分の研究分野で必要な機能を本体に積極的に取り込んでもらうと、その機能 を使う研究者・実務家が増える – するとこの人たちが関連する機能をさらに公開したり PR を送ったりするようになる – これらは最初に機能を書いた人にとってはただで利用できる機能ということになる – Chainer 自体の公開も、根底にはこの狙いがある(クローズドに開発するよりも開発 スピードが上がるだろうという点) 55
  • 57. Chainer の学習・貢献をもっとスムーズにする 現状  学習:公式チュートリアルとサンプルを読む(分量、バリエーションが足りて いない)  貢献:本体へ PR(敷居が高い)、GitHub にコードを上げる(検索性が悪い) もっと段階的に入門から PR へのサポートをしたい (幅広い層のユーザーをサポートしていきたい)
  • 58. 予定している学習・貢献段階の充実  公式ドキュメント(今までどおり)  Chainer 100 本ノック  Chainer Blog  Chainer プラグインリポジトリ(仮)  PR(今までどおり) (まだ企画・準備段階なので、具体的な形式・内容は未定です) 58 新しく実施予定
  • 59. Chainer 100 本ノック  Cf.) 言語処理 100 本ノック http://www.cl.ecei.tohoku.ac.jp/nlp100/  Chainer を使って深層学習の研究をはじめるために必要な知識を学ぶための問 題集  初学者向けの内容で、たとえば学生の方にまずこれをやって深層学習の実装上 の知識や Chainer の使い方を知ってもらう 59
  • 60. Chainer Blog  Chainer の使い方や example についてのブログ  主な目的は example の充実で、このブログ上で公式 example でカバーされて いない様々な応用について、Chainer のコードつきでタスクや手法の解説をし ていきたい  100 本ノックと比べると、すでに Chainer を触り始めている人向け  余裕があれば Chainer の各機能についてのチュートリアルより突っ込んだ解説 などもしていきたい(cf. NVIDIA の Parallel Forall Blog) 60
  • 61. Chainer プラグインリポジトリ(仮)  Chainer の Function や Link などのある程度独立した機能を共有するサービス  GitHub の本体リポジトリに PR を送らなくても、ほかのユーザと最新の手法実 装を共有する場所をつくりたい – 現状でも GitHub の自分のリポジトリを作り、そこに実装を置いておくことは可能 – 多くの研究者・実務家が、論文の実験スクリプトや再現スクリプトを公開している – しかし、これらは検索しづらいし、提供のされ方もバラバラ – 専用のサービスに登録できるようにすれば検索・利用しやすくなり手法の再現・応用 の敷居がさらに下がる  これはすでに自分のタスクのために Chainer を使っている人向け 61
  • 62. まとめ  ニューラルネット (NN) は誤差逆伝播できる計算グラフ  NN のフレームワークは Backend、低レベルAPI、高レベルAPI からなる  Chainer は Backend である CuPy と、動的計算グラフおよび訓練ループの抽 象化からなる  Chainer の OSS 開発は PFN のコア開発者が主導して進めているが、外部から の貢献が大きなウェイトを占めている  学生や研究者がコードを公開したり、OSS 開発に参加することは、研究遂行上 も意味がある(と考えている)  さらに Chainer の利用を広めていくために、リソースの提供を増やしていき、 また共有の仕組みも強化していく予定 62