元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

【初心者】Deep Learning用語まとめ

「ゼロから作るDeep Learning」を読んでいる。 一気読みできればいいが、そういう訳ににもいかないので簡単な用語を忘れることがある。 そんな時に本を開くのは億劫なので、ここに簡単な用語をまとめておく。


ニューラルネットワークに入る前に...

  • パーセプトロン
    多入力単出力の構造 信号は0, 1 (ステップ関数) 単純パーセプトロンでAND, NAND, ORゲートを作れる。(多層パーセプトロンにすればXORも可能)

  • バイアス
    上流からの重み付き和とは別に常に加算される値

  • 白色化(whitening)
    データ全体の分布の形状を均一にする方法

  • one-hot-label
    ラベルの表現方式のひとつ。
    ラベルが0~9まであり、正解ラベルが7の時、[0,0,0,0,0,0,1,0,0]のように表示する。

ニューラルネットワーク

  • 活性化関数
    入力信号の総和を出力信号へ変換する。単純パーセプトロンではステップ関数を使っていた。ステップ関数以外を使えばニューラルネットワークと呼ぶようになるらしい(ゼロから作るDeep Learning, p44より)。活性化関数には線形関数を用いてはならないことに注意(多層にする意味がなくなる。単純な合成写像を考えてみればよい。)。

    • ステップ関数
      閾値を超えたら1、それ以外は0を出力する関数。
      all-or-nothingな信号という点で一番ニューロンっぽい気がする(個人の感想)

    • シグモイド関数
       {} $$ \begin{align} \frac{1}{1+\exp(-x)} \end{align} $$ 値を[0, 1]に押し込めるのが嬉しい関数。
      滑らかな関数(微分可能)であるところもポイント。

    • ReLU (Rectified Linear Unit) 関数
      閾値を超えたら入力をそのまま出力、それ以外は0を出力する関数。

  • 出力層の活性化関数
    出力層だけ活性化関数を特別扱いする。

    • 恒等関数
      入力をそのまま出力する。回帰問題に用いる。

    • ソフトマックス関数
       \displaystyle y_kを入力信号、 \displaystyle y_kを出力信号として  {}
      $$ \begin{align} y_k=\frac{\exp(a_k)}{\sum_{i=1}^{n} \exp(a_i)} \end{align} $$
      これも出力を[0, 1]に押し込めるのがうれしい。
      オーバーフロー対策に定数  \displaystyle C を導入して  {} $$ \begin{align} y_k = \frac{\exp(a_k-C)}{\sum_{i=1}^{n}{\exp(a_i-C)}} \end{align} $$
      とするのが良いらしい。 \displaystyle Cには \displaystyle \{a_1, a_2, \ldots, a_n\}の最大値を持ってくることが一般的。

損失関数

ニューラルネットワークの学習に用いる損失関数いろいろ。 以下ではyを出力(ラベルごとの確率)、tを正解ラベルのone-hot-labelとする。kはデータの次元数とする。

  • 二乗和誤差
    説明不要。お馴染み。
     {} $$ \begin{align} E = \frac{1}{2} \sum_{k} (y_k-t_k)^2 \end{align} $$

  • 交差エントロピー誤差
     \displaystyle t_kに関する \displaystyle -\log y_kの期待値を計算していることになる。情報理論の観点で言えば、 \displaystyle t_kに関する \displaystyle y_kの平均符号長を計算していることになる。情報理論ででてくるエントロピーと異なり自然対数を用いているが、本質的には同じものなので注意。今回は細かい説明はしないので、ちゃんと理解したい場合は符号化理論を勉強しましょう。
     {} $$ \begin{align} E = - \sum_{k} t_k \log y_k \end{align} $$

ニューラルネットワークの学習

  • ミニバッチ学習
    ニューラルネットワークの学習において、全データについて損失関数を計算するのは現実的でない。
    そこで一部のデータをランダムサンプリングして損失関数を求め、それを全データの代表値とみなして学習を行う方法のこと。
    ランダムサンプリングしているといっても、そもそもどうやってデータが集められたのかには注意する必要があるなと思った(個人の感想)。

  • 勾配法
    勾配法については以下を参照

