はじめに
AutoMLなんてものがこんなにも世の中に出てきているなんて、本当に最近知りました。個人的に商用でAutoMLの存在を把握していたのは「DataRobot」と「Google Cloud AutoML」くらいだったのですが、今はオープンソースソフトウェアとしてもいくつか出ているみたいで、先日「autokeras」なんていうものがあると知りました。
今更ですが、autokeras なんてあるんですね。
— HELLO CYBERNETICS (@ML_deep) 2019年2月8日
これはきっと、Kerasの高レベル感をめいいっぱい活かしたAutoMLの実装に違いない。と思ってリポジトリ行ったら
import torch
ってあって吹いたんですが、kerasって何か機械学習にまつわる特殊な単語なんですか…?
さて、今回はオープンソースのAutoMLのライブラリを適当に列挙するのと同時に、AutoMLが一体何をやってくれるものなのかを簡単に紹介しておきます。
AutoMLのライブラリ
H20.ai
商用のGUIもあるようですが、R, Python APIほかオープンソースとして公開されている模様。
ドキュメントもしっかりしている。ただ、流石に実用レベルまで持ってきているだけあってドキュメントがもりもりだくさんで、知りたいことだけを拾ってくるのが返って難しそうな状態になっていました。 docs.h2o.ai
Auto-Keras
「Keras」というワードに引っかかり最近知ったAutoMLのオープンソースフレームワーク。 Kerasを何に使っているのかはしっかり見ていませんが、NNの計算のバックエンドはPyTorchというフェイント。
モジュールの使い方はKerasやらsklearnのノリに近く、model.fit(x_train, y_train)
などで行けるので、パッと見で使い方が分かる感じでした。
AutoSklearn
utoWEKAというこれまたAutoMLのライブラリでsklearnのモデルを動かしているラッパーというポジションの模様(要確認)。2015年からあるそうです。
hyperas
KerasとHyperoptを組み合わせたラッパー(HyperoptはHyperprameterのチューニングを自動化するライブラリ)。
AutoMLとは
AutoMLとは結局何なのだろうか? 実はこの言葉が指す意味の範囲を私自身も明確には分かっておりません。思想としては機械学習の一連の作業を自動化したいというものであるのは間違いないのですが、いろいろライブラリを見ていく中で、その適用範囲が結構まちまちだな、と感じました。
機械学習で生ずる作業
もちろんデータを集めるとか、それらを溜めておくあるいは取り出すためのインフラを整えるとか、そういう部分も重要な仕事なのですが、今回指す機械学習での作業は概ね下記の領域であるということにしておきます(言葉の定義も人によってまちまちな気はしますが、今回は下記の言葉を使います)。
データ前処理 欠損値の処理やエンコーディング処理など生データを機械学習に用いることのできる形式に整形する処理。必要な特徴の選定やあるいは特徴を作り出す作業。例えば正規化したり白色化したり次元削減も含むことにする。
学習モデルの選択 SVMを使うだとか、NNを使うだとか手法の大枠を決める。
ハイパーパラメータの選定 各学習モデルに付随するハイパーパラメータ、例えば学習率だとか正則化係数だとかを決める。
学習、評価 学習アルゴリズムを動かし、予め決めたメトリクスで学習済モデルの評価を行う。
アンサンブル いくつかのモデルの予測を合算して1つの予測にする。苦手なところを補い合ったり、あるいは学習の偏りをなくす効果がある。
AutoMLの役割
そして、見ていると上記であげた全ての役割を自動で担ってくれるようなものから、例えばハイパーパラメータの選定から学習〜評価を自動化しますというものまでマチマチです(これを実際にAutoMLと呼ぶかは別として、境界を何処に置くのかは定かでない)。
当然のことながら、各仕事に応じて適切な判断と試行錯誤が必要になるのですが、要はその試行錯誤をプログラムに(何らかの方法で)任せましたというのがAutoMLの正体ということです。
ハイパーパラメータ探索
例えばHyperParameterのチューニングなんかはかなり想像がしやすく、CVあるはHoldoutで検証データのメトリクスを見て、良いハイパーパラメータを探すという手続きであれば(ランダムサーチ的なことならば)誰でも実装ができるでしょう。ただ、サーチの仕方を工夫しようと思うと、bayesian optimization だとかが出てくるということになりますが、概ねやろうとしていることは分かりやすいはずです。
モデルの選定
そしてモデルの選定の部分まで自動化しようと思ったらどうなるでしょうか。 例えばリストの中に、SVMやLRやNNを全部ブチ込んでおいて、順番に学習と評価を行い一番良かった物を選べば一先ずは良さそうです。これも結局、誰でも自動化のプログラムが書けそうですし、ハイパーパラメータのチューニングも各モデルに対して自動化しておけば、あらまほとんどの面倒な作業が自動で行われてしまいそうです。
ただとんでもない時間がかかりそうなのは言うまでもないので、ではモデル選択の仕方をどうやって決めようかということになれば、工夫が必要になるわけですね(特に、NNならばモデルなんて無限にパターンがある)。例えばモデルはNNに絞ってしまって、NNの中でどんな構造を選ぼうかという作業を強化学習に投げるという方法は実際に論文でも出たりしていますね。(ただ、強化学習でやる必然性はなく、とりあえず良さそうな構造をどういう順序で試していくのかを、それっぽく工夫できれば何でも良いのです。例えば進化計算で探すのもありでしょう。本質的にハイパーパラメータを探すこととやろうとしていることに差異はありません。)
特徴選択
そもそもどんな特徴を与えれば良さそうなのかということも、試しにいろんな特徴抽出手法を羅列しておいて試してみれば良さそうです。正規化が良いのか標準化が良いのか、ラベルエンコーディングかワンホットエンコーディングか、あるいはマルチコ対策で特徴を単純に減らすような操作も必要になるかもしれません。
考えられるパターンを全て試せば目的は達成できるはずです。しかしこれも当然時間がかかるので、上手にやり方を考える必要があります。 例えばPermutation Importanceのような方法で特徴を選ぶ手法が提案されているので、その試行錯誤の流れをプログラムにしてしまうというのが一つ考えられるでしょう。
AutoMLとは
結局のところ上記の作業を上手に効率的にラッピングしたものがAutoMLの正体であると言えます。したがってKaggleをやっている人やデータ分析を行ったことがある人ならば、「おお!楽になりそうだ」と思いつつも「自分が思いついたあの作業を、自動化プログラムは見つけることができるのか」という疑問も感じていることでしょう。
AutoMLは一見すると本当に魔法のように性能の高いモデルを組み立ててくれそうですが、泥臭さをラッピングした中身はとてつもなく地味な作業の繰り返しになっていることでしょう。
ちなみに試行錯誤の過程やモデルそのものの意図、解釈性などとは明らかに無縁な存在であることは認識しておくべきです。性能良ければ全て良しというときに使うものでありますし、別に必ずしも人がやるより性能が良いとも限りません。
ただ、世界最高性能で無ければ動かしちゃいけないようなシステムだけで世の中出来上がっているわけではありません。楽に、そこそこの性能の物がほしいというシーンは結構たくさんあるはずです。なので、今後、機械学習の民主化が行われていく中で自然と、知らないうちに使われている物になっているのでは無いかなと、個人的には思っています。
追記
そういえば Twitter で有名なtdual氏の会社MatrixFlowはAutoMLをやる会社っぽそうです。