Chainer v3.0.0リファレンスマニュアル(日本語) / Core Functionalities
この記事については、下記ウェブサイトにまとまっています。
また、下記サイトにて他の項目についても追記中です。
Chainer v3.0.0rc Reference Manual - chainerfan ページ!
Chainerはニューラルネットワーク構築のための人気フレームワークです。国産ですが、全てのドキュメントは英語です。そこで、私のお勉強を兼ねて、Chainer v3.0のリファレンス・マニュアルをごりごり日本語にしてみたいと思います。
本当に「ごりごり」なので、翻訳について、もしくは技術的な理解について、間違いを発見した場合は、お知らせいただければ私の理解も進み、非常にありがたいです。
*2017/10/09現在で、文章中にリンクがある場合、リンク先は全てオリジナルの英語サイトです。
Chainerのライセンスページ(英語):
http://docs.chainer.org/en/stable/license.html
Chainer Reference Manual
http://docs.chainer.org/en/stable/reference/index.html
- Core Functionalities/主な機能
- Function
- LinkとChain
- Optimizer
- Serializer
- データセットの抽象化
- 訓練ループの抽象化
- デバッグモード
- Chainerの設定
Core Functionalities/主な機能
VariableとParameter
chainer.Variable | 計算結果を保持する構造体配列オブジェクト |
chainer.as_variable | 配列や変数をVariableオブジェクトへ変換する関数 |
chainer.Parameter | Linkへ登録可能なオブジェクト |
chainer.variable.VariableNode | Backward計算グラフ(計算履歴)のVariableノード |
Function
chainer.Function | 異なるFunctionへの旧スタイルのインタフェース |
chainer.FunctionAdapter | FunctionをFunctionNodeでラップするAdapterクラス |
chainer.FunctionNode | 計算グラフの演算ノードクラス |
chainer.force_backprop_mode | バックプロパゲーション(誤差逆伝播法)を有効にするコンテキストマネージャを作成する関数 |
chainer.no_backprop_mode | バックプロパゲーション(誤差逆伝播法)を無効にするコンテキストマネージャを作成する関数 |
chainer.grad | 勾配を計算する関数 |
LinkとChain
chainer.Link | モデルを記述するためのビルディングブロック |
chainer.Chain | オブジェクトライクなインタフェースのコンポーザブルリンク |
chainer.Parameter | Linkへ登録可能なオブジェクト |
Optimizer
chainer.optimizer.Hyperparameter | Optimizerのハイパーパラメータのセット |
chainer.UpdateRule | 更新ルールの基底クラス |
chainer.Optimizer | 数値Optimizerの基底クラス |
chainer.GradientMethod | 単一勾配に基づくOptimizerの基底クラス |
Hook Function
chainer.optimizer.WeightDecay | 荷重減衰(weight decay)正則化のためのOptimizer/UpdateRule フック関数 |
chainer.optimizer.Lasso | Lasso正則化のためのOptimizer/UpdateRule フック関数 |
chainer.optimizer.GradientClipping | 勾配クリッピングのためのOptimizer/UpdateRule フック関数 |
chainer.optimizer.GradientNoise | 勾配ノイズを加えるためのOptimizer/UpdateRule フック関数. |
Serializer
chainer.AbstractSerializer | オブジェクトを直列化(serialize)、非直列化(deserialize)する抽象基底クラス. |
chainer.Serializer | Serializerの基底クラス. |
chainer.Deserializer | Deserializerの基底クラス |
データセットの抽象化
Chainer は訓練用と評価用のデータセットの共通インタフェースをサポートしています。このデータセットのサポートは、データセット, イテレータ、バッチ変換関数の3つのコンポーネントから構成されています。
データセット は*学習データ群です。このインタフェースは、ユーザが使用したいと考えるイテレータの組み合わせによって決定されます。Chainerのビルトインのイテレータは、このデータ・セットに __getitem__ と__len__ メソッドをサポートするよう要求しています。 特に、 __getitem__ メソッドはIntegerとスライスの両方のインデクシングをサポートしなければなりません。 ユーザがインデクシングのために get_example() メソッドのみを実装しなければいけないような場合、DatasetMixinを継承することで、簡単にスライスインデクシングをサポートすることができます。いくつかのイテレータでは、学習データの型にも制限があります。基本的に、データセットはステートレスなオブジェクトと考えられているので、訓練処理中のチェックポイントで保存する必要はありません。(*examplesを学習データと訳しています。)
イテレータ はデータセットと各イテレーションを反復処理し、学習データのミニバッチをリストとして生成します。イテレータはPythonの標準イテレータプロトコルを含む Iterator インタフェースをサポートしなければなりません。イテレータは次にどこを読みに行くのか管理します。つまり、イテレータはステートフルです。
バッチ変換関数はミニバッチをニューラルネットへフィードするための配列へ変換します。 また、それぞれの配列を適切なデバイスへ送る責任があります。Chainerは、現在、 concat_examples() をバッチ変換関数の唯一の例として提供しています。
これらのコンポーネントは全てカスタマイズ可能で、データセット型とそれらを操作する方法を限定することで最小限のインターフェースを持つようにデザインされています。とはいえ、Chainer自身によって提供されている実装は、大抵の使用方法をカバーしています。
Chainerは 軽量かつ管理が簡易なシステムであり、具体的なデータセットのサンプルを含んでいます。全てのデータセットはデータセットのルートディレクトリに保存されるようになっていて、環境変数 CHAINER_DATASET_ROOT によって定義され、set_dataset_root() 関数によって、設定が可能です。
Dataset representation
データセットの実装については Dataset examples をご覧ください。
chainer.dataset.DatasetMixin | データセット・インデクシングのためのデフォルト実装 |
Iterator interface
データセット・イテレータの実装について Iterator examples をご覧ください。
chainer.dataset.Iterator | データセット・イテレータの基底クラス |
Batch conversion function
chainer.dataset.concat_examples | データのリストを配列にコンカチネート(結合)する関数 |
chainer.dataset.to_device | 与えられたデバイスへ配列を送信する関数 |
訓練ループの抽象化
訓練ループの抽象化
Chainer は chainer.trainingモジュールのもとで、訓練ループの標準実装を提供します。この実装はVariable、Function、 Link/Chain/ChainList、Optimizer、Dataset、Reporter/Summaryを含む、多くの他のChainerのコア機能の最上位に構築されています。他の機械学習ツールキットにおける訓練ループの抽象化と比較した場合、Chainerの訓練フレームワークは、柔軟性の最大化を目指すとともに、代表的な使用方法のための簡易性も維持しています。ほとんどのコンポーネントはプラガブルで、ユーザはその定義を上書き可能です。
訓練ループ抽象化のコアは Trainerで、訓練ループ自体を実装しています。この訓練ループは2つのパートで構成されています。1つは Updaterで、これは実際に訓練のパラメータを更新するものです。 もう1つは Extensionで、パラメータ更新以外の任意の機能のためのものです。
Updater とExtensionは chainer.dataset と Iterator をデータベーススキャンとミニバッチのロードに使用します。また、Trainer は Reporter を測定値の収集にも使用します。また、Extensionは DictSummary をExtensionの蓄積と静的な計算に使用します。
多くの訓練ユーティリティ使用のサンプルが公式のexamplesにあります。また Trainer extensionsからもExtensionの実装を検索可能です。
Trainer
chainer.training.Trainer | Chainerの標準訓練ループ |
Updater
chainer.training.Updater | TrainerのUpdaterオブジェクトのインタフェース |
chainer.training.StandardUpdater | Updaterの標準実装 |
chainer.training.ParallelUpdater | GPU並列処理Updaterの実装 |
chainer.training.updaters.MultiprocessParallelUpdater | GPUのマルチプロセス並列処理Updaterの実装 |
Extension
chainer.training.Extension | Trainer extensionの基底クラス |
chainer.training.make_extension |
与えられた関数をTrainer extensionにするデコレータ |
Trigger
Trigger は呼び出し可能なオブジェクトで、訓練ループ内で特定のイベントを処理するタイミングを決定します。Trainerオブジェクトを引数として扱い、イベントが発生するとTrueを返します。
主に、Extensionを呼び出すタイミングを決定するのに使用されます。また、訓練ループを終了するタイミングを決定するのにも使用されます。
chainer.training.get_trigger | Trigger objectを取得する関数 |
デバッグモード
デバッグモードでは、 Chainerは実行時のVariablesの値をチェックし、更に詳細なエラーメッセージを表示します。 ユーザの作成したプログラムのデバッグを助けます。代わりに、追加のオーバーヘッドタイムが要求されます。
デバッグモードでは、 Chainerはfoward(順伝播)とbackward (逆伝播)の計算結果をチェックします。その値にNaN値が発見された場合、RuntimeErrorが生じます。幾つかの関数やLinkにおいても入力値の有効性をチェックします。
バージョン2.0.0と同用に、chainer.config.debugを使用してデバッグモードをオンにすることを推奨します。オブジェクト設定を利用する方法については、Configuring Chainerもご覧ください。 Chainer v1から可能である、従来の方法についてのリファレンスも下記の通り、残されています。
chainer.is_debug | 現在のデバッグモードを取得する関数 |
chainer.set_debug | デバッグモードに設定する関数 |
chainer.DebugMode | デバッグモードコンテキスト |
Chainerの設定
Chainerはいくつかの機能の挙動に影響を与えるグローバル設定を提供しています。このような設定は、一元的な設定システムを利用して、設定することが可能です。このシステムは各プロセス、各スレッドに対して透明性のある方法を提供します。
この設定はchainer.global_config とchainer.config という2つのグローバル・オブジェクトで構成されています。
global_config
オブジェクトは、Pythonの処理に共有された設定を保持します。 これは、GlobalConfig
クラスのインスタンスで、シンプルなオブジェクトとして用いられます。ユーザは 自由にその属性を設定できます。config
オブジェクトは現在のスレッドのための設定を保持します。これはLocalConfig
クラスのインスタンスです。このクラスはスレッドローカルのオブジェクトのように振る舞います。どの属性への変更も、カレントスレッドから必ず可視になります。
与えられたキーにどんな値も設定されていない場合は、global_config
がそのまま参照されます。この、透明性のある参照方法のおかげで、スレッドローカルのconfig
設定を用いるか、そうでなければデフォルトのglobal_config
の設定を利用出来るので、ユーザはどんな設定項目も常に読み込んで使用することが出来ます。
下記の設定項目が、現在Chainerによって提供されています。幾つかの項目は、デフォルト値が設定された環境変数によってサポートされています。デフォルト値はglobal_configに設定されることにご注意ください。
chainer.config.cudnn_deterministic
- cuDNN APIsにおける決定的な計算を行うかどうか設定するフラグ。
True
が設定されている場合、決定的モードのcuDNNを使用した畳み込み演算を行う。(つまり、演算結果に再現性がある)。True以外が設定されている場合、パフォーマンスと引き換えに、cuDNNを使用した畳込み演算の結果は非決定的なものになる可能性がある。デフォルト値はFalse
。 chainer.config.debug
- デバッグモード・フラグ。
True
が設定されている場合、Chainerはデバッグモードで動作する。デバッグモードについての詳細は、 Debug mode 参照。 デフォルト値は、環境変数CHAINER_DEBUG
が0か1で設定されてる場合それに従い、設定がない場合はFalse
。 chainer.config.enable_backprop
- バックプロパゲーション(誤差逆伝播法)のサポートを有効にするフラグ。
True
が設定されている場合、Function
はVariable
のバックプロパゲーション用の計算グラフを作成する。それ以外では、計算グラフは作成されない。そのため、ユーザはbackward()
メソッドを呼び出すことができない。 デフォルト値はTrue
。 chainer.config.keep_graph_on_report
-
report()
に計算グラフを保持させるかどうかを設定するフラグ。False
が設定されている場合、report()
はVariable
オブジェクトがリポートされた時、計算グラフを保持しない。 つまり、report()
は計算グラフから切り離したVariable
オブジェクトのコピーを格納する。True
が設定されている場合、report()
は計算グラフが付属したままVariable
オブジェクトを格納する。デフォルト値はFalse
。 chainer.config.train
- 訓練モードフラグ。
True
が設定されている場合、 Chainerは訓練モードで動作する。 それ以外の場合は、テスト(評価)モードで動作する。デフォルト値はTrue
。 chainer.config.type_check
- 型チェックモードフラグ。
True
が設定されている場合、Function
アプリケーションに対する入力値のデータの種類と型について、Chainerは型チェックを行う。 それ以外の場合では、型チェックはスキップされる。環境変数のCHAINER_TYPE_CHECK
に0か1が設定されている場合は、それがデフォルト値になり、設定されていない場合はTrue
。 chainer.config.use_cudnn
-
cuDNNを使用するかどうかのフラグ。
'always'
、'auto'
、'never'
の3つのフラグ値から選択する。各フラグの意味は下記の通り。-
'always'
が設定されている場合、Chainer は cuDNN を可能な限り使用するよう試みる。 -
'auto'
が設定されている場合、Chainerはパフォーマンスが落ちない限り、 cuDNNを使用する。 -
'never'
が設定されている場合、Chainer は cuDNN を使用しない。
デフォルト値は
'auto'
。 -
ユーザは、2つの方法でユーザ自身の設定を定義出来ます。
- Chainerの configuration オブジェクトを使用する方法。この場合、Chainerに将来的に導入される設定項目との名前の競合を避けるため、プレフィックスに"user_"と付けることを強く推奨します。
- ユーザが作成したconfigurationオブジェクトを使用する方法。ユーザは、
chainer.configuration.GlobalConfig
とchainer.configuration.LocalConfig
. を利用して、自分自身のconfigurationオブジェクトを定義可能です。この場合、名前の競合について考える必要はありません。
Example
この設定をプロセス内で共有したい場合、global_configの属性を設定します。
>>> chainer.global_config.user_my_setting = 123
この値は自動的にローカルのconfigを参照して抽出されます。
>>> chainer.config.user_my_setting
123
この属性がローカルに設定してある場合、カレントスレッドからのみ参照可能です。
>>> chainer.config.user_my_setting = 123
ときには、カレントスレッドの設定を一時的に変更したい場合があるでしょう。 その場合、 using_config()
を使用します。例えば、コードのある一部分においては、デバッグモードを有効にしたいという場合、下記のようにします。
>>> with chainer.using_config('debug', True):
... pass # code running in the debug mode
また、評価のためにテストモードにスイッチしたいことがありますが、これも同様に書くことが出来ます。
>>> with chainer.using_config('train', False):
... pass # code running in the test mode
Evaluator
は自動的にテストモードにスイッチするので、評価のための損失関数において、手作業でスイッチする必要はないことに注意してください。
また、下記のようにコーディングすることで、訓練モードとテストモードで違う挙動をさせることも可能です。
if chainer.config.train:
pass # code only running in the training mode
else:
pass # code only running in the test mode
chainer.global_config | Chainerのグローバル設定となるプレーンなオブジェクト |
chainer.config | Chainerのスレッドローカル設定 |
chainer.using_config | スレッドローカル設定を一時的に変更するためのコンテクストマネージャ |
chainer.configuration.GlobalConfig | Chainerのグローバル設定となるプレーンなオブジェクト |
chainer.configuration.LocalConfig | Chainerのスレッドローカル設定 |