Machine Learning/ 알고리즘 발전 시키기

Vectorize

  • Σ로 표현되는 식을 벡터로 표현할 수 있는 경우 –벡터는 n x 1 행렬이므로 사실상 행렬– 벡터로 변환하여 계산하면 식 자체가 간편해 질 뿐더러, 행렬의 병렬처리를 지원하는 프로그램을 사용하면 성능에서도 유리하다.
    • 예컨대 아래의 식을
      • h_{\theta}(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3^2 + ...
    • 벡터화 하면 아래와 같이 표현 가능하다.
      • \theta = [ \theta_0; \theta_1; \theta_2;  ... \theta_n ]
      • X = [ x_0; x_1; x_2; ... x_n ]
        • x0는 정의상 1과 같다.
      • h_{\theta}(x) = \theta^T X
  • hθ(x)를 Vectorize 했다면 비용함수 J(θ)도 벡터로 간단하게 할 수 있다.
    • 아래의 기존 식을
      • J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta (x_i) - y_i)^2
    • 벡터화하면 아래와 같이 표현 가능하다.
      • y = [ y_1; y_2; ... y_n ]
      • J(\theta) = \frac{1}{2m} ((\theta^T X - y)^2)
        • 행렬의 제곱은 .^ 이라는 연산을 이용한다. 프로그램적으로 ‘.’ 은 element 연산을 의미한다.
  • 프로그램상 Σ 연산은 for 문을 도는 형식이 되며, 행렬 연산을 지원하는 프로그램의 경우 Vector 연산은 병렬로 처리가 된다.
  • 물론 행렬 계산은 역행렬 계산과 같은 상황에서 부하가 많이 걸리지만, Octave와 같은 프로그램에서는 pinv 와 같은 함수로 계산해 pseudo 값을 계산해 주므로 행렬 계산에 익숙해질 필요가 있다.

Data Set 분류

  • 데이터셋 전체를 훈련(Training)에만 사용하면 훈련 데이터에만 최적화된 Overfiting된 결과가 만들어 질 수 있다. 이것을 방지하기 위해 전체 데이터 셋의 70%만 훈련용으로 사용하고 나머지는 30%는 시험(Test) 용으로 사용하여 훈련된 결과를 시험하여 Overfiting 여부를 판별한다.
    • 시험도 비용함수를 이용하여 계산하는 것은 마찬가지다.
    • 다만, 선형 회귀할 때는 모든 에러를 다 더해서 평가를 하고, 로지스틱 회귀일 경우에는 0인지 1인지에 대한 갯수를 세는 식으로 평가를 한다.
  • 만일 여러 모델을 만들고 그 모델들 사이에 우수한 것을 고르는 식으로 하는 경우엔 교차 검증(Cross Validation)이라는 것을 따로 두어서 모델들 사이에 경쟁할 때 교차 검증용으로 사용하고, 최종 결정된 모델에 대해 시험을 적용하여 결과를 판별한다. 데이터 셋을 6:2:2로 분배
  • 결국 전체 Data Set을 한번에 사용하지 말고 나눠서 검증하라는 이야기

Bias vs Variance

https://www.coursera.org/learn/machine-learning/

  • 알고리즘의 Bias가 높다는 것은 알고리즘이 아예 안 맞는다(Underfitting)는 이야기고, 알고리즘의 Variance가 높다는 것은 알고리즘이 특정 데이터 셋에만 과도하게 적합(Overfitting) 하여 훈련용 데이터 외의 다른 데이터에는 잘 적용되지 않는다는 이야기이다.

https://www.coursera.org/learn/machine-learning/

  • 알고리즘이 Bias가 높은 상태인지, Variance가 높은 상태인지는 훈련용 이외의 데이터를 적용해 보면 간단하다. 훈련용 데이터 셋에서조차 비용이 높게 나온다면 그것은 Underfitting 상태인 것이고, 훈련용 데이터 셋에서는 비용이 낮지만 교차검증용 데이터 셋에서 비용이 높다면 그것은 Overfitting 된 상태인 것.
  • Bias가 높은 상태라면
    • 다항식의 차수를 높이거나,
    • feature를 추가하거나,
    • Regularization의 λ 값을 작게 하는 방법을 사용해 볼 수 있다.
      • λ가 극단적으로 작아져서 0이 된다고 치면 Regularization 값은 적용이 안되는 것과 마찬가지 상태가 된다.
    • Bias가 높은 상태라면 훈련용 데이터 셋을 늘린다고 도움이 되지 않는다.
  • Variance가 높은 상태라면
    • 훈련용 데이터를 더 많이 모으거나
    • feature를 줄여보거나
    • Regularization의 λ 값을 크게 하는 방법을 사용해 볼 수 있다.
      • Regularization은 과도하게 적합한 상태를 좀 더 완만한 상태로 바꾸는 역할을 하는데, λ 값이 적당하게 커지면 적당한 fitting이 되지만, 과도하게 커지면 underfitting으로 넘어갈 수 있다.

Skewed Data

