티스토리 뷰

손실함수는 패널티 점수여서 어떤 네트워크의 손실함수 값이 크다는 것은 뉴럴 네트워크의 성능이 안좋다는 이야기이고 값이 작다는것은 뉴럴 네트워크의 성능이 좋다는 이야기라는것을 이전에 알아보았습니다.

 

그렇다면 손실함수의 변수는 무엇일까요? 일반적으로 데이터라고 생각하기 쉽습니다. 사실은 그렇지 않습니다.

f(x) = ax ^2 + bx + c 데이터는 a,b,c 같은 상수값이고 변수 x는 가중치와 편향등이 차지합니다.

 

 

성능이 좋은 네트워크를 찾는다는 이야기는 손실함수가 작은 값을 찾는것과 같습니다.

 

f(x)의 최대 최소를 찾고싶을때, f`(x)=0 [미분했을 때 0] 이 되는 값을 먼저 찾는것을 고등학교 때 배웠습니다.

 

f(x,y)의 최대 최소를 찾고싶을때는 Df(x,y)=(0,0) [그레디언트 0] 이 되는 값을 찾으면 됩니다.

 

접평면의 방정식을 생각해보면 알 수 있습니다. 그레디언트가 0이 되면, z= 상수값만 남게되기 때문입니다.

 

접평면의 방정식

2020/10/15 - [Study/인공지능] - 수치미분과 gradient, 최대 최소 등위선면 (인공지능 기초 #8)

즉 x로 편미분한것과 y로 편미분한것, z로 편미분한것이 0이 되는 값이 최대또는 최소지점이라는것을 예측할 수 있습니다.

 

최대와 최소를 구하는 방법을 알아보았으니, 적용해보는 법을 살펴보겠습니다.

 

MNIST 데이터에서 변수는 39,760개가 나오게 됩니다. ( 모든 편향과 가중치의 수 )

 

39760 연립방정식을 푸는것은 힘들기때문에 경사하강법을 사용하게 됩니다.

 

경사하강법은 비유하게 되면, 산을타고 하산하는 방식입니다.

39760차원의 그래프를 39761차원의 도화지에 그려서 가장 빨리 내려가는방향을 찾으면 됩니다.........

 

어떻게 찾을까요. 그 차원에 우리가 있을 수 없으니까 우리가 눈을 감고 산을 내려간다고 생각해봅니다.

 

눈을감고 어떻게 산을 내려갈 수 있을까요 우리는 제 자리에서 한바퀴돌고 그 중 가장 각도가 내려가는쪽으로 한걸음 내딛습니다. 거기서 또 한바퀴돌고 한걸음 가고를 반복하면 언젠가는 바닥에 도착 할 것입니다. 

 

경사하강법도 같은 개념입니다.

 

gradient의 반대방향으로 한 발자국씩 내딛으며 함수값을 낮추는 방법입니다.

 

한걸음씩 내딛다보면, 곡선으로 웅덩이처럼 만들어진 곳은 최소가 되는 지점. gradient가 0이되는 지점에 다가갈수록 점점 각도가 줄어들 것입니다. 0이되는 지점에서는 평면수평일 것이기 때문입니다.

 

그래서 그 보폭을 완벽하게 맞출 순 없지만, 눈을 감고 산을 내려가는식으로 생각을해서 찾아가면 최소값과 비슷하게는 맞출 수 있을 것입니다.

 

인공지능은 실용적인 학문이여서 완벽하게 맞추는거에 초점을 두기보단, 쓸 수 있는것을 생각하므로 충분히 의미있는 값이라고 생각합니다.

 

 

하지만 경사하강법은 내려가기 시작하는 점에 따라서 결과값이 민감하게 달라진다는 문제점이 있습니다.

 

산도 능선이 있어 내려가다가 다시 올라갔다가 더 내려가야 더 최소가 되는 지점이 생기는것처럼, 극소점이나 안장점 근처에서는

의 크기가 작아져서 보폭도 작아집니다.

 

따라서 점 xn은 최소점이 아니라 극소점 또는 안장점에 안착할 수 있기 때문입니다.

 

즉 어느 지점에서 시작을 하느냐에 따라 완전 바닥일수도, 중간 쉬는 지점일수도, 중간바닥일수도 있는 것입니다. ( 무조건 눈을 감고 각도가 낮은 지점으로 한걸음씩 나아가는 방식이기 때문 )

 

위 그림은 이해를 돕기위해 그려진 그림이지만, 뉴럴 네트워크는 우리가 상상할 수 없는 차원이기때문에 어디가 가장 좋은곳인지 알 수 없습니다.

 

Learning Rate = 보폭의 크기, (학습률) 작게잡으면 학습이 작게 천천히 이루어지는 것이고, 크게잡으면 학습이 크게 이루어지는 것입니다. 너무작으면 목적지 근처까지 못가거나 너무많이 걸어야하고, 너무크면 무질서하게 아무곳이나 가게 됩니다. 너무큰건 성능이 나빠지기때문에 조심해야합니다.

 

그래서 우리는 시작점을 랜덤하게 설정을 하고, 손실함수값이 조금씩 작아지는것을 확인합니다.

 

 

어떤 Learning Rate가 가장 이상적인가? 를 찾아주는 함수는 아직 없습니다. 그래서 지금은 Learning Rate를 여러가지로 설정해서 학습을 시켜보는 방법밖에는 없습니다.

 

Stochastic Gradient Descent 

 

어떤 data set이 주어졌을 때. 그 데이터 셋에 속해있는 한장한장에 대해서 손실함수를 구하고 모든 손실함수를 더한 후 데이터 셋의 수로 나누어준다. 하지만, 데이터가 60000장이라고 가정했을때 너무 오래걸린다. 그래서 랜덤하게 100장을 샘플링을 해서 100개의 손실함수를 구하고 100개로 나누고 경사하강법으로 가장 작은걸 찾아보ㅓ고, 또 100장을 샘플링하고 경사하강법으로 가장 작은걸 찾아보고 이런식으로 진행합니다.

 

100장을 샘플링해서 한걸음가고, 100장을 또 샘플링해서 한걸음 가고, 또 100장을 샘플링해서 한걸음 가고 이런식으로하면 계수가 바뀌기 때문에 ( data set ) 산의 모양이 계속 바뀌면서 비틀비틀 아래로 내려가는 모양이 됩니다.

 

이는 완전 가장 낮은곳으로는 갈 수 없지만, 비슷한 지점으로는 갈 수 있게 됩니다. 

 

오차는 적으면서 계산비용은 훨씬 적기 때문에 이러한 방식을 사용합니다.

 

yolo에서도 learning rate 설정하는 부분이 있습니다.

 

댓글
최근에 올라온 글
최근에 달린 댓글
250x250