人工知能エンジニア修行日記

人工知能エンジニアを目指して修行します

8章 ディープラーニングDL『ゼロから作るDeep Learning』

本書の最後の8章は、現在のDLを俯瞰した説明なので、目次に合わせてメモ書き。

8章 ディープラーニング
    8.1 ネットワークをより深く
        8.1.1 よりディープなネットワークへ
        8.1.2 さらに認識精度を高めるには

これまで論文発表された手法の認識精度ランキング
http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html

さらに認識精度を高めるには、データ拡張などが必要。

データ拡張Data Augmentation:入力画像を回転やタテ・ヨコ方向の微小な移動などで、人工的に拡張する。

画像の一部を切り取るcrop処理や、左右反転するflip処理、輝度変更や、拡大・縮小などで増やす。

#TODO:あとで実装


        8.1.3 層を深くすることのモチベーション

層を深くするメリット:パラメータ数を少なくできる

「犬」画像をまとめて一度に学習するのは大変だが、

プリミティブな特徴を学習する浅い層から、徐々に多層化して抽象度を上げていくことができる。



    8.2 ディープラーニングの小歴史
        8.2.1 ImageNet

100万枚を超える画像データ・セット。

毎年ILSVRCという画像認識コンペティションが開催されている。

2015年のResNetは、エラー率3.5%となり、人間の認識能力を上回った。


        8.2.2 VGG
        8.2.3 GoogLeNet

「インセプション構造」と呼ばれるNNの「横方向の深さ(広がり)」を使っているのが特徴

        8.2.4 ResNet

「スキップ構造」と呼ばれる入力データの畳み込み層を跨いで出力に合算する構造をもつことで、

層を深くした際の減衰を回避している。

移転学習を行い、学習済の重みを別のNNにコピーして再学習fine tuningをさせている。

    8.3 ディープラーニングの高速化
        8.3.1 取り組むべき問題

畳み込み層の処理が一番かかっているので、大量の積和演算を以下に高速化するかが重要になっている。

        8.3.2 GPUによる高速化

もともとグラフィック処理用のGPUを使って大量の並列演算ができるので、CPUよりパフォーマンスが出る。


        8.3.3 分散学習

複数のGPUを並列で使うと、56倍の高速化が実現できた事例がある。


        8.3.4 演算精度のビット削減

通常、64bit/32bitで表現されている数値を16bitの半精度浮動小数点数half floatに落としても、問題なく学習ができるので、メモリやバス帯域の節約になる。

NVIDIAのMaxwell世代GPUでは演算自体16bitで行われていなかったが、次世代のPascalアーキテクチャでは16bitで行い、2倍の高速化が期待できる。

    8.4 ディープラーニングの実用例
        8.4.1 物体検出

物体検出には、R-CNN手法が使われる。

        8.4.2 セグメンテーション

FCN fully convolutional networkが提案されている

        8.4.3 画像キャプション生成

NIC neural image captionモデル

RNN recurrent neural network 再帰的なネットワークであり、自然言語や時系列データなど連続性のあるデータで使われる

マルチモーダル処理:画像や言語といった複数の種類の情報を組み合わせて処理


    8.5 ディープラーニングの未来
        8.5.1 画像スタイル変換

例えば、ゴッホ的なスタイルの画像に変換する

        8.5.2 画像生成

DCGAN Deep Convolutional Generative Adversarial Networkという手法で、画像が自動生成される。

GeneratorとDiscriminatorを対決させて精度を上げる


        8.5.3 自動運転

SegNet

        8.5.4 Deep Q-Network(強化学習)


強化学習reinforcement learning:エージェントが自律的によりよい報酬を目指して学習する

    8.6 まとめ

省略

これでひととおり本書を学び終えたが、まだまだ理解が十分ではないので、何度も読み返しながら、プログラミングして深く理解していく。

人工知能の領域はかなり広いので、一分野である機械学習のさらに一分野である深層学習をまずは徹底的に学び、学習領域を広げて実装につなげていく。