Deep Learningでは様々なLayerを組み合わせる必要がある。ここでは使用頻度の高いLayerの特徴を説明する。
以下のスライドではLayerのパラメータと学習結果との関係について説明している。Layerについて一通り学習した後に読むと良い。
http://www.slideshare.net/takanoriogata1121/160924-deep-learning-tuningathon
chainer.functions
はパラメータを持たないLayerを集めたパッケージ、chainer.links
はパラメータを持つLayerを集めたパッケージである。chainer.links
にある機能のパラメータを学習対象とせずに自分で指定することもできる。その場合はchainer.functions
にある同等の機能を使用する。例えばchainer.links.Liner
のパラメータを指定したい場合にはchainer.functions.linear
を使う。
線形変換を行うLayerについて説明する。
入力と出力が全結合したLayerである。
パラメータとして行列W
とバイアスベクトルb
を持ち、入力x
に対してWx + b
が出力となる。
2次元Convolutional Layerである。
N次元Convolutional Layerである。
整数値をベクトルに変換するのに使用する。例えば自然言語処理で単語IDをベクトルに変換する時に使用する。IDとベクトル値との対応が学習対象となる。
Activation Function (活性化関数)となるLayerについて説明する。
Rectified Linear Unit (ReLU)を実行する。x
を入力としてmax(0, x)
で定義される。
tanhを実行する。形状はSigmoidと同じだが、出力の範囲が-1~1である点が異なる。使用頻度はReLUに比べると少ないが、出力の範囲を限定したい場合に使われる。
Sigmoid関数を実行する。最近はあまり使われない。
Softmax値を計算する。
Softmax値のlogをとる。単純にfunctions.softmax
の出力のlogをとるのでは、softmax
の出力が0に丸められることがあるので支障がある。softmaxのlogをとる場合はlog_softmax
を使う方が安全である。
ReLUは入力が負の時に勾配が消失するというデメリットがあり、それを改善するために導入された。出力は入力をx
、alpha
を定数としてx >= 0
のときx
、x < 0
のときalpha * (exp(x) - 1)
となる。使用頻度は低い。
ELUと同じくReLUの勾配消失問題を改善するために導入された。x
を入力、alpha
を0~1の範囲にある定数として、出力はmax(alpha * x, x)
となる。使用頻度は低い。
データにノイズを加えるLayerについて説明する。ノイズを加えることで過学習を防ぎ汎化性を高めることができる。
学習時に出力の一部を確率的に0にする。0にしない箇所の出力は確率に応じて大きくする。0にする確率をp
とする場合、出力は1 / (1 - p)
倍にする。予測時には出力の操作は行わない。
使用頻度は高く、Fully Connected LayerまたはConvolutional Layerの直後で使われることが多い。
Normalizationを行うことで学習速度や精度を向上させることができる。
出力をミニバッチ内で平均0, 分散1にすることでその後のLayerの学習を行いやすくする。 Convolutional Layerの直後に挿入することが多い。 使用頻度は非常に高く、CNNを使う場合導入はほぼ必須といえる。
2 x 2, 3 x 3など、空間的に近い領域の出力の平均または最大値をとって出力の数を減らすことをPoolingと呼ぶ。
局所領域の最大値を出力する。画像認識では、複数のCNNの後にMax Poolingを挿入するというのを何回か繰り返すことが多い。
局所領域の平均値を出力する。画像認識では最終出力の数段前にAverage Poolingを挿入して、幅・高さ方向の全平均をとる手法がある。
使用頻度の高い損失関数が用意されている。
Softmax Cross Entropyを計算する。多値分類でよく使われる。出力は求めたSoftmax Cross Entropyの平均となる。
平均二乗誤差を計算する。回帰でよく使われる。
numpyに備わっている配列操作の一部をchainer.functions
でも行うことができる。
2つの配列を連結する。
配列のreshapeを行う。
2つの行列の積を求める。
バッチごとに2つの行列の積を求める。配列a
と配列b
とがあるとき、c = functions.batch_matmul(a, b)
とすると、i = 0, 1, 2, ...についてc[i]
はa[i]
とb[i]
の積となる。
numpy配列の計算のようにa + b - c
、a ** b
といった記述で演算子を使用できる。以下の演算子を使用できる。
- 正負の反転:
-a
- 加算:
a + b
- 減算:
a - b
- 乗算:
a * b
- 除算:
a / b
- べき乗:
a ** b
- 絶対値:
abs(a)
- 行列積(Python 3.5以降):
a @ b
chainer.functions.matmul
でも実行可能なのであえて互換性のない@
を使用する必要はない。
合計値を計算する。特定の軸に沿った合計値を出力することもできる。