見出し画像

複数のAIを使い、更に賢いAIを作る (アンサンブルラーニング、集合学習)

先日書いた「AIネイティブなる世代に向けて」という記事で、Ensemble Learning を使いこなすには、ブリーダーのような振る舞いが必要かもということをさらっと書いたのですが、本記事はその「集合学習 (Ensemble Learning)」についてです。

(タイトルから、去年、Facebook AI Research が発表した Back Translation Model のような、AI 同士をインタラクションさせたり、ループさせたりするような話ではないのか、と思われた方は、最後の方で触れてますのでそちらを。)

2016年の CEATECで、人工知能時代のビジネスと人の変化というタイトルで講演をしました。

その中で、2015年に開催した競馬ハッカソンの事例を紹介し、ハッカソンに参加した人たちの一つのチームが、勝ち馬予想アプリを作ったという話をしました。その勝ち馬予想アプリが、懇親会で、脅威の予測をしたというエピソードです。

その競馬ハッカソンが終わった後にみんなで大井競馬場に移動しまして、せっかくなので競馬を観戦しましょうと。
そのなかで、チームの中に、勝ち馬を予測するというAIのアプリを作ったチームがいたんですね。せっかくだから、予測してみた。ちなみに競馬プロフェッショナルの方々も予想して、その予想とはちがったんですが。
彼らが作ったアプリが、まず第1レースの1位を予測したんです。もう答えが出ていましたけれども。第2レースは彼らが予測したものが1位にならなかったんです。でも、僅差で2位だったんです。第3レースは彼らが選んだやつが1位になったんです。

記事内にもありますが、このチームのメンバーは、競馬のことをハッカソンに参加するまで知らなかった。ただ、機械学習の各種手法には詳しく色々試して精度をあげていったと。ここで彼らが使ったのが集合学習(Ensemble Learning)というアプローチです。
この集合学習ですが、データサイエンスやAI サービスを開発する現場では、非常に広く使われていますものの、一般の方にはあまり馴染みがない用語なので、ちょっと書いてみたいと思います。


集合学習(Ensemble Learning)とは何か。シンプルにいうと、「複数の機械学習のモデルを複合的に用いて、一つ一つのモデル単体における予測や分類のパフォーマンスを上回る、よりよいパフォーマンスを得るための手法」です。パフォーマンスという言い方をしましたが、得るものは時に精度だったり、時に安定性だったり、バイアスの除去だったりします。向上させたいものによってアプローチは色々存在します。

例えば、一番、ベーシックな方法としては、こうです。まず、トレーニングデータとテストデータを用意し、教師あり学習手法を一つ用意します。例えば、KNN を用意します。トレーニングデータを使ってKNNを学習させ、モデルを作ります。他にも教師あり学習手法を用意します。線形回帰や決定木(Decision Tree)や SVM を用意し、同様にトレーニングデータを使って学習させ、モデルを作ります。これによってデータを入れるとそれぞれのモデルから結果を得ることができるようになります。ここで、やりたいことが予測だった場合、それぞれのモデル(KNN、線形回帰、決定木、SVM)の結果を足し合わせて平均値を得るとします。するとこの学習モデル群の全体としては、それぞれの学習モデルのパフォーマンスを考慮した値を得ているということになります。これにより、例えば一つのモデルで、大きな誤差(外れ値)が発生する時もその影響を小さくすることができ、安定的な精度の予測を行うことができるようになります。(やりたいことが分類だった場合、それぞれのモデルの結果から、多数決を行う等の方法になりますが、それにより安定的な精度の分類を得るというところは同じになります。)

また、それぞれのモデルを均等に足すのではなく、重みをつけて足すことで精度をより高めていくこともできるでしょう。先日書いた、交差検証の手法に乗っ取り、検証データでモデルを調整していくことをやっていくことになります。

「複数の機械学習のモデルを複合的に用いて、一つ一つのモデル単体における予測や分類のパフォーマンスを上回る、よりよいパフォーマンスを得るための手法」と先に書きましたが、複数のモデルは何も複数のアルゴリズムから作る必要はありません。例えば、線形回帰だけ、とか、SVMだけ、とか、つまり、同一のアルゴリズムから複数のモデルを作り、複合させる、という集合学習のやり方もあります。これは、Bootstrap Aggregating あるいは、Bagging と呼びます。この場合は、トレーニングデータを分けて、それぞれ違うトレーニングセットで学習させたモデルを組み合わせることになります。

ここで、Boosting というテクニックが登場します。分けたトレーニングデータセットの中で、一つのモデルが正解できなかったトレーニングデータを重視し、他のモデルにも投入し、学習させていくようにします。そうすることで学習が難しいトレーニングデータに対する適応力をモデル全体で高めていくということができます。具体的な手法に、Adaboost や XGBoost があります。例えば、楽天技術研究所では、過去に商品画像の中で特にきれいな画像を選り分けるためにAdaboostを使って抽出したり、またXGBoostを、商品データの分類・整理の精度向上目的で大規模に適用していたりします。このようなトレーニングデータを扱うテクニックが様々存在することで、集合学習は精度を高めていくことに利点を持っているアプローチということができます。


