AIM@PAST

Deep Learningについて

1. はじめに

高専5年の卒業研究として僕はDeep Learningをテーマに発表させてもらいました. もともと人工知能に興味をもっており,機械学習について学びたいと思ったとき,ちょうどDeep Learningが注目されているタイミングだったわけです. せっかくなら最新の研究テーマについてもっと知りたいと思った僕は,Deep Learningのもつその能力の高さにも惹かれ,Deep Learningについて勉強を始めました.つまり機会学習の基礎知識より先にDeep Learningについて学習したわけです.

この記事で説明する内容は,僕が機械学習初心者の状態からDeep Learningについて勉強を始めて,学んだ内容のまとめです.Deep Learningとは何か?今までとどう違うのか?を中心に書いており,その詳しいアルゴリズムについては書いてありません.

また,ここに記載する内容は必ずしも正しいとは限りません.間違った説明を書いている場合もありますので,有識者の方で気づいた方は是非間違いを指摘していただけると幸いです.また,初学者の方はここに書いてあることをそのまま鵜呑みせず,必ず他のサイト様や書籍もあわせて参考にしていただけるとよいと思います.

2. Deep Learningとは

Deep Learningは深い層構造を持つ人工ニューラルネットワークを指します. その最大の特徴は特徴点を自ら学習して識別する点です.

従来までのパターン認識では,特徴点や特徴量などを開発者が定義することで識別を行っておりました.そのため,特に不特定多数の物体認識は現実的ではありませんでした.Deep Learningが高い精度をたたき出した背景には,人が見落としてた特徴量を学習していたためと考えられます.

3. 人工ニューラルネットワークについて

人工ニューラルネットワーク(以下,ニューラルネット)は実は昔(1940〜1950年頃)から提案されているものです. 人工ニューロン同士が複数結合し(シナプス結合),ネットワークを形成して,その結合強度を変化させることによって学習するモデルのことを指します.ここで,ニューロン1つのことを1ユニットと数えます.

本来の人工ニューラルネットワークでは結合に規則はありませんが,よく用いられるのは順伝搬型ネットと呼ばれ,層状に並んだユニットが隣接層間のみで結合する構造を持ち,情報が入力側から出力側に一方向に伝搬するニューラルネットを指します.

順伝搬型ネットでは初期の頃から層を増やすと表現力が高まることがわかっていました.つまり,初期の頃から多層にする発想はあったわけです.では,なぜ今になってDeep Learningが出てきたかというと,ニューラルネットワークを多層にするとうまく機能しなくなってしまう問題があったのです.

4. 順伝搬型ネットの学習と誤差逆伝搬法

多層にすると起こる問題を説明する前に,順伝搬型ニューラルネットの学習方法について説明します.

入力層と出力層の間に,もう一層はさんだ順伝搬型ニューラルネットを考えます.このような入力でも出力でもない層を隠れ層と言います.入力ベクトル$\boldsymbol{x}$を考えます.ここで$\boldsymbol{z}^{(1)}=\boldsymbol{x}$として,入力層のニューロンが隠れ層のニューロンそれぞれに伝える値はベクトル$\boldsymbol{z}^{(2)}$で表します.入力層から隠れ層への結合強度を$\boldsymbol{W}^{(2)}$とすると入力層の出力ベクトル$\boldsymbol{z}^{(2)}$は$\boldsymbol{u}^{(2)}$を用いて以下のように表せます. \begin{eqnarray*} \boldsymbol{z}^{(1)}&=&\boldsymbol{x} \\ \boldsymbol{u}^{(2)}&=&\boldsymbol{W}^{(2)} \boldsymbol{z}^{(1)} + \boldsymbol{b}^{(1)} \\ \boldsymbol{z}^{(2)}&=&f(\boldsymbol{u}^{(2)}) \end{eqnarray*}

ここで$f(\cdot)$は活性化関数と呼ばれます.活性化関数はいろいろな種類があり,種類によって特性も異なりますが,最もよく用いられるのは標準シグモイド関数$f(x)=\dfrac{1}{1+e^{-x}}$です.

同様に隠れ層から出力層への出力値$\boldsymbol{z}^{(3)}$は以下のように表されます. \[ \boldsymbol{u}^{(3)} = \boldsymbol{W}^{(3)} \boldsymbol{z}^{(2)} + \boldsymbol{b}^{(3)} \] 結果,このニューラルネットの出力値$\boldsymbol{y}$は以下のようになります. \[ \boldsymbol{y} = \boldsymbol{z}^{(3)} = g(\boldsymbol{u}^{(3)}) \] ここで$g(\cdot)$も活性化関数ですが,出力層ではニューラルネットの目的に応じて異なった活性化関数が用いられます.今回は,回帰モデル(regression)を想定して以下の様な線形写像関数を想定します. \[ g(\boldsymbol{u}) = \boldsymbol{u} \] 他に,クラス分類問題(Classifier)ではsoftmax関数などが用いられます.

