深層学習を勉強して説明してみた

以下の記事で、とりあえずやってみれば機械学習(Keras)のとっかかりがつかめるだろうと考えていましたが、甘かったです。反省。

「青空文庫で作者っぽさ判定(KERAS+character-level cnn)」をやってみた

そこで、「勉強して説明してみた」シリーズの1つとして、Googleで「深層学習」と検索し、(日本語のページに限定して)表示された10件から分かったことをまとめました。その10件以外のページは(基本的には)読んでいません、と言いたいところですが、この10件だけでは深層学習とは一体どのような物なのか、という内容でまとめられなかったため、他にもいくつか読みました。また、数学的な正確さはこの記事では話題にしません。深層学習の概要をフワッと理解するところまでを目的とします。そのため、数式やグラフは省略します。必要に応じて、他のサイトを参照してください。


この記事を書くために検索したときは、以下の10件が表示されていました。

  1. 深層学習の非常に簡単な説明 – SlideShare
  2. 深層学習 Deep Learning (監修:人工知能学会)
  3. 深層学習 (機械学習プロフェッショナルシリーズ)
  4. ディープラーニング – Wikipedia
  5. ディープラーニングは何が「ディープ」なのか:日本経済新聞
  6. 深層学習いろいろ – Qiita
  7. 機械学習・深層学習・AI(人工知能)の違い|clonos|GoogleCloudPlatformの導入・運用支援
  8. 深層学習(ディープラーニング)の原理、CNN、RNN、LSTM,GANを図解で解説 | TickTack World
  9. 深層学習と機械学習の違いとは? 実例で分かるその活用 - TechTargetジャパン データ分析
  10. 機械学習と、深層学習の基礎知識

他のサイトも非常に参考にさせていただきました。特に、ニューラルネットワークと深層学習を読んで理解が進んだと思います。

この程度の理解でも、KerasのSequentialモデルのガイドを読めるようになりました。

では、始めましょう。


深層学習(ディープラーニング)

地層のように複数の層を準備して、決められた数値計算を何万回と繰り返し、(目的を達成するための)関数を作成する計算手法のことを、深層学習と呼びます。作成された関数に画像を入力すると、画像に描かれている数字が認識されて「3」という数値が返ってきたり、写真に写っている物体が認識されて「踏切」という単語が返ってきたりします。

※機械学習では、4層以上を深層学習、3層なら階層型ニューラルネット、2層ならパーセプトロンと呼ぶそうですが、この記事では特に区別せず、3層以上を想定して説明しています。

深層学習の基本的な仕組みを説明するキーワード

ここからは深層学習によく出てくる単語を分類しながら、深層学習の概要を説明していきます。

この方法で説明すると、例えば「シグモイド関数」と「ReLU」が「活性化関数」の仲間で、交換可能であることがわかったり、「2乗誤差関数」と「交差エントロピー関数」は「目的関数」の仲間で、やはり交換可能であるということがわかったりすると思います。また、「シグモイド関数」と「2乗誤差関数」は交換できないということもフワッと伝わることを期待しています。

ニューラルネットワーク

人工ニューロンという数式的なモデルで表現したものです。

人工ニューロンは、複数の層に分かれて配置されており、ある層の人工ニューロンの出力が、後ろの層の人工ニューロンの入力になっています。

一番左の層は入力層、一番右の層は出力層、それ以外の層は隠れ層と呼ばれます。入力層から入力されたデータは、定められた計算が行われながら、隠れ層を経由して出力層に伝播します。

人工ニューロン(ノード)

ニューラルネットワークを構成する基本単位です。1つ以上の入力を受け取り、1つの出力を生成する関数とも考えられます。

研究者によって提案された人工ニューロンは以下のとおりです。

  • パーセプトロン(単純パーセプトロン)
  • シグモイドニューロン(ロジスティック・ニューロン、多層パーセプトロン)
  • 形式ニューロン

重みとバイアス

人工ニューロンでは入力をそのまま使用するのではなく、入力ごとに重みを掛け、バイアスを加えた値を元に、出力が計算されます。

重みとバイアスは、機械学習によって自動的に調節される値で、この初期値の選び方も学習の早さに影響を与えます。

スコア関数、活性化関数、目的関数

活性化関数と目的関数の大きな目的は、深層学習での学習を行うことです。また、学習が早く進むことも重要と考えられています。したがって、単に学習するだけでなく、学習が不必要に停滞しない関数(数式)が最善の関数と考えられ、現在も研究者によって最善の関数が提案されています。

※上図では、人工ニューロンへの入力に対して、重みとバイアスをアレコレした値をuとして記載しています。

スコア関数

人工ニューロンに入力された値からuを計算するための関数のような気がします。(意見を求めています。)

活性化関数(出力関数)

人工ニューロンに入力された値から計算した(スコア関数で計算した)uを元に、出力を計算するための関数(数式)です。

隠れ層の活性化関数

