Python Machine Learning Ch2

by mmyoji

3 min read

前回 の続き

概要

パーセプトロン/ADALINE の概要及び実装

数式での説明が丁寧にされてるが、自分は Python のコードで理解した

2.1 人工ニューロン - 機械学習の前史

人工知能を設計するにあたって生物学上の仕組みを解明しようとしていた

McCulloch-Pitts ニューロン(MCPニューロン) というのが始まり。

ニューロン懐かしい。

この MCP ニューロンが発表されて数年後にパーセプトロンの学習規則に関する最初の概念が発表される。

活性化関数 (activation function) Φ(z) は特定の入力 x と対応する重みベクトル w の線形結合を引数として受け取る

z = w1x1 + ... + wmxm : 総入力 (net input) とも言う

wi * xi が特定の閾値 θより大きければ陽性、そうでなければ陰性と予測

2.2 パーセプトロンの学習アルゴリズムを Python で実装する

実際のコードは省略

慣例として、オブジェクトの初期化時ではなく、オブジェクトの他のメソッド呼び出しによって作成される属性(attribute)には、たとえば self.w_ のようにアンダースコアを追加する。

機械学習業界での慣習なのか、 Python での慣習なのか。別のML系の本でも同様のことが出てきたので、前者では少なくともそうらしい。

np.zeros(shape)

numpy.zeros

0 で埋められた shape 形の numpy 配列を返す

e.g.

>>> import numpy as np

>>> arr = np.zeros(2)
>>> arr
array([ 0.,  0.])
>>> arr.shape
(2,)

>>> arr2 = np.zeros((2, 3))
>>> arr2
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> arr2.shape
(2, 3)

np.where(condition[, x, y])

numpy.where

condition に一致する配列の index を numpy 配列で返す

x, y が指定されていた場合は、条件に合致するなら x, そうじゃないなら y を配列に格納して返す

e.g.

>>> arr = np.array([0, 1, 2, 3, 4, 5])
>>> res = np.where(arr % 2 == 0)
>>> res
(array([0, 2, 4]),)

>>> arr2 = np.array([1, 2, 3, 4, 5, 6])
>>> res2 = np.where(arr2 % 2 == 0)
>>> res2
(array([1, 3, 5]),)

>>> res2 = np.where(arr2 % 2 == 0, 1, -1)
>>> res2
array([-1,  1, -1,  1, -1,  1])

Python の import

Python でファイル分割した場合にどのように書けばいいか知らなかったので少しだけ調べた。

自分が理解した範囲では、実行したファイルを起点のそのディレクトリ以下が含まれる(あとは Ruby みたいに PATH に含まれていれば)

e.g.)

今回は一旦平で置いてあるのでその場合を想定

$ tree .
.
├── main.py
├── my_functions.py
├── perceptron.py

上記のようなファイルがあり、エントリーポイントを main.py とすると

# main.py

from perceptron import Perceptron
from my_functions import my_func

ppn = Perceptron(eta=0.1, n_iter=10)

result = my_func(ppn)

のように使える

2.3. Iris データセットでのパーセプトロンモデルのトレーニング

写経だけなので省略

  • 一対全 (One-vs.-All: OvA) 二値分類器を多クラス問題に拡張する手法
    • One-vs.-Rest とも
    • 特定のクラスは陽性、それ以外は陰性と見なす

2.4 ADALINE と学習の収束

ADALINE (ADAptive LInear NEuron) もう一つの単一層ニューラルネットワーク

パーセプトロンとは 重みの更新方法 が異なる。恒等関数(入力をそのまま出力する関数)である線形活性化関数に基づき重みが決定される。

またクラスラベルの予測に 量子化器 (quantizer) を使用する点も異なる。

2.5 勾配降下法によるコスト関数の最小化

目的関数(objective function) である コスト関数 (cost function) は、計算結果と本当のクラスラベルとの 誤差平方和 になる

2.6 大規模な機械学習と確率的勾配降下法

前節で書いたアプローチは、「バッチ」勾配降下法とも呼ばれる。

もしデータセットが巨大な場合、このアプローチだと毎回トレーニングデータ全体を再評価する必要があり、コストが大きい。

その代わりに 確率的勾配降下法 (逐次的勾配降下法, オンライン勾配降下法) を使う。

文字通り、 オンライン学習 に利用ができる。

おわり

勉強会後に再度更新する