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

20,530 views

Published on

MIRU2016 でのチュートリアル講演のスライドです。深層学習フレームワークの一般的な構成から、Chainer の解説、深層学習における OSS 開発の例と学生・研究者がそこにどのように関わっていくかについて書いています。

Published in: Technology
  • Be the first to comment

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

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

×