본문 바로가기

머신러닝/딥러닝에 필요한 기초 수학 with 파이썬 본문

딥러닝 수학

머신러닝/딥러닝에 필요한 기초 수학 with 파이썬

jaegomhoji 2024. 7. 16. 00:33

1장 머신러닝이란과 선형회귀 

    - 머신러닝이란 무엇인가?

        - 말 그대로 컴퓨터에게 무언가를 가르치는 것. <- 인간은 이를 직관적으로 처리할 수 있다. 

        - 어떻게 가르칠까?

        - 입출력의 관계를 가르친다 ( 지도 학습 ) 

        - 관계를 어떻게 알까? 

        - 수학적으로 좋은 관계인지 아닌지 계산한다.

        - 좋은 관계인지 아닌지 어떻게 알까?

        - 좋은 관계이면 줄어드는 수치를 설정한다. ( Loss function=손실함수 or Objective Function=목적함수 )

            - 이 수치란 어떻게 계산될까?

            - 예측치와 타겟을 비교한다.

            - 어떻게 비교할까?

            - 좌표상에서 비교한다. 우리는 수식을 통해 어떤 관계나 가설을 나타낼 수 있다. ex) h = ax + b

                - h stands for hypothesis 

            - h = ax + b는 인공신경망의 노드로 취급하면

                - h = (a*x) + (b*1) 꼴로 생각할 수 있다.

                - 이때, 입력:(x,1) , 출력:(a*x) + (b*1)이다. 

                - 입력에 곱해지는 벡터를 가중치라고 하며, w(볼드임) 라고 표현한다. 

                - 위에서 w = [w1,w2] 이며, w1 = a, w2 = b 라고 볼 수 있다. 

                - h(x,w) = w1*x + w2 라는 가설을 제시할 수 있다. 

        - 위의 가설을 좋은 가설인가? 이제 이 가설(예측치)와 타겟(레이블)을 비교한다.

            - 비교하는 과정에서 발생하는 차이(손실)을 L(Loss Function)이라고 한다.

            - 좋은 관계이면 수치가 줄어든다고 했는데, 우리는 이 가중치 w = [w1, w2] 를 조정하면서 관계를 수정함으로써 L을 줄일 수 있다. 

           - 손실함수를 줄이기 위해서, 급격히 변화하는 부분을 찾아, 그 반대 방향으로 그라디언트를 업데이트 한다. ( 뒤에서 다시 다룰 것임 )

            - 자칫 잘못하면 손실이 커질 수 있는데, 이때 그라디언트에 에타( η)를 곱해서 조금씩 업데이트 한다. 

            - η는 lr ( Learning Rate )를 뜻한다. 보통은 1e-4~5 정도의 수치를 설정한다. 

            - 이러한 안전장치를 통해서, 최종적으로 가설을 좋은 관계가 되도록 안전하게 업데이트(최적화 할 수 있다) 

    - 다시, 머신러닝이란 컴퓨터를 통해 어떤 입력과 출력의 관계를 계산하여 잘 찾도록 최적화(개선) 하는 것을 말한다. 

        - 이 개선과정을 통계쪽에서는 회귀(regression), 비통계쪽에서는 피팅(fitting)이라고 한다. 

 

    - 머신러닝에는 다양한 문제 형태에 적용할 수 있는 여러 방법론이 있다. 

       - 마스터 알고리즘은 존재하지 않는다. 

       - 머신러닝 [ 지도 : 분류, 회귀 등, 비지도 : 군집화, 차원 축소 등, 강화학습 ]

       - 현재로써는 지도학습이 맛있다. 

 

 

*** 위의 예제 코드

Weight_shift = []
Loss = []

def gradient_diff(num_iter, eta):
    """_summary_

    Args:
        num_iter (_type_): _description_
        eta (_type_): _description_
    """
    np.random.seed(921)
    random_weight = np.random.randn()

    for i in range(num_iter):
        # get gradient
        grad = np.dot(X.T,np.dot(random_weight,X)-Y) # MSE LOSS에 대한 도함수
        # update weight
        random_weight -= eta * grad
       
        # save weight diff
        Weight_shift.append(random_weight)
       
        # MSE LOSS 계산하여 리스트에 저장
        Loss.append(((np.dot(random_weight,X) - Y )**2).sum()/2)
       
        # when calculation is done
        # draw plot
        if i == num_iter -1:
            x= np.linspace(-1,10,30)
           
            fig, (ax1,ax2,ax3) = plt.subplots(1,3)
            fig.set_size_inches((15,6))
           
            ax1.plot(M_1[0],M_1[1], 'ko', markersize=5, label = "Y")
            ax1.plot(x,np.dot(random_weight,x), c='r', lw=2, label = "Y_Hat")
            ax1.legend(fontsize = 10 )
       
            ax2.plot(Loss[:], "--", label = 'loss')
            ax2.legend(fontsize = 10 )
            ax2.set_xlabel('iteration')
            ax2.set_ylabel('Loss value')
           
           
            ax3.plot([i+1 for i in range(num_iter)],Weight_shift[:], label = 'weight update')
            ax3.plot(1,original_weight, 'ro')
            ax3.set_xlabel('iteration')
            ax3.set_ylabel('weight value')
            ax3.legend(fontsize = 10 )
           
            # plt show at the last moment.. otherwise, the result will not properly show
            plt.show()

       
    return 1
gradient_diff(30,0.0004)

- 좌) 가중치 업데이트를 통해 가설로 제시한 수식이 좋은 관계로 계선 되었음. 

- 중) 관계가 개선됨에 따라서 loss 역시 iteration이 늘어날 수록 줄어들고 있음. 

- 우) 관계가 개선됨에 따라서 weight update역시 변화율이 더디고 있음.  

 

*** Loss Function ( MSE )에 대한 도함수 계산 손풀이.

 np.dot(X.T,np.dot(random_weight,X)-Y)  

Comments