본문 바로가기
Main/Machine Learning

[ML - lec 07] ML의 실용과 몇 가지 팁

by 임형욱의 블로그 2022. 3. 13.
본 내용은 김성훈 교수님의 '모두를 위한 딥러닝 시즌1' 강의와
https://pythonkim.tistory.com/notice/25를 참고하여 제작하였습니다.

 

이번 강좌에서는 ML(머신러닝) 알고리즘을 실제로 사용함에 있어서 몇 가지 팁들을 알려 주셨습니다.

내용 구성은 Learning rate 조절과 Data preprocessing(데이터 선처리) 방법 그리고 Overfitting을 방지하는 방법에 대해서 이야기해보겠습니다.

 

 

목차

     

     

    1. Learning rate

    저희가 Cost function을 최소화하기 위해서 Gradient descent라는 알고리즘을 사용했었죠
    이때 이 알고리즘을 정할 때 learning rate라는 알파 값을 임의로 정했습니다.
    이 알파 값을 프로그래밍에서는 그림 상단처럼 나타냈었습니다.
    이 learning rate를 잘 정하는 것이 중요합니다.

     

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

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

    learning rate를 너무 크지 않게, 작지 않게 조절하는 것은 매우 어렵고 많은 경험이 필요한 영역입니다.

     

    learning rate를 정하는 특별한 답은 없습니다. 

    그래도 몇 가지 일반론을 정리하자면
      1. 다양한 learning rate을 사용해서 여러 번에 걸쳐 실행하는 것이 최선
      2. cost가 거꾸로 증가하는 overshooting 현상과 너무 조금씩 감소하는 현상 확인

    을 참고할 수 있겠습니다.

     

     

    2. Data preprocessing

    두 번째로는 우리가 가지고 있는 feature데이터를 선 처리해야 할 이유가 가끔 있습니다.

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

     

    예를 들어서 우리가 가지고 있는 data가 큰 차이를 가지고 있는 data라면 동그랗게 생긴 원의 모양이 아니라 해당 그림처럼 한쪽으로 길게 늘어진 타원 모양이 됩니다.
    이렇게 된다면 수평으로 이동할 때와 수직으로 이동할 때 엄청난 불균형이 발생하게 되어 gradient descent 알고리즘을 적용하기 어려운 상황이 될 수 있습니다.

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

     

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

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

    두 가지 방법에 차이에 대해서 설명하자면

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

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

     

     

    3. Overfitting

    이번에는 머신러닝의 가장 큰 문제점인 Overfitting에 대해서 보여줍니다.
    Overfitting이란 우리가 만든 model이 training dataset에 너무 잘 맞는 경우를 말합니다.
    training dataset에 너무 잘 맞게 돼버리면 실제 사용하는 data에는 맞지 않는 현상이 벌어집니다.
    이것을 Overfitting이라고 부릅니다.

     

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

     

    Overfitting에는 해결책이 있습니다. 
      1. training data가 많을수록 좋다.  
      2. 입력으로 들어오는 변수(feature, x)의 개수를 줄여라.  
      3. Regularization을 사용해라.

     

     

    4. Regularization

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

     

    우리의 목표는 Cost function을 최소화하는 것입니다.
    Regularization을 구현하기 위해서 W에 대해 제곱을 한 합계를 cost 함수에 더하는 것이 전부입니다.
    앞에 상수를 Regularization strength라고 합니다. 이 값이 0이면 일반화하지 않습니다, 1이면 일반화를 중요학 생각하고 0.001이면 조금 신경 쓰긴 하지만 크게 중요하지 않다라고 생각할 수 있습니다.
    이처럼 직접 값을 정할 수 있습니다.

     

     

    5. Training and test sets

    모델을 만들었다면 성능이 어떤지 평가해야 합니다.

    모델을 만들 때도 데이터가 필요하지만, 평가할 때도 데이터가 필요합니다.

    예를들어 이런 형태의 데이터가 있다고 생각합시다. 이런 데이터를 training set이라고 합니다.

    전체 데이터를 training data로 사용했다면, 현재 데이터에 대해 모두 기억을 하고 있다면, 현재 데이터에 대해서 100%의 정확도를 가질 수 있습니다. 그런데, 이게 의미가 있을까요?
    우리의 목표는 새로 들어오는 입력에 대해 결과를 예측하는 것인데, 그런 상황에서도 100% 정확도로 예측할 수 있을까요? 그럴 수 없을 것입니다.

     

    전체 데이터를 2개 영역으로 나누어서 적용하는 것이 중요합니다.
    70% 정도는 학습을 시키기 위한 training set으로, 30% 정도는 학습 결과를 확인하기 위한 test set으로 구성하고 있습니다. 학습 과정에서 잘 나왔다고 test set에 대해서도 잘 동작할지는 알 수 없습니다.
    여러 번에 걸쳐 학습(train)하고, 검증(test)하는 작업을 반복해야 합니다.

     

    6. Training, validation and test sets

    보통 통상적으로 training set과 testing set을 나누는게 일반적입니다.

    지난번에 알파라는 learning rate를 언급을 했었고, 또 하나의 란다라는 Regularization을 얼마나 강하게 할 것인가에 관한 값이 있었습니다.
    이런 값을 튜닝할 필요가 있을 때 보통 training을 두 개로 나누어서 완벽한 training set과 validation으로 나눕니다.
    즉, validation을 가지고 모의실험을 실행하여 알파와 란다 값을 튜닝을 하는 것입니다.

    예를 들자면 마치 학교에서 시험을 볼 때 교과서로 공부하다가 시험 전 실전 모의고사를 보는 것이라고 생각하시면 됩니다.

     

    7. Online learning

    데이터가 너무 많을 때, 전체를 한 번에 처리하지 않고 조금씩 나누어서 처리할 수도 있습니다.
    이것을 Online learning이라고 합니다.

     

    8. MINIST Dataset

    Online Learning은 머신러닝의 대표 예제인 minist dataset을 통해서 확인할 수 있습니다.
    이 경우는 데이터가 너무 크다고 판단해서 10개의 구간으로 나누어서 처리를 하는 방식을 택할 수 있습니다.

     

     

    댓글