刮目せよ!アンサンブル機械学習
前回は、機械学習のうちでも今、最も話題の手法・ディープラーニングについて、自分なりに学んだことを、アップしてみました。その結果、ディープラーニングといえども万能ではないこと、アンサンブル機械学習なる、場合によってはディープラーニングよりも適している手法があることを、学びました。
今回は、そのアンサンブル機械学習について、学んだことをアップしていきたいと、思います。
アンサンブルとは何なのか
今回も前回と同じく、まずは言葉の意味から、考えてみたいと思います。アンサンブルとは、辞書的に言うと、「各部分が総合され調和のとれた全体」という意味だそうです。つまり、「アンサンブル機械学習=何かの部分から構成された、全体としての機械学習」と言うことが、できるかと思います。
では、何かとは一体、何なのでしょう?まずは、以下をご覧ください。〇×クイズの回答を予測するAIを、機械学習で作ったとします。
正解 | 機械学習1の予測 | 機械学習2の予測 | 機械学習3の予測 | 多数決 |
---|---|---|---|---|
〇 | 〇 | 〇 | 〇 | 〇 |
〇 | 〇 | 〇 | × | 〇 |
〇 | 〇 | × | 〇 | 〇 |
〇 | × | 〇 | 〇 | 〇 |
個々の機械学習1~機械学習3は、正解率が75%ですが、多数決を取ると、全体として、正解率が100%になります。この、個々の機械学習1~3こそが、アンサンブル機械学習を構成する「何か」であり、専門用語で「弱学習器」なんて、呼ばれたりします。
そして、アンサンブル機械学習とは、「一個一個は精度が低い、複数の弱学習器から構成された、全体として精度の高い機械学習」と言うことが、出来るかと思います。
次から、代表的なアンサンブル機械学習の手法を、もう少し掘り下げてみたいと思います。
アンサンブルじゃない機械学習
おそらく、上級者ともなれば、自前で弱学習器を組み合わせて、独自のアンサンブル機械学習モデルを、状況に応じて組み上げたり、出来るのでしょうが・・・
世の中には、組みあがり済みのアンサンブル機械学習のライブラリが、いくつかあります。そんな世の中で人気のアンサンブル機械学習ライブラリで、弱学習器としてよく利用されている手法が・・・決定木/回帰木と呼ばれるものです。以下を、ご覧ください。
よく機械学習の本なんかに出てくる、アヤメの花の分類を、決定木でやってみたものを、可視化した図です。まずは、「petal lengthが2.45以下かどうかを判定し、続いて、petal widthが1.75以下かどうかを判定し・・・」という風に、延々とif文を繰り返していくような形で、入力データを処理します。
処理結果が、上記図のように、いくつかの種類に分かれるものは「分類」といい、画像認識なんかも、これにあたります。一方、処理結果が、「金額」のように、無数の連続値をとるものは「回帰」と呼ばれ、上記の手法で回帰問題を解く場合は、「回帰木」なんて、呼ばれます。
この決定木/回帰木を弱学習器として利用した、いくつかのアンサンブル機械学習の手法が、ディープラーニングと並び、コンテストなんかでもよく利用されている、そうです。
アンサンブル機械学習の手法その1:バギング
一つ目が、バギングと呼ばれる手法で、まんま上の方で例示した、これです。
正解 | 決定木1 | 決定木2 | 決定木3 | 多数決 |
---|---|---|---|---|
〇 | 〇 | 〇 | 〇 | 〇 |
〇 | 〇 | 〇 | × | 〇 |
〇 | 〇 | × | 〇 | 〇 |
〇 | × | 〇 | 〇 | 〇 |
ちょっとずつパラメータを変えた、複数の決定木/回帰木を弱学習器として並列に使い、多数決したり平均を取ったりして、全体としての予測結果を出す手法で、ランダムフォレストと呼ばれます。ランダムにちょっとずつパラメータを変えた木を、たくさん作るので、森というわけですね。
ランダムフォレストは、安定して精度が出て、チューニング用のパラメータも少ない・分かりやすく、どの入力データが予測をするうえで重要だったか、ランキングを付けて教えてくれるという、初心者にも優しい親切設計な手法です。
迷ったら、とりあえずランダムフォレストを使っておいても、間違いない!?かも、しれません。
アンサンブル機械学習の手法その2:ブースティング
並列があるなら直列もあるだろうということで、複数の決定木/回帰木を弱学習器として直列に使う手法が、ブースティングになります。
ブースティングの手法は複雑で、まだ私もあまりよく理解はできていないのですが・・・ざっくりイメージを書くと、以下のような処理の流れに、なります。
- 決定木/回帰木を使って、入力データを学習・評価。
- 予測誤差があったところを重点的に補正し、第二の決定木/回帰木を、作る。
- 入力データを学習・評価し、予測誤差があったところをry
という風に、逐次的に、誤差があったところを重点的に補正しつつ、学習を進めていきます。ランダムフォレスト(バギング)と比べて、以下の特徴があると、言われています。
- 【-】学習時間がかかる(直列だし)。
- 【-】学習パラメータが多く、チューニングが難しい。
- 【-】解釈が難しい。
- 【+】ちゃんとチューニングできれば、予測精度はバギングより高くなることが、ある。
つまり、安定して精度が出て、そこそこ解釈性もあり、チューニングもそこまで難しくない、いい意味で丸いやつ(?)がランダムフォレストで、難しいけど頑張れば精度が出る、とがったやつ(?)がブースティングといった、ところでしょうか。
イメージ的に、弱学習器⇒バギング⇒ブースティング⇒ディープラーニングとなるに従って、精度はあがるものの、「何故そういう予測になったのか」を人間が理解するのが難しくなる、専門用語で言うところの解釈性が低くなるような、イメージがあります。
ブースティングの代表的な手法として、XGBoostというものが長らく人気でしたが・・・最近、Microsoftが出した、LightGBMという手法が、人気なんだそうです。ぱっとやってみた感じ、Lightの名にたがわず計算時間も早く、マイエース手法になってくれそうな?予感が、あります。
・・・というわけで、アンサンブル機械学習がなんだかわかったところで(?)、次からは実際に、いくつかの問題を、機械学習で解いていってみたいと思います。
最後まで読んでいただいて、ありがとうござました。
俺流解説?ディープラーニングを知りたいあなたへ
第一回目となる前回は、AIと機械学習について、自分なりに学んだことをアップしてみました。今回は、噂のディープラーニングについて、やはり自分なりに学んだことを、アップしてみたいと思います。
本を読んでみたけど、難しすぎてさっぱり分からん・・・なんて方の、何かしらの参考にでもなれば、幸いでございます。
ディープラーニングは何が深いのか
さて、さっそくディープラーニング、直訳すると「深い学習」ですが、日本語ではもっぱら、「深層学習」と言われます。ここでいう「学習」とは、前回学んだ機械学習のことなので、ディープラーニング=層が深い機械学習ということが、できます。
そして、機械学習とは、機械=コンピュータが、人間から関数=計算式を与えられるのではなく、データを元に、自分で関数を学習するという、ことでした。
つまり、ディープラーニングとは、層が深い「何か」で、コンピュータが、関数を学習するということに、なります。
では、「何か」ってなんやねんということになりますが・・・何かとはズバリ、モデルです。モデルとは、やはり前回学んだところによりますと、関数の形でした。つまり、1次関数なら「y = ax + b」、2次関数なら「y = ax^2 + bx + c」というのが、関数の形です。
「層が深い関数」って、一体どんな形していると、思いますか?
関数の形の決め方
例えば、物件の価格(y)を、大雑把に、駅からの距離(x1)、物件の広さ(x2)、築年数(x3)から、予測してみるとします。この場合、関数の形は、何次関数にすればよいのでしょう?1次関数だったら、直線になりますし、2次関数だったら、U ← こんな形の、グラフになります。もっと高次の関数かも、しれません。
とりあえずグラフを描いてみて、グラフの形から想像してみるのもありかもしれませんが・・・変数が三つ(x1, x2, x3)もあると、単純な平面のグラフになるわけじゃ、ありません。もっと変数が増えると、とっても多面的な、素人がぱっとみてもよく分からんグラフです。
・・・なんてことを、いちいち考えなくても良い方法が、機械学習には、ありまして・・・例えば、以下の式を、ご覧ください。
u = w1 × x1 + w2 × x2 + w3 × x3
y = f(u)
x1~x3の入力データに、適当な定数(重みと言います)w1~w3をかけて足しこみ、足しこんだ値uに、適当な関数fをかけて、y(物件の価格)を計算します。f次第ではありますが、いちいち何次関数かなんて考えなくても、こんな感じの式で、それなりの値を、予測できるのです。上記を別の表現で書くと、こんな感じの図になります。
ちなみに、fのことを、専門用語で、活性化関数なんていいます。
上記の関数は、そんなに複雑な式を近似できるわけではありませんが、あるテクニックを使うことにより、もっと複雑な関数を近似することも、できるようになります。それはズバリ・・・「変数と変数を組み合わせて、別の変数を作成する」です。以下をご覧ください。
ごちゃごちゃするので、重みや活性化関数は省略していますが、入力データ同士をかけ合わせたり、割ったり、重みをかけたり、活性化関数をかけたりなんかして、別の中間データを、作ります。最終的に、それら中間データ同士も、重みや活性化関数をかけて足しあわせ、出力データを得ます。理論上、中間データ同士から、さらなる中間データを、延々と作り続けることができますので・・・
こんな形になります。・・・何か見えてきましたでしょうか?
つまり層が深いとは
よく、Webアプリケーションのことを、「3層構造」なんて言ったり、しますよね。「プレゼンテーション層」「ビジネスロジック層」「データベース層」なんていう、あれです。
実は、先ほどの図3もそれと同じで、大きく見ると、3層からなっています。入力データがある入力層、入力データを元に、いっぱい中間データを作っているところを、まとめて中間層(隠れ層なんても、言います)、最後に出力を得るところを、出力層なんて、いいます。
つまり、層が深いとは・・・中間層がたくさんある状態のことを、指します。先ほどの図2や図3は、生物の脳の神経細胞(ニューロン)に形が似ているそうで、ニューロンが網目状になっている⇒ニューラルネット/ニューラルネットワーク、中間層がたくさんある(深い)ニューラルネットワーク⇒ディープニューラルネットワーク、なんて、言います。
ようやく話がつながりました。ディープラーニング=ディープニューラルネットワークを用いた、機械学習⇒(中間)層が深い関数の形を持つ、ニューラルネットワークを用いて、コンピュータが、計算式を、学習するということになります。
万能そうで万能でないディープラーニング
私が、このディープラーニングの理論を知ったとき、一番凄いと思ったのが、万能性があるところです。理論上、中間層をいくらでもつなげて、どんな関数でも近似できそうな、気がします。つまり、これさえ学んどけば、他の手法なんていらないんじゃないかという、気がするところです。
気がしたのですが・・・やってみると、実はそうでもありません。何の工夫もなく、ただただ中間層をつなげるだけでは、あんまり精度は出ないようです。正確に言うと、学習に使うデータに対しては、どこまでも精度は出るのですが、学習に使っていない、未知の、本当に予測したいデータに対しては、無工夫だと、そこまで精度は上がらないっぽいです。専門用語で言うところの、過学習というやつでしょうか。
これが、1940年代だか50年代だか60年代には既に考案されていたにも関わらず、つい最近まで、あまりディープニューラルネットワークがフィーチャーされなかった、原因のようです。
では、何故近年、猫も杓子もディープラーニングになっているかというと・・・精度を上げるための画期的な工夫が、発見されたからのようです。
一つ目が、畳み込みニューラルネットワーク(Convolutional Neural Network、CNN)というもので、画像認識に対して、圧倒的な精度が出せるものです。
二つ目が、再帰型ニューラルネットワーク(Recurrent Neural Network、RNN)というもので、時系列のデータに対して、有効だと言われているものです。時系列というと、「売上予測」的なものが分かりやすいですが・・・人間の話す言語(専門用語で言う、自然言語)にも、時系列が、あります。例えば、「わたし」の次には、「は」「が」「へ」「に」「と」などの助詞が来る確率が高く、わたし「こ」なんて並びになる確率は、低いです。「わたし」のさらに前の文字を見れば、助詞の中のどの語句が来るか、さらに確率が分かります。
・・・このように、RNNは、いわゆるチャットボットなどのテキスト処理や、Siriなどの音声処理に対して、高い精度が出るようです。
つまり、以下のような分野で、圧倒的な精度が出ているのですが・・・
- 画像認識
- 文章認識
- 音声認識
逆に言えば、これ以外の分野で、なんでもかんでも精度が出るわけでは、ないみたいです*1。ディープラーニングの入門書を手に取れば、高確率で「手書き文字の画像の認識」なんて例題が出てくると思いますが・・・多分、そういうことです。
いわゆる、テーブルデータというか表形式のデータというか構造化データに対する、画期的な工夫がされたニューラルネットワークって、あんまりないみたいで・・・そういうのは、従来的なアンサンブル機械学習というものの方が、精度が出たりするみたいです。
では、そのアンサンブル機械学習とは、何なのか?次回はこれについて、勉強してみたいと思います。
*1:教師なし学習とか強化学習も含めれば、ゲームAIとか、コンテンツ生成とかも、あると思います。
知っていますか?AIや機械学習とは何かを
猫も杓子もAIな最近の世の中。AIとか人口知能って流行っていますよね。長年、業務システムでWebアプリを作ってきたけど、これからの世の中、今後が不安。機械学習とかやってみたいけど、難しすぎてワケが分からん。そんな風に思ったこと、ありませんか?
当ブログでは、長年Javaエンジニアとしてやってきたわたくしが、今更ながらに機械学習に挑戦してみて、学んだことなどをアップしていきたい思います。「AIや機械学習やってみたいけど難しすぎてなんだか分からん」なんて同じような方の、何かしらの参考にでもなりましたら、幸いです。
第一回目の今回は、そもそもAIとか機械学習って何なのかについて、自分なりに学んだことを、アップしてみたいと思います。
機械学習とは何なのか
まずは、機械学習からいってみたいと思います。機械学習というからには、そのものずばり、「機械」が「学習」するのです。ここでいう機械とは、いわゆる計算機というかコンピュータというか、WindowsとかMacとかLinuxとかの、あれです。以降、コンピュータで、表記を統一しようと思います(多分)。では、「学習」とは、一体何を学習するのでしょう?
比較として、まずは機械学習ではない、従来のシステムについて、簡単に図示してみたいと思います。
従来のシステム
従来のシステムは、上記の通り、事前に人間がJavaなりなんなりのプログラミング言語で関数(プログラム)を作成しておき、そのプログラムに対して、何かしらの入力データを与えます。コンピュータは、与えられた関数と入力データに従い、計算して、計算結果を出力します。
別の言い方をすれば、人間が事前に設定した計算式に従って、答えを出すのが、従来のシステムと、言えるかと思います。
簡単な例で例えると・・・
- 人間が「3」という入力値を用意する
- 人間が、「入力値を3倍する」という関数を、プログラミングする
- 数式で書くと、「y = 3x」という、1次関数ですね。
- コンピュータが、「9」という計算結果を、出す。
一度プログラムを組んでしまえば、高速で、飽きたり疲れたり文句言ったりせず、ミスせず、処理し続けてくれるのが、コンピュータのいいところです。
でも、全て人間が事前に設定した計算式に従って計算しているので、あまり知能チックなところは、ありません。まさに、「機械的に」、計算しているだけですね。
機械学習なシステム
これが機械学習だと、こういうイメージになります*1。
結論から言うと、機械(コンピュータ)が学習するのは、関数です。より正確に、先ほどの例でいうと、「y = 3x」の、「3」の部分です。人間が事前に用意する部分は、以下です。
- 求めるべき関数の形を、決める。
- 先ほどの例の場合、「y = ?x」という、1次関数だと、決めることになります。
- ?の計算方法
このあたり、個人的に、用語の理解がふにゃっとしているのですが・・・関数の形(y = ?x)がモデル、学習すべき「?」がパラメータ、?が求まった形(y = 3x)が学習済みモデル、? の計算方法がアルゴリズムと思っておけば、あたらずとも遠からずな、気がしています*2。
ちょっぴり現実の例でいうと・・・例えば、自動的にエアコンをつけるシステムが、あったとします。従来のシステムだと、「25度以上になったら冷房をつける」「15度以下になったら暖房をつける」とか、事前に人間が設定する必要があります。
対して、機械学習なシステムだと、日々人間が何度以上になったら冷房をつけ、何度以下になったら暖房をつけるのかを、センサーなどを通して記録して・・・コンピュータが、何度になったら冷房をつける/暖房をつけるべきかを、学習していきます。
・・・なんだか、知能が備わったような、気がしてきませんか?
AIとは何なのか
機械学習が分かったところで(?)、AIにいってみたいと思います。AI = Artificial Intelligenceの略、日本語では一般的に人工知能と訳されます。「知能の明確な定義がないので、人工知能の定義なんてムリ」とか、身も蓋もないことをおっしゃる、えらい学者さんもいるらしいですが・・・
先ほども触れました通り、従来のシステムに比べると、機械学習なシステムは、なんだかちょっぴり知能が備わったような気がしてくる、代物では、あります。
しかし、「AI」と聞いて一般にイメージされる、いわゆるドラえもんとか、映画ターミネーターに出てくるスカイネットとかと比べると、程遠い代物でも、あります。
ここから考えるに、以下が言えると思います。
- 機械学習を使って、知能っぽいものを実現することは、できる
- 知能っぽいもの=AI/人工知能
- 現在の機械学習で実現できる知能っぽいものは、SFの世界に出てくるAIに比べると、程遠い
3番目のものを「強いAI」、1番目のものを「弱いAI」とか言うそうです。つまり、機械学習とAIの関係は、以下になるかと思います。
- 現在の機械学習技術を使って、弱いAIを作ることならば、できる
- つまり、機械学習は、AIを作るための技術(の、一つ)
- ただし、機械学習は、AIを作るためだけの技術では、ない(?)
・・・ような気が、するのですが・・・分かりやすさからかインパクトからかセールス上の理由からか、機械学習≒AI=とりあえずAIと言っとけ的な、雰囲気も、感じたりしたりしなかったり。
個人的には、AIというと誤解を招きそうなので、「機械学習」と言う方が、好きです。
まとめ
ということで、まとめると、以下になるかと、思います。
- 機械学習とは、コンピュータが、関数を学習する、ものである。
- これにより、「ちょっとした知能があるっぽい」と人間が感じなくもない程度のものは、作れる。
- つまり、機械学習により、AIっぽいものは、作れる。
機械学習でやりたいこと
というわけで、機械学習を勉強して、個人的にやりたいことですが・・・結論から言うと、データサイエンスっぽいことに、挑戦できれば、なんて思っています。
機械学習で流行っていることというと、画像認識だったり、Siriみたいな音声認識・文字認識だったり、AlphaGoみたいな、ボードゲームで人間のプロに勝ったりだったりしますが・・・
私みたいな今まで業務システムをやってきた日本のSIerさんからすると、相対しているお客さん含め、活用方法にピンとこない方も、多いような気がします。
それよりは、データ分析系とでも申しましょうか。融資審査の合否の判断を学習させたりとか、需要予測をしたりとか、そういうのから始めた方が、ピンとくるような、気がしています。
そんなわけで、これから、データ分析っぽいものを中心に、機械学習を勉強していきたいと思います。
参考資料
プログラマのための ディープラーニングのしくみがわかる数学入門
- 作者: 増井敏克
- 出版社/メーカー: ソシム
- 発売日: 2018/10/26
- メディア: 単行本
- この商品を含むブログを見る