---
title: Low-levelに見るニューラルネットワーク
tags: 
author: [Satoshi Kashima](https://www.docswell.com/user/6678794)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/LELPWL1V7R.jpg?width=480
description: Low-levelに見るニューラルネットワーク by Satoshi Kashima
published: September 16, 23
canonical: https://www.docswell.com/s/6678794/K8G9MP-2023-09-16-231103
---
# Page. 1

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

Low-levelに見るニューラ
ルネットワーク
Universal Approximation theoremについて


# Page. 2

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

問題定義
• ニューラルネットワークがなぜ関数近似をできるのかはブラッ
クボックスになりがち。
• 僕もなんとなく、「たんくさん線形関数を活性化関数で繋げて
るから」で理解が終わっていた。
• もう少しlow-levelに、どうやってニューラルネットワークが関
数を近似しているのかを理解したい


# Page. 3

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

目次
1. 前提：機械学習をどう見るか
2. 主題：ニューラルネットワークの理解


# Page. 4

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

前提：low-levelに機械学習を
見る


# Page. 5

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

3つの視点で機械学習を見る
1. 機械学習 as 関数近似
2. 機械学習 as データに対する値の振り分け
3. 機械学習 as if-elseの自動生成


# Page. 6

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

機械学習 as 関数近似
• 機械学習はlow-levelに見るとただの関数近似。
• True/population distributionのモデルをデータを通して作る。
True / Population
distribution
sample
Data
approximate
Model


# Page. 7

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

機械学習 as 関数近似（kind of）
ML =
1. データがあるときに、それに一番fitする線を引く
2. データのノイズを学んでしまうことを防ぐために、
regularizeする。
1と2を合わせて、近似関数のfit度を客観的に説明す
るために、損失関数を定義し、それを最小化する。
1
2
L(𝜃) = 𝑦 − 𝑦ො𝜃 + 𝑤
𝑎𝑟𝑔min 𝐿(𝜃)
𝜃


# Page. 8

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

機械学習 as データに対する値の振り分け
• もっとlow-levelに見ると、データを境界線でグループに分けて、
それぞれに固有の値を当てはめている
（単回帰は全てのグ
ループに一つの値しか
ない、グループ分けと
考えることができ
る。）
class1
特徴 x_2
class1
class1
特徴 x_2
class1
class1
class2
データを小分けにした後、
分類の場合はクラスを
振って、回帰の場合は実
数を振る。
class2
特徴 x_1
特徴 x_1
決定木
サポートベクターマシン


# Page. 9

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

機械学習 as データに対する値の振り分け
- 特徴量3つ
- 回帰
- （決定木）
の場合：
それぞれのグループは直
方体で表される（平面をz
軸に伸ばす）
画像のソース:
https://github.com/parrt/dtreeviz


# Page. 10

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

機械学習 as if-elseの自動生成
前のスライドの「データの小分け&amp;値の振り分け」は、
「if-elseの生成」だと言い換えることができる。
決定木
if x &gt; 10:
return 5
else:
if y in {class1}:
return 30
else:
return 20
特徴x &gt; 10
同じ
特徴y in
{class1}
Oup=5
Oup=30
Oup=20


# Page. 11

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

主題: ニューラルネットワーク
をlow-levelに見る


# Page. 12

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

問題設定
一般的なニューラルネットワーク
特徴量が一つしかない、回帰用のニューラルネットワークを
考える。また、隠れ層は1つで、二つのノードがあることを
考える。
b
今回扱うニューラルネットワーク
1
左のニューラルネットワークの𝑤1 とb、
1
𝑤2 とb、を媒介変数で表示することで、
以下のようなシンプルなネットワークを考
える。活性化関数にはステップ関数を使う。
𝑠1
𝑤1
𝑤1
1
input
𝑤2
1
2
𝑤2
2
𝑤1
output
input
2
𝑤2
𝑠2
2
output


# Page. 13

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

問題設定2
1
ここではインプットに対
して何もせず、活性化関
数の部分で、インプット
がs_1以上だったら、発火
させる。
後の説明を分かりやすくするために、𝑤1
1
とb、 𝑤2 とb、それぞれを、媒介変数𝑠1 と𝑠2 を
使い表現する。これらは、hidden nodeのstep
関数の発火閾値を示す。
𝑠1
𝑤1
2
1
input
𝑤2
𝑠2
2
output
𝑥𝑤1 + 𝑏 ≥ 0
1
𝑥 ≥ −𝑏/𝑤1
1
𝑠1 ≔ −𝑏/𝑤1
=&gt; step関数は𝑠1 以上だと発火する。𝑠2 も同様に
1
（ 𝑤2 を使って）定義する。


# Page. 14

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

計算例
入力値が4だとすると、
s_1 =
上のルート：
4&gt;3だから、1が右に流れて、
1*5=5だから5がoutput node
に届く。
下のルート：
4&lt;5だから、0が右に流れて、
0*10=0だから、0がoutput
nodeに届く。
s_2 =
よって、上のルートから流れ
てくる信号と下のルートから
流れてくる信号を足して、
5+0=5が出力となる。


# Page. 15

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

重要なimplication
閾値 s_1 = 3
5
Result Combined
input
output
10
閾値 s_2 = 5
ここで重要なのはインプットが真ん中のレイヤー
を通るときに三つのパターンがあるということ。
1) （上と下のノードの）どちらも発火（＝閾値
以下になる）しない
2) 片方が発火する
3) 両方が発火する
例えば、左の例についてそれぞれの入力値につい
て、
1) 3未満だとどちらのノードも発火しない
2) 3以上かつ5未満だと上のノードだけ発火する
3) 5以上だと両方が発火する


