こちらのコンテンツは最新の情報ではない可能性があります。無料で学べる最新のコンテンツは Python&機械学習入門コース 脱ブラックボックスコース をぜひご利用ください。

ニューラルネットワークの数学(順伝播)

本章では、ディープラーニングの基礎と題してディープラーニングをフレームワークを用いて実装できることを目標にしています。そのうえでディープラーニングの基礎となるニューラルネットワークのアルゴリズムとそれに必要な数学を紹介します。

ディープラーニングも内部の基礎はニューラルネットワークですが、画像や自然言語処理といったタスクに向けた特定のネットワークの構造を持っていたり、これから紹介する層の数を深く複雑にした場合でもうまく学習できるような工夫がされているため、基本的なニューラルネットワークとは切り分けて解説を行います。より発展的な内容は、画像処理の基礎自然言語処理の基礎の章で紹介しますので楽しみにしていてください。

次章からは本章で身に付けた知識を元に主要なディープラーニングフレームワークを使った実装に入っていきますので、本章で必要な基礎知識を紹介します。いくつか数式を用いた実際の数値計算を行う箇所がいくつかあるのですが、その際には

  • お手元にノートとペンを準備
  • 自らの手で実際に計算すること

を強く勧めます。自分で手を動かしながら計算することと資料に書いてある計算結果を目で追うことでは、終わったあとで驚くほど理解度に差が出ます。ぜひ、お試しください。

本章の構成

  • ニューラルネットワークの基礎
  • 順伝播の計算

ニューラルネットワークの基礎

ディープラーニング (deep learning) とは多層のニューラルネットワーク (neural network) による機械学習の手法を指します。そのため、ディープラーニングを理解することはニューラルネットワークの構造を理解することとほぼ同じですので、まずはこちらの計算手順を把握しましょう(ディープラーニングの定義の詳細に関してはこちらを参照して下さい)。

本節ではニューラルネットワークの概要や構造、種類について全体像を理解します。次節の順伝播の計算で詳細の計算方法などを把握しましょう。

ニューラルネットワークの概要

ニューラルネットワークは回帰や分類といった教師あり学習のアルゴリズムのひとつであり、機械学習の基礎でも紹介した決定木やロジスティクス回帰などと問題設定は変わりません。そのため、入力変数から出力変数を予測する構造は同じです。今回は問題設定として、入力変数に家に関する情報(部屋の広さ、駅からの距離、築年数)を取り、目的変数は家賃とします。物件情報から家賃を予測する回帰の問題設定にします。

最初は計算の詳細はおいておき、左から右にむけて何らかの計算を内部で行うことにより、予測値を出力するというイメージを掴みましょう。

20_1

左に入力変数が入っており、右に予測したい家賃の値が出力されます。この丸で表されたものをノード (node) と呼びます。そしてノードの縦方向の集まりのことを層 (layer)と呼びます。左側から入力層 (input layer)、中間層 (intermediate layer)、出力層 (output layer) と呼び、特に中間層は隠れ層 (hidden layer) といいます。プログラミングをする際に英語での表記を使用しますので、英語でも覚えておきましょう。

上のニューラルネットワークは、入力層、中間層、出力層がそれぞれ一つずつあるので、合計 3 層の構造となっています。中間層をさらに多層にしたもの、2 層以上のものをディープラーニングと呼ばれています。

パラメータ

20_4

ここでは入力層と中間層に着目しましょう。直線がそれぞれのノードを接続していますが、これをエッジと呼び、重み (weight) を表します。重みは新しく登場した概念ではなく、重回帰分析などのアルゴリズムでも登場してきたもの同様に学習によって最適化したい値です。バイアスは図のように層の最後に追加されたノードのエッジによって表現されます。入力変数以外の値で補正する意味合いを持っています。

ニューラルネットワークの種類

ニューラルネットワークには、上図のような層間のノードが互いに密に結合した全結合型 (fully-connected) のものだけでなく、画像処理などでよく用いられる畳み込み型 (convolutional)、自然言語や系列データの扱いによく用いられる再帰型 (recurrent) など、いくつもの種類が存在します。それらの違いは基本的には層間の結合の仕方にあり、別々の層間には別の種類の結合の仕方を用いることができます。つまり、単一のニューラルネットワークの中に複数の種類の結合が混ざって現れることもよくあります。

