たのしい機械学習!Part 1

(原文:Machine Learning is Fun! by Adam Geitgey より許可を得て翻訳)

(訳者注:難解な機械学習のコンセプトを平易に説明している素晴らしいブログを見つけ、ぜひ日本の皆さんに伝えたい!と思い文章化しました。共感いただいた方、文章末尾の❤️マークからいいね!お願いします。一緒に機械学習勉強してくれる人も募集中です。=>Email:dai@jenio.co)

機械学習の事を人々が話しているけど、

あなたは言葉の意味はわかっていない。

そんな場面に遭遇した事はありませんか?

同僚の言葉に相槌を打つのに疲れた。。

そんな状況を変えましょう!

このガイドは機械学習に興味があるけど、

何から勉強したらいいのかわからない人に向けて書かれました。

多くの人がWikipediaを見ると思いますが、

ストレスがたまり、

誰かがレベルの高い説明をしてくれるのを望みますよね?

このガイドがその役割を果たします。

誰にでも理解できる様に書かれています。

つまり内容はかなり一般化されています。

でも良いですよね?

もっと多くの人が機械学習に興味を持ってくれるなら、

目的は達成されたという事にしましょう。

機械学習とは何か?

機械学習とは、

遺伝子アルゴリズムが存在し、

問題に対してコードをカスタマイズしなくても、

データ集合の中から面白い物を見つけてくれるという考え方です。

コードを書く代わりに、

遺伝子アルゴリズムにデータを与えてやると、

データに基づいたロジックを勝手に組み立ててくれるのです。

例えば、一種のアルゴリズムは分類アルゴリズムです。

データを異なるグループに分けてくれます。

同様の分類アルゴリズムが、

手書きの数字を認識するのと同様の分類アルゴリズムが、

Emailのスパムとスパム以外を見分ける作業にも一行のコードの違いもなく用いられています。

同じアルゴリズムなのですが、

練習用の異なるデータを与えられている為、

異なる分類ロジックを生み出しているのです。

この機械学習のアルゴリズムはブラックボックスであり、

多くの分類問題に再利用できます。

“機械学習”は傘のような用語で、

多くのこういった種類の遺伝子アルゴリズムをカバーしています。

2種類の機械学習アルゴリズム

機械学習のアルゴリズムは、

2種類の主なカテゴリーに属すると考えることができます。

教師あり学習(Supervised Leaning)と、

教師なし学習(Unsupervised Learning)です。

違いはシンプルですが、とても重要です。

教師あり学習

あなたが不動産仲介業者だとします。

あなたのビジネスは成長していて、

多くの研修生エージェントを雇わなくてはなりません。

ただ問題があります。

あなた自身は家を見て、その価値を算定することができますが、

研修生たちはあなたの様な経験がない為、

家にどの様に価格をつけていいのかわからないのです。

研修生を助ける為に(そしてあなた自身が休暇に出かけられる様に)、

あなたはちょっとしたアプリを作り家の価格を算定できる様にしようと思いました。

サイズ、地域、似たような家がいくらで売られたか、

などに基づいて算定します。

あなたは3ヶ月の間、誰かが家を売るたびにその価格を記録していきます。

それぞれの家に関して、多くの特徴も記しておきます。

ベッドルームの数、平方フィート数、地域。

そして最も大事な最終販売価格:

これは我々の”練習用データ”です。

練習用データを用いて、他の家がどのくらい価値があるか算定するプログラムを作ります。

練習用データを使い、他の家の価値を予想します。

これを教師あり学習、と言います。

あなたはそれぞれの家がいくらで売られたか知っており、

言い換えれば答えを知った上で逆戻りしてロジックを見つけることができるのです。

アプリを作る為に、練習用のデータを機械学習のアルゴリズムに入れていきます。

アルゴリズムは予想を成り立たせる為にどの様な数学が必要か見つけ出そうとします。

これは、全ての算術記号を消されて、

数字の間の関係性を予想する数学の問題に似ています:

“ああ!生徒が先生の書いた答えから算術記号を消してしまいました!”

上記の数字から、もともと書いてあった数式を予想できますか?

左の数字に対して”何かを行って”右の答えにたどり着く、という事が求められますよね?

教師あり学習では、

この様な作業をコンピューターにやらせる事ができます。

一旦どの様な数式が特定の問題を解く為に必要なのかがわかれば、

