パターン認識モデル初歩の初歩
with R.
2018/4/16
第2事業部 市岡 岳彦
© 2018 SG Corporation 2
◍ 機械学習といっても、結局のところ、入力に対するパターンをカテゴライズし
て、分類しているという以上のものではない。
◍ 一般的にそれらに対して、どのようなモデルが考えられているか。
◍ 事後確率
◍ 距離
◍ 関数値
◍ 決定木
◍ この4つのモデルを非常に簡略化したシナリオで説明する。
◍ 本来は多次元データ分析が主となるが、一次元データとする。
◍ サンプルプログラムにはRを用いた。
はじめに
© 2018 SG Corporation 3
◍ 4つのモデルで、すべて同じシナリオを用いる。
◍ 入力データは 1次元の小数点1桁までの数値。
◍ 総データ数:6500
◍ 各データはA,B,Cのいずれかのクラスに属する。
◍ A,B,Cはそれぞれ、以下のような正規分布とする。
シナリオ
クラス 出現回数 平均 標準偏差
A 3000 3 1
B 2000 12 1
C 1500 8 1
◍ 4つのモデルで、すべて同じシナリオを用いる。
◍ A,B,Cの分布
© 2018 SG Corporation 4
シナリオ
© 2018 SG Corporation 5
◍ では、やってみよう…
シナリオ
© 2018 SG Corporation 6
◍ データの生成
シナリオ
value <- round(rnorm(3000, 3, 1), 1)
class <- 1
dataA <- data.frame(value, class)
value <- round(rnorm(2000, 12, 1), 1)
class <- 2
dataB <- data.frame(value, class)
value <- round(rnorm(1500, 8, 1), 1)
class <- 3
dataC <- data.frame(value, class)
data <- rbind(dataA, dataB, dataC)
© 2018 SG Corporation 7
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の確率を算出しておく。
◍ ベイズの識別規則
◍ 事後確率がもっとも大きなクラスに観測データを分類する。
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
◍ 事後確率: P(Ci|x)
観測データxが与えられた下で、それがクラスCiに属する条件付き確率
事後確率
◍ データxとクラスCiの同時確率
𝑃(𝑥, 𝐶𝑖) = 𝑃 𝐶𝑖 𝑥 𝑝(𝑥) = 𝑝(𝑥|𝐶𝑖)𝑃(𝐶𝑖)
◍ 同時確率:P(x, Ci)
データxとクラスCiが同時に生起する確率
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
◍ 事後確率: P(Ci|x)
観測データxが与えられた下で、それがクラスCiに属する条件付き確率
© 2018 SG Corporation 8
事後確率
© 2018 SG Corporation 9
◍ ベイズの識別規則
◍ 事後確率の求め方
◍ データxが与えられた下で、それがクラスCiに属する確率
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
事後確率
© 2018 SG Corporation 10
◍ ベイズの識別規則
◍ 事後確率の求め方
◍ 観測データxが与えられた下で、それがクラスCiに属する確率
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
◍ 事前確率:P(Ci) を比: p(x|Ci) / p(x) で修正したもの。
◍ 比: p(x|Ci) / p(x) が1より大きければ、事後確率は事前確率より大きくなる。
◍ 比: p(x|Ci) / p(x) が1より小さければ、事後確率は事前確率より小さくなる。
事後確率
© 2018 SG Corporation 11
◍ 今回のシナリオの場合。
◍ 事前確率:P(A), P(B), P(C)
クラスA,B,Cの各々の出現回数/総データ数
◍ クラス条件付き確率(尤度): p(x|A), p(x|B), p(x|C)
同じ値のデータxのクラスA,B,Cでの各々の出現回数/同じ値のデータxの総数
◍ 周辺確率:p(x)
データxの出現回数/総データ数
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率
事後確率
© 2018 SG Corporation 12
◍ では、やってみよう…
事後確率
© 2018 SG Corporation 13
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
事後確率
pd <- prop.table(table(data[,2]))
pa <- pd["A"] * prop.table(table(dataA[,1]))
pb <- pd["B"] * prop.table(table(dataB[,1]))
pc <- pd["C"] * prop.table(table(dataC[,1]))
px <- prop.table(table(data[,1]))
pa <- pa / px[names(pa)]
pb <- pb / px[names(pb)]
pc <- pc / px[names(pc)]
© 2018 SG Corporation 14
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。
事後確率
© 2018 SG Corporation 15
◍ それっぽい、分布が得られた…
◍ 実際には
◍ 誤り率の大きな領域では判断を避ける。リジェクト。
◍ とかも必要。
事後確率
© 2018 SG Corporation 16
◍ あらかじめ分類が分かっているデータとの距離で、観測データがどのクラスに
分類されるかを決定する。
◍ 最近傍法(NN法)
◍ 観測データと分類済みデータとの類似度を距離で計算し、もっとも距離が近い
分類済みデータを持つクラスに分類する。
距離
?
© 2018 SG Corporation 17
◍ 今回のシナリオの場合。
◍ 観測データ:x
◍ 分類済みデータ:x1..3000
(A), x1..2000
(B), x1..1500
(C)
◍ 観測データから+-0.5以内の距離に、幾つ分類済みデータがあるかを数える。
◍ 離れている距離に従って、0.6^(距離*10)の重みをかける。
距離
© 2018 SG Corporation 18
◍ では、やってみよう…
距離
© 2018 SG Corporation 19
距離
dx <- 0.5
weight <- 0.6
knn <- function(x) {
d <- data[((x - dx) <= data$value) & (data$value <= (x +
dx)),]
dist <- round(abs(d$value - x), 1)
d <- table(data.frame(dist, d$class))
d <- floor(d * (weight ^ (10 * as.numeric(labels(d)$dist))))
return(d)
}
sum_knn <- function(x) {
colSums(knn(x))
}
© 2018 SG Corporation 20
距離
x <- seq(-0.5, 15.0, 0.1)
nn <- sapply(x, sum_knn)
© 2018 SG Corporation 21
◍ 観測データxから、近距離に存在するクラスA,B,Cの数。
距離
© 2018 SG Corporation 22
◍ それっぽい、分布が得られた…
◍ 実際には
◍ 同距離のクラスが同数の場合にはどうするか。
◍ 重み等のパラメータをどう決定するか。
◍ とかも必要。
距離
© 2018 SG Corporation 23
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の識別関数の係数を算出しておく。
◍ ニューラルネットワーク
◍ 単純な線形関数と非線形の活性化関数の組み合わせで、識別関数を構成する。
関数値
© 2018 SG Corporation 24
◍ 最終的なアウトプットのイメージ。
◍ 各クラスの確率分布がわかると都合がいい。
関数値
x
© 2018 SG Corporation 25
◍ ニューラルネットワーク
関数値
入
力
層
出
力
層
© 2018 SG Corporation 26
◍ これは何をやっているのか?
関数値
© 2018 SG Corporation 27
◍ 線形関数
◍ wx + b
関数値
x
1
w1x+b1
w2x+b2
© 2018 SG Corporation 28
◍ 線形関数だけでは何層積み重ねても、線形関数になるだけ…
関数値
x
© 2018 SG Corporation 29
◍ 線形関数の後に非線形関数を挟むことにする。
◍ relu : rectified linear unit
𝑓 𝑢 = max(𝑢, 0)
関数値
x
1
f(w1x+b1)
f( w2x+b2)
© 2018 SG Corporation 30
◍ relu : rectified linear unit
◍ これにより、複雑な関数が表現可能になる。
◍ 例えば…
関数値
z11 = f(0.2x + 1)
z12 = f(x)
z21 = f(z11 - 0.5z12 + 1)
z22 = f(0.5z11 + 0.5z12 - 2)
z = z21 + 3z22 - 1.5
© 2018 SG Corporation 31
◍ softmax
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率
◍ 最終結果を事後確率として解釈したい。
◍ 線形関数とreluの組み合わせだけでは、負の値や絶対値の大きな値が発生して
しまう。
◍ 関数の値域を0〜1の範囲に収める。
◍ 全クラスについての和を取ると、1になるように正規化する。
関数値
© 2018 SG Corporation 32
関数値
◍ softmax
◍ 出力層のk番目のユニットの出力値
◍ K : クラスの種類数
𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘 ≡
exp(𝑢 𝑘)
𝑗=1
𝐾
exp(𝑢𝑗)
◍ 事後確率がもっとも大きなクラスに観測データを分類する。
© 2018 SG Corporation 33
◍ ニューラルネットワーク
◍ とりあえず、わかった。
関数値
入
力
層
出
力
層
© 2018 SG Corporation 34
◍ では、線形関数の係数をどうやって決めるか。
◍ wx + b
関数値
x
1
w1x+b1
w2x+b2
© 2018 SG Corporation 35
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の識別関数の係数を算出しておく。
◍ 基本的なアイデア
◍ 適当な初期値の係数で実際に学習データを読み込ませて、出力値と正解値を比
較する。
◍ 出力値と正解値の誤差が少なくなる方向に徐々に係数を更新して、計算を繰り
返す。
◍ いわゆる、教師あり学習。
関数値
© 2018 SG Corporation 36
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
関数値
出
力
層
正
解
値
0.6
0.1
0.3
1
0
0
© 2018 SG Corporation 37
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
◍ 目標出力
◍ クラス数が3で正解値がクラス1の場合:d = [1 0 0]
関数値
出
力
層
正
解
値
0.6
0.1
0.3
1
0
0
© 2018 SG Corporation 38
関数値
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
◍ 尤度(n:学習データの番号、k:クラスの番号)
𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘
𝑝 d x =
𝑘=1
𝐾
𝑝 𝐶 𝑘|x 𝑑 𝑘
◍ N個の学習データについて
𝑛=1
𝑁
𝑝 d 𝑛 x 𝑛;w =
𝑛=1
𝑁
𝑘=1
𝐾
(𝑦 𝑘(x;w)) 𝑑 𝑛𝑘
© 2018 SG Corporation 39
◍ 尤度は何を表しているのか。
◍ N個の学習データについて
◍ 0.4 x 0.5 x 0.6 x…
◍ 0.99 x 0.98 x 0.95 x…
◍ 1 x 1 x 1 x…
◍ 尤度が大きいほど、より目標出力との違いがなくなる。
◍ 尤度が最大になるような方向を目標とする。
関数値
© 2018 SG Corporation 40
◍ 尤度のままでは、使いにくいので…
𝑛=1
𝑁
𝑘=1
𝐾
(𝑦 𝑘(x;w)) 𝑑 𝑛𝑘
◍ 対数をとって、符号を反転しておく。
◍ 交差エントロピー
𝐸 𝐰 = −
𝑛=1
𝑁
𝑘=1
𝐾
𝑑 𝑛𝑘log(𝑦 𝑘(x 𝑛; w))
◍ 交差エントロピーが最小になるような方向を目標とする。
関数値
© 2018 SG Corporation 41
◍ では、損失関数をどうやって最小値に近づけるか。
◍ 勾配降下法
◍ 単純に一次微分値を見て、交差エントロピーが小さくなる方向に係数を動かす。
∇𝐸 𝐰 =
𝜕𝐸 𝐰
𝜕𝐰
関数値
◍ 補足
◍ 合成関数の微分
𝑦 = 𝑓 𝑥 , 𝑧 = 𝑔 𝑦
𝑑𝑧
𝑑𝑥
=
𝑑𝑧
𝑑𝑦
𝑑𝑦
𝑑𝑥
𝑦1 = 𝑓1 𝑥 , … , 𝑦𝑛 = 𝑓𝑛 𝑥 , 𝑧 = 𝑔 𝑦1, … , 𝑦𝑛
𝜕𝑧
𝜕𝑥
=
𝑘=1
𝑛
𝜕𝑧
𝜕𝑦 𝑘
𝜕𝑦 𝑘
𝜕𝑥
© 2018 SG Corporation 42
関数値
◍ バックプロパゲーション
◍ 記号を分解しておく。
𝑢1 = 𝑤1 𝑥 + 𝑏1
𝑧1 = 𝑓(𝑢1)
© 2018 SG Corporation 43
関数値
x
1
f(w1x+b1)
f( w2x+b2)
© 2018 SG Corporation 44
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
© 2018 SG Corporation 45
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
◍ バックプロパゲーション
𝛿𝑗
(𝑙)
≡
𝜕𝐸 𝑛
𝜕𝑢𝑗
𝑙
=
𝑘
𝜕𝐸 𝑛
𝜕𝑢 𝑘
𝑙+1
𝜕𝑢 𝑘
𝑙+1
𝜕𝑢𝑗
𝑙
=
𝑘
𝛿 𝑘
𝑙+1
(𝑤 𝑘𝑗
(𝑙+1)
𝑓′(𝑢𝑗
(𝑙)
))
© 2018 SG Corporation 46
関数値
i
𝑢𝑗
(𝑙)
𝑢 𝑘−1
(𝑙+1)
𝑢 𝑘
(𝑙+1)
𝑢 𝑘+1
(𝑙+1)
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
© 2018 SG Corporation 47
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
◍ バックプロパゲーション
𝑧1 = 𝑓(𝑢1)
𝑢2 = 𝑤2 𝑧1 + 𝑏2
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
= 𝑧𝑖
(𝑙−1)
© 2018 SG Corporation 48
関数値
x
1
f(w1x+b1)
f( w2x+b2)
© 2018 SG Corporation 49
◍ バックプロパゲーション
◍ 一次微分の一般形
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
= 𝛿𝑗
(𝑙)
𝑧𝑖
(𝑙−1)
関数値
入
力
層
出
力
層
◍ バックプロパゲーション
◍ 出力層(softmax)
𝑦 𝑘 ≡
exp(𝑢 𝑘)
𝑗=1
𝐾
exp(𝑢𝑗)
𝛿𝑗
(𝐿)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝐿)
= −
𝑘
𝑑 𝑘
1
𝑦 𝑘
𝜕𝑦 𝑘
𝜕𝑢𝑗
(𝐿)
= −𝑑𝑗(1 − 𝑦𝑗) −
𝑘≠𝑗
𝑑 𝑘(−𝑦𝑗)
=
𝑘
𝑑 𝑘(𝑦𝑗 − 𝑑𝑗)
= 𝑦𝑗 − 𝑑𝑗
© 2018 SG Corporation 50
関数値
◍ 補足
◍ 指数関数の合成関数の微分
𝑦 =
exp(𝑥)
𝑛 + exp(𝑥)
𝑑𝑦
𝑑𝑥
=
exp(𝑥)
𝑛 + exp(𝑥)
−
exp(𝑥)
𝑛 + exp(𝑥)
2
𝑦 =
𝑚
𝑛 + exp(𝑥)
𝑑𝑦
𝑑𝑥
= −
𝑚 exp 𝑥
𝑛 + exp(𝑥) 2
© 2018 SG Corporation 51
関数値
© 2018 SG Corporation 52
◍ 以上をまとめると…
◍ アルゴリズム
◍ 順伝搬
𝐔 𝒍
= 𝐖(𝑙)
𝐙(𝑙−1)
+ 𝐛(𝑙)
𝟏 𝑁
T
𝐙 𝑙 = 𝑓(𝑙)(𝐔(𝑙))
◍ 逆伝搬
∆(𝑙)= 𝑓(𝑙)′(𝐔(𝑙))⨀(𝐖 𝑙+1 T∆(𝑙+1))
◍ 更新
𝐖(𝑙) ← 𝐖 𝑙 − 𝜖
1
𝑁
∆(𝑙) 𝐙 𝑙−1 T
𝐛(𝑙) ← 𝐛 𝑙 − 𝜖
1
𝑁
∆(𝑙) 𝟏 𝑁
関数値
© 2018 SG Corporation 53
◍ 今回のシナリオの場合
◍ ネットワーク: 3x3x3
◍ ミニバッチサイズ: 100
関数値
入
力
出
力
© 2018 SG Corporation 54
◍ では、やってみよう…
関数値
◍ 基本的な関数
© 2018 SG Corporation 55
関数値
relu <- function(x) ifelse(x >= 0, x, 0)
drelu <- function(x) ifelse(x >= 0, 1, 0)
dclass <- function(c, size) {
d <- rep(0, size)
d[c] <- 1
d
}
softmax <- function(y) {
y <- exp(y)
y <- y / colSums(y)
}
centropy <- function(s, d) {
-sum(d * log(s))
}
◍ ネットワークモデル(1/2)
© 2018 SG Corporation 56
関数値
network_model <- function(bat_size=100) {
z1 <- matrix(1, nrow=1, ncol=bat_size)
z2 <- matrix(0, nrow=3, ncol=bat_size)
z3 <- matrix(0, nrow=3, ncol=bat_size)
z4 <- matrix(0, nrow=3, ncol=bat_size)
z <- list(z1, z2, z3, z4)
b1 <- rep(1, bat_size)
b0 <- t(b1)
u1 <- matrix(0, nrow=3, ncol=bat_size)
u2 <- matrix(0, nrow=3, ncol=bat_size)
u3 <- matrix(0, nrow=3, ncol=bat_size)
u <- list(u1, u2, u3)
d <- matrix(rep(c(1,0,0), bat_size), nrow=3, ncol=bat_size)
…
◍ ネットワークモデル(2/2)
© 2018 SG Corporation 57
関数値
…
# coefficient.
w1 <- matrix(c(0.5, 0.5, 0.5), nrow=3, ncol=1)
w2 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3)
w3 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3)
w <- list(w1, w2, w3)
b <- list(rep(1,3), rep(1,3), rep(1,3))
# function.
f <- list(relu, relu, softmax)
df <- list(drelu, drelu)
delta1 <- matrix(1, nrow=3, ncol=bat_size)
delta2 <- matrix(1, nrow=3, ncol=bat_size)
delta3 <- matrix(1, nrow=3, ncol=bat_size)
delta <- list(delta1, delta2, delta3)
return(list(z=z, b0=b0, b1=b1, u=u, d=d, w=w, b=b, f=f, df=df, delta=delta))
}
◍ 学習(1/4)
© 2018 SG Corporation 58
関数値
id <- sample(1:6500)
data <- data.frame(id, data)
data <- data[order(data$id),]
data <- data.frame(value=data$value, class=data$class)
nm <- network_model()
eps <- sqrt(.Machine$double.eps) * 1000
◍ 学習(2/4)
© 2018 SG Corporation 59
関数値
# mini batch.
mini_batch <- function(data, bat_size=100) {
layer <- length(nm$u)
for (main_loop in 1:10000) {
for (n in 1:65) {
i <- (n - 1) * bat_size + 1
nm$z[[1]] <- t(data[i:(i + bat_size - 1), 1])
nm$d <- sapply(data[i:(i + bat_size - 1), 2], dclass, 3)
# forward.
for (i in 1:layer) {
nm$u[[i]] <- nm$w[[i]] %*% (nm$z)[[i]] + nm$b[[i]] %*% nm$b0
nm$z[[i+1]] <- nm$f[[i]](nm$u[[i]])
}
…
◍ 学習(3/4)
© 2018 SG Corporation 60
関数値
…
# backward.
nm$delta[[layer]] <- nm$z[[layer+1]] - nm$d
for (i in 1:(layer-1)) {
nm$delta[[i]] <- nm$df[[i]](nm$u[[i]]) * (nm$w[[i+1]] %*% nm$delta[[i+1]])
}
for (i in 1:layer) {
nm$w[[i]] <- nm$w[[i]] - eps * (nm$delta[[i]] %*% t(nm$z[[i]]) / bat_size)
nm$b[[i]] <- nm$b[[i]] - eps * (nm$delta[[i]] %*% nm$b1 / bat_size)
}
}
}
}
◍ 学習(4/4)
© 2018 SG Corporation 61
関数値
mini_batch(data)
© 2018 SG Corporation 62
◍ 学習済みニューラルネットワークの係数を使ったsoftmax。
関数値
© 2018 SG Corporation 63
◍ それっぽい、関数が得られた…
◍ 実際には
◍ 係数の発散を抑える。
◍ 局所解に陥らないようにする。
◍ とかも必要。
関数値
© 2018 SG Corporation 64
◍ 1つの特徴軸の1つの分割点のみで、分割することを繰り返す。
◍ どの分割点で分割するかは、不純度と呼ばれる評価関数で決定する。
◍ 分割された領域に、1クラスしか存在しないと判定した時点で、分割を終了す
る。
決定木
x < s0
x < s1
A C
B
yes no
yes no
◍ ジニ係数
◍ ノードtにおける誤り率
ℐ(𝑡) ≡
𝑖=𝑗
𝐾
𝑖≠𝑗
𝑃 𝐶𝑖|𝑡 𝑃(𝐶𝑗|𝑡)
=
𝑖=1
𝐾
𝑃(𝐶𝑖|𝑡)
2
−
𝑖=1
𝐾
𝑃2
(𝐶𝑖|𝑡)
= 1 −
𝑖=1
𝐾
𝑃2(𝐶𝑖|𝑡)
=
𝑖=1
𝐾
𝑃(𝐶𝑖|𝑡) 1 − 𝑃(𝐶𝑖|𝑡)
© 2018 SG Corporation 65
決定木
◍ ジニ係数
◍ すべてのクラスが等しく分配されていれば、1に近づく。
◍ 1種類のクラスのみが分配されていれば、0になる。
© 2018 SG Corporation 66
決定木
◍ 不純度の減り方がもっとも大きくなる点sで分割する。
◍ ノードtの不純度から分割後の不純度を引く。
∆ℐ 𝑠, 𝑡 = ℐ 𝑡 − 𝑝 𝐿ℐ 𝑡 𝐿 + 𝑝 𝑅ℐ 𝑡 𝑅
𝑝 𝐿 =
𝑝(𝑡 𝐿)
𝑝(𝑡)
𝑝 𝑅 =
𝑝(𝑡 𝑅)
𝑝(𝑡)
© 2018 SG Corporation 67
決定木
© 2018 SG Corporation 68
◍ 今回のケース
◍ 成分は1次元のみ。
◍ クラスは3種類。
決定木
© 2018 SG Corporation 69
◍ では、やってみよう…
決定木
◍ 基本的な関数
© 2018 SG Corporation 70
決定木
gini <- function(t) {
p <- table(t[,2])
p <- p / length(t[,2])
sum(p * (1 - p))
}
sgini <- function(s, t) {
tl <- t[t$value < s,]
pl <- gini(tl)
tr <- t[t$value >= s,]
pr <- gini(tr)
pl * length(tl) / length(t) + pr * length(tr) / length(t)
}
◍ 実行
© 2018 SG Corporation 71
決定木
px <- gini(data)
x <- seq(-1.0, 15.0, 0.1)
g0 <- px - sapply(x, sgini, data)
© 2018 SG Corporation 72
◍ 不純度の減り方 1つ目 : 10.2
決定木
© 2018 SG Corporation 73
◍ 不純度の減り方 2つ目(左) : 5.8
決定木
© 2018 SG Corporation 74
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。
事後確率(再掲)
© 2018 SG Corporation 75
◍ それっぽい、分割点が得られた…
◍ 実際には
◍ いつ分割をやめるかの判定。
◍ 複雑になりすぎた枝を刈り取る。
◍ とかも必要。
決定木
© 2018 SG Corporation 76
◍ 事後確率
◍ 学習データから事前確率、周辺確率、尤度から事後確率を算出する。
◍ 事後確率がもっとも高いクラスに分類する。
◍ 距離
◍ 学習データと入力データの距離を算出する。
◍ 学習データとの距離がもっとも近いクラスに分類する。
◍ 関数値
◍ 学習データからの関数の係数を決定する。
◍ 入力データに関数を適用し、出力値により、クラスを分類する。
◍ 決定木
◍ 学習データから、分割点を決定し、決定木を作成する。
◍ 入力データに決定木を適用し、クラスを分類する。
まとめ
© 2018 SG Corporation 77
◍ はじめてのパターン認識
◍ 平井 有三(著)
◍ 森北出版
◍ 深層学習(機械学習プロフェッショナルシリーズ)
◍ 岡谷貴之(著)
◍ 講談社サイエンティフィク
◍ アート・オブ・Rプログラミング
◍ Norman Matloff(著)、大橋真也(監訳)、木下哲也(訳)
◍ オライリー・ジャパン
参考文献
© 2018 SG Corporation 78
顧客と社員に信頼されるエス・ジー