hotoke-x.hatenablog.com

  • 確率的勾配降下法SGD; Stochastic Gradient Descent)
    ミニバッチとしてランダムサンプリングされたデータを使用した勾配降下法のこと。
    以下の式に従ってパラメータ \boldsymbol{W}の更新を行う。  {} $$ \begin{align} \boldsymbol{W} \leftarrow \boldsymbol{W}- η\frac{\partial L}{\partial \boldsymbol{W}} \label{s_g_d} \end{align} $$  Lは損失関数、 \etaは学習率である。

  • エポック(epoch)
    学習の単位のこと。
    訓練データをすべて使い切った時の回数に対応。
    1000個のデータに対して50個のミニバッチで学習する場合、20回のミニバッチ学習=1 epochとなる。
    エポックごとに訓練データの認識精度とテストデータの認識精度を比較する。この時、認識精度に差があると過学習が起きていることになる。

誤差逆伝播

数値微分を用いたニューラルネットワークの学習は実装が容易。一方で計算に時間がかかる。誤差逆伝播法で勾配の計算を効率よく行う。

  • 計算グラフで考える
    ノードごとの局所的な計算で済む。 局所的な計算結果を保持できるので、逆伝播によって微分が計算できる。
    ただし、バッチごとに計算を行っている場合行列演算になるので、行列積が可換でないことに注意。
    縮約記法を使えば簡単(以下の記事を参照)。

hotoke-x.hatenablog.com

hotoke-x.hatenablog.com

hotoke-x.hatenablog.com

  • 勾配確認
    数値微分による逆誤差伝播の実装と、解析解による逆誤差伝播の実装の値を比べる事。
    解析解による実装を行った時、解が間違っていないことを確認できる。
Momentum

SGDの\eqref{s_g_d}に慣性項を導入した。前の状態を引き継ぐことでSGDの欠点の一つであるパラメータの過剰更新を抑制する。パラメータ更新の式は以下の通り。

 {} $$ \begin{align} \boldsymbol{v}_{t+1} &\leftarrow \alpha \boldsymbol{v}_{t} - η \frac{\partial L}{\partial \boldsymbol{W}} \\ \boldsymbol{W} &\leftarrow \boldsymbol{W} + \boldsymbol{v}_{t+1} \end{align} $$

AdaGrad

Adaptive Gradientの略?
学習率を減衰させていく方法。初めは大雑把に、時間が経つにつれ小さく探索する。パラメータの更新式は以下の通り。

 {} $$ \begin{align} \boldsymbol{h} &\leftarrow \boldsymbol{h} + \frac{\partial L}{\partial \boldsymbol{W}} \odot \frac{\partial L}{\partial \boldsymbol{W}} \\ \boldsymbol{W} &\leftarrow \boldsymbol{W} -η \frac{1}{\sqrt{\boldsymbol{h}}} \frac{\partial L}{\partial \boldsymbol{W}} \end{align} $$

ここで、 \displaystyle \odotアダマール積(要素ごとの積)である。 \displaystyle \frac{\partial L}{\partial \boldsymbol{W}}が大きい要素は、次の学習率がより小さくなるように調整される。ループによって学習率が下がる一方なので、最終的には学習が進まなくなるのが欠点。これを改善したものにRMSPropという方法があるらしい。

Adam

MomentumとAdaGradの融合(AdaptiveなMomentumということだと思う)。
詳細は原著*1を読まないとわからない。

重みの初期値問題

小さい値をランダムに与える。
過学習を防ぐために小さい値で重みを学習したいという願いが込められている。
PRMLでみた正則化に似ていると思った(制約を与えたわけでは無いが、事前分布に願いを込める意味で)。

勾配消失

