Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

機械学習未経験者も良いモデルを作れるAutoGluonで「テキスト分類」をやってみた

こんにちは。@Ssk1029Takashiです。

最近、タスクを設定して、データセットを与えれば勝手にモデルまでいい感じにしてくれるAutoMLを使うための様々なサービス・ライブラリが出てきています。
先輩の@tereka114がAutoGluonを使っているのをみて触発されたので、私のほうではテキスト分類をやってみました。
acro-engineer.hatenablog.com

今回は、MXNetを使用したAutoMLライブラリであるAutoGluonを使って、テキスト分類を試してみます。

今回試した環境

python:3.7.6
OS:Ubuntu 18.04 LTS
ハード:GCP Compute Engine、メモリ 16GB、GPU NVIDIA Tesla K80

CUDA&AutoGluonのインストール

今回はGPU環境へのインストールを試していきます。
GPUを使うためので、CUDAのインストールが必須になります。

CUDA10.0のインストール

基本的には下記のGCPのページにそってインストールします。
cloud.google.com

最後のCUDAのインストールのコマンドを以下のように変更します。
(サイトの手順の場合、最新版がインストールされるのですが、今回使用するMXNetが10.0に対応しているのでこちらを合わせます。)

sudo apt install cuda-10-0

AutoGluonのインストール

下記のサイトにある通り、pip install2行でインストールできます。
導入が楽なのはありがたいですね。
autogluon.mxnet.io

pip install --upgrade mxnet-cu100
pip install autogluon

※現在はpython3.6と3.7、OSはLinuxのみの対応となっています。

AutoGluonでテキスト分類を行ってみる

それでは、チュートリアルにある通り、テキストの分類を試してみます。
今のところAutoGluonではStanford Sentiment Treebankデータセットでのベンチマークを試せます。

import autogluon as ag
from autogluon import TextClassification as task

dataset = task.Dataset(name='ToySST')
predictor = task.fit(dataset, epochs=3)

datasetを指定して、fitメソッドを呼び出すだけで、学習を始められます。
fitメソッドで指定しているepochsは学習方法を変化させるまでに実行するトレーニング回数になります。

学習を開始すると、以下のように自動でモデルがダウンロードされて学習を始めます。
f:id:acro-engineer:20200122004657p:plain

AutoGluonのTextClassificationでは、デフォルトの場合、 Gluonで使用できるBERTの英語pretrainedモデルを使用して学習を進めるようです。
そして、一つのモデルについて指定したepoch数の学習が完了すると、違うモデルで学習を始めて、より良いモデルを探索します。
f:id:acro-engineer:20200122013656p:plain

また、predictメソッドやevaluateメソッドから、学習した中で最も精度が良かったモデルを使って、推論・評価することが可能です。

test_acc = predictor.evaluate(dataset)
print('Top-1 test acc: %.3f' % test_acc)

結果は以下のように出力されます。

Top-1 test acc: 0.868

このデータセットの研究での精度は89%~97%程度となっています
nlpprogress.com
今回試した精度は86.8%でしたが、epoch数が3の学習で手軽にここまで迫れるの良い結果なのではないかと思います。

使ってみての感想

テキストに関しては、まだパラメータチューニングの対象・範囲の指定しかできませんが、カスタムデータセットへの対応がされると、適用できる範囲も広がるように思います。
また、現状では対応しているモデルも、BERTの英語モデルに限られているようですが、テキスト分類を簡単に高精度で実施できるのはうれしいので、これから拡張されていくことを期待しています!
(個人的には、日本語のpretrainedモデルに対応してくれると嬉しいです)

まとめ

今回はAutoGluonを使って、AutoML+テキスト分類を簡単に試しました。
インストールから使い始めまで、非常に容易にAutoMLを試すことができました。
これから機能が拡張されれば、より便利で手軽に機械学習を試せるようになりそうです。
引き続き今後の拡張を追っていきたいと思います。
それではまた。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

