뉴런 만들기
딥러닝은 뇌에 있는 뉴런을 따라한 것이다.
앞서 공부한 내용으로 뉴런을 만들어 보면 더욱 이해가 빠를 것이다.
생성자
우선, 생성자에서 필요한 변수를 선언하고 초기화한다.
def __init__(self):
self.w = 1.0
self.b = 1.0
여기서 1.0은 임의로 선정한 수이다. 다른 수여도 아무런 문제가 없다.
정방향 계산
정방향 계산은 예측값을 계산하는 과정이라 생각해도 된다.
즉, 기울기와 절편을 예측하는 것이다.
def forpass(self, x):
y_hat = x * self.w + slef.b #직선 방정식 계산
return y_hat
y = wx + b라는 식을 이용하여 y_hat을 구하는 과정이라 생각하면 된다.
그럼 이제 w와 b를 적절히 조정하여 올바른 모델을 만들어 내기만 하면 된다.
역방향 계산
w와 b를 어떻게 조정할 것인가?
앞서서 우리는 실제 y값과 예측값 y_hat의 차이를 데이터 값 x에 곱하여 기울기를 업데이트하고
그 차이를 그대로 절편에 더해 업데이트하는 방법을 배웠다.
즉, 오차율을 가지고 기울기와 절편을 업데이트한다.
def backprop(self, x, err):
w_grad = x * err
b_grad = 1 * err
return w_grad, b_grad
grad란 미분 값이라 생각하면 된다.
훈련
위에 정의한 forpass() 함수와 backprop() 함수를 호출하는 것을 여러 번 반복하여 기울기와 절편을 업데이트하면 되는
간단한 과정이다.
def fit(self, x, y, epochs=100):
for i in range(epochs): #epoch만큼 반복
for x_i, y_i in zip(x, y): #모든 샘플에 대해 반복
y_hat = self.forpass(x_i) #예측값 생성
err = -(y_i - y_hat) #에러 측정
w_grad, b_grad = self.backprop(x_i, err) #역방향 계산
self.w -= w_grad #기울기 업데이트
self.b -= b_grad #절편 업데이트
코드 블록이 에러가 있는 것 같다. 이중 for문이다....
최종적인 코드이다.
class Neuron:
def __init__(self): #기울기, 절편 초기화
self.w = 1.0
self.b = 1.0
def forpass(self, x): #직선 방정식 계산
y_hat = x * self.w + self.b
return y_hat
def backprop(self, x, err): #그레디언트 계산
w_grad = x * err
b_grad = 1 * err
return w_grad, b_grad
def fit(slef, x, y, epochs=100): #훈련
for i in range(epochs):
for x_i, y_i in zip(x, y):
y_hat = self.forpass(x_i)
err = -(y_i - y_hat)
w_grad, b_grad = backprop(x_i, err)
self.w -= w_grad
self.b -= b_grad