深層学習入門
@swamptk
深層学習とはなんだ?
・人工ニューラルネット
→ 高度な情報処理の実現を目指して、生物の神経回路網を模倣したもの
・深層学習(Deep Learning)とは
→ 人工ニューラルネットを多層にして構築したもの
Deep Learning
→ そのまま訳すと「深い 学習」
→ 人工ニューラルネットを用いた機械学習ということ
深層学習と機械学習
機械学習
→あるタスクTを解き、そのパフォーマンス測定をPで行うことを考える
機械学習とは、経験EによってPを高めていく手法である。(参考文献2)
深層学習
機械学習
順伝播型ネットワーク
順伝播型ネットワーク(多層パーセプトロン)
→ 層状に並べたユニットが隣接層間でのみ結合した構造を持ち
情報が入力方向から出力方向に一方向にのみ伝播するニューラルネット
記号の定義
w:重み b:バイアス → ネットワークのパラメータ
u:ユニットが受け取る総入力
z:活性化関数f(u)の出力
x:データ
X1
x2
x3
x4
u1,z1
u2z2
u3 z3
z1
z2
z3
入力
𝑢1 = 𝑤11 𝑥1 + 𝑤12 𝑥2 + 𝑤13 𝑥3 + 𝑤14 𝑥4 + 𝑏1
𝑢2 = 𝑤21 𝑥1 + 𝑤22 𝑥2 + 𝑤23 𝑥3 + 𝑤24 𝑥4 + 𝑏2
𝑢3 = 𝑤31 𝑥1 + 𝑤32 𝑥2 + 𝑤33 𝑥3 + 𝑤34 𝑥4 + 𝑏3
𝑢4 = 𝑤41 𝑥1 + 𝑤42 𝑥2 + 𝑤43 𝑥3 + 𝑤44 𝑥4 + 𝑏4
↓
𝑢𝑗 = 𝑖=1
𝐼
𝑤𝑗𝑖 𝑥𝑖 + 𝑏𝑗
出力 𝑧𝑗 = 𝑓(𝑢𝑗)
→ ベクトルと行列を用いて 𝑢 = 𝑊𝑥 + 𝑏
𝑧 = 𝑓(𝑢)
# coding:Shift-JIS
import numpy as np
# 重みWを設定する(出力素子が3つの場合)
W = np.array([[0.5,0.3,0.6,0.7],[0.9,0.2,0.8,0.4],[0.1,0.2,0.9,0.4]])
# 与えるデータxを設定する
x = np.array([0.2,0.6,0.8,0.7])
# バイアスbを設定する
b = np.array([1,2,3])
# ユニットが受け取る総入力uを定義
# メモ np.dotで、行列の掛け算の計算ができる!
u = np.dot(W,x) + b
print(u)
> [ 2.25 3.22 4.14]
活性化関数
活性化関数でどんな結果が出るのか決まる
・シグモイド関数
ロジスティック関数 𝑓 𝑢 =
1
1+𝑒−𝑢 双曲線正接関数 𝑓 𝑢 = tanh(𝑢)
http://mathwords.net/logitkansu
正規化線形関数 線形写像(恒等写像)
𝑓 𝑢 = max 𝑢, 0 𝑓 𝑢 = 𝑢
−1 (𝑢 < −1)
𝑓 𝑢 = 𝑢 −1 ≤ 𝑢 < 1
1 (𝑢 ≥ 1)
http://mathtrain.jp/rampfunction
# さっきの続き
# 活性化関数を定義(ロジスティックシグモイド関数)
def sigmoid(u):
return 1 / (1 + np.exp(-1 * u))
# vfをロジスティックシグモイド関数でベクトル的に定義
vf = np.vectorize(sigmoid)
# vf(u)を出力
print("ロジスティックシグモイド関数")
print(vf(u))
# 双曲線正接関数はnumpyに定義されているからそのまま使う
# 双曲線正接関数の結果を出力
print("双曲線正接関数")
print(np.tanh(u))
# 活性化関数を定義(正規化線形関数)
def rectified(u):
return max(u,0)
# vfを正規化線形関数でベクトル的に定義
vf = np.vectorize(rectified)
# vf(u)を出力
print("正規化線形関数")
print(vf(u))
>ロジスティックシグモイド関数
[ 0.90465054 0.96158001 0.98432671]
双曲線正接関数
[ 0.97802611 0.99681228 0.99949305]
正規化線形関数
[ 2.25 3.22 4.14]
多層ネットワーク
入力層(𝑙 = 1) データxを入力
中間層 𝑙 = 2
𝑢(2)
= 𝑊(2)
𝑥 + 𝑏(2)
, 𝑧(2)
= 𝑓(𝑢 2
)
出力層 𝑙 = 3
𝑢(3) = 𝑊(3) 𝑥(2) + 𝑏(3) , 𝑧(3) = 𝑓(𝑢 3 )
一般化すると・・・
𝑢(𝑙+1)
= 𝑊(𝑙+1)
𝑥(𝑙)
+ 𝑏(𝑙+1)
, 𝑧(𝑙+1)
= 𝑓 𝑢 𝐿+1
最終的な出力
𝑦 ≡ 𝑧(𝑙)
x
𝑙 = 1 𝑙 = 2 𝑙 = 3
𝑧(1)
𝑧(2)
𝑧(3)
𝑦 = 𝑧(3)
出力層の設計と誤差関数
入力xと望ましい出力dとすると、
{ 𝑥1, 𝑑1 , 𝑥2, 𝑑2 , ⋯ ⋯ , 𝑥 𝑁, 𝑑 𝑁 }
訓練サンプル それらの集合 訓練データ
wを調節して、この訓練データに近づくように設定する。これが、学習なのだ!
ここで大切なことが、𝑦 𝑥 𝑛; 𝑤 ≈ 𝑑 𝑛をどう測るか→尺度が大事
→ 誤差関数を考えよう!
回帰
主に出力値に連続値をとる関数を対象に訓練データをよく再現するような関数を定
めること
https://stocks.finance.yahoo.co.jp/stocks/chart/?code=998407.O&ct=w
回帰の例
https://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90
目的 ネットワークの出力𝑦(𝑥𝑖)を目標出力𝑑𝑖に可能な限り近くする
① 目的とする出力の値域にあわせて、活性化関数を選ぶ必要がある
② 「近さ」の尺度を決める ∥ 𝑑 − 𝑦(𝑥; 𝑤) ∥2
③ 二乗誤差を訓練した全サンプルについて加算し、×1/2
𝐸 𝑤 =
1
2 𝑛=1
𝑁
∥ 𝑑 − 𝑦(𝑥; 𝑤) ∥2
二値分類の誤差関数
多クラス分類の誤差関数
確率的勾配降下法
サンプルの一部だけを使って勾配を計算し、パラメータの更新を行う
𝛻𝐸 ≡
𝜕𝐸
𝜕𝑤
= [
𝜕𝐸
𝜕𝑤1
⋯
𝜕𝐸
𝜕𝑤 𝑀
] 𝑇
𝑤(𝑡+1) = 𝑤(𝑡) − 𝜖𝛻𝐸 𝑛
→ 勾配降下法を計算するには、𝛻𝐸を計算しなければならない。
→ 偏微分の計算は、面倒だし、活性化関数wが入れ子になる。
→ この計算を高速化する方法を考えないと!
誤差逆伝播法の導入
+1をいつも出力する特別な0番ユニットを各層に導入し、各ユニットjとの結合重み
を𝑤0𝑗
(𝑙)
= 𝑏𝑗
(𝑙)
と考えると、
𝑢𝑗
(𝑙)
= 𝑖=1
𝑛
𝑤𝑗𝑖
(𝑙)
𝑧𝑖
(𝑙−1)
+ 𝑏𝑗 = 𝑖=0
𝑛
𝑤𝑗𝑖
(𝑙)
𝑧𝑖
(𝑙−1)
http://nzw0301.github.io/2015/11/blueDeepLearningChapter42
2層のネットワークでの計算
入力 x =
𝑥1
𝑥2
𝑥3
𝑥4
入力層の出力 𝑧𝑖
(1)
= 𝑥𝑖 とすると、
中間層の出力 𝑧𝑗
(2)
= 𝑓 𝑢𝑗
2
= f( 𝑖 𝑤𝑗𝑖
(2)
𝑧𝑖
(1)
)
出力層の出力 𝑦𝑗 𝑥 = 𝑧𝑗
(3)
= 𝑢𝑗
2
= 𝑖 𝑤𝑗𝑖
(3)
𝑧𝑖
(2)
誤差関数に二乗誤差
𝐸 𝑤 =
1
2 𝑗(𝑦𝑗 𝑥 − 𝑑𝑗) をとるとすると
重みでの微分
𝜕𝐸 𝑁
𝜕𝑤 𝑗𝑖
(3) と
𝜕𝐸 𝑁
𝜕𝑤 𝑗𝑖
(2) を計算しよう!
前提として、
これらは、 𝜕𝑤𝑗𝑖
(3)
には関係しない
打ち消す
線形性より
jを含まない項は、すべて0になる。(ただの数を微分しても0)
確率的勾配降下法を使うよりはるかに簡単!
中間層の重みの微分(計算したいけど時間と体力の都合で省略)
多層ネットワークへの一般化
多層ネットワークにおいて一般化できる!
誤差逆伝播法のプログラム
ごめんなさい。書けませんでした
勾配消失問題
多層ネットワークにおいて、重みが大きすぎたり小さすぎたりしたときに、重みの更
新がうまくいかずに学習が困難になること
→ 事前学習で解決する。
まとめ
・深層学習とは
・順伝播型ネットワーク
・(確率的)勾配降下法
・誤差逆伝播法
参考文献
[1] 岡谷 貴之:深層学習 (機械学習プロフェッショナルシリーズ)
[2] 堅田洋資他:フリーライブラリで学ぶ機械学習入門
他多数のWebページ

深層学習入門 スライド