Ver. 1.0, 2017-08-11
森下功啓
1
2
線形回帰では、式(1)を用いて変数を予測する。
𝑦 = 𝛽0 + 𝛽1 𝑥1 + 𝛽2 𝑥2 + ⋯ + 𝛽 𝑛 𝑥 𝑛 (1)
しかしながら、1次式だけで予測できるものは少ない。
sin関数すら予測できない。
そこで、ニューラルネットワークを用いて非線形な回帰問題に
対応する方法をこのスライドでは解説しよう。
対応ポイント
• 非線形活性化関数を用いることが肝
• 一次関数はいくら足しても一次関数
• 故に、活性化関数は非線形である必要がある
• ∴非線形活性化関数を持つ中間層が必要
• 中間層のユニット数と中間層数は、結果を見ながら調整
• 少ないと近似精度が悪い
• 多すぎると過学習を起こしやすい
3
サンプルプログラムのダウンロード
4
1
2
Download:
https://github.com/KatsuhiroMorishita/machine_leaning_samples
sin関数の近似
5
6
• 以降のスライドでは、下記のプログラムを使った解説を行います
• sin関数を学習するサンプルです
keras_sin.py
• sin関数を学習するプログラム
7
8
モデルの作成
教師データ作成
学習
結合係数の保存など
グラフの表示
9
入力層の次の層(中間層)
の活性化関数はsigmoid
この層(入力層)のユニット数は1個
学習係数は0.05
1つの教師データ当たりの
学習回数は2000
10個の教師データを使って
結合係数を更新する
次の層(中間層)の
ユニット数は15個
バイアス用のユニットは
有効(標準で有効)
誤差関数は二乗平均誤差
学習中に状況を表示するなら1
結合係数の更新回数 = epochs / batch_size
モデルを図にするとこんな感じ
10
中間層
(隠れ層)
出力層入力層
𝑥 𝑦
1
1
Unit 0
Unit 15
𝑤0,1
0
𝑤0,2
0
𝑤0,1
1
𝑤1,1
1
𝑤2,1
1
𝑤1,15
0
𝑤1,1
0
結合係数
Layer 0
Layer 1
Layer 2
出力層のユニットの活
性化関数は指定され
ていないので、linear
∴ ℎ 𝑧 = 𝑧
𝑦𝑗
1
= sigmoid 𝑧𝑗
1
, 𝑗 ≥1
中間層のユニット𝑗の出力
𝑦 = 𝑦1
2
= 𝑧1
2
学習回数と誤差
11
Ephch 120 Ephch 240 Ephch 360
Ephch 480 Ephch 600 Ephch 720
Ephch 840 Ephch 960 Ephch 1080
←学習が進むにつ
れ、誤差が小さくな
る様子が分かる
学習量が増えると
成績が上がるのは
人間と同じだ。
より一般的な
非線形回帰モデル
12
一般的な非線形回帰への対応
• 活性化関数にsigmoidを利用している場合、入力値xが
|x|>6であれば、その点での傾きがほぼ0
• 微分しても傾きが0であれば学習できない
• 従って、より広い範囲で使える活性化関数が必要である
• → LeakyReLUを使う
• 又は、入力するデータを次元ごとにN(0, 1)に変換する必要
がある( 概ね、|x|<6となる)
13
http://www.procrasist.com/entry/2017/01/12/200000
LeakyReLU
14
• 以降のスライドでは、下記のプログラムを使った解説を行います
• 一般的に拡張した非線形回帰用のサンプルです
regression_learning.csv
• 教師データ
15
特徴ベクトル
(説明変数)
正解
(目的変数)
16
regression_learning.csvで作成した散布図行列
重回帰分析では問題になるほどの多重共線性がみられる。
prediction_data.csv
• 未知データ
• 正解が不明なデータです
17
特徴ベクトル
(説明変数)
non_linear_regression.py
• 学習を実行するプログラム
• 読み込んだ教師データを自動的に学習データと検証デー
タに分けて、過学習の判定と未知データに対する予測精度
の評価ができる
18
19
教師データを読み込む関数
モデルの作成
学習データと検証データに分割
学習データと検証データと特徴ベクトルの次
元数(説明変数の数)を変数に格納
p. 1
20
学習
結合係数の保存など
学習データと検証データのlossの変化をグラフとして表示
検証データの正解と予測値と
で散布図を作成して表示
p. 2
21
入力層の次の層(中間層)の
活性化関数はLeakyReLU
この層(入力層)のユニット数はs-1個
(sはデータに合わせて自動で調整される)
学習係数は0.005
次の層(中間層)の
ユニット数は15個
バイアス用のユニットは
有効(標準で有効)
誤差関数は二乗平均誤差
モデルの構造
結合係数の更新回数 = epochs / batch_size
活性化関数は
linear, h(z)=z
活性化関数は
LeakyReLU
活性化関数は
LeakyReLU 22
• 丸をたくさん描くのは大変なので、層を箱で表す
モデルの構造
ユニット数s-1
ユニット数15
ユニット数10
ユニット数1
中間層
(隠れ層)
出力層
入力層
Layer 0 Layer 1
Layer 3
中間層
(隠れ層)
Layer 2
non_linear_regression.pyの実行で得られるグラフ
23
epochに対する学習データと検証
データのlossの変化
この例では、lossの乖離が見られず、
過学習は起こしていないことが分かる。
学習後に表示された、検証データ
の正解値と予測値の散布図
傾き1.0で直線に分布しているほど予
測精度が高いことを示す。
loss(学習データに対するloss)と
val_loss(検証データに対するloss)
が乖離していたら過学習
フラットになっているので、
学習は十分に収束している
prediction.py
• 正解の不明な未知データを予測する
24
25
2次元配列文字列に変換する関数
モデルと結合係数のロード
予測用のデータを読み込む
予測値を求め、保存
全データが特徴ベクトル(説明変
数)なので、スライス範囲は全範囲
prediction.pyを実行することで
prediction_result.csvを得る
26
prediction_result.csv
prediction_data.csv
未知データ 正解の予測値
27
28
非線形近似をニューラルネットワーク(NN)で実現するには
非線形な活性化関数を持つ中間層を追加するだけという、
なんとも単純なお話でした。
さて、これでNNを使った線形回帰の基本は終了です
次はNNを使って識別問題にトライしてみましょう

シリーズML-07 ニューラルネットワークによる非線形回帰