이런곳을 왜 몰랐지..



아직 텐서보드 그래프에 익숙하지 않은 초보자 분들을 위해 준비해 보았습니다!

쉽게 풀어서 하기 위해 조금 본래의 내용과 틀리더라도 양해 부탁드려요!


 


G / D Loss Value -


흔히 우리가 자주 신경을 쓰는 그래프가 바로 이 두 녀석 G, D loss 그래프 입니다.

여기서 G와 D가 무엇을 하는지 또 무엇을 의미하는지에 대해 알아야 이해하기 편하실 거에요.


위와 같은 학습방법을 GAN (Generative Adversarial Network) 한국어로는 생성적 적대 신경망 이라고 합니다.

여기서 G는 음성을 만들어내는 생성자 (Generator) 역할을 의미하고 D는 (Discriminator) 생성한 음성이 가짜인지 진짜인지 판별하는 판별자를 의미합니다.


이 두 녀석은 서로를 견제하며 모델의 완성도를 높여가게 됩니다.

생성자가 새로운 데이터를 생성했을때 판별자는 생성자가 만든 데이터가 진짜 음성인지 가짜 음성인지를 구분하게 됩니다. 이 두 녀석은 서로 경쟁을 하며 데이터가 들어올때 마다 스스로를 학습시켜 더욱 강하게 만듭니다. 생성자는 판별자를 속이기 위해 진짜 같은 소리를 만들고, 판별자는 가짜 소리가 학습되지 않도록 막아주는 역할을 합니다. 그래서 "적대적 신경망"이라 부르는 것입니다.


[왕초보 Tip]

////
"A,B,C라는 사람이 있다고 가정해 봅니다. A가 본인의 목소리를 들려주면 B와 C는 그 목소리를 기억합니다.

매번 A가 새로운 목소리를 들려줄때마다 B는 A의 성대모사를 합니다.

이때 C는 그 목소리가 B의 목소리인지 A의 목소리인지를 평가하고 구분합니다.

-

만약 B가 C를 속이면 "합격점"을 받게 되지만, 만약 C가 속지 않으면 "불합격"을 받게 됩니다.

반대로 C는 B의 목소리를 듣고 그 목소리를 판별해서 정답을 맞췄을때 "합격점"을 받지만 틀리면 "불합격"을 받게 됩니다.

B와 C가 합격점을 많이 받게 될 수록 Tensorboard의 G와 D의 Loss 값은 점차 0에 가까워집니다. "

////

두 값은 서로 경쟁을 하지만 서로에게 꼭 필요한 존재 입니다. 이때 생성자가 너무 약하고 판별자가 너무 강해지면 생성자가 생성하는 모든 데이터가 필터링 되게 되며, 반대로 생성자가 너무 강해 판별자를 무조건 속이게 되면 잘못된 값을 학습하게 됩니다.


즉 G의 Loss 값이 하향곡선을 그린다고 해서 무조건 모델의 완성도가 높아지는 것은 아닙니다. 판별자 (D)의 능력이 떨어져 생성자를 따라잡지 못한다면 G의 값은 지속적으로 하향 하겠지만 D의 값은 상승하게 됩니다. 즉 생성자가 잘못된 정보를 생성해도 그것이 "참"으로 인식되게 되므로 그 정보가 그대로 학습되고 있음을 의미합니다.


이때 판별자가 너무 강해지면 생성자는 판별자를 속일 수 있는 동일한 패턴만을 학습하게 되며 이러한 동일한 패턴에 갇히게 되면서 "모델붕괴"를 일으키게 됩니다.


여러분들이 그래프의 Smooth 값을 99로 높이면 평균적인 값이 나타나지만 실제로 그래프의 스무스값을 낮추면 서로 치열한 전투를 하고 있는 생성자와 판별자의 모습을 시각적으로 확인할 수 있죠. 점차 이 둘은 경쟁을 해가며 평균값을 낮춰가고 있다는 것을 알 수 있습니다.


Voice 모델을 제작하시는 많은 분들이 한가지 간과하는 부분이 있다면, 과적합 상태를 너무 두려워한 나머지 그래프에만 의존하는 경우가 많다는 것입니다. 아이러니 하게도 높은 퀄리티의 모델을 생성하려면 과적합 상태를 겨냥해야 합니다. 현재 진행되는 그래프의 방향만으로는 이후의 변화를 예측할 수 없습니다. 또한 과적합은 모든 그래프가 너무나 순조롭게 정상적인 방향을 향해 나아갈 때도 발생할 수 있기 때문에 보고, 듣는 모든 것에서 과적합 상태에 빠졌을때 나타나는 아티펙트를 확인한 후 최적 상태를 찾아야 한다는 의미입니다. 즉 G,D 그래프중에 한쪽이 상향을 그리기 시작했다는 이유 하나만으로 모델이 과적합 상태가 되었다고 결론을 지어서는 자칫 과소적합 상태에 놓일 수도 있습니다.