研究者によって隠れ層の活性化関数として使用できると提案された関数は以下のとおりです。現在のところ、ランプ関数(ReLU)が最善であるとされているようです。

  • ランプ関数(ReLU)
  • ステップ関数
  • 単純パーセプトロン
  • シグモイド関数
  • ソフトサイン関数
  • ソフトプラス関数
  • 恒等関数
  • 双曲線関数(tanh)
  • (2次以上の)多項式関数
  • 絶対値
  • 動径基底関数
  • ウェーブレット関数
  • maxout関数

活性化関数の概要を理解するには、以下の記事がおすすめです。また、活性化関数 – Wikipediaや、深層学習 Deep Learning (監修:人工知能学会)の「4.5 活性化関数」(P.142)にも記載があります。

[ディープラーニング] 活性化関数

出力層の活性化関数

出力層の活性化関数として使用される関数は以下のとおりです。目的に応じて、使用する関数は決まってきているようです。

  • 単純パーセプトロン(回帰用)
  • シグモイド関数(二値分類用)
  • ソフトマックス関数(多クラス分類用)

目的関数(コスト関数、損失関数、最適スコア関数)

人工ニューロンの出力と、期待した出力(教師が設定した出力)の誤差を判定するための関数です。目的関数の主な目的は、やはり深層学習での学習を早く進めることです。人工ニューロンの出力と、期待した出力の誤差が直感的に大きいときに、目的関数が算出する値も大きいことが期待されます。

研究者によって目的関数として使用できると提案された関数は以下のとおりです。

  • 0-1損失関数
  • ロジスティック損失関数
  • 指数損失関数
  • ヒンジ損失関数
  • 平滑化ヒンジ損失関数
  • 二乗誤差関数
  • τ−分位損失
  • Huber関数
  • ε許容誤差関数
  • 交差エントロピー関数

なお、機械学習のモデルごとに、よく使用される目的関数は決まっているようです。例えば、ヒンジ損失関数はサポートベクターマシンで使用されます。交差エントロピー関数はニューラルネットの多クラス分類で使用されます。また、ロジスティック損失関数は多層パーセプトロンやロジスティック回帰モデルで使用されるそうです。

目的関数を図示している記事がありましたので、紹介します。

目的関数による計算結果を小さくするためのアルゴリズム

入力層、隠れ層、出力層の人工ニューロンにおいて、目的関数によって算出される値(誤差と呼びます)を小さくすることを、学習を進めることと捉えます。そして、誤差を小さくするために使用されるアルゴリズムが勾配降下法です。勾配降下法は3種類あります。

  • 最急降下法(バッチ勾配降下法)
  • 確率的勾配降下法(SGD)
  • ミニバッチ勾配降下法

勾配降下法を最適化するさまざまなアルゴリズム

研究者によって、勾配降下法を最適化するアルゴリズムが発表されています。目的関数によって算出される値が、発散せずに素早く収束するアルゴリズムが、よいアルゴリズムと考えられます。

勾配降下法を最適化することの主な目的も、活性化関数や目的関数と同様、深層学習での学習を早く進めることです。特に重要なのは、学習率の調整と言われており、以下のようなアルゴリズムが提案されています。

  • Momentum
  • Nesterovの加速勾配降下法
  • Adagrad
  • Adadelta
  • RMSprop
  • Adam

現在のところ、Adamが最も評価されている手法のようですが、学習モデルによってはAdagradの方がよいこともあるようです。

誤差逆伝播法(バックプロパゲーション)

誤差を最小化するために学習(パラメーターを調節)する計算手法です。誤差逆伝播法が深層学習に適用されるまでは、重みやバイアスは研究者によって手動で設定されていたそうです。誤差逆伝播法が深層学習に適用されたことによって、深層学習が自動で進められるようになりました。

全結合層

全結合層の人工ニューロンでは、前の層のすべての人工ニューロンから入力を受け取り、計算結果を次の層へ出力します。

ちなみに、一部の人工ニューロンから多次元の入力を受け取り、計算結果を次の層へ出力する場合は、畳み込み層と呼ばれます。

畳み込み層、プーリング層

畳み込み層とプーリング層は、CNNと呼ばれるモデルで使用されます。この2つの層をセットで使用し、位置に関する子細な情報をうまく切り落とすことで、入力の些細なゆがみや平行移動に対して頑強になると考えられています。下図では、(残念ながら)畳み込み層とプーリング層のセットが1組しかありませんので、出力層の3番目の人工ニューロンからは、入力層の左上の人工ニューロン(黄緑色の人工ニューロン)の周辺の特徴が出力されそうです。

畳み込み層

畳み込み層の人工ニューロンでは、前の層の一部の人工ニューロンから多次元の入力を受け取り、計算結果をプーリング層へ出力します。畳み込み層には、機械学習によって自動的に調節される値があり、その値はフィルターとバイアスと呼ばれます。畳み込み層の人工ニューロンへの入力に掛けられる重みが、フィルターと呼ばれると考えても良いでしょう。上図の場合は3×3の入力を受け取り1つにまとめているので、フィルターは2次元で、サイズは3×3となります。

なお、前の層のすべての人工ニューロンから入力を受け取る場合は、全結合層と呼ばれます。

プーリング層

