리피트(repeat), 에포크(epoch) 그리고 배치(batch)와 버킷(bucket)

# 들어가기 앞서 Ai시대에 대하여

좋은 시대가 왔다. AI의 발전으로 이제 사람들은 정보를 찾기위해 인터넷의 바다를 헤메기보다

직접 AI에게 물어보는 시대가 왔다. 물어볼곳도 많고 무료버전으로도 굉장한 성능을 준다. 거기에 유료는 말할것도 없다

하지만 그럼에도 완전히 AI에게 의지하지 못하는 몇가지 이유중 가장 심각한건 '환각'현상이다.

대답거리가 없음에도 대답을 내놓아야하는 현실에 AI가 택한 선택은 뻥치는거란거다

눈을 흐리게 뜨고 환각으로 보며 개소리로 대답을 한다. 덕분에 구라를 듣고 그대로 했다가 안되는 경우가 많아

그대로 믿을 수가 없다는 인식이 굳어졌다. 그것이 대답거리가 희귀한 마이너한 분야면 말할것도 없다

그래서 로라학습에 대한 것중 기초적인 리피트와 에포크의 동작에 대해서도 제대로 알지 못했다

하지만 시대가 바뀌었다(고작1-2년이지만) 이젠 AI의 성능도 비교할수 없거니와 무엇보다 코드를 통째로 분석하는

능력이 등장했다. 그말은 이제 인터넷에서 주섬주섬 없는 정보를 얻기보다 학습툴의 코드를 주고

코드를 분석하면 환각없이 정확하고 쉬우며 예시까지 제공되는 고급 정보를 얻을 수 있는 시대라는 것이다

이글은 그에 입각해 코드를 분석해 쓴 글이므로 99% 정확하다고 할 수 있다(100%는 세상에 없어)

 

# 10리피트,1에포크와 1리피트,10에포크의 차이

결론적으로 말하면 차이는 분명하다. 이전에는 없다는 인간들의 글들이 많았고

AI는 있다고 하는 쪽이었는데 환각때문에 긴가민가했다면 이제는 확실하다

AI가 맞았었다.

차이는 크게 두가지 요인에서 발생한다

1. 절대적 스텝량이 서로 달라지는 수치적인 차이

2. 이미지가 중복으로 포함되어 학습편향이 일어나는 확률적 차이

 

스텝량을 정하는 kohya로라 훈련툴의 코드는 다음과 같다

ceil(len(bucket)/batch)

ceil은 그냥 올림처리한다는 말이고 핵심은 뒤의 버킷길이(len(bucket))와 배치(batch)에 있다

배치가 1이고 버킷도 하나라면 10리핏1에폿과 1리핏10에폿의 차이가 없는 것은 맞다

하지만 그렇게 학습하는 사람은 거의 없다. 자료가 그렇게 딱 떨어져주지가 않기 때문이다.

그래서 결국 버킷수와 배치수가 필연적으로 1이상이 되는데 그렇게 되면 바로 차이가 발생한다

 

# 스텝수로 인한 차이

  • 버킷 1개, 이미지 25장, 배치 8
  • A: repeat=1, epoch=10 -> 10 * ceil(25/8)=40 step
  • B: repeat=10, epoch=1 -> ceil(250/8)=32 step
  • 학습량부터 다름

예시처럼 25장에 배치 8로 할 경우, kohya 공식에 그대로 넣으면

A(1리핏 10에포크)의 경우 40스텝이 나오고, B(10리핏, 1에폿)의 경우 32스텝이 나온다

즉, A와 B는 스텝수가 달라지고 학습량도 차이가 나게 된다.

 

# 리피트로 인한 중복이미지 확률여부

8배치라고 치면 8장을 랜덤으로 뽑아서 1스텝훈련을 시킨다. 이때 kohay코드에서는 1리피트일때 동일버킷의 이미지가 8이상이라면 8장에 중복이 나오지 않게 뽑는다

(train_util.py (line 1571))

버킷내의 이미지가 전부 유일하기 때문이다. 

하지만 리피트가 적용되면 kohay는 버킷의 이미지를 리핏수만큼 복제해서 채운다

그리고 이제 그걸 셔플한후 8장을 랜덤으로 뽑는다

만약 8리핏이라면 해당 버킷내에는 동일한 이미지가 8장씩 들어있는 셈인데

이에 대한 방어코드는 확인되지 않았으니 최악의 경우 랜덤으로 뽑은 8장이 전부 동일한 이미지일 확률도 존재한다

이는 스텝총량이 많아지면서 확률적으로 무마되긴하지만

리피트가 높을수록 과적합 확률이 높아지는 이유가 된다

 

# 이것이 끝이 아니다! bucket! bucket!

사실 가장 큰 문제는 버킷이다. 케릭터로라를 만든다치자. 얼굴을 크롭하는건 거의 필수라고 할 수 있다

그렇다면 당연히 각 훈련이미지들의 크기가 달라진다. 그리고 유사한 크기들의 이미지모임이

바로 버킷이다. 이 버킷그룹들은 다른 그룹과 독립적으로 그 그룹안에서만 훈련된다.

문제는 이제 버킷그룹들의 수가 다른 경우다. 그리고 사실상 일부러 맞추지 않는 이상 다를수밖에 없다

그림이 100장이라도 1번 버킷 그룹이 1장이라면 8배치가 오히려 독이 된다

1번 버킷 훈련시의 8배치내의 모든 그림이 동일한 1장으로 채워지기 때문이다.

반면 1번그룹이 99장이라면 해당 그룹은 거의 다른 그림 8장으로 1스탭을 훈련한다.

결국 1번 버킷의 그 한장은 다른 버킷의 그림들에 비해 매우 높은 빈도의 훈련대상이 된다.