機械学習未経験者も良いモデルを作れるAutoGluonで「テーブルデータの解析」をやってみた

こんにちは。
@tereka114です。

最近はCA x atma杯に参加するなどバタバタしておりましたが、少しずつ落ち着いてきました。
今回、AutoGluonと呼ばれるツールを使ってテーブルデータに挑戦してみました。

AutoGluonについて

AutoGluonは簡単に拡張、利用ができる自動機械学習のライブラリです。
前処理、ハイパーパラメータのチューニング、モデル選定、或いはアンサンブルといった機械学習モデリングを自動化できます。
これにより、機械学習に詳しくない人も簡単に精度が高いモデルの作成ができます。

autogluon.mxnet.io

AutoGluonはテーブルデータの分類・回帰、画像分類、文書分類、物体検出、そして、ニューラルネットワークアーキテクチャの自動構成を行うNAS(=Neural Architecture Search)に対応しています。
今回は、テーブルデータの分類を行うモデルを自動構築し、最適なモデルを提供します。

画像分類やテキスト分類と比較してテーブルデータの分類・回帰の自動化は難しいです。
テーブルデータは列に様々な情報が含まれるため、入力データごとに別々の特徴量変換手法を試す必要があります。
たとえば、温度や湿度のように数値で表現できるものは加工しなくとも数値のまま扱えます。
しかし、文字列であれば、その文字を数字に変換するなど工夫が必要になります。

これらの方法を知らなくても、AutoGluonが自動でその工夫を行ってくれるため、実装者はデータに対して何も加工することなく、機械学習モデルの作成ができます。

AutoGluonでテーブルデータの解析に挑戦する

今回、テーブルデータのサンプルには、機械学習チュートリアルで頻繁に利用されるTitanicのデータを利用します。
このデータセットを事前にKaggleのサイトに登録し、入手してください。

www.kaggle.com

1. データを読み込む

はじめに、学習用のデータを準備して、AutoGluonで利用できる形式にします。
autogluon.TabularPrediction.Datasetクラスを利用します。そのクラスの引数にファイルパスを入力し、インスタンスを初期化します。

import autogluon as ag
from autogluon import TabularPrediction as task

train_data = task.Dataset(file_path='train.csv')
2. 学習を行う

次に学習を行います。学習の実装は次の通りです。
autogluon.TabularPrediction.fitにより、あとは何も考えず、よしなに実行されます。

output_directory = "./outputs"
label_column = "Survived"
predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory)

学習データとラベルと結果出力先のディレクトリを指定します。
それぞれ、デフォルトで決まっているモデルを利用し、構築します。
ディレクトリには、学習された結果のモデルが出力されています。

学習を開始するとログが次の通り、出力されます。
解析するデータセットの情報や使っている機械学習アルゴリズムとその評価結果、そして学習時間が出力されます。
単体のモデルだと、LightGBMの精度が最も高く、複数の機械学習アルゴリズムのアンサンブルでより精度が向上していることがわかります。

Loaded data from: train.csv | Columns = 12 / 12 | Rows = 891 -> 891
Warning: Specified num_trials == 1 or time_limits is too small for hyperparameter_tune, setting to False.
Beginning AutoGluon training ... Time limit = 10s
Preprocessing data ...
Here are the first 10 unique label values in your data:  [0 1]
AutoGluon infers your prediction problem is: binary  (because only two unique label-values observed)
If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])

Selected class <--> label mapping:  class 1 = True, class 0 = False
        Data preprocessing and feature engineering runtime = 0.33s ...
AutoGluon will gauge predictive performance using evaluation metric: accuracy
To change this, specify the eval_metric argument of fit()
Fitting model: RandomForestClassifierGini ... Training model for up to 9.67s of the 9.67s of remaining time.
        0.29s    = Training runtime
        0.8212   = Validation accuracy score
