---
title: フリーソフトではじめる機械学習入門 (第2版) 第8章
tags:  #機械学習 #ニューラルネットワーク  
author: [荒木 雅弘](https://convert.docswell.com/user/MasahiroAraki)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/YJ9NRMY8J3.jpg?width=480
description: フリーソフトではじめる機械学習入門 (第2版) 第8章 by 荒木 雅弘
published: September 29, 23
canonical: https://convert.docswell.com/s/MasahiroAraki/ZVV93J-2023-09-29-094005
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/YJ9NRMY8J3.jpg)

8. ニューラルネットワーク
⼊⼒
1
…
…
…
…
教師信号
重みの更新
誤差
荒木雅弘: 『フリーソフトではじめる機械
8.1 ニューラルネットワークの計算ユニット
8.2 フィードフォワード型ニューラルネットワーク
8.3 ニューラルネットワークの深層化
学習入門（第2版）』 （森北出版，2018年）
スライドとJupyter notebook
サポートページ


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GJ8KWL6ZED.jpg)

8.1 ニューラルネットワークの計算ユニット (1/3)
ニューラルネットワークとは
神経細胞の情報伝達メカニズムを単純化したユニットを用いた計算機構
シナプスから受け取る神経伝達物質の量が一定量を超えると、その細胞も興奮して神経伝達物質
を分泌するメカニズムを数理的にモデル化したもの
現時点では脳の複雑な機能分化などがモデル化できているわけではない
…
1
(a) ニューロンとその結合
(b) ニューロンの数理モデル


# Page. 3

