Skip to content

DNET_NeuralNetwork

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

ニューラルネットワーク

概要

モデル

  • 脳機能に見られるいくつかの特性に類似した数理的モデル(確率モデルの一種)

  • シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、
    学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般。

  • 実際に生物の神経系のシミュレーションであるか否かについては
    議論があるため人工ニューラルネットワークなどと呼ばれることもある。

学習

ニューラルネットワークは、

  • ネットワークにループする結合を持たず、

    • 単一方向へのみ信号が伝播する。
 第0層        第1層          第2層
 入力層 → 中間層(隠れ層) → 出力層
  • 機械学習の、

    • 学習フェーズでは、信号は逆方向に伝播する。
    • 推論フェーズでは、信号は順方向に伝播する。
  • 多層パーセプトロン

    • パーセプトロンでは、活性化関数にStep関数(段階関数)を
      使用していたが、ニューラルネットワークでは、
      これ以外の活性化関数(Sigmoid関数、ReLU関数)を使用する。

    • 線形の座標変換(アフィン変換)をしたモノに対して
      目盛の振り直しを行い新しい非線形の座標系を作る。
      「重み」によって「新しい非線形の座標系」が変わる。

    • 参考

「重み」のパラメタの決定

  • 「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。
    という問題を、データから自動で「重み」のパラメタを学習することで解決する。

  • ニューラルネットワークとは微分
    DS:数学的基礎 - 微分・偏微分)可能な変換が
    幾つも連なってできた一つの大きな合成関数で、
    この微分は逆伝播の連鎖律で計算できる。

  • 従って、ネットワーク構造が複雑であっても、
    合成関数を構成する個々の変換が微分可能であれば、
    勾配法によって目的関数(損失関数)
    (いずれも ニューラルネットワーク(学習)の該当節を参照)を
    最適化することで(収束するかどうかは別にして)求めることが出来る。

構造

第0層(入力層)

そのままの値を出力(出力に重みを掛けられる)。

第1層(中間層(隠れ層))

  • 入出力変換後、重みを掛けて多分岐。
  • 以下のような関数を使用できる。

第2層(出力層)

  • 0、1の間の値に変換(全部の和が1となるように正規化する場合もある)
  • これにはSigmoid関数またはSoftmax関数
    ニューラルネットワーク(推論)の該当節を参照)が必要。

誤差の計算と重みの更新