Fitting model: RandomForestClassifierEntr ... Training model for up to 9.19s of the 9.19s of remaining time.
        0.28s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: ExtraTreesClassifierGini ... Training model for up to 8.64s of the 8.64s of remaining time.
        0.27s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: ExtraTreesClassifierEntr ... Training model for up to 8.06s of the 8.06s of remaining time.
        0.27s    = Training runtime
        0.7821   = Validation accuracy score
Fitting model: KNeighborsClassifierUnif ... Training model for up to 7.61s of the 7.61s of remaining time.
        0.03s    = Training runtime
        0.6089   = Validation accuracy score
Fitting model: KNeighborsClassifierDist ... Training model for up to 7.48s of the 7.48s of remaining time.
        0.01s    = Training runtime
        0.6145   = Validation accuracy score
Fitting model: LightGBMClassifier ... Training model for up to 7.36s of the 7.36s of remaining time.
        0.28s    = Training runtime
        0.8268   = Validation accuracy score
Fitting model: CatboostClassifier ... Training model for up to 7.06s of the 7.06s of remaining time.
        0.66s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: NeuralNetClassifier ... Training model for up to 6.39s of the 6.39s of remaining time.
        3.54s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: LightGBMClassifierCustom ... Training model for up to 2.59s of the 2.59s of remaining time.
        0.4s     = Training runtime
        0.8268   = Validation accuracy score
Fitting model: weighted_ensemble_l1 ...
        0.36s    = Training runtime
        0.8492   = Validation accuracy score
AutoGluon training complete, total runtime = 9.52s ..

また、各モデルのハイパーパラメータをチューニングする場合には、hyperparameter_tuneの引数にTrueを与えます。
例えば、次のように設定できます。

predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory, hyperparameter_tune=True, num_trials=10, time_limits=10)
3. 推論を行う

推論もごくわずかな実装で可能です。
学習した結果の機械学習モデルを利用して推論します。

test_data = task.Dataset(file_path='test.csv')
y_pred = predictor.predict(test_data)

使ってみての感想

良かったところ

機械学習そのものを知らない人でも簡単に記述できる

今回実施した通り、非常にシンプルに実装を書けます。
更には特に人間が設定しなくてはならないハイパーパラメータの設定を行っていません。
それぞれのモデルの知見が少なくともそれなりのスコアを出せることが良い点です。

ハイパーパラメータのチューニングも可能

fit関数は標準の引数だと、実行モデルの標準パラメータを網羅するのみとなっており、ハイパーパラメータの調整までは行いません。
しかし、ハイパーパラメータのチューニングの有無を指定でき、時間をかければ、より高い精度を出せます。
ハイパーパラメータの試行回数も設定ができるので、巨大なデータの場合は少ない回数を指定できるなど、設定の工夫が可能です。

制限時間がついている

一度の検証の制限時間を引数として与えられます。
そのため、偶然にも極端に長い検証時間がかかるハイパーパラメータを引き当ててしまった場合、通常だと終わるまで待つか、実行そのものをキャンセルするかになります。
この設定により、時間で打ち切り、すぐに次の試行に移れます。

ここがあるとより嬉しい

ドキュメントや例の整備

例題は非常にシンプルで使いやすいと思っていますが、カスタマイズする際にどうすればよいのかがあまり書かれていないと感じました。
ここに書いてあるかなーとメソッドのリファレンスを参照し、実行することで理解ができました。
機械学習をメインに取り組んでいる人であれば、直感と閃きで発見することが可能でしたが、なれていない人では難しいと思います。

最後に

AutoGluonですが、想像よりも柔軟に様々なパラメータを設定できてよいツールだと感じています。
ちょっとした実験や分析には十分利用できるライブラリだと思っています。
では、またお会いしましょう!

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

関東CV勉強会第56回で発表してきました

