[TENSORFLOW] Regularization

2017. 4. 9. 01:00machine learning

다항식의 차수를 크게 두면 온갖 곡선을 가지는 형태의 뛰어난 유연성을 가질 수가 있다. 하지만 기계 학습에서는 이러한 학습 모델은 선호하지 않는다. 

모델이 뛰어나게 유연하다는 것은 결국 입력 데이터에 상당히 민감하다는 뜻과 같기 때문이다.

가령 예를 들어 충분히 1차원으로 표현할 수 있는 모델이 10차원의 다항식으로 표현이 된다면 계산 측면에서나 비용 측면에서 해당 모델은 실패하게 된다.


우리는 모델이 너무 뛰어난 유연성을 가지는 것을 막기 위해 regularization을 두어 규제를 한다. 

cost 함수의 기존의 예측 값과 정답의 차이에다가 weight의 값을 제곱한 값을 더함으로써 weight 값이 크게 나타났을 경우에 penalty를 부과하게 된다.

아래의 코드로 좀 더 자세히 살펴보자.


rambda 값이 변할 때 cost의 변화량을 살펴 보기 위한 코드이다. 

코드는 이전에 봤던 코드와 매우 유사하다. 

reg_lambda 변수가 하나 추가 되었고, split_dataset이라는 함수가 하나 추가되었다. cost 함수도 먼가가 약간 수정되었다.

우선 reg_lambda는 위에서 언급했던 바와 같이 모델의 유연성을 규제하기 위한 penalty 역할로 사용이 되었다.

split_dataset은 입력 데이터를 train_data와 test_data로 나누기 위해 정의된다. train_data로 학습이 완료된 모델을 test_data로 평가를 하게 되는데 이런 용도로 대부분 train과 test set을 구분 짓는다.


cost 함수를 살펴보면 정답에서 예측 값을 뺀 값의 제곱의 합에다가 규제항을 더한 값을 train_size * 2로 나누고 있다. 

규제항은 w값의 제곱의 합에 reg_lambda를 곱한 값인데, 이를 통해 w값이 커지는 것을 막을 수가 있다.

마지막에 2 * train_size로 나누는 것은 구지 안해줘도 되는데, gradient_descent를 하기 위해서는 (Y - y_model)의 제곱 값의 변화량을 확인해야 하고 그러기 위해서는 미분을 해주어야 한다. (Y - y_model)의 제곱을 미분을 하게 되면 2(Y - y_model)이 되고 앞의 2를 처리해주기 위해 2를 곱한 train_size로 나눠주고 있다.

마지막의 for문에서는 0 ~ 1 사이의 균등한 숫자 100개를 차례대로 reg_lambda 값으로 입력하면서 각각의 reg_lambda 값에 대한 모델을 학습하고 학습된 결과 모델을 test set으로 돌려서 cost를 확인하는 단계이다. 

규제항을 점점 크게 줄수록 test data에서는 보다 일반화된 모델의 cost를 측정하기 때문에 더 낮은 cost를 얻을 수가 있다. 반면에 규제항을 적게 주게 되면 해당 train data에 적합한 모델이 학습되기 때문에 overfitting에 빠지게 되고 test data에서는 cost가 높아질 수 있다.