때문에, 조금 더 여유를 가지고 지속적인 학습을 하시는걸 권장드립니다. 한국인들의 성격상 장시간 인내심을 가지고 이를 지켜보는 것이 툴을 배우는 것 보다 더 어려운 과제일수도 있으나 여러분의 데이터셋의 양이 40분을 넘어가는 많은 볼륨을 가진 모델이라면 더욱 인내를 가지고 지켜보셔야 할 수도 있습니다.


두번째로,

사람들이 잘 신경쓰지 않는 중요한 그래프가 있습니다.


 


Mel Spectrogram, Kullback-Leibler Divergence, Frequency Modulation Loss -


G와 D의 Loss 값은 대부분 생성자와 판별자의 능력을 의미하는 반면 Mel, KL, FM 그래프는 실제 여러분의 모델의 성능을 직접적으로 모니터링 할 수 있도록 도와줍니다.


Mel Spectrogram은 실제 여러분의 데이터셋의 스펙트로그램과 G에서 생성한 스펙트로그램의 차이를 보여줍니다. 즉 실제 목소리와 생성된 목소리의 차이를 보여주는 그래프이며 두 샘플간의 차이를 측정하는 손실값임으로 그래프가 하향 곡선을 그릴 수록 여러분의 데이터가 원본과 흡사한 음성 품질을 내고 있다는 의미 입니다.


KL Divergence 쿨백 라이블러 발산은 조금 복잡한 뜻을 지니고 있는데, 아주 쉽게 설명하자면 실제 데이터와 생성한 데이터간 발생할 수 있는 특정 확률을 설명하는 함수입니다. 이 또한 실제 데이터와 생성된 데이터간의 분포차가 0이 될수록 다양한 변수를 가질 수 있다는 의미이므로 일반화가 잘 되고 있다는 의미입니다.

마지막으로 Frequency Modulation Loss는 주파수 변조 처리 능력입니다. 이러한 변조 능력은 소리를 치거나 음정 (Pitch)등의 변화가 있을때 주파수의 변조를 적절하게 처리할 수 있는지를 의미합니다. (수정 : 기존 내용이 오히려 이해를 돕는것에 방해가 되어 일부 내용을 정정합니다) 주파수의 변조란 말 그대로 "주파수"에 한정되어 있는 데이터를 의미합니다. 초기에는 loss 값이 하향곡선을 그리지만 데이터셋의 다양성에 따라 어느 시점이 지나면 굉장히 다이나믹하게 그래프를 생성하게 됩니다. 이는 정상이므로 너무 크게 걱정을 하실 필요는 없습니다.


G,D의 그래프를 통해 현재 생성자와 판별자의 상태를 구분하고 그와 동시에 설명드린 3가지 그래프를 함께 참조하시면 훨씬 모델을 생성할 때 도움이 많이 되실거라 생각됩니다. 특히 여러분들이 제작하고 있는 모델은 음성 모델인 만큼 시각적인 확인 보다는 체크포인트 마다 실제로 음성을 들어보고 판단을 하시는 것을 권장드립니다.


Batch Size / Steps / Epochs


여러분들이 처음 AI 학습을 하실때 가장 어려움을 느끼고 이해하기 어려운 부분중 하나가 바로 Batch Size와 Step 일 겁니다.
위의 그래프는 이러한 Batch Size와 Step의 영향도 많이 받고 또한 데이터셋의 볼륨에도 지대한 영향을 받기 때문에 아주 쉽고 간단하게 여러분에게 Batch Size와 Step에 대한 개념도 설명을 드리도록 하겠습니다.



이 또한 쉽게 설명을 하기 위해 일부 과장이 있을수도 있으니 양해 바랍니다. 


여러분이 준비하신 Dataset의 데이터 전체를 모두 한번 흝어 보는 것을 1 Epoch 라고 하면, Batch Size는 이때 얼마나 많은 양의 데이터를 밀어 넣는지를 의미 합니다.


여러분이 Batch Size를 4로 설정을 했을때를 가정해 보겠습니다.

매 에포크가 증가할때 마다 Steps가 200씩 올라 갑니다. 2에포크, 3에포크가 될때마다 Steps는 400, 600이 될 것입니다.


반면 여러분이 Batch Size를 40으로 설정을 한다면,

매 에포크가 증가할때 마다 Steps은 극단적으로 줄어 10, 20, 30 씩 증가를 하게 될 것입니다.