皆さんこんにちは。
お元気ですか。@tereka114です。
年始にお布団を家に購入して、冬でも想像以上に快適な眠りを迎えられています。

早速本題ですが、1/19(日)に関東CV勉強会第56回に参加し、発表してきました。

今回の勉強会のテーマは「コンピュータビジョンでこんなプログラム作りました大LT大会」です。

エッジデバイスとDeepLearningを組み合わせたもの・OpenCVのライブラリを使ったソフトウェア・自社製品等様々な発表がありました。
どの発表も創意工夫がされており、新しい発見も多く、非常に有意義でした。

今回はそのLTで「Mixed Precisionのすゝめ」のタイトルで発表しました。
Mixed Precisionはfloat32/16を利用して、計算精度を維持しつつも、メモリ消費量、性能の向上を実現する技術です。
それらはAutomatic Mixed Precision(AMP)と呼ばれるNVIDIA社提供のライブラリで簡単に使えます。

www.slideshare.net

発表内容の詳細は、スライドをご確認ください。
このAMPを自分のモデルをより良くする一つの選択肢として考えていただければ幸いです。

では、またどこかでお会いましょう。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

2019年アドベントカレンダー振り返り

皆さんこんにちは
@tereka114です。

皆さん、今年もアドベントカレンダーが盛り上がりましたね。皆さんはどのアドベントカレンダーが良かったでしょうか?

Acroquestは、今年も有志がQiitaの各種アドベントカレンダーに参加し、執筆していました。
本記事ではアドベントカレンダーの投稿記事の一覧と注目度の高かった記事を紹介します。

おすすめ3記事

GiNZA+Elasticsearchで係り受け検索の第一歩

acro-engineer.hatenablog.com

検索といえば、キーワード検索や全文検索といった言葉が思い浮かぶ人が多いと思います。
しかし、症例検索の場合には、単語は含まれるが、検索としては絞りたいといったケースがあります。例えば、次の通りです。
「ずっと胃がキリキリと痛い。ただ、熱は無く平熱のままだ。」
「昨日からとても頭が痛い。おまけに胃がむかむかする。」

「胃が痛い」と検索したとき、通常の単語検索の場合だとどちらもヒットしますが、下の文章は意味としては異なる文章のためゴミになります。
この課題に対し、自然言語処理ライブラリGiNZAを利用して係り受けの情報を考慮した検索に挑戦しました。

私自身、検索だと、特に画像のベクトル検索の経験があります。
係り受けの情報を利用するのは自然言語ならではの取り組みで、アイデアが面白いと感じました。

Micrometerで取得したデータをKibanaで可視化してみました

acro-engineer.hatenablog.com

Spring Bootのアプリケーションの監視に使われるMicrometerを使ってKibanaで可視化しました。
これまでは、KibanaにMicrometerのメトリクスを監視するダッシュボードがなく、Prometeus&Grafanaが選ばれていました。
そのため、この記事では、ダッシュボードを作成し、可視化しました。

更にElastic Stackの一つであるElastic APMとも組み合わせたデモを作っています。
これにより、Spring Bootの状況をKibanaで一覧化できます。
そのため、性能のボトルネックとなる箇所やリクエストの処理情報が見えます。

当社のGithubに公開されているので、ぜひ使ってみてください。

1. Micrometer Kibana Dashboard
github.com

2. Micrometer & Elastic APM Demo
github.com

実務で使えるニューラルネットワークの最適化手法

acro-engineer.hatenablog.com

私が記載した記事になります。ニューラルネットワークの最適化手法(Adamなど)は毎年のように発表されています。
それらの最適化手法はどの手法を選ぶべきかに加えて、ハイパーパラメータチューニングをどうすべきかを検討する必要があります。
今まできちんと検証する機会もなかったので、これを機に、CIFAR10で検証を行いました。

最後に

2019年も終わりが近づいてきています。
今年のブログを振り返ってみると、特にElasticsearchや機械学習の記事が多い感じがします。
来年も引き続き、皆さんに良い情報を提供していきたいと思っています!

