あまり知られていないかも知れないが、Extream Learning Machineというニューラルネットの一種がある。
3層のニューラルネットなんだけど、通常のニューラルネットと違い、学習は出力層と中間層の重回帰で学習する。通常のようなバックプロパゲーションのような面倒なことはしない。
入力層と中間層の間の重みはランダムで良く、学習する必要がない。ただ通常より多くの中間層ニューロンを用意しておく必要がある。
イメージとしては特徴量を大量生成しておいて、分類に役に立ちそうな候補手を重回帰で選択するといった感じだろうか。重回帰なのでデータをまとめてオフラインでしか学習できない。
利点
- 計算が一瞬
- 実装が手軽な上ブラックボックスではない。(不具合を特定しやすい)
欠点
- オンライン学習ではない
- 過学習の問題がありそう
import matplotlib.pyplot as plt import numpy as np import seaborn seaborn.set_style("whitegrid") mid_num = 200 train_num = 2000 test_num = 200 train = np.random.random([train_num, 2]) * 10 - 5 teacher = np.zeros(train_num) for i in range(train_num): teacher[i] = 0 if np.linalg.norm(train[i]) < 3 else 1 test = np.random.random([test_num, 2]) * 10 - 5 predict = np.zeros(test_num) def activation(x): return 1/(1 + np.exp(-x)) # learning input_weight = np.random.random([2,mid_num]) mid = activation(np.dot(train, input_weight)) output_weight = np.dot(np.linalg.pinv(mid), teacher) # predicting mid = activation(np.dot(test, input_weight)) output = np.dot(mid, output_weight) predict = map(lambda x: 1 if x>0.5 else 0, output) for i in range(test_num): color = "r" if teacher[i] else "b" plt.scatter(*train[i], color=color) circle = [(3*np.sin(x), 3*np.cos(x)) for x in np.arange(0, 6.29, 0.001)] plt.plot(*zip(*circle), color="g") plt.axis("square") plt.show()