Q. 굉장히 많은 데이터를 학습시키려고 한다면 어떻게 학습시켜야 하나요? 데이터 하나하나 단계적으로 학습시켜야 하나요? 



안녕하세요~


이번시간에도 DNN(Deep Neural Network) 모델을 좀 더 효율적으로 학습하는 방법에 대해서 알아보도록 할거에요. DNN을 학습시키려면 방대한 양의 데이터를 학습시켜야 할텐데요. 이때 어떤방식으로 학습시키면 좋은지에 대해서 언급해보려고해요!





<1.Stochastic Gradient Descent (SGD) VS Batch>


1) Stochastic 

이전에 가중치를 업데이트 시켰던 방식을 상기해볼게요. 하나의 입력 데이터가 들어오게 되면 가중치를 업데이트 시켰죠? 이렇게 입력데이터를 하나씩만 처리하면서 가중치를 업데이트 하는 방식을 Stochastic Gradient Descent라고 해요.

               

                   <사진1>




2) Batch (Gradient Descent; BGD)


위와는 다르게 데이터를 많이 갖고 있으면 전체 데이터에 대한 학습을 한번에 하는 방식을 Batch 방식이라고 해요. 아래의 수식을 보면 알 수 있겠지만 오차함수를 미분하여 가중치를 업데이트 할때, 개별 데이터로 하는 것이 아니라 N개의 모든 데이터에 대한 오차함수의 평균을 기준으로 업데이트가 수행되는 것을 알 수 있습니다. 


              


                     <사진2>





<2. Comparison SGD VS Batch>


그렇다면 우리가 이미지를 학습한다고 했을 때, SGD와 Batch의 학습방식에는 어떤 차이가 있을까요? 먼저 SGD에 대해서 살펴보겠습니다. (개별 이미지 데이터, 전체 이미지 데이터라는 용어를 자주 사용할텐데, 여기서 전체 이미지 데이터 image={A, B, C, ..., Z} 는 개별 이미지 데이터 A~Z를 모두 포함한 집합개념으로 보시면 됩니다)



1) Batch (Gradient Descent; BGD)


Batch는 전체 이미지 데이터를 기준으로 가중치를 업데이트하게 됩니다. 우리가 관심있어하는 부분은 개별적인 데이터들에 대한 분류가 아니라 전체 이미지를 모두 분류할 수 있는지가 중요합니다. 다시말해, 전체 이미지를 잘 분류해줄 수 있는 DNN 모델이 필요한 것이죠. 그래서 가중치 업데이트 또한 전체 이미지에 대한 cost값을 기준으로 업데이트하게 됩니다. 이렇게 되면 우리가 원하는 전체 이미지를 분류하는 문제공간이 만들어 지겠죠? 하지만, 이러한 방식에도 문제점이 있습니다.


<사진3. Batch problem space>


첫 번째 문제는 학습시간이 매우 느려진다는 점입니다. 예를들어, SGD 같은 경우는 하나의 데이터를 학습할 때마다 가중치가 업데이트되죠? 이렇게 가중치를 빠르게 업데이트하다보면 학습이 빠르게 끝나는 경우도 있을거에요 (아닌경우도 많아요ㅜ 왜냐하면 개별이미지에 대한 업데이트만 하기 때문에 global opimal value를 찾을 가능성이 낮아지기 때문이에요. 자세한 설명은 SGD를 참고해주세요!). 그런데, Batch 방식 같은 경우에는 모든 데이터에 대한 cost 값을 계산하고 평균을 낸 후에야 한 번 가중치가 업데이트 됩니다. 그렇다보니 모든 이미지데이터들을 순회해야 가중치가 한 번 업데이트 되는 꼴인거죠. (그런데 생각해봐야 할 부분은 이미지같은 경우에는 GPU로 병렬처리해 줄 수 있는 경우가 있기 때문에 이러한 장점이 어떻게 DNN을 학습 할 때 어떤 효과를 일으키는지 더 지켜봐야할 것 같아요~)


               