では、また来年もよろしくお願いします。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニアの求人 - Wantedlywww.wantedly.com

令和時代のサーチエンジンになるか? 気鋭のベクトル検索OSS Milvus についてまとめてみた

はじめに

情報検索・検索エンジン Advent Calendar 2019 24日目の記事です。
担当は@yktm31です。 

本記事ではMilvusという大規模ベクトル類似度検索エンジンについて紹介したいと思います。
一般的な検索は所謂、単語を使って検索するような方式ですが、近しいベクトルの計算によって
画像から画像を検索する、テキストから画像を検索するようなことにも応用ができます。
Milvusはそのような用途に適切なライブラリです。

zillizという上海のベンチャー企業が開発していて、2019年11月5日にOSS化されました。
たまたまGitHubのTrendingで見つけ興味を持ったのですが、なんにせよ公開から日が浅く、情報が少ないです。
2019年12月現在、手がかりとなる有力なソースは主に3つです。
 1. 公式webサイト
 2. GitHubリポジトリ
 3. medium

本記事では、そんなMilvusについてわかったことまとめていきたいと思います。

Milvus

ベクトル類似度検索

高速ベクトル検索OSSとしては、既にいくつか有名どころがあります。
それらと比べたときに、Milvusがどういったポジションにいるのか見ていきます。

まずは、既存の有名どころを簡単に整理しておきます。

faiss

・FAIRが開発
GPU対応
日本語参考記事

SPTAG

Microsoftが開発
・Bingで用いている最近傍探索ライブラリがOSS化したもの
日本語参考記事

annoy

Spotifyが開発
・Approximate Nearest Neighbors Oh Yeahの略
・プロセス間でインデックスを共有可能
日本語参考記事


では、Milvusはどういった特徴を持っているのでしょうか。
公式ドキュメントの中で、faiss・SPTAGとMilvusの比較がされています。

f:id:acro-engineer:20191226013323p:plain

こちらのブログを要約すると、Milvusが目指しているのは「音声・画像/映像・テキストといった、非構造化データをシンプルかつスケーラブルに扱える検索エンジン」ということになりそうです。
企業が持つデータが多様化するなか、検索エンジンとしても多様なデータを扱えるようにならないとね、
ということだと思いました。

機能としても、単に計算ライブラリとしてではなく、デプロイ・運用・監視を見据えたアプリケーションという側面が強くでていると思います。

Milvusの特徴

Milvusの目指すところが掴めたところで、次にMilvusの特徴について具体的に見ていきます。

公式が出しているKey Featuresの中からいくつかピックアップしてみます。

・Heterogeneous computing
つまるところ、様々なコンピュータアーキテクチャ上で動作すると言うことみたいです。
現状では、 x86/GPU/ARMに対応しています。
ゆくゆくは、TPU や ASICにも対応する予定があるそうです。

・Multiple indexes
quantization, tree系, graph探索系に対応しています。
データ規模や、ハードウェアスペックに合わせて選択することができます。

・Visualized monitor
Prometheus/Grafanaを利用した、パフォーマンス監視・アラート通知に対応しているそうです。
ドキュメントに、立ち上げ方の手順が載っています。

Milvusの使い所

実際にアプリケーション・プロダクトとしてどう使えるのか、気になるところかと思います。

結論から言うと、まだ実運用を想定した事例について情報を集めることは難しそうです。

サンプルとしては、実装面ではサンプルコードが、利用面では三つのユースケースが提供されています。

紹介されているユースケースは、以下の三つです。
 ①パーソナルレコメンド
 ②マルチモーダル検索
 ③重複動画の削除

ただ、あくまでシナリオとしての紹介で詳細については述べられていません。
この辺は実際に触ってみて、知見を蓄積・共有していくことが必要なのだと思いました。

Milvusの動かし方

