1.7K Views
September 16, 23
スライド概要
Low-levelに見るニューラ ルネットワーク Universal Approximation theoremについて
問題定義 • ニューラルネットワークがなぜ関数近似をできるのかはブラッ クボックスになりがち。 • 僕もなんとなく、「たんくさん線形関数を活性化関数で繋げて るから」で理解が終わっていた。 • もう少しlow-levelに、どうやってニューラルネットワークが関 数を近似しているのかを理解したい
目次 1. 前提:機械学習をどう見るか 2. 主題:ニューラルネットワークの理解
前提:low-levelに機械学習を 見る
3つの視点で機械学習を見る 1. 機械学習 as 関数近似 2. 機械学習 as データに対する値の振り分け 3. 機械学習 as if-elseの自動生成
機械学習 as 関数近似 • 機械学習はlow-levelに見るとただの関数近似。 • True/population distributionのモデルをデータを通して作る。 True / Population distribution sample Data approximate Model
機械学習 as 関数近似(kind of) ML = 1. データがあるときに、それに一番fitする線を引く 2. データのノイズを学んでしまうことを防ぐために、 regularizeする。 1と2を合わせて、近似関数のfit度を客観的に説明す るために、損失関数を定義し、それを最小化する。 1 2 L(𝜃) = 𝑦 − 𝑦ො𝜃 + 𝑤 𝑎𝑟𝑔min 𝐿(𝜃) 𝜃
機械学習 as データに対する値の振り分け • もっとlow-levelに見ると、データを境界線でグループに分けて、 それぞれに固有の値を当てはめている (単回帰は全てのグ ループに一つの値しか ない、グループ分けと 考えることができ る。) class1 特徴 x_2 class1 class1 特徴 x_2 class1 class1 class2 データを小分けにした後、 分類の場合はクラスを 振って、回帰の場合は実 数を振る。 class2 特徴 x_1 特徴 x_1 決定木 サポートベクターマシン
機械学習 as データに対する値の振り分け - 特徴量3つ - 回帰 - (決定木) の場合: それぞれのグループは直 方体で表される(平面をz 軸に伸ばす) 画像のソース: https://github.com/parrt/dtreeviz
機械学習 as if-elseの自動生成 前のスライドの「データの小分け&値の振り分け」は、 「if-elseの生成」だと言い換えることができる。 決定木 if x > 10: return 5 else: if y in {class1}: return 30 else: return 20 特徴x > 10 同じ 特徴y in {class1} Oup=5 Oup=30 Oup=20
主題: ニューラルネットワーク をlow-levelに見る
問題設定 一般的なニューラルネットワーク 特徴量が一つしかない、回帰用のニューラルネットワークを 考える。また、隠れ層は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
問題設定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 => step関数は𝑠1 以上だと発火する。𝑠2 も同様に 1 ( 𝑤2 を使って)定義する。
計算例 入力値が4だとすると、 s_1 = 上のルート: 4>3だから、1が右に流れて、 1*5=5だから5がoutput node に届く。 下のルート: 4<5だから、0が右に流れて、 0*10=0だから、0がoutput nodeに届く。 s_2 = よって、上のルートから流れ てくる信号と下のルートから 流れてくる信号を足して、 5+0=5が出力となる。
重要なimplication 閾値 s_1 = 3 5 Result Combined input output 10 閾値 s_2 = 5 ここで重要なのはインプットが真ん中のレイヤー を通るときに三つのパターンがあるということ。 1) (上と下のノードの)どちらも発火(=閾値 以下になる)しない 2) 片方が発火する 3) 両方が発火する 例えば、左の例についてそれぞれの入力値につい て、 1) 3未満だとどちらのノードも発火しない 2) 3以上かつ5未満だと上のノードだけ発火する 3) 5以上だと両方が発火する
Exploration 1 – 入力値を変えてみる • いろんな入力値を前のneural networkに入れてみて、その出力 値をグラフにしてみる。 閾値 s_1=3 5 15 Result Combined 5 input output 10 閾値 s_2 = 5 0 3 5
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
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
Exploration 2 – 閾値 (wとb)を変えてみる • もともと3以上なら、発火していたが、閾値を0にしたことで、 0以上でも出力値が5以上になっていることが分かる。 閾値=0 15 5 Result Combined 5 input output 10 閾値=5 -1 0 3 5
Exploration 2 – 閾値 (wとb)を変えてみる • つまり閾値をいくつか用意して、インプットがその内どれくら い当てはまるかで、アウトプットの値を変えてる。 • 何も当てはまらなかったらoutput=0で、1つ当てはまったら output=aで、2つ当てはまったらoutput=bで、… • これによって、「この範囲のインプットは、aくらいの大きさ のアウトプットで」、「また別の範囲のインプットはbくらい の大きさのアウトプット」のように様々な関数を表現できるよ うになる。
結論1? ~ 「振り分け」の考え方で Neural networkのパラメター(閾 値・重み)を変えることで、1次元の 場合分けをカスタムに変更すること ができる=様々な関数を生成できる 最初の層がデータを小分けにして、 最後の層のwがそれぞれのグループ に値を振り分けている。
結論1? ~ 「振り分け」の考え方で 閾値=4 単純計算をすれば、 一層しかない場合、発火される combinationは全部で、#hidden nodes 個。(これは、node Aが発火された場合、 𝑠𝐴 以下の閾値sを持つ全てのnodeも発 火されるから) 閾値=3 7 8 閾値=0 5 input → 与えられたデータに対して、 #hidden nodes個の小分けができ、そ れぞれに違う値を振り分けることがで きる。 output 10 閾値=5 →1層でも無限にhidden nodeを増やせ ば、無限個のグループが作れる。→ smoothな近似関数を作ることが可能
結論2? – if-elseの考え方で • これは、if-elseで場合分けしてるのと同じ if input < threshold A: return 0 elif input >= threshold A and input < threshold B: return w_1 else: # input >= threshold B return w_2
Exploration – width vs. height of NN 8 5 output output 10 縦に長くする(#node per hidden layerを増や す) 横に長くする(hidden layerを増やす) どっちの方がいいのか?
Exploration – width vs. height of NN 前提:どちらでも、どんな関数でも近似できる。 横にすると、[# hidden nodes/layer]**l個分のパ ターンができる(lはレイヤー数)。 (これは、一層目の後の発火パターンはn個で、 次の層では、n個それぞれにつき、また、n個の発 火パターンが考えられるから。) →ノード数が少なくても、莫大なパターンを作り 出すことができる。 output
Exploration – width vs. height of NN widthとheightを増やすことの違いはインプットスペースの分割の仕方の違いから見ることができる 0 3 5 一層目がデータのグルー プ化全てを担当している。 0 3 5 赤:一層目のhidden layerによるデータの小分け 緑:二層目のhidden layerによるデータの小分け →最初のレイヤーが大雑把にデータをグループ化して、次 のレイヤー、それをさらに細かくグループ化していくイ メージ
画像系の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 を増やした方がいい。
念のために: • ここで説明したのはneural networkがどんな関数でも表現できると いう話 • いくらどんな関数でも表現できるからと言って、データに一番合う 関数を「学習」できるとは限らない。 • backpropを使う場合、ニューラルネットワーク内の全てにstableな gradientが存在していないといけない。そのため、上の例ではstep 関数を活性化関数として用いたがこれを、sigmoidやrelu (または もっと高度な活性化関数)が使われる必要がある。 • 時間があったら、どうゆう機能やレイヤーがあれば、ニューラル ネットワークが上手く学習できるのか、についてもスライドを投稿 する。
参考 • 1次元のインプットだけではなく、2次元以上のインプットにつ いても説明してくれてる • http://neuralnetworksanddeeplearning.com/chap4.html