例えば、画像処理でよく使われる畳み込みニューラルネットワーク (Convolutional Neural Network) では入力に近い層では畳み込み型の結合を用い、出力に近い層では全結合型の結合を用います。

本章では、最も基本となる全結合型のみ着目して学んでいきます。その他の種類については、画像認識の基礎編など後の章で学んでいきます。

順伝播の計算

順伝播とは、ニューラルネットワークにおいて入力層から出力層への方向を順方向として入力変数とパラメータをかけ合わせて予測値を計算することを指します。そして、その具体的な計算では主に 2 つの計算、線形変換非線形変換を繰り返します。これらをそれぞれ紹介していきます。

線形変換

それではまず線形変換から紹介します。線形変換ではこれまでに紹介していた考え方と同じで、重みと入力変数の線形結合を行います。下記の図のように、入力層のノードが持つ値(入力値)と重みを掛け合わせ、それぞれのノードの計算結果を足し合わせます。今回は簡略化のためにバイアスの計算は省略して考えます。

20_5

線形変換は上記の図のように重みと入力値の線形結合になっています。次にこれらを数式に当てはめて確認してみましょう。

下記の図は値を文字に置き換えたものです。

20_6

上記の図で線形変換後の変数 u11u_{11}u22u_{22} は以下のように計算されます。

u11=w11x1+w12x2+w13x3+b1u12=w21x1+w12x2+w13x3+b2\begin{aligned} u_{11} = w_{11}x_{1} + w_{12}x_{2} + w_{13}x_{3} + b_{1} \\ u_{12} = w_{21}x_{1} + w_{12}x_{2} + w_{13}x_{3} + b_{2} \end{aligned}

バイアスに対応する x0x_0 は 1 が入るため省略しています。そしてこの式は、入力ベクトル x\mathbf{x}、重み行列 W\mathbf{W}、バイアスベクトル b\mathbf{b}、および出力ベクトル u\mathbf{u}

x=[x1x2x3]W=[w11w12w13w21w22w23]b=[b1b2]u=[u11u12]\begin{aligned} \mathbf{x} &= \begin{bmatrix}x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} \\\\ \mathbf{W} &= \begin{bmatrix}w_{11} &w_{12}&w_{13}\\ w_{21}&w_{22}&w_{23}\end{bmatrix} \\\\ \mathbf{b} &= \begin{bmatrix}b_{1} \\ b_{2}\end{bmatrix} \\\\ \mathbf{u} &= \begin{bmatrix}u_{11} \\ u_{12}\end{bmatrix} \end{aligned}

と定義すれば、

[u11u12]=[w11w12w13w21w22w23][x1x2x3]+[b1b2]u=Wx+b\begin{aligned} \begin{bmatrix}u_{11} \\ u_{12}\end{bmatrix} &= \begin{bmatrix}w_{11} &w_{12}&w_{13}\\ w_{21}&w_{22}&w_{23}\end{bmatrix} \begin{bmatrix}x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} + \begin{bmatrix}b_{1} \\ b_{2}\end{bmatrix} \\ \mathbf{u} &= \mathbf{W} \, \mathbf{x} + \mathbf{b} \end{aligned}

のように表現することができます。これが線形変換の計算になります。行列とベクトルを用いた形式でまとめることができました。重回帰分析では wTx\mathbf{w}^{\mathrm T} \mathbf{x} +b+\,b であったところから、さらに拡張された表現であることがわかります。続いてはこの線形変換によって出力された値を用いて非線形変換を行います。非線形変換がどのような計算をしていて、なぜ必要なのか学びます。

非線形変換

下記の図をご覧ください。図の左に示すように線形変換では入出力間が線形な関係性を持つ場合のみその関係性を表現することができます。その一方で、下図の右に示すような入出力間が非線形な関係を保つ場合には、その関係性をうまく捉えることができません。

20_7