最後に、Milvusを実際に動かしてみます。
具体的には、Dockerコンテナを立ち上げ、Python用のSDKでサンプルコードを動かします。

実行環境は以下の通りです。

OS Ubuntu18.04
GPU 1080ti
python 3.7.5
docker 19.03
nvidia-driver 418

まず、MilvusのDockerコンテナを立てます。
公式からイメージが提供されているので、簡単に立ち上げることができます。

$ docker pull milvusdb/milvus:latest

# Milvusの設定ファイルをダウンロードする。
$ mkdir -p /home/$USER/milvus/conf
$ cd home/$USER/milvus/conf
$ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/server_config.yaml
$ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/log_config.conf

# Milvusを起動する。
$ docker run -d --name milvus_gpu --gpus all -e "TZ=Asia/Tokyo" -p 19530:19530 -p 8080:8080 -v /home/$USER/milvus/db:/var/lib/milvus/db -v /home/$USER/milvus/conf:/var/lib/milvus/conf -v /home/$USER/milvus/logs:/var/lib/milvus/logs milvusdb/milvus:latest


次に、Python SDKをインストールし、サンプルコードを実行します。

# Milvus Python SDKのインストール
$ pip3 install pymilvus==0.2.6

# サンプルコードのダウンロード
$ wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/example.py

# サンプルコードの実行
$ python3 example.py

正しく動作すれば、最後に Query result is correct. と出ます。


example.pyの中身としては、以下のような処理が走っています。
①Milvusコンテナに接続
②テーブル作成
③16次元 10000ベクトルデータを投入
④Index (IVFLAT)の作成
⑤サーチを実施
⑥サーチ結果の確認
⑦テーブル削除とコネクション切断

ソースにはコメントも入っていて、Milvusの基本的なオペレーションを理解することができました。

まとめ

本記事では、Milvusという公開されて間もないベクトル検索エンジンについて、公開情報を基にまとめて見ました。
しかし、実際の実装や構築周りについては、サンプルを動かした程度までなので、
手元で動かしてみた結果を別の記事としてまとめたいと思います。


また今回、類似度検索で使われる詳細なアルゴリズムに関しては触れてきませんでした。
そのあたりについては、松井勇佑さんの資料がわかりやすかったので、参考として挙げさせていただきます。
近似最近傍探索の最前線
billion-scaleの近似最近傍探索


まだまだ事例も情報も少ないMilvusですが、今後どうなっていくのか引継ぎウォッチングしたいと思います。
次は実装を積んで、利用感などをまとめていきます。

最後までありがとうございました。
それでは、よいお年を!

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

データを活用し社会を進化させたい機械学習エンジニアWanted!! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com

実務で使えるニューラルネットワークの最適化手法

メリークリスマス。
@tereka114です。

本記事はDeep Learning論文紹介 Advent Calendar 2019の25日です。
qiita.com

私はKaggleの画像コンペに頻繁に参加しています。
そのときに、毎度選定にこまるのがニューラルネットワークの最適化手法(Optimizer)です。
学習率やWeight Decayなどハイパーパラメータが多く、選択パタンが無数にあると感じています。

そのため、Kaggleでよく利用される(されうる)最適化手法を振り返ります。
もちろん、実務でも十分使えるので、皆さんの学習に活かしてくれると幸いです。

最適化手法

今回紹介するのは次の最適化手法です。
Kaggle、もしくは、実務でもこの5種類を抑えておけば、問題ないと思っています。むしろ、十分すぎるぐらい。
調査(個人的主観含む)でつけた事前の軸とその評価を記載します。

最適化手法 精度 収束速度 安定性
SGD ×
Adam × ×
AdamW ×
Adabound
RAdam

精度:収束したときに高いAccuracyを出せるか、など
収束速度:学習の収束まで早くいけるか
安定性:勾配が爆発することなく、最適解を学習できるか

