「MXNet/Gluon」開発チームによる「ハンズオン」に参加してきました。(1日目のまとめ)

2018年12月17日(月)~19日(水)にAWSJ主催で実施された「MXNet/Gluon」のハンズオン に参加してきましたので、まとめレポートを書こうと思います。
本エントリーは12月17日(月)のハンズオンのまとめレポートです。

当日の報告資料はこちらです。
MXNet_Gluon_Workshop_201812
Classification
Detection
GluonCV

目次

1.今回のハンズオンについて

今回のハンズオンは、AWSの「MXNet/Gluonの開発チーム」を招いての完全招待制「Deep Learningトレーニング」でした。
合計3日間のうち、最初の2日間は画像認識系、最後の1日は時系列予測についてのハンズオンです。

初日となる12月17日(月)は、「画像認識で何ができるのか」、「MXNet/Gluonを使って簡単にメジャーなモデルを利用する方法」、「画像認識モデルを学習させる際のテクニック」について、レクチャーとハンズオンが実施されました。

2.報告内容

当日の報告内容は下記の5点でした。それぞれの概要をまとめます。

  • Introduction
  • Computer Vision Use cases
  • Gluon Crash Course
  • Classification(Lecture & hands-on)
  • Object Detection(Lecture & hands-on)

2-1.Introduction

最初に、技術統括本部の「Enterprise Transformation Team」でソリューションアーキテクトをしていらっしゃる「中田 光昭」様から、「報告内容」と「メンバー」の紹介がありました。

こちらが当日のメンバーの皆様です。

2-2.Computer Vision Use cases & Gluon CV

続いて、「画像認識系アルゴリズムのユースケース」と画像認識に利用されるツールキットである「GluonCV」の紹介へと移りました。

登壇者は「Cyrus Vahid」様です。

●画像認識系アルゴリズムのユースケース

画像認識系アルゴリズムの活用事例として、「Amazon GO」でのレジ無し店舗Echo Look」でのファッションチェックの紹介がありました。
(「Echo Look」のリンク先は当日のセッションで紹介されたyoutubeのリンクを貼っています。音声が出力されるので、再生する際はご注意ください。)

また、そのほかにも色々なケースで画像認識系アルゴリズムが活用されているそうです。

「Virtual Referee」なんて未来感があって個人的には一番気になりました。

●「GluonCV」の紹介

続いて、画像認識に利用されるツールキットである「GluonCV」の紹介へと移りました。
登壇者は「Tong He」さんです。

報告資料はこちらです。
GluonCV

