SlideShare a Scribd company logo
1 of 25
深層学習
Day1
Day1
01 NN(入力・中間・出力)
02 活性化関数
03 勾配降下法
04 誤差逆伝番法
01 ニューラルネットワークNN(入力・中間・出力)
入力:
中間:
出力:
・・・ ・・・ ・・・
重みW1 重みW2 重みW3
バイアス
b1
バイアス
b2
バイアス
b3
01 NN(実装例)
def init_network():
print("##### ネットワークの初期化 #####")
network = {}
input_layer_size = 3
hidden_layer_size_1=10
hidden_layer_size_2=5
output_layer_size = 4
network['W1'] = np.random.rand(input_layer_size, hidden_layer_size_1)
network['W2'] = np.random.rand(hidden_layer_size_1,hidden_layer_size_2)
network['W3'] = np.random.rand(hidden_layer_size_2,output_layer_size)
network['b1'] = np.random.rand(hidden_layer_size_1)
network['b2'] = np.random.rand(hidden_layer_size_2)
network['b3'] = np.random.rand(output_layer_size)
print_vec("重み1", network['W1'] )
print_vec("重み2", network['W2'] )
print_vec("重み3", network['W3'] )
print_vec("バイアス1", network['b1'] )
print_vec("バイアス2", network['b2'] )
print_vec("バイアス3", network['b3’] )
return network
各層の行数×行数が重みの行数×列数となる
中間層は隠れ層とも呼ぶ
層の行数がそのままバイアスの行数となる
※後のページに実行結果を添付しており、
NN(入力~出力)と活性化関数の演習も含んでいる
def forward(network, x):
print("##### 順伝播開始 #####")
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
# 1層の総入力
u1 = np.dot(x, W1) + b1
# 1層の総出力
z1 = functions.relu(u1)
# 2層の総入力
u2 = np.dot(z1, W2) + b2
# 2層の総出力
z2 = functions.relu(u2)
# 出力層の総入力
u3 = np.dot(z2, W3) + b3
# 出力層の総出力
y = u3
print_vec("総入力1", u1)
print_vec("中間層出力1", z1)
print_vec("中間層出力2", z2)
print_vec("総入力2", u2)
print_vec("出力", y)
print("出力合計: " + str(np.sum(y)))
return y, z1, z2
01 NN(実装例)
活性化関数にReLU関数を使用
(確認テストでも問われていた中間層の出力)
活性化関数にReLU関数を使用
(確認テストでも問われていた中間層の出力)
# 入力値
x = np.array([1., 2., 4.])
print_vec("入力", x)
# ネットワークの初期化
network = init_network()
y, z1, z2 = forward(network, x)
01 NN(実装例)
01 NN(実行結果)
01 NN(実行結果)
02 活性化関数
 中間層
①ステップ関数
線形分離可能なもののみ
②シグモイド関数
勾配消失問題が発生の可能性
(1より小さいので連鎖率が繰り返されると
0に近づいてしまう)
③ReLU関数
入力値が0より大きな場合にはそのままの値
を返すので(1より大きいので)勾配消失問題
が起きにくい
①
②
③
02 活性化関数
 出力層
①回帰:恒等写像
入力値をそのまま返す
※2乗することで負であることが
なくなり、½倍することで、逆伝番時の微分で係数が
1になる(確認テストでも問われたところ)
②二値分類:シグモイド関数
③多クラス分類:ソフトマックス関数
誤差関数
03 勾配降下法
機械学習のレポートのロジスティック回帰でも出てきたが、NNのパラメータの更新にも勾配降
下法、確率的勾配降下法を用いる。
また、機械学習の際には言及がなかったが、ミニバッチ勾配降下法というものもある。
最適な勾配の決定の方法はDay2に記載する。
項番 勾配降下法 種別 式 備考
① 勾配降下法 W = w - Π
𝜕E
𝜕𝑤
𝜕E
𝜕𝑤
は、すべての
𝜕E
𝜕𝑤
を対象とする
② 確率的勾配降下法 W = w - Π
𝜕E
𝜕𝑤
𝜕E
𝜕𝑤
は、ある1つだけを対象とする(ランダ
ムに1つだけ計算するので計算量が少なく
できる。学習データが入ってくるたびにその
都度、新たに入ってきたデータのみを使っ
て学習を行うといったオンライン学習(確認
テストでも問われた)が可能)
③ ミニバッチ勾配降下法 W = w - Π
𝜕E
𝜕𝑤
𝜕E
𝜕𝑤
は、ランダムに分割したデータの集合
を対象とする(①と②のいいとこどり)
i i
t t
04 誤差逆伝番法
def forward(network, x):
print("##### 順伝播開始 #####")
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
# 1層の総入力
u1 = np.dot(x, W1) + b1
# 1層の総出力
z1 = functions.relu(u1)
# 2層の総入力
u2 = np.dot(z1, W2) + b2
# 2層の総出力
z2 = functions.relu(u2)
# 出力層の総入力
u3 = np.dot(z2, W3) + b3
# 出力層の総出力
y = u3
 誤差逆伝番法
右の実装例で勾配降下法を利用するために
𝑊2の偏微分を求めるとき、連鎖率から以下のようになる。
𝜕E
𝜕𝑤2
=
𝜕E
𝜕𝑧2
𝜕𝑧2
𝜕𝑢2
𝜕𝑢2
𝜕𝑤2
NNの図で言うと、
右側の出力層から左側の入力層へ順伝番とは逆向きに
計算していくので逆伝番法と呼んでいる。
04 誤差逆伝番法(実装例)
def init_network():
print("##### ネットワークの初期化 #####")
network = {}
network['W1'] = np.array([
[0.1, 0.3, 0.5],
[0.2, 0.4, 0.6]
])
network['W2'] = np.array([
[0.1, 0.4],
[0.2, 0.5],
[0.3, 0.6]
])
network['b1'] = np.array([0.1, 0.2, 0.3])
network['b2'] = np.array([0.1, 0.2])
print_vec("重み1", network['W1'])
print_vec("重み2", network['W2'])
print_vec("バイアス1", network['b1'])
print_vec("バイアス2", network['b2'])
return network
# 順伝播
def forward(network, x):
print("##### 順伝播開始 #####")
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
u1 = np.dot(x, W1) + b1
z1 = functions.relu(u1)
u2 = np.dot(z1, W2) + b2
y = functions.softmax(u2)
print_vec("総入力1 u1", u1)
print_vec("中間層出力1 z1", z1)
print_vec("総入力2 u2", u2)
print_vec("出力1 y", y)
print("出力合計: sum_y " + str(np.sum(y)))
return y, z1
※この実装例ではW1, W2を予め定義しているため、
各層の行数の変数による指定は無い
(後のページに実行結果も載せており演習を含む)
04 誤差逆伝番法(実装例)
# 誤差逆伝播
def backward(x, d, z1, y):
print("¥n##### 誤差逆伝播開始 #####")
grad = {}
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
# 出力層でのデルタ
delta2 = functions.d_sigmoid_with_loss(d, y)
# b2の勾配
grad['b2'] = np.sum(delta2, axis=0)
# W2の勾配
grad['W2'] = np.dot(z1.T, delta2)
# 中間層でのデルタ
delta1 = np.dot(delta2, W2.T) * functions.d_relu(z1)
# b1の勾配
grad['b1'] = np.sum(delta1, axis=0)
# W1の勾配
grad['W1'] = np.dot(x.T, delta1)
print_vec("偏微分_dE/du2", delta2)
print_vec("偏微分_dE/du1", delta1)
print_vec("偏微分_重み1", grad["W1"])
print_vec("偏微分_重み2", grad["W2"])
print_vec("偏微分_バイアス1", grad["b1"])
print_vec("偏微分_バイアス2", grad["b2"])
※左記が重みとバイアスの勾配を示す重要な箇所
(逆伝番をやっているところ)
04 誤差逆伝番法(実装例)
return grad
# 訓練データ
x = np.array([[1.0, 5.0]])
# 目標出力
d = np.array([[0, 1]])
# 学習率
learning_rate = 0.01
network = init_network()
y, z1 = forward(network, x)
# 誤差
loss = functions.cross_entropy_error(d, y)
grad = backward(x, d, z1, y)
for key in ('W1', 'W2', 'b1', 'b2'):
network[key] -= learning_rate * grad[key]
print("##### 結果表示 #####")
print("##### 更新後パラメータ #####")
print_vec("重み1", network['W1'])
print_vec("重み2", network['W2'])
print_vec("バイアス1", network['b1'])
print_vec("バイアス2", network['b2'])
←ここまでbackward
←ここからメイン処理
※左記が逆伝番と勾配降下法を行っている
重要な箇所
04 誤差逆伝番法(実装例のイメージ図)
入力:
中間:
出力:
重みW1 重みW2
バイアス
b1
バイアス
b2
u1
u1
u1
z1
z1
z1
u2
u2
y
y
ReLU softmax
教師d
0, 1
 スライド14の赤字部分
教師dと出力yの誤差Eとすると、出力層(ソフトマックス)の偏微分は y – d、中間層(ReLU)の偏微分は1。
連鎖率からB2の偏微分はy – d ×
𝜕𝑢2
𝜕𝑏2
で、u2 = Z1・W2 + b2のため
𝜕𝑢2
𝜕𝑏2
は1であり、y – dとなる。
W2での偏微分は、z1.T × (y – d)
W1での偏微分は、x.T × ( y – d) × W2.T ×1
04 誤差逆伝番法(出力結果)
APPENDIX
ステージテスト後の整理
理解不足があったため不足知識について整理する
ステージテスト後の整理
 最尤推定について、データ数が少ないと、たまたま正解となったのかもしれないので過学習の可能性がある。データが多いほうが良い。
 サポートベクタマシンはy x = wT
Φ(x) + b = 0 の境界によってクラスを分離する。ラベルが-1, 1のときはsin(wT
Φ(x) + b)によって分離する。
 データとラベルの情報が与えられてその境界を考えるとき、実際にプロットをしてみて引いた線の値(xの値)を代入して求める。
 ソフトマージンの式はC 𝑖=1
𝑛
𝜀𝑖 +
1
2
𝑤 2
εはデータ点𝒙𝒊がマージン内または誤分類されたときに正の値をとるスタック変数。
 カーネルは特徴ベクトルの内積(特徴ベクトルの転置×特徴ベクトル)
 k-NNでは訓練ステップの時間はkに依存しない。高次元になると距離はほとんど同じになる(次元の呪い)ため機能しなくなる。
 主成分分析による主成分への射影は、内積にて行う。
ステージテスト後の整理
 ソフトマージンの式はC 𝑖=1
𝑛
𝜀𝑖 +
1
2
𝑤 2
について
SVMはサポートベクトルのマージン最大化を取る境界線を見つけるものだった。
つまり、
1
𝑤
× 2の最大化。したがって、
𝑤
2
の最小化と言い換えられる。
これを計算の簡略化のため、
1
2
𝑤 2
としている。
C →∞がハードマージンのため、C 𝑖=1
𝑛
𝜀𝑖 +
1
2
𝑤 2 が最小となるパラメータを算出すればよい。
t(wT
x + b) ≥ 1-ε、ε ≥ 0の制約条件から、最適解はラグランジュの未定乗数法から、
以下のL(α)が最大となるαを求めればよい
L(α) = 𝑖=1
𝑛
α𝑖 -
1
2 𝑖=1
𝑛
i=j
𝑛
α𝑖α𝑗𝑡𝑖𝑡𝑗𝑥𝑖
𝑇
𝑥𝑗
ステージテスト後の整理
 カーネルは特徴ベクトルの内積(特徴ベクトルの転置×特徴ベクトル)について
非線形の境界線を引きたいけど引けない場合は、一度、高次元に置き換えることで引けるように
なる。
x → Φ(x)
特徴空間
(高次元化)
このままでは
赤と青を分離する線は引けないが・・・
ただし、Φ(x)は高次元になればなるほど計算は大変。
𝐾 𝑥1, 𝑥2 = 𝛷𝑇
𝑥1 𝛷 𝑥2 としたときに元のベクトル計算で表現することができるものが存在する。
これ(K)をカーネルといい、有名なものに以下のものがある。(次のページ)
ステージテスト後の整理
 カーネルは特徴ベクトルの内積(特徴ベクトルの転置×特徴ベクトル)について
カーネル法 式
線形カーネル K(𝑥𝑖, 𝑥𝑗) = 𝑥𝑖・ 𝑥𝑗
シグモイドカーネル K(𝑥𝑖, 𝑥𝑗) = tanh( 𝑏𝑥𝑖
𝑇
𝑥𝑗 + c )
多項カーネル K(𝑥𝑖, 𝑥𝑗) = ( 𝑥𝑖
𝑇
𝑥𝑗 + c )𝑑
ガウスカーネル
K(𝑥𝑖, 𝑥𝑗) = ⅇ
−
| 𝑥𝑖 −𝑥𝑖 |2
2𝜎2
RBFカーネル K(𝑥𝑖, 𝑥𝑗) = ⅇ−𝛾 𝑥𝑖 −𝑥𝑖
2
ステージテスト後の整理
 カーネルは特徴ベクトルの内積(特徴ベクトルの転置×特徴ベクトル)
L(α) = 𝑖=1
𝑛
α𝑖 -
1
2 𝑖=1
𝑛
i=j
𝑛
α𝑖α𝑗𝑡𝑖𝑡𝑗𝑥𝑖
𝑇
𝑥𝑗
L(α) = 𝑖=1
𝑛
α𝑖 -
1
2 𝑖=1
𝑛
i=j
𝑛
α𝑖α𝑗𝑡𝑖𝑡𝑗 𝛷𝑇
𝑥𝑖 𝛷 𝑥𝑗
まとめると、高次元化(x → Φ(x))をして、L(α)が最大となるパラメータを用いればよい。
そして 𝛷𝑇
𝑥𝑖 𝛷 𝑥𝑗 は元のベクトルで計算できるので計算も楽になる。
※Φ(x)自体を計算する必要がない
参考記事など
 オンライン学習とバッチ学習
https://dev.classmethod.jp/articles/online-batch-learning/
 誤差逆伝番法
https://www.anarchive-beta.com/entry/2020/08/03/180000
https://python.atelierkobato.com/backpropagation/
https://www.wantanblog.com/entry/2020/06/14/164809
 カーネル法
https://nisshingeppo.com/ai/kernel-method/
https://kenyu-life.com/2019/04/22/svm_kernel/
https://kenyu-life.com/2019/04/01/svm_lagrange/
https://mi-chan-nel.com/kernel-method/
Day2へ続く

More Related Content

What's hot (8)

PRML chapter5
PRML chapter5PRML chapter5
PRML chapter5
 
PRML Chapter5.2
PRML Chapter5.2PRML Chapter5.2
PRML Chapter5.2
 
機械学習
機械学習機械学習
機械学習
 
深層学習と活性化関数
深層学習と活性化関数深層学習と活性化関数
深層学習と活性化関数
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
Lotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and TechniquesLotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and Techniques
 
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
 
人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説
 

Similar to ラビットチャレンジレポート 深層学習 Day1

Similar to ラビットチャレンジレポート 深層学習 Day1 (7)

深層学習レポート Day1 (小川成)
深層学習レポート Day1 (小川成)深層学習レポート Day1 (小川成)
深層学習レポート Day1 (小川成)
 
SGDによるDeepLearningの学習
SGDによるDeepLearningの学習SGDによるDeepLearningの学習
SGDによるDeepLearningの学習
 
A yet another brief introduction to neural networks
A yet another brief introduction to neural networksA yet another brief introduction to neural networks
A yet another brief introduction to neural networks
 
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
 
文献紹介:Learnable Gated Temporal Shift Module for Free-form Video Inpainting
文献紹介:Learnable Gated Temporal Shift Module for Free-form Video Inpainting文献紹介:Learnable Gated Temporal Shift Module for Free-form Video Inpainting
文献紹介:Learnable Gated Temporal Shift Module for Free-form Video Inpainting
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
PRML5
PRML5PRML5
PRML5
 

More from ssuserf4860b (6)

ラビットチャレンジレポート 深層学習Day4
ラビットチャレンジレポート 深層学習Day4ラビットチャレンジレポート 深層学習Day4
ラビットチャレンジレポート 深層学習Day4
 
【最新ではありません。再度URL送付しています→https://www.slideshare.net/ssuserf4860b/day-250965207...
【最新ではありません。再度URL送付しています→https://www.slideshare.net/ssuserf4860b/day-250965207...【最新ではありません。再度URL送付しています→https://www.slideshare.net/ssuserf4860b/day-250965207...
【最新ではありません。再度URL送付しています→https://www.slideshare.net/ssuserf4860b/day-250965207...
 
ラビットチャレンジレポート 深層学習Day3
ラビットチャレンジレポート 深層学習Day3ラビットチャレンジレポート 深層学習Day3
ラビットチャレンジレポート 深層学習Day3
 
ラビットチャレンジレポート 深層学習Day2
ラビットチャレンジレポート 深層学習Day2ラビットチャレンジレポート 深層学習Day2
ラビットチャレンジレポート 深層学習Day2
 
ラビットチャレンジレポート 機械学習
ラビットチャレンジレポート 機械学習ラビットチャレンジレポート 機械学習
ラビットチャレンジレポート 機械学習
 
ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学
 

ラビットチャレンジレポート 深層学習 Day1