刮目せよ!アンサンブル機械学習

前回は、機械学習のうちでも今、最も話題の手法・ディープラーニングについて、自分なりに学んだことを、アップしてみました。その結果、ディープラーニングといえども万能ではないこと、アンサンブル機械学習なる、場合によってはディープラーニングよりも適している手法があることを、学びました。

今回は、そのアンサンブル機械学習について、学んだことをアップしていきたいと、思います。

アンサンブルとは何なのか

今回も前回と同じく、まずは言葉の意味から、考えてみたいと思います。アンサンブルとは、辞書的に言うと、「各部分が総合され調和のとれた全体」という意味だそうです。つまり、「アンサンブル機械学習=何かの部分から構成された、全体としての機械学習」と言うことが、できるかと思います。

では、何かとは一体、何なのでしょう?まずは、以下をご覧ください。〇×クイズの回答を予測するAIを、機械学習で作ったとします。

正解 機械学習1の予測 機械学習2の予測 機械学習3の予測 多数決
×
×
×

個々の機械学習1~機械学習3は、正解率が75%ですが、多数決を取ると、全体として、正解率が100%になります。この、個々の機械学習1~3こそが、アンサンブル機械学習を構成する「何か」であり、専門用語で「弱学習器」なんて、呼ばれたりします。

そして、アンサンブル機械学習とは、「一個一個は精度が低い、複数の弱学習器から構成された、全体として精度の高い機械学習」と言うことが、出来るかと思います。

次から、代表的なアンサンブル機械学習の手法を、もう少し掘り下げてみたいと思います。

アンサンブルじゃない機械学習

おそらく、上級者ともなれば、自前で弱学習器を組み合わせて、独自のアンサンブル機械学習モデルを、状況に応じて組み上げたり、出来るのでしょうが・・・

世の中には、組みあがり済みのアンサンブル機械学習のライブラリが、いくつかあります。そんな世の中で人気のアンサンブル機械学習ライブラリで、弱学習器としてよく利用されている手法が・・・決定木/回帰木と呼ばれるものです。以下を、ご覧ください。

f:id:tatsu_mk2:20190323144039p:plain
図1 決定木のイメージ

よく機械学習の本なんかに出てくる、アヤメの花の分類を、決定木でやってみたものを、可視化した図です。まずは、「petal lengthが2.45以下かどうかを判定し、続いて、petal widthが1.75以下かどうかを判定し・・・」という風に、延々とif文を繰り返していくような形で、入力データを処理します。

処理結果が、上記図のように、いくつかの種類に分かれるものは「分類」といい、画像認識なんかも、これにあたります。一方、処理結果が、「金額」のように、無数の連続値をとるものは「回帰」と呼ばれ、上記の手法で回帰問題を解く場合は、「回帰木」なんて、呼ばれます。

この決定木/回帰木を弱学習器として利用した、いくつかのアンサンブル機械学習の手法が、ディープラーニングと並び、コンテストなんかでもよく利用されている、そうです。

アンサンブル機械学習の手法その1:バギング

一つ目が、バギングと呼ばれる手法で、まんま上の方で例示した、これです。

正解 決定木1 決定木2 決定木3 多数決
×
×
×

ちょっとずつパラメータを変えた、複数の決定木/回帰木を弱学習器として並列に使い、多数決したり平均を取ったりして、全体としての予測結果を出す手法で、ランダムフォレストと呼ばれます。ランダムにちょっとずつパラメータを変えた木を、たくさん作るので、森というわけですね。

ランダムフォレストは、安定して精度が出て、チューニング用のパラメータも少ない・分かりやすく、どの入力データが予測をするうえで重要だったか、ランキングを付けて教えてくれるという、初心者にも優しい親切設計な手法です。

迷ったら、とりあえずランダムフォレストを使っておいても、間違いない!?かも、しれません。

アンサンブル機械学習の手法その2:ブースティング

並列があるなら直列もあるだろうということで、複数の決定木/回帰木を弱学習器として直列に使う手法が、ブースティングになります。

ブースティングの手法は複雑で、まだ私もあまりよく理解はできていないのですが・・・ざっくりイメージを書くと、以下のような処理の流れに、なります。

  1. 決定木/回帰木を使って、入力データを学習・評価。
  2. 予測誤差があったところを重点的に補正し、第二の決定木/回帰木を、作る。
  3. 入力データを学習・評価し、予測誤差があったところを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:id:tatsu_mk2:20190321120003p:plain
図1 関数の形

ちなみに、fのことを、専門用語で、活性化関数なんていいます。

上記の関数は、そんなに複雑な式を近似できるわけではありませんが、あるテクニックを使うことにより、もっと複雑な関数を近似することも、できるようになります。それはズバリ・・・「変数と変数を組み合わせて、別の変数を作成する」です。以下をご覧ください。

f:id:tatsu_mk2:20190321121657p:plain
図2 入力データから別の変数を作る

ごちゃごちゃするので、重みや活性化関数は省略していますが、入力データ同士をかけ合わせたり、割ったり、重みをかけたり、活性化関数をかけたりなんかして、別の中間データを、作ります。最終的に、それら中間データ同士も、重みや活性化関数をかけて足しあわせ、出力データを得ます。理論上、中間データ同士から、さらなる中間データを、延々と作り続けることができますので・・・

f:id:tatsu_mk2:20190321123844p:plain
図3 中間データはたくさんつなげることができる

こんな形になります。・・・何か見えてきましたでしょうか?

つまり層が深いとは

よく、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とかの、あれです。以降、コンピュータで、表記を統一しようと思います(多分)。では、「学習」とは、一体何を学習するのでしょう?

比較として、まずは機械学習ではない、従来のシステムについて、簡単に図示してみたいと思います。