작은 용량의 데이터를 분산해서 여러번 나눠 10~20번에 보내는 것과 큰 용량을 2~3번에 보내는 차이가 바로 Step으로 나타나기 때문에 위와 같은 현상이 발생하게 되는 셈이죠.


또 많은 분들에게 잘못 알려진 부분이 있다면 단순히 Steps의 횟수가 많다고 해서 학습이 잘되고 있다고 확신하는 부분입니다.

지금부터 예를 드는 부분은 실제와는 많이 다른 이야기가 될수도 있지만 처음 AI를 접하시는 분들이 이해 하시긴 편할겁니다.


누군가 여러분에게 4마리의 시베리안 허스키를 데려왔습니다. 잠시 후 또 누군가 여러분에게 4마리의 시베리안 허스키를 데려 옵니다. 이 과정이 반복되면 여러분은 상대가 여러분에게 시베리안 허스키와 관련된 무언가를 요구한다는 것을 알 수 있을 겁니다.

즉 여러분은 강아지, 시베리안 허스키라는 두가지의 키워드를 갖게 되겠죠.


Batch Size가 작으면 무언가를 특정하기가 쉬워 집니다. 즉 이런 의미에서 Steps의 수가 중요하게 느껴질 수도 있습니다.

신경망에 전달되는 데이터의 양이 적으면 적을수록 더 작은 규모에서 평균값을 얻게 되어 다양한 변수를 찾아 학습할 수 있게 되겠죠.


하지만 Batch Size가 너무 작으면 어떻게 될까요?


처음 사람이 시베리안 허스키를 데리고 왔습니다. 2번째도, 3번째도 허스키를 데려왔습니다. 근데 4번째 사람이 늑대를 끌고오게 되면 이 학습이 어느 방향으로 가야하는지 구분할 수 없게 됩니다. 이 학습이 강아지와 다른 동물을 구분하는 학습인지 허스키의 모습을 학습하는 것인지 방향성을 잃게 됩니다.


사실 데이터의 앞부분은 4마리의 시베리안 허스키 였지만 나중에는 곰, 여우, 사슴과 같은 사족동물들이 등장할 수도 있습니다. 이렇게 방향성을 잃게 되면 전혀 예측할 수 없는 결과에 도달하는 경우가 종종 생깁니다.


정 반대로 그렇다면 200마리의 동물을 한번에 가지고 오게 되면 어떻게 될까요? "이것은 동물이구나", "이것은 사족 동물이구나" 와 같이 굉장히 러프한 스케치만을 할 수 있게 됩니다. 대부분 이런 대규모 데이터를 한번에 가져오는 경우 생성자와 판별자 모두가 굉장히 안정적인 그래프를 그리게 됩니다. 그 이유는 데이터의 양이 많아질수록 평준화된 수치가 나타나기 때문인데 이런 반복적인 학습이 진행되는 경우 일반화의 실패로 이어질 확률이 높아집니다.


무언가 동일한 종류의 동물의 생김세를 파악하고 학습하기 보단 사족동물의 평균적인 데이터를 기반하여 학습 하게 되니까요. 


단 이러한 수치상의 데이터는 규모가 작은 Lora나 보이스 모델에서는 실감하기가 어렵습니다. 예를들어 ChatGPT와 같은 LLM의 경우 발생할 수 있는 변수가 수억가지에 이르지만 20~30분 분량의 적은 데이터에서는 배치사이즈나 step의 수에 영향을 받기 보단 데이터셋 자체의 퀄리티에 영향을 많이 받게 됩니다.


대부분 RVC 포크에서 공통적으로 추천하는 배치 사이즈는 4~8 정도 입니다.

이는 평균적으로 사람들이 사용하는 하드웨어와 30분 분량의 데이터셋을 기준으로 두고 있습니다.

아주 민감하신 분들을 제외하고는 배치 사이즈를 극단적으로 사용하여도 아웃풋의 차이를 느끼기 어렵습니다.

하지만 대략적인 이론을 알고 있다면 나중에 다양한 시도를 해보실 수 있을거라 생각되네요.


다시한번 강조드리지만, 좋은 모델은 데이터셋에서 나옵니다.

1시간짜리 데이터셋보다 5분짜리 깨끗한 데이터셋이 훨씬 좋은 퀄리티의 모델이 나온다는 점 명심하셔야 합니다!


미흡하게나마 도움이 되셨길 바랍니다!

(한국에는 너무 모델러들이 없어요 ㅠㅠㅠㅠ)
다음번에는 일반화와 모델붕괴의 차이에 대해 알려드릴게요!