機械学習のアルゴリズムの中でも最も有名なもののひとつに、ニューラルネットワークがあります。
これは人間の脳を模した構造になっており、様々な分野で応用されている技術です。
また最近よく耳にするディープラーニングは、ニューラルネットワークを多層化することでより深い学習を実現したモデルです。
ニューラルネットワークは機械学習を学ぶなら避けては通れない知識となっているので、しっかりとマスターしておきましょう。

機械学習ではプログラミング言語のPythonがよく利用されています。
こちらの無料講座でPythonの基礎を学び、未経験からでもプログラミングの基礎を身につけましょう!
過去にプログラミング学習に挫折した方でも続けやすい学習プログラムになっています。
ゼロから始めるPython入門講座(オンライン・無料)+【テックジム】

ニューラルネットワークでできること

ニューラルネットワークにより解決できる問題は分類と回帰の2つに分けられます。

分類問題では、モデルに与えたデータがあらかじめ用意したクラスのうちどれに属するかを推測します。
学習用のデータにはそのデータがどのクラスに属しているのかを示す正解ラベルを付与する必要があります。
正解ラベルは一般的にone-hotベクトルというもので表現されます。

また、回帰問題では連続的な値の予測、つまり具体的な数値の予測を行います。

one-hotベクトル

one-hotベクトルは、分類問題の学習データに対して付与する正解ラベルの形式です。
そのデータが属するクラスは1、それ以外は0として表されたベクトルです。
例えば果物の画像を分類する問題で、次のようなクラスが用意されていたとします。

['apple', 'banana', 'grape', 'orange']

この時にデータがbananaクラスに属しているなら、このデータについてのone-hotベクトルは次のように書くことができます。

[0, 1, 0, 0]

ニューラルネットワークの基本構造

ニューラルネットワークは、人間の脳の神経回路を模倣したモデルになっています。
そのモデルは以下の図のように、〇で示した複数のニューロン(ノード、節)がエッジによって接続された構成となっています。

ニューラルネットワークは複数の層(レイヤ)からなっています。
データに関する情報を入力する層を入力層、情報を最適化する層を中間層、最終的な結果を出力する層を出力層といいます。

このようなモデルに対して学習データを用いてフィッティング(解決したいタスクに対するモデルの最適化)を行います。

データの処理と学習の流れ

ニューラルネットワークによるデータの処理は次のような流れで行われます。

まず入力層に対してデータについての情報(特徴量)を与えます。
例えば果物を分類するモデルであれば、その大きさや重さ、色、形などの情報が数値として入力層のニューロンに入力されます。
また、画像データを扱いたい場合は各ピクセルがその特徴量となります。

次に入力した特徴量を中間層(隠れ層)のニューロンに結合します。
この時、単に各特徴量を結合するだけではなく、特長量に対して重みというものを掛け合わせたものや定数項であるバイアスを結合します。
ニューラルネットワークでは基本的にこれらの重みやバイアスが調整できるパラメータとなります。
中間層は何層でも積み重ねることができますが、モデルが深くなればなるほど学習の際に大きな計算量を要します

最後に中間層で特徴量を元に変形された情報をもとに出力層で出力を行います。
分類問題の場合は、出力層のニューロンは最終的に分類したいクラスの数になります。
2クラス問題の場合は、単一の出力層であるクラスに属しているかそうでないかによる分類を行うこともできます。
一方、予測問題(回帰問題)では、単一の出力からなるモデルで具体的な数値を出力します。

学習を行う際には出力層の出力結果と学習データの正解を比較し、その損失(loss)小さくするようにパラメータを更新するという作業を行います。
この時、出力層側から順にパラメータを更新していく手法を誤差逆伝搬法(バックプロパゲーション)といい、一般的によく利用されています。
またパラメータを更新する際の最適化アルゴリズムアルゴリズムはオプティマイザと呼ばれ、損失関数(損失を決定する関数)の値が小さくなるようにパラメータを決定していきます。

重みは各ニューロンを繋いでいるエッジにそれぞれ存在し、この重みを更新することによって学習が行われます。
この重みが大きいほど情報が強く伝達され、重要な情報であると認識されます。
つまり重要な情報については濃く、不要な情報については薄く利用するようにモデルを修正するのがニューラルネットワークにおける学習なのです。

