読者です 読者をやめる 読者になる 読者になる

pip install deeplearning

こちらもどうぞ。http://monthly-hack.com

Chainerと読む「深層学習」-vol.2

深層学習 (機械学習プロフェッショナルシリーズ) 」をChainerのコードと交えて読み進めようという趣旨。

こんにちは。Chainerがバージョンアップして
サンプルコードのネットワークの定義方法が変わりました。
pythonのclassの使い方を少し理解した気がします。

今回は第2章の順伝播型ネットワーク(FFNN)です。

Chapter2 順伝播型ネットワーク

2.1 ユニットの出力

順伝播型ネットワーク(以降:FFNN)の出力は線形結合となっていて
 u = w_1x_1 + w_2x_2 + ... + w_nx_n + b
上の式のように入力xに重みwをかけて、バイアスbを足す。
これをchainerではchainer.linksのLinear関数で表す。

import chainer.links as L

u1 = L.Linear(4, 1) # (2.1a)
u2 = L.Linear(4, 1) # (2.1b)
u3 = L.Linear(4, 1) # (2.1c)

u = L.Linear(4, 3) # (2.3a)

Linear関数を詳しく説明すると、

class chainer.links.Linear(in_size, out_size, wscale=1, bias=0, nobias=False, initialW=None, initial_bias=None)

Linear(入力素子数, 出力素子数, 重みの標準偏差, バイアスの初期値, バイアスの有無, 重みの指定, バイアスの指定)
といった引数ががあり、重みやバイアスの初期値が渡されていない場合は、重みは正規分布、バイアスは0となる。

2.2 活性化関数

活性化関数はシナプスの役割をしていて、特定の値で発火する。単調または非線形関数が主に使われている。
これをchainerではchainer.functionsに用意されている。

import chainer.functions as F
z = F.sigmoid(u) # ロジスティックシグモイド関数
z = F.tanh(u) # 双曲線正接関数
z = F.relu(u) # 正規化線形関数

他にも様々な活性化関数が用意されている。

2.3 多層ネットワーク

図2.4(a)をchainerで表してみよう。
入力をx, 出力をyとすると

# まずは各層を定義する。
u2 = L.Linear(4, 3)
u3 = L.Linear(3, 2)
# 次に繋げる
x = [x1, x2, x3, x4]
z2 = relu(u2(x))
z3 = sigmoid(u3(z2))
y = z3

という感じになる。

2.4 出力層の設計と誤差関数

正解ラベルの型

chainerでは問題の種別によって、
正解ラベル(本書だと望ましい出力d)の型を整える必要があります。
回帰の場合、正解ラベルをnumpy.float32型
分類の場合、正解ラベルをnumpy.int32型
にする必要がある。変換方法はdという配列に対して

d = d.astype(numpy.float32) # 回帰
d = d.astype(numpy.int32) # 分類
誤差関数

誤差関数は活性化関数と同様にchainer.functionsに用意されていて、
yをネットワークの出力、dを望ましい出力にすると

loss = F.mean_squared_error(y, d) 
loss = F.softmax_cross_entropy(y, d)

と表すことができる。


次回は確率的勾配法です。
github.com

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)