さて、集合学習の中で、よく使われる手法は、Random Forest です。前述した競馬のハッカソンでの事例でも、勝ち馬予想アプリを作ったチームが使っていたのは、Random Forest でした。

Random Forest は、決定木のモデルを複合した分類の精度をあげるための集合学習といえます。Baggingの手法がベースになっていて、ランダムに分けられたデータからそれぞれの決定木のモデルを作っており、それによって作った決定「木」のモデルが集まっている、ということで、Random Forest(ランダムの森)という名前になっています。

Random Forest はパワフルな手法で、楽天技術研究所でも、FinTech における金利予測やマーケット予測等にフル活用しています。また、画像認識に使われる例もあり、マイクロソフトは以前、Xbox Kinect の人体認識に用いていたりしています。Random Forestsはチューニングが不要なのですが、学習データに依存しやすく、過学習となりやすいという問題があります。決定木の構造がシンプルだと偏りを生じてデータにフィットせず、決定木の構造が深いと小さなデータの変化にセンシティブになりやすくなります。また、このような仕組みから全体としてRandom Forest で作られたモデルは修正や調整を施すことが難しいブラックボックスになりがちです。以上の特徴から、アプリケーションによっては適用に慎重を要します。


最後に、Boosting の説明でちょっと触れた、XGBoost にもう一度触れます。XGBoost は、Gradient Boosting と Random Forest のアルゴリズムを組み合わせた集合学習となります。

Gradient Boosting とRandom Forest の組み合わせと書きましたが、Gradient Boosting とは、Gradient Decent (最急降下法。関数の最小値を探索するアルゴリズムの一つ)を Boosting に活用した手法で、近年では様々なデータコンペティションで高いスコアを叩き出しているので注目されています。Gradient Boosting の詳細を簡単に説明するのはほとんど不可能な感じなのですが、Boosting を上では、「分けたトレーニングデータセットの中で、一つのモデルが正解できなかったトレーニングデータを重視し、他のモデルにも投入し、学習させていくようにする」、と書きました。このとき、モデルを追加する際にできる限り誤差(損失関数)が小さくなるように最急降下法を用いる、という手法が Gradient Boosting です。

XGBoost の最初の二文字の XG は、eXtreme Gradient Boosting という意味です。XGBoost はチューニングを要するパラメータが存在し、交差検証によって最適化していく必要はあるものの予測精度が Random Forestsよりも向上し、それもあってめちゃくちゃ流行ってます。特に大規模データを扱うコンペティションで猛威を奮っています。XGBoost については以下の、楽天技術研究所ボストンのメンバーが発表した資料でも触れています。

以上、集合学習(Ensemble Learning)を紹介しました。AI による精度向上を行っていく現場では広く使われるアプローチですので応用例も様々あり、また、ビッグデータ時代に適しているともいえる、Gradient Boosting のポテンシャルでまだまだ展開していく領域だと思われます。引き続きその発展に期待です。

そして、言及をしませんでしたが、集合学習はその手法から、目的に対して、ビジネス知識がない、ドメイン知識がないような状態でもパフォーマンスを高めることができます。冒頭にあげた競馬の事例もそうでした。勝ち馬予想アプリを作ったチームは競馬の知識をもっていませんでしたが、高い精度の予想AIを作ったわけです。これはデータサイエンスにおける、ある意味タブー的なことですが、インターネットが普及し、消費者の行動が変容し、かつビッグデータを用いた解析が可能になった現代においては重要な意味を持ちます。それに関しては、また別途取り扱いたいと思います。


余談

ところで、集合学習と話はずれますが、最近は、複数のAI 同士をインタラクションさせたり、ループ構造を作って、目的へ向けたシステムの精度を高めていく手法というのが、分野を問わずに試みられています。

Facebook AI Research は、機械翻訳の新しいモデルである、Back Translation Model というのを去年発表しています。これは、言語X→言語Y の翻訳モデルと、その逆の翻訳モデルを組み合わせて精度を高めていく手法ですが、BLEU スコアという機械翻訳の標準ベンチマークで今までにないハイスコアを達成しています。

また、電通は、広告バナーを自動生成する ACM (Advanced Creative Maker)というAIシステムの開発を行っていますが、そこで、バナーを生成するAIと、生成されたバナーのCTRを予測するAI を組み合わせて精度を高めるアプローチを採用しています。


このようなAI同士をインタラクションさせたり、ループ構造を作る手法は、今までの単一の Deep Learning モデルを用いていたAIシステムから、より複雑なモデルへの発展の可能性を示しており、今後、注視すべき流れとも言えます。



この記事が気に入ったらサポートをしてみませんか?