従来のシステム

f:id:tatsu_mk2:20190317144839p:plain
図1 従来のシステム

従来のシステムは、上記の通り、事前に人間がJavaなりなんなりのプログラミング言語で関数(プログラム)を作成しておき、そのプログラムに対して、何かしらの入力データを与えます。コンピュータは、与えられた関数と入力データに従い、計算して、計算結果を出力します。

別の言い方をすれば、人間が事前に設定した計算式に従って、答えを出すのが、従来のシステムと、言えるかと思います。

簡単な例で例えると・・・

  • 人間が「3」という入力値を用意する
  • 人間が、「入力値を3倍する」という関数を、プログラミングする
    • 数式で書くと、「y = 3x」という、1次関数ですね。
  • コンピュータが、「9」という計算結果を、出す。

一度プログラムを組んでしまえば、高速で、飽きたり疲れたり文句言ったりせず、ミスせず、処理し続けてくれるのが、コンピュータのいいところです。

でも、全て人間が事前に設定した計算式に従って計算しているので、あまり知能チックなところは、ありません。まさに、「機械的に」、計算しているだけですね。

機械学習なシステム

これが機械学習だと、こういうイメージになります*1

f:id:tatsu_mk2:20190317161521p:plain
図2 機械学習なシステム

結論から言うと、機械(コンピュータ)が学習するのは、関数です。より正確に、先ほどの例でいうと、「y = 3x」の、「3」の部分です。人間が事前に用意する部分は、以下です。

  • 求めるべき関数の形を、決める。
    • 先ほどの例の場合、「y = ?x」という、1次関数だと、決めることになります。
  • ?の計算方法

このあたり、個人的に、用語の理解がふにゃっとしているのですが・・・関数の形(y = ?x)がモデル、学習すべき「?」がパラメータ、?が求まった形(y = 3x)が学習済みモデル、? の計算方法がアルゴリズムと思っておけば、あたらずとも遠からずな、気がしています*2

ちょっぴり現実の例でいうと・・・例えば、自動的にエアコンをつけるシステムが、あったとします。従来のシステムだと、「25度以上になったら冷房をつける」「15度以下になったら暖房をつける」とか、事前に人間が設定する必要があります。

対して、機械学習なシステムだと、日々人間が何度以上になったら冷房をつけ、何度以下になったら暖房をつけるのかを、センサーなどを通して記録して・・・コンピュータが、何度になったら冷房をつける/暖房をつけるべきかを、学習していきます。

・・・なんだか、知能が備わったような、気がしてきませんか?

AIとは何なのか

機械学習が分かったところで(?)、AIにいってみたいと思います。AI = Artificial Intelligenceの略、日本語では一般的に人工知能と訳されます。「知能の明確な定義がないので、人工知能の定義なんてムリ」とか、身も蓋もないことをおっしゃる、えらい学者さんもいるらしいですが・・・

先ほども触れました通り、従来のシステムに比べると、機械学習なシステムは、なんだかちょっぴり知能が備わったような気がしてくる、代物では、あります。

しかし、「AI」と聞いて一般にイメージされる、いわゆるドラえもんとか、映画ターミネーターに出てくるスカイネットとかと比べると、程遠い代物でも、あります。

ここから考えるに、以下が言えると思います。

  1. 機械学習を使って、知能っぽいものを実現することは、できる
  2. 知能っぽいもの=AI/人工知能
  3. 現在の機械学習で実現できる知能っぽいものは、SFの世界に出てくるAIに比べると、程遠い

3番目のものを「強いAI」、1番目のものを「弱いAI」とか言うそうです。つまり、機械学習とAIの関係は、以下になるかと思います。

  • 現在の機械学習技術を使って、弱いAIを作ることならば、できる
  • つまり、機械学習は、AIを作るための技術(の、一つ)
  • ただし、機械学習は、AIを作るためだけの技術では、ない(?)

・・・ような気が、するのですが・・・分かりやすさからかインパクトからかセールス上の理由からか、機械学習≒AI=とりあえずAIと言っとけ的な、雰囲気も、感じたりしたりしなかったり。

個人的には、AIというと誤解を招きそうなので、「機械学習」と言う方が、好きです。

まとめ

ということで、まとめると、以下になるかと、思います。

  • 機械学習とは、コンピュータが、関数を学習する、ものである。
  • これにより、「ちょっとした知能があるっぽい」と人間が感じなくもない程度のものは、作れる。
  • つまり、機械学習により、AIっぽいものは、作れる。

機械学習でやりたいこと

というわけで、機械学習を勉強して、個人的にやりたいことですが・・・結論から言うと、データサイエンスっぽいことに、挑戦できれば、なんて思っています。

機械学習で流行っていることというと、画像認識だったり、Siriみたいな音声認識・文字認識だったり、AlphaGoみたいな、ボードゲームで人間のプロに勝ったりだったりしますが・・・

私みたいな今まで業務システムをやってきた日本のSIerさんからすると、相対しているお客さん含め、活用方法にピンとこない方も、多いような気がします。

それよりは、データ分析系とでも申しましょうか。融資審査の合否の判断を学習させたりとか、需要予測をしたりとか、そういうのから始めた方が、ピンとくるような、気がしています。

そんなわけで、これから、データ分析っぽいものを中心に、機械学習を勉強していきたいと思います。

参考資料

プログラマのための ディープラーニングのしくみがわかる数学入門

プログラマのための ディープラーニングのしくみがわかる数学入門

*1:教師なし機械学習だとまた微妙にイメージが違うと思いますが、「関数を学習する」という点については、同様かと思います。

*2:モデルとアルゴリズムが、ごっちゃになることも、あるような、ないような・・・