パターン認識モデル初歩の初歩

  • 1.
  • 2.
    © 2018 SGCorporation 2 ◍ 機械学習といっても、結局のところ、入力に対するパターンをカテゴライズし て、分類しているという以上のものではない。 ◍ 一般的にそれらに対して、どのようなモデルが考えられているか。 ◍ 事後確率 ◍ 距離 ◍ 関数値 ◍ 決定木 ◍ この4つのモデルを非常に簡略化したシナリオで説明する。 ◍ 本来は多次元データ分析が主となるが、一次元データとする。 ◍ サンプルプログラムにはRを用いた。 はじめに
  • 3.
    © 2018 SGCorporation 3 ◍ 4つのモデルで、すべて同じシナリオを用いる。 ◍ 入力データは 1次元の小数点1桁までの数値。 ◍ 総データ数:6500 ◍ 各データはA,B,Cのいずれかのクラスに属する。 ◍ A,B,Cはそれぞれ、以下のような正規分布とする。 シナリオ クラス 出現回数 平均 標準偏差 A 3000 3 1 B 2000 12 1 C 1500 8 1
  • 4.
  • 5.
    © 2018 SGCorporation 5 ◍ では、やってみよう… シナリオ
  • 6.
    © 2018 SGCorporation 6 ◍ データの生成 シナリオ value <- round(rnorm(3000, 3, 1), 1) class <- 1 dataA <- data.frame(value, class) value <- round(rnorm(2000, 12, 1), 1) class <- 2 dataB <- data.frame(value, class) value <- round(rnorm(1500, 8, 1), 1) class <- 3 dataC <- data.frame(value, class) data <- rbind(dataA, dataB, dataC)
  • 7.
    © 2018 SGCorporation 7 ◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか の確率を算出しておく。 ◍ ベイズの識別規則 ◍ 事後確率がもっとも大きなクラスに観測データを分類する。 ◍ 事前確率:P(Ci) クラスCiの生起確率 ◍ クラス条件付き確率(尤度): p(x|Ci) クラスが与えられた下でのデータxの確率分布 ◍ 周辺確率:p(x) データxの生起確率 ◍ 事後確率: P(Ci|x) 観測データxが与えられた下で、それがクラスCiに属する条件付き確率 事後確率
  • 8.
    ◍ データxとクラスCiの同時確率 𝑃(𝑥, 𝐶𝑖)= 𝑃 𝐶𝑖 𝑥 𝑝(𝑥) = 𝑝(𝑥|𝐶𝑖)𝑃(𝐶𝑖) ◍ 同時確率:P(x, Ci) データxとクラスCiが同時に生起する確率 ◍ 事前確率:P(Ci) クラスCiの生起確率 ◍ クラス条件付き確率(尤度): p(x|Ci) クラスが与えられた下でのデータxの確率分布 ◍ 周辺確率:p(x) データxの生起確率 ◍ 事後確率: P(Ci|x) 観測データxが与えられた下で、それがクラスCiに属する条件付き確率 © 2018 SG Corporation 8 事後確率
  • 9.
    © 2018 SGCorporation 9 ◍ ベイズの識別規則 ◍ 事後確率の求め方 ◍ データxが与えられた下で、それがクラスCiに属する確率 𝑃 𝐶𝑖 𝑥 = 𝑝(𝑥|𝐶𝑖) 𝑝(𝑥) × 𝑃(𝐶𝑖) ◍ 事前確率:P(Ci) クラスCiの生起確率 ◍ クラス条件付き確率(尤度): p(x|Ci) クラスが与えられた下でのデータxの確率分布 ◍ 周辺確率:p(x) データxの生起確率 事後確率
  • 10.
    © 2018 SGCorporation 10 ◍ ベイズの識別規則 ◍ 事後確率の求め方 ◍ 観測データxが与えられた下で、それがクラスCiに属する確率 𝑃 𝐶𝑖 𝑥 = 𝑝(𝑥|𝐶𝑖) 𝑝(𝑥) × 𝑃(𝐶𝑖) ◍ 事前確率:P(Ci) を比: p(x|Ci) / p(x) で修正したもの。 ◍ 比: p(x|Ci) / p(x) が1より大きければ、事後確率は事前確率より大きくなる。 ◍ 比: p(x|Ci) / p(x) が1より小さければ、事後確率は事前確率より小さくなる。 事後確率
  • 11.
    © 2018 SGCorporation 11 ◍ 今回のシナリオの場合。 ◍ 事前確率:P(A), P(B), P(C) クラスA,B,Cの各々の出現回数/総データ数 ◍ クラス条件付き確率(尤度): p(x|A), p(x|B), p(x|C) 同じ値のデータxのクラスA,B,Cでの各々の出現回数/同じ値のデータxの総数 ◍ 周辺確率:p(x) データxの出現回数/総データ数 ◍ 事後確率: P(A|x), P(B|x), P(C|x) 観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率 事後確率
  • 12.
    © 2018 SGCorporation 12 ◍ では、やってみよう… 事後確率
  • 13.
    © 2018 SGCorporation 13 𝑃 𝐶𝑖 𝑥 = 𝑝(𝑥|𝐶𝑖) 𝑝(𝑥) × 𝑃(𝐶𝑖) 事後確率 pd <- prop.table(table(data[,2])) pa <- pd["A"] * prop.table(table(dataA[,1])) pb <- pd["B"] * prop.table(table(dataB[,1])) pc <- pd["C"] * prop.table(table(dataC[,1])) px <- prop.table(table(data[,1])) pa <- pa / px[names(pa)] pb <- pb / px[names(pb)] pc <- pc / px[names(pc)]
  • 14.
    © 2018 SGCorporation 14 ◍ 事後確率: P(A|x), P(B|x), P(C|x) 観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。 事後確率
  • 15.
    © 2018 SGCorporation 15 ◍ それっぽい、分布が得られた… ◍ 実際には ◍ 誤り率の大きな領域では判断を避ける。リジェクト。 ◍ とかも必要。 事後確率
  • 16.
    © 2018 SGCorporation 16 ◍ あらかじめ分類が分かっているデータとの距離で、観測データがどのクラスに 分類されるかを決定する。 ◍ 最近傍法(NN法) ◍ 観測データと分類済みデータとの類似度を距離で計算し、もっとも距離が近い 分類済みデータを持つクラスに分類する。 距離 ?
  • 17.
    © 2018 SGCorporation 17 ◍ 今回のシナリオの場合。 ◍ 観測データ:x ◍ 分類済みデータ:x1..3000 (A), x1..2000 (B), x1..1500 (C) ◍ 観測データから+-0.5以内の距離に、幾つ分類済みデータがあるかを数える。 ◍ 離れている距離に従って、0.6^(距離*10)の重みをかける。 距離
  • 18.
    © 2018 SGCorporation 18 ◍ では、やってみよう… 距離
  • 19.
    © 2018 SGCorporation 19 距離 dx <- 0.5 weight <- 0.6 knn <- function(x) { d <- data[((x - dx) <= data$value) & (data$value <= (x + dx)),] dist <- round(abs(d$value - x), 1) d <- table(data.frame(dist, d$class)) d <- floor(d * (weight ^ (10 * as.numeric(labels(d)$dist)))) return(d) } sum_knn <- function(x) { colSums(knn(x)) }
  • 20.
    © 2018 SGCorporation 20 距離 x <- seq(-0.5, 15.0, 0.1) nn <- sapply(x, sum_knn)
  • 21.
    © 2018 SGCorporation 21 ◍ 観測データxから、近距離に存在するクラスA,B,Cの数。 距離
  • 22.
    © 2018 SGCorporation 22 ◍ それっぽい、分布が得られた… ◍ 実際には ◍ 同距離のクラスが同数の場合にはどうするか。 ◍ 重み等のパラメータをどう決定するか。 ◍ とかも必要。 距離
  • 23.
    © 2018 SGCorporation 23 ◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか の識別関数の係数を算出しておく。 ◍ ニューラルネットワーク ◍ 単純な線形関数と非線形の活性化関数の組み合わせで、識別関数を構成する。 関数値
  • 24.
    © 2018 SGCorporation 24 ◍ 最終的なアウトプットのイメージ。 ◍ 各クラスの確率分布がわかると都合がいい。 関数値 x
  • 25.
    © 2018 SGCorporation 25 ◍ ニューラルネットワーク 関数値 入 力 層 出 力 層
  • 26.
    © 2018 SGCorporation 26 ◍ これは何をやっているのか? 関数値
  • 27.
    © 2018 SGCorporation 27 ◍ 線形関数 ◍ wx + b 関数値 x 1 w1x+b1 w2x+b2
  • 28.
    © 2018 SGCorporation 28 ◍ 線形関数だけでは何層積み重ねても、線形関数になるだけ… 関数値 x
  • 29.
    © 2018 SGCorporation 29 ◍ 線形関数の後に非線形関数を挟むことにする。 ◍ relu : rectified linear unit 𝑓 𝑢 = max(𝑢, 0) 関数値 x 1 f(w1x+b1) f( w2x+b2)
  • 30.
    © 2018 SGCorporation 30 ◍ relu : rectified linear unit ◍ これにより、複雑な関数が表現可能になる。 ◍ 例えば… 関数値 z11 = f(0.2x + 1) z12 = f(x) z21 = f(z11 - 0.5z12 + 1) z22 = f(0.5z11 + 0.5z12 - 2) z = z21 + 3z22 - 1.5
  • 31.
    © 2018 SGCorporation 31 ◍ softmax ◍ 事後確率: P(A|x), P(B|x), P(C|x) 観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率 ◍ 最終結果を事後確率として解釈したい。 ◍ 線形関数とreluの組み合わせだけでは、負の値や絶対値の大きな値が発生して しまう。 ◍ 関数の値域を0〜1の範囲に収める。 ◍ 全クラスについての和を取ると、1になるように正規化する。 関数値
  • 32.
    © 2018 SGCorporation 32 関数値 ◍ softmax ◍ 出力層のk番目のユニットの出力値 ◍ K : クラスの種類数 𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘 ≡ exp(𝑢 𝑘) 𝑗=1 𝐾 exp(𝑢𝑗) ◍ 事後確率がもっとも大きなクラスに観測データを分類する。
  • 33.
    © 2018 SGCorporation 33 ◍ ニューラルネットワーク ◍ とりあえず、わかった。 関数値 入 力 層 出 力 層
  • 34.
    © 2018 SGCorporation 34 ◍ では、線形関数の係数をどうやって決めるか。 ◍ wx + b 関数値 x 1 w1x+b1 w2x+b2
  • 35.
    © 2018 SGCorporation 35 ◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか の識別関数の係数を算出しておく。 ◍ 基本的なアイデア ◍ 適当な初期値の係数で実際に学習データを読み込ませて、出力値と正解値を比 較する。 ◍ 出力値と正解値の誤差が少なくなる方向に徐々に係数を更新して、計算を繰り 返す。 ◍ いわゆる、教師あり学習。 関数値
  • 36.
    © 2018 SGCorporation 36 ◍ 損失関数(誤差関数) ◍ 出力値と正解値の近さの尺度 関数値 出 力 層 正 解 値 0.6 0.1 0.3 1 0 0
  • 37.
    © 2018 SGCorporation 37 ◍ 損失関数(誤差関数) ◍ 出力値と正解値の近さの尺度 ◍ 目標出力 ◍ クラス数が3で正解値がクラス1の場合:d = [1 0 0] 関数値 出 力 層 正 解 値 0.6 0.1 0.3 1 0 0
  • 38.
    © 2018 SGCorporation 38 関数値 ◍ 損失関数(誤差関数) ◍ 出力値と正解値の近さの尺度 ◍ 尤度(n:学習データの番号、k:クラスの番号) 𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘 𝑝 d x = 𝑘=1 𝐾 𝑝 𝐶 𝑘|x 𝑑 𝑘 ◍ N個の学習データについて 𝑛=1 𝑁 𝑝 d 𝑛 x 𝑛;w = 𝑛=1 𝑁 𝑘=1 𝐾 (𝑦 𝑘(x;w)) 𝑑 𝑛𝑘
  • 39.
    © 2018 SGCorporation 39 ◍ 尤度は何を表しているのか。 ◍ N個の学習データについて ◍ 0.4 x 0.5 x 0.6 x… ◍ 0.99 x 0.98 x 0.95 x… ◍ 1 x 1 x 1 x… ◍ 尤度が大きいほど、より目標出力との違いがなくなる。 ◍ 尤度が最大になるような方向を目標とする。 関数値
  • 40.
    © 2018 SGCorporation 40 ◍ 尤度のままでは、使いにくいので… 𝑛=1 𝑁 𝑘=1 𝐾 (𝑦 𝑘(x;w)) 𝑑 𝑛𝑘 ◍ 対数をとって、符号を反転しておく。 ◍ 交差エントロピー 𝐸 𝐰 = − 𝑛=1 𝑁 𝑘=1 𝐾 𝑑 𝑛𝑘log(𝑦 𝑘(x 𝑛; w)) ◍ 交差エントロピーが最小になるような方向を目標とする。 関数値
  • 41.
    © 2018 SGCorporation 41 ◍ では、損失関数をどうやって最小値に近づけるか。 ◍ 勾配降下法 ◍ 単純に一次微分値を見て、交差エントロピーが小さくなる方向に係数を動かす。 ∇𝐸 𝐰 = 𝜕𝐸 𝐰 𝜕𝐰 関数値
  • 42.
    ◍ 補足 ◍ 合成関数の微分 𝑦= 𝑓 𝑥 , 𝑧 = 𝑔 𝑦 𝑑𝑧 𝑑𝑥 = 𝑑𝑧 𝑑𝑦 𝑑𝑦 𝑑𝑥 𝑦1 = 𝑓1 𝑥 , … , 𝑦𝑛 = 𝑓𝑛 𝑥 , 𝑧 = 𝑔 𝑦1, … , 𝑦𝑛 𝜕𝑧 𝜕𝑥 = 𝑘=1 𝑛 𝜕𝑧 𝜕𝑦 𝑘 𝜕𝑦 𝑘 𝜕𝑥 © 2018 SG Corporation 42 関数値
  • 43.
    ◍ バックプロパゲーション ◍ 記号を分解しておく。 𝑢1= 𝑤1 𝑥 + 𝑏1 𝑧1 = 𝑓(𝑢1) © 2018 SG Corporation 43 関数値 x 1 f(w1x+b1) f( w2x+b2)
  • 44.
    © 2018 SGCorporation 44 ◍ バックプロパゲーション 𝜕𝐸 𝑛 𝜕𝑤𝑗𝑖 (𝑙) = 𝜕𝐸 𝑛 𝜕𝑢𝑗 (𝑙) 𝜕𝑢𝑗 (𝑙) 𝜕𝑤𝑗𝑖 (𝑙) 関数値 i 𝑢𝑗 (𝑙) k 𝑙 − 1 𝑙 𝑙 + 1 𝑤𝑗𝑖 (𝑙)
  • 45.
    © 2018 SGCorporation 45 ◍ バックプロパゲーション 𝜕𝐸 𝑛 𝜕𝑤𝑗𝑖 (𝑙) = 𝜕𝐸 𝑛 𝜕𝑢𝑗 (𝑙) 𝜕𝑢𝑗 (𝑙) 𝜕𝑤𝑗𝑖 (𝑙) 関数値 i 𝑢𝑗 (𝑙) k 𝑙 − 1 𝑙 𝑙 + 1 𝑤𝑗𝑖 (𝑙)
  • 46.
    ◍ バックプロパゲーション 𝛿𝑗 (𝑙) ≡ 𝜕𝐸 𝑛 𝜕𝑢𝑗 𝑙 = 𝑘 𝜕𝐸𝑛 𝜕𝑢 𝑘 𝑙+1 𝜕𝑢 𝑘 𝑙+1 𝜕𝑢𝑗 𝑙 = 𝑘 𝛿 𝑘 𝑙+1 (𝑤 𝑘𝑗 (𝑙+1) 𝑓′(𝑢𝑗 (𝑙) )) © 2018 SG Corporation 46 関数値 i 𝑢𝑗 (𝑙) 𝑢 𝑘−1 (𝑙+1) 𝑢 𝑘 (𝑙+1) 𝑢 𝑘+1 (𝑙+1) 𝑙 − 1 𝑙 𝑙 + 1 𝑤𝑗𝑖 (𝑙)
  • 47.
    © 2018 SGCorporation 47 ◍ バックプロパゲーション 𝜕𝐸 𝑛 𝜕𝑤𝑗𝑖 (𝑙) = 𝜕𝐸 𝑛 𝜕𝑢𝑗 (𝑙) 𝜕𝑢𝑗 (𝑙) 𝜕𝑤𝑗𝑖 (𝑙) 関数値 i 𝑢𝑗 (𝑙) k 𝑙 − 1 𝑙 𝑙 + 1 𝑤𝑗𝑖 (𝑙)
  • 48.
    ◍ バックプロパゲーション 𝑧1 =𝑓(𝑢1) 𝑢2 = 𝑤2 𝑧1 + 𝑏2 𝜕𝑢𝑗 (𝑙) 𝜕𝑤𝑗𝑖 (𝑙) = 𝑧𝑖 (𝑙−1) © 2018 SG Corporation 48 関数値 x 1 f(w1x+b1) f( w2x+b2)
  • 49.
    © 2018 SGCorporation 49 ◍ バックプロパゲーション ◍ 一次微分の一般形 𝜕𝐸 𝑛 𝜕𝑤𝑗𝑖 (𝑙) = 𝛿𝑗 (𝑙) 𝑧𝑖 (𝑙−1) 関数値 入 力 層 出 力 層
  • 50.
    ◍ バックプロパゲーション ◍ 出力層(softmax) 𝑦𝑘 ≡ exp(𝑢 𝑘) 𝑗=1 𝐾 exp(𝑢𝑗) 𝛿𝑗 (𝐿) = 𝜕𝐸 𝑛 𝜕𝑢𝑗 (𝐿) = − 𝑘 𝑑 𝑘 1 𝑦 𝑘 𝜕𝑦 𝑘 𝜕𝑢𝑗 (𝐿) = −𝑑𝑗(1 − 𝑦𝑗) − 𝑘≠𝑗 𝑑 𝑘(−𝑦𝑗) = 𝑘 𝑑 𝑘(𝑦𝑗 − 𝑑𝑗) = 𝑦𝑗 − 𝑑𝑗 © 2018 SG Corporation 50 関数値
  • 51.
    ◍ 補足 ◍ 指数関数の合成関数の微分 𝑦= exp(𝑥) 𝑛 + exp(𝑥) 𝑑𝑦 𝑑𝑥 = exp(𝑥) 𝑛 + exp(𝑥) − exp(𝑥) 𝑛 + exp(𝑥) 2 𝑦 = 𝑚 𝑛 + exp(𝑥) 𝑑𝑦 𝑑𝑥 = − 𝑚 exp 𝑥 𝑛 + exp(𝑥) 2 © 2018 SG Corporation 51 関数値
  • 52.
    © 2018 SGCorporation 52 ◍ 以上をまとめると… ◍ アルゴリズム ◍ 順伝搬 𝐔 𝒍 = 𝐖(𝑙) 𝐙(𝑙−1) + 𝐛(𝑙) 𝟏 𝑁 T 𝐙 𝑙 = 𝑓(𝑙)(𝐔(𝑙)) ◍ 逆伝搬 ∆(𝑙)= 𝑓(𝑙)′(𝐔(𝑙))⨀(𝐖 𝑙+1 T∆(𝑙+1)) ◍ 更新 𝐖(𝑙) ← 𝐖 𝑙 − 𝜖 1 𝑁 ∆(𝑙) 𝐙 𝑙−1 T 𝐛(𝑙) ← 𝐛 𝑙 − 𝜖 1 𝑁 ∆(𝑙) 𝟏 𝑁 関数値
  • 53.
    © 2018 SGCorporation 53 ◍ 今回のシナリオの場合 ◍ ネットワーク: 3x3x3 ◍ ミニバッチサイズ: 100 関数値 入 力 出 力
  • 54.
    © 2018 SGCorporation 54 ◍ では、やってみよう… 関数値
  • 55.
    ◍ 基本的な関数 © 2018SG Corporation 55 関数値 relu <- function(x) ifelse(x >= 0, x, 0) drelu <- function(x) ifelse(x >= 0, 1, 0) dclass <- function(c, size) { d <- rep(0, size) d[c] <- 1 d } softmax <- function(y) { y <- exp(y) y <- y / colSums(y) } centropy <- function(s, d) { -sum(d * log(s)) }
  • 56.
    ◍ ネットワークモデル(1/2) © 2018SG Corporation 56 関数値 network_model <- function(bat_size=100) { z1 <- matrix(1, nrow=1, ncol=bat_size) z2 <- matrix(0, nrow=3, ncol=bat_size) z3 <- matrix(0, nrow=3, ncol=bat_size) z4 <- matrix(0, nrow=3, ncol=bat_size) z <- list(z1, z2, z3, z4) b1 <- rep(1, bat_size) b0 <- t(b1) u1 <- matrix(0, nrow=3, ncol=bat_size) u2 <- matrix(0, nrow=3, ncol=bat_size) u3 <- matrix(0, nrow=3, ncol=bat_size) u <- list(u1, u2, u3) d <- matrix(rep(c(1,0,0), bat_size), nrow=3, ncol=bat_size) …
  • 57.
    ◍ ネットワークモデル(2/2) © 2018SG Corporation 57 関数値 … # coefficient. w1 <- matrix(c(0.5, 0.5, 0.5), nrow=3, ncol=1) w2 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3) w3 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3) w <- list(w1, w2, w3) b <- list(rep(1,3), rep(1,3), rep(1,3)) # function. f <- list(relu, relu, softmax) df <- list(drelu, drelu) delta1 <- matrix(1, nrow=3, ncol=bat_size) delta2 <- matrix(1, nrow=3, ncol=bat_size) delta3 <- matrix(1, nrow=3, ncol=bat_size) delta <- list(delta1, delta2, delta3) return(list(z=z, b0=b0, b1=b1, u=u, d=d, w=w, b=b, f=f, df=df, delta=delta)) }
  • 58.
    ◍ 学習(1/4) © 2018SG Corporation 58 関数値 id <- sample(1:6500) data <- data.frame(id, data) data <- data[order(data$id),] data <- data.frame(value=data$value, class=data$class) nm <- network_model() eps <- sqrt(.Machine$double.eps) * 1000
  • 59.
    ◍ 学習(2/4) © 2018SG Corporation 59 関数値 # mini batch. mini_batch <- function(data, bat_size=100) { layer <- length(nm$u) for (main_loop in 1:10000) { for (n in 1:65) { i <- (n - 1) * bat_size + 1 nm$z[[1]] <- t(data[i:(i + bat_size - 1), 1]) nm$d <- sapply(data[i:(i + bat_size - 1), 2], dclass, 3) # forward. for (i in 1:layer) { nm$u[[i]] <- nm$w[[i]] %*% (nm$z)[[i]] + nm$b[[i]] %*% nm$b0 nm$z[[i+1]] <- nm$f[[i]](nm$u[[i]]) } …
  • 60.
    ◍ 学習(3/4) © 2018SG Corporation 60 関数値 … # backward. nm$delta[[layer]] <- nm$z[[layer+1]] - nm$d for (i in 1:(layer-1)) { nm$delta[[i]] <- nm$df[[i]](nm$u[[i]]) * (nm$w[[i+1]] %*% nm$delta[[i+1]]) } for (i in 1:layer) { nm$w[[i]] <- nm$w[[i]] - eps * (nm$delta[[i]] %*% t(nm$z[[i]]) / bat_size) nm$b[[i]] <- nm$b[[i]] - eps * (nm$delta[[i]] %*% nm$b1 / bat_size) } } } }
  • 61.
    ◍ 学習(4/4) © 2018SG Corporation 61 関数値 mini_batch(data)
  • 62.
    © 2018 SGCorporation 62 ◍ 学習済みニューラルネットワークの係数を使ったsoftmax。 関数値
  • 63.
    © 2018 SGCorporation 63 ◍ それっぽい、関数が得られた… ◍ 実際には ◍ 係数の発散を抑える。 ◍ 局所解に陥らないようにする。 ◍ とかも必要。 関数値
  • 64.
    © 2018 SGCorporation 64 ◍ 1つの特徴軸の1つの分割点のみで、分割することを繰り返す。 ◍ どの分割点で分割するかは、不純度と呼ばれる評価関数で決定する。 ◍ 分割された領域に、1クラスしか存在しないと判定した時点で、分割を終了す る。 決定木 x < s0 x < s1 A C B yes no yes no
  • 65.
    ◍ ジニ係数 ◍ ノードtにおける誤り率 ℐ(𝑡)≡ 𝑖=𝑗 𝐾 𝑖≠𝑗 𝑃 𝐶𝑖|𝑡 𝑃(𝐶𝑗|𝑡) = 𝑖=1 𝐾 𝑃(𝐶𝑖|𝑡) 2 − 𝑖=1 𝐾 𝑃2 (𝐶𝑖|𝑡) = 1 − 𝑖=1 𝐾 𝑃2(𝐶𝑖|𝑡) = 𝑖=1 𝐾 𝑃(𝐶𝑖|𝑡) 1 − 𝑃(𝐶𝑖|𝑡) © 2018 SG Corporation 65 決定木
  • 66.
    ◍ ジニ係数 ◍ すべてのクラスが等しく分配されていれば、1に近づく。 ◍1種類のクラスのみが分配されていれば、0になる。 © 2018 SG Corporation 66 決定木
  • 67.
    ◍ 不純度の減り方がもっとも大きくなる点sで分割する。 ◍ ノードtの不純度から分割後の不純度を引く。 ∆ℐ𝑠, 𝑡 = ℐ 𝑡 − 𝑝 𝐿ℐ 𝑡 𝐿 + 𝑝 𝑅ℐ 𝑡 𝑅 𝑝 𝐿 = 𝑝(𝑡 𝐿) 𝑝(𝑡) 𝑝 𝑅 = 𝑝(𝑡 𝑅) 𝑝(𝑡) © 2018 SG Corporation 67 決定木
  • 68.
    © 2018 SGCorporation 68 ◍ 今回のケース ◍ 成分は1次元のみ。 ◍ クラスは3種類。 決定木
  • 69.
    © 2018 SGCorporation 69 ◍ では、やってみよう… 決定木
  • 70.
    ◍ 基本的な関数 © 2018SG Corporation 70 決定木 gini <- function(t) { p <- table(t[,2]) p <- p / length(t[,2]) sum(p * (1 - p)) } sgini <- function(s, t) { tl <- t[t$value < s,] pl <- gini(tl) tr <- t[t$value >= s,] pr <- gini(tr) pl * length(tl) / length(t) + pr * length(tr) / length(t) }
  • 71.
    ◍ 実行 © 2018SG Corporation 71 決定木 px <- gini(data) x <- seq(-1.0, 15.0, 0.1) g0 <- px - sapply(x, sgini, data)
  • 72.
    © 2018 SGCorporation 72 ◍ 不純度の減り方 1つ目 : 10.2 決定木
  • 73.
    © 2018 SGCorporation 73 ◍ 不純度の減り方 2つ目(左) : 5.8 決定木
  • 74.
    © 2018 SGCorporation 74 ◍ 事後確率: P(A|x), P(B|x), P(C|x) 観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。 事後確率(再掲)
  • 75.
    © 2018 SGCorporation 75 ◍ それっぽい、分割点が得られた… ◍ 実際には ◍ いつ分割をやめるかの判定。 ◍ 複雑になりすぎた枝を刈り取る。 ◍ とかも必要。 決定木
  • 76.
    © 2018 SGCorporation 76 ◍ 事後確率 ◍ 学習データから事前確率、周辺確率、尤度から事後確率を算出する。 ◍ 事後確率がもっとも高いクラスに分類する。 ◍ 距離 ◍ 学習データと入力データの距離を算出する。 ◍ 学習データとの距離がもっとも近いクラスに分類する。 ◍ 関数値 ◍ 学習データからの関数の係数を決定する。 ◍ 入力データに関数を適用し、出力値により、クラスを分類する。 ◍ 決定木 ◍ 学習データから、分割点を決定し、決定木を作成する。 ◍ 入力データに決定木を適用し、クラスを分類する。 まとめ
  • 77.
    © 2018 SGCorporation 77 ◍ はじめてのパターン認識 ◍ 平井 有三(著) ◍ 森北出版 ◍ 深層学習(機械学習プロフェッショナルシリーズ) ◍ 岡谷貴之(著) ◍ 講談社サイエンティフィク ◍ アート・オブ・Rプログラミング ◍ Norman Matloff(著)、大橋真也(監訳)、木下哲也(訳) ◍ オライリー・ジャパン 参考文献
  • 78.
    © 2018 SGCorporation 78 顧客と社員に信頼されるエス・ジー