例えばシグモイド関数の値が0, 1付近だと、微分値は小さくなる。アクティベーションが0, 1に偏っていると、逆誤差伝播の時に勾配が消失し、学習が進まなくなる。特定の値にアクティベーションの値が集中するのも良くない。ノード全体が同じ値を出力するということなので、ノードが複数存在している意味が無くなってしまう。

  • Xavierの初期値
    前層ノードの個数 \displaystyle nを使って \displaystyle \frac{1}{\sqrt{n}}標準偏差を持つ分布を用いる(なんだか中心極限定理と関係がありそう)。 活性化関数が線形であることが前提らしい。sigmoid関数、tanh関数は対称で中央付近が線形とみなせるとのこと(それでいいの??)。詳細は原著参照*2

  • Heの初期値
    ReLUを用いる場合はHeの初期値が良いとの事。 \displaystyle \frac{2}{\sqrt{n}}標準偏差を持つ分布を用いる。ReLUは負の値が全部0に押し付けれられるので、Xavierの初期値よりも広がりを持たせるということらしい(ReLUが青天井の値を持つことを考えると3でも5でも良い気がする...)。 こちらも詳細は原著参照*3

  • Batch Normalization
    各層ごとにアクティベーション分布に広がりを持たせたいなら、各層ごとに調整したらいいじゃん。と思ったら書いてあった。データと各層ごとの出力を \mathcal{N}(0,1)に標準化する。 活性化関数の前と後どちらでBatch Normalizationするかは議論になっているらしい。
    個人的には活性化関数の後でBatch Normalizationの方が自然な気がしている。理由は、各層の入力に広がりを持たせたいのが目的なら、その直前で分布の調整をした方が自然に感じるから。活性化関数の前で標準化してしまうと、活性化関数によって再び分布が偏る可能性が排除できない。だからこそXavierの初期値では線形関数である前提が必要だったのだと思う。活性化関数の後なら活性化関数が非線形でも使えるかもしれない(という期待を込めた感想)。
    histogram equalizationとか使ったらどうなるんだろう..。アルゴリズム的に破綻するかもしれないけど。

正則化

過学習を抑制する方法。

過学習

訓練データのみに最適化されてしまって、テストデータに全然対応できない状態。

Weight decay

損失関数に、重み \displaystyle \boldsymbol{W}のL2ノルム正則化 {} $$ \begin{align} \frac{1}{2}\lambda\boldsymbol{W}^2 \end{align} $$ を加算して学習を行う。

 \displaystyle \lambdaはハイパーパラメータ。

(ABICのノリで \displaystyle \lambdaの自動決定とかできないだろうか)

Dropout

ノードをランダムに除去しながら学習する方法。ノードを除去することで毎回異なるモデルを生成するので疑似的なアンサンブル学習として見れるとのこと。

検証データ(validation data)

ハイパーパラメータを調整するためのデータ。 テストデータでハイパーパラメータを調整すると、ハイパーパラメータがテストデータに関して過学習を起こすので別に用意する必要がある。

ハイパーパラメータの最適化

書籍を読んだ感じでは、グリッドサーチっぽかった。ただ、ハイパーパラメータ探索ではグリッドサーチよりもランダムに探索したほうが良い結果になるとの事。ハイパーパラメータごとに結果に与える影響度が異なるからだとか。ハイパーパラメータを探索するスケールが適当でないことが多いってことかな?

ベイズ的に最適化する方法もあるらしい*4MCMCマルコフ連鎖モンテカルロ法)かABC(近似ベイズ計算)だろうか。パラメトリックに最適化するなら事前分布の設定がまた問題になりそう。何はともあれ、これも原著を読まないことにはわからない。

畳み込みニューラルネットワーク(Convolutional neural network: CNN)

全結合層だと、データの位置情報を無視して学習してしまう。 CNNでは位置情報も学習できる(ということになっている)。

Convolution レイヤ

