ゼロから作るDeep Learning 3章 ニューラルネットワーク
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
前回はゼロから作るDeep Learning 2章 パーセプトロン - n3104のブログです。
最近やっと5章まで読み終わりました。前回からだいぶ時間が空いてしまいましたが3章のメモをブログにしました。ついに実際に予測します。といっても学習済みのモデルを使いますけどもw
- 3.1.3 活性化関数の登場
- 図 3 - 4 活性化関数によるプロセスを明示的に図示する
- すごい分かりやすい!
- “「パーセプトロン」という言葉が指すアルゴリズムは、本書では厳密な統一がな されずに使われています。一般的に、「単純パーセプトロン」といえば、それは 単層のネットワークで、活性化関数にステップ関数(閾値を境にして出力が切り 替わる関数)を使用したモデルを指します。「多層パーセプトロン」というと、 それはニューラルネットワーク――多層で、シグモイド関数などの滑らかな活 性化関数を使用するネットワーク――を指すのが一般的です。 ”
- なるほど。
- 図 3 - 4 活性化関数によるプロセスを明示的に図示する
- 3.2 活性化関数
- “つまり、活性化 関数の候補としてたくさんある関数の中で、パーセプトロンは「ステップ関数」を採 用しているのです。パーセプトロンでは活性化関数にステップ関数を用いているなら ば、活性化関数にステップ関数以外の関数を使ったらどうなるのでしょうか? 実は、 活性化関数をステップ関数から別の関数に変更することで、ニューラルネットワーク の世界へと進むことができるのです! ”
- なるほど。この本は概念の説明が丁寧で分かりやすいなー。
- “つまり、活性化 関数の候補としてたくさんある関数の中で、パーセプトロンは「ステップ関数」を採 用しているのです。パーセプトロンでは活性化関数にステップ関数を用いているなら ば、活性化関数にステップ関数以外の関数を使ったらどうなるのでしょうか? 実は、 活性化関数をステップ関数から別の関数に変更することで、ニューラルネットワーク の世界へと進むことができるのです! ”
- 3.2.3 ステップ関数のグラフ
- plt.ylim(-0.1, 1.1) を指定しないとy軸が0-1となり、グラフがただの直線になってしまうw なので、上下に余分に 0.1 ずつ広いy軸にしている模様。
- 3.2.4 シグモイド関数の実装
- “シグモイド関数の実装が NumPy 配列に対応していることは、NumPy のブロー ドキャストに秘密があります(詳しくは「1.5.5 ブロードキャスト」を参照)。ブロー ドキャストの機能により、スカラ値と NumPy 配列での演算が行われると、スカラ値 と NumPy 配列の各要素どうしで演算が行われます。”
- NumPy便利!
- “シグモイド関数の実装が NumPy 配列に対応していることは、NumPy のブロー ドキャストに秘密があります(詳しくは「1.5.5 ブロードキャスト」を参照)。ブロー ドキャストの機能により、スカラ値と NumPy 配列での演算が行われると、スカラ値 と NumPy 配列の各要素どうしで演算が行われます。”
- 3.2.5 シグモイド関数とステップ関数の比較
- こういうことを説明することにとても好感を覚える。概念を説明しようとしていることが伝わってくる。
- 3.2.6 非線形関数
- “活性化関数の説明では、「非線形関数」「線形関数」という用語がよく登場しま す。そもそも関数は、何かの値を入力すれば何かの値を返す「変換器」です。 この変換器に何か入力したとき、出力が入力の定数倍になるような関数を線形 関数と言います(数式で表すと h(x) = cx。c は定数)。そのため、線形関数 はまっすぐな 1 本の直線になります。一方、非線形関数は、読んで字のごとく (「線形関数に非ず」)、線形関数のように単純な 1 本の直線ではない関数を指し ます。”
- 分かりやすい。
- “なぜ線形関数を用いてはならないのでしょうか。それは、線形関数を用いると、 ニューラルネットワークで層を深くすることの意味がなくなってしまうからです。 ”
- ここ、同じように非線形関数の場合で説明が欲しい。y(x) = c × c × c × x とあるが、c が異なる定数の場合はどうなる?
- “活性化関数の説明では、「非線形関数」「線形関数」という用語がよく登場しま す。そもそも関数は、何かの値を入力すれば何かの値を返す「変換器」です。 この変換器に何か入力したとき、出力が入力の定数倍になるような関数を線形 関数と言います(数式で表すと h(x) = cx。c は定数)。そのため、線形関数 はまっすぐな 1 本の直線になります。一方、非線形関数は、読んで字のごとく (「線形関数に非ず」)、線形関数のように単純な 1 本の直線ではない関数を指し ます。”
- 3.3.3 ニューラルネットワークの内積
- あくまでの出力は行ベクトルで、ノードは行列になるのか。
- 3.4 3 層ニューラルネットワークの実装
- ここも分かりやすいなー。各層の入力と活性化関数の分けて記述し、活性化関数の隠れ層と出力層での役割の違いについても明記していて、概念の共通点と差分が把握しやすい。
- バイアス項ってノード毎に違うんっだっけ? ← 違う。ノード毎に学習する。
- 3.5.1 恒等関数とソフトマックス関数
- 恒等関数の場合はノードって1つにするのかな?複数ある場合、どれを採用すればいいかわからないよね。画像みたいにそれぞれの要素をビットマップの各インデックスや色に対応させてるなら別だけど。
- 3.5.2 ソフトマックス関数の実装上の注意
- なるほどなー。式変換てほんと重要だなー。
- 3.5.3 ソフトマックス関数の特徴
- “また、ソフトマックス関数の出力の総和は 1 になります。さて、この総和が 1 になるという性質ですが、これはソフトマックス関数の重要な性質です。この性質の おかげでソフトマックス関数の出力を「確率」として解釈することができます。”
- 実際に確率であるわけではなくて、確率であるとみなすが正しい?
- “ニューラルネットワークのクラス分類では、一般的に、出力の一番大きいニューロ ンに相当するクラスだけを認識結果とします。そして、ソフトマックス関数を適用し ても、出力の一番大きいニューロンの場所は変わりません。そのため、ニューラル ネットワークが分類を行う際には、出力層のソフトマックス関数を省略することがで きます。実際の問題では、指数関数の計算は、それなりにコンピュータの計算が必要になるので、出力層のソフトマックス関数は省略するのが一般的です。”
- そーなんだ!確かに分類したいだけなら数値要らないしなー。
- “また、ソフトマックス関数の出力の総和は 1 になります。さて、この総和が 1 になるという性質ですが、これはソフトマックス関数の重要な性質です。この性質の おかげでソフトマックス関数の出力を「確率」として解釈することができます。”
- 3.6.1 MNIST データセット
- mnist.py
- pickle
- PIL (Python Imaging Library)
- http://www.lifewithpython.com/2013/09/pil.html
- PILが利用できなかったため Pillow をrequirements.txtに追加してインストールした。
- https://pypi.python.org/pypi/Pillow/2.2.1
- http://qiita.com/7280ayubihs/items/13486f7689dc50480949
- pip で入れる場合は Pillow を使うらしい。
- 3.6.2 ニューラルネットワークの推論処理
- 学習済みのモデルを使うのであまり実感はわかないかも。でも、最終形を先に示すという意味ではいいのかも。
- 3.6.3 バッチ処理
- NumPyの素晴らしさが分かってきた。これは便利だなー。
個人的には活性化関数を明示してるのが分かりやすいなーと思いました。Python機械学習プログラミング 達人データサイエンティストによる理論と実践 impress top gearシリーズで単純パーセプトロンを読んだ際はよくわからなかったので。ただ、5章 誤差逆伝播法 まで読むとニューラルネットワークでは活性化関数は意識するの当然なんだと思ったりもしました。そもそも活性化関数レイヤとして実装するので。