728x90
반응형

선형 회귀를 위한 뉴런
경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스

 

1. __init__() 메서드 작성 - 초기화

class Neuron : 
    
    def __init__(self): # 초기화 작업 
        self.w = 1.0
        self.b = 1.0

2. 정방향 계산 만들기

뉴런을 도식화한 상태에서 y했을 구하는 방향을 보고 만든 용어

y햇 = w * x + b

 def forpass(self, w):
        y_hat = x * self.w + self.b
        return y_hat
    

 

3. 역방향 계산 만들기

(-(y-y햇))

정방향 계산을 통해 얻어낸 y햇과 y의 차이, 오차가 뉴런의 오른쪽 방향에서 왼쪽 방향으로 흐르는 것처럼 보임

    def backprop(self, w, err):
        w_grad = x * err # 가중치에 대한 기울기를 계산
        b_grad = 1 * err # 절편에 대한 기울기 계산
        return w_grad, b_grad

편미분 수식, 가중치 기울기는 x와 오차(err)를 곱하고 절편의 기울기는 1과 오차(err)를 곱하면 된다.

이후 이 값들로 가중치와 절편을 업데이트해 점차 훈련 데이터에 최적화된(손실 함수가 가장 작은 값인) 가중치와 절편을 얻을 수 있다.

 

4. Neuron 클래스

#  선형 회귀를 위한 뉴런
# 경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스

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

경사 하강법 알고리즘 핵심

 

5. 훈련을 위한 fit() 메서드 구현

def fit(self, 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 = self.backprop(x_i, err) # 역방향 계산
            self.w -= w_grad # 가중치 업데이트
            self.b -= b_grad # 절편 업데이트

 

6. 모델 훈련하기 (학습)

neuron = Neuron()
neuron.fit(x, y)

 

7. 학습 완료 모델의 가중치 절편 확인

학습이 완료된 가중치와 절편은 neuron.w와 neuron.b에 저장되어 있다.

그래프 그리기

#  선형 회귀를 위한 뉴런
# 경사 하강법 알고리즘 -> Neuron이름의 파이썬 클래스

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(self, 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 = self.backprop(x_i, err) # 역방향 계산
                self.w -= w_grad # 가중치 업데이트
                self.b -= b_grad # 절편 업데이트
            
            
neuron = Neuron()
neuron.fit(x, y)


plt.scatter(x, y)
pt1 = (-0.1, -0.1 * neuron.w + neuron.b)
pt2 = (0.15, 0.15 * neuron.w + neuron.b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

[그림1] 경사하강법 그래프 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기