フィルタを通すことで、出力サイズを落とす(次元という言い方は正しくないかもしれない)。 例えばMNISTなら、28x28だった画像をフィルタを通すことで26x26にするような操作。 3次元データ(例えばRGB画像)に対してフィルタを適用する場合は、フィルタも3次元にし、出力される3層のz軸方向に和をとる(なので出力は2次元)。

フィルタを複数個用意すれば出力は3次元になる。バッチの個数分同じフィルタを用意すれば一括処理が可能になる。

パディング

Convolution レイヤばかり通していたら出力サイズが小さくなる一方なので、入力行列の外側を何らかの値(例えば0)で埋めて、畳み込みによる出力サイズの現象を防ぐ方法。

ストライド

フィルターを適用する位置の間隔

Pooling レイヤ

空間を小さくする演算処理。
Poolingのウィンドウサイズとストライドは同じ値にするのが通常。
学習パラメータがない。
チャネル数も変化しない。
微小な位置変化に対してロバスト。ちょっとぐらい入力データが動いても、フィルタの特性(フィルタ適用範囲の最大値をとってくるなど)によって出力結果が変化しにくくなる。

画像認識ではMax poolingが一般的らしい。Average poolingもあるが、確かに外れ値に引っ張られるのはちょっと使いにくそう(素人的感想)。 入力をFFTした画像とかにしたらどうなるのだろう。ノイズはノイズで学習しやすくなる気がする(これも素人的感想)

代表的なCNN

LeNet

  • 畳み込み層とプーリング層を重ねて、最後に全結合層を使う。
  • 活性化関数はReLU
    オリジナルではプーリング層はただサブサンプリングするだけで、活性化関数もsigmoidだった。現在はMax poolingが主流らしい。

AlexNet

  • 活性化関数にReLUを使用
  • 局所正規化を行う(上で書いたBatch Normalizationのようなものだと思う)。
  • Dropoutを使用する

Deep Learning

VGG*5

  • ReLUを使用
  • 重みの初期値はHeの初期値を使用(ReLUを使用するから?)
  • 小さなフィルタ(3x3)による畳み込み(些細な特徴でも拾いたいから?)
  • Adamでパラメータ更新
  • 全結合層の後にDropout(上層でメチャクチャ特徴を学習させて、最後にアンサンブル学習することで変な学習を回避??)

データを回転させたり動かしたりして疑似的にデータを増やす「データ拡張」も認識精度向上に貢献するとのこと。

層を増やす利点

  1. 単純にパラメータが減る。
    5x5のフィルターによる出力と、3x3のフィルタを2回通すのとでは、出力サイズは同じだが、後者の方がフィルタの要素数が小さくて済む。
  2. より少ないデータで学習ができる 層が深いと高度な情報が抽出できるため

他のモデルの例

  • GoogLeNet*6
    VGGとは違って、層のつながり自体が2次元的(インセプション構造というらしい)。1x1フィルターの畳み込みでサイズを削減することによって計算速度を向上させているとの事。
    ただ、層のつながりを2次元的にする恩恵はなんなのだろうか...。これも要原著参照ということで。

  • ResNet*7
    入力層を畳み込み層をすっ飛ばして、出力と合算させる構造が入っている。
    層を深くしすぎて抽出できる特徴がスッカスカになって来たころに、昔を思い出させようとするお気持ちなのだろうか。もしそうなら、層の深ささえ適切なら同じような結果が得られそうな気がした。また、合算処理によって新たな特徴マップが得られるということなら、データ拡張でも似たような結果が得られそうだとも思った。知らんけど。

物体検出の例

  1. R-CNN*8
    高速版もあるらしい*9

セグメンテーションの例

  1. FCN*10
    全結合層が畳み込み層からなる。

画像キャプション生成

代表的なものとしては、NIC*11(Recurrent Neural Netwotk (RNN)の一種)がある。 再帰的な構造があり、時系列や言語などの連続データに使われる。

画像スタイル変換

絵のテイストを変えたりする*12

画像生成

