/* 2017.7.2 */
Universal Approximation Theorem
Universal Approximation Theorem이란 1개의 히든 레이어를 가진 Neural Network를 이용해 어떠한 함수든 근사시킬 수 있다는 이론을 말합니다. (물론 활성함수는 비선형함수여야합니다.) 재미로 1개의 히든 레이어를 가진 신경망 모델로 실제 함수를 근사시킬 수 있는지 확인해보았습니다.
import numpy as np %matplotlib inline import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD from keras import optimizers import math
우선 필요한 라이브러리를 임포트합니다.
x = np.linspace(-10, 10, 100) y = 3*np.sin(x)*np.cos(x)*(6*x**2+3*x**3+x**1)*np.tan(x)
제가 근사시키고 싶은 함수는 위와 같습니다.
y = 3sin(x)cos(x)(6x^2+3x^3+x)tan(x) 라는 함수인데 그냥 생각나는대로 만든 함수입니다.
이 함수의 모양은 이렇게 생겼습니다. Universal Approximation Theorem은 신경망 모델로 이러한 복잡한 함수도 근사시킬 수 있다는 이론인데 한 번 확인해보겠습니다.
우선 여러개의 히든 레이어를 가진 신경망 모델로 확인해보겠습니다.
Multi layer perceptron
model = Sequential() model.add(Dense(10, input_shape=(1,), activation='relu')) model.add(Dense(10, input_shape=(1,), activation='relu')) model.add(Dense(10, input_shape=(1,), activation='relu')) model.add(Dense(10, input_shape=(1,), activation='relu')) model.add(Dense(1, activation='linear')) rms = optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy']) model.fit(x, y, epochs=3000)
위와 같은 4개의 히든 레이어로 구성된 신경망 모델을 만들고 RMSProp optimizer을 통해 학습하였습니다. 학습된 모델로 구현된 함수는 아래와 같이 생겼습니다.
prediction = model.predict(x) plt.plot(x, prediction) plt.show()
조금 다른 부분도 있지만 잘 근사한 것을 확인할 수 있습니다. 사실 처음에는 adam optimizer을 사용하였는데, loss 한계점 아래로는 떨어지지가 않았습니다. 그래서 learning rate를 조절할 수 있는 rmsprop optimizer을 이용하였고, learning rate를 다양하게 변화시켜가면서 위와 같은 hyperparameter일 때 가장 잘 학습하는 것을 확인하였습니다.
Singlel hidden layer perceptron
model = Sequential() model.add(Dense(10000, input_shape=(1,), activation='relu')) model.add(Dense(1, activation='linear')) rms = optimizers.RMSprop(lr=0.06, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy']) model.fit(x, y, epochs=5000)
진짜 universal approximation theorem은 "단 한 개"의 히든레이어로도 이런 것을 할 수 있다는 것이기 때문에 한 개의 히든 레이어만 가지고 함수를 근사시켜보겠습니다. 무려 10000개의 node를 갖는 1개의 히든레이어를 5000 epochs 을 돌려서 다음과 같은 근사함수를 만들어냈습니다.
위의 multi layer perceptron 보다는 못하지만 어느정도 근사할 수 있다는 것을 확인할 수 있었습니다. 노드수, learning rate, optimizer 등을 바꿔가면서 해보면 더 잘 함수를 근사시킬 수 있을 것입니다.
'Data science > Machine Learning' 카테고리의 다른 글
Deconvolution 이란 무엇인가? (0) | 2017.11.05 |
---|---|
Spatial Transformation Network 란 무엇인가? (0) | 2017.10.26 |
Deep Learning - Word Embedding 이란 무엇인가? (2) | 2017.06.25 |
Deep Learning - Softmax 구현 및 성질 (0) | 2017.01.30 |
Deep Learning - Numpy 기초, 신경망 구현 (0) | 2017.01.30 |