「GluonCV」のポイントとして、下記のような点を挙げていました。

  • 「SotA」なモデルが用意されており、APIベースでそのまま利用することも転移学習することも可能
  • 操作が簡単
  • Python以外の言語(Java, Scala)でも利用できる
  • メンテナンスもされているので、今後の機械学習界隈の変化にも追随もできる

    当日のハンズオンで実際に触ってみたのですが、とても簡単に利用でき、提供されている学習済みモデルもメジャーどころが色々と揃っていたので、とても使い勝手が良さそうでした。

    また、提供されているモデルの比較がされているので、利用するモデルを選定する際に参考になるかもしれません。
    下記は「画像認識」の各モデルでの「推論の処理時間」と「精度」を散布図にしているものです。
    こちらを見ると、例えば「mobilenetやsqueezenetは推論が早い」、「resnetは精度が高い」といった特徴がわかります。
    (いつでもそうなるという訳ではなく、利用するデータ等によってこれらの特徴は変動します。下記では「ImageNet」でトレーニングされているモデルでの比較でした)
    引用:Gluon

    どのようなモデルが提供されているのか、については下記の通りです。

    詳細については「Model Zoo」、もしくはgluon-cvのGitをご参照ください。

    また、各モデルの論文で紹介されているものより、「ImageNet」データに対してより高精度な推論ができる状態でモデルが用意されているそうです。
    下記は画像認識系アルゴリズムでの「Gluon」で用意されているモデルと論文中の数字との比較です。

    Gluonについてのドキュメントは下記が参考になるかもしれません。
    Gluon CV
    Gluon NLP
    MXNet
    Deep Learning Book

    2-3.Gluon Crash Course

    続いて、Gluonでトレーニングするときに使うライブラリのハンズオンに移りました。
    今回は「SageMaker」を「p3.2xlarge」で立ち上げてチュートリアルを進めました。

    ・Gluonのインストール

    !pip install gluoncv --pre  
    

    ・チュートリアルで使うファイルのダウンロード
    ノートブックインスタンスが立ち上がったら、ターミナルを開いて下記を実行してください。

    cd SageMaker
    wget https://tinyurl.com/aws-mxnet-gluon-workshop -O workshop.zip
    unzip workshop.zip
    

    以降のハンズオンでは、上記で解凍したファイルを利用しました。

    ・mxnetでの配列の扱い方

    mxnetでの配列の扱い方の基本についての説明でした。
    画像を使った機械学習をする上では基本となる部分です。
    詳細については「01_Gluon_Crash_Course/1_ndarray.ipynb」ファイルをご参照ください。

    ネットワークの定義や可視化のやり方

    ネットワークの定義や可視化のやり方についてです。
    「Model Zoo」等に用意されているモデルを利用するだけなら、自分でネットワークを組むことはあまりないかもしれませんが、そういった人も一度目を通しておいてもいいと思います。
    詳細については「01_Gluon_Crash_Course/2_nn.ipynb」ノートブックファイルをご参照ください。

    autogradの使い方

    「勾配の計算」を楽にするためのライブラリである「autograd」を使ってみました。
    自分でネットワークを組む際も、一々自前で計算ロジックを実装するのは大変なのでこのようなライブラリを利用するケースが多いかと思います。
    詳細については「01_Gluon_Crash_Course/3_autograd.ipynb」ファイルをご参照ください。

    ネットワークを定義してトレーニング

    ここまで紹介された手法のまとめとして、実際にネットワークを定義してトレーニングして、「FashionMNIST」の画像分類をしました。
    「FashionMNIST」の画像なのでそれほど重いタスクでもなかったのですが、ここまで学んだことの整理として良かったです。
    詳細は「01_Gluon_Crash_Course/4_train.ipynb」をご参照ください。

    学習済みモデルの利用

    「トレーニング済のパラメータファイルを使ってネットワークを用意する」方法と「model zooに用意されているモデルを利用する」方法の紹介でした。
    ある意味、一番利用頻度が高い部分かもしれません。
    詳細については「01_Gluon_Crash_Course/5_predict.ipynb」ファイルをご参照ください。

    処理をGPU上で実行する

    諸々の処理をGPU上で実行する方法についての紹介です。
    変数、ネットワーク等の関係するもの全てをGPU上に載せる必要がある点にご注意ください。
    (ネットワークがGPUにあって、データがCPUにある、とかなるとエラーになる)
    また、MXNetではGPUが複数ある場合には「どのGPUを利用するか」というのも指定する必要があります。
    詳細については「01_Gluon_Crash_Course/6_use_gpus.ipynb」をご参照ください。

    2-4.Classification(Lecture & hands-on)

    「ResNet」や「MobileNet」等のネットワークや学習手法の説明の後に、Gluonを使って画像分類をするハンズオンをしました。
    ハンズオンの内容としては「Model zoo」に用意されている「ResNet」と「MobileNet」を使って「精度と推論速度に差があることの確認」と「MobileNetでの転移学習」をしました。
    報告資料はこちらです。
    Classification

    ハンズオンの内容については「02_Classification/01_step_by_step/ImageClassification.ipynb」、「02_Classification/02_sagemaker_integration/gloncv-classification-sagemaker.ipynb」ノートブックファイルをご参照ください。

    ・有名な画像認識モデルの特徴

    また、「画像分類モデル」を学習する際のテクニックとして、下記の5点が紹介されました。

    Label Smoothing

    画像分類モデルの過学習を抑えるためのテクニック。
    通常なら正解ラベルを[0,0,0,1,0]等のワンホットエンコーディングとして利用するところを[0.1, 0.6, 0.1, 0.1, 0.1]等の形にする。

    学習率の調整

    学習が進むにつれて「どのように学習率を下げるか」といった方法の紹介。

    ・Step
    指定したエポック数学習したら学習率を下げる
    ・cosine
    学習率の低減にコサイン関数を使う
    ・Poly
    学習率の低減にべき乗を使う

    mix-up

    複数の画像を組み合わせて作成した画像を、学習に使う手法。
    モデルの汎化性能向上を目的としている。

    Knowledge Distillation

    汎化性能向上とモデルの軽量化を目的とした手法。
    「teacher」モデルが出力した値(正解ラベルのみでなく、近しそうなラベルの値も保持している)を「student」モデルの正解ラベルとして利用することで、「0,1の正解ラベルでは保持しきれていない情報」も学習に利用する。
    また、「teacher」モデルの出力と「通常の正解ラベル」の両方を利用して学習するやり方が一般的。
    (各ラベルの重要度も考慮する必要がある)
    「teacher」モデルは大きなモデルを使う、複数のモデルをアンサンブルする等のやり方がある。

    Transfer learning

    転移学習。既に学習済みのパラメータを利用することで、「短時間」で「高精度」なネットワークを学習することができる。

    2-5.Object Detection(Lecture & hands-on)

    続いて、「物体検出」の紹介とハンズオンです。
    報告資料はこちらです。
    Detection

    「画像分類と物体検出の違い」、「物体検出で有名な3アルゴリズム」の説明の後に、Gluonを使ったハンズオンをしました。
    ハンズオンの内容については「03_Detection/01_step_by_step/ObjectDetection.ipynb」、「03_Detection/02_sagemaker_integration/gloncv-object-detection-sagemaker.ipynb」ノートブックファイルをご参照ください。

    画像分類と物体検出の違い

    「INPUT」、「OUTPUT」、「評価指標」の違いについて言及していました。

    「物体検出」では「物体がどこにあるか」がOUTPUTされる点や、「IoU」が評価指標として存在する点が「画像分類」との違いとのことです。

    物体検出で有名な3アルゴリズム

    物体検出で有名な「SSD」,「Faster R-CNN」,「YOLO」について、それぞれの特徴について整理していました。

    あくまでも、「利用するデータ」や「Baseとして使うネットワーク」によっては上記の通りにならないのでご注意ください。

    また、「物体検出モデル」を学習する際のテクニックとして、下記の3点が紹介されました。

    各テクニックの概要や概念については「画像分類」と同じです。

    3.まとめ

    今回のトレーニングでは「Gluonを使ってSOTAなアルゴリズムを利用する方法」や「画像分類・物体検出アルゴリズムを学習させる際のテクニック」について学ぶことができました。
    もし、SageMakerで学習させる際はエントリーポイントとなるファイルを用意する必要があるのですが、Gluonは記述もシンプルで学習済みモデルも利用できるので、慣れればできることが広がりそうです。