# Page. 16

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

Exploration 1 – 入力値を変えてみる
• いろんな入力値を前のneural networkに入れてみて、その出力
値をグラフにしてみる。
閾値 s_1=3
5
15
Result Combined
5
input
output
10
閾値 s_2 = 5
0
3
5


# Page. 17

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

Exploration 1 – 入力値を変えてみる
関数に三つのbump(違う高さの線)があることが分かる。これは
先ほど挙げた隠れ層の発火の仕方が三通りあるからだ。
1) 3未満だとどちらのノードも発火しない→それぞれのルートの
出力は0*5=0と0*10=0→最終的な出力値は0+0=0
2) 3以上かつ5未満だと上のノードだけ発火する→それぞれに
ルートの出力値は1*5=5と0*10=0→最終的な出力値は0+5=5
3) 5以上だと、両方のノードが発火する→それぞれにルートの出
力値は1*5=5と1*10=10 →5+10=15


# Page. 18

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

Exploration 2 – 閾値 (wとb)を変えてみる
• ここで閾値s_1, s_2を変えるとグラフがどう変わるか見てみる。
• まずは重みを変えてみる。→ 下のルートの重みを10から-7に変
えると、両方のニューロンが発火した場合、-7+5=-2となるこ
とが分かる
閾値=3
5
Result Combined
5
input
output
-7
閾値=5
0
-2
3
5


# Page. 19

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

Exploration 2 – 閾値 (wとb)を変えてみる
• もともと3以上なら、発火していたが、閾値を0にしたことで、
0以上でも出力値が5以上になっていることが分かる。
閾値=0
15
5
Result Combined
5
input
output
10
閾値=5
-1
0
3
5


# Page. 20

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

Exploration 2 – 閾値 (wとb)を変えてみる
• つまり閾値をいくつか用意して、インプットがその内どれくら
い当てはまるかで、アウトプットの値を変えてる。
• 何も当てはまらなかったらoutput=0で、1つ当てはまったら
output=aで、2つ当てはまったらoutput=bで、…
• これによって、「この範囲のインプットは、aくらいの大きさ
のアウトプットで」、「また別の範囲のインプットはbくらい
の大きさのアウトプット」のように様々な関数を表現できるよ
うになる。


