白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

単純パーセプトロンをJavaで作る その①

こんばんは。

猫が網戸を開けるので、家の中に蚊が入って困っています。


さて、今回は単純パーセプトロンを作ってみようと思います。
が、あれもこれもと書いていたら結構長くなりそうなので3つの記事に分けます。

その① 機械学習の基本とパーセプトロンでできること ←今回はコレ
その② 単純パーセプトロンの仕組みを簡単に解説
その③ 単純パーセプトロンのJavaでの実装

という構成にしたいと思います。


今回の目標は、
「単純パーセプトロン機械学習アルゴリズムの一つで、線形分離可能な場合に二値分類ができる教師あり学習
という説明の意味が分かることです。

わかりましたか?
この記事を最後まで読めばきっとわかるようになりますよ。
ではいってみましょう。

機械学習とは何ぞや


突然ですが、あなたはケーキの値段が高いのか安いのかを判別させるロボットを作りました。
このロボットはケーキの個数とその値段を教えると、このケーキが高いのか安いのかを判断できる優れものです。
優れものです。(大事)

f:id:Shiro-Neko:20160720235753p:plain


ロボットは最初はケーキがどれくらいの値段なのかをよく知りません。
なので、適当に答えることにしました。

f:id:Shiro-Neko:20160720235824p:plain


ロボットは1コ700円のケーキを安いと答えましたが、
こんなブルジョアなロボットではあなたの価値観と合わないので、
あなたはロボットに常識を叩き込むことにしました。

f:id:Shiro-Neko:20160720235900p:plain


すると、ロボットはちゃんとケーキが高いのか安いのかを答えられるようになりました。
えらいですね。

f:id:Shiro-Neko:20160721000231p:plain


このように、データを分析することによってそこに潜むパターンを見つけ、
「判断ルール」を生み出す仕組みを機械学習といいます。
このルールによって、未知のデータに対する予測を行うことができます。

ちょっと小難しいことを言いましたが、
結局は私たちが行っている「学習」を機械で実現しようという単純なお話です。
(この例では1コ330~350円あたりからが高いのカナ?ってことを覚えるという学習ですね)

用語を覚えよう


機械学習の定義はわかりましたが、この分野にはたくさんの用語があります。
全部一度に覚えるのは大変なので、上の例を基に単純パーセプトロンで使いそうな用語だけ覚えましょう。


①データを複数のクラス(グループ)に分ける問題を「分類問題」といいます。

②データを2つのクラス(例では「高い」or「安い」)に分類することを「二値分類」といいます。

③「個数」や「金額」といった答えを出すための判断材料になるデータを「特徴量」といいます。

④特徴量とその答え(高いor安い)を与えて、それをガイドに学習する手法を教師あり学習といいます。

⑤「2個で900円は高い」といった特徴量とその答えのセットを「教師データ」(訓練データ)といいます。

⑥このうちの答えである「高い」の部分を「教師ラベル」(ラベル、正解ラベル)といいます。


一気に全部覚えられなくても構いません。
ん?ってなったら戻ってきましょう。

線形分離可能ってどういうこと?


最初の説明に「線形分離可能な場合に」という文言がありましたね。
線形分離可能とはどういう状態を指すのでしょうか?

とりあえずWikipediaさんに聞いてみましょう。

線形分離可能(Linearly separable)とは、幾何学においてふたつの点の集合が二次元平面上にあるとき、
それらの集合を一本の直線で分離できることをいう。
これを一般化して、n次元空間上のふたつの点の集合をn-1次元の超平面で分離できることも線形分離可能と呼ぶ。
逆に、分離できない場合を線形分離不可能と呼ぶ。

な、なるほど?
後半は何言ってるかよくわからないけれど、
前半は平面上の点の場合、直線で分けることができればよいということですね。

上の例でいえば、「1コ300円は安いけど、4コで1,200円は何となく高い気がするなー。」
みたいな適当なことを教えてはダメということです。

また、3個買うと100円引き、6個買うと200円引きのように明確なルールがあったとしても、
これが直線の形にならない場合にはやはり線形分離可能とは言えません。

逆にいえば、直線でさえあれば、傾きや位置は関係ありません。

f:id:Shiro-Neko:20160721234617p:plain

ところで、上の例では「個数」と「金額」という2つの特徴量から「高い」か「安い」かを判定しましたが、
たとえば「ケーキ1コあたりの重さ」のような特徴量を追加することはできないのでしょうか?

答えは「できます」。
その場合には、3次元に点をプロットするようなイメージで、直線の代わりに平面で線形分離することになります。

そしてさらに、図では表すことはできませんが、
特徴量の数を4コ、5コ…極端な話1,000コに増やしても同じ仕組みで線形分離することができます。
これが「n次元空間上のふたつの点の集合を…」の説明の部分です。

そもそもなんで学習する必要があるの?


直線で分離することができる。
つまり、一次関数で直線を引くことができれば分類ができるならば、
わざわざ機械学習なんて難しい技術を使わないで、プログラムにその式を書いた方が簡単では?
なんてことを思ったりしませんでしたか?

ちょっと最初のお話の続きを見てみましょう。


数日後、うわさを聞きつけたセレブがあなたのもとにロボットを譲ってくれないかと訪ねてきました。
ロボットは量産型なので、新しいロボットを売ってあげました。(リボンはサービスです)

f:id:Shiro-Neko:20160721210724p:plain


新しいロボットはセレブの価値観で常識を学びました。
デスノってカタカナでかくと急にデンジャーな感じがしますね)

f:id:Shiro-Neko:20160723143501p:plain


すると無事にセレブなロボットになりました。
えらいですね。

f:id:Shiro-Neko:20160721211139p:plain


さてさて、あなたのロボットとセレブのロボット、最初は同じものでしたが、
育った環境によって、同じ質問でも異なる回答をするようになりましたね。

f:id:Shiro-Neko:20160721211152p:plain


プログラムを変更することなく、
与える教師データを変えるだけで異なる答えを導き出せるようになる。
これはとても強力な道具です。

つまり、画像処理だろうと言語処理だろうと音声処理だろうと、
特徴量をうまく抽出して教師データを与えられれば、同じ仕組みで答えが出せるのが機械学習なのです。
(まぁ、実際はそううまくはいかないんですけどね)

単純パーセプトロンとは


さて、最初の説明に戻ってきましょう。

「単純パーセプトロン機械学習アルゴリズムの一つで、線形分離可能な場合に二値分類ができる教師あり学習
どうですか?どういう意味だかわかるようになりましたか?

そして、単純パーセプトロンはとてもシンプルなアルゴリズムで実装することができます。
どうですか?作ってみたくなりましたか?

次回は単純パーセプトロンの仕組みを見ていきましょう。
それではまた。