出力と教師信号の誤差の計算をし、
2→1→0層と層の重みを更新していく
(誤差逆伝播法、深層学習の誤差逆伝播法

数学的に

関数

関数はニューラルネットワーク全体で1つの関数、個々の合成関数。

  • (x) → (z) → (w) → (p)
  • ◯ → ◯ の「→」の部分が関数と重み(重みは入力に掛ける値)
 (x) ─ f1(x1, x2, x3, ...) → (z) ─ f2(z1, z2, z3, ...) → (w) ─ f3(w1, w2, w3, ...) → (p)

特徴

  • 複雑性(表現力)、計算可能性

  • 深くする(p=fn(...f3(f2(f1(x)))...)と
    少ないパラメタで複雑(≒ 高次)な関数を作れる。

    • 1次関数だと複雑にならない。
    • 2次関数だとパラメタが多過ぎ。
    • 非線形なΦ(活性化関数)に1次関数(w1x1+w2x2+w3x3+...+b)を入力
 z1 = Φ1(w11x1 + w12x2 + w13x3 + ... + b1)
 z2 = Φ1(w21x1 + w22x2 + w23x3 + ... + b2)
 ...
 zn = Φ1(wn1x1 + wn2x2 + wn3x3 + ... + bn)

計算

入力層~中間層の

上記を行列計算に出来る。

 (t1,t2,t3,t4) = (x1,x2,x3,x4)┌w11,w12,w13,w14┐ + (b1,b2,b3,b4)
                              │w21,w22,w23,w24│
                              │w31,w32,w33,w34│
                              │w41,w42,w43,w44│
                              │w51,w52,w53,w54│
                              └w61,w62,w63,w64┘
 (z1,z2,z3,z4) = Φ((t1,t2,t3,t4))
 ┌t11,t12,t13,t14┐   ┌x11,x12,x13,x14┐┌w11,w12,w13,w14┐   ┌b1,b2,b3,b4┐
 │t21,t22,t23,t24│ = │x21,x22,x23,x24││w21,w22,w23,w24│ + │b1,b2,b3,b4│
 └t31,t32,t33,t34┘   └x31,x32,x33,x34┘│w31,w32,w33,w34│   └b1,b2,b3,b4┘
                                          │w41,w42,w43,w44│
                                          │w51,w52,w53,w54│
                                          └w61,w62,w63,w64┘

 ┌z11,z12,z13,z14┐      ┌t11,t12,t13,t14┐
 │z21,z22,z23,z24│ = Φ(│t21,t22,t23,t24│)
 └z31,z32,z33,z34┘      └t31,t32,t33,t34┘

出力層と誤差計算

 softmax((p1,p2)) = (f1,f2)
  • バッチ
         ┌p11,p12┐    ┌f11,f12┐
 softmax(│p21,p22│) = │f21,f22│
         └p31,p32┘    └f31,f32┘
 cross_entropy_error((f1,f2)) = (l1,l2)
  • バッチ
                     ┌f11,f12┐    ┌l11,l12┐
 cross_entropy_error(│f21,f22│) = │l21,l22│
                     └f31,f32┘    └l31,l32┘

活性化関数

  • 各層の出力する前に、出力結果をどの程度活性(発火)させるかを決める関数。

  • ニューラルネットワークでは、非線形な関数を使用する必要がある。

    • 線形関数を用いてはならないのは、多層化の意味が無くなるため。
    • 例 : 線形な h(x) = cx を多層化しても h(h(h(x))) = cccx となり1層で表現可能。
  • Step関数Sigmoid関数tanh関数
    ReLU関数がある。

  • また、出力層の活性化関数には、Sigmoid関数、Softmax関数がある。

  • しかし、最近は、勾配消失問題を防ぐReLU関数の利用が主流
    なっている。

Step関数とSigmoid関数

共通点

  • 微分可能な非線形な関数
  • 0 <= 出力信号 <= 1 に収める。
  • 入力信号が重要な時に1(に近い)、重要でない時0(に近い)値を返す。

相違点

Step関数

 f(x) = 1 (x ≧ 0)
 f(x) = 0 (x < 0)

実装(Step関数)

なんとなくAPI仕様を知らないと難しい感じ。

  • パターン1
"""This is a test program."""

import numpy as np

def step_function(x_1):
    """This is a test program."""
    y_1 = x_1 > 0
    return y_1.astype(np.int)
  • パターン2
"""This is a test program."""

import numpy as np

def step_function(x_1):
    """This is a test program."""
    return np.array(x_1 > 0, dtype=np.int)

※ 0、1を真偽のキャストで返しているのがトリッキーだよ。

グラフ(Step関数)

-5.0 ~ 5.0までの0.1刻みのプロットをStep関数にかけてグラフ化する。

"""This is a test program."""

import numpy as np
import matplotlib.pylab as plt

def step_function(x_1):
    """This is a test program."""
    # 上記のいずれかの実装を選択。

X = np.arange(-5.0, 5.0, 0.1)
Y = step_function(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)  # 図で描画するy軸の範囲を指定
plt.show()

step関数グラフ

Sigmoid関数

もともと出力層の活性化関数から転用されたものなので
詳細はそちらを参照。

 f(x) = 1 / (1 + e^-x)

               1
 h(x) = ────────
         1 + exp(-x)
  • 特徴

    • exp(-x)とは、eの-x乗を意味し、eはネイピア数
      DS:数学的基礎 - 微分・偏微分の該当節を参照)
      (2.7182)の実数を表す。

    • 微分値は、以下の式で表され、最大勾配はX=0の時でf(0)=0.5なので0.5(1-0.5)=0.25

  f'(x) = f(x)(1-f(x))
  • 最大勾配は0.25で勾配消失問題を引き起こし易い
    (昔の勾配消失の主因)。

実装(Sigmoid関数)

ポイントは、Pythonのブロードキャストによって配列も計算できる点。

"""This is a test program."""

import numpy as np

def sigmoid(x_1):
    """This is a test program."""
    return 1 / (1 + np.exp(-x_1))

グラフ(Sigmoid関数)

-5.0 ~ 5.0までの0.1刻みのプロットをSigmoid関数にかけてグラフ化する。

"""This is a test program."""

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x_1):
    """This is a test program."""
    return 1 / (1 + np.exp(-x_1))

X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()

sigmoid関数グラフ

温度パラメタ

  • 上記は標準Sigmoid関数で、温度パラメタ = 1の場合。

  • 一般的なSigmoid関数は以下の温度パラメタの逆数aを使って表現される。

  • 正確には、温度パラメタは Tnで、a = 1/Tn、Tn = 1/a となる。

 f(x) = 1 / (1 + e^(-x * a))

               1
 h(x) = ────────
         1 + exp(-x * a)
  • 実装
