728x90

우선 설명 전 "머신러닝 어디에 경사하강법을 쓰나?"부터 이야기를 하는게 좋을 것 같다.

결론부터는 머신러닝을 학습시킬 때 출력되는 Loss function을 최적화 하기 위해 쓴다. 왜냐하면 데이터를 표현하는 최적의 식을 찾기 위해선 Loss function값을 최적화 해야하기 때문이다.

 

그렇다면 어떻게 값을 최적화 시킬까?

여기서부터 미분의 개념부터 잡고가야한다.

미분의 정의는 "변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구"이다.

가장 익숙한 방법은 고등학교 때 제곱이상의 식은 계수로 떨어뜨리고 n-1승을 해주면 된다고 배웠을 것이다.

Python의 sympy라이브러리로 컴퓨터가 자동적으로 계산을 해줘 손으로 미분을 할 필요는 없지만 적어도 작동원리를 알기 위해선 정확한 개념은 알고가는 것이 좋다.

 

그렇다면 이 미분이랑 경사하강법이랑 무슨 관계냐?

미분은 움직임에 따른 변화량이라고 부를수 있다 했으니 다른말로 하면 어느 방향으로 가면 얼마나 움직이냐?를 볼 수 있다는 것이다.

따라서 관점은 "한 점에서 접선의 기울기를 알면 어느 방향으로 움직여야 함수값이 증가/감소하는지 알 수 있다"는 결론이 나온다.

내 머신러닝이 오차를 "줄이기"위해선 감소하는 방향을 찾아 나아가게끔 만들어야 한다는 것이다.


여기서 조금은 헷갈릴 요소는 미분값이 양수든 음수든 내 함수를 증가시키고 싶으면 더해줘야하고 감소시키고 싶으면 빼야한다.

다음 식에 따르면 "만약 내가 함수값을 증가시키고 싶을 때" 상황을 표현했다.

만약 내가 함수값을 증가시키고 싶을 때

따라서 내가 구하고자하는 값이 Max인지 Min인지에 따라 +=하면 경사상승법, -=하면 경사하강법이라 부른다.

둘의 공통점은 극값에 도달하면 움직임을 멈추지만, 컴퓨터 계산상 정확한 0으로 수렴하지 않기 때문에 하드 코딩시에는 아주작은 입실론 값을 임의로 부여한다.


단순히 변수가 하나일 때는 미분으로 충분하지만 변수가 벡터 또는 행렬의 꼴이면 이야기가 다르다.

하지만 미분의 개념을 버릴 수 없기 때문에 나온 것이 "그라디언트 벡터"이다. 

 

그라디언트 벡터는 함수가 포함하고 있는 모든 변수에 대해 편미분을 다시 표현한 벡터이다.

예시로 y라는 함수에 a,b,c,d라는 변수가 있을 시 각각 편미분을 하여 유도한 벡터는 다음과 같다. (글씨를 너무 못쓰기 때문에 미리 죄송합니다.)

그라디언트 벡터 예시


 

+ Recent posts