※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.
<Large Scale Machine Learning>
실제 머신러닝 모델을 구현하다보면 상당히 큰 수의 데이터셋을 다룰 일이 생길 것이다.
ex) m = 300,000,000
이번 장에서는 그러한 경우 발생하는 문제와 극복하는 방법을 다루었다.
우선 해당 문제를 다루기 전에 항상 주의해야될 점이 있다.
(1) 적은 수의 데이터셋으로도 충분한 성능의 모델을 구축할 수 있는지.
-> 매우 많은 데이터셋이 아니더라도 충분한 모델을 구축할 수 있다면, 굳이 많은 데이터셋을 사용할 필요가 없다.
(2) 많은 데이터가 도움이 될지, bias 문제는 아닌지
-> 앞서 bias 문제의 경우 데이터의 수를 늘리는 것이 모델의 성능에 큰 도움이 되지 않는다는 것을 다뤘다. 따라서
learning curve 등을 이용하여 bias 문제인지 여부를 검사해봐야 한다.
- Stochastic Gradient descent
Linear Regression의 cost function과 gradient descent 알고리즘은 위와 같다.
파라미터를 업데이트시키는 한 iteration마다 i=1~m까지, 모든 데이터에 대해 sum 연산을 수행한다.
*모든 데이터를 대상으로 하기 때문에 batch gradient descent라고 한다.
* gradient descent를 적용하는 모든 알고리즘에 적용이 가능하다.(예시가 linear regression일 뿐)
이때 m이 매우 큰 300,000,000 정도인 데이터 셋이라면 위 연산은 매우 expensive한 연산이 된다.
이러한 문제를 해결하기 위해 사용하는 알고리즘이 Stochastic Gradient Descent 이다.
Batch Gradient 에서는 한 iteration마다 모든 데이터에 대해 연산을 수행한 후 업데이트를 했다면,
Stochastic gradient descent에서는 한 iteration마다 하나의 데이터에 대해서만 업데이트를 수행한다.
즉, iteration 한 번마다 파라미터를 업데이트하는 수식이 다음과 같다.
$ \theta_j :=\theta_j-\alpha(h_\theta(x)-y^{(i)})x^{(i)}_j $, (for all j =0 ~ n)
위 수식을 적용하기 전, 데이터를 무작위하게 셔플해야 한다. 이 후 순서대로 하나의 데이터에 대해 업데이트를 진행하는 것이다.
전체 데이터에 대해 업데이트하는 과정을 일반적으로 1~10회 정도 수행한다.
Batch에서는 매 업데이트마다 300,000,000개의 데이터에 대해 연산을 수행해야 했다면,
Stochastic Gradient Descent에서는 전체 데이터를 훑는 과정을 대략 1~10회 정도만 수행하는 것이다.
Stochastic Gradient Descent가 진행되면서 파라미터가 global optimum에 근접해가는 과정은 위 그림과 같다.
다음과 같은 특징을 갖는다.
- $ J(\theta)$가 항상 감소하는 것은 아니다.
- global opima 에 근접해가지만, 완벽하게 수렴하지는 않고 그 주변에서 진동한다.
($ \alpha $ 의 크기가 작을수록 더욱 근접하여 진동한다.)
- Mini-Batch Gradient Descent
m이 큰 데이터에 대해 적용할 또 다른 Gradient Descent 알고리즘 중 하나는 Mini-batch gradient descent 알고리즘이다.
Min-batch gradient Descent 알고리즘은 위와 같다.
Stochastic 방식과 비슷하지만, 매 업데이트에서 b개의 example에 대해서 연산을 수행한 후 업데이트한다.
마치 batch와 stochastic 방식의 중간 형태처럼 연산을 수행한다.
그러나 stochstic 방식과 같은 특징을 갖는다. (J 증가 가능, global optima 수렴 x)
또한, Mini-batch의 경우 b개의 데이터에 대해 병렬 처리가 가능한 경우에 Stochastic 방식보다 효율적이라고 할 수 있다.
- Stochastic Gradinet Descent Convergence
Batch Gradient Descent에서는 매 iteration마다 $ J(\theta)$의 증가여부를 보면서 debugging을 할 수 있었지만,
앞서 얘기했듯이 Stochastic Gradient Descent 알고리즘에서는 $ J(\theta)$가 증가할 수 있다.
그렇다면 어떻게 알고리즘의 동작을 확인해야할까?
1000개(예시) 정도의 데이터마다 각 데이터에 대한 cost를 평균으로 계산하여, plot해보는 방식으로 debugging을 수행한다.
plotting의 결과로 예상할 수 있는 내용과 그에 따른 해석은 다음과 같다.
- ①번 그래프
알고리즘이 정상적으로 작동하는 경우, 파라미터가 점점 최적화되고 cost의 평균은 낮아질 것이다.
(cost의 평균은 전체 평균이 아닌, 마지막 1000개의 데이터에 대한 cost의 평균이다.)
빨간석으로 덮어진 그래프가 $ \alpha$가 작은 경우이고 그렇지 않은 그래프가 큰 경우로 볼 수 있다.
$\alpha$가 작으면 초기 단계에서는 업데이트가 천천히 되어 더 큰 cost를 보이지만, 앞서 말했듯 global optima에 더욱 근접하기 때문에 iteration이 반복할 수록 상대적으로 cost가 작아진다.
- ②번 그래프
평균을 내는 기준을 마지막 1000개로 그린 그래프와 그 위에 5000개를 기준(부드러운 형태, 빨간색)으로 했을 때의 그래프이다.
평균을 내는 기준의 수를 늘릴 수록 더욱 부드러운 그래프가 나온다.
- ③번 그래프
②번 그래프와 유사한 경우이다. 평균을 내는 기준을 2-3개 정도로 작게한다면, 수렴해가는 여부를 판단하기 어려울 것이다. 수를 늘리면 밑의 파란 라인처럼 수렴하는게 보일 수 있다.
만약 그렇게 했을 때도 빨간 그래프처럼 점점 작아지지 않는다면 알고리즘의 동작에 문제가 있는 것이다.
$ \alpha$를 조정하거나 아예 모델의 feature를 수정해야 될 수도 있다.
- ④번 그래프
오히려 계속하여 증가하는 경우, 더 작은 \$alpha\를 사용해야 한다.
- non-constant alpha?
$\alpha$가 작을 수록 global optima에 근접한다면, 다음과 같이 iteration이 늘어날 수록 작아지는 값을 사용하면 더욱 global optima에 가까운 파라미터를 구할 수 있을 것이다.
실제로 위 방법을 사용하기도 하고, 효과가 있는 방법이다.
특히, 결국 알파가 0에 가까워지고 global optima와 근접한 한 값에 수렴할 것이다.
그러나 위 식 중 const1과 const2 또한 학습을 위해 조정해야할 새로운 파라미터가 되고, 이는 모델을 까다롭게 만들기 때문에 사용하지 않는 경우도 많다고 한다. 기존 constant 방법도 유효하다.
- Online Learning
Online Learning은 실시간으로 들어오는 데이터를 반영하여 모델을 업데이트하는 방식이다.
Stochastic Gradient Descent 알고리즘에서 한 데이터에 대해 업데이트를 수행했던 것처럼, 들어오는 새로운 데이터에 대해 업데이트를 수행한다.
주로 대규모 웹 사이트에서 사용하는 기법이다.
- Map-Reduce
대규모 데이터에 대한 연산을 처리하는 또 다른 방법으로는 Map-Reduce가 있다.
Batch Gradient Descent 알고리즘을 큰 데이터에 적용할 때 부담이 된 점은 편미분값으로 모든 데이터에 대해 연산을 수행하고 합해야되는 것이다.
그러나 합해야되는 각 값, $(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j $은 서로 영향을 미치지 않는다.
따라서 병렬로 계산을 수행하고, 합치면 그만큼 빠르게 알고리즘이 동작할 것이다.
위 슬라이드와 같이 400개의 데이터에 대해 sum을 구해야한다면, 4개의 컴퓨터가 각각 100개씩 합을 구하고 최종적으로 다시 그 결과를 합하면 400개의 데이터에 대해 연산을 수행한 결과를 4배 더 빠르게 계산할 수 있게 되는 것이다.
(물론 실제로는 network로 인한 지연이 존재한다,
꼭 network를 이용하는 것이 아니더라도, 멀티 코어를 이용할 수도 있다.)
이처럼 큰 데이터셋에 대해 Map-Reduce를 적용하여 연산을 수행하면 알고리즘이 보다 빠르게 동작할 수 있다.
연산이 병렬화될 수 있는 경우라면 Map-Reduce를 적용할 수 있다.
위 식을 보면 Logistic Regression에 대해서도 적용이 가능하다는 것을 알 수 있다.
※ Neural Network의 Forward Propagation과 Backwork Propagation에 대해서도 적용이 가능하다.
각 데이터별로 forward progation을 수행하고, 다시 backword propagation을 수행하는 과정을 i=1~m까지 적용하고, 누적 합을 계산하는 과정이 최종 편미분값을 얻는 과정이다.
m을 4개의 데이터셋으로 나누고, 각 데이터셋에 대해 서로 다른 컴퓨터가 누적합을 계산하고 다시 그 결과들을 합치는 식으로 병렬화를 할 수 있다.
'머신러닝 > Machine Learning(Ng)' 카테고리의 다른 글
[11주차] Application Example - Photo OCR, machine learning pipeline (0) | 2021.08.26 |
---|---|
[9주차 - 2] Recommender System (0) | 2021.08.24 |
[9주차 - 1] Anomaly Detection (0) | 2021.08.23 |
[8주차 - 2] Dimensionality Reduction, PCA (0) | 2021.08.22 |
[8주차 - 1] Clustering, K-means algorithm (0) | 2021.08.21 |