17. 학습 rate, Overfitting, 그리고 일반화 (Regularization) (lec 07-1)


cost를 계산하고 gradient descent 알고리듬을 구현하는 과정에서 고민했던 몇 가지 문제점들에서 대해서 이번 글에서 해소할 수 있었다.


gradient descent 그래프와 알고리듬을 텐서플로우로 구현했을 때의 그림이다. 여기서 learning rate은 변수 이름 그대로 learning_rate이 담당하고, 여기서의 값은 0.001이다. 다음 그림들에서는 이 값에 따라 달라지는 상황들에 대해 말씀하신다.


learning rate은 단순하게 보면 숫자에 불과하고 그 숫자는 프로그래밍에서처럼 "크다, 작다, 같다"의 3가지로 나누어질 수 있다.

왼쪽 그림은 learning rate이 너무 클 때의 그림으로, overshooting 현상이 발생하는 것을 보여준다. 보폭이 너무 크면 최저점을 지나 반대편 경사면으로 이동할 수 있게 되고 심할 경우 경사면을 타고 내려가는 것이 아니라 올라가는 현상까지 발생할 수 있다. overshooting은 경사면을 타고 올라가다가 결국에는 밥그릇을 탈출하는 현상을 말한다.

오른쪽 그림은 너무 작을 때를 보여준다. 한참을 내려갔음에도 불구하고 최저점까지는 아직 멀었다. 일반적으로는 조금씩 이동하는 것이 단점이 되지 않는데, 머신러닝처럼 몇만 혹은 몇십만 번을 반복해야 하는 상황에서는 치명적인 단점이 된다. 최저점까지 갈려면 한 달 이상 걸릴 수도 있으니까.

learning rate을 너무 크지 않게, 그러면서도 작지 않게 조절하는 것은 무척 어렵고, 많은 경험이 필요한 영역이다. 그림에서는 overshooting이 더 안 좋은 것처럼 설명되지만, 실제로는 overshooting이 발생하면 바로 알아챌 수 있기 때문에 문제가 되지 않는다. 오히려 learning rate이 작은 경우에 늦게 알아챌 수가 있다. 마치 정상적으로 내려가는 것처럼 보이니까. 두 가지 모두에 있어 여러 번의 경험을 통해 적절한지 혹은 적절하지 않은지에 대한 안목을 키우는 것이 최선이다.


적당한 learning rate을 찾는 것이 얼마나 중요한지 알았다. 그렇다면 learning rate을 찾기 위한 방법들에는 어떤 것들이 있을까? 나도 굉장히 놀란 부분인데, 특별한 방법은 전혀 없다. 교수님께서도 답답한 부분일거라고 생각한다. 몇 가지 일반론을 정리해 주셨다.

  다양한 learning rate을 사용해서 여러 번에 걸쳐 실행하는 것이 최선
  cost가 거꾸로 증가하는 overshooting 현상과 너무 조금씩 감소하는 현상 확인

그림에 있는 reasonable이라는 단어는 얼마나 모호한지.. 합리적 또한 합당한 learning rate이라는 것이 얼마나 주관적인 것인지 모두 알 것이다. 이 말은 머신러닝에 대해 많은 경험을 쌓아야 한다는 말과 같다. 교수님께서는 누구나 할 수 있다고 하셨는데, 나에게는 누구나 할 수 있는 것은 아닌 것처럼 보인다.


이번 그림부터는 데이터 선처리(preprocessing)에 대해서 설명하신다. preprocessing이라고 하는 것은 어떤 일을 본격적으로 하기 전에 진행되는 준비 작업을 가리킨다. 요리를 한다고 하면, 요리하기 전에 가스불을 점검하고 칼을 갈아놓고 빠진 양념을 확인하는 것들을 말한다.

multi-variables 모델에서, 변수라고 부르는 feature가 여러 개 있는 경우의 그래프는 위의 그림처럼 등고선 내지는 3차원 입체 이상으로 표현되어질 수밖에 없다. 등고선의 한 점에서 gradient descent 알고리듬으로 등고선의 중심인 최저점을 향해 간다고 할 때 매끄럽게 보이는 직선처럼 이동하는 것은 매우 어려울 수밖에 없다.


x1 변수는 10보다 작은 숫자, x2 변수는 -5000에서 9000까지의 숫자라면 진짜 동그랗게 생긴 원의 모양이 아니라 한쪽으로 길게 늘어진 타원 모양이 된다. 이렇게 된다면 수평으로 이동할 때와 수직으로 이동할 때 엄청난 불균형이 발생하게 되어 gradient descent 알고리듬을 적용하기 어려운 상황이 될 수 있다.

등고선으로 표현할 때, 가장 좋은 형태는 완변하게 둥근 원(circle)이다. 수평과 수직으로 동일한 범위를 갖게 만들면 가장 이상적인 원이 된다. gradient descent 알고리듬을 적용하기 전에 preprocessing 작업으로 데이터의 범위를 제한할 수 있다.