"""This is a test program."""

import numpy as np

def sigmoid(x, a):
    """This is a test program."""
    return 1 / (1 + np.exp(-x * a))
  • 形状の変化

温度パラメタ

tanh関数

  • tanh(Hyperbolic tangent function)関数、双曲線正接関数

 f(x) = (e^x - e^-x) / (e^x + e^-x)
  • 特徴

    • あらゆる入力値を-1.0~1.0の範囲の数値に変換して出力する関数である。

    • Sigmoid関数より勾配消失に強い。

      • 微分値は、以下の式で表され、
        最大勾配はX=0の時でf(0)=0なので (1.0 - 0.0^2) = 1.0
 f(x)' = 1 - f(x)^2
- 最大勾配は[Sigmoid関数](#sigmoid関数)が0.25、tanh関数が1.0なので、\
  [勾配消失問題](#勾配消失問題が起こる)を引き起こし難く、学習をより高速化させる。

- ただ、それでも勾配消失問題は発生する\
  (非常に深いネットワークでは勾配消失問題は防ぎ難い)

実装(tanh関数)

def tanh(x):
    y = np.tanh(x)
    return y

グラフ(tanh関数)

x = np.arange(-10.0, 10.0, 0.1)
y = tanh(x)
plt.plot(x, y)
plt.ylim(-1.2, 1.2)
plt.show()

tanh関数グラフ

ReLU関数

  • ReLU(Rectified Linear Unit)関数、正規化線形関数

 f(x) = x (x ≧ 0) → 傾き 1
 f(x) = 0 (x < 0)  → 傾き 0

            ┌
            │0 ( a <= 0 )
 y = h(a) = <
            │a ( a > 0 )
            └
  • 特徴
    勾配消失問題を防ぐ関数として主流。
    • 入力 x が0を超えていれば x をそのまま出力する。(傾き 1)
    • 入力 x が0以下なら0を出力する。(傾き 0)

主流

  • 最近の主流。

  • その理由は、

    • Sigmoid関数の利用は

      • ...ロジスティック回帰などの名残
      • ...勾配消失問題を引き起こす問題がある。
    • ReLU関数

      • ...は勾配消失問題を緩和できる。
        ・微分結果が 0 or 1 なので、
        ・ただし、0(の時は)では学習が上手くいかない。

      • ...は非常にシンプルで学習時間が短縮される。

実装(ReLU関数)

np.maximumとか知らんわwと思ってググると、大きい方を返すと。
(つまり、xが、0以下のときは0が返り、0以上になるとxの値が返る。)

"""This is a test program."""

import numpy as np

def relu(x_1):
    """This is a test program."""
    return np.maximum(0, x_1)

移行メモ(正誤): 元ページの実装は引数 x_1 に対して np.maximum(0, x)
なっていたため np.maximum(0, x_1) に修正した。

グラフ(ReLU関数)

-5.0 ~ 5.0までの0.1刻みのプロットをReLU関数にかけてグラフ化する。

"""This is a test program."""

import numpy as np
import matplotlib.pylab as plt

def relu(x_1):
    """This is a test program."""
    return np.maximum(0, x_1)

X = np.arange(-5.0, 5.0, 0.1)
Y = relu(X)
plt.plot(X, Y)
plt.ylim(-0.1, 5.1)
plt.show()

ReLU関数グラフ

ReLU派生系

Leaky ReLU関数

 f(x) = x (x ≧ 0)
 f(x) = αx (x < 0)(※αは0.01)
  • 特徴

    • x < 0において、僅かな傾きをもっている。
    • 微分値が0になることはなくなり、
      ReLUよりも勾配消失問題を引き起こし難い。
  • 実装
    np.where は三項演算子のベクトル版

def leaky_relu(x, alpha=0.01):
    y = np.where(x > 0, x , alpha * x)
    return y
  • グラフ
x = np.arange(-5.0, 5.0, 0.1)
y = leaky_relu(x, alpha=0.1)
plt.plot(x, y)
plt.ylim(-1.0, 5.5)
plt.show()

Leaky ReLU関数グラフ

Parametric ReLU

LeakyReLU の < 0 部分の直線の傾きを「学習によって最適化」

Randomized ReLU

LeakyReLU の < 0 部分の直線の傾きを「ランダムに試す」

移行メモ(正誤): 元ページの「く 0 部分」は「< 0 部分」の
誤変換と判断し修正した。

その他の活性化関数

Absolute value rectification

主に物体認識に使用されている。

def abs_relu(x):
    return np.abs(x)

Maxout関数

  • ReLUをさらに一般化した関数

    • ReLUの2つの定義域をK個に拡張し、領域毎に異なる関数を用意。
    • 区分線形凸関数を学習する(=活性化関数自体を学習する)。
    • kが十分大きければどんな凸関数も任意の精度で近似できる。
  • Dropout(深層学習のテクニックの該当節を参照)と
    組み合わせることで高い精度が得られる。

GELU関数

GELU(Gaussian Error Linear Units)は、GPTやBERTで使われている。

出力層の活性化関数

いずれも ニューラルネットワーク(推論)の該当節を参照。

恒等関数

Sigmoid関数(出力層)

Softmax関数

推論と学習

ニューラルネットワーク(推論)

ニューラルネットワーク(推論)

ニューラルネットワーク(学習)

ニューラルネットワーク(学習)

深層学習の誤差逆伝播法

深層学習の誤差逆伝播法

ニューラルネットワークの問題点

出力の分布

いずれも 深層学習のテクニックの該当節を参照。

重みの初期値

バッチ正規化

過学習を起こし易い

過学習は 機械学習の該当節を参照。

概要(過学習)

  • 従来手法よりも過学習を起こし易い。
  • データサンプルは、パラメータの10倍あると良い。
  • 少ないデータ量でもできるだけ性能を落とさずに済むような工夫が新たに必要。

解決(過学習)

深層学習のテクニックの該当節を参照。

実装(過学習)

学習率の調整が難しい

概要(学習率)

学習率とは、

  • 一回の学習でどれだけ学習するか?
    =どれだけパラメタ更新するか?で、

  • 学習率が従来の機械学習の手法よりも大きく影響する。

  • 学習率が

    • 学習率が適切な場合、
      スムーズに学習が進行する。

    • 小さ過ぎると

      • 収束後は安定するものの、
      • 収束までに時間がかかり過ぎる。
    • 大き過ぎると

      • 素早く学習完了するものの、
      • 発散(≒ 極小値周辺を行ったり来たり)する。
      • 著しく大きい場合、学習するほど誤差が増える。

移行メモ(正誤): 元ページの「どれだけ学習るか?」は「学習するか?」、
「素早く学習官僚するものの」は「素早く学習完了するものの」の
誤記・誤変換と判断し修正した。

解決(学習率)

  • 調整

    • 一般的に、10^-1(0.1)~10^-6(0.000001)の間で調整。

    • もしくは、学習率が自動調整されるような工夫がある。

勾配消失問題が起こる

誤差逆伝播法(深層学習の誤差逆伝播法)の
計算において入力層に近い手前の層まで学習が行き渡らなくなる現象

理由

  • 誤差逆伝播法では奥にある出力層から、手前にある入力層へ順番に伝わる。

  • 活性化関数Sigmoid関数を使用する場合、
    微分値が最大でも+0.25

  • 勾配の値は層を遡るほど連鎖律
    DS:数学的基礎 - 微分・偏微分の該当節を参照)で
    1未満の値のかけ算する回数が増え小さくなる。

  • このため、

    • 手前の層ほど学習の際に用いる勾配の値が小さくなり、
    • 手前の層ほど十分なパラメタの更新ができなくなる。

解決(勾配消失問題)

により(事前学習とファイン・チューニングを用いず、)
全体の学習ができるようになった。

ニューラルネットワークの色々

一般的なフツーのニューラルネットワーク

順伝播型ニューラルネットワーク(FNN)

(Feedforward Neural Network: FNN)

  • DNNCNNなどは、FNNになる。
  • 多分、RNNの登場で出来た区分

ディープニューラルネットワーク(DNN)

(Deep Neural Network: DNN)

DNNの説明は本項で行われています。

  • ニューラルネットワーク内の層が多層(ディープ)化されている仕組み

  • DNNを用いた近似は、非線形関数である活性化関数を何層にも
    組み合わせることで多種・多様な強い表現力を獲得することが可能

  • 線形の座標変換(アフィン変換)をしたモノに対して目盛の振り直しを行い、
    新しい非線形の座標系を作る。
    "重み"によって"新しい非線形の座標系"を変えることで、
    現象を高次元の関数で近似することが出来る。

畳み込みニューラルネットワーク(CNN)

畳み込みニューラルネットワーク(CNN)

再帰型ニューラルネットワーク(RNN)

再帰型ニューラルネットワーク(RNN)

長短期記憶ニューラルネットワーク(LSTM)

長短期記憶ニューラルネットワーク(LSTM)

RNN Encoder-Decoder(Sequence-to-Sequence)

RNN Encoder-Decoder(Sequence-to-Sequence)

生成モデル系のニューラルネットワーク

生成モデルは 機械学習の理論の該当節を参照。

敵対的生成ネットワーク(GAN)

敵対的生成ネットワーク(GAN)

制限ボルツマン・マシン(RBM)

特徴(RBM)

  • Restricted Boltzmann Machine

  • ボルツマン・マシンは変数の組合せが
    どのような頻度で出現するかを確率分布で表現する。

  • 深層信念ネットワーク(2006, ジェフリー・ヒントン)

RBMでできること

  • 音声認識ソフトウェアの性能の向上

3D DNN

アプローチ

  • 2Dベースのアプローチを結集する2D based approach

    • Complex YOLO
    • YOLO 3D
  • 点群NNを適応するPoint cloud based approach

    • PointNet
    • PointNet++
    • VoteNet
  • 画像から得た結果と点群NNをフュージョンするアプローチ

    • Frustrum PointNets
  • 点群NNで点群を前処理(エンコード)した後に
    2Dベースのアプローチを適応するPointCloud+2Dアプローチ

    • VoxelNet
    • Pointpillars

点群データ

画像処理とコンピュータビジョンの該当節を参照。

  • 順不同なデータ構造
  • 非自明な隣接関係(畳み込み)
  • 回転・並進の取り扱いが難しい

3D DNNでできること

いずれも 画像処理とコンピュータビジョン(AI)の該当節を参照。

  • 物体検出

    • VoxelNet
    • VoteNet
  • 領域検出
    ...

  • 特定物体検出
    ...

  • 把持位置検出
    PointNetGPD

深層Qネットワーク(DQN)

(Deep Q-Network: DQN)

特徴(DQN)

  • 強化学習(機械学習の該当節を参照)に
    深層学習を適用し成功した一つの例

    • 深層強化学習(機械学習の該当節を参照)のアルゴリズム
    • 強化学習の構造中にニューラルネットワークを埋め込む。
    • 連続値の行動とそれに伴う高い報酬(Q)が得られるように学習する。
  • Q学習と呼ばれるアルゴリズムに基づいており、

    • 行動価値関数 Q (s,a) (状態sで行動αを選び、
      その後方策に従った場合の期待累積報酬r) を
      真の価値関数に近づけるように更新していく。
    • 価値関数をDNNにより近似する手法はDQNが登場するよりも古くから
      提案されていたが、学習が不安定と言う課題に取り組んだ点がDQNの貢献。
  • DQNが解決に取り組んだ学習の不安定化要因は大きく3つ

    • 入力データが時系列データであり、入力データ間に独立性がない。

      • DQNでは「Experience Replay」を適用した。
      • エージェントが経験した状態・行動・報酬・遷移先は一旦メモリに保存される。
      • 損失の計算を行う際には、メモリに保存した値からランダムサンプリングを行う。
    • 価値関数が小さく更新されただけでも方策が大きく変わってしまう。

      • DQNでは「Target Q-Network」を適用した。
      • 学習の目標値の計算に用いる価値関数を一定期間の学習の間、固定する。
      • 一定期間の学習の間、価値関数ネットワークのパラメタを固定し、
        一定周期でこれを更新する。
    • 与えられたタスクによって報酬のスケールが大きく異なる。

      • DQNでは「報酬のクリッピング」を適用した。
      • 報酬の値を [-1, 1] の範囲に制限することで学習を安定させる。
      • 報酬の大小を区別できなくなるデメリットはあるものの
        学習が安定するメリットは大きい。

DQNでできること

深層強化学習の事例(機械学習の該当節を参照)を参照。

参考

Wikipedia

YouTube

いずれも 深層学習(deep learning)の該当節を参照。

深層学習、DNN

RNN、CNN、

, etc.

Blog

Neural networks and deep learning

mizu-mi blog

ゼロから作るDeep Learning

Pythonで学ぶディープラーニングの理論と実装
https://www.oreilly.co.jp/books/9784873117584/

サンプル

https://github.com/oreilly-japan/deep-learning-from-scratch

その他、参考


Tags: 移行, ニューラルネットワーク, 深層学習, 活性化関数, DQN, 開発基盤

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally