読んだ本メモ⑳ 「ゼロから作るDeep Learning」 斎藤康毅著 オライリージャパン

科学読み物、小説ばかりでなくてこういうものも読んでいる。読んでいるというか、プログラミングのスキルアップのときの教科書や辞書的な使い方として、オライリージャパンの書籍はよく利用しているのだが、今回読んだものは、昨今注目の的であるディープラーニングの理論をおおざっぱに理解する上で非常にためになったので、ここで取り上げた。


本書は、Pythonを使いながら、Deep Learningを実装し、その理論を学ぶことを目的としている。Deep Learningを学ぼうという人であればもちろん、Pythonという言語のことはご存じだろう。本書はPython初学者のみならず、プログラミングに馴れていない方でも十分にキャッチアップできる内容だと思う(個人的な感想です。Python入門に1章分紙面が割かれている)。
また、実装をすることでDeep Learningの理論の理解がより一層進むのは確実だが、Deep Learningの基本的な理論を知りたいだけであれば、各章のおおむね前半部分にて記載された、アルゴリズムや数学的背景を追うだけでも十分だと感じた。

実装、理論の理解いずれの目的にしても、初学者でも手に取りやすい入門書である一歩言うで、物足りなさも多少は覚えるが、入口としては適した一冊だろう。今後のためにと、Deep Learningの基本理論について本書の流れに沿って用語解説の形で以下にまとめた。


パーセプトロン:アルゴリズムの一つ。複数の信号を入力として受け取り、一つの信号を出力する。ノード(ニューロンとも呼ばれる)とそれらを結ぶエッジによって構成される。各エッジには「重み」が、ノードには「バイアス」(出力をするかどうかのしきい値)がパラメータとして設定でき、パラメータによってANDやORゲートといた論理回路を構成できる。さらに、それらの組み合わせ(例えば、二層にすることでXORゲートが可能)によってより複雑な判別も可能となる。

ニューラルネットワーク:入力層、中間層、出力層で構成される多層のパーセプトロンであるが、出力の決定にパーセプトロンのように定数のバイアスを用いるのではなく、活性化関数を用いる。正確には、パーセプトロン(もしくは単純パーセプトロン)では活性化関数に「ステップ関数」を採用していると言え、ニューラルネットワークでは、活性化関数に「シグモイド関数」などが採用される。

活性化関数:各ノードにおいて出力を決定する関数のこと。活性化関数には「非線形関数」が用いられる。もし「線形関数」(出力が入力の定数倍のような直線で表せる関数)を用いた場合、ニューラルネットワークで層を深くすることの意味がなくなってしまう。なぜなら、線形関数の繰り返しは、一つの線形関数で表現できてしまうからだ。活性化関数には「シグモイド関数」のほか、「ReLU(Rectified Linear Unit)関数」もよく用いられる。

訓練データとテストデータ:訓練データ(教師データとも呼ばれる)によって、最適なパラメータを探索し、テストデータによって、その訓練したモデルの評価をおこなう。訓練データとテストデータを分けるのは、モデルの汎化能力(まだ見ぬデータに対しての判別能力)を正しく評価するため。あるデータセットだけに過度に対応した状態を過学習(overfitting)と言う。過学習を避けることは、機械学習の重要な課題。

損失関数(loss function):ニューラルネットワークの性能の“悪さ”を示す指標。現状のモデルが訓練データに対して、どれだけ適合していないか、を表す。2乗和誤差や交差エントロピー誤差などが用いられる。学習の過程において、損失関数の値が出来るだけ小さくなるように、パラメータを更新していく。パラメータの微分(勾配)を手がかりに、損失関数の最小値を探索する。

誤差逆伝播法:パラメータの勾配を高速に求める手法。各ノードにおける、「局所的な微分」を求め、逆方向(出力から入力へ)に合成していくことで、各パラメータの勾配(出力に対する影響力)を求めることができる。

確率的勾配降下法( stochastic gradient descent:SGD):勾配方向にパラメータを更新する最適化(optimization)手法。勾配が緩やかな場合に探索が非効率になるなどの欠点がある。最適化の手法にはその他に、モーメンタム(Momentum)、AdaGrad、Adamなどがある。

Weight decay(荷重減衰):過学習抑制のための手法。学習の過程において、大きな重みを持つことに対してペナルティを課すことで、過学習を抑制する。その他にも、Dropout(ニューロンをランダムに消去しながら学習する手法)は複雑なニューラルネットワークにおいて有効である。

畳み込みニューラルネットワーク(convolutional neural network:CNN):画像認識や音声認識など、多くのdeep learningがCNNをベースとしている。「Convolutionレイヤ(畳み込み層)」「Poolingレイヤ(プ―リング層)」を組み合わせたもの。例えば、画像データは3次元の形状であり、この形状は空間情報を持っている。畳込み層は、この形状を維持できる。畳み込み層では、入力と「フィルタ」の畳み込み演算がおこなわれる(学習後のパラメータは、縦・横のエッジ検出に適したフィルタ構成などにしばしばなっている)。プーリング層は縦・横の空間を小さくする演算であり、学習するパラメータは持たない。

ディープラーニング:上述してきたような特徴を持った、層の深いニューラルネットワーク。「層を深くすること」の重要性については、理論的には多くのことはわかっていないのが現状であるが、深くすることで認識性能は向上している。層を深くしたネットワークは、層を深くしなかった場合に比べて、より少ないパラメータ数で同レベルの表現力を達成できることがその一因と考えられている。また、認識精度を高めるための手法として、Data Augmentation(データ拡張)などが有効である。データ拡張とは、入力に対して、移動や回転などの微小な変化を与え、画像枚数を増やすことである。


コメント

このブログの人気の投稿

入力インピーダンスってなに?

脳の3DグラフィックをOpenFrameworksで作成

デトロイト美術館展 上野の森美術館