SGD(Momentun)

最も標準的な最適化手法です。
得られたパラメータの勾配を学習率で掛け算し、減少させます。また、Momentunを設定することで、収束が高速化します。

SGDは学習率の設定が難しく、収束するか否かはこの設定が適切か否かに関わっているといっても過言ではないでしょう。
多くのライブラリでは学習率0.01, Momentunは0.9に設定されています。

学習済モデルを学習する場合ではなければ、この設定を利用すれば大丈夫です。
学習済モデルの場合では0.001を利用することをお勧めします。
学習率が高い場合、学習済モデルのパラメータが壊れてしまい、ImageNetの事前学習で獲得された汎用的な特徴抽出機が壊れます。

Adam

Adamの良い点は、SGDよりも収束が早い点です。
領域分割(Semantic Segmentation)では、SGDだと収束が非常に遅く、かつ、局所最適解にたどり着くことが多いです。
ただ、物体検出のFasterRCNNや領域分割モデルのUNetやFPNなどパラメータも多く、タスクが難しい場合にSGDよりよい解にたどり着くこともそれなりにあります。

しかし、このモデルですが、収束が安定しないことが多いです。
学習率(Alpha,lr)の設定を誤るだけで、勾配が爆発し、その結果、パラメータの更新幅が大きくなり、オーバーフローを起こすことも多々ありました。
学習済モデルを利用する場合は0.0001を利用すると安定することが多いです。

AdamW

[1711.05101] Decoupled Weight Decay Regularization

Adamの基本のアルゴリズムからWeight Decayに関する式を変更しました。
自動調整された学習率の場合は、もともと期待していたWeight Decayの結果が得られず、精度が下がる事象が得られるようです。
その事象を回避するために式を変更しています。

具体的な数式は論文を参照ください。
また、PyTorchであれば、既存で実装されています。

pytorch.org

AdaBound

[1902.09843] Adaptive Gradient Methods with Dynamic Bound of Learning Rate

Adamは時々、極端に大きな学習率になることから、SGDと比較して収束が安定しないことが知られています。
そのため、Adamに対して動的に学習率をクリップすることにより、収束を安定させています。
これにより、収束を安定させつつ、精度を同等にしています。
ハイパーパラメータについても、final_lrと呼ばれるクリップで利用するパラメータを適切に設定することで学習可能になります。

PyTorchの実装はこちら
github.com

RAdam

[1908.03265] On the Variance of the Adaptive Learning Rate and Beyond

Warmupと呼ばれる最初に小さい学習率で学習し、通常の学習率で学習させていく手法は収束の高速化、及び、安定性に貢献しています。
また、このWarmupを人手で行うのではなく、分散を考慮した学習率を推定しています。
その仕組みをAdamに組み込んだのがRAdam(Rectified Adaptive Learning Rate)です。

何度かこの手法を活用して学習しましたが、Adamと比較してハイパーパラメータに対して過敏ではないため、扱いやすいです。
PyTorchの実装はこちら

github.com

実験

CIFAR10を使って各Optimizerを用いて実験を試みました。
実験の条件は次の通りです。

項目
誤差 交差エントロピー誤差
データ拡張(Data Augmentation) なし(本実験ではそこまで影響しないため)
アーキテクチャ ResNet50
Batch size 32
Epoch 50

蛇足ではありますが、精度が論文などの実験と比較して低めに出ているのはおそらく、Augmentationを実施していないからです。

Optimizer間の比較

SGDは0.01, その他は0.001の学習率で比較しました。
実験結果は次の通りです。AdamWのWeight Decayは0.00001です。

計算したグラフは次の通りです。

f:id:acro-engineer:20191225080743p:plain
OptimizerのAccuracy比較

少々わかりずらいので順列を示すと次の通りです。

RAdam > AdamW > Adam > Adabound = SGD