https://ko.wikipedia.org/wiki/정밀도와_재현율

  • 애초에 빈도가 낮아서, 열심히 알고리즘 모델을 만들고 계산한 결과가 단순히 모두 true (혹은 모두 false) 라고 할 때 보다 정확도가 높게 나오지 않는 상황을 skewed 라고 한다.
    • 예1) 열심히 날씨 예측을 해도, 1년 내내 ‘비 안 옴’ 이라고 예측한 것보다 확률이 낮은 경우.
    • 예2) 암환자 진단을 해서 99%의 정확도가 나왔지만, 애초에 암환자가 0.5% 였다면 모두 암환자가 아니다라고 해도 99.5%의 정확도가 나온다.
  • 이런 경우에는 정밀도(precision)과 재현율(recall)이라는 개념을 통해 알고리즘의 정확도를 측정한다.

https://ko.wikipedia.org/wiki/정밀도와_재현율

  • 정밀도란 실제 알고리즘이 양성이라고 판별한 것 중에 실제 양성인 것의 비율을 의미하며
    • \frac{True Positive}{True Positive + False Positive}
    • 실제 양성인데 알고리즘이 양성이라고 판별한 것과 실제로는 음성인데 알고리즘이 양성이라고 판별한 것을 합한 것이 정밀도.
  • 재현율이란 전체 양성인 것들 중에 알고리즘이 양성이라고 판별한 것의 비율을 의미한다.
    • \frac{True Positive}{True Positive + False Negative}
    • 실제 양성인데 알고리즘이 양성이라고 판별한 것과 실제로 양성인데 알고리즘이 음성이라고 판별한 것을 합한 것이 재현율.
  • 완전한 상관관계는 아니지만 정밀도와 재현율은 trade-off가 발생한다.
    • 정밀도를 높이면 재현율이 낮아지고, 재현율을 높이면 정밀도가 낮아지는 경우가 발생한다.
  • 이 둘이 상관관계를 갖고 있기 때문에 이 둘을 합쳐서 하나의 수치로 만들 수 있는데, 그것을 F1 Score라고 한다.
    • F_1 = 2 \cdot \frac{1}{\frac{1}{recall} + \frac{1}{precision}} = 2 \cdot \frac{precision \cdot recall}{precision + recall}
    • F1 Score는 0 ~ 1 사이의 값을 갖는다.
    • F1 Score 공식은 조화 평균의 공식이다.

Stochastic Gradient Descent

https://www.coursera.org/learn/machine-learning/

  • 이전에 사용했던 Gradient Descent는 전체 데이터에 대하여 연산을 한 후 이동을 하는 방식. 이런 방식을 Batch Gradient Descent 라고도 한다.
  • 이 방식은 데이터 양이 많아지는 경우 –수억 단위의 데이터– 연산 속도가 매우 느려지는 문제가 발생한다.
  • Stochastic Gradient Descent는 좀 더 계산을 덜 하는 방식으로 전체 데이터에 대해 연산한 후 이동하는게 아니라 개별 데이터에 대해 연산하면서 바로 θ를 업데이트 해주는 방식.
    • 전체를 합산하지 않기 때문에 연산이 빠르지만, 오차가 있기 때문에 Batch Gradient와 달리 매번 minimum 지점으로 움직이지는 않는다.
    • 지그재그로 움직이는데 데이터 양이 워낙 많아서 장기적으로 봤을 때 minimum으로 수렴하게 됨.
    • 만일 이 오차가 크다고 느껴진다면 Batch Gradient를 특정 개수 –예컨대 10개씩– 단위로 묶어서 계산하는 방식을 사용할 수 있는데, 이러한 방식을 Mini-batch라고 한다.

Online Learning

  • 고정된 데이터가 아니라 stream 형 데이터를 처리할 때 사용하는 방법을 Online Learning이라고 한다.
  • 기본 개념은 Stochastic 과 동일한데, 한 번 사용한 데이터는 어딘가에 저장하지 않고 버린다는 특징이 있다.
  • stream 형 데이터이기 때문에 매번 새로운 데이터가 들어와서 알고리즘을 업데이트하고, 한 번 사용한 데이터를 어딘가에 저장하지 않고 버리고, 또 새로운 데이터를 이용해서 알고리즘을 업데이트 하는 식으로 진행한다.
  • 지속적으로 학습이 되고 있기 때문에, 아주 많은 데이터를 처리하기에도 유용하고, 사용자들의 최신 데이터를 반영하기에도 유용하다.

Map Reduce and Data Parallelism

https://www.coursera.org/learn/machine-learning/

  • 대량의 데이터를 하나로 처리하는게 아니라 여러 개로 나누어 여러대의 컴퓨터에서 병렬적으로 처리하고 다시 합치는 것이 Map-Reduce.
    • Σ로 된 부분을 특정 개수로 나누어서 각각의 컴퓨터에서 연산을 따로 한 후 그걸 다시 합친다. 당연히 이렇게 연산을 분해한 후 합칠 수 있는 부분에 대해 가능하다.
  • Hadoop이 이런 개념이라고 한다.
[ssba]

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.