본문 바로가기

Paper

[논문] A Universal Music Translation Network(2018)

Music style transfer 주제로 프로젝트 중 time domain에서 style transfer를 시도한 논문을 찾다가 읽게 되었습니다. Frequenct domain에서 CQT 기반 cycleGAN을 고려중인데 resolution 문제가 걱정되어 time domain에서 style transfer도 생각중입니다.

paper : https://arxiv.org/pdf/1805.07848.pdf

github : https://github.com/facebookresearch/music-translation  


Intro

이 아키텍처에서 하나의 universial한 인코더를 만들어 모든 인풋에 적용했다.  > 학습 효율 + 학습시 들리지 않는 음악 domain으로 변환도 가능

single encoder를 만드는 핵심 > domain-specific 정보가 인코딩 X  <- domain confusion net

인코더는 인풋을 기억하지 않지만 의미있는 방향으로 인코딩해야한다 <- random local pitch 변조로 인풋을 왜곡

네트워크는 학습중, 인풋을 undistorted version(물빼기)으로 denoising한다.


Previous work

impose constraint on the latent space

(a) universial encoder - 모든 도메인 인풋이 같은 공간에 존재하도록 임배딩

(b) 각 도메인으로 reconstruct 될 수 있는 multi decoder

(c) 인풋에 noise를 넣어 agumentation 함으로 latent space가 인풋 - 타겟 경로를 기억하지 못하게한다.


Method

학습시 softmax 기반 loss를 각 domain에 적용한다. 인풋 데이터를 randomly augment해서 encoder가 단순히 데이터를 기억하는게 아니라 데이터의 high-level feature를 뽑게 한다. training에 domain confusion loss를 추가로 설정해서 latent vector가 domain-specific 하지 않게 한다.

1. WaveNet Autoencoder

WaveNet Autoencoder - NSynth(2017)

WaveNet Autoencoder는 NSynth 논문에서 나온 위와 같은 모델을 사용한다. 기존 WaveNet은 external condition에 dependency가 큰 문제점이 있었다. 따라서 WaveNet Autoencoder에서는 오토인코더 구조를 사용해 embedding matrix(Z)로 condition을 준다. 인코더 파트는 Temporal Encoder로 인풋 데이터의 latent variable을 학습하기 위해서 causal conv를 사용하지 않는다. 왜냐하면 오토인코더에서 inference 파트는 decoder이고 encoder는 decoding에 condition을 주는 Z를 만드는 부분이기 때문에 전체 인풋 데이터를 사용하므로 causal conv가 필요없다.

인코딩은 waveform이 인풋으로 들어가 residual block을 30번 거친 뒤 1x1 conv로 16채널 임배딩 array를 만든다. 이때 Avg pool을 통해 temporal resolution을 결정한다. Avg pool은 주어진 stride 만큼 평균을 내서 하나의 값으로 출력한다. stride = 512일 때, sr = 16000인 4초짜리 오디오 waveform에 Avg pool을 하면 다음과 같이 (16 x 125) embedding matrix(Z)가 나오게 된다. 

3가지 악기의 embedding matrix 16개의 선(different dimension)으로 이루어져 있음을 알 수 있다.

이렇게 만들어진 embedding matrix Z를 디코더 파트에 condition으로 주어 디코딩을 진행한다. 디코더는 waveNet 구조와 동일하다.

 

2. Audio Input Augmentation

인코더의 일반화 능력과 high-level information을 유지하기위해 local pitch를 변경하는 augmentation을 사용한다. librosa를 이용하여 -0.5 ~ 0.5 사이의 임의의 숫자로 균일하게 선택된 0.25~0.5초 사이의 segment pitch를 변환한다. 

 

3. Training and Loss

Augmentation을 O, encoder를 E, decoder를 D, classifer를 C, L을 cross entropy로 정의하면 오토인코더 네트워크는 다음과 같은 loss로 학습된다. r은 radom seed, s는 input signal, 상첨자 j는 j domain을 의미한다.

$\sum_{j}^{}\sum_{s^j}^{} L(D^j(E(O(s^j,r))),s^j) - \lambda L(C(E(O(s^j,r))),j)$

앞쪽 term은 인코더를 통과한 j domain input signal이 j domain 디코더를 통과한 값이 해당 domain에 input 값과 같은 방향으로, 뒤에 term은 classifier가 embedding vector를 받아 input domain과 다른 domain으로 분류하는 방향으로 학습하게 된다. 즉 인코더는 input이 어떤 domain에서 왔는지 모르게 학습되고 decoder는 어떤 embedding vector가 오더라도 해당 domain으로 디코딩을 하게된다. 그래서 classifier가 embedding vector 정보만으로 어떤 domain에서 왔는지 맞추면 안된다. 인코더는 GAN에서 generator를 학습하는 느낌! 즉 discriminator C를 잘 속여 어디서 왔는지 모르게 학습한다.

계속 GAN과 유사하게 classifier는 discriminator 역할은 한다. 따라서 위 학습 방향과 역방향, 즉 잘 분류하는 쪽으로 학습을 시켜 domain-adversarial traning을 달성한다. 다음과 같은 loss를 가진다.

$\sum_{j}^{}\sum_{s^j}^{} L(C(E(O(s^j,r))),j)$

C를 학습할때는 D는 관여하지 않고 gradient도 embedding matrix까지만 흘러가게 한다. 위와 같은 방향으로 인코더까지 학습하면 안되니까! training시에 gradient backpropa flow를 생각해보면 다음과 같을 것 같다.

 

4. Network during inference

학습을 마치고 실제로 transform을 수행할 때는 input sample에 왜곡을 가하거나 agumentation 하지 않는다. 


reference

http://dmqm.korea.ac.kr/activity/seminar/250

https://www.youtube.com/watch?v=v1GbxpKqH8Q&t=134s