머신러닝 알고리즘 응용


Learning rate

  • Gradient Descent Algorithm에서 cost 값의 최소값을 찾아갈 때 learning rate \(\alpha\) 값을 정의하였음
  • 그림 1처럼 프로그램으로 구현하였으며 learning_rate를 잘 정하는 것이 중요

그림 1  TensorFlow에서 learning_rate를 설정하는 방법

Learning rate가 큰 경우

  • learning rate는 그림 2처럼 곡선의 경사면을 따라 내려가는 간격을 의미
  • 이동하는 간격이 크다면 곡선의 최소점으로 수렴하는 것이 아니라 최소점 근처에서 왔다갔다 할 수도 있다
  • 이동하는 간격이 너무 크다면 곡선 아래가 아닌 위로 발산하는 경우도 생길 수 있다
  • 이와 같은 경우를 overshooting이라고 하며, cost 함수값을 계산하는데 cost 값이 줄어들지 않고 커지는 경우에는 overshooting을 의심해봐야 한다

그림 2  cost function을 구하기 위해 weight 값을 간격을 크게하는 경우


Learning rate가 작은 경우

  • learning rate가 작은 경우에는 경사면을 따라 이동하는 것이 더디게 된다
  • 마치 산에 있는데 해가 질 때까지 하산을 못하는 경우랑 같다
  • 따라서 일정 시간이후에 이동을 멈출 수 밖에 없는데 최저점에 이르지 못한 상태가 된다
  • 이를 회피하기 위해서는 cost 함수값을 출력해서 변화되는 값을 봐야한다. 거의 변하지 않으면 learning rate가 너무 작은 것인지 의심해봐야 한다

그림 3  cost function을 구하기 위해 weight 값을 간격을 작게하는 경우


learning rate 결정에 답은 없다!!

  • 보통 0.01을 사용하는데 데이터에 따라 달라질 수 있어 cost 함수의 값을 보고 결정해야 한다



데이터 전처리(Data Preprocessing)


weight가 1개인 경우와 2개인 경우의 weight-cost 그래프

  • 그림 4에서 오른쪽 파란색 그림은 weight가 1개인 경우의 그래프이며
  • 그림 4의 왼쪽 그림은 weight가 2개인 경우로 등고선처럼 표현 가능
  • 어떤 점에서 시작해 경사면을 따라 내려가서 최저점에 이르는 것이 목표


그림 4  데이터의 특성이 2개($w_1, w_2$)인 경우(좌)와 1개인 경우(우)


weight가 2개인 경우의 weight-cost 그래프 예

  • 예를 들어 그림 5의 왼쪽 표와 같은 데이터가 있다고 해보자
  • 표에서 \(x_1\)과 \(x_2\)의 데이터처럼 값에서 차이가 많이 난다면 \(w_1\)과 \(w_2\)에 대한 그래프는 그림 5의 오른쪽 그래프처럼 옆으로 길쭉한 모양의 등고선 형태가 된다
  • 이 상태에서 learning rate \(\alpha\)값을 잘 못 잡으면 밖으로 튀어가는 수가 있어 데이터를 표준화하는 것이 필요함



그림 4  데이터의 특성이 2개($w_1, w_2$)인 경우의 weight-cost 그래프


데이터 정규화(Data Normalization 또는 Regularization)

  • 데이터 정규화에는 여러 방법이 있다
  • 예를 들어 원시 데이터가 그림 5의 왼쪽 그래프와 같이 분포해 있는 경우에, 많이 쓰는 방법은 그림 5의 가운데 그래프처럼 데이터의 중심이 \(0\)이 위치하도록 하는 하는 방법이다(zero-centered data)
  • 가장 널리 사용하는 방법은 그림 5의 오른쪽 그래프처럼 데이터의 범위가 특정 범위 안에 항상 들어가도록 정규화시키는 방법을 가장 많이 사용한다(normalized data)



그림 5  데이터 표준화 방법의 예



  • learning rate도 잘 잡았는 것 같은데 이상하게 학습이 진행되지 않고 cost 함수의 값이 발산하거나 이상한 동작을 보일 때에는
  • 데이터의 값들 중에 차이가 크게 나는 것이 있는지 보고 전처리를 했는지 살펴보아야 한다

데이터 정규화 방법

  • 데이터를 정규화하기 위해서는 식 (1)을 사용
    • \(x_j\) : 원시 데이터
    • \(\mu_j\) : 원시 데이터의 평균
    • \(\sigma_j\) : 원시 데이터의 표준편차

\begin{eqnarray} x'_j = \frac{x_j - \mu_j}{\sigma_j} \tag{1} \end{eqnarray}

  • 코드는 다음과 같이 사용
x_std[:, 0] = (x[:, 0] - x[:, 0].mean()) / x[:,0].std() 