ここまでのニューラルネットワークの学習の流れを大まかにまとめました。

  1. 重みを適当に設定したニューラルネットワークのモデルを用意する
  2. 学習データをニューラルネットワークに入力し、その出力とデータのラベルを比較する
  3. モデルの予測と学習データの正解を比較し、その損失を損失関数により求める
  4. 損失関数を最小化するためのオプティマイザにより重みとバイアスを更新する

ハイパーパラメータ

機械学習モデルの性能はパラメータによって決まります。
ニューラルネットワークにおけるパラメータには、重みやバイアスなどがあります。
これらは学習を通して動的に最適化されていくパラメータです。

一方でパラメータの中には人間の手によって決める必要があるパラメータもあります。
これをハイパーパラメータといい、モデルの中間層の数や各レイヤのニューロン数、学習率などがこれに当たります。
学習率は、モデルの重みやバイアスを更新する際にどれほど更新を行うかという値です。

また、後述するバッチサイズやエポック数もハイパーパラメータに含まれています。

トレーニングとテスト

ニューラルネットワークの学習には、主にトレーニングとテストという2つのステップが存在します。
トレーニングは、学習用のデータを用いてモデルを最適化していく段階です。
テストでは、学習を終えたモデルが未知のデータに対してどれほどの性能を示すかを評価します。

入力されたデータに対するモデルの予測の正確性のことを認識率といいます。
教師データでは、入力されたデータの正解ラベルとモデルの予測が一致している割合(正解率)になります。

テストにおける未知データに対する認識率汎化性能といい、これが高いほど良いモデルであるといえます。
トレーニング中も認識率を向上させることを目的に最適化を行っていますが、テストデータに対して過剰に最適化されてしまうと、逆に汎化性能が低下してしまいます。
これを、オーバーフィッテイング(過学習)といいます。

過学習の防止のため途中で学習を打ち切ったり、ハイパーパラメータを変化させてトレーニングを行った際の最適なパラメータ選択を行う目的で、バリデーション(検証)を行う場合もあります。
バリデーションは、テストの前に行うトレーニング性能の一時的な評価です。

モデルが入力されたデータに対して誤った予測を示すことを誤認識といいます。

パーセプトロン

パーセプトロンはニューラルネットワークの元祖ともいえる基本的なモデルで、中間層を持たない構造となっています。
ニューラルネットワークをきっちりと理解するには、まずこのパーセプトロンを学ぶ必要があります。

入力層に特徴量を与え、それに重みを掛け合わせたものと定数項であるバイアスを出力層に入力します。
この出力層は全結合層活性化関数からなっていて、全結合層では入力された行列を線形結合します。
線形結合したものをさらに活性化関数で変換したものが出力となります。

ニューラルネットワークはこのようなパーセプトロンを組み合わせたモデル(多層パーセプトロン)の総称となります。

活性化関数

中間層や出力層のニューロンは、前段のニューロンの出力の線形結合を行う全結合層と出力の決定を行う活性化関数からなります。
活性化関数を持たないネットワークでは、行列の線形結合のみで出力が決定されるため、非線形の問題に対応できないという欠点があります。
活性化関数を用いることでネットワークの表現力が増し、より複雑な問題に対しても性能が向上します。

シンプルなパーセプトロンが流行していた時代に用いられていた活性化関数はステップ関数でした。
その後はシグモイド関数やtanh関数、ReLUなどが流行するようになりました。
各活性化関数がどのようなグラフの形をしているのかを知っておくことが大切になってきます。

ステップ関数

関数への入力値が0以上なら出力が1、0未満なら出力が0となる関数をステップ関数といいます。

\begin{equation}
f(x)=
\begin{cases}
1 & \text{($x\geqq0$)} \\
0 & \text{($x<0$)}
\end{cases}
\end{equation}

シグモイド関数

シグモイド関数は入力値を$0\sim1$の数値に変換するという意味ではステップ関数と同様の役割を果たしますが、見た目はS字型の曲線グラフとなります。
ステップ関数は微分不可能でしたが、シグモイド関数は微分可能であるのが強みです。

ニューラルネットワークの学習において非常によく用いられている最適化アルゴリズムである勾配降下法では微分を用いて重みを更新する都合上、ステップ関数を利用することができません。
そのため、こちらのシグモイド関数が頻繁に利用されるようになりました。