学習するには教師信号と呼ばれるベクトルを用います.ニューラルネットの出力を教師信号に近づけることで,学習していくのです.ここで,教師信号をベクトル$\boldsymbol{d}$とおいて,教師信号とニューラルネットの出力との誤差を,以下のようの誤差関数(二乗誤差)$En$で表すとします. \[ En=\dfrac{1}{2}\|\boldsymbol{y}-\boldsymbol{d}\|^2 \] この誤差関数を最小にすることを考えます.誤差関数は二乗していることから極小値を持つ二次関数であるとわかります.そのため,誤差関数$En$の各ユニットに対する微分値を0にしてやればいいのです. 出力層の重みについての微分は以下のように計算できます. \begin{eqnarray*} \dfrac{\partial En}{\partial \boldsymbol{W}^{(3)}} & = & (\boldsymbol{y}-\boldsymbol{d})(\boldsymbol{z}^{(2)})^\mathrm{T} \end{eqnarray*} 次に中間層の重みについての微分を行いますが,単純に微分すると複雑になってしまいます.そのため,次のような式を考えます. \begin{eqnarray} \dfrac{\partial En}{\partial \boldsymbol{W}^{(2)}} &=& \dfrac{\partial En}{\partial \boldsymbol{u}^{(2)}} \dfrac{\partial \boldsymbol{u}^{(2)}}{\partial \boldsymbol{W}^{(2)}} \\ &=& \dfrac{\partial En}{\partial \boldsymbol{u}^{(3)}} \dfrac{\partial \boldsymbol{u}^{(3)}}{\partial \boldsymbol{u}^{(2)}} \dfrac{\partial \boldsymbol{u}^{(2)}}{\partial \boldsymbol{W}^{(2)}} \\ \end{eqnarray} これより中間層の重みについての微分は以下のように計算できます. \begin{equation} \dfrac{\partial En}{\partial w^{(2)}_{ji}} = \left( f'(u^{(2)}_j) \sum_{k} w^{(3)}_{kj} (u^{(3)}_k-d_k) \right) x_i \end{equation}

重みは導出した式を用いて以下のように更新されます. \begin{eqnarray} \boldsymbol{W}^{(2)}(\tau+1) & = & \boldsymbol{W}^{(2)}(\tau) -\eta \dfrac{\partial En}{\partial \boldsymbol{W}^{(2)}} \\ \boldsymbol{W}^{(3)}(\tau+1) & = & \boldsymbol{W}^{(3)}(\tau) -\eta \dfrac{\partial En}{\partial \boldsymbol{W}^{(3)}} \end{eqnarray} ここで$\tau$は更新回数を表し,$\eta$は1回あたりの更新量を表します.

このように出力層から入力層に向かって誤差が逆方向に伝搬することから,誤差逆伝搬法と呼ばれます.しかし,層が深くなると誤差に関与するニューロンの数が膨大に増えて発散してしまい,1つあたりのニューロンの更新量が著しく小さくなってしまいます.つまり全く学習しなくなってしまうわけです.

このように層が深くなることで誤差が発散してしまい,学習できないのが長い間解決できなかった問題でした.これを解決し,機能するようになったのが Deep Learning(深層学習)です.

5. スパースコーディング

今までのニューラルネットが多層にすると学習しなくなってしまったのは,誤差が各ニューロンに分散していくにつれ,極めて小さな値になってしまうからでした.これを改善して深い層構造でもうまく機能するようにしたのがDeep Learningなわけです。

Deep Learningには様々な実装方法があります.代表的なものは以下の3つです.

このうち,次元圧縮することで特徴を抽出し,データの特徴に合わせた偏りのある重みを初期値として事前に学習させることで誤差が発散するのを避ける手法がAutoencoderとRestricted Boltzmann Machineです.このように疎な重みにすることをスパースコーディング(Sparse Coding)といいます.

6. Autoencoderを用いたDeep Learningの実装

Deep Learningの実装の1つとして,Autoencoderを重ねるDeep Autoencoderがあります.Autoencoderは3層のニューラルネットを考え,入力と出力のユニット数が同じで,隠れ層のみ異なったユニット数からなります.大抵隠れ層の次元は少ないことが多いです.このとき学習を入力と出力 が同じになるように学習を行います.こうすることで入力層から隠れ層までがエンコーダ,隠れ層から出力層までがデコーダとして働くようになります.

Autoencoderを用いたDeep Learningの実装方法ではこのようにしてできたAutoencoderを重ね,最後に識別用のニューラルネットをつなげることで実装します.(余談ですが,最終段はSVMを用いる場合 もあります).

Autoencoderの改良版として,入力する際に故意にノイズを加えて入力し,出力した画像がノイズを付加させる前の画像になるように学習させます.すると,このAutoencoderはノイズを除去する力を持ちます.このようにして学習したAutoencoderをdenoising Autoencoderと呼びます.これを同様に積み重ねて実装したDeep LearningをStacked denoising Autoencoderと呼びます.


戻る