深層学習フレームワーク chainer の開発と今後の展開
TRANSCRIPT
![Page 1: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/1.jpg)
深層学習フレームワークChainer の開発と今後の展開
得居 誠也 / MIRU2016@アクトシティ浜松
Preferred Networks, Inc. / 東京大学
2016/08/01
![Page 2: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/2.jpg)
自己紹介
得居 誠也 (Seiya Tokui)
Preferred Infrastructure (2012-2014), Preferred Networks (2014-)
– 分散機械学習基盤 Jubatus
– maf (実験管理)
– Chainer (NN フレームワーク)
東京大学 情報理工 コンピュータ科学専攻 博士課程 (2016-)
興味
深層学習、表現学習、強化学習、生成モデル
コンピュータビジョン、言語処理、ロボティクス
2
![Page 3: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/3.jpg)
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
![Page 4: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/4.jpg)
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
![Page 5: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/5.jpg)
研究における OSS の開発
(ソフトウェア開発が本職ではない)学生や研究者が多く参加している
そもそもアカデミックな組織が主体となって作っているものも多い
(Caffe, Theano, MXNet など)
企業が主体となっている OSS でも学生や研究者が多くコミットしている
(Torch, TensorFlow, Chainer, etc.)
背景として、最先端の研究に使われているという点がある
– 深層学習の業界は arXiv 先行で非常にスピードが速い
– 最先端を知る研究者自身が開発に参加していかないと研究スピードが追いつかない
– 再現や応用の敷居の高さによって後続研究が出てくるスピードが変わる(印象)
5
![Page 6: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/6.jpg)
本発表の目的と内容
深層学習に関わる学生・研究者の方々に、OSS 開発の実際のところを知っても
らい、どんどん参加できるようになってもらう
とくに学生・研究者の方々からの深層学習フレームワークへの貢献を増やす
そのために以下の事柄について話します
ニューラルネットのおさらい
深層学習フレームワークの全体像
Chainer の基本的な概念と使い方
Chainer の OSS 開発
Chainer の今後の展開
6
![Page 7: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/7.jpg)
ニューラルネットのおさらい
7
![Page 8: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/8.jpg)
ニューラルネット (NN)
本発表では、「深層学習」=「深い NN をつかった機械学習」とします
NN とは?
意外と難しい言葉
「シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、
学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデ
ル全般を指す」 (https://ja.wikipedia.org/wiki/ニューラルネットワーク)
こういう絵をよく書く
![Page 9: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/9.jpg)
ニューラルネット (NN)
現在よく使われるプロセッサでは、数値演算をベクトル化することで並列性を
高められる(CPU, GPU)
ニューラルネットの 1 層分の結合は、行列積として書ける
さらに並列性を高めるために、ミニバッチがよく使われる(複数のデータ点に
ついて一度に計算する)
これらを踏まえると、1 ユニットずつバラバラに書いた古典的な描像よりも、1 レ
イヤーを一つの単位にまとめたベクトル化された捉え方の方が、計算上扱いやすい
9
こういう絵の方が扱いやすい各ノードは多次元配列を表す
![Page 10: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/10.jpg)
ニューラルネット=計算グラフ
最近はどんどん複雑なニューラルネットが扱われるようになっている
(encoder-decoder, attention, residual net, etc.)
もともとの「脳のニューロンのモデル化」を離れて、「微分可能な演算をうま
く組み合わせたもの」になってきている
この考え方をおしすすめると、ニューラルネット=計算グラフ となる
たとえば、最小二乗法による線形回帰の損失計算は下の計算グラフで書ける
(これも広義にはニューラルネットと思える)
10
matmul + MSE
MSE: Mean Squared Error
![Page 11: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/11.jpg)
ニューラルネットの学習:確率的勾配法
確率的勾配降下法:パラメータ , 目的関数 として
このように勾配の不偏推定量のサンプリングに基づく確率的最適化をここでは
「確率的勾配法 (stochastic gradient methods)」と呼ぶことにする
勾配のランダムネスには二種類ある
– ミニバッチによるランダムネス:目的関数がデータ点ごとの関数の和で書かれるとき、
一部のデータ点に対してだけ勾配を計算すると、全体の勾配の不偏推定になる
– 計算過程のランダムネス:ニューラルネットの中にランダムな振る舞いをする演算を
入れる(例:dropout など)
– → どちらも計算グラフの枠組みで扱える
11
学習率 勾配の不偏推定
![Page 12: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/12.jpg)
合成関数の微分は、ヤコビ行列の積でかける
たとえば線形回帰の例では:
このヤコビ行列の積を 1 つずつ計算する:自動微分
– cf.) 数値微分、シンボル微分(これらは違う手法!)
計算グラフの自動微分
12
matmul + MSE
![Page 13: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/13.jpg)
計算グラフのリバースモード自動微分=誤差逆伝播法
ニューラルネットの場合、微分をとりたい入力変数(=パラメータ)は高次元
で、出力変数(=目的関数値)はスカラー
この場合、ヤコビ行列は右からかけていくのが効率的
この方法を誤差逆伝播やリバースモード自動微分(高速自動微分)という
13
matmul + MSE
![Page 14: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/14.jpg)
現代的なニューラルネット
基本的には「(微分可能な)計算グラフ」と捉えるのがよい
とくに、全結合層や畳込み層などパラメータを持つ線形変換が途中に含まれる
ものを指すことが多い
– そうでない場合は、たとえ勾配法で学習する場合でもニューラルネットと呼ばないこ
とが多いように思う
ニューラルネットはどんどん複雑になっていっている
– 多層化:VGG, GoogLeNet, ResNet, …
– 組合せ:Encoder-Decoder, VAE, GAN, …
– 新しい演算:LSTM/GRU, soft attention, memory, dilated convolution, …
⇒ フレームワークの柔軟性がますます重要に
14
![Page 15: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/15.jpg)
深層学習フレームワークの全体像
15
![Page 16: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/16.jpg)
深層学習のフレームワーク
数が多い!!!
“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
![Page 17: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/17.jpg)
なぜニューラルネットにはフレームワークが必要?
NN 研究における要求:
NN のトポロジーを柔軟に定義したい
試行錯誤のサイクルを高速に回したい
– できるだけ NN の定義に依存するコードを減らしたい
(コードのごく一部を変更するだけでいろいろな NN を試したい)
– 計算性能も(研究者による最適化なしに)高くしたい
そのために必要なもの:
勾配計算の自動化(自動微分)
CUDA プログラミングの簡易化
効率的な実行(計算の自動最適化)
訓練ループにおける定型処理の抽象化
17
フレームワークでカバーしたい
![Page 18: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/18.jpg)
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”
![Page 19: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/19.jpg)
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
![Page 20: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/20.jpg)
たくさんあるフレームワークは何が違うのか
(少なくとも一定以上使われているものについては)それぞれ「売り」がある
パフォーマンスが売り
Caffe, Theano, Torch, TensorFlow, MXNet, Neon
スケーラビリティが売り
TensorFlow, MXNet
ハックしやすさが売り
Chainer, Torch
デバッグしやすさ・直感性が売り
Chainer
コミュニティの規模が売り
Caffe, Theano, Torch, TensorFlow
細かい違いはもっといっぱいある
20
どれを選ぶか? 自分のタスクに適したものを選ぶ 一緒に使うほかのツールとの相性
で選ぶ(言語など) 使い勝手、好みで選ぶ(重要)
![Page 21: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/21.jpg)
PAKDD 2016DLIF チュートリアル
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
![Page 22: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/22.jpg)
Chainer の基本的な概念と使い方
22
![Page 23: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/23.jpg)
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”
![Page 24: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/24.jpg)
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:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
![Page 25: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/25.jpg)
Chainer における計算グラフ
Variable が配列ノードを、Function が演算ノードを表す
Variable は、配列(NumPy もしくは CuPy)を 2 つ保持する
– data が順伝播時の配列、grad が逆伝播時の配列(=勾配)
Variable に Function を適用すると、Variable が返ってくる
– data に順伝播の結果が入っている
– この Variable は、過去の計算の履歴を覚えている
– 演算の履歴は、非巡回有効グラフ (DAG) の形をしている。つまり計算グラフ
ロス(スカラー値)の Variable に対して backward() メソッドを呼び出す
と、計算グラフをたどって誤差逆伝播を実行する
このように Chainer では順伝播の計算時に動的にグラフを構築する
(動的計算グラフ、Define-by-Run)
25
![Page 26: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/26.jpg)
import chainerimport chainer, chainer.functions as F, numpy as npW = chainer.Variable(np.array(...))b = chainer.Variable(np.array(...))x = np.array(...)y = np.array(...)
a = F.matmul(W, x)y_hat = a + bell = F.mean_squared_error(y, y_hat)print(ell.data) # => ロス値を出力
例:線形回帰
26
matmul + MSE
入力の準備(あとで grad を取り出す場合はあらかじめ Variable にしておく)
順伝播の計算
![Page 27: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/27.jpg)
例:線形回帰
27
matmul + MSE
a = F.matmul(W, x)y_hat = a + bell = F.mean_squared_error(y, y_hat)
ell.backward() # ロスの勾配を計算print(W.grad) # => W に対する勾配を出力print(b.grad) # => b に対する勾配を出力
![Page 28: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/28.jpg)
ニューラルネットのコンポーネント化: Link/Chain/ChainList
Link: 順伝播のコード片と、それに紐づくパラメータをまとめたもの
– ニューラルネットのオブジェクト指向プログラミング
Chain, ChainList: 順伝播のコード片と、そこで使われる Link をまとめたもの
– コンポーネントを階層化するもの
– これら自身も Link なので、入れ子にできる
– 子 Link を名前で管理するのが Chain, インデックス番号で管理するのが ChainList
これらには、ニューラルネットを扱う上での便利な機能もついている
Link 階層内のすべてのパラメータを集めてくる
Serializer を使ったパラメータのセーブ・ロード (npz, HDF5 に対応)
階層内のすべての Link を指定した GPU のメモリに送る
28
![Page 29: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/29.jpg)
例:全結合層
29
import chainer, chainer.functions as Fimport 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 として提供されているので、普通はそれを使う
![Page 30: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/30.jpg)
例:多層パーセプトロン
30
import chainer, chainer.functions as F, chainer.links as Limport 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
![Page 31: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/31.jpg)
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
![Page 32: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/32.jpg)
確率的勾配法の実装がいろいろ提供されている
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) # 引数はロス関数とその引数
![Page 33: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/33.jpg)
訓練ループは以下の繰り返し
ミニバッチを読み込む
順伝播・逆伝播の計算
Optimizer によるパラメータ更新
現在の学習性能をチェックする
定期的に訓練過程のスナップショットを取る
訓練ループの抽象化
33
Updater
Extension
Trainer
DatasetIterator
![Page 34: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/34.jpg)
訓練ループ抽象化の概略
データセットはランダムアクセス可能なコンテナならなんでも OK
配列そのままでもよいし、タプルや辞書のリストとかでもよい
Iterator がデータの読み方を決める
シャッフルするかどうか、1回全データを読んだら終了するかしないか
SerialIterator がデフォルト実装で、一般にはこれで OK
MultiprocessIterator を使うとデータの読み込みをワーカープロセスで並列
化する(ディスクアクセスや前処理の並列化に有効)
Updater が Iterator と Optimizer(とそのターゲットリンク)を組み合わせ
て更新処理を行う
ParallelUpdater を使うと複数 GPU によるデータ並列ができる
34
![Page 35: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/35.jpg)
訓練ループ抽象化の概略: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
![Page 36: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/36.jpg)
より詳しくは過去スライド参照
先日、研究室のセミナーで話したスライドに
MNIST サンプルの解説があります
とくに Trainer 部分につ
いては今日お話できなかっ
た部分がもう少し詳しく書
いてあります
ほかの公式サンプル (PTB,
ImageNet) も参考になるは
ずです
36
http://www.slideshare.net/beam2d/introduction-to-chainer
![Page 37: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/37.jpg)
ここまでのまとめ
現在では、ニューラルネットは計算グラフと思うのがよい
いろいろなフレームワークにはそれぞれの売りがある
Chainer は順伝播のときに動的に計算グラフを構築する
Link/Chain を使ってニューラルネットをコンポーネント化し、再利用できるよ
うになっている
訓練ループの抽象化は Dataset/Iterator, Updater, Trainer/Extension からな
る
Extension を使って訓練ループに自由に処理を追加できる
![Page 38: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/38.jpg)
Chainer の OSS 開発
38
![Page 39: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/39.jpg)
オープンソースソフトウェアと深層学習
オープンソースライセンスを採用しているソフトウェア
– オープンソースライセンスとしては、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 上で開発が行われている
![Page 40: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/40.jpg)
GitHub (github.com)
分散バージョン管理ツール Git のリポジトリホスティングサービス
GitHub リポジトリでは Git の機能が使えるほか、以下の機能が使える
Issue トラッキング
– 任意のユーザがそのプロジェクトに関する問題を掲示板形式で議論できる
Pull Request (PR)
– 管理者以外がソースコードに変更を加えたいとき、そのリクエストが送れる
– PR に対しては自動で issue ページが作られ、そこでその変更について議論できる
– 管理者であっても PR は送れる
コードレビュー
– PR の変更行に対してコメントを追加したり、その場で議論できる
などなど(ほかに Wiki をつくる、統計を見るなど)
40
![Page 41: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/41.jpg)
例:コードレビュー
41
![Page 42: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/42.jpg)
Chainer の開発に関わる人々
42
Chainer チーム(コミッター、レビュワー)
※ PFN
PR コントリビューター(現在計 67 名)
その他コントリビューター(issue 報告など)
![Page 43: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/43.jpg)
Chainer の開発に関わる人々
PFN 社内のみにいるのはおもにコアメンバー(コミッター)とレビュワー
コミッター:リポジトリ本体に直接変更を加える権限を持つ人
– 送られてきた PR を本体にマージするのもコミッターの仕事
レビュワー:PR のコードレビューをする人
もちろん社内にも(コアメンバー外の)Chainer ユーザーがたくさんいる
ユーザーの中で特によく使ってくれている人たちがレビュワーになっている
社内ユーザーは、社外のユーザーと同じように issue 登録したり PR を投げた
りする(オフラインでの相談もよくする)
43
![Page 44: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/44.jpg)
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
![Page 45: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/45.jpg)
今のところ master ブランチで開発している
非コミッターの場合、まず自分のアカウントに Chainer リポジトリをフォーク
してからブランチを作り、変更を加え、PR を送る
PR を送ると、レビュワーがコメントを加え、PR 送信者がそれに答える
(コメントに返信するか追加の変更を加える)。これを収束するまで繰り返す
Chainer の開発の進め方
45
master ブランチ
機能 1 ブランチ
機能 2 ブランチ
PR/レビュー/マージ
v1.x.y リリース!(タグ)
![Page 46: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/46.jpg)
Chainer コアチーム/レビューチームのスケジュール
毎週 1 日、顔を付きあわせて開発する時間をとっている(集中開発)
隔週火曜日のリリースでも集まってリリース作業を行う
毎リリース後に反省会と、次リリースの相談
より長いスパンの予定についてもリリース後に議論
これらとは別に、レビュワーチームと一緒にひたすらレビューする時間も週 2
回とっている(最近)
– PR レビューはどんどん加速していきたいと考えています
46
![Page 47: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/47.jpg)
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
![Page 48: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/48.jpg)
Chainer の開発に貢献するには
大きく以下の貢献ポイント
本体の開発
サンプルの追加・改善
ドキュメントの追加・改善
リポジトリ外での貢献
48
![Page 49: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/49.jpg)
Chainer への貢献:本体の開発
変更を書いて、PR を送り、レビューに対応して、マージされる
変更を書き始める前に、issue を作っておいて「自分これやります」と宣言して
おくこともある(他の人と同じ変更を重複して書くのを避けられる)
変更を書くときのポイント
あらかじめ “Contribution Guide” を読んでおく!
– コーディングスタイルなど、PR を送る際のルールが書いてある
コーディングスタイルに従う(チェックツールもある)
変更に対応するテストを必ず書く
– 自明な typo 修正などとても小さな変更で正しさが明らかなものには必要ない
機能追加の場合、ドキュメントを書く(重要!)
49
![Page 50: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/50.jpg)
Chainer への貢献:本体の開発
変更の種類(上に行くほど簡単でおすすめ)
小さなバグの修正:レビューもすぐ済み、低コストでマージされることが多い
実装の改善(高速化など)
– レビュワーが検証する必要があるので、少し時間がかかる
– インターフェイスが変わらなければ、効果があるかぎりすんなりマージされやすい
新しい Function, Link, CuPy 関数の追加
– ほかの変更と独立しているため、コンフリクトが起きにくい
– インターフェイスの検証が必要であり、またドキュメントも必要なので、レビューに
は時間がかかる
コア機能の追加(例:Weight Initializer)
– レビューはもっともタフなものになる
– その代わりマージされたときの貢献度合いはもっとも高いといえる
50
![Page 51: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/51.jpg)
Chainer への貢献:サンプル/ドキュメントの追加・改善
既存サンプルの改善は、わりとすんなりマージされやすい
– ただし、機能の使い方が意図していないものだと時間がかかったり、却下されること
もある
新しいサンプルの追加は、行数も多いためレビューには少し時間がかかる
– 「がっつり添削してもらえる」と考えることもできる
– Chainer は公式サンプルが不足気味なので、サンプル追加はとても歓迎されま
す!!!
– 公式サンプルに入っていないタスクならなんでも OK
ドキュメントの改善はわりとすんなりマージされやすい
– 英語表現の改善、obsolete な内容の更新など
– どんな細かい変更でも歓迎します。おそらく貢献の敷居はドキュメントが一番低い
51
![Page 52: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/52.jpg)
Chainer への貢献:リポジトリ外での貢献
ソースコードに変更を加える以外にも、Chainer コミュニティーへの貢献の仕方は
たくさんある
バグや機能リクエストなどを issue に書く
論文における実験の(追試)スクリプトを GitHub などにアップロードする
– 宣伝もできるとなおよし!
– 連絡していただければ、Chainer の公式 Twitter アカウントでツイートします(こち
らで見つけた場合に勝手にツイートすることもあります)
– 何かしらの方法で学習済みモデル(シリアライズしたもの)もアップロードしてくれ
るとさらにグッド
フォーラムに質問を投げる、フォーラムの質問に答える
使い方や機能、上に書いた「追試」などのブログを書く
勉強会などで Chainer にまつわる発表を行う
52
![Page 53: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/53.jpg)
Chainer への貢献:公開集中開発
およそ月に 1 回のペースで「公開集中開発」を開催しています
Chainer コアチームのメンバーと一緒にもくもくと開発する会
– 開発は、本体リポジトリへの PR/マージ を目標とするもののもが対象
– 本体の開発でも、ドキュメント・サンプルの改善・追加でも OK
疑問点があったときにすぐ開発者に相談できるという点でおすすめです
53
![Page 54: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/54.jpg)
学生・研究者がコードを公開する意味
現状、論文の発表などの業績という点で、ソースコードを公開するインセン
ティブはあまり働いていない
学生の場合には、開発の実績として就職活動の際には利用可能
それに限らず、とくに深層学習においては研究の再現性が重要
– 再現するために必要な情報をすべて論文に書き切ることができない場合も多い(とく
にスペースの制限された会議論文などの場合)
– 再現に必要なスクリプトを公開すれば、その研究のフォロワーがつきやすくなると考
えられる(自分でチューニングをやりなおすことなく、関連研究や応用ができる)
– よって、スクリプトの公開は、論文の refer を増やす効果があると予想される
54
![Page 55: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/55.jpg)
OSS 開発に参加する意味
(とくに学生にとって)
PR を送ることは、自分のコードをほかの開発者に直接レビューしてもらえる機
会になる
自分の研究分野で必要な機能を本体に積極的に取り込んでもらうと、その機能
を使う研究者・実務家が増える
– するとこの人たちが関連する機能をさらに公開したり PR を送ったりするようになる
– これらは最初に機能を書いた人にとってはただで利用できる機能ということになる
– Chainer 自体の公開も、根底にはこの狙いがある(クローズドに開発するよりも開発
スピードが上がるだろうという点)
55
![Page 56: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/56.jpg)
Chainer の今後の展開
56
![Page 57: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/57.jpg)
Chainer の学習・貢献をもっとスムーズにする
現状
学習:公式チュートリアルとサンプルを読む(分量、バリエーションが足りて
いない)
貢献:本体へ PR(敷居が高い)、GitHub にコードを上げる(検索性が悪い)
もっと段階的に入門から PR へのサポートをしたい
(幅広い層のユーザーをサポートしていきたい)
![Page 58: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/58.jpg)
予定している学習・貢献段階の充実
公式ドキュメント(今までどおり)
Chainer 100 本ノック
Chainer Blog
Chainer プラグインリポジトリ(仮)
PR(今までどおり)
(まだ企画・準備段階なので、具体的な形式・内容は未定です)
58
新しく実施予定
![Page 59: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/59.jpg)
Chainer 100 本ノック
Cf.) 言語処理 100 本ノック http://www.cl.ecei.tohoku.ac.jp/nlp100/
Chainer を使って深層学習の研究をはじめるために必要な知識を学ぶための問
題集
初学者向けの内容で、たとえば学生の方にまずこれをやって深層学習の実装上
の知識や Chainer の使い方を知ってもらう
59
![Page 60: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/60.jpg)
Chainer Blog
Chainer の使い方や example についてのブログ
主な目的は example の充実で、このブログ上で公式 example でカバーされて
いない様々な応用について、Chainer のコードつきでタスクや手法の解説をし
ていきたい
100 本ノックと比べると、すでに Chainer を触り始めている人向け
余裕があれば Chainer の各機能についてのチュートリアルより突っ込んだ解説
などもしていきたい(cf. NVIDIA の Parallel Forall Blog)
60
![Page 61: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/61.jpg)
Chainer プラグインリポジトリ(仮)
Chainer の Function や Link などのある程度独立した機能を共有するサービス
GitHub の本体リポジトリに PR を送らなくても、ほかのユーザと最新の手法実
装を共有する場所をつくりたい
– 現状でも GitHub の自分のリポジトリを作り、そこに実装を置いておくことは可能
– 多くの研究者・実務家が、論文の実験スクリプトや再現スクリプトを公開している
– しかし、これらは検索しづらいし、提供のされ方もバラバラ
– 専用のサービスに登録できるようにすれば検索・利用しやすくなり手法の再現・応用
の敷居がさらに下がる
これはすでに自分のタスクのために Chainer を使っている人向け
61
![Page 62: 深層学習フレームワーク Chainer の開発と今後の展開](https://reader034.vdocuments.site/reader034/viewer/2022042504/586f70e61a28ab10258b4d8d/html5/thumbnails/62.jpg)
まとめ
ニューラルネット (NN) は誤差逆伝播できる計算グラフ
NN のフレームワークは Backend、低レベルAPI、高レベルAPI からなる
Chainer は Backend である CuPy と、動的計算グラフおよび訓練ループの抽
象化からなる
Chainer の OSS 開発は PFN のコア開発者が主導して進めているが、外部から
の貢献が大きなウェイトを占めている
学生や研究者がコードを公開したり、OSS 開発に参加することは、研究遂行上
も意味がある(と考えている)
さらに Chainer の利用を広めていくために、リソースの提供を増やしていき、
また共有の仕組みも強化していく予定
62