正月休みを利用して Deep Learningに関して勉強をしています。
以前、パターン認識系の本を読んでいたのですが、実装をせずに理論だけ学んでいて、いまいち自分の中で理解が進まず挫折していました。
下記に紹介する「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」では、python3系を用いてパーセプトロンから丁寧に実装して理解をすすめることができて
非常に面白いです。
現在勉強中のパーセプトロンとニューラルネットワークについて、箇条書きですが簡単にまとめていきます。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
パーセプトロンとニューラルネットワークの違い
パーセプトロン
ある入力とがあり、それぞれの入力に対する重みと、バイアスbによって出力yが変わる。
パーセプトロンを数式で表すと以下の通りになる
バイアスとは、ニューロンの発火のしやすさをコントロールし、各ノードの重みは、ノードの重要性をコントロールする.
yは入力信号, , の総和の値で決まる.
この総和関数は一般的にステップ関数と呼ばれ、x = 0の点で非連続な関数である。
ニューラルネットワーク
パーセプトロンの考え方を応用したもので、入力層から来たデータが中間層を通過し、最後に出力層で求める出力を表現する。
中間層に関しては、実装に応じて複数の層にまたがる場合がある。
出力層の値は、下記で表されるシグモイド関数(Sigmoid Function)*1できまる。
シグモイド関数は最大が1,最小が0に収束していき、ステップ関数とは違って連続関数である。
パーセプトロンとニューラルネットワークの違い
パーセプトロンとニューラルネットワークの違いは、
入力に対して最終的な出力を行う際の関数(Activation-Functionと呼ばれる)が異なることである。
ステップ関数とシグモイド関数の違い
パーセプトロンにおいてはx = 0において非連続なステップ関数で0か1の2値しか返さない。
それに対してニューラルネットワークにおいては連続関数であるシグモイド関数を用いている。
シグモイド関数は入力に対して連続的に出力が変化し、この特徴がニューラルネットワークにおいて重要な意味を持つ。
ステップ関数とシグモイド関数の共通点
両者の共通点は、どちらも出力の値を 0から1の間の範囲で表せること、そしてどちらも非線形関数であることが共通点。 そしてニューラルネットワークにおいては、活性化関数に非線型関数を使う必要がある。
ニューラルネットワークの活性化関数に非線型関数を使う理由
活性化関数に、線形な関数を使った場合、中間層の無いネットワークで表現できてしまうので、層を深くすることの意味がなくなってしまう。
たとえば 3層のネットワークを構築したとして、 活性化関数を とすると、 となり、
中間層のないネットワークで表現できてしまうためである。
ニューラルネットワークは何を解決するか
パーセプトロンの重み設定(期待する入力と出力をみたすための重みを決める作業)を自動化する
従来のパーセプトロンは、入力に対して望みの出力を得るために、重みを設定する必要があり、非常に手間のかかる作業だった。
ニューラルネットワークは、与えられたデータから自動で学習し、パラメータを自動的に設定できる。
ニューラルネットワークでどういう問題を解くか
ニューラルネットワークは、主に2つの問題に対して有効である
- 分類問題
与えられたデータがどのクラスに属するか判定する
- 回帰問題
ある入力データから、(連続的な)数値の予測を行う
上記2種類の問題では、それぞれ、ニューラルネットワークの出力層で用いる活性化関数が異なる。
回帰問題では恒等関数、分類問題ではソフトマックス関数が一般的に使われている。
恒等関数とは、与えられた入力をそのまま出力するもので、出力に変化はない。
一方、ソフトマックス関数は、以下の数式で表すことができる。
出力層が全部でn個ある場合に、k番目の出力を表す式である。