スタイル変換とは異なり、完全に新しい画像を生成する。
DCGAN*13

Deep Q-Network(DQN, 強化学習の一つ)

  1. エージェントが行動する
  2. 行動に対する報酬を得る これを繰り返してずーっと学習させる。
    DQNでは最適行動価値関数とかいう関数をCNNで近似するらしい。これも論文読まないとわからないかも*14

宿題

参考書籍

斎藤 康毅(2016)「ゼロから作るDeep Learning-Pythonで学ぶディープラーニングの理論と実装」株式会社オライリー・ジャパン

*1:D. Kingma and J. Ba, “Adam: A method for stochastic optimization,” arXiv preprint arXiv:1412.6980, 2014.

*2:X. Glorot and Y. Bengio, “Understanding the difficulty of training deep feedforward neural networks,” Proceedings of the thirteenth international conference on artificial intelligence and statistics, 2010.

*3:K. He, X. Zhang, S. Ren, and J. Sun, “Delving deep into rectifiers: Surpassing human-level performance on imagenet classification,” Proceedings of the IEEE international conference on computer vision, 2015.

*4:J. Snoek, H. Larochelle, and R. Adams, “Practical bayesian optimization of machine learning algorithms,” Advances in neural information processing systems, 2012.

*5:K. Simonyan and A. Zisserman, “Very Deep Convolutional Networks for Large-Scale Image Recognition,” arXiv preprint arXiv:1409.1556, 2014.

*6:C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich, “Going deeper with convolutions,” Proceedings of the IEEE conference on computer vision and pattern recognition, 2015.

*7:K. He, X. Zhang, S. Ren, and J. Sun, “Deep residual learning for image recognition,” Proceedings of the IEEE conference on computer vision and pattern recognition, 2016

*8:R. Girshick, J. Donahue, T. Darrell, and J. Malik, “Rich feature hierarchies for accurate object detection and semantic segmentation,” Proceedings of the IEEE conference on computer vision and pattern recognition, 2014.

*9:S. Ren, K. He, R. Girshick, and J. Sun, “Faster r-cnn: Towards real-time object detection with region proposal networks,” Advances in neural information processing systems, 2015

*10:E. Shelhamer, J. Long, and T. Darrell, “Fully Convolutional Networks for Semantic Segmentation,” Ieee T Pattern Anal, vol. 39, no. 4, pp. 640–651, 2016.

*11:O. Vinyals, A. Toshev, S. Bengio, and D. Erhan, “Show and tell: A neural image caption generator,” Proceedings of the IEEE conference on computer vision and pattern recognition, 2015.

*12:L. Gatys, A. Ecker, and M. Bethge, “A neural algorithm of artistic style,” arXiv preprint arXiv:1508.06576, 2015.

*13:A. Radford, L. Metz, and S. Chintala, “Unsupervised representation learning with deep convolutional generative adversarial networks,” arXiv preprint arXiv:1511.06434, 2015.

*14:Mnih, K. Kavukcuoglu, D. Silver, A. Rusu, J. Veness, M. Bellemare, A. Graves, M. Riedmiller, A. Fidjeland, G. Ostrovski, S. Petersen, C. Beattie, A. Sadik, I. Antonoglou, H. King, D. Kumaran, D. Wierstra, S. Legg, and D. Hassabis, “Human-level control through deep reinforcement learning,” Nature, vol. 518, no. 7540, p. 529, 2015.

*15:D. Silver, A. Huang, C. Maddison, A. Guez, L. Sifre, G. van den Driessche, J. Schrittwieser, I. Antonoglou, V. Panneershelvam, M. Lanctot, S. Dieleman, D. Grewe, J. Nham, N. Kalchbrenner, I. Sutskever, T. Lillicrap, M. Leach, K. Kavukcuoglu, T. Graepel, and D. Hassabis, “Mastering the game of Go with deep neural networks and tree search,” Nature, vol. 529, no. 7587, p. 484, 2016.