이전까지 배치사이즈가 성능에 약간이라도 영향을 주는 것은 알고 있었으나, 왜 2의 제곱의 개수를 사용하고, 어떠한 방식으로 영향을 주며, 크기가 어떨 때 성능이 좋아지고 낮아지는 가는 알지 못하였습니다. 위 모델을 학습하던 도중에 자꾸만 GPU가 OOM이 뜨는 것을 확인하였고, 이러한 사이즈를 조절하다가 찾아보게 되었습니다.

Batch size가 성능에 영향을 주나요?

Batch size의 사용은 가장 큰 이유로는 컴퓨팅 자원의 낭비를 줄이기 위함입니다. 수 많은 데이터들을 한 번에 넣으려면 그만큼의 자원이 필요하고, Gradient를 모두 줄이기가 가능한 컴퓨터는 세상에 없을 것입니다.

또한 Batch size는 성능에도 영향을 주는데 적게 보낼수록 한 번에 줄일 수 있는 Gradient가 한정되어 있기 때문에 Noise가 많이 끼게 되고 성능이 평소보다 낮게 나온다고 합니다. 이렇게 크게 나온 Gradient는 Local Optima를 탈출하는데 도움을 주기도 하지만, Global Optima로 수렴하지 못하기도 하기 때문에 최종적으로는 좋은 성능을 보일 수 없을 때도 많다고 합니다. 또한 최적화를 하는 과정에서 적은 이미지 배치 간의 노이즈는 Gradient를 줄이는데 계속해서 방해를 할 것입니다.

이러한 성능에 영향을 줄 뿐만 아니라 GPU는 본래 유사한 데이터에 대해 병렬화 하는 작업에 능하기 때문에, 8 배치 사이즈의 2배가 16 배치 보다 GPU 연산이 많을수도 있다고 합니다.

도움이 되는 이미지가 있어 첨부합니다.

https://inhovation97.tistory.com/32

https://inhovation97.tistory.com/32

링크 : https://datascience.stackexchange.com/questions/12532/does-batch-size-in-keras-have-any-effects-in-results-quality/12533#12533

Batch size를 2의 제곱으로 할당하는 이유가 있나요?

이것에 대한 이유는 GPU에 데이터를 올리는 작업으로 인해 생긴다고 합니다. GPU는 Physical Processors(PP)라고 불리는 공간을 가지고 있으며, 컴퓨터 내의 데이터들은 Virtual Processors(VP)라고 불리는 공간에 존재합니다. 실제로 작업이 이루어 질때 VP → PP의 공간으로 올려 GPU를 학습하며, 해당 GPU는 아키텍쳐 설계에서부터 보통 2의 배수로 나오게 된다고 합니다. 어쨋든 2의 배수 또는 2의 제곱의 Batch size가 아닌 다른 Batch를 넣게되면 PP에 할당하고 남은 데이터들은 다음 회차에 다시 PP에 올려져서 훈련을 진행하는데 VP에서 보내지는 데이터가 2의 제곱수가 아니라면 잉여 데이터가 생겨, PP에 올라가지 못하고 추가로 학습을 진행해야 하는 경우가 생깁니다.

예를들어 PP = 16이고 VP = 32 라면 2회차만에 PP에 모든 데이터를 올릴 수 있지만, PP = 16, VP= 20이라고 하면 PP는 1회차를 훈련 진행 후 4개의 데이터를 더 받아 2회차 훈련을 진행하게 됩니다. 하지만 4개의 데이터를 올린 4 PP 이외에 나머지 12PP 들은 놀게 되므로, 데이터를 운영하는데 있어서 매우 손실입니다. 따라서 Batch-size를 올릴 떄에는 2의 제곱에 맞게 할당하게 됩니다. ( VP를 정의하는 것과 동일 )

여기서 PP의 배수에 맞게 넣으면 되지 왜 2의 제곱이냐?라는 궁금점이 생기는데, 이는 메모리의 영역 때문이라고 합니다. 참고로 배수가 아니여도, 짝수가 아니여도 훈련은 된다고 합니다. ( 매우 낭비적으로 훈련을 진행할 뿐 ,, )

원문 링크 : https://datascience.stackexchange.com/questions/20179/what-is-the-advantage-of-keeping-batch-size-a-power-of-2