본문 바로가기

머신러닝 읽어주는 남자

음악생성(raw audio file)

반응형

일반적으로 음악생성은 미디 파일과 같은 심볼릭 데이터를 기본으로 한다.

악보: 대표적인 심볼릭 음악 데이터

하지만 이러한 생성은 재생시에 음색, 강약과 같은 미묘한 정보가 누락되기 때문에 절대 만족스러운 음악 품질이 나오기가 어렵다. 그래서 결국은 음악을 제대로 생성하려면 오디오 파일로 만들어야 한다.(시간 도메인의 웨이브폼으로)

 

오디오 생성에는 빠질 수 없는 모델이 있는데 바로 그것은

 

WaveNet

 

 

웨이브넷은 autoregressive 모델로 쉽게 말하면 본인으로 부터 본인을 생성하는 모델이다 

위의 그림처럼 오디오를 생성한 후 그것이 다시 입력으로 들어가 다음 오디오를 생성한다. 

 

 

위의 굵은 선처럼

필터 사이즈(받는 입력의 갯수)=2 이고 5개 층이면 

볼 수 있는 범위를 뜻하는 Receptive field(RF)는 5 밖에 안된다. 

물론 층과 필터의 갯수를 늘리면 해결되겠지만 그럼 연산량도 증가한다.

 

 

하지만 빽빽하게 하지않고 약간의 희석(dilation)이 들어간다면 위의 그림과 같이 같은 연산량으로 더 멀리 볼 수 있다.

같은 연산량으로 기존에는 RF=5 지만 여기서는 RF=16로 비약적으로 늘렸다. 

 

이런 식 계속 쌓아나가면 RF가 계속 늘어나서 좋긴하지만

일반적으로 아래와 같이 네트워크를 구성한다 

 

이런식으로 같은 구조의 네트워크를 반복하게 된다.

기존의 방식대로 쌓게 되면

 위의 그림과 같은 입력 x가 출력 y에 도달하는 경로가 단 하나만 존재하게 된다.

그래서 입력으로 부터 다양한 정보를 받지 못하고 고정된 하나의 정보많을 받게 된다.

하지만 반복되어 쌓게 되면 다음과 같다 . 

같은 입력 x가 출력 y에 도달하는 경로가 여럿 존재하게 되어 출력 y가 나오기 위해 입력 x가 다양하게 활용되게 된다.

 

더 넓은 RF를 가지는 네트워크를 구성할 때

  • 필터 사이즈 > dilation

  • dilation > 2

이 되도록 일반적으로 설정한다.

 

또한 마지막으로 출력을 내보낼때는 소프트맥스 쓴다.

음질을 위해서 16bit 음악에 맞게 내보내게 되는데

그렇게 되면 클래스가 65000여개된다 그래서 이를 보안하기 위해 

음향 데이터가 많이 집중된 저주파에 집중한 mu-law기법을 사용한다.

그러면 8bit 즉 256 정도의 클래스로 저주파에 최대한 집중하도록 한다.

 

 

 

웨이브넷은 일반적으로 음성에 대해서는 잘 되지만 음악에 대해서는 잘 되지 않는데

그 이유는 일반적으로 

 

웨이브넷의 RF은 음악에 사용하기에는 비교적 짧다. 

(일반적으로 큰 웨이브넷의 RF는 768 ms 정도이다.)

 

그래서 음악이 일관성이 있기보다는 휙휙 변하는 모습을 볼 수 있다.

이를 극복하기 위해 구글 브레인에서 NSynth가 나온다

 

 

Nsynth

 

정말 쉽게 설명하면 Wavenet Autoencoder이다.

 

기존의 웨이브넷이 기존의 입력을 받아서 새로운 오디오 조각 Xn을 생성하는데

Nsynth는 여기에 살짝 오토인코더 입력을 추가한다. 

Nsynth는 wavenet 인코더를 만들어서 오디오의 임베딩도 추가적으로 만들어서 집어넣게 된다. 

이러한 내용을 좀 더 자세히 나타낸가 아래 그림과 같다.

 

 

Autoregressive discrete autoencoder(ADA)

(“The challenge of realistic music generation: modelling raw audio at scale”, Dieleman et al. (2018))

 

좀 더 긴 RF를 위한 모델이다.

 

Nsynth와 매우 유사한지만 가장 큰 차이는 임베딩을 그대로 사용하지 않고 이를 양자화(Quantization)하여 사용한다.

 

양자화를 하는 이유는 정보의 추상화, 조작용의함, 압축, 이후에 소개될 Stacked 모델에 용이하기 때문이라고 한다. 

(사실 대단히 이해가 되진 않는다;;;;)

 

여기서 벡터 양자화란 

위와 같은 벡터 스페이스에 K개의 코드북이 있다면 

 

인코더 출력 q가 아닌  q와 제일 가까운 코드인 q'를 디코더에 넣는 것을 의미한다.

문제는 이 방법이 눈으로 딱 봐도 미분 불가능하기 때문에 backpropagation할 시에는 q'가 아닌 q로 그냥 학습한다.

 

이 방법을 Vector Quantization Variational Autoencoder라고 하는데 

문제는 방법도 복잡하고 생각보다 학습이 쉽게 실패한다.

그래서 PBT(popular based Training)으로 해야하는데

이 방법은 쉽게 설명하면 

모델을 1개만 학습시키지 않고 동시에 여러개를 학습시켜서 학습 잘 되는 것만 골라서 마저 학습시키는 적자생존 시스템을 의미한다.

 

이런 골 때린 방법보다 좀 더 용이한 방법을 제안하는데 그것은

Argmax autoencoder이다.

 

1. 일단 그냥 임베딩을 구하고

 

2. Relu 액티베이션을 통과시키고

 

3. Softmax를 통과시켜 노멀라이즈를 하고

4, argmax를 때려서 one hot encoding을 디코더에 넣는다

 

이렇게 학습시키면 훨씬 안정적으로 학습을 하게된다.

 

또한 해당모델을 아래와 같이 쌓을 수 있는데 

 

쌓으면 쌓을 수록 RF는 길어진다는 장점이 있다.

 

결론은 이렇게 하면 좋다

 

 

출처: Generating music in the raw audio domain - Sander Dieleman

https://www.meetup.com/ko-KR/London-Machine-Learning-Meetup/events/260321106/

 

 A Universal Music Translation Network

https://www.youtube.com/watch?v=v1GbxpKqH8Q&feature=youtu.be

 

반응형

'머신러닝 읽어주는 남자' 카테고리의 다른 글

인공지능(딥러닝) 입문 추천  (0) 2020.03.15
tensorflow example, tfrecord  (0) 2020.03.13
AutoRegressive model  (0) 2020.03.02
음악생성  (0) 2020.03.02
음악 생성 테크트리  (0) 2020.03.01