同様の問題には答える事ができるのです!

教師なし学習

元々の不動産仲介業者の例に戻りましょう。

もし各家の販売価格がわかっていなかったらどうなるでしょうか?

サイズ、地域などの情報が揃っているなら、

カッコ良く問題を解決する事ができるのです。

これは”教師なし学習”と呼ばれています。

価格などの不明な数字を予想しようとしていなくても、

機械学習を使って面白い事ができます。

これは、誰かに数字のリストを渡されて、

”数字の意味はわからないんだけど、

パターンやグループや、何か傾向があるかどうか調べられる?

Good Luck!”と言われた様な感じです。

このデータから何ができるでしょう?

初心者なら、データ内の異なるマーケットセグメントを自動特定するアルゴリズムを使えるでしょう。

例えば大学地域の家の購入者が小さいけどベッドルームの多い家を好み、

郊外の購入者が3ベッドルームだけど面積の大きい家を好むといった傾向が見れるでしょう。

これらの顧客の傾向を知ることはマーケティング活動の役に立つはずです。

もう一つの興味深い事は、

他の家と特に異なる数値を持った家を自動的に検出できることです。

おそらくそういった特異値の家はとても大きなマンションで、

仲介手数料が高い為、

あなたの営業チームをそれらの地域に集中させる事ができます。

教師あり学習はこの記事の残りの部分で説明をしていきます。

でも、教師なし学習が有用でなかったり面白くない訳ではありません。

事実、教師なし学習はアルゴリズムが改善されるにつれ重要になってきており、

データにラベル付けしなくても正解値を出せる様になっているのです。

詳しい人への注釈:

もちろんこの他にも多くの機械学習アルゴリズムがあります。

でも不動産の例はスタートにとても向いています。

面白いですね。でも、家の価格を予想する事が本当に”学習している”と言えるのでしょうか?

人間として、あなたの脳は明白な指示がなくても、

ほとんどの状況に対応でき、

その過程を学ぶ事ができます。

家の販売を長くやっていれば、

家の正しい価格を直感的に”感じる”事ができ、

その家の販売に最も適した方法や、

どの顧客が興味をしめしそうか、などがわかるはずです。

強い人工知能の目的は、

そうした能力をコンピュータに置き換えることです。

でも現在の機械学習はそこまで良くないです。

特定の、限定された問題にフォーカスすると機能します。

おそらく”学習”のより良い定義は、

”事例のデータに基づいて、特定の問題を同様に解く方法を見つけること”と言えるでしょう。

”機械が事例のデータに基づいて、特定の問題を同様に解く方法を見つけること”というのは名前としては長すぎるので、

”機械学習”に落ち着いたと思われます。

もちろんこの文章を50年後に読んで、

その時には強い人工知能が発明されていれば、

この文章全体がおかしなものになるでしょう。

未来の人類へ:この文章を読むのをやめて、

サンドイッチをロボット執事に作らせてください。

コードを書いてみよう!

どの様に家の価格を予想するプログラムを書けばいいか?

読み進める前に少し考えてみてください。

機械学習について全く知識がなければ、

下記の様な基本的なルールを書けばいいでしょう:

これらの作業に何時間も費やせば、

何か成果物っぽい物にたどり着くでしょう。

でもプログラムは決して完全ではなく、

価格の変動についていくのがとても大変でしょう。

コンピュータにどの様な機能が必要なのか見つけてもらったら便利ですよね?

正しい数値を返しさえすれば、

機能の中身自体は問われないはずです:

この問題を考える時の方法として、

価格が美味しいシチューとしたら、

成分はベッドルーム数、

面積、地域です。

それぞれの成分が最終価格にどの様に影響するかがわかったとしたら、

おそらくそれぞれの成分の割合が存在するのではないでしょうか?

それは元々の機能(if & elseだらけの!)をかなり減らし、

下記の様なとてもシンプルな形にしてくれます:

この魔法の数字を見てください 。

.841231951398213,

&

1231.1231231,2.3242341421,

201.23432095.

これらは我々の”比重”です。

どの家にも適用できる比重が見つかれば、

我々の機能が家の価格を予想できます!

ベストな比重を計算する方法は下記です:

Step 1:

それぞれの比重を1.0にセットする:

Step 2:

知っている全ての家に対して価格予測関数を実行し、