![Page Image](https://bcdn.docswell.com/page/LJLZNL917R.jpg)

8.1 ニューラルネットワークの計算ユニット (2/3)
初期のニューロンモデル（McCulloch&amp;Pittsモデル）
活性化関数として閾値関数を用いる
f (h) = {
0
1
​
(h &lt; 0)
(h ≥ 0)
​
パーセプトロンの実装と等価
線形分離可能なデータに対して、w T x
= 0という識別面を学習可能


# Page. 4

![Page Image](https://bcdn.docswell.com/page/47MVXMZ57W.jpg)

8.1 ニューラルネットワークの計算ユニット (3/3)
線形分離可能性に関係なく、任意のデータで学習可能なユニットへ
活性化関数として微分可能なシグモイド関数
σ(h) =
1
を用いる
1+exp(−h)
​
ロジスティック回帰の実装と等価
勾配降下法により、クロスエントロピー（負の対数尤度）最小となる識別面
シグモイド関数の微分は
wT x = 0 を学習可能
σ ′ (h) = σ(h)(1 − σ(h)) と簡単な形になる


# Page. 5

![Page Image](https://bcdn.docswell.com/page/P7R2NV6ZJ9.jpg)

8.2 フィードフォワード型ニューラルネットワーク (1/8)
ニューラルネットワークの計算ユニットを階層的に組み合わせる
非線形関数ユニットの階層的組み合わせで複雑な非線形識別面が実現できる
…
…
…
…
1
⼊⼒層
隠れ層
出⼒層
多クラス識別の出力層には活性化関数として以下のsoftmax関数を用いる
hk : k 番目の出力層ユニットに入力される隠れ層の出力の重み付き和
​
y^k =
​
​
exp(hk )
∑cj=1 exp(hj )
​
​
​
​


# Page. 6

![Page Image](https://bcdn.docswell.com/page/PJXDNZM1EX.jpg)

8.2 フィードフォワード型ニューラルネットワーク (2/8)
フィードフォワード型ネットワークによる複雑な識別面の構成
https://playground.tensorflow.org/


# Page. 7

![Page Image](https://bcdn.docswell.com/page/3JKXN8GMED.jpg)

8.2 フィードフォワード型ニューラルネットワーク (3/8)
誤差逆伝播法による学習のイメージ
⼊⼒
1
…
…
…
…
教師信号
重みの更新
誤差


# Page. 8

![Page Image](https://bcdn.docswell.com/page/LE35V2N2J5.jpg)

8.2 フィードフォワード型ニューラルネットワーク (4/8)
勾配降下法による学習の準備
学習データ:
x ∈ Rd , y ∈ {0, 1}c （c次元one-hotベクトル）
{(xi , y i )}, i = 1, … , N
​
特定のデータ
​
x に対する二乗誤差
c
1
E(w) ≡ ∑(y^j − yj )2
2 j=1
​
確率的勾配降下法による重み
​
​
​
​
w の更新式
w′ ← w − η
∂E(w)
∂w
​


# Page. 9

![Page Image](https://bcdn.docswell.com/page/8EDD8ZW6EG.jpg)

8.2 フィードフォワード型ニューラルネットワーク (5/8)
修正量の計算
i 番目のユニットから第n層の j 番目のユニットへの重みwij の更新を考える
第
層
…
…
…
第
…
…
​
…
第n-1層の
層
第
層
修正量の計算に合成関数の微分公式を適用
∂E(w)
∂E(w) ∂hj
=
∂wij
∂hj ∂wij
​
​
​
​
​
​
(1)


# Page. 10

![Page Image](https://bcdn.docswell.com/page/V7PX8DXZE8.jpg)

8.2 フィードフォワード型ニューラルネットワーク (6/8)
修正量の計算の分解
(1)の右辺第1項を ϵj と置き、合成関数の微分公式を適用
​
ϵj =
​
∂E(w)
∂E(w) ∂gj
=
∂hj
∂gj ∂hj
​
​
(1)の右辺第2項
I
hj = ∑i=1 wij gi から
​
​
​
​
∂hj
∂wij
​
​
​
= gi
​
​
​
​
​
(2)


# Page. 11

![Page Image](https://bcdn.docswell.com/page/2JVLN1LM7Q.jpg)

8.2 フィードフォワード型ニューラルネットワーク (7/8)
誤差項の分解
(2)の右辺第1項
第n層が出力層の場合
∂E(w)
= g j − yj
∂gj
​
​
​
​
第n層が隠れ層の場合
K
K
∂E(w)
∂E(w) ∂hk
=∑
= ∑ ϵk wjk
∂gj
∂h
∂g
k
j
k=1
k=1
​
​
​
​
​
​
​
​
​
​
​
(2)の右辺第2項 : 活性化関数（シグモイド関数）の微分 gj (1 − gj )
​
​


# Page. 12

![Page Image](https://bcdn.docswell.com/page/5EGXK2XXJL.jpg)

8.2 フィードフォワード型ニューラルネットワーク (8/8)
誤差逆伝播法による学習の手順
1. リンクの重み
w を小さな初期値に設定
2. 個々の学習データ (xi , y i ) に対して以下繰り返し
​
1. 入力
​
xi に対するネットワークの出力 y
^ i を計算
​
​
​
k 番目のユニットに対してエラー量 ϵk = (y^k − yk )y^k (1 − y^k ) を計算
K
3. 出力層に近い隠れ層から順に、j 番目のユニットに対してエラー量 ϵj = ∑k=1 ϵk wjk gj (1 − gj )
2. 出力層の
​
​
​
​
​
​
​
​
を計算
4. 以下、入力層に至るまでエラー量の計算を繰り返し
5. 重みの更新
w′ = w − ηϵg
​
​
​
​
​
​


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4JQ8NP857P.jpg)

ニューラルネットワークによる学習の枠組み (1/5)
深層学習ライブラリ keras の枠組み
ネットワーク
⼊⼒
レイヤー
（データ変換）
重み
レイヤー
（データ変換）
…
重み
最適化器
予測
正解
損失関数
スコア


# Page. 14

![Page Image](https://bcdn.docswell.com/page/K742GY2VJ1.jpg)

ニューラルネットワークによる学習の枠組み (2/5)
回帰問題の損失関数
二乗誤差: &#039;mean_squared_error&#039;
外れ値の影響を小さくしたい場合はHuber損失: &#039;Huber&#039;
一定の範囲内は二乗誤差、範囲外は線形損失


# Page. 15

![Page Image](https://bcdn.docswell.com/page/LJ1MD6M4EG.jpg)

ニューラルネットワークによる学習の枠組み (3/5)
識別問題の損失関数
2値識別: 2値クロスエントロピー &#039;binary_crossentropy&#039;
E(w) = −{y log(y^) + (1 − y) log(1 − y^)}
​
​
多クラス識別: クロスエントロピー: &#039;categorical_crossentropy&#039;
2つの確率分布
y と y^ の近さを表す
c
E(w) = − ∑ yj log(y^j )
​
j=1
​
​
​


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GJW3YW3ZJ2.jpg)

ニューラルネットワークによる学習の枠組み (4/5)
勾配降下法による最適化
モーメンタム（慣性）の導入（最適化器SGDのmomentum属性で
更新の方向に勢いを付けることで収束を早め、振動を抑制する
v t = γv t−1 + η
​
​
∂E(w)
∂w
w′ = w − v t
​
​
γ を指定）


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EZVX5VLJ3.jpg)

ニューラルネットワークによる学習の枠組み (5/5)
実用的な最適化器
準ニュートン法(L-BFGS)
2次微分（近似）を更新式に加える
AdaGrad
学習回数と勾配の2乗を用いた学習係数の自動調整
RMSProp
学習係数調整の改良：勾配の2乗の指数平滑移動平均を用いることで直近の変化量を反映
Adam:Adaptive Moment Estimation
モーメントの拡張：分散に関するモーメントも用いる
まれに観測される特徴軸に対して大きく更新する効果
データ数が多いときは Adam、少ないときは L-BFGS が勧められている


# Page. 18

![Page Image](https://bcdn.docswell.com/page/Y765495MEV.jpg)

kerasのコーディング (1/4)
ニューラルネットワークの構造と活性化関数の指定
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=&#039;sigmoid&#039;),
keras.layers.Dense(10, activation=&#039;softmax&#039;)
])
レイヤーの種類
Flatten: 入力情報の変換
2次元データを1次元のベクトルに変換
Dense: 密結合層
隣接する層間のすべてのユニット間で結合をもつ


# Page. 19

![Page Image](https://bcdn.docswell.com/page/G75YQNYQ74.jpg)

kerasのコーディング (2/4)
Activation: 活性化関数
&#039;softmax&#039; : ソフトマックス関数
f (x) = 1/(1 + exp(−x))
&#039;tanh&#039; : 双曲線正接
f (x) = tanh(x)
&#039;relu&#039; : rectified linear関数 f (x) = max(0, x)
&#039;sigmoid&#039; : シグモイド関数


# Page. 20

![Page Image](https://bcdn.docswell.com/page/9J2GP5GWJR.jpg)

kerasのコーディング (3/4)
modelのコンパイル
model.compile(loss=&#039;categorical_crossentropy&#039;, optimizer=&#039;adam&#039;, metrics=[&#039;acc&#039;])
損失関数、最適化器、評価指標（複数可）を指定
optimizer: 最適化手法
&#039;sgd&#039; : 確率的最急降下法
&#039;adam&#039; : Adaptive Moment Estimation
metrics: 評価指標
&#039;acc&#039; : 正解率
&#039;mse&#039; : 平均二乗誤差


# Page. 21

![Page Image](https://bcdn.docswell.com/page/DEYV5KV9EM.jpg)

kerasのコーディング (4/4)
学習
ミニバッチのサイズと繰り返し数を指定
繰り返し毎に損失関数の値とmetricsで指定した値が表示される
model.fit(X_train, y_train, batch_size=200, epochs=3)
評価
score[0]は損失関数の値
score[1]以降はmetricsで指定したもの
score = model.evaluate(X_test, y_test)


# Page. 22

![Page Image](https://bcdn.docswell.com/page/VJNMNRMD78.jpg)

8.3 ニューラルネットワークの深層化
ニューラルネットワークの構造の決定
隠れ層のユニット数：その層で実現される非線形変換の複雑さを表す
層数：低次の特徴表現から高次の特徴表現への変換の段階数を表す
多階層における誤差逆伝播法の問題点
修正量が消失／発散する


# Page. 23

![Page Image](https://bcdn.docswell.com/page/YE9NRMN8E3.jpg)

8.3 ニューラルネットワークの深層化
勾配消失問題への対処
初期はオートエンコーダなどによる重みの事前学習が用いられた
活性化関数の工夫により、事前学習の必要は薄れてきた
ReLU(rectified linear) :
f (x) = max(0, x)
誤差消失が起こりにくい
0を出力するユニットが多くなる
双曲線正接tanh :
f (x) =
微分の値が大きい
負の値でも勾配がある
ex −e−x
ex +e−x
​


# Page. 24

![Page Image](https://bcdn.docswell.com/page/GE8KWLKZ7D.jpg)

8.3 ニューラルネットワークの深層化
多階層学習における工夫
過学習の回避:ドロップアウト
学習時に一定割合のユニットをランダムに消す
認識時には学習後の重みに消去割合を掛ける
ドロップアウトの効果
正規化のような役割


# Page. 25

![Page Image](https://bcdn.docswell.com/page/LELZNLZ1JR.jpg)

8.4 まとめ
ニューラルネットは、ロジステック回帰を多段階にしたもので、非線形識別面を実現し
ている
ニューラルネットは誤差逆伝播法で学習する
kerasを用いたニューラルネットのコーディング
多階層ニューラルネットの学習
参考）今泉 允聡: 深層学習の原理に迫る 数学の挑戦 (岩波科学ライブラリー), 岩波書店,
2021.


# Page. 26

![Page Image](https://bcdn.docswell.com/page/4JMVXMV5JW.jpg)

補足 ニューラルネットワークの深層化
多階層学習における工夫
正規化の必要性
データが空間内の特定の領域に偏ってしまうと、層による非線形変換が生じにくい
たとえば活性化関数をReLUとしたとき、データが0をまたぐことで非線形性が生じる
データの平均が0近辺で、分散のスケールが一定のときは学習させやすい
バッチ入力
{x(i) } i = 1, … , ∣B∣ に対して、変換結果 h(i) を平均0、分散1に変換
∣B∣
∣B∣
1
1
h(i) − m
(i)
(i)
2
(i)
m=
∑h , v =
∑(h − m) , u =
∣B∣ i=1
∣B∣ i=1
v
​
​
​
​
​


# Page. 27

![Page Image](https://bcdn.docswell.com/page/PJR2NV2ZE9.jpg)

補足 ニューラルネットワークの深層化
多階層学習における工夫
正規化
正規化層を設ける場合：層の間に入れる
正
規
化
層
層
層
正規化関数を設定する場合：重み付き和と活性化関数の間に入れる
重
み
付
き
和
正
規
化
関
数
活
性
化
関
数
層


# Page. 28

![Page Image](https://bcdn.docswell.com/page/PEXDNZD17X.jpg)

補足 ニューラルネットワークの深層化
多階層学習における工夫
スキップ接続
層による変換をスキップして出力に加える
学習時に誤差がそのまま伝わる
現在の入力を逐次更新することで重要な情報を失わない
残差をモデル化しているとみなせる (ResNet)
h′ = h + f (h) ⇔ f (h) = h′ − h
活
性
化
関
数
+


# Page. 29

![Page Image](https://bcdn.docswell.com/page/3EKXN8XM7D.jpg)

補足 ニューラルネットワークの深層化
深層学習における現実と理論のギャップ
なぜ多層にすると性能が向上する？
2層NN隠れ層のユニット数が十分に多ければ、任意の非線形関数を十分な精度で近似できるはず
なぜ過学習しない？
「パラメータが多い＝バイアスが小さい」モデルは過学習しやすいはず
なぜ最適に近いパラメータが見つかる？
損失関数が複雑な形をしていると、局所最適解で学習が止まることが多いはず


# Page. 30

![Page Image](https://bcdn.docswell.com/page/L735V252E5.jpg)

補足 ニューラルネットワークの深層化
なぜ多層にすると性能が向上する？
関数の表現可能性ではなく、近似の速度に着目する
近似誤差レート
α（パラメータ数と関数近似誤差の関係）による評価
表現したい関数
f (x), NNによる関数 gθ (x), NNのパラメータ数 W , 定数 C &gt; 0
​
min max ∣f (x) − gθ (x)∣ ≤ CW −α
​
θ
パラメータ数
​
​
x
W を増加させたときの近似誤差の減少率が、近似誤差レート α で表現できる
よいレートを持つ手法は、少ないパラメータで目的の関数を正確に達成できる
近似誤差
遅い減衰（レート悪）
速い減衰（レート良）
パラメータ数 W


# Page. 31

![Page Image](https://bcdn.docswell.com/page/87DD8ZD67G.jpg)

補足 ニューラルネットワークの深層化
なぜ多層にすると性能が向上する？
DNNによる近似誤差レート改善の可能性
関数が滑らかな場合
2層NNの近似誤差レートをDNNで改善することはできない
関数がジャンプを持つ場合
DNNでは滑らかな関数を表現する層の間に階段関数の層を挟むことで近似可能
関数が非均一的な滑らかさを持つ場合
DNNでは前半の層でデータの分割を行い、後半の層で層毎に異なる幅を持つ短冊状の関数を
表現することで近似可能
特徴抽出処理との関係
抽出される特徴量が低次元かつ十分滑らかな構造を持つ場合、DNNの近似誤差レートは改善する


# Page. 32

![Page Image](https://bcdn.docswell.com/page/VJPX8D6Z78.jpg)

補足 ニューラルネットワークの深層化
なぜ過学習しない？
従来の機械学習の知見：「パラメータが多い＝バイアスが小さい」モデルは過学習しやすい
過学習のしやすさの程度
過学習しやすさ =
NN の自由度
学習データの数
​
​
NNの自由度の定義
自由度 = 係数 × 層数 × パラメータ数


# Page. 33

![Page Image](https://bcdn.docswell.com/page/2EVLN13MJQ.jpg)

補足 ニューラルネットワークの深層化
過学習しにくい理由
仮説1：暗黙的正則化
観察される現象：DNNの重みの値は概して小さく、初期値の周辺に限定されている
宝くじ仮説：巨大なDNNは小さなNNの集合体で、学習によって当たりのNNを引き当てている
根拠：学習後に枝刈り（半分以上のエッジの消去）を行っても、ほぼ同じ性能が維持できる
仮説2：損失平坦性
学習後の最適パラメータの近くで損失関数が平坦なら過学習は起こりにくい
入力の摂動によるモデルの変化が小さいことが汎化性能が高いことにつながる
仮説3：二重降下
パラメータ数の増加によって、一旦下降した汎化誤差は上昇に転じるが、パラメータ数がデータ数
より多くなると再度下降することが実験的に示された
データ数・パラメータ数を無限として解析すると、無駄なパラメータが減少し、過学習しやすさは
パラメータ数に反比例する


# Page. 34

![Page Image](https://bcdn.docswell.com/page/57GXK23XEL.jpg)

補足 ニューラルネットワークの深層化
なぜ最適に近いパラメータが見つかる？
局所最適解で学習が止まらない理由
過剰パラメータ化
NNのある層のパラメータを一定以上過剰にすると、勾配降下法は損失関数の値をほぼ0にす
るパラメータに到達する
過剰パラメータを持つ層が損失関数全体を押し下げる
損失関数は負にならないため、0に近い多くの値が最適値となる
確率的勾配降下法の効果の解明
更新されたパラメータの散らばりは、損失関数の値が小さくなる点に集中する分布に従う


# Page. 35

![Page Image](https://bcdn.docswell.com/page/4EQ8NP55JP.jpg)

補足 ニューラルネットワークの深層化
深層学習における現実と理論のギャップ
なぜ多層にすると性能が向上する？
関数がジャンプを持つ場合：階段関数で近似
関数が非均一的な滑らかさを持つ場合：異なる幅を持つ短冊状の関数で近似
なぜ過学習しない？
暗黙的正則化：巨大なDNNは小さなNNの集合体で、その中の1つが当たりを引き当てている
二重降下：パラメータ数がデータ数より多くなると汎化誤差は下がり続ける
なぜ最適に近いパラメータが見つかる？
過剰パラメータを持つ層が損失関数全体を押し下げ、損失関数の値が0となるところが多く現れる


