임베딩이나 하이퍼 돌릴때 Batch size 1이 뭐지? 더 늘릴까? 하고 늘렸다가 메모리부족 뜨는걸 체험해본 사람들이 있을것이다

Batch size는 모델이 하나의 Batch에 포함할 이미지수를 뜻하는데, Batch size가 크면 모델이 모든 이미지들을 훑어본 다음 그 이미지들의 평균에 대한 loss를 측정하여 모델을 수정한다. 좋게 말하면 효율적으로 훈련 이미지들의 공통점을 찾아 학습할 수 있다는 점이고, 나쁘게 말하자면 오버핏하기가 조금 쉽다.

반대로 Batch size가 1이 되면 모델이 이미지 하나를 보고, 모델 수정하고, 이미지 하나 보고, 모델을 수정하는 과정을 반복하게 된다. 그래서 시간이 엄청 오래 걸리지만, 잘만 하면 꽤 정확도가 높은 결과가 나온다. 그러나 이 정확도에는 함정이 있는데, 완벽한 데이터셋을 기준으로 하면 batch size가 적을수록 더 뛰어난 결과를 보이겠지만, 데이터셋에 노이즈가 들어간다면 batch size가 작을수록 영향을 더 크게 받아서 정확도가 떨어지게 된다. 데이터가 많으면 많을수록 퀄리티가 떨어지는 이미지들이 몇 개 섞일수밖에 없기도 하고, 이미지수가 적은데 거기에 이상한 이미지나 태그가 섞여있다면 정말 영향을 크게 받는다.


결론은 batch size가 1이면 덜 오버핏하게 되지만, 데이터의 퀄리티에 굉장히 민감해지고, 최악의 경우에는 가장 이상적인 값을 찾지 못한채로 최상과 최악의 결과를 반복하는 진동 상태에 놓이게 된다. 로스 그래프가 특정 범위에서 요동친다면 이것 때문이고, batch size를 유지한상태에서 이걸 해결할 방법은 데이터셋을 더 잘만들거나 학습률(lr)를 더 낮게 조절하는 법, 그리고 gradient accumulation밖에 없는데 누가 이거 만들어주라...


챈에서 이미지가 갑자기 뻘겋게 변한다던가 형태가 깨지는걸 오버핏이라고 하는 사람들이 많이 보이는데 나는 그게 오히려 모델이 최적값을 못찾고 방황하고 있거나, local minimum에 빠진거라고 생각함(모델이 함정에 걸려서 ㅈ된거임)

오버핏의 기준은 생성된 이미지가 학습 이미지랑 너무 비슷해서 다른 태그들을 씹는 경우임. 근데 이건 loss값으로 확인할수는 없고 직접 실험해봐야함. 만약 같은시드로 원본이미지랑 포즈가 달라지는 지점이 오버핏의 시작이라고 생각됨.


주저리 주저리