\begin{equation}
f(x)=\frac{1}{1+e^{-x}}
\end{equation}

ソフトマックス関数

ソフトマックス関数は分類問題に対するニューラルネットワークの出力層で用いられる活性化関数です。
入力値を$0\sim1$の数値に変換するという点ではシグモイド関数と同様ですが、複数の出力の合計が1となるように全体の出力を正規化するという特徴があります。

これは多クラス問題においてそれぞれのクラスに分類される確率を表しており、シグモイド関数もソフトマックス関数の一部(1クラスの場合)であると捉えることができます。

\begin{equation}
y_{i}=\frac{e^{x_{i}}}{\sum_{k=1}^{n} e^{x_{k}}}
\end{equation}

tanh関数

tanh(双曲線正接)関数は、ハイパボリックタンジェントと読み、すべての入力を$-1\sim1$の数値に変換します。
グラフはシグモイド関数と同様にS字型になります。

シグモイド関数を使用すると微分結果が小さくなり、勾配が小さくなってしまう傾向があります(活性化関数の微分については割愛します)。
tanh関数を使用することでこのような勾配消失問題を軽減できます。

\begin{equation}
f(x)=tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
\end{equation}

ReLU

ReLU関数はレルーと読み、ランプ(ramp)型のグラフとなります。
ニューラルネットワークの中間層が多層化により、勾配消失問題が深刻化してきました。
tanh関数もこの問題の解決策のひとつでしたが、さらに大幅な改善のために利用されているのがReLUです。

tanh関数に比べても計算が単純で処理速度が速く、入力が0以下の時には0を出力するためニューロンの活性化をスパース(活性化されない部分をつくる)化できるといったメリットがあります。

\begin{equation}
f(x)=
\begin{cases}
x & \text{($x\geqq0$)} \\
0 & \text{($x<0$)}
\end{cases}
\end{equation}

以下のような式で表現されることもできます(max関数は与えられた値のうち最大のものを返す)。

\begin{equation}
f(x)=max(0, x)
\end{equation}

機械学習エンジニアを目指したいなら、本格的にプログラミングを学べるスクールを利用してみてはいかがでしょうか?
データサイエンス・機械学習に特化したコースでプロのエンジニアにチャットで質問することもできます。
まずは、無料体験・無料カウンセリングから自分にあったコースを探してみましょう!
データサイエンスコース

損失関数(誤差関数)

モデルの出力と教師データの正解ラベルとの差を損失(loss)といいます。
その損失の具合を評価するための関数が損失関数(誤差関数、あるいはコスト関数や目的関数とも)です。

MSE(最小二乗誤差)

もっとも一般的で直感的にわかりやすい損失関数はMSE(最小二乗誤差)です。
機械学習以外の分野でも広く利用されています。

これは、ニューラルネットワークの出力と教師データの正解との誤差の二乗和を指しており、回帰問題でよく利用されています。

計算式は以下のようになっており、$y_{k}$はニューラルネットワークの出力、$t_{k}$はそのデータの正解となります。

\begin{equation}
MSE=\frac{1}{2}\sum_{k}{(y_{k}-t_{k})^{2}}
\end{equation}

交差エントロピー誤差

交差エントロピー(クロスエントロピー)誤差も機械学習でよく利用される損失関数となっています。
MSEが回帰問題に適した損失関数であるのに対して、こちらの交差エントロピー誤差は分類問題に適した損失関数となります。

ニューラルネットワークの分類問題においては、各ラベルに属する確率を出力します。
そして、最も属する確率の高いクラスに分類されると判断できます。

交差エントロピー誤差の式は以下のように表されます。
one-hotベクトルで表現された正解ラベルである$t_{k}$が1の場合、$y_{k}$の確率が大きいほど$log$の値が大きくなり交差エントロピーの値としては小さくなります

\begin{equation}
E=\sum_{k}{\{-t_{k}\log{(y_{k})}\}}
\end{equation}

最適化アルゴリズム(オプティマイザ)

損失関数の値が小さいほどモデルは正確であるといえ、モデルの学習の目的はこの損失関数を最小化すること(最適化問題の解決)です。
重みやバイアスを更新することで損失を小さくしていくのが最適化アルゴリズム(オプティマイザ)になります。
たくさんの種類があり混乱するかもしれませんが、どの手法でもより効率的に損失関数を小さくするという目的は変わりません。

