Batch 란 무엇인가 + Batch Normalization
주워들은 것들은 좀 구어적으로 적고 Baseline은 기반을 닦아서 남이 봐도 무난할 정도로 정리해갈 예정이다.
일단 내가 알고 있는 Batch 를 싺싺 긁어서 풀어보자.
- 학습 네트워크의 하이퍼 파라미터 중 가장 만만한 아이이다. 학습이 시작되면 (대개 나는 vision 이니까) 이미지를 불러오고, 그럼 그 학습 이미지들이 1000장이라고 가정했을 때, 1번씩을 학습한 것을 1 epoch 이라는 단위로 부른다.
이것을 한 명의 사람이 1000페이지의 책을 읽는 과정이라고 치면, 순차적이라는 이유로도 여러가지 애로사항이 핀다.
- 이전의 내용을 잊을 수 있고,
- 반대로 마지막 페이지만 너무 강렬하게 학습했을 수도 있고,
- 느리다.
그래서 batch라는 나눔 기준을 만들어서 batch size 만큼 쪼갠다.
이를 테면 5개의 batch 로 나눈다면 batch size는 200이다. 200페이지를 읽고, 해당 내용을 머릿속에 넣은다음(공부하여 학습한 다음) 또다른 batch를 본다. 중요한건 이게 다음 200~400 페이지가 아니라 400~600 페이지일수도 있음.
그렇게 일부분을 본다음에, 나중에 다시 합치는 공부를 한다.
이것이 GPU를 이용하는 병렬연산에서는 나루토 분신마냥 한 녀석이 하나의 batch를 맡아 익히면서 나중에 합치는 방식으로 학습이 이뤄지는 것 같다. 때문에 rough한 계산을 하자면 분신 5마리 있으면 1시간의 학습시간이 12+a 분으로 축소 되는 것이다.
-그래서 주로 어디다 쓰냐면, 데이터량이 많아 학습시간이 오래걸릴 때 단축하는데 쓴다.
-데이터 input이 너무 커서 나눠쓰는데 쓴다.
-데이터 input size가 클수록 메모리 부하가 크기 때문이다. 1000리 길을 한걸음으로 쪼개는 이유다.
-위 이유 때문에 GPU : CUDA OUT OF MEMORY를 겁나 많이 마주했다. AI관련 회사가면 항상 GPU 좋은 것 달라는 뉘앙스로 (내가) 말하는 것이 저 이유 때문이다. 그런데 좋은 것도 좋은것이지만 나는 gpu가 많이 있었으면 좋겠다. 다루기 힘들기는 하지만 내가 연구자가 된 기분이 들기 때문이다. 그런데 과연 걔네들(gpu)의 결과가 한 샘플당 하나를 대표할 정도로 논리적인 결과인가??? (06/20의오지랖 : 이건 그만큼 내가 학습하기 이전에 정의와 (실험)세팅을 잘해야 한다.)
그렇지 못하다면 단순히 기분이라고 생각해야겠다.
가끔 gpu두개로 학습 하나를 하기도 하는데 이건 수리검 나선환인가...? 이건 나중에 생각해봐야겠다.
아는 걸 긁어보니 별로 아는 게 없는 것 같다.
-배치작업은 데이터를 실시간으로 처리하는게 아니고, 일괄적으로 모아서 처리하는 작어비라고 한다. 일괄처리를 Batch Processing이라고 한다.
-batch size가 큰 경우에는 메모리 부족 문제를 겪을 수 있고 학습 속도가 느려지는 경우가 있다.
-batch size가 작은 경우에는 샘플이 너무 작기 때문에 가중치가 (씨잘데기없이) 자주 업데이트 되어서 비교적 불안정하게 훈련된다고 한다.
---
여기서 끊고 싶지만 전부터 아주 궁금했던 것이 있어서 오늘도 잠을 늦게 잔다!!!
배치 정규화 (Batch Normalization)
2015년 arXiv 발표 후에 ICML 2015에 게제된 논문에서 나온 개념이라고 한다.
https://arxiv.org/pdf/1502.03167.pdf
여기서 Gradient라는 개념을 설명해야하는데, 뇌에 관련 개념이 0에서 1로 생기거나 또는 3에서 4로 수정되는 것, 이 변화량이라고 부를 수 있다. 그라디언트가 크다면 학습이 빨리빨리되는 것이다.
up/down 게임할 때와 비슷하다. 숫자를 팍팍 깎으면 1~1000 에서는 금방 가겠지만 답을 넘어가기도 쉽다. 숫자를 조금씩 깎으면 정답근처도 못가고 남은 기회를 다 써버릴 것이다.
그래서 Gradient는 너무 커지거나 작아지면 안된다. 이것은 Exploding / Vanishing Gradinent라고 하며, 대개 Vanishing Gradient 문제가 자주 발생한다.
layer가 deep 하게 내려가면서 raw level의 input이 가진 특징이 사라지는 것이다. layer가 딥해지는 과정은... 일종의 '이해'하기 위한 추상화 과정이라고 볼 수 있는데 이걸 너무 많이 하면 나중에 원본을 기억못하는 것과 비슷하다. 이를테면.. 나는 생물시간에 마여포를 외었다가 내용이 기억나지 않아 주관식 답을 놓친적이 있다. (말타아제 - 엿당을 포도당으로 분해)
이러한 문제를 해결하기위해 활성화 함수를 기존 비선형(tanh, Sigmoid)에서 선형적인 형태(relu)를 쓰거나 가중치 초기화 를 잘하는 간접적인 방법이 있고, 근본적으로는 Batch Normalization 을 잘하는게 '좋다고' 한다.
--
일단은 여기까지 정리하고, 관련 논문은 주말에 시간이 나면 자세히 보고싶다.
Internal Covariance Shift 라는 현상이 학습 layer마다 이전 층의 출력값들의 분산이 고때고때 달라진다고 하는데, 이 현상이 먼가 복잡하여 아리까리 하기 때문이다.
또한 잘못되었다는 이야기가 있어서, 매우 여유롭게 알아볼 예정이다.
출처 :
https://goodtogreate.tistory.com/entry/Batch-크기의-결정-방법
https://velog.io/@jch9537/한-줄-용어배치Batch란
Batch normalization