두 번째는 local minima에 빠지게 되면 빠져나오기 어려워집니다. 그 이유는 SGD에서 설명드릴게요.


<사진4>





2) SGD


SGD는 개별 이미지 데이터를 기준으로 가중치를 업데이트하게 됩니다. 그렇기 때문에 문제공간이 이미지A, 이미지B 이렇게 매번 바뀌게 되는데요. 즉, 파라미터들이 하나의 이미지데이터들을 잘 구분해내려고 파라미터들을 업데이트하게 되는 꼴이됩니다. 그래서 전체이미지에 대한 분류문제가 굉장히 많은 개별이미지에 대한 problem space 집합으로 볼 수 있게 됩니다.


이렇게 복잡한 problem space에서 역시 전체이미지를 잘 분류하기 위한 가중치값(global optimal value)을 찾는다는 것은 굉장히 복잡한 문제로 귀결될 수 있습니다. 또한, 하나씩 데이터를 학습 시키기 때문에 이미지같은 경우에는 GPU를 충분히 활용못 할 수도 있게되죠.


<사진4. SGD problem space>


앞서Batch 방식을 사용하면 local minima에 빠져나오기 어렵다고 말씀드렸죠? 그 이유에 대해서 설명드릴게요. 먼저 왼쪽사진이 Batch가 학습하는 방식입니다. Batch는 모든데이터에 대한 가중치 평균을 계산합니다. 즉, 한 번 cost값을 도출하여 이를 가중치 업데이트에 반영하게되면 두 번째 모든데이터에 대한 cost값은 더 낮을 가능성이 큽니다.


그런데, SGD같은 경우에는 A라는 이미지를 학습했을 때에는 cost가5가 나와서 가중치업데이트를 조금만 할 수 있는 반면에, B라는 이미를 학습했을 때에는 cost가 25가 나올 수 있습니다. 왜냐하면 A라는 이미지를 통해 가중치가 업데이트 되었다고 해도, 이미지B에서는 그 가중치가 적절치 못해 더 큰 cost로 나올 가능성이 충분히 있기 때문이에요 (or 이미지B가 이미지A랑 많이 다른 형태일 수 도 있지요). 그래서 오른쪽 사진과 같이 over shooting이 일어나 local minimum에 빠질 위험이 줄어들게 됩니다. (그런데 오히려 Global optimum value를 찾을 가능성도 현저히 낮아보이네요;;; 


            





<3. Mini-Batch>


위의 두 학습방법에서 제기된 단점을 극복하고자 나온 개념이 Batch와 SGD를 절충한 Mini-Batch라는 학습방식입니다. 모든 데이터에 대해서 가중치 평균을 구하는 것이 아니라 전체 데이터에서 일부데이터를 묶음방식으로하여 데이터 학습을 진행시키게 됩니다.


                 



      

<사진6>


      

마지막은 영상을 보시고 실제 loss가 어떻게 진행되는지 보시면 될 것 같아요. 개인적으로 batch size가 작을때마다 loss가 크게 나오는 이유는 아마 앞서 언급한 "전체이미지에 대한 문제정의(problem space)가 아닌 개별이미지 problem space의 집합인 복잡한 problem space일 가능성이 높기 때문"인거 같아요.


그래서 Batch size를 어떻게 설정해주어야 좋은건지에 대한 연구도 진행되고 있답니다~







지금까지 '많은 학습데이터가 있을때 어떻게 학습시키는것이 좋을지'에 대해서 알아보았어요. 다음장에서는 이전글에서 배웠던 Normalization과 이번글에서 언급했던 Batch라는 개념을 이용하여 Batch Normalization 개념을 이해해보도록 할게요~   


[사진레퍼런스]

사진1,2,

딥러닝 첫걸음

사진3,5

https://arxiv.org/pdf/1712.09913.pdf

사진4

https://hwiyong.tistory.com/9

사진6

https://www.kakaobrain.com/blog/113





+ Recent posts