例えば、線形変換のみで図の右の白い丸で表される観測データから xxyy の関係を近似しようとした場合、点線のような直線が得られるとします。これでは、一部のデータしか当てはまっていないことが分かります。

そこでニューラルネットワークでは各層において、線形変換に続いて非線形変換を施し、層を積み重ねて作られるニューラルネットワーク全体としても非線形性を持つことができるようにしています。この非線形変換を行う関数のことを、ニューラルネットワークの文脈では活性化関数と呼びます。

線形変換の結果 u11,u12u_{11}, u_{12} に活性化関数を使って非線形変換を行った結果を z11,z12z_{11}, z_{12} と書き、これらを活性値 (activation) と呼びます(下図参照)。 これが次の層への入力となります。

20_8

最もよく知られている活性化関数のひとつは、下図に示すロジスティックシグモイド関数 (logistic sigmoid function)(以下、シグモイド関数)です。この活性化関数が従来、ニューラルネットワークでよく用いられてきました。入力変数 uu に基づいて、0~1 の間に値を変換します。関数の形から分かる通り、直線では表現できないような構造であるため、入出力間の非線形性を一部では捉えることができます。

20_9

数式では、

z(u)=11+exp(u)\begin{array}{c} z(u) = \frac{1}{1+\exp(-u)} \end{array}

と表されます。

しかし近年、層の数が多いニューラルネットワークではシグモイド関数は活性化関数としてほとんど用いられません。その理由の一つは、シグモイド関数を活性化関数に採用すると、勾配消失という現象によって学習が進行しなくなる問題が発生しやすくなるためです。この問題の詳細は後で後術します。

勾配消失問題を回避するために、近年では正規化線形関数 (ReLU: rectified linear unit) がよく用いられます。

20_10

z(u)=max(0,u)\begin{array}{c} z(u) = \max(0, u) \end{array}

ここで、max(0,u)\max(0, u) は、00uu を比べて大きな方の値を返す関数です。すなわち、ReLU は入力が負の値の場合には出力は 0 で一定であり、正の値の場合は入力をそのまま出力するという関数です。シグモイド関数では、入力が 00 から離れた値をとると、どんどん曲線の傾き(勾配)が小さくなっていくことが一つ前の図からも見て取れます。それに対し、ReLU 関数は入力の値が正であれば、いくら大きくなっていっても、傾き(勾配)は一定です。これがシグモイド関数で問題となっていた勾配消失に対して有効に働きます。

非線形変換の最後に、ソフトマックス関数 (softmax) を紹介します。主に分類の問題で使用される活性化関数であり、出力層の活性化関数として用いられます。数式は、

a(u)=exp(u)m=1Mexp(um)\begin{array}{c} a(u) = \frac{\exp(u)}{\sum_{m=1}^{M} \exp(u_m)} \end{array}

のように表され、umu_m は複数からなる入力値です。ここで、MM は変換後の層のノード数であり、exp()\exp(\cdot) は自然対数 ee を底とした指数関数を表しています。

ソフトマックス関数の数式自体は難しく見えるかもしれませんが、その機能は出力される値の総和を 1 に正規化することです。分類の場合、ニューラルネットワークから出力される変数の総和が 1 となり、それぞれの出力値は 0~1 の間で値を取ります。

分類の場合にソフトマックス関数は頻出するため覚えておきましょう。

数値例で確認

ここまでは数式での説明が多く、現実的な問題と少しずつ乖離してきたため、一度具体的な数値例で計算の流れを確認しましょう。下記の図を参照して、予測値 yy の値を求めて下さい。なお、u\mathbf{u} から z\mathbf{z} への非線形変換は ReLU 関数を用いる事とします。

20_11

ここでニューラルネットワークと重回帰分析の間に大きな違いがあります。ニューラルネットワークも重回帰分析も目的関数を最適化するようにパラメータである w\mathbf{w}bb を決定することが目的です。重回帰分析はこれを達成するために目的関数を微分して勾配を求め、その勾配が 00 ベクトルとなるようにパラメータを決定していました。ニューラルネットワークも同じように進めれば良いように関しますが、大きな違いがあります。その謎は活性化関数に隠されています。ReLU 関数には max(,)\max(\cdot, \cdot) の関数を持っており、この関数はどのように微分すれば良いでしょうか。入力される値によって結果が異なるため、値をいれない代数の段階ではこの微分を行うことができません。したがって、重回帰分析のようにパラメータを直接求めることができません。