予想が当たっているかどうか検証します。

各家の価格を予想する為に関数を使います。

例えば、最初の家が実際に$250,000で売れて、

あなたの関数が$178,000と予想していたら、

$72,000分予想が外れた事になります。

ここで予想との差額を自乗し、合計していきましょう。

例えば500件の家が売れて、

関数の予想との差額の自乗の合計が$86,123,373だとします。

これは関数が”どれだけ間違っているか”の指標となります。

そして、その合計を500で割ると平均が出ます。

この間違いの平均値を関数の”コスト”と呼びます。

このコストを比重を操作することでゼロに持っていければ、

あなたの関数は完璧という事になります。

この時、どんな場合もあなたの関数は入力データに基づいて完璧に価格を予想した事になります。

これがまさに目標です。

Step 3:

Step2を何度も何度も、

可能な比重の組み合わせ全てに適用するまで繰り返します。

コストがゼロに一番近い比重を使えばいいのです。

それを見つけた時問題は解けた事になります!

Step1–2–3まとめ

とてもシンプルですよね?

ここまでで、いくつかのデータを取り出し、

シンプルな遺伝子的ステップに適用し、

地域のどんな家の価格でも予想できる関数を開発しました。

あといくつか面白い事実があります:

言語や翻訳分野のリサーチで、

40年以上こういった”シチューをかき回す”遺伝子学習アルゴリズムは、

実際の人間が明白なルール化で問題を解こうとする場合に対して、

高いパフォーマンスを発揮してきました。

機械学習の”バカな”アプローチが人間の専門家に勝ったわけです。

あなたが今試したプログラムは全くバカげています。

例えば、面積数やベッドルーム数を全く気にかけていません。

ただ、それらの数字をかき回し、

正しい答えを導き出しているだけです。

おそらくあなたは、

そもそも何故そういった特有の比重の組み合わせが機能するのかどうかも分かっていないはずです。

つまり、あなたは機能するかどうかわからない関数を書いたのです。

sqftやnum_of_bedroomsといったパラメーターを取る代わりに、

あなたの予想関数が数字列を取ったとしましょう。

例えばあなたの車に装着されたカメラで撮られた画像の明るさを、

1ピクセルごとに数字で表しているとします。

そうすると価格の予想を出力する代わりに、

”degrees_to_turn_steering_wheel”を出力します。

これは車の自動操縦プログラムになるのです。

凄いでしょう?

“Step3で全ての数字を試す”ってどうやるの?

もちろんあなた自身で全ての可能な比重の組み合わせを試し、

ベストな値を抽出することはできません。

文字通り、永久に終わりませんから。

時間内に終わらせる為に、

数学者たちはベストな数値を短時間で検出する賢い方法を編み出してきました。

下記がそのひとつです:

まず、Step2を表現する数式を書きます:

これはあなたのコスト関数です。

そして、全く同じ等式を機械学習の用語を使って書き直してみましょう。

意味はわからなくてもいいです。

θ はあなたの現在の比重を表し、

J(θ) は現在の比重のコストを表します。

この等式は価格予想関数が、

現在セットした比重に対してどれだけ間違っているかを表現しています。

もしnumber_of_bedroomsとsqftの比重の全ての数値コストをグラフ化すると、

下記の様に見えます:

コスト関数のグラフはお椀の様に見えます。

垂直軸がコストを表しています。

このグラフで、最も低いポイントが、

関数が最も間違っていないポイントを指しています。

最も高いポイントが、最も間違っているポイントです。

なので、もし最も低いポイントの比重を見つけることができれば、

答えは見つかります!

ですので、比重を”丘を下る様に”グラフ上調整し、

最も低いポイントを目指せば良いのです。

もし比重を常に最も低いポイントを目指す様に微調整し続ければ、

結果として多くの比重を試すことなく最下点にたどり着けます。

微積分について覚えていることがあれば、

導関数を知っているかもしれません。

導関数は関数の傾きのタンジェントを教えてくれます。

言い換えると、グラフ上のどのポイントが下り坂か教えてくれます。

それを使って実際に坂を下っていけばいいのです。

コスト関数の部分導関数を、

各比重に対して計算すれば、

各比重から導き出した結果で割ることができます。

これが我々を丘の最下点まで一歩進めてくれます。

ずっとこれを続けていくと、

丘の最下点に到達し、

