タコス de 機械学習 ~パーセプトロンを実装してみよう~

42
タタタ DE タタタタ ※ タタタタタタタタタ

Upload: suyama-ikuo

Post on 12-Jan-2017

915 views

Category:

Engineering


0 download

TRANSCRIPT

タコスDE

機械学習※ 写真はイメージです

Ikuo Suyama@martin_lover_se

Web 系プログラマ Scala とか Python とか 機械学習始めて半年!

人工知能

流行ってますね※ 写真はイメージです

Professional 碁Player!!

Beats

DeepLearning?

すごい複雑な「ニューラルネットワー

ク」

ニューラルネットワーク?

脳の働きを模した計算モデル

パーセプトロン ?

すごい単純なニューラルネットワーク

機械学習入門に

よい題材!

機械学習始めて半年ですが

パーセプトロン

を説明してみます

パーセプトロン?” 視覚と脳の機能をモデル化したものであり、パターン認識を行う。シンプルなネットワークでありながら学習能力を持つ。 1960 年代に爆発的なニューラルネットブームを巻き起こしたが、 1969 年に人工知能学者マービン・ミンスキーらによって線形分離可能な物しか学習できない事が指摘された事によって下火となった。他の研究者によって様々な変種が考案されており、ニューロン階層を多層化し入出力が二値から実数になったボルツマンマシン( 1985 年)やバックプロパゲーション( 1986 年)などによって再び注目を集めた。 2009 年現在でも広く使われている機械学習アルゴリズムの基礎となっている。

“ パーセプトロンは 1943 年に発表された形式ニューロンに基づく。 S 層と A 層の間はランダムに接続されている。 S 層には外部から信号が与えられる。 A 層は S 層からの情報を元に反応する。 R 層は A層の答えに重みづけをして、多数決を行い、答えを出す。

ー From Wikipedia

何らかのデータを入力して、「分類問題」を解く「形式ニューロン」が元になっている

分類問題?

データを特定のカテゴリ(クラス)に分ける問題例

メールがスパムか否か?手書き数字の画像から数字を識別? (MNIST)Iris (あやめ)の種類?

※ 何故か機械学習の素材としてよく扱われます

形式ニューロン?

複数の信号入力 (X) を受け取る入力信号の和 (u) がある値を超えると信号を出力

(活性化)するニューロン同士が結合する

ω1 ω2 b

AND 1.3 1.3 -1.5

OR 1.7 1.7 -0.5

NOT -2 0 1.5

重みを適切に設定することで、チューリングマシンと同等の計算ができる

形式ニューロン?

パーセプトロン

形式ニューロンを複数組み合わせ、教師データで学習させることで分類問題を解く

入力層 隠れ層 出力層

入力層と出力層のみからなるパーセプトロンそれぞれの識別器 (g) が1つのクラスを表し、担

当のクラスに該当するかどうか?を判別する

入力層 出力層

最大

値選

択器

出力(クラス)

単純パーセプトロン

さらに、簡単のため

二値分類問題

を考えます

A に属するか、属さないか

青、赤の2グループ(クラス)にわかれた既知のデータに基づいて、未知データを分類したい

青?赤?

二値分類問題

赤、青のみを含むよう領域を分割する直線が引ければ、未知データも正しく分類できそう

青だ!

二値分類問題

既知のデータに、赤のクラスに 1, 青のクラスに-1 のラベルをつけておいて

- 1

- 1

- 1

- 1

- 1

- 1

- 1

- 1

- 1- 1

- 1

- 1

- 1

- 1

1 1

- 1 - 1

二値分類問題

すべてのデータの符号を正しく判定できる直線の ω=“重み“を見つけると、この問題が解ける

- 1

- 1

- 1

- 1

- 1

- 1

- 1

- 1

- 1- 1

- 1

- 1

- 1

- 1

1 1

二値分類問題

ところでどこかで見たことある式ですね…

ありました!

形式ニューロン

この分類問題は

適切な ω を見つければ

パーセプトロンで解けそうです。

HOW ?

学習!

1) 重みベクトル ω を適当に決める。2) 既知データ X から学習パターンを1つ選ぶ。3) 識別関数 g(x) によって識別を行い、正しく識別

できなかった場合は ω を更新する。4) X の全パターンについて 2),3) を行う。5) X の全パターンを正しく識別できるまで 2)~4)

を繰り返す。

g(x)… 識別関数

パーセプトロンの学習規則

適当に ω を決めると、当然誤検知が出ますね。

パーセプトロンの学習規則

ぱっと見、こう ω を更新すれば良さそうです。

パーセプトロンの学習規則

パーセプトロンの学習規則

ぱっと見、こう ω を更新すれば良さそうです。

パーセプトロンの学習規則

こうなるように、 ω を更新したいですね?

HOW ?

1.損失関数を定義する出力した結果がどれぐらい間違っていたか?を計算す

るパラメータ ω についての関数よく使われる損失関数 二乗誤差関数

2.損失関数を最小化するパラメータを見つける

どうやって見つけるか?色々方法がありますが…

機械学習における「学習」

ある地点での損失関数の微分値=傾きを求める

傾きの方向へ一定間隔Wを進める=勾配を下る

値が収束するまで繰り返す

 

勾配降下法( Gradient Descent )

勾配降下法( Gradient Descent )

つまり

この漸化式で、wを逐次更新し、最小値を目指します

ρ は更新の幅を決めるハイパーラメータ(学習率) 大きすぎると発散し、小さすぎると収束が遅くなります。

勾配降下法( Gradient Descent )

いま、損失関数を

(上に誤検知した時)

(下側に誤検知した時)

を用いて、以下のように定義します。

(分類が正しかった時)

(誤検知してしまった時、間違ったデータと現在の直線との距離を損失とする)

勾配降下法( Gradient Descent )

このとき漸化式は

(上側に誤検知)

(下側に誤検知)(正しかった)

論ずるより実装するが易

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns

iris = sns.load_dataset("iris”)setosa.head(5)

<Python>

sepal_length sepal_width petal_length petal_width species

0 5.1 3.5 1.4 0.2 setosa

1 4.9 3.0 1.4 0.2 setosa

: : : : : :

このデータを、 4 つの特徴量から” setosa” か否か?に分類

[ 実装 ] Iris のデータを分類する

1) 重みベクトル ω を適当に決める。2) 既知データ X から学習パターンを1つ選ぶ。3) 識別関数 g(x) によって識別を行い、正しく識別できなかった場合は以下

の式に従って ω を更新する。

4) X の全パターンについて 2),3) を行う。5) X の全パターンを正しく識別できるまで 2)~4) を繰り返す。

学習ロジック

(上側に誤検知)

(下側に誤検知)

参考資料丸山不二夫先生のニューラルネット&

Tensorflow説明http://www.slideshare.net/maruyama097/neural-

network-tensorflow Google の Tensorflow 入門のスライドですが、ニューラルネッ

トの説明も最強のわかりやすさ&丁寧さで必読です!

わかりやすいパターン認識 1〜 3章 説明がとても丁寧で、読みやすい本です。

WEB+DB PRESS Vol.89 初めての深層学習 実装は Chainer を使って説明されていましたが、概念の説明が

分かりやすかったです。東京で働くデータサイエンティストのブログ

単純パーセプトロンをPythonで組んでみる