주의)설명을 쉽게 하기 위해 일부 내용의 변형이 들어있습니다


학습을 자주 하다 보면 텐서보드를 참고하는 일이 많습니다.

텐서보드에는 주로 loss와 smooth loss 두가지를 상단에 띄워줘서 일단 보긴 보는데

그래프가 너무 복잡해서 이게 대체 무슨 내용인가 싶은 분들도 많으셨을 것 같습니다.


그래서 무슨 용도로 쓰이는지, 왜 보여주는지, 등등 여러가지 짧은 정보들을 설명 해 드리려고 합니다.


1. Loss가 뭐야?

loss는 말 그대로 손실을 의미합니다.

예측한 결과(출력한 이미지)와 실제 정답(학습 이미지)와의 차이를 주로 나타낸다고 생각하시면 됩니다.

학습을 진행 할 때에는 loss값의 차이를 측정하여 loss값을 줄여가는 방향으로 사용됩니다.


2. Smooth Loss는 뭐야?

smooth loss는 loss에 평활화(smoothing) 작업을 한 것입니다.

쉽게 말해서 수 많은 loss 값들의 추세를 나타낸다고 보시면 편할거에요.


smooth loss는 보통 로그스케일 같은 변환을 적용해서 그래프의 차이를 줄이고 추세를 표현하도록 하는데

이 부분은 이미지 학습을 하는데 있어서 그리 중요하지 않습니다.


중요한 것은 smooth loss는 학습 과정을 모니터링 하고 훈련 과정을 조절하기 위한 주 지표로써 사용된다는 점 입니다.


대부분의 학습을 진행하시는 분들이 loss와 smooth loss값을 무시하시는 경향이 있으신것 같은데

loss값은 무시해도 되는게 맞습니다.


하지만 중요한 것은 smooth loss입니다.


예를 들어 학습 초기부터 꾸준히 smooth loss값이 증가하는 추세를 보인다고 가정 해 보겠습니다.

smooth loss는 loss값의 추세이고, loss는 예측한 결과(출력한 이미지)와 실제 정답(학습 이미지)와의 차이기 때문에

학습 결과(학습 이미지)와 현재 모델의 차이가 점점 커지고 있다는 것을 의미합니다.


이런 상태로 학습을 끝까지 완료 했을 경우 원치 않는 결과가 나올 확률이 대단히 높습니다.

물론 무조건 정반대의 결과를 뽑는다는 말은 아닙니다.


예를 들어서 학습 데이터가 다양한 경우, smooth loss 값이 높더라도 모델이 데이터의 다양한 패턴을 잘 학습할 수 있습니다.

이유는 smooth loss가 주로 학습 데이터의 분포를 고려하여 모델의 학습을 안정화시키는 데 사용되기 때문입니다.


또한 쉽지 않지만 학습률, 정규화 강도, 모델의 복잡도 등이 매우 적절하게 일치되는 경우에도 smooth loss값을 무시하고 제대로 된 결과물이 출력 되기도 합니다.

 

하지만 style 로라를 만들거나 캐릭터 로라를 만드는 등의 규칙적인 데이터를 학습 시키는데에 있어 smooth loss값을 감소하도록 세팅 하는 것은 실제로 도움이 됩니다.


아래는 상황 예시 및 해결법 혹은 원인입니다.


1. 초반(1 ~ 2 에포크) 학습 할 때 smooth loss가 줄어들지 않고 꾸준히 상승하는 추세를 보임.

이 경우에는 가지 정도의 해결 방법이 있습니다.


첫번째는 학습률을 조정하는 것입니다.

스케쥴러를 사용해 점진적으로 줄여 나가는 상황이라면 상관 없지만 그렇지 않을 경우에는 학습률을 조절 할 필요가 있습니다.

한 가지 팁을 드리자면 전이 학습에서는 학습률을 높게 줄 필요가 없습니다.


두번째 방법은 모델의 복잡도를 줄이는 것입니다.

쉽게 말해서 다른 베이스 모델을 사용하면 나아질 여지가 있다는 의미입니다.


세번째 방법은 데이터를 전처리 해 두는 것입니다.

스케일을 조절하거나 노이즈를 제거하는 등의 전처리 작업이 smooth loss를 줄이는데 도움을 줄 수 있습니다.