Overfitting

  • 머신러닝은 학습을 통해서 모델을 만들어 가는 과정이나
  • 학습 데이터에 너무 잘맞는 모델이 만들어 질 수도 있다
  • 그렇게 되면 학습 데이터를 가지고 물어보면 제대로 답을 잘 하겠지만
  • 테스트 데이터로 물어보거나 실제로 사용해보면 잘 안맞는 경우가 다소 있다.


  • 예를 들어 그림 6에서 '+'와 '-'를 예측하는 형태의 문제가 주어졌다고 해보자
  • 일반적으로 그림 6의 왼쪽 그림처럼 구분을 하는 모델(model)이 좋은 모델이라고 할 수 있다
  • 그러나 우리의 모델(model2)이 그림 6의 오른쪽 그림처럼 만들어 졌다면 왼쪽 그림의 모델(model)과 비교했을 때 어떤 모델이 더 좋은 모델이라고 할 수 있을까?
    • model이 좀더 일반적인 모델로 다른 데이터가 들어오더라도 잘 맞는 모델이 될 수 있지만
    • model2는 학습 데이터는 딱 들어맞지만 실제적으로 사용할 때에는 정확도가 떨어질 수 있다
  • 학습 데이터에 딱 들어맞지만 실제 사용시에는 정확도가 떨어지는 모델을 overfitting되었다고 한다

그림 6  overfitting의 예


Overfitting을 막는 방법

  • 학습 데이터를 많이 준비해 학습시켜야 한다
  • 특징(feature 또는 weight)의 개수를 줄인다
  • 데이터를 정규화(regularization)한다


Regularization

  • weight를 너무 크게 만들지 말자
    • 그림 7과 같은 학습 데이터에 맞게 decision boundary를 막 구부리는데 구부리지 말고 펴도록 해야 한다
    • 곡선을 편다는 이야기는 weight이 작은 값을 가지며
    • 곡선을 구부린다는 이야기는 어떤 값에서는 weight 큰 값을 가진다는 것을 의미


그림 7  overfitting의 예


  • 학습을 한다는 것은 cost 함수를 최적화시킨다는 것인데 cost 함수 계산식에 정규화를 위한 항을 추가시킨다
    • 추가되는 항은 그림 8과 같이 weight의 element들을 제곱해서 더한 다음 regularization strength \(\lambda\)를 곱한 값이다
      • \(\lambda=0\)이면 regularization을 사용하지 않게 되며
      • \(\lambda>1\)이면 regularization을 굉장히 중요하게 생각해 사용하며
      • \(\lambda\)이 적당한 값이면 regularization을 사용하지만 크게 중요하게는 생각하지 않는다는 의미
  • TensorFlow에서는 그림 8처럼 l2reg를 정의해서 사용하면 된다


그림 8  cost 함수에 regularization을 위한 항이 추가된 식과 파이썬 코드




머신러닝 모델의 평가 방법


  • 머신러닝 모델을 만든 다음에 데이터를 가지고 학습을 시킨다
  • 학습된 모델을 어떻게 평가를 할 수 있을까?


학습 데이터를 사용한 모델 평가 방법의 예

  • 그림 9와 같은 데이터를 학습 데이터로 사용하여 모델을 학습시킨 다음에
  • 다시 학습 데이터(예: 1600)를 가지고 머신러닝 모델에 물어보게 되면 모델이 답을 하거나 예측을 할 수 있게 된다
  • 이런 방식으로 물어보게 되면 정말로 공정한 평가 방법일까?
    • 학습 데이터로 모델을 평가하게 되면 거의 100% 확실한 답을 내게 될 것이다
    • 학습 데이터를 통째로 저장하고 있으면 되기 때문에 가능
  • 즉, 학교에서 시험을 보고 똑같은 문제로 시험을 다시 보는 것이랑 유사하기 때문에 좋은 평가 방법이 아니다



그림 8  학습 데이터로 머신러닝 모델을 학습시키고 평가하는 예


머신러닝 모델 평가 방법

  • 시험을 보는 방법과 똑같은 방법으로 평가해야 한다
  • 학습 데이터를 70:30으로 나누는데 70%를 학습 데이터 셋(training data set)라 하고, 30%를 테스트 데이터 셋(test data set)라고 한다
  • 그림 9와 같이 70%의 학습 데이터 셋을 가지고 모델을 학습시키고 학습이 끝난 후에 테스트 데이터 셋에 대한 모델의 예측값과 실제의 값을 비교하여 성능을 평가해야 한다

다시 학습 데

그림 9  학습 데이터 셋과 테스트 데이터 셋으로 구분하여 학습시키고 평가한다


Traing과 validation, test set의 차이

  • 일반적으로 traing set과 test set으로 나눈다
  • learning rate와 regularization strength를 사용하는 경우, 모델 튜닝을 위해 training set을 training set과 validation set으로 나눈 다음 training set으로 학습을 시킨 다음 validation set으로 모의 시험을 한 후, 제대로 동작하면 test set으로 최종 평가를 한다
    • validation은 모의 평가시험이라 생각하면 된다


그림 10  학습 데이터 셋과 검증 데이터 셋, 테스트 데이터 셋의 차이


온라인 학습(online learning)

  • 학습 데이터가 너무나 많은 경우에 한번에 다 학습을 시키기 어려운 경우가 있다
  • 예를 들어, 그림 11과 같이 100만개의 데이터가 있는 경우 10만개 씩 데이터를 나누어 순차적으로 학습을 시킨다
  • 이 때 모델이 해야할 일은 첫번째 학습 결과가 남아 있어 모델이 두번째 학습을 할 때 첫번 째 학습에 반영이 되어야 한다
  • 이런 형태의 학습을 온라인 학습이라고 한다


그림 11  온라인 학습 방법



정확도(Accuracy)

  • 테스트 데이터 셋을 통해 모델의 정확도를 측정할 수 있다
  • 보통 95~99% 수준이 되어야 한다


+ Recent posts