はじめに
「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」についてのまとめを数回に分けて行いたいと思います。
こちらは2章 パーセプトロンの記事の続きです。まだ読まれていない方は読んでもらった方が理解が深まるかと思います。
YOUTUBEでのおすすめチャンネルは以下の通り
何をまとめるのか
さて、このまとめではpythonのコードを動かしたり、何か実装するということは行いません。
ちなみに、書籍のソースコードはこちらにまとめられています。
なので1章はとばし、2章からのスタートになります。
今回は3章をまとめます。
また、個人的に重要だと思うポイントを記載したいと思います。
3章 ニューラルネットワーク
ニューラルネットワークは、適切な重みをデータから自動で学習できるというのがニューラルネットワークの重要な性質の一つです。
ニューラルネットワークは以下のようになっています。

一番左を「入力層」、真ん中を「中間層」または「隠れ層」、一番右の列を「出力層」と言います。
このネットワークのことを本では、「2層ネットワーク」と呼んでいます。実際に重みを持つ層の数を数えているみたいです。別の本ではネットワークを構成する層に従って「3層ネットワーク」と呼ぶ場合があります。
ニューラルネットワークの中間層の処理を詳しく見てみましょう。図は以下の通りになります。

ニューラルネットワークの中間層は、前の層の入力に重みをかけ、バイアスを足した総和(a)をそのまま次層のノードに渡すのではありません。
前の層の入力に重みをかけ、バイアスを足した総和(a)を活性化関数 (h()) によって変換し、yを出しています。そして次層のノードに渡します。
活性化関数
活性化関数が備えている性質は主に2つあります。
1つ目はある値より小さいと無視して、ある値より大きかったら次に伝えるという点です。
2つ目は微分可能であるということです。
上記の条件を満たす3つの活性化関数を紹介します。

シグモイド関数
- eはネイピア数の2.7182...の実数を表す
- 0から1までの範囲で入力層から受けとった値を表現できる(確率みたいに表せる)
- 重要でない値は小さく、重要な値は大きく表せる
- 非線形なので、微分可能
ハイパボリックタンジェント
- eはネイピア数の2.7182...の実数を表す
- -1から1までの範囲で入力層から受けとった値を表現できる
- 重要でない値はより小さく、重要な値は大きく表せる
- 非線形なので、微分可能
RELU関数
- 入力が0を超えていればその入力をそのまま出力し、0以下ならば0を出力する
- 重要でない値は0で、重要な値はより大きく表せる
- 本当はu=0の時は微分できないが、通例では微分すると1となるとみなして微分可能としている。
行列の積
行列の積の方法は以下の図のようになります。
行列の積により、数字が大きい同士の積の結果は大きく表すことができます。

また、行列でニューラルネットワークの重みを表すことで、数式を簡略化できるのも嬉しいところです。
(以下の図の数式ではバイアスは省略しています)

実際の処理の際に気を付けること
入力は、1つずつではなく「まとまりのあるデータ」にする場合が多いです。
この「まとまりのあるデータ」をバッチと言います。
バッチ処理には、コンピューターにとっても嬉しく、1枚あたりの処理時間を大幅に短縮できるメリットがあります。
また、データ転送がボトルネックになる場合は、バッチ処理を行うことでバス帯域の負荷を低減することができます。
つまり、大きな配列を一度に計算してしまった方が、早く処理が完了します。