티스토리 뷰

이번에는 회귀 모델을 신경망으로 만들어서 분석하는 실습을 진행하도록 하겠습니다.


먼저 회귀 모델을 신경망으로 만드는 이유에 대해 예를 들어 말씀드리도록 하겠습니다.


신경망으로 만드는 이유는 우리가 가지고 있는 표본들을 활용하여 만든 예측 모델을 일반화시키기 위함입니다. 


우리가 남자 100명의 키와 몸무게에 대한 정보를 가지고 있다고 가정해봅시다.


이 100명의 정보를 활용하여 키로 몸무게를 예측하는 예측 모델을 만들었을 때, 

이 모델은 모델을 만들 때 활용된 100명에 대한 예측 정확도는 아주 높을 것입니다.


하지만 전 세계 인구는 70억명.. 남자가 반이라고 예상해도 35억명입니다. 

100명이 35억명을 대표할 수가 없습니다. 


현실에 100명으로 만든 예측 모델을 적용하는 것은 

마치 한 초등학교 1학년 1반 남자들을 표본으로 뽑고 모델을 만든 후, 

성인남자의 몸무게를 예측하는데에도 사용하는 것과 비슷합니다.



이런 경우, 모델은 만들었지만 현실에 적용하기는 어렵습니다.



그래서 사용하는게 신경망입니다. 어떠한 표본이 뽑혀도 잘 예측될 수 있도록, 무작위로 표본을 추출하여 학습에 사용합니다.



그리고 테스트 셋을 추출한 후, 모델의 결과와 테스트 셋의 결과를 비교하여 오차가 얼마나 되는지. 오차를 줄이는 방향으로 학습이 되도록 합니다.



무작위로 표본을 추출할 경우, 모델의 과적합(overfitting)을 막을 수 있습니다. 매번 다른 표본이 뽑히기 때문에 가중치는 달라질 것입니다.

그리고 테스트 셋을 만들어 비교할 경우에도 모델의 과적합을 막을 수 있습니다. 



실제로 모델은 두가지를 줄이는 방향으로 학습이 진행됩니다.



1. 훈련 셋의 오류를 줄이는 방향

2. 훈련 셋의 오류와 테스트 셋의 오류 차이를 줄이는 방향

 



회귀모델에서는 표본들을 분석하여 최적의 w(가중치)를 찾아내었지만



신경망 모델에서는 w를 모른다는 가정하에 시작하게 됩니다.

모든 사례에 사용될 수 있는 w를 찾기 위해서입니다.



최적의 w는 학습 셋과 테스트 셋의 차이를 가장 많이 줄이는 w입니다. 



차이를 가장 많이 줄인다 라는 말을 달리 말하면

둘의 차이가 0 이 되면 학습셋으로 만들 모델이 테스트 셋에서도 똑같은 결과를 만든다고 할 수 있습니다. 



즉 둘의 차이를 0에 가깝게 만드는 다시 말하면 학습 셋과 테스트셋 양쪽에 사용가능한 w를 만들어야 합니다.



어떻게 하면 둘의 차이를 0에 가깝도록 w를 만들 수 있을까요?

답은 gradient입니다. 



gradient는 미분을 통해 얻어지는 값으로 영어로는 기울기로 해석이 되며,


더 정확하게 말하면 어떠한 값이 시작점으로부터 어느 방향으로 얼마나 떨어져 있는지를 표현한 벡터입니다.



예를 들어보겠습니다.

2차원상에서 시작점이 0이고, 현재 표기되어 있는 점이 1,1이라면 

gradient는 0에서 1,1이라는 점으로 이동한 정보를 의미합니다.



쉽게 계산하면 x축으로 1이동 y축으로 1이동했으니 2라고 표현할 수도 있습니다.



만약 표기되어 있는 점이 -1,-1라면 0에서 x축으로 -1, y축으로 -1 이동하였으니 -2라고도 표현할 수 있습니다.



여기에서 2와 -2를 gradient라고 할 수 있습니다.



미분을 통해 구할 수 있으며, 여기에서 수식은 생략하도록 하겠습니다.  