もっとも単純な例として、パラメータが1つの場合と2つの場合における最適化の意味を考えてみます。

パラメータが1つの場合、つまり重みが1つだけ用意されている場合には、下記のようになります。
ただし損失が必ずしも2次曲線的になるとは限りませんので注意してください。

パラメータである$w_{1}$を変化させるとそれに伴って損失が変化します。
最適化アルゴリズムは現在のパラメータが最適なパラメータ(損失が最小化されるパラメータ)となるように調整を行います。
関数の谷底を目指して下っていくようなイメージです。

パラメータが2つの場合についても同様で、描かれる平面の谷部を目指すことで損失が最小化されるようなパラメータを発見することができます。

これでパラメータを最適化することによって損失を最小化するイメージはついたかと思いますが、具体的にどのように最適化するのかを見ていきます。

勾配降下法

勾配降下法は最急降下法とも呼ばれ、最小値を探索するために微分(偏微分)を利用します。
微分はある点での関数の傾きを表しています。

損失関数を各パラメータで微分し、現在のパラメータを用いたときの微分係数から更新方向(各パラメータの値を大きくするか小さくするか)を決定します。
こうして更新作業を繰り返すことで、最終的に最適化問題を解決することを目指します。

パラメータを大きくするか小さくするかは微分によって求めますが、どれだけ更新するかという尺度はモデルの利用者が決めます。
このパラメータを学習率といい、大きすぎるとオーバーシュートが発生してパラメータがうまく収束せず、小さすぎると収束までに果てしない時間がかかってしまいます

勾配降下法によるパラメータの更新を式で表すと次のようになります。
$\boldsymbol{w_{next}}$は更新後のパラメータ、$\boldsymbol{w_{prev}}$は更新前のパラメータ、$α$は学習率、$L$は損失関数です。
$\boldsymbol{∇L}$は損失関数を各パラメータで微分したものであり、これが勾配を表しています。

\begin{equation}
\boldsymbol{w_{next}}= \boldsymbol{w_{prev}}-\alpha\boldsymbol{∇L}=\boldsymbol{w_{prev}}-\alpha\boldsymbol{\frac{\partial L}{\partial w}}
\end{equation}

勾配降下法には決定的な弱点があります。
それは、極値が関数全体の最小値であるという前提条件が存在していることです。
以下のように複数の極値(局所最適解)を持つ場合、全体としての最小値(大域最適解)に到達する前に収束してしまう可能性があるのです。
図で見るとわかりやすいので、以下の例でパラメータが局所最適解にはまって抜け出せなくなってしまう様子を確認してください。

また、勾配降下法はすべてのデータを使用してパラメータの更新量を決定するため、計算量が大きいというデメリットもあります。

SGD(確率的勾配降下法)

通常の勾配降下法では学習の際に毎回すべてのデータを元にして勾配を求め、パラメータを更新していました。
SGD(確率的勾配降下法)ではランダムで選択したひとつのデータのみを利用して更新を行います。
これにより処理時間が大幅に軽減され、局所最適解から抜け出せる可能性が生まれます

勾配降下法では一度局所最適解に陥りそうになった際、直線的に極値へ向かおうとするため抜け出せなくなってしまいます。
しかしSGDではランダムに選択したデータを利用する都合上、まっすぐに極値へ向かおうとするのではなく曲線的な軌道を描きながら極値を目指します。
この時に局所最適解から抜け出し、大域最適解の方へと修正されていく可能性があるのです。

ただし必ずしも局所最適解を避けることができるという保証はありません。

ミニバッチ学習SGD

SGDは1つのデータを用いて逐次的にパラメータを更新していく都合上、並行して計算を行うことができません。
また、ランダムに選択したデータが外れ値だった場合に誤った方向にパラメータが更新されてしまうリスクもあります。

そこで、ランダムに選択したいくつかのデータを利用して学習を行うのがミニバッチ学習SGDです。
考え方としてはSGDと同じで、局所最適解に陥ることを避ける目的があります。
ただし選択するデータ数が多すぎると勾配降下法と同様の問題が発生してしまうため、ある程度少量のデータを使用します。
このようなデータのかたまりをミニバッチといい、ミニバッチのサイズもハイパーパラメータとなります。

モーメンタム

