ハトでもわかる
単純パーセプトロン
「サルでもわかる」 →えてして難しい
「猫でもわかる」 →媚びてる感が出る
「鶏でもわかる」 →3歩で忘れるとダメ
時代はハト
はじめに
• 機械学習の最も基礎の部分(たぶん)なので頑張りましょう
• 目次
• パーセプトロンとは
• パーセプトロンの構成
• 重みと線形結合
• 活性化関数
• 重みの更新
• 損失関数
• 最適化問題
• シミュレーションしてみる
2
パーセプトロンとは
• 視覚や脳神経細胞の機能をモデル化したもの
• 神経細胞の動き
• 感覚器官から無数の電気信号を受け取る
• 現在の状況と信号の情報から物事を学習する
• 以下を繰り返すことでモデルを作成
• 複数の入力から単一の出力を行う
• 出力結果と、ほしい結果(教師データ)からモデルを更新(学習)
元の発想は脳神経
構造はシンプル
入力を統合して出力へ 出力結果から学習 3
パーセプトロンとは
• 応用するといろいろできる
• ニューラルネット(多層パーセプトロン)
• ディープラーニング
• SVM
• ・・・
⇒よく聞く手法の基礎になるものです
• で、結局何ができるものなの?
• という問には答えづらいよ、最後にまとめます
• とりあえず「単純な分類ができるもの」と考えて、続きをどうぞ
4
ニューラルネット
1個1個がパーセプトロン
なぜ重要なの?
よく聞かれるけど
パーセプトロンの構成
• 入力データを
• 重要な構成要素
• 各入力に対する重み
• 出力の調整
• 重みの更新
入力
全長 X[1]
体重 X[2]
… X[3]
重み
W[1]
W[2]
W[3]
鳥データ
全長500mm
体重700g
…
出力
1:ハトである
0:ハトではない
? ? ?
5
ハトかどうかを判定するモデルを作ろう
入力に対する重み
• 定数項と各入力に対して重みwを設定
• (この時点での)出力は単純な線形結合になる
• 全長、体重、定数を入力とし、それぞれX[1]、X[2]、X[3]とする
• X[1]W[1]+X[2]W[2]+X[3]W[3] の計算になる
• 重みを適当にW = [0.5, -1, 10] とすると
入力
全長 X[1] W[1]
体重 X[2] W[2]
定数 X[3] W[3]
鳥データ
全長:500mm
体重:700g
定数項:1
…
500×0.5 + 700×-1+1×10 = -440
= -440
6
計算例をみてみましょう
出力の調整
• 出力の形をほしい形に変換する
• そのまま
• ステップ関数
• シグモイド関数
• ソフトマックス関数
• ランプ関数(ReLU)
• などなどいろいろ
• 活性化関数と呼ばれる
• 今回はハトかどうかを0or1で判定しましょう
ΣXW 〇? ×?
7
重みの更新(概要)
• 現在の出力が正しいかどうかを定量化する
• ⇒損失関数の定義
• 損失関数から重みの増減の方向を決定する
• 増減の幅を決定する
• ⇒最適化問題
計算あってた
計算間違ってた
8
Step1
Step2
重みの更新(損失関数の定義)
• 現在の結果が正しいのか、どの程度間違っているのかを数値で
表すことで重み補正の有無を判断します
• 現在の結果と正解(教師データ)の差を定義する
• 損失関数(=誤差関数=目的関数)と呼ばれる
• 損失関数E = max(0, -twx) t:ハトなら1 違えば-1
• つまり
• 出力と正解が同じなら 損失0
• 同じでなく、正解がハトなら 損失-1
• 同じでなく、正解がハト以外なら 損失1
• 回帰したい場合、判別したい場合、データによって定義します
• 回帰や判別の例はwikipediaをどうぞ。。。
• https://ja.wikipedia.org/wiki/活性化関数
#.E5.87.BA.E5.8A.9B.E5.B1.A4.E3.81.AE.E6.B4.BB.E6.80.A7.E5.8C.96.E9.96.A2.E6.95.B0.E3.81.A8.E8.AA.A4.E5.B7.AE.E9.96.
A2.E6.95.B0
9
ハト判定の例だと
参考:重みの更新(最適化問題)
• 損失関数(=最小にすべき数式)を多数の条件下で最小となる
パラメータを探す
• これが最適化問題
• 関数の性質や条件の有無で様々な最適化手法がある
• http://www.slideshare.net/tkm2261/ss-42149384
非常にきれいにまとまっていて
わかりやすい!
(簡単とは言っていない)
今回はここ
10
重みの更新(最適化)
• 重みを変更することで損失関数を小さくすることが目的
• 損失関数の出力結果から重みを減らすか増やすかを決める
• 損失関数の傾きをみて、低くなる方に動かそう
• 偏微分だ!
• -twxの微分値-txから変更方向が決まる
• 正解がハトなら-tx 正解がハト以外ならtx
• 大きく動かしても小さすぎても効率悪い
• 一定の係数ηをかけておこう
• -tx ⇒-ηtx
• 学習率と呼ばれる
• 最適化手法によっては学習率をどんどん変えたり、方向をたまに逆にしたりす
ることもある
重み
損失関数
傾きを参考にする
11
ハト判定の例だと
プログラムの時間です
• なかなかピンときにくい場合は動かしてみるのが一番
• プログラムのポイントは以下の点
• 重みと学習率を初期化する
• 入力されたデータと現在の重みから出力結果を出す
• 線形結合
• 活性化関数
• 出力結果が教師データと異なる場合に重みの更新をする
12
なるほど、わからん
プログラムの時間です|問題
• プログラムしましょう
• 問題:2種類のデータを分類するための境界線を引く
• サンプルソースコード:Gistに置いてみた↓
https://gist.github.com/stkdev/e40705a6a05dbdd58355c24f1b0e52c7
この辺に線が引ければ、
未知のデータも分類できるかも
13
プログラムの時間です|データ
• データ
• バイアス項は全データが1の列を作ることで実現できる
• 体重、全長、分類の関係を以下のように置く
• 分類(Label) = W[1] * 全長 + W[2] * 体重 + W[3] * バイアス項(定数
項)
• この式が成り立つWを求めればよい
14
プログラムの時間です|初期化と分類
• 重み・学習率の初期化
• 重みWを初期化する W = [-1, -1, -1]
• 学習率 eta = 0.2 (0~1)で定義
• 分類を実施
• W[1] * 全長 + W[2] * 体重 + W[3] を計算
• 活性化関数
結果が誤ったデータの
情報でWを更新する
15
プログラムの時間です|更新式
• 損失関数
• E = max(0, -Label * W * x)
• 更新式
• EをW1~3で偏微分
• -Label * x となる
• 学習率etaを0~1で設定する
Xと逆方向に動かす
というだけの式になる
16
プログラム内では不要
プログラムの時間です|学習ループ
• ループの終了判定は、Wの更新
があったか否か
• 更新アルゴリズムは
• まず現在のWで分類する
• 分類結果がLabelと異なった場合
更新規則に従って更新
• 全長と体重の2次元グラフに線を
引く場合
• 傾き:-W[1]/W[2]
• 切片:-W[3]/W[2]
17
プログラムの時間です|結果
• 徐々に境界線がうごいてい
くのがわかります
• 今回は(バイアス項含め)
3変数なので、実際は3次
元空間に境界面を作ってい
るイメージです
• 変数増やせばN次元のデータ
も分割できます
18
まとまらないまとめ
• パーセプトロンで線形分離可能なデータの分割ができた
• 線形分離不可の問題は収束しなくなるので注意
• ロジスティック回帰や線形判別分析と同じこともできるよ
• でもロジックを自分で作ることで気づきもあるよね
• 中の計算を紐解くと案外簡単
• みんな書いてみよう
• で、結局パーセプトロンって何ができるの?
• まじめに答える
⇒最小値探索に帰着できる問題をデータからパラメータ更新によって導けるよ。
パーセプトロンで何かできるというより、直面している問題をこうモデル化した
らパーセプトロンで最適化できるね、みたいな感じ。
• ふわっと例だけ答える場合:分割基準や回帰線をデータから導けるよ
• さらにふわっと答える:データから自動的に基準が作れるよ
19
参考
• ハトのイラスト
• http://01.gatag.net
• 高卒でもわかる機械学習 (2) 単純パーセプトロン
• http://hokuts.com/2015/11/25/ml2_perceptron/
• 物理のかぎしっぽ Perceptron
• http://hooktail.org/computer/index.php?Perceptron
• 機械学習超入門III ~機械学習の基礎、パーセプトロンを30分
で作って学ぶ~
• http://d.hatena.ne.jp/echizen_tm/20110606/1307378609
20

ハトでもわかる単純パーセプトロン