比重の組み合わせの最適解を見つける事ができます。

(意味がわからなくても読み進めてください!)

これがベストな比重を見つける方法の抽象化された説明で、

確率的勾配下降法(batch gradient descent)と呼びます。

もし詳細に興味がなければこれ以上調べなくていいです。

機械学習のライブラリを現実問題解決の為に使う時、

ライブラリがこれを実行してくれます。

何が起きているかわかっていた方が便利ですよね。

他には何を飛ばして説明したか?

上記で私が紹介した3Stepのアルゴリズムは、

多変量線形回帰(multivariate linear regression)と呼ばれています。

あなたは、持っている家のデータ全てに適用できる直線の等式を予想することになります。

その等式を使って、

見たことない家の価格を直線上のどこに現れるか予想します。

非常にパワフルなアイデアで、実際の問題を解決できるのです。

しかし、上記のアプローチがシンプルな問題には適用できますが、

全ての問題に適用できるわけではありません。

一つの問題は連続直線で表現できるほど、

家の価格はシンプルではないからです。

しかし幸運なことに、家の価格を取り扱う方法は沢山あります。

他の多くの機械学習のアルゴリズムは、

非線形のデータを扱うことができます。

例えばニューラルネットワーク、

カーネル法とサポートベクターマシーン(SVM)などです。

また、もっと込み入った直線に線形回帰を賢く適用する方法もあります。

全ての場合において、

同様の基本的考え方(=ベストな比重を探す)を適用できます。

また、過剰適合(overfitting)に関しては無視しました。

オリジナルのデータ内で、

価格を完璧に予想する比重を見つけるのは簡単なのですが、

それがオリジナルデータ内にない、

新しい家の価格予想に適用できる保証は全くありません。

それでもこの問題に対処する方法はいくつかあります。

規則化(regularization)や交差検証(cross-validation)などです。

家の価格予想問題にどう対処するかは、

機械学習の導入を成功させる上で重要なポイントです。

言い換えると、基本的な概念はとてもシンプルなのですが、

機械学習を適用し、

便利な結果を生むためにはスキルと経験が必要です。

でもそれはどのエンジニアでも学ぶことができるのです!

機械学習は魔法か?

機械学習が、手書き文字の認識といった、

とても難しそうな問題に簡単に適用されているのを見て、

十分なデータがあれば機械学習を使って、

どんな問題でも解けそうだと思うでしょう。

データを入力し、

コンピュータが魔法の様にデータに適した等式を見つけてくれるように!

でも、機械学習は、問題が手持ちのデータを使って解決可能な場合のみ機能することを知るのは重要でしょう。

例えば、家の価格の予想をするモデルを構築するのに、

鉢植えの数を基にした価格予想の仕組みを作っても機能しないでしょう。

鉢植えの数と家の販売価格に相関性がないからです。

どんなに頑張ってもその二つに関係性を見出すことができません。

実際に関係性があるものに限りモデル化できる

なので、人間の専門家が人力で問題を解決できない場合、

コンピュータが同じ問題にチャレンジしても解決できないのです。

代わりに、人間が解ける問題にフォーカスし、

コンピューターがもっと速く解決できる分野に限れば強いのです。

もっと機械学習について学ぶには

私の意見では、現在の機械学習の最も大きな問題は、

学問と商業のリサーチグループのみに使われている事です。

実際に専門家になることなく、

幅広い知識を身につけたい人たちに向けた、

理解しやすい教材がありません。

でも日々状況は良くなっています。

Andrew Ngの無料の機械学習のCourseraクラスはとても良いです。

興味がある方はそこから学習を始めると良いでしょう。

コンピュータ科学の学位と、

少しの数学の知識がある人全てに機械学習は広まるべきです。

また、SciKit-Learnをインストールし、

豊富にある機械学習アルゴリズムで遊んでみると良いでしょう。

Pythonのフレームワークで、

全ての一般的なアルゴリズムの”BlackBox”バージョンを備えています。

楽しんでいただけましたか?

たのしい機械学習! Part 2(準備中) とPart3(準備中)に続きます!

もしこの記事を気に入ってくれたら、

Twitter @ageitgeyをフォローしてください。

Email:ageitgey@gmail.com

LinkedIn:https://www.linkedin.com/in/ageitgey

訳者より:共感いただいた方、文章末尾の❤️マークからいいね!お願いいたします!