ここまでは現在のパラメータを用いた場合の点での微分から更新方向を算出していました。
モーメンタムではこの勾配に、前回の進行方向(慣性)の項を加えたものを使って更新方向を決定します。
過去の勾配を考慮することによって、今まで進行していた方向から真逆に進むといった急激な変化を抑えることができるのです。
モーメンタムによる慣性量をどれほど考慮するかという係数を$\boldsymbol{\beta}$として調整します。

\begin{equation}
\boldsymbol{w_{next}}= \boldsymbol{w_{prev}}-\alpha\boldsymbol{\frac{\partial L}{\partial w}} + \boldsymbol{\beta} \Delta \boldsymbol{w_{prev}}
\end{equation}

これによりオーバーシュートを軽減し、パラメータのより高速な収束を実現できます。

また、モーメンタムを改良したNAGというものもあります。

RMSProp

RMSProp現在の勾配から自動的に学習率を変動させる手法です。
モーメンタムと同様、オーバーシュートの軽減による学習の高速化を目的としています。

損失の結果が振動を始めると学習率を小さくし、その振動を抑えます。

Adam

ニューラルネットワークの最適化アルゴリズムのデファクトスタンダードと言えばAdamです。
これは単にモーメンタムとRMSPropを組み合わせただけのものなので、この2つの手法について知っていれば決して難しいものではありません。

誤差逆伝搬法

誤差逆伝搬法(バックプロパゲーション)はニューラルネットワークのパラメータを更新する手法として用いられています。

損失関数の結果を元にして出力層側から順にニューロンをさかのぼりながら活性化関数の微分を繰り返していき、最適化アルゴリズムを適用してパラメータを更新していきます。
ここで重要となってくるのが微分の連鎖律です。

微分の連鎖律

微分の連鎖率は合成関数の微分を行う際に必須となる知識で、以下のような関係で表されます。

\begin{equation}
\frac{dy(x)}{dx}=\frac{dy(u)}{du}\frac{du(x)}{dx}
\end{equation}

バッチサイズ・エポック数

バッチサイズやエポック数は、ニューラルネットワークの学習において重要なハイパーパラメータとなっています。
どちらも学習の結果やモデルが完成するまでの学習時間に大きく影響してくるので、どのようなパラメータなのかを把握しておきましょう。

バッチサイズとイテレーション数

ミニバッチ学習SGDにおいて、1つのミニバッチに含まれるデータの数バッチサイズといいます。
また、すべてのデータを使い切るために必要な学習回数イテレーション数といいます。
つまり全データ数$N$とバッチサイズ$b$、イテレーション数$i$の関係は以下の通りになります。

\begin{equation}
N=b \times i
\end{equation}

バッチサイズを決めるとイテレーション数も自動的に決まってくるので、実質的なハイパーパラメータはバッチサイズのみです。

エポック数

全データによる学習を繰り返す回数エポック数といいます。
すべてのイテレーションによる学習を1エポックとして、エポック数分だけ学習を繰り返し行います。

こうして損失関数がある程度収束するまで何度も学習することでモデルの精度が上がっていきます。

ディープラーニング

ディープラーニング(深層学習)は、ニューラルネットワークの中間層を多層化したモデルのことで、入力されたデータの特徴量をより深く学習することができます。
ディープラーニングのモデルは非常に高い精度を誇りますが、大量の学習データと高い処理性能を持ったコンピュータが必要となります。

まとめ

ニューラルネットワークを学ぶ上で必要最低限となる知識をまとめて紹介しました。
紹介しきれない部分もありましたが、詳しく学びたい部分についてはぜひ調べてみてください。

様々な専門用語や数学的な理論が混在して、一度読んだだけではなかなかすべてを理解することは難しかったかもしれません。
しかし、どれも機械学習を学ぶ上では外せない基本的な事項ですので、何度も繰り返し読んでしっかり頭に入れておきましょう!

AIエンジニアやデータサイエンティストへのキャリアチェンジを目指すなら、3カ月間の集中プログラムで徹底的に学習しましょう!
業務課題をAIを用いて解決したい方、教養としてAIを学習したい方にもおすすめです。
オンラインでPythonの基礎知識からしっかり学べるコンテンツを利用できます。
AIを学ぶならアイデミープレミアムプラン

関連記事

この記事のタグ