ここが一番のポイントなのですが、ニューラルネットワークを含めたいくつかのアルゴリズムでは、パラメータの初期値をランダムに決定し、そこから徐々に調整していくという方法を取ります。現時点では、パラメータの初期値がないと計算が始まらないと認識してください。そのため、今回の数値例においても、パラメータの初期値をランダムに設定しています。バイアス bb の初期値は 0 と設定されることが多いため、今回は 0 としています。

今回は入力として x=[1,2,3]T\mathbf{x}=[1, 2, 3]^{\mathrm T} が与えられているため、u\mathbf{u} を求める計算式は下記になります。

u11=3×1+1×2+2×3+0=11u12=(2)×1+(3)×2+(1)×3+0=11\begin{aligned} u_{11} &= 3 \times 1 + 1 \times 2 + 2 \times 3 + 0 = 11 \\ u_{12} &= (-2) \times 1 + (-3) \times 2 + (-1) \times 3 + 0 = - 11 \end{aligned}

と求まります。次に z11z_{11} の値を ReLU 関数を適用し、

z11=max(0,u11)=max(0,11)=11z12=max(0,u12)=max(0,11)=0\begin{aligned} z_{11} &= \max(0, u_{11}) = \max(0, 11) = 11 \\ z_{12} &= \max(0, u_{12}) = \max(0, -11) = 0 \end{aligned}

と求まります。これらの値をもとに予測値 yy は最初の線形変換と同じ計算方法で、

y=2×11+3×0+0=22\begin{aligned} y = 2\times11 + 3\times0 + 0 = 22 \end{aligned}

と計算できました。ニューラルネットワークの実際の計算は足し算と掛け算ぐらいで構成されているため、計算自体は非常に簡単であることがわかります。

目的関数

実際に数値例で確認をし、予測値 yy2222 と算出されました。もしも、このときの答え、目的変数 tt の値が 1010 だった場合、パラメータはどのように更新されると望ましい結果になるでしょうか。

20_12

目標値 tt と予測値 yy の誤差が最も小さくなった場合が最も望ましい結果であるといえます。ニューラルネットワークでは、この誤差を問題設定に応じて計算し、パラメータの調整を行っていきます。このニューラルネットワークに用いられる誤差を求める関数を目的関数と呼びます。損失関数、コスト関数と呼ばれることも多いですが、それぞれ少し概念は異なり、目的関数が最も大きな概念です。KIKAGAKU では目的関数と統一して紹介します。

ニューラルネットワークの学習には、微分可能であれば、解きたいタスクに合わせて様々な目的関数を利用することができます。ここでは、

  • 回帰でよく用いられる平均ニ乗誤差 (mean squared error)
  • 二クラス分類でよく用いられる二値交差エントロピー (binary cross entropy)
  • 多クラス分類でよく用いられる交差エントロピー (cross entropy)

という代表的な 3 つの目的関数を紹介します。

平均ニ乗誤差

平均ニ乗誤差 (mean squared error) は、回帰によく用いられる目的関数です。重回帰分析の二乗和誤差と似ていますが、各データ点における誤差の総和をとるだけでなく、それをデータ数で割って、誤差の平均値を計算している点が異なります。式で表すと、以下のようになります。

L=1Nn=1N(tnyn)2\begin{array}{c} \mathcal L = \frac{1}{N} \sum_{n=1}^{N}(t_n - y_n)^2 \end{array}

NN はサンプル数、yny_nnn 個目のデータに対するニューラルネットワークの出力値(予測値)、tnt_nnn 個目のデータに対する望ましい正解の値です。今回の数値例で平均ニ乗誤差を算出すると、

L=11(1022)2=144\begin{array}{c} \mathcal L = \frac{1}{1}\,(10 - 22)^2 = 144 \end{array}

