今回の記事では、
- ニューラルネットワークの全貌を把握したい
- ニューラルネットワークの簡易辞書が欲しい
- いきなり難しいこと言うのはやめて欲しい
このような方にとって非常に有用な内容になっています。また、頻出用語の意味をザックリ理解することで、「よりレベルの高いテーマの記事を理解しやすくなる」ことが期待できます。
※「入門」がテーマのまとめ記事のため、あまり有名でない用語はとりあげていません。。
ニューラルネットワーク概要
ニューラルネットワークとは、「人間の脳の仕組み」に着想を得て誕生した、画期的な機械学習の手法です。細かい説明はやめて、まずはイメージをつかみましょう。
ニューラルネットワークをイラストで表せば以下の通りです。
これを、少し詳細に表せば以下のようになります。
まだ、詳細概念図を見てもさっぱりわからないはずです。これから、用語を順に確認しながら詳細概念図を理解していきましょう。
基本用語
ニューロン(ノード・ユニット)
ニューラルネットワークにおいて、先ほどの概念図の 〇 をニューロン・ノード・ユニットなどと呼んでいます。そして、それぞれの 〇 は1つの数値を表しているのです。つまり、1列目のn個の 〇 は犬の画像データを1次元ベクトルの数値データに変換していることを意味します。
ニューラルネットワークとパーセプトロン こちらの記事では、ニューロンやその集合体であるパーセプトロンについて、より深い内容と歴史が理解できます。
重み
次に、2列目一番上のニューロンに注目してみましょう。概念図では書ききれなかったのですが、ニューロン間を繋いでいた線には重みがあり、「エッジ」と呼ばれます。以下の図を見てください。
こちらの図で言うと、w1~wnが重みにあたります。重みは、次の列のニューロンの値を算出するのに使われます。次の列のニューロンの値の出し方は、図下部の数式の通りです。このようにして、ニューラルネットワーク内で、入力から出力に向け、次々に値が伝播していきます。
レイヤー
ニューラルネットワークは詳細概念図の通り、“入力層” , “隠れ層” , “出力層” の3層から成り立っています。通常、入力・出力層は1層ですが、隠れ層は複数の層から成り立つ場合が多いです。というのも、多層構造になっている方が一般的に判別精度が高くなるためです。
入力層
入力層はその名の通り、入力データそのものを表しており、最も左にあるニューロン列を指します。今回のニューラルネットワークであれば、犬の画像データを1次元ベクトルにしたものを指します。
隠れ層(中間層)
入力層と出力層の間にある層は、すべて隠れ層と言います。一般的に、隠れ層の値が何を意味している値なのかは、人間にはほとんど理解できません。ニューラルネットワークの種類によって、さまざまな種類の層があります。
全結合層(Fully Connected層)
全結合層は、最も基本的で単純な層です。普通のニューラルネットワークでは、すべてが全結合層で構成されます。しかし、全結合層には欠点があります。全結合層では、空間的な情報が扱えないのです。例えば、画像であればカラー情報まで含めると、空間的(3次元的)な情報であり、扱えません。
ちなみに、詳細概念図はすべてが全結合層で構成されており、ニューロンの1次元ベクトルになっているのが分かると思います。
畳み込み層(Convolution層)
畳み込み層は、フィルタと呼ばれるものを通して、複数の最小データをまとめた特徴量(小さな特徴だと ‘どんな線か’ など。大きな特徴だと ‘鼻とか目’ など)を検出する層です。畳み込み層は1層で複数のフィルタを持ち、そのフィルタの数だけデータが出力されます。
プーリング層(Pooling層)
プーリング層は、入力情報を圧縮する目的で使われる層です。多くの場合、畳み込み層の後に使用されます。以下のメリットがあります。
- 元データ内オブジェクトの多少の位置的・特徴的差異を吸収する
- 過学習(後述)を減らす
- 計算コストが減る
出力層
出力層は、最終的な値を保持するニューロン列を指します。最終的な出力層のニューロンの数は分類される数と一致している必要があります。今回とりあげたニューラルネットワークであれば、犬である確率と犬出ない確率になります。
活性化関数
活性化関数は、「入力値を目的ごとの扱いやすい値に整形する働き」を持ち、用途によってさまざまな種類を選択的に使用します。使われるタイミングはそれぞれのニューロンの出力時で、以下の図ように使用されます。
そして、上図で言えば $f( )$ が活性化関数にあたります。また、使用する活性化関数はレイヤー(層)単位で異なります。では、主な活性化関数を順にみていきましょう。
ステップ
式 : $f(x)=ある閾値(基準値)を越えれば 1, $$越えなければ 0 を返す$
出力範囲 : $0or1$
アナログデータをデジタルデータに変換する際によく用いられます。
シグモイド
式 : $f(x)=\dfrac{1}{1+exp(-x)}$
出力範囲 : $0~1$
2種類の分類問題(犬か犬じゃないか)などでよく使われます。
ソフトマックス
式 : $f(x)=\dfrac{exp(x_k)}{\sum_{i=0}^n exp(x_i)}$
出力範囲 : $0~1$
多種類の分類問題(青か赤か緑か黒か)などでよく使われます。
ReLU
式 : $f(x)=x (x >= 0) , 0 (x < 0)$
出力範囲 : $0~∞$
ディープラーニングにおいてシグモイド関数では、微分誤差が小さすぎて学習(後述)が進まなくなる問題が出現しました。ReLU関数は0以上の値はそのまま出力し、微分誤差の大きさを保つことで、学習が進まなくなる問題を解決します。
詳しくは、なぜReLU活性化関数が使用されるのかをご覧ください。
恒等関数
式 : $f(x)=x$
出力範囲 : $-∞~∞$
入力値がそのまま出力されるため、回帰問題(数値を予想する問題)などでよく使われます。
ニューラルネットワークの種類
ニューラルネットワークはさまざまな種類があり、その用途に応じて使い分ける必要があります。では、ニューラルネットワークの中でも有名なものを順に紹介していきます。ちなみに、深層学習(ディープラーニング)というのは、単にニューラルネットワークを多層に重ねたものを指す言葉です。
CNN(畳み込みニューラルネットワーク)
CNNは、画像認識処理でよく使われるニューラルネットワークです。自然言語処理でも用いられる場合があります。隠れ層では主に、畳み込み層とプーリング層が交互に使用される構成になっている。イラスト化すれば、以下のような感じです。
定番のConvolutonal Newral Network をゼロから理解する は、GIF画像を用いることで、CNNを視覚的に理解できる非常に良い記事です。
RNN(再帰型ニューラルネットワーク)
RNNは、隠れ層でフィードバックを繰り返すことで、時系列データ(音声や動画など)を扱えるニューラルネットワークです。イラスト化すれば、以下のような感じです。
LSTM(Long-Short-Term-Memory)
RNNの一種です。隠れ層のユニットを LSTM block と呼ばれるものに置き換えることで実現しています。RNNにおける長期依存性の問題を解決します。
詳しくは、LSTMネットワークの概要をご覧ください。大変わかりやすくまとまっています。
全結合型
全結合型は、文字通り全結合層のみで構成されているニューラルネットワークです。パラメータ数が多くなりやすいため、層数が少なくなりがち。音声認識の分野で使われる場合が多いです。イメージは以下の通り。
その他
オートエンコーダ
画像のノイズ除去や可視化で用いられる。しかし、今では実用的な用途としては用いられていない。(と、kerasチュートリアルに書いてある)
ボルツマンマシン
理論的には難しい組み合わせの問題解決が可能。しかし、数多くの問題があり、今は実用的ではない。
学習(重みの決定)
ニューラルネットワークに、重み が存在するのは初めのほうで紹介しました。では、その 重み はどのようにして決定すればよいと思いますか? 重み は誤差を小さくする(分類問題なら正答率を上げるとか)ように何度も更新することで徐々に決定していくのです。
この 重み をより良い値(誤差が小さい)に決定する作業を学習と呼びます。そして、学習は重みを更新する頻度によって種類が分かれています。
学習に関する基本用語
学習の種類について紹介する前に、基本的な用語を押さえておきましょう。
訓練データ
訓練データとは、名前の通りニューラルネットワークの訓練(学習)をするために用いられるデータです。
テストデータ
テストデータとは、訓練データを用いて学習させた後、そのニューラルネットワークが「どの程度の性能が出せるのか」評価するために用いられるデータを指します。訓練データに用いたものとは違うデータを使わなければなりません。
教師データ
教師データとは、いわゆる答えを指します。今回の例のように、犬かどうかを判別するニューラルネットワークを構築する場合なら、犬の画像に「この画像は犬である」とラベリングしますよね。これが教師データにあたります。
エポック数
エポック数は、「一つの訓練データを何回繰り返して学習させるか」を指します。
エポック数とはより詳細なことはこちらの記事に分かりやすくまとまっています。
過学習
過学習とは、訓練データに適合しすぎることです。より詳しく言えば、訓練データなら高い正解率を誇るのに、テストデータになると正解率が明らかに落ちる状態を指します。対応策として、訓練データの数を増やす。ドロップアウト(後述)を用いる。正則化する。などがあります。
ドロップアウト
過学習を抑制するために、一部のユニットを不活性化させることです。
詳しくは、Dropout:単純な方法で過学習を防ぐをご覧ください。
バックプロパゲーション(誤差逆伝搬法)
出力層から入力層の方向にニューロンを学習させていく方法のこと。
学習方法
オンライン学習
訓練データ1つ1つに対して、重みを更新させていく方法のことです。訓練データ1つ1つに、多くの絡み合った入力データがあり、訓練データの総数が多い場合によく使われます。実装が比較的楽。
バッチ学習
全ての訓練データを通したあとに、重みを更新させる方法です。つまり、全訓練データの情報が一度に反映されます。訓練データの総数が少ない場合に有効です。
ミニバッチ学習
オンライン学習とバッチ学習の中間の立ち位置にある学習方法です。訓練データを同数のグループに分割し、グループごとに重みを更新させる方法です。訓練データが中くらいの数の時に有効です。
ライブラリー
ニューラルネットワークを一から実装しようとすれば非常に大変です。そこで、比較的容易にニューラルネットワークを実装できるようになる、便利で有名なライブラリーをいくつか紹介します。
もっと色々な種類が見たい方は、各機械学習ライブラリーの比較をまとめるをご覧ください。
TensorFlow
もっとも有名で、もっとも利用されているライブラリー。柔軟性も抜群。
Keras
Pythonで書かれたニューラルネットワークのライブラリです。TensorFlowの次に、使用されており、25万人以上のユーザーがいます。非常に簡単にニューラルネットワークが実装できます。これ以上簡単なものは恐らくありません。さらに、TensorFlowと大きな互換性があります。
より詳しくは、なぜKerasを使うか?をご覧ください。
有名なデータセット
ニューラルネットワークでは、訓練データを集める作業も大切になってきます。しかし、訓練データを集めるのは大変です。そこで、サクッと自作のニューラルネットワーク性能の確認ができるように、公開されているデータセットが存在します。
有名なものだけ、順に紹介していきます。もっといっぱい見たい方は、【24個掲載】機械学習で使えるデータセット一挙勢ぞろいをご覧ください。
MNIST
手書きの数字データがいっぱいあります。ニューラルネットワークの Helllow World!!
訓練用:60,000枚
テスト用:10,000枚
CIFAR-10
車や鳥など、10個のカテゴリーに分かれた画像データがいっぱい入っています。
訓練用:50,000枚
テスト用:10,000枚
MegaFace
人の顔の画像がいっぱいあります。
対象人数:672,000人
画像数:4,200,000枚
Youtube-8M Dataset
動画がいっぱいあります。
動画数:7,000,000本
Kaggle
企業や研究機関が様々なデータを公開しているところです。ビットコインのデータも2~3年分公開されているようです。
おすすめ書籍
初心者はニューラルネットワークの参考書を悩む必要がありません。最も分かりやすく、最も売れている王道の書籍があるからです。しかも、コード付き。その書籍はこちらです。
恐らく、既に知っている方がほとんどではないでしょうか。いわゆる魚本です。他の書籍を読むにしても、まずはこの本で基礎を押さえてから読むのが賢明です。他の書籍とは以下の点で異なります。
・これくらいは知ってるよね?がない。
技術書にありがちな、入門書なのに基礎の説明がない部分があって「えっ?」てなるやつですね。これが全くありません。基礎の基礎までしっかり解説してくれているので、最初から最後まで全部わかります。
・数学が難しすぎない
これは、機械学習系の書籍にありがちなやつですね。急に難しい数学が入ってきてお手上げになるパターン。こちらも魚本なら心配ありません。大学数学レベルにはほとんど突っ込んでいないので安心です。
逆に、「既に基礎は完璧な方」「数学的な説明ががっつり欲しい方」は、他の書籍を探した方がいいかもしれません。
まとめ
ニューラルネットワークの勉強は大変。
お疲れ様でした。
次は、keras で実際にニューラルネットワークを構築されてみてはどうでしょうか。

コメント