데이터를 preprocessing하는 두 가지를 보여준다. 최초 데이터는 중심에서 빗겨있는 상태이고, 한쪽 방향으로 길게 늘어진 형태이다. 데이터 전체가 중심에 올 수 있도록 이동시킬 수도 있고, 원에 가까운 형태로 만들 수도 있다.


Feature Scaling은 변수의 범위를 일정하게 혹은 비교할 수 있도록 만드는 것을 말한다. Normalization(Re-scaling)과 Standardization의 두 가지가 있는데, feature scaling 자체를 Data-Normalization으로 부르기도 하기 때문에, standardization을 normalization으로 호칭할 수도 있다.

아래 그림의 출처(http://gentlej90.tistory.com/26)


중요하니까, 설명 하나 더 추가. 설명을 빌려온 사이트(https://brunch.co.kr/@rapaellee/4). 길지 않게 잘 설명하고 있으니 꼭 가서 볼 것.

  Normalization
  수식 : (요소값 - 최소값) / (최대값 - 최소값)
  설명 : 전체 구간을 0~100으로 설정하여 데이터를 관찰하는 방법으로, 특정 데이터의 위치를 확인할 수 있게 해줌

  Standardization
  수식 : (요소값 - 평균) / 표준편차
  설명 : 평균까지의 거리로, 2개 이상의 대상이 단위가 다를 때, 대상 데이터를 같은 기준으로 볼 수 있게 해줌

김성훈 교수님은 standardization에 대해 설명하셨고, 앤드류 교수님은 normalization에 대해 설명하셨다. 그래서, 두 가지 모두 중요한 방법이다.


이번 그림부터는 머신러닝의 가장 큰 문제점인 overfitting에 대해서 보여준다. 우리가 만든 모델이 training dataset에 너무 잘 맞는 경우를 말한다. 너무 잘 맞을 때 문제가 되는 이유는, 정말 잘 맞추기 위해 과도하게 복잡해지기 때문이다. 그래서, 실제로 사용할 때는 오히려 맞지 않는 현상이 벌어지는데, 이것을 overfitting이라고 부른다.


많은 수의 데이터가 정확하게 그룹지어서 있을 수 있을까? 그림에서 보는 것처럼 어느 정도는 섞여있을 수밖에 없고, 완벽하게 예측한다는 것이 불가능함을 보여준다. 이런 상황에서 완벽하게 맞추기 위해 그림 오른쪽처럼 선을 구부리는 것처럼 모델을 구성할 수도 있다. 이럴 경우, 실제 사용에서 예측하게 되는 데이터에 대해서는 오히려 그림 왼쪽에 있는 단순한 직선보다도 예측을 잘 못하게 된다.


overfitting에는 해결책이 있다. learning rate에서는 꽤나 암담했었다.

  . training data가 많을 수록 좋다
  . 입력으로 들어오는 변수(feature, x)의 갯수를 줄여라
  . Regularization을 사용해라


Regularization은 W(weight)가 너무 큰 값들을 갖지 않도록 하는 것을 말한다. 값이 커지면, 그림에서 보는 것처럼 구불구불한 형태의 cost 함수가 만들어지고 예측에 실패하게 된다. 머신러닝에서는 "데이터보다 모델의 복잡도(complexity)가 크다"라고 설명한다. 과도하게 복잡하기 때문에 발생하는 문제라고 보는 것이다. 다시 말하면, Regularization은 모델의 복잡도를 낮추기 위한 방법을 말한다.


모델을 구축했을 때의 3가지 경우를 보여준다. underfitting은 너무 대충 맞춰서 error가 많이 발생하는 현상을 말하는데, 일부러 그럴려는 사람은 없기 때문에 underfitting이 발생하는 것은 머신러닝에 대한 지식 부족일 확률이 높다. 반면, overfitting은 너무 잘 맞춰서 error가 거의 발생하지 않는 현상으로, train dataset에 대해서는 완벽하지만 test dataset을 비롯한 나머지 데이터에 대해서는 underfitting처럼 많은 error가 발생하게 된다.

W가 크면 예측하려는 값(y hat)이 정상적인 규칙으로부터 벗어나 있는 경우에도 예측이 가능하다. 그러나, 비정상적이거나 애매한 위치에 있는 데이터를 올바르게 예측하는 것을 '맞았다'라고 얘기할 수는 없다. 오히려 '틀렸다'라고 얘기하는 것이 더욱 좋을 수 있다. 이럴 경우 training dataset에 특화된 overfitting 현상이 발생한다. 가장 이상적인 경우는 최소한의 에러를 인정하는 'Just right'이다.


Regularization을 구현하는 것은 매우 쉽다. cost 함수가 틀렸을 때 높은 비용이 발생할 수 있도록 벌점(penalty)을 부과하는 것처럼 W에 대한 값이 클 경우에 penalty를 부여하면 된다.

W에 대해 제곱을 한 합계를 cost 함수에 더하는 것이 전부다. 다만 합계를 어느 정도로 반영할지 결정할 수 있어야, 사용하는 시점에서 다양한 적용이 가능하다. 람다(λ)라고 부르는 값을 사용해서 얼마나 penalty를 부여할 것인지 결정할 수 있다.