Gradient Descent 기초개념

2019-05-12

.

그림, 실습코드 등 학습자료 출처 : https://www.fastcampus.co.kr/data_online_databasic

1. 개요

그레디언트라는 말은 벡터의 미분 쉽게 말해서 그냥 미분이라고 생각하면 된다.

미분을 이용해서 무언가 아래로 내려가는 그런 것을 말한다.

2. weight 초기화

원하는 weight는 어떻게 찾을까

인풋데이터를 넣고 어떤 숫자를 곱해줬을때 결과값을 잘 예측할 수 있을것인가에 대한 고민이 weight를 어떻게 잘 줄 것인가이다.

그래서 학습이라는 것이 입력값과 곱해지는 가중치를 좋은 가중치를 찾아내는 과정이라고 할 수 있다.

그래서 weight를 어떻게 학습할 것인가 고민해야하는데 처음에 그러면 weight를 어떻게 부여할 것인가에 대한 고민에 직면할 것이다.

그러나 우리는 알고있는 정보가 별로 없기 때문에 그냥 랜덤값을 넣고 시작하자는 것이 random initialization이다.

딥러닝에서 가중치의 초기값을 부여할때 통상적으로 쓰는 방법이다.

1

3. loss function

그래서 학습이 끝나고 결과값을 예측했는데 어떤 weight를 줬을때 결과값 예측을 잘 할 것인가에 대한 척도를 알수있는 수치가 loss function 또는 cost function이다.

loss function에서 통상적으로 쓰는 방법이 MSE이다.

대략적으로는 (신경망의 예측값과 실제값의 차이)의 제곱이다.

EX) 어떤 제조업에서 상품을 만들기위해 들어가는 2가지 재료비용 조합에 대하여 신경망이 예측한 판매량이 (100,800)이고 실제 펀매량이 (105,78)일때 loss function = (105-100)제곱 + (78-80)제곱 = 29

loss function은 그래서 내가 원하는 목적을 잘 예측할수록 loss function 수치가 작아지게 된다. 반대로 잘 예측을 못할수록 커지게된다.

그래서 loss function의 값이 줄어들도록 weight 값들을 조금씩 바꿔줘야한다.

그러면 weight를 어떻게 바꿔줄것인가에 대한 의문이 드는데 미분을 이용하면 된다.

MSE는 보통은 내가 가진 모든 training data에 대해서 뉴럴 네트워크의 출력과 실제값을 비교하여 각각의 loss를 계산하고 이를 모두 더해서 평균을 내는 전체 loss를 계산한다.

4. gradient descent

아래 그림에서 x축은 가중치에 대한것이고 y축이 loss function에 대한 것이다.

현재 가중치가 w0에 있다고 치자. 만약에 w0의 현재 loss function이 10이라고 할때 나는 이 loss function을 줄이고 싶다.

그러면 w0을 줄여야지 감소하는지, 아니면 증가시켜야지 loss function이 감소하는지 알기위해서 현재 w0에서 미분을 한다.

미분을 한다는것은 접선의 기울기를 본다는 것인데 만약에 w0를 미분했을때 접선의 기울기가 -2라고하면 그게 무슨의미냐면 w0을 마이너스 방향으로가면 loss function이 증가할것이라는 말이다. 그리고 숫자 2는 2배만큼 loss function이 변할것이라는 말이다.

즉 왼쪽으로 조금 움직이면 그 2배만큼 loss function이 증가한다는 뜻이다.

우리는 목적이 loss function을 줄이는 것이 목적이기 때문에 마이너스 방향으로 가면 loss function이 증가하겠다는 것을 인지하고 w0을 플러스 방향으로 움직여줘야 한다.

다시말해서 loss를 w로 미분하고 미분값이 가리키는 방향의 반대방향으로 아주 조금씩 w를 바꿔나가면 loss를 감소시킬 수 있다.

주의해야할점은 아주 조금씩 w를 바꿔야 한다는 것이다. 만약에 w를 지나치게 증가시키면 아래 그림에서도 볼 수 있듯이 오히려 loss function이 증가하는 부분쪽으로 갈 수도 있다.

Gredient Descent를 예로 들면 마치 등산객이 눈을 가리고 정상에서 산을 내려가야 하는 상황과 비슷하다. 그 등산객은 앞은 볼수 없고, 단지 내가 서있는 자리의 경사만 알 수 있다. 그러면 등산객은 경사가 내려가는 쪽으로 조금씩 조금씩 움직여서 결국에는 가장 아래로 내려갈 것이다.