둘의 차이를 0으로 만들기 위해서는 둘의 차이가 0에서 얼마나 어떻게 떨어져 있는지 정보가 필요한데, 그 정보가 바로 gradient입니다.

gradient를 활용함으로써 둘의 차이를 점차 0에 가깝게 w를 업데이트해주는 방식으로 진행이 됩니다.


그리고 w가 설정해놓은 수치(이정도는 되어야 최적이야라고 생각하는 수치) 이상으로 변하지 않을 때, 최적의 w를 찾았다고 가정하고, w의 업데이트를 종료하게 됩니다. 




수학적인 설명과 함께 원본에 대한 링크는 다음의 url을 참조하시면 될 것 같습니다.


https://speakerdeck.com/mingrammer/meosinreoningeul-wihan-gico-suhag-salpyeobogi?slide=64


회귀신경망의 코드는 다음과 같습니다. 바로 돌리셔도 작동하는 것을 확인하실 수 있습니다.

import numpy as np import matplotlib.pyplot as plt def get_gradient(w, x, y) :

#gradient == 시작점으로부터 y의 값이 얼마나 떨어져 있는지 방향과 거리를 표현한 점

# 입력 데이터(키)로 w(가중치)를 곱하여 결과(몸무게)로 이루어진 행렬 y_estimate = x.dot(w).flatten()

#dot :[[37, 40], [85 92]] -> [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]] #flatten = 두개를 하나로 [1,2],[3,4] -> [1,2,3,4]

#오차계산 : 예측한 결과와 실제 값 사이에 얼마나 차이가 있는가를 계산 error = (y.flatten() - y_estimate)

#손실 함수값과 그라디언트 반환 mse = (1.0/len(x))*np.sum(np.power(error, 2)) gradient = -(1.0/len(x)) * error.dot(x) return gradient, mse def main(): #데이터 생성 data_x = np.linspace(1.0, 10.0, 100)[:, np.newaxis] data_y = np.sin(data_x) + 0.1 * np.power(data_x,2) + 0.5 * np.random.randn(1) data_x /= np.max(data_x) #절편 데이터 추가(x0) y1 = b + ax1, y2 = b + ax2 data_x = np.hstack((np.ones_like(data_x), data_x)) #데이터 셔플 & 훈련용, 테스트용 데이터 셋 생성 permutation은 치열을 의미 order = np.random.permutation(len(data_x)) portion = 20 test_x = data_x[order[:portion]] test_y = data_y[order[:portion]] train_x = data_x[order[portion:]] train_y = data_y[order[portion:]] #그라디언트 수행하며 모델 학습 w = np.random.randn(2) alpha = 0.1 #학습률을 의미 tolerance = 1e-5 #그라디언트 하강 수행 : 그라디언트가 하강 iterations = 1 while True: #그라디언트만큼 감소시키고 추정파라미터 갱신 gradient, error = get_gradient(w, train_x, train_y) new_w = w - alpha * gradient #이전 예측 모델과 새로운 예측 모델의 차이가 매우 작으면 수렴으로 가정 if np.sum(abs(new_w-w)) < tolerance: print("수렴") break #반복 250회마다 오차와 현재 그래프 출력 if iterations % 50 == 0: plt.plot(data_x[:,1], data_x.dot(w), c='g', label='Model') plt.scatter(train_x[:,1], train_y, c='b', label='Train Set') plt.scatter(test_x[:,1], test_y, c='r', label='test Set') plt.grid() plt.legend(loc='best') plt.xlabel('X') plt.ylabel('Y') plt.show() print('Iteration: %d - Error: %.4f' %(iterations, error)) iterations += 1 w = new_w if __name__ =="__main__": main()


250번째


500번째

750번째

1,000번째

훈련 데이터로 학습한 후, 테스트 데이터의 결과와 얼마나 차이가 있는지를 보여주는 그래프입니다.

더 많이 할수록 모델을 기반으로 예측한 값(선)과 테스트 데이터의 값(점)의 차이가 점점 줄어드는 것을 보실 수 있습니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함