네번째 방법은 더 많은 데이터를 사용하는 것입니다.

더 많은 학습 데이터를 수집하여 데이터의 다양성을 늘리면 

smooth loss가 직접적으로 개선되진 않으나 최종 결과물은 개선될 수 있습니다.


이외에도 다양한 개선 방법이 존재 할 수 있으나 개인적인 해결 방법은 이렇게 네가지가 전부였습니다.


2. smooth loss값이 잘 내려가다가 갑자기 다시 올라가기 시작함.

이 경우엔 원인을 찾아야 합니다.


첫번째 원인은 학습률이 너무 큰 경우입니다.

이럴 때에는 일단 학습을 종료한 후 더 낮은 학습률(lr)으로 추가 학습을 진행하시면 됩니다.


두번째 원인은 이미 과적합이 생긴 경우입니다.

모델이 학습 데이터에 지나치게 의존하게 된 것을 의미합니다.

이런 상황에서는 정규화 기법을 사용하거나 모델의 복잡도를 줄이고 

처음부터 다시 학습을 돌리거나 첫번째 방법을 시행하시면 됩니다.


세번째 원인은 데이터가 불균형 한 경우입니다.

데이터의 직접적인 불균형(여러 스타일이 섞임)이나 데이터의 불균형한 분포(균형이 맞지 않음)는 학습 과정을 방해할 수 있습니다.

학습 데이터를 나누거나 일부 제거하여 해결 할 수 있습니다.


3. smooth loss값이 가파르게 증가하다가 증가 추세가 약간 꺾임.

이러한 상황은 주로 모델의 학습 과정에서 변화가 일어났을 때 나타납니다.


첫번째 이유는 스케쥴러를 사용하거나 혹은 그 외에 이유로 학습률이 변경된 경우입니다.

이 경우엔 자연스러운 현상이므로 문제가 되지 않습니다.


두번째 이유는 학습 데이터에 새로운 패턴이나 특징이 나타나는 경우입니다.

새로운 정보를 학습하면 위와 같은 현상이 나타나는 경우가 있는데, 자연스러운 현상입니다.


세번째 이유는 모델이 학습 데이터에 너무 맞춰져서 과적합되고 있을 수 있습니다.

물론 다른 예시들에 비하면 확률이 낮긴 하지만 증가 추세가 꺾이는 지점에서 모델이 일반화된 패턴을 학습하고 있을 수 있습니다.

이 경우엔 학습률을 유동적으로 변경해야 합니다. (스케쥴러 권장)


4. smooth loss 값이 잘 내려가다가 갑자기 다시 올라가기 시작함.

이 케이스는 잘 구분하셔야 합니다.

등락을 반복하는게 아닌 시작점과 비슷한 수준까지 smooth loss값이 상승하는 것을 의미합니다.


첫번째 원인은 너무 큰 학습률을 사용한 경우입니다.

이것도 (학습률을)점차적으로 줄여 나가는 과정이라면 크게 문제 될 것은 없으나,

일반적으로 학습 하는 경우에서는 이런 경우 더 낮은 학습률을 사용하는 것이 도움이 됩니다.


두번째 원인은 학습 데이터에 노이즈가 많거나 태깅작업이 잘못 진행된 경우입니다.

이 경우엔 수작업으로 태그 확인하고 수정하면서 고치고, 일러스트 하나씩 검열하는거 외에는 방법이 없습니다.

이 문제 때문에 사진과 손으로 그린 일러스트를 학습하는데 어려움을 겪는 분들이 많습니다.


그러나 저는 개인적으로 저작권 혹은 초상권 있는 창작물은 되도록 안 건드리시는걸 추천드립니다.


사실 단순히 그저 샘플 출력해서 보면 되긴 하지만 때로는 그래프를 참고하는 것도 도움이 되지 않을까 하는 마음에 작성하게 되었습니다.

일반적인 딥러닝 학습이 아닌 AI그림을 파인튜닝 하는데 있어서 중요도가 비교적 덜 한 부분은 있지만 그렇다고 무시해도 될 지표는 아니라는걸 알아주셨으면 합니다.


경험과 지식 + 약간의 논문을 기반으로 작성된 글이라 혹시라도 잘못된 내용이 있다면 댓글 부탁드립니다!!

혹은 궁금한 점도 댓글 남기시면 답변 해 드리겠습니다!!