【ゼロから作るDeep Learning】3章 ニューラルネットワーク

本章ではニューラルネットワークが紹介がされている.
ニューラルネットワークは,多層パーセプトロンに活性化関数の概念が加わったもの(と言える)

ニューラルネットワークの例

f:id:yusuke_ujitoko:20161230095329p:plain:w350
  • 入力層
  • 中間層
    • 隠れ層ともいう
  • 出力層

パーセプトロン

f:id:yusuke_ujitoko:20161230100146p:plain:w250
  • 上図を式で表すと

{} $$ y = h(b + w_{1}x_{1} + w_{2}x_{2}) $$

$$ h(x) = \left\{ \begin{array}{} 0 & ( x \leq 0) \\ 1 & ( x > 0) \end{array} \right. $$

活性化関数の登場

  • 活性化関数{h(x)}(activation function)とは
    • 入力信号の総和を出力信号に変換する関数

  • ステップ関数の実装
def step_function(x):
    y = x > 0
    return y.astype(np.int)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
  • ステップ関数とシグモイド関数の共通点
    • 入力信号が重要な情報であれば大きな値を出力し,重要でなければ小さな値を出力する
    • 入力信号が小さくても大きくても,出力信号の値を0から1の間に押し込める
    • どちらも非線形関数

  • 最近はReLU(Rectified Linear Unit)関数も用いられる
    • 入力が0を超えていれば,その入力をそのまま出力
    • 入力が0以下なら,0を出力

ニューラルネットワークの実装

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def identity_function(x):
    return x

def init_network():
    network = {}
    network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])
    network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])

    return network

def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = identity_function (a3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

出力層の設計

  • 機械学習の問題は分類問題と回帰問題に大別できる
    • 分類問題とは
      • データがどのクラスに属するかという問題
      • 人のうつった画像から性別を分類する
      • 出力層の活性化関数は恒等関数を用いる
    • 回帰問題とは
      • ある入力データから数値の予測を行う
      • 画像から体重を予測する
      • 出力層の活性化関数はソフトマックス関数を用いる

  • ソフトマックス関数
    • {
y_k = \frac{\exp(a_k)}{\sum_{i=1}^{n} exp(a_i)}
}
    • ソフトマックス関数の出力の総和は1となる
      • ソフトマックス関数の出力を確率として解釈できる

本章で学んだこと

  • ニューラルネットワークでは,活性化関数としてシグモイド関数やReLU関数のような滑らかに変化する関数を利用する
  • NumPyの多次元配列をうまく使うことで,ニューラルネットワークを効率よく実装することができる
  • 機械学習の問題は,回帰問題と分類問題に大別できる
  • 出力層で使用する活性化関数は,回帰問題では恒等関数,分類問題ではソフトマックス関数を一般的に利用する
  • 分類問題では,出力層のニューロンの数を分類するクラス数に設定する
  • 入力データのまとまりをバッチと言い,バッチ単位で推論処理を行うことで計算を拘束に行うことができる.

yusuke-ujitoko.hatenablog.com