Chainerの詳しい構造

前回、Chainerを用いて多層パーセプトロンを組んできました。今回は、前回使用してきたChainerの命令について詳しくみていきます。具体的にはVariable、Linear、Convolution_2Dについて解説します。

Variable

データ配列を保存するための変数です。numpy.ndarrayかcupy.ndarrayがデータとして保存されます。この変数は、関数から作れるます。そして、Variableはどの関数から作られたかをきちんと記憶してあります。ただし、一番はじめにつくられたVariableは除きます。以下のプロパティがあります。

  • data:保存されているデータ
  • grad:勾配データ
  • creator:この変数を生成した関数
  • volatile
  • label:

メソッドは以下のものがあります。

  • __len__():dataの大きさを返します。
  • backward(retain_grad=False):逆伝搬を行います。
  • set_creator(gen_func):
  • unchain_backward():

Linear

Linearは関数で以下のような構文になっています。

Linear

Variable Linear(int in_size, int out_size,
float w_scale=1,float bias=0, bool no_bias=False,
2-D array initialW,1-D array initialBias)

Linearは

  1. Variable x:入力変数
  2. Variable W:重み
  3. Variable b:バイアス

を値として保有しています。入力層の数がin_sizeで出力層の数がout_sizeとなります。重みとバイアスの初期値はintialWやintialBiasで指定できますが、たいていはランダムに値を設定します。そのランダム具合はw_scaleで決めます。w_scaleが大きいほど重みの偏差は大きくなります。具体的には

\displaystyle\frac{wscale}{\sqrt{insize}}

となります。そして、no_biasがTrueだとバイアスはなくなり重みだけの設定になります。戻り値はVariableです。

Convolution2D

Convolution2D

Variable Convolution2D(int in_channel, int out_channel, int size, int stride=1, int pad=0,
wscale=1,bias=0,nobias=False,use_cudnn=True,
InitialW=NONE,InitialBias=None,dtype=<type ‘bumpy.float32’>)

2次元畳み込み関数です。in_channelとout_channelがそれぞれ入力と出力の色数です。sizeはフィルタの大きさ、strideとpadでそれぞれストライドとパディングを設定できます。wscale,bias,nobias,InitialW,InitialBiasはLinearと同様の意味です。ちなみにノイズの大きさは

\displaystyle\frac{wscale}{size\sqrt{inchannel}}

です。dtypeは計算に使用するデータ型です。

FunctionSet

層における重みやバイアスなどを一つにまとめる際に役に立つオブジェクトです。プロパティは以下のとおりです。

  • gradients:勾配をタプル形式で保存したもの
  • parameters:値をタプル形式で保存したもの

メソッドは以下のとおり。

  • __getitem__(key):keyのFunctionを返します。
  • collect_parameters():タプルで重みとバイアス、勾配を返します。
  • copy_parameters_from(params):paramsからパラメタをコピーします。
  • to_cpu():CPUのパラメタを送ります。
  • to_gpu(device=None):GPUにパラメタを送ります。

Optimizers

勾配を更新する際の計算アルゴリズムを指定します。なるべく早く収束し、発散しないようにステップを制御する方法がいろいろ提案されているので以下のようにたくさんあります。詳しいことは自分でしらべてください。

  • AdaDelta(rho=0.95,eps=1e-06)
  • AdaGrad(lr=0.001,eps=1e-08)
  • Adam(alpha=0.001,beta1=0.9,beta2=0.999,eps=1e-08)
  • MomentumSGD(lr=0.01,momentum=0.9)
  • NesterovAG(lr=0.01,momentum=0.9)
  • RMSprop(lr=0.01,alpha=0.99,eps=1e-08)
  • SGD(lr=0.01)

Optimizer

Optimizersから生成されます。プロパティは一つだけです。

  • t:実行したステップの回数です。

メソッドは以下のようにたくさんあります。

  • accumulate_grads(grads)
  • clip_grads(maxnorm)
  • compute_grads_norm()
  • init_states(param,grad)
  • init_states_cpu(param,grad)
  • init_states_gpu(param,grad)
  • setup(params_grad):全階層のモデルをparams_gradに設定します
  • update():パラメタと状態をすべて更新します。
  • update_one(param,grad,state)
  • update_one_cpu(param,grad,state)
  • update_one_gpu(param,grad,state)
  • weight_decay(decay)
  • zero_grads():勾配データをすべてゼロにします。

著者:安井 真人(やすい まさと)