2

  • gradient descent의 수식

3

위에 weight update 수식에서 learning rate 앞에 마이너스가 붙은 이유는 미분값(gradient)이 방향을 가르키는데 그 방향이 loss를 증가시키는 방향을 가키리기 때문에 그 반대로 가야하니까 마이너슬 붙어준것이다. learning rate는 이 수치를 키우면 한번에 많이 이동하게되고 수치를 적게해주면 한번에 조금씩 이동한다. 그래서 통상적으로 0.001 같이 아주 작은 값을 부여해준다.

정리하면 가진 모든 training data에 대해서 뉴럴 네트워크의 출력과 실제값을 비교하여 각각의 loss를 계산하고 이를 모두 더해서 평균을 내는 전체 loss를 계산한 다음에 이 loss를 weight로 미분한 다음 그 미분값(gradient)이 가리키는 방향의 반대방향으로 weight 값을 아주 조금씩 바꿔나간다.

그런데 이게 문제가 있다. 내가 가진 data가 너무나도 많은데 weight값을 아주 조금씩 바꾸기 위해서 그 너무나도 많은 모든 데이터에 대해 loss를 다 계산해야한다.

예를들어서 사진을 넣었을때 고양이와 개를 구분하는 네트워크를 만들었다고 치자. 주어진 데이터는 100만장의 사진이다. 그러면 우리는 이 네트워크를 학습시키기위해 loss를 계산하기 위해서 100만장을 전부 네트워크에 넣고 출력을 다 뽑는다. 고양이라고 예측하는지 개라고 예측하는지 그러면 전체 loss function이 계산이 된다. 그 다음에 미분해서 weight를 아주 조금 업데이트 할 수 있다. 말로는 가능하지만 100만장의 데이터를 계속 이런식으로 학습을 한다는 것이 현실적으로는 불가능하다. 데이터가 너무나도 커서..

즉 데이터가 많으면 많아질수록 학습이 느려진다는 문제가 생긴다.

5. Batch / Stochastic / Mini-batch Gradient Descent

모든 training data에 대해서 loss를 다 계산하는 것은 현실적으로 데이터가 너무 많아서 불가능하니까 전체 데이터 중에서 일부 데이터만 랜덤으로 샘플링해서 이 데이터들로 전체 트레이닝 데이터를 잘 대표한다고 가정해서 이 데이터들로만 loss를 계산하여 weight를 update 할 수 있지 않을까해서 나온 아이디어가 Stochastic / Mini-batch Gradient Descent 이다.

1) Batch Gradient Descent

이게 일반적인 gradient descent 방법으로 모든 데이터에 대해서 loss를 계산하여 다 다하고 이를 이용해서 gradient descent 하는 방법

2) Stochastic Gradient Descent

Batch Gradient Descent와 극단적으로 대조되는 방법으로 데이터 1개만 뽑고, 그 1개의 데이터에 대한 loss를 이용해서 gradient descent하겠다.

그 1개의 로스가 100만개의 데이터를 이용해서 구한 로스와 비슷할거라는 가정이 들어가는 아이디어다.

이렇게 하면 굉장히 빨리 학습할 수 있다. 데이터 1개 마다 네트워크에 넣어서 weight를 한번 업데이트 할 수 있다.

Batch Gradient Descent 컨셉으로 학습을 한다면 데이터가 100만장이라면 100만장을 넣었을때 겨우 한번 weight가 없데이트 되는 반면에 Stochastic Gradient Descent 컨셉은 100만장을 네트워크에 넣었다면 weight를 100만번 업데이트 할 것이다.

Stochastic Gradient Descent의 문제는 운나쁘게 아웃라이어 데이터로 학습을 한다면 전체 네트워크 weight를(성능을) 망칠 수 있다.

예를 들어서 개냥이 같은 걸로 학습을 한다면 네트워크 성능에 악영향을 줄것이다.

3) Mini-batch Gradient Descent

그래서 Batch Gradient Descent와 Stochastic Gradient Descent 의 절충안으로 나온 컨셉이 Mini-batch Gradient Descent이다. 데이터를 n개를 뽑아서 그 n개의 데이터에 대한 loss를 계산하여 다 더한뒤 이를 이용하여 gradient descent를 한다.

Mini-batch Gradient Descent 방법으로 여러번 학습하면 결국에는 Batch Gradient Descent 한거랑 거의 비슷한 결과가 나온다고 수학적으로 증명이 되어있다.

그래서 이 방법이 가장 많이 쓰이는 방법이다.

4