と計算できます。今回は予測に用いるサンプル数が 1 つであるため NN は 1 となっています。

二値交差エントロピー

犬と猫の二値分類のような場合には二値交差エントロピーを用います。二値交差エントロピーは、

L=n=1Ntnlogyn+(1tn)log(1yn)\begin{array}{c} \mathcal L = - \sum_{n=1}^{N} t_n \log y_n + (1-t_n)\log(1-y_n) \end{array}

で表されます。目的変数 tnt_n0011 が与えられ、予測値 yny_n は二値分類の場合は多くの場合にシグモイド関数が施されるため 0011 の間で値を取ります。

tnlogyn+(1tn)log(1yn)t_n \log y_n + (1-t_n)\log(1-y_n) に注目して、もう少し深堀りを行いましょう。二値交差エントロピーの最小化問題を考えますが、式全体に - がついているため、この項目は最大化を行いたいことがわかります。tn=0t_n=0 のときには、

log(1yn)\begin{array}{c} \log(1 - y_n) \end{array}

となり、yny_n00 に近いほど値が大きくなります。tn=1t_n=1 のときには、

logyn\begin{array}{c} \log y_n \end{array}

となり、yny_n11 に近いほど値が大きくなります。

この確率の考え方や log\log が登場する背景などは確率や情報量を勉強すると理解が深まりますが、現状では二値分類では目的関数として二値交差エントロピーを使用しているという程度で問題ありません。確率や情報量の数学はこれまでの数学よりも多少難易度が高いため、本チュートリアルを一通り学び終えたころに理解を進めてください。

交差エントロピー

交差エントロピー (cross entropy) は、多クラス分類を解きたい際によく用いられる目的関数であり、二値交差エントロピーを拡張したものです。例として、KK クラス分類を考えてみましょう。ある入力 x\mathbf{x} が与えられたとき、ニューラルネットワークの出力層に KK 個のノードがあり、それぞれがこの入力が kk 番目のクラスに属する確率

yk=p(y=kx)\begin{array}{c} y_k = p(y = k|\mathbf{x}) \end{array}

を表しているとします。これは、入力 x\mathbf{x} が与えられたという条件のもとで、予測クラスを意味する yykk であるような確率を表す条件付き確率です。

ここで、x\mathbf{x} が所属するクラスの正解が、

t=[t1t2tk]T\begin{array}{c} \mathbf{t} = \begin{bmatrix} t_1 & t_2 & \cdots & t_k \end{bmatrix}^{\mathrm T} \end{array}

というベクトルで与えられているとします。ただし、このベクトルは tk(k=1,2,,K)t_k (k=1, 2, \cdots, K)いずれか 1 つだけが 1 であり、それ以外は 0 であるようなベクトルであるとします。これをワンホットベクトル (one-hot vector) と呼びます。そして、この 1 つだけが値が 1 となっている要素は、その要素のインデックスに対応したクラスが正解であることを意味します。例えば、t3=1t_3 =1 であれば 3 つ目のクラス(3 というインデックスに対応するクラス)が正解であるということになります。

以上を用いて、交差エントロピーは以下のように定義されます。

k=1Ktklogyk\begin{array}{c} - \sum_{k=1}^{K}t_k \log y_k \end{array}

これは tkt_kk=1,,Kk=1, \cdots, K のうち正解クラスである一つの kk の値でだけ 11 となるので、正解クラスであるような kk での logyk\log y_k を取り出して 1-1 を掛けているのと同じです。また、NN 個すべてのサンプルを考慮すると、交差エントロピーは、

L=n=1Nk=1Ktn,klogyn,k\begin{array}{c} \mathcal L = - \sum_{n=1}^{N} \sum_{k=1}^{K} t_{n, k} \log y_{n,k} \end{array}

となります。

本章のまとめ

本章の知識は、これからディープラーニングの理解を進めていくために必要な最低限の知識です。逆にいうと、ここさえしっかりと抑えておくと今後の難解な理論に対してもかなりスムーズに理解を進めることができます。実際にノートを取って、手を動かしながら自分のチカラに変換できたら次の章に進んでください。

shareアイコン