プーリング層の人工ニューロンでは、前の層(畳み込み層)から多次元の入力を受け取り、計算結果を次の層へ出力します。プーリング層には、機械学習によって自動的に調節される値はありません。プーリング層で利用されるアルゴリズムは以下のとおりです。

  • マックスプーリング
  • 平均プーリング
  • Lpプーリング

エポック

深層学習では、訓練データについて繰り返し学習することで、パラメーターを調整しています。この繰り返し回数のことを、エポックと呼びます。例えば30エポックは、30回学習を繰り返すことを意味します。

ハイパーパラメーター

深層学習を行う際、開発者が任意に決定できるパラメーターのことです。重みの初期値やバイアスの初期値、活性化関数の種類、目的関数の種類などがハイパーパラメーターです。

重みやバイアスは、深層学習のアルゴリズムによって自動的に調整されるため、ハイパーパラメーターではありません。

深層学習で発生する問題を説明するキーワード

深層学習では、以下のような様々な問題が発生します。

  1. 学習速度の低下(学習が遅い問題)
    • 勾配消失
    • 勾配爆発
    • 不安定勾配
  2. 過学習(過適合、過剰適合)
  3. 局所最適解への収束

ここからは、これらの問題の概要と、それを解決するための考え方を紹介します。

学習速度の低下(学習が遅い問題)

深層学習(機械学習でも)学習速度が遅いことは問題です。問題というと言い過ぎかもしれませんが、学習速度が速いことを目指して改善を続けるべきと考えられています。

深層学習では、重み、バイアス、フィルターなど、自動的に調節される値はパラメーターと呼ばれます。パラメーターは、目的関数によって計算される誤差を利用して、少しずつ調節することがよいとされています。そして、パラメーターが変化する量のことは、勾配と呼ばれます。

学習速度が低下する原因として、「パラメーターの変化が、適正な勾配で収まらないこと」が、あげられています。逆に、学習速度を安定させるためには、「パラメーターの変化を適正な勾配で収めること」が必要になると考えられます。

勾配が小さすぎると、学習が難しくなる状態になります。多層になると、次の層、またその次の層、と徐々に勾配が小さくなっていく問題を勾配消失問題と呼びます。

バッチ(ミニバッチ)

最急降下法やミニバッチ勾配降下法では、学習を早く、うまく進めるための一つの方法として、「バッチ」という考え方が導入されています。これは、すべてのデータを利用して学習を進めるのではなく、データの一部を利用することで計算量を減らそうという考え方です。この学習を進める際に利用するデータの一部(ひとまとめのデータ)を抽象的に「バッチ」と呼び、このときに利用するデータの数を「バッチサイズ」と呼びます。

バッチサイズが十分に大きければ、学習を進める際に利用したデータだけでも、全データを近似できることが期待されますが、計算量は多くなります。一方、バッチサイズが小さすぎると、学習を進める際に利用したデータだけでは、全データを近似できることは期待できませんが、計算量は少なくなります。

バッチサイズを適切な値にすることも、学習を早く、うまく進めるために重要と考えられています。

過学習(過適合、過剰適合、オーバーフィッティング)

過学習は、訓練データに対しては正解率が高くなるものの、テストデータに対しては正解率が非常に下がる現象です。目的はテストデータに対する正解率が高いことなので、この学習方法はまったく正しくないと考えられます。

正規化(正則化)

過学習を軽減するやり方の一つに、正規化があります。訓練データに特異的な点が含まれていたときに、過学習が起こりやすくなると考えられます。正規化は、このようなニューラルネットワークに悪影響を与えるような訓練データの影響を低減する方法です。

  • L1正規化(スパースコーディング)
  • L2正規化

ドロップアウト

ドロップアウトも過学習を軽減する方法の一つです。ドロップアウトは、訓練時に一部のノードをランダムに無効に設定することで、特定のノードだけを重視した学習を防ぐ方法です。

データ拡張

加工した訓練データを、新たな訓練データとすることで、過学習を防ぐ方法です。

局所最適解への収束

局所最適解は、近傍の解の中で最も最適な解を指します。少し離れたところに、局所最適解より最適な解があるかもしれないというのが、問題と考えられる一つの理由です。

局所最適解でも十分によい学習がなされているという考え方もあります。しかし、この考え方は、勾配降下法では局所最適解に落ち着くことを避けられないため、議論を終わらせるための屁理屈なのかもしれません。

深層学習の有名なモデル

深層学習の有名なモデルを紹介します。各モデルの主な用途等、詳細については、他のサイトを参照してください。

  • 多層パーセプトロン(MLP)
  • 畳み込みニューラルネットワーク(CNN)
  • 再帰型ニューラルネットワーク(RNN、回帰結合型ニューラルネットワーク)
  • ディープビリーフネットワーク(ディープボルツマンマシン、積層自己符号化器)
  • Residual Network(ResNet)
  • 長期・短期記憶(LSTM)
  • ゲート付き再帰型ユニット(GRU)
  • 双方向回帰結合型ニューラルネットワーク(BiRNN)
  • RNN Encoder-Decoder
  • Attention
  • メモリネットワーク(MemN)
  • Regions with CNN features(R-CNN)
  • Recurrent Weighted Average(RWA)
  • Quasi-Recurrent Neural Network(QRNN)