DL4US落ちたので、書籍『ゼロから作るDeeplearning』をやるしかない
【スポンサーリンク】
- はじめに:「ゼロから作るDeep Learning」とは
- 第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)
- 第8章 ディープラーニング(P241~P273 : 61分)
はじめに:「ゼロから作るDeep Learning」とは
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
10万部も売れているディープラーニング界隈では大人気本。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。 最近、待望の続編である自然言語処理編も満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)、CS224d(自然言語処理のためのディープラーニング)である。
7/20新刊『ゼロから作るDeep Learning ❷――自然言語処理編』O'Reilly Japan(978-4-87311-836-9)斎藤康毅 著◆「O'Reilly」棚にて展開中!『ゼロから作るDeep Learning』の続編。やさしい言葉で分かりやすくをモットーに、高度に見える技術の裏側をじっくり説明し、実際に作ることで理解を深めます。 pic.twitter.com/2dw0Rzc7VS
— 書泉ブックタワーコンピュータ書売り場 (@shosen_bt_pc) 2018年7月20日
利点:ベストセラー本なので先達のまとめブログが多い
ベストセラー本だけあってやはり、ネットを検索するとQiitaやはてなブログ等で多数の実践ブログが上がってくる。
今回は、こうした先人の知恵をパク...『転移学習』することで、自分の知見を深めることを目的とした。
qiita.com yusuke-ujitoko.hatenablog.com
今回は上記の2エントリを参考にさせて頂きました。感謝!
第1章 Python入門(P1~P20 : 10分)
まずはpython入門みたいな感じ。流し読み。
本章で学んだこと
第2章 パーセプトロン(P21~P37 : 15分)
シグモイド関数のような__非線形関数__で変換すれば、任意の関数を表現できると。 これも導入でよくある内容で流し読み。
https://qiita.com/ruka38/items/2f2f958c1d45728ea577 パーセプトロンからはじめる分類問題より引用
本章で学んだこと
第3章 ニューラルネットワーク(P39~p82 : 31分)
まずは順伝搬の説明。よく見るMNISTデータセットを用いた画像認識の例。 aidemyや石川氏の本で読んだ気がするので流し読み。
- 作者: 石川聡彦
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/02/24
- メディア: 単行本
- この商品を含むブログを見る
本章で学んだこと
- ニューラルネットワークでは,活性化関数としてシグモイド関数やReLU関数のような滑らかに変化する関数を利用する
- NumPyの多次元配列をうまく使うことで,ニューラルネットワークを効率よく実装することができる
- 機械学習の問題は,回帰問題と分類問題に大別できる
- 出力層で使用する活性化関数は,回帰問題では恒等関数,分類問題ではソフトマックス関数を一般的に利用する
- 分類問題では,出力層のニューロンの数を分類するクラス数に設定する
- 入力データのまとまりをバッチと言い,バッチ単位で推論処理を行うことで計算を高速に行うことができる.
第4章 ニューラルネットワークの学習(P83~P122 : 30分)
ここら辺も導入でよくある概念の説明で流し読み。pythonコードの説明が詳しい。
ニューラルネットワークの学習アルゴリズム
- 前提
- ニューラルネットワークには適応可能な重みとバイアスがあり,この重みとバイアスを訓練データに適応するように調整することを学習と呼ぶ.
- ①ミニバッチ
- 訓練データの中からランダムに一部のデータを選び出す
- ②勾配の算出
- ミニバッチの損失関数を減らすために,各重みパラメータの勾配を求める
- ③パラメータの算出
- 重みパラメータを勾配方向に微小量だけ更新する
- ①~③を繰り返す
確率的勾配降下法(stochastic gradient descent)
- 確率的に無作為に選びだしたデータ(ミニバッチ)を使って,パラメータを更新する
- SGDと略される
本章で学んだこと
- 機械学習で使用するデータセットは,訓練データとテストデータに分けて使用する
- 訓練データで学習を行い,学習したモデルの汎化能力をテストデータで評価する
- ニューラルネットワークの学習は,損失関数を指標として,損失関数の値が小さくなるように,重みパラメータを更新する
- 重みパラメータを更新する際には,重みパラメータの勾配を利用して,勾配方向に重みの値を更新する作業を繰り返す
- 微小な値を与えたときの差分によって微分を求めることを数値微分という
- 数値微分によって,重みパラメータの勾配を求めることができる
- 数値微分による計算には時間がかかるが,その実装は簡単である.一方,次章で実装するやや複雑な誤差逆伝播法は,高速に勾配を求めることができる.
第5章 誤差逆伝播法(P123~P164 : 40分)
この章の内容は、p.123に言及があるスタンフォードのCS231n授業や、また本シリーズ②の第1章でも再度説明がある。
ゼロから作るDeep Learning ? ―自然言語処理編
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
本章で学んだこと
- 計算グラフを用いれば,計算過程を視覚的に把握することができる
- 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
- 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
- ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
- 数値微分と誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.
第6章 学習に関するテクニック(P165~P203 : 121分)
冒頭で、冒険家のたとえ話から。
目隠しをした冒険家が最も『深き場所』へたどり着くための手段=最適化手法について。 今いる場所で一番傾斜がきつい方向へ進もうとする、前章の確率的勾配法(SGD)には欠点があった。
- SGDの欠点
- ジグザグな動きで、問題によっては非効率
- 関数の形状が等方的でないと,勾配が最小値を指さない.
そこで、SGDの欠点を改善する手法として,_Momentum, AdaGrad, RMSProp, Adam_といった手法が開発されていると。
パラメータ更新手法の選択
Momentum
- Momentum : 運動量のこと
- 前の更新を保存し,慣性力が働くようにする
- ボールがお椀を転がるような動きでなめらか
AdaGrad
- Adaptive(適応的)のAda、つまり『適応的』勾配
- パラメータの要素ごとに、学習係数を過去のすべての勾配の2乗和で割って減衰させていく
- 無限の学習を行うと更新量が0になってしまう欠点がある
- そこで開発されたのがRMSProp
- AdaGradにおいて,過去の更新における勾配を徐々に忘れるようにするもの
Adam
- MomentumとAdaGradの融合(フュージョン)
- Momentum -ボールがお椀を転がるように物理法則に準じる動きを再現
- AdaGrad
- パラメータの要素ごとに,『適応的』に更新ステップを調整
AdamW
- 最近、さらに改良版のAdamWも出てきているようだ AdamW and Super-convergence is now the fastest way to train neural nets · fast.aiより引用
ドラゴンボール世代がフュージョンと聞くと_最強_のイメージですが、 やはり更なる上(スーパーAdam的なAdamW)があるようですね...
ドラゴンボール より
初期パラメータの選択
Weight decay
- 重みの値を小さくすることで、過学習を抑え、汎化性能を高めるテクニック
- 重みを小さくしたいのであれば、初期値もできるだけ小さい値でスタートしたいと思うのが当然
とはいえ、重みの初期値を0にしてはいけない
- 重みが均一になってしまうと,重みを持つ意味がなくなるため
重みの初期値のベストプラクティス
- std=0.01の場合は全く学習が進んでいおらず、He、Xavierの際にスムーズに学習が進んでいる
- →重みの初期値はとても重要
Batch Normalization
各層のアクティベーションの分布が適度な広がりを持つように”強制的”にアクティベーションの調整を行う
Batch Normalizationの利点
- 学習を早く進行させることができる(学習係数を大きくすることができる)
- 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくて良い)
- 過学習を抑制する(Dropoutなどの必要性を減らす)
- データ分布の正規化(平均が0、分散が1の分布)を行うレイヤ(Batch Normalizationレイヤ) をニューラルネットワークに挿入し、各ミニバッチごとに正規化する
正則化
過学習が起きる原因
- パラメータを大量に持ち,表現力の高いモデルであること
- 訓練データが少ないこと
Weight decay
- 大きな重みを持つことにペナルティを課す
- 具体的には、損失関数に重みの二乗ノルム(L2ノルム)を加える
- 複雑なニューラルネットワークには対応しきれない qiita.com
dropout
- ニューロンをランダムに消去ながら学習する
ハイパーパラメータの検証
6章からが本番だと前述のQiitaの記事に書いてありました。
6章~7章が本書の核のようで、内容が濃く充実していますね!
本章で学んだこと
第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)
この章は下エントリに、図解ありで非常に詳しくまとまっていました。以下抜粋。
全体の構造
- これまでの全結合層
- [Affine, ReLU]を繰り返し,最後に[Affine,Softmax]
- CNN
- [Conv, ReLU, (Pooling)]を繰り返し,最後の方で[Affine, ReLU], 最後に[Affine, Softmax]
全結合層の問題点
入力データの形状が無視されてしまう点
- たとえば画像の場合,縦・横・チャンネルの3方向を盛っているが,全結合相に入力するときは3次元を1次元にする必要がある.形状には大切な空間情報が含まれているはず.
- すべての入力データを同等のニューロンとして扱う.
畳み込み層(convolutionレイヤ)では形状を維持する.
- 畳み込み層の入出力データを特徴マップ(feature map)
- 入力データを入力特徴マップ(input feature map)
- 出力データを出力特徴マップ(output feature map)
畳み込み演算
- 画像処理でいうところ「フィルター処理」に相当
- 「フィルター」は「カーネル」とも言う
- フィルターのパラメータは全結合のニューラルネットワークにおける「重み」に対応
- 上図はフィルター処理にバイアスを加えたもの
パディング(padding)
- 入力データの周囲に固定のデータを埋める
- 出力サイズを調整するため
ストライド(stride)
- フィルターを適用する位置の間隔のこと
プーリング層
- プーリングは縦・横方向の空間を小さくする演算
- プーリングの種類は色々ある
- Maxプーリング : 領域内の最大値を取る
- Averageプーリング : 領域内の平均値をとる
- プーリング演算によってチャネル数は変化しない
- 微小な位置変化に対してロバスト
重みの可視化
代表的なCNN
本章で学んだこと
第8章 ディープラーニング(P241~P273 : 61分)
こちらのエントリが詳しいです。以下抜粋。
認識精度を高めるには
Data Augumentation(データ拡張)
- 回転や縦横移動をさせて画像データを増幅する
層を深くする
- フィルタを小さくでき、パラメータが減る
- 階層的に情報を抽出することで学習が効率化する
- ReLUなどの活性化関数を畳み込み層の間に挟めるので、非線形化できるため、複雑な表現が可能となる
有名なCNNアーキテクチャ
VGG (2014年2位)
- CNNのネットワークを深くしたものをVGGという
- 重みの初期値にHeの初期値、重みパラメーターの更新にAdamを使う
- 後段の全結合層では、Dropoutレイヤを使う
- 画像認識度は高く、誤認識率も低いネットワークを構成できる
GoogLeNet(2014年1位)
- ネットワークが縦方向の深さだけでなく、横方向にも深さを持っている(インセプション構造)
ResNet (ついにエラー率で人を超える)
- 層を深くできるような仕掛けとして「スキップ構造」をもつ
- スキップ構造
- 入力データの畳み込み層をまたいで出力に合算する構造
- 逆伝播の際に、スキップ構造によって信号が減衰せずに伝わり、学習が効率的に進む
ディープラーニングの高速化
ディープラーニングの実用例
物体検出
- 画像から物体の種類と位置を特定するクラス分類問題
- CNNをベースとした手法が多く,R-CNN,さらにはFaster R-CNNが有名
セグメンテーション
- 画像に対するピクセルレベルでのクラス分類問題
- FCN(Fully Convolutional Network)というすべてがConvolution層からなるネットワークが使われる
画像キャプション生成
- 画像を入力すると,その説明文を出力する問題
- 代表的な方法はNIC(Neural Image Caption)を呼ばれ,画像を理解するでディープなCNNと自然言語を扱うRNNから構成される.
- CNNが画像から特徴を抽出し,RNNに初期値としてそれを渡す.そこからRNNは再帰的に文章を生成する
画像スタイル変換
- スタイル画像とコンテンツ画像の2つの画像を入力することで,新しい画像を生成する.
- ネットワークの中間データがコンテンツ画像の中間データに近くなるように,かつスタイル画像から抽出したスタイル行列のズレも小さくなるように学習を行う
画像生成
- DCGAN(Deep Convolutional Generative Adversarial Network)
- GeneratorとDiscriminatorという2つのニューラルネットワークを用い,前者が本物そっくりの偽物を作り,後者がそれが本物か否かを判定することを競争的に繰り返し,お互いに学習を進める
自動運転
- CNNベースのSegNetは走路環境のセグメンテーションを高精度で行う
Deep Q-Network
- DQNは、動作に対する価値観数をCNNで近似することで、画像に対しての動作を最適化する学習を行う
本章で学んだこと
- 多くの問題では、ネットワークを深くすることで、性能の向上が期待できる
- ILSVRCと呼ばれる画像認識のコンペティションの最近の動向は、ディープラーニングによる手法が上位を独占し、使われるネットワークもディープ化している
- 有名なネットワークには、VGG、GoogLeNet、ResNetがある
- GPUや分散学習、ビット精度の削減などによってディープラーニングの高速化を実現できる
- ディープラーニング(ニューラルネットワーク)は、物体認識だけではなく、物体検出やセグメンテーションに利用できる
- ディープラーニングを用いたアプリケーションとして、画像のキャプション生成、画像の生成、強化学習などがある。最近では、自動運転へのディープラーニングの利用も期待されている
画像認識はfast.aiでもやっていたので駆け足で学習しました。引き続き、自然言語処理編の②へ!