O'Reilly Japan - ゼロから作るDeep Learning
ニューラルネットワーク
- パーセプトロンの章ではパラメータを手動で設定していた
- ニューラルネットワークはデータから自動で適切なパラメータを学習できる
- 入力層・中間(隠れ)層・出力層に分かれる。
- 2層では第0層が入力、第1層が中間、第2層が出力。
- パーセプトロンのバイアスを図示する
- 重みがbで入力が常に1の信号
- パーセプトロンの式を変換
h(x)
は入力が0を超えたら1を返す関数。y = h(b + w1x1 + w2x2)
に変換- h(x)は活性化関数と呼ばれる。(入力の総和を出力に変換)
- さらに変換
a = b + w1x1 + w2x2
y = h(a)
- 重み付き信号の和がaとなり、活性化関数h()によってyに変換される
- ステップ(階段)関数
- 閾値を境に出力が変わる
- パーセプトロンは、活性化関数にステップ関数を用いている、と言える
- NumPyの配列に不等号を演算を行うとboolが返ってくる。それをintにすればステップ関数になる。
- シグモイド関数
- ステップ関数のように0か1ではなく連続的な実数を返す
- 入力が小さい時は0に近く、大きい時は1に近づくのはステップと同じ
- 出力が0から1の間におさまるのも同じ
- 非線形関数
- 関数とは変換器。出力が入力の定数倍になるものは線形関数
- ステップもシグモイドも非線形。直線ではない。
- ニューラルネットワークでは非線形を活性化関数として使う必要がある。層を重ねる恩恵を受けるため。
- ReLU関数
- 0以下なら0を返し、0より大きければ入力をそのまま返す。
多次元配列
- np.dotで内積を計算できる
- 次元数は合わせる必要がある
- x1, x2からy1, y2, y3を求めるような計算が1度にできる
X = np.array([1, 2])
W = np.array([1, 3, 5], [2, 4, 6])
Y = np.dot(X, W)
print(Y) # [5, 11, 17]
3層ニューラルネットワーク
- np.arrayを使うと簡単に実装できる
- 恒等関数
- 入力をそのまま出力する
- 回帰問題では出力層の活性化関数にこれを使う
- 2クラス分類ではシグモイド、多クラス分類ではソフトマックス
- 分類問題
- データがどのクラスに属するか
- 回帰問題
- データから予測を行う(写真から体重を当てるなど)
- ソフトマックス
- 全ての入力から影響を受ける
- すぐオーバーフローするので実装する際は、入力の最大値を引くなどの対策をする
- 出力の総和が1になる
- 確率として扱える
- 各出力間の大小関係は変わらない。無駄な計算資源使わないために推論時は省略する。学習時には使う。
手書き数字認識
- MNISTのデータを使う
- 28 x 28の画像
- 訓練画像60000、テスト画像10000
- 入力は784(28x28)
- 出力は10(0〜9の10クラス分類)
- 隠れ層は50と100(この数は任意)
- 前処理
- 入力データに対する変換
- 正規化(データを決まった範囲に収める、今回は255段階のピクセルデータを0.0〜1.0にした)など
- 学習済みの重みを使う
- バッチ処理
- 演算ライブラリは大きな配列を高速に処理できるように最適化されている
- まとめて処理させることで高速化できる