# Page. 21

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

結論1? ～ 「振り分け」の考え方で
Neural networkのパラメター（閾
値・重み）を変えることで、1次元の
場合分けをカスタムに変更すること
ができる＝様々な関数を生成できる
最初の層がデータを小分けにして、
最後の層のwがそれぞれのグループ
に値を振り分けている。


# Page. 22

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

結論1? ～ 「振り分け」の考え方で
閾値=4
単純計算をすれば、
一層しかない場合、発火される
combinationは全部で、#hidden nodes
個。(これは、node Aが発火された場合、
𝑠𝐴 以下の閾値sを持つ全てのnodeも発
火されるから）
閾値=3
7
8
閾値=0
5
input
→ 与えられたデータに対して、
#hidden nodes個の小分けができ、そ
れぞれに違う値を振り分けることがで
きる。
output
10
閾値=5
→1層でも無限にhidden nodeを増やせ
ば、無限個のグループが作れる。→
smoothな近似関数を作ることが可能


# Page. 23

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

結論2? – if-elseの考え方で
• これは、if-elseで場合分けしてるのと同じ
if input &lt; threshold A:
return 0
elif input &gt;= threshold A and input &lt; threshold B:
return w_1
else:
# input &gt;= threshold B
return w_2


# Page. 24

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

Exploration – width vs. height of NN
8
5
output
output
10
縦に長くする（#node per hidden layerを増や
す）
横に長くする（hidden layerを増やす）
どっちの方がいいのか？


# Page. 25

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

Exploration – width vs. height of NN
前提：どちらでも、どんな関数でも近似できる。
横にすると、[# hidden nodes/layer]**l個分のパ
ターンができる(lはレイヤー数)。
（これは、一層目の後の発火パターンはn個で、
次の層では、n個それぞれにつき、また、n個の発
火パターンが考えられるから。）
→ノード数が少なくても、莫大なパターンを作り
出すことができる。
output


# Page. 26

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

Exploration – width vs. height of NN
widthとheightを増やすことの違いはインプットスペースの分割の仕方の違いから見ることができる
0
3
5
一層目がデータのグルー
プ化全てを担当している。
0
3
5
赤：一層目のhidden layerによるデータの小分け
緑：二層目のhidden layerによるデータの小分け
→最初のレイヤーが大雑把にデータをグループ化して、次
のレイヤー、それをさらに細かくグループ化していくイ
メージ


# Page. 27

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

画像系のarchitectureはheightを増やす
https://stackoverflow.com/questions/38450104/how-tovisualize-filters-after-the-1st-layer-trained-by-cnns
https://stackoverflow.com/questions/38652638/how-topropagate-error-from-the-conv-layer-to-previous-layer-inlenet-5-cnn
画像のように元のデータにノイズが多い （＝単語で表される画像内の被写体についての情報に比
べて、冗長な情報が多い）場合、徐々にデータの特徴を掴み＆分類していった方がいい→height
を増やした方がいい。


# Page. 28

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

念のために：
• ここで説明したのはneural networkがどんな関数でも表現できると
いう話
• いくらどんな関数でも表現できるからと言って、データに一番合う
関数を「学習」できるとは限らない。
• backpropを使う場合、ニューラルネットワーク内の全てにstableな
gradientが存在していないといけない。そのため、上の例ではstep
関数を活性化関数として用いたがこれを、sigmoidやrelu (または
もっと高度な活性化関数)が使われる必要がある。
• 時間があったら、どうゆう機能やレイヤーがあれば、ニューラル
ネットワークが上手く学習できるのか、についてもスライドを投稿
する。


# Page. 29

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

参考
• 1次元のインプットだけではなく、2次元以上のインプットにつ
いても説明してくれてる
• http://neuralnetworksanddeeplearning.com/chap4.html


