사용자 도구

사이트 도구


maine_learning:extream_learning_machine

Extream Learning Machine (ELM)

인공 신경망의 일종으로 다른 인공신경망 기법보다 상대적으로 학습속도가 빠른 것이 장점이다. 일반적인 Multi-Layer Perceptron (MLP)과 마찬가지로 입력 계층, 은닉 계층, 출력 계층으로 구성되어 있다. 은닉 계층의 활성화 함수(Activation function)은 어떤 함수를 사용해도 상관 없으며, 출력계층은 특별한 활성화 함수를 사용하지 않고 선형 출력 한다.

MLP와 같은 다른 인공신경망 기법과 가장 큰 차이점은 학습 방법이다. 일반적인 인공 신경망 학습은 Gradient Descent등의 기법을 사용하여 각 노드간의 가중치를 계산하는 것을 말한다. 임의의 초기값을 지정한 다음, 오차/비용가 줄어드는 방향으로 가중치들을 반복적으로 수정한다. 충분한 성능을 보이거나 더이상 개선이 되지 않으면 학습을 중단하는데, 반복해서 계산하는데 오랜 시간이 걸릴 뿐만 아니라, 종종 지역최적해에 빠지기도 한다.

ELM은 이 과정을 효율적으로 수행한다. 입력계층의 가중치를 $\alpha$, 은닉계층의 가중치를 $\beta$, 입력계층의 출력을 $H$, 목표값을 $T$라고 하면..

  1. 입력 계층의 가중치 $\alpha$를 무작위로 정한다.
  2. 입력 계층의 출력 $H = G(\sum \alpha_i x_i +b_i)$를 구한다.
  3. 은닉 계층의 가중치 $\beta$를 Penrose-Moore peudo 역행렬을 이용해 반복없이 바로 구한다.
    1. $T = H \beta$가 되어야 하므로, $\beta = H'T$를 계산하면 $\beta$를 구할 수 있다. ($H'$: Penrose-Moore peudo 역행렬)

간단한 구현

ELM.py
import numpy as np
import plotille
import tqdm
from IPython import embed
from scipy.linalg import pinv2
from sklearn.datasets import make_circles, make_classification, make_moons
 
 
class ELM:
    def __init__(self, x, y, hidden_dim=None):
        self.input_size = x.shape[-1]
        if hidden_dim is None:
            self.hidden_size = int(x.shape[0] / 7) 
        else:
            self.hidden_size = hidden_dim
        self.input_weights = np.random.normal(size=[self.input_size, self.hidden_size])
        self.biases = np.random.normal(size=[self.hidden_size])
        self.output_weights = np.dot(pinv2(self.hidden_nodes(x)), y)
 
    def hidden_nodes(self, X):
        G = np.dot(X, self.input_weights) + self.biases
        relu = lambda x_: np.maximum(x_, 0, x_)
        H = relu(G)
        return H
 
    def __call__(self, x):
        H = self.hidden_nodes(x)
        y = np.dot(H, self.output_weights)
        return y
 
 
if __name__ == '__main__':
 
    X, y = make_moons(n_samples=500, noise=0.3, random_state=0)
    X = (X - X.min(0) + 1e-6) / (X.max(0) - X.min(0) + 1e-6)
 
    n_hiddens = list(range(2, 32))
    losses = list()
    for n_hidden in tqdm.tqdm(n_hiddens):
        mask = np.random.random(X.shape[0]) < 0.1 
        train_x, train_y = X[mask], y[mask]
        test_x, test_y = X[~mask], y[~mask]
        model = ELM(train_x, train_y, n_hidden)
        loss = (0.5 * (test_y - model(test_x)) ** 2).mean()
        losses.append(loss)
 
    print(plotille.plot(n_hiddens, losses))
 
    model = ELM(train_x, train_y)
    loss = (0.5 * (test_y - model(test_x)) ** 2).mean()
    embed(); exit()

참고자료

maine_learning/extream_learning_machine.txt · 마지막으로 수정됨: 2024/03/23 02:42 저자 127.0.0.1