ニューラルネットワーク
勉強会
第2回
柳本 豪一
本日の予定
3層ニューラルネットワークでXOR問題を解きます。
• ニューラルネットワークの基礎を知る
• Chainerによるネットワークの実装を知る
本日の予定
• 3層ニューラルネットワークによるXOR問題を解き
ます。
• ニューラルネットワークの基礎を知る
• Chainerによるネットワークの実装を知る
簡単なニューラルネットワークを
Chainer上で実装できるようになる!
フィードフォワード
ニューラルネットワーク
複数のニューロンを層状に配置した構造
フィードフォワード
ニューラルネットワーク
複数のニューロンを層状に配置した構造
入力層
フィードフォワード
ニューラルネットワーク
複数のニューロンを層状に配置した構造
隠れ層
フィードフォワード
ニューラルネットワーク
複数のニューロンを層状に配置した構造
出力層
フィードフォワード
ニューラルネットワーク
複数のニューロンを層状に配置した構造
結合荷重
(可調整パラメータ)
バックプロパゲーション
フィードフォワードニューラルネットワークの出力を
用いて誤差を定義し、その誤差を用いて結合荷重を調
整する
y
1 2 3 k k+1 N-1 N
バックプロパゲーション
出力誤差:f(y, t)
y
1 2 3 k k+1 N-1 N
バックプロパゲーション
出力誤差:f(y, t)
y
1 2 3 k k+1 N-1 N
df(y, t)
dy
バックプロパゲーション
出力誤差:     活性化関数:f(y, t)
y
1 2 3 k k+1 N-1 N
df(y, t)
dy
g1
N (x1
N )
g2
N (x2
N )
g3
N (x3
N )
WN 1
WN = E
gk(xk)
出力誤差:     活性化関数:
バックプロパゲーション
f(y, t)
y
1 2 3 k k+1 N-1 N
df(y, t)
dy
g1
N (x1
N )
g2
N (x2
N )
g3
N (x3
N )
WN 1
WN = E
df(y, t)
dxN
df(y, t)
dWN 1
= yT
N 1
⇢
WT
N
✓
df(y, t)
dxF
⌦
dgN (xN )
dxN
◆
df(y, t)
dxFgk(xk)
gk(xk)出力誤差:     活性化関数:
バックプロパゲーション
f(y, t)
y
1 2 3 k k+1 N-1 N
df(y, t)
dy
g1
N (x1
N )
g2
N (x2
N )
g3
N (x3
N )
WN 1
WN = E
df(y, t)
dxN
df(y, t)
dWN 1
= yT
N 1
⇢
WT
N
✓
df(y, t)
dxF
⌦
dgN (xN )
dxN
◆
df(y, t)
dxF
一般的には誤差を逆向きに伝搬していると言われているが、
勾配を逆向きに伝搬しているとも言える!
バックプロパゲーション
一般的には誤差を逆向きに伝搬していると言われているが、
勾配を逆向きに伝搬しているとも言える!
バックプロパゲーション
なので、
Chainerでは勾配を意識している
一般的には誤差を逆向きに伝搬していると言われているが、
勾配を逆向きに伝搬しているとも言える!
バックプロパゲーション
なので、
Chainerでは勾配を意識している
のかも?
一般的には誤差を逆向きに伝搬していると言われているが、
勾配を逆向きに伝搬しているとも言える!
バックプロパゲーション
なので、
Chainerでは勾配を意識している
のかも?
あと、
2乗誤差で評価するなら誤差だけど、
クロスエントロピーだと誤差なのかな。。。
一般的には誤差を逆向きに伝搬していると言われているが、
勾配を逆向きに伝搬しているとも言える!
中間まとめ
ニューラルネットワークは
• ニューロン間の結合で構造を定義
結合荷重のみが可調整パラメータ
活性化関数に可調整パラメータなし
• 勾配を出力層から入力層へ伝搬
伝搬すべき勾配
活性化関数の微分
順伝搬時の結合荷重
を考慮すれば学習が可能
XOR問題
• 3層ニューラルネットワークでXOR回路を作る
入力1 入力2 出力
0 0 0
0 1 1
1 0 1
1 1 0
真理値表
XOR問題
• 3層ニューラルネットワークでXOR回路を作る
入力1 入力2 出力
0 0 0
0 1 1
1 0 1
1 1 0
真理値表
左の3層ニューラルネットワークで
XOR回路を実現する
中間まとめ(簡略版)
• ニューロン間の結合で構造を定義
結合荷重のみが可調整パラメータ
活性化関数に可調整パラメータなし
• 勾配を出力層から入力層へ伝搬
伝搬すべき勾配
活性化関数の微分
順伝搬時の結合荷重
中間まとめ(簡略版)
• ニューロン間の結合で構造を定義
結合荷重のみが可調整パラメータ
活性化関数に可調整パラメータなし
• 勾配を出力層から入力層へ伝搬
伝搬すべき勾配
活性化関数の微分
順伝搬時の結合荷重
中間まとめ(簡略版)
• ニューロン間の結合で構造を定義
結合荷重のみが可調整パラメータ
活性化関数に可調整パラメータなし
ニューラルネットワークの構造定義
+
可調整パラメータの切り分け
• 勾配を出力層から入力層へ伝搬
伝搬すべき勾配
活性化関数の微分
順伝搬時の結合荷重
勾配を意識した学習の定義
中間まとめ(簡略版)
• ニューロン間の結合で構造を定義
結合荷重のみが可調整パラメータ
活性化関数に可調整パラメータなし
ニューラルネットワークの構造定義
+
可調整パラメータの切り分け
• 勾配を出力層から入力層へ伝搬
伝搬すべき勾配
活性化関数の微分
順伝搬時の結合荷重
勾配を意識した学習の定義
FunctionSetの利用
勾配の初期化
Chainerを使うために
先頭で以下の文を必ず書いてください
import numpy as np
import chainer from cuda, Function, FunctionSet, 
gradient_check, Variable, optimizers, utils
import chainer.functions as F
ニューラルネットワークの定義
FunctionSetを使ってニューロン間の接続を定義
model = FunctionSet(
l1 = F.Linear(2, 2), #入力層-隠れ層間の結合
l2 = F.Linear(2, 1), #隠れ層-出力層間の結合
)
順伝搬
FunctionSetで定義した結合荷重とchainer.functions
で定義された活性化関数を用いて定義
h = F.sigmoid(model.l1(x))
y = F.sog,pod(model.l2(h))
損失
順伝搬の結果と教師信号を用いてchainer.functions
で定義された損失関数から計算
loss = F.mean_squared_error(y, t)
逆伝搬
optimizersで定義された最適化手法を用いて、lossを
最小化するように可調整パラメータを修正
#最適化手法とニューラルネットワークの設定
optimizer = optimizers.Adam()
optimizer.setup(model)
#パラメータ更新
optimizer.zero_grads()
optimizer.update()
Chainerによる実験手順
データ読み込み
前処理
学習
後処理
Chainerによる実験手順
データ読み込み
前処理
学習
後処理
Python
NumPy
Chainer
NumPy
+
Python
Chainerによる実験手順
Python list
NumPy numpy.ndarray
Chainer Variables
NumPy numpy.ndarray
+
Python list
データ読み込み
前処理
学習
後処理
Chainerによる実験手順
Chainerによる実験手順
Python list
NumPy numpy.ndarray
Chainer Variables
NumPy numpy.ndarray
+
Python list
データ読み込み
前処理
学習
後処理
Chainerによる実験手順
Chainerによる実験手順
Python list
NumPy numpy.ndarray
Chainer Variable
NumPy numpy.ndarray
+
Python list
データ読み込み
前処理
学習
後処理
Chainerによる実験手順
データをVariableに変換
Variableから値を取り出す
トレーニングデータ
入力データはリストで管理
Numpyを使うのでデータは行列をイメージ
train = [[0, 0], [0, 1], [1, 0], [1,1]]
label = [[0], [1], [1], [0]]
numpy.ndarrayへの変換
Chainerを使うためにnumpy.ndarrayに変換
ここでは、ランダムにデータを選ぶバッチ学習
Chainerではnp.float32を基本的に利用
#実装例
x = np.array(train, dtype=np.float32)
y = np.array(label, dtype=np.float32)
indexes = np.random.permutation(len(train))
for i in range(0, len(train), batchsize):
x_batch = np.asarray(x[indexes[i:i+batchsize]])
y_batch = np.asarray(y[indexes[i:i+batchsize]])
Variableへの変換
numpy.ndarrayからVariableに変換
Chainerが用意した関数はVariableのみを受付
np.ndarrayをラッピングしているイメージ
x = Variable(x_batch)
t = Variable(y_batch)
Variableからnumpy.ndarrayへの変換
Variable.dataでデータを取得
誤差やパープレキシティの計算で利用
XOR問題の実装
https://github.com/KDA-lab

ニューラルネットワーク勉強会2