Weight Decayを除いて、デフォルトパラメータで学習を行ったので、最適なパラメータは他にあるかもしれません。
ただ、RAdam、AdamWのようなAdamの後継を使うと他と比べて、精度が高い学習を進められそうです。

RAdamとAdamの学習率

Adamはlrが大きいと勾配が発散し、局所最適解に落ちたり、収束しなくなることが(私の)経験的に得られています。
例えば、Segmentationの場合は学習率が0.001だと高すぎて収束せず、誤差の値がnanになります。
しかし、RAdamは最初に自動的にWarmupされているので収束が安定しそうです。

今回は学習率に関する安定性の実験を行おうと思います。
Adamの場合

f:id:acro-engineer:20191225080838p:plain
Adamの学習率比較のグラフ

RAdamの場合

f:id:acro-engineer:20191225080851p:plain
RAdamの学習率比較のグラフ

AdamとRAdamで大きく差分は開かず、学習率の影響を受けている印象です。
ただ、分類ではなく、もう少し難しいタスクなってくると大きく収束に影響するかもしれません。

AdamWのWeight Decayの値

Weight Decayの値を利用した場合のAdamとAdamWの比較です。
AdamWの方が精度が高く出ているので、AdamWの方が使っていくのには良いのではと考えています。

f:id:acro-engineer:20191225080905p:plain
AdamとAdamWの比較

最後に

Optimizer一つとっても適切にチューニングしなければうまくいかないのでまだまだニューラルネットワークは難しいと感じるところです。
期待とは少し異なった部分もあるのでデータセットに応じて、一つひとつ実験を重ねていく必要があると思っています。
おそらく、データセットによっても結果が変わるので気が向けばしっかりと実験してみたいと思います(また新しいのでそうですし、、)。

では!また、新年もよろしくおねがいします。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com

Amazon Kinesis Video StreamsのWebRTCの実力

アドベントカレンダー形式のチョコが今日になっても残って、どこかでずらしてしまった@phonypianistです。

最近、Amazon Kinesis Video Streamsを使って、遠隔ロボットからの映像を
画面で表示するシステムを作りました。
が、5秒程度のタイムラグが発生。
ロボット周辺の様子を確認する程度であれば問題ありませんが、
遠隔操作に向かない。。

そんな中、Kinesis Video StreamsがWebRTCに対応したというニュースが・・・!
aws.amazon.com

WebRTCは、ウェブブラウザ等でリアルタイムな通信を可能にする仕組みであり、
WebRTCを用いると、映像配信のタイムラグもかなり抑えられるとのこと。

いったいどれくらいのタイムラグになるのか、
次の構成でRaspberry Pi用カメラの映像を配信してみました。
f:id:acro-engineer:20191224000637p:plain
Raspberry PiもPCもWiFiでインターネットに接続しています。

で、実際に映像配信した様子はこちら。

左側のストップウォッチをRaspberry Piで撮影したものを映像配信し、
PCで受信したストップウォッチ映像を右側に表示しています。
今回の検証では、おおよそ、0.4~0.5秒程度のタイムラグで配信できているようです。
f:id:acro-engineer:20191223235913p:plain

使用する機材やネットワークによって、タイムラグの増減はありますが、
今までのAmazon Kinesis Video Streamsに比べると、圧倒的に速いですね!


また、Amazon Kinesis Video StreamsのWebRTCの場合、MasterとViewerの2つの役割があります。
名前だけ見ると、Masterは映像配信側、Viewerは受信側と捉えがちですが、
WebRTCの場合は双方向通信が可能です。
つまり、Viewer側で撮影した映像をMasterで確認できます。
(ちなみに、Masterに対してViewerを複数接続できます。)
f:id:acro-engineer:20191224171122p:plain

この仕組みを使えば、遠隔機器が配信した映像を確認しながら
リアルタイムに音声で現場に伝えるようなことが簡単に構築できます。

IoTへの適用の幅が広がりますね!

それでは。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com