본문 바로가기

머신러닝 읽어주는 남자

AutoRegressive model

반응형

자기 자기 자신으로 자신을 나타내는 모델

 

단순하고, 트랙터블함, 좋은 likelihood를 가짐.

 

PixelRNN

전체 걔요를 보여주는 Sppatial LSTM

LSTM 1층이 픽셀하나 또는 인근의 픽셀값는 입력으로 받는다. 

그 외에도 인근 LSTM의 히든 스테이트 값 역시 받는다 

그렇게 받은 입력을 토대로 출력을 내보내서 2층으로 올려보낸다.

2층 LSTM도 같은 방식으로 동작하며, 

결국 출력을 내보낸다.

이미지를 픽셀들을 시퀀셜하게 생각하고 이전 픽셀들을 기반으로 현재의 픽셀을 생성해 냄.

아래, 뒤의 픽셀의 정보는 없이 만들음.

너무 느리다는 단점이 있음.

멀티 채널시 RGB순서로 생성함.

 

너무 느려지니 다음과 같이 활용됨

 

pixel CNN

가장 빠름 LSTM연산보다 훨씬 빠른 컨볼루션 연산으로 더 가벼운 속도를 보여준다.

 

 

 

전체 개요

순서대로  pixel cnn,Row LSTM, Diagonal BiLSTM 

 

위의 PixelRNN PixelCNN을 씨앗으로 만들어진게 그 유명한 Wavenet이다

Wavenet

기본적으로 multi layer Convolution network이며,

과거의 값으로 현재값을 만드는 Causal한 형태를 가진다.(당연한 소리지만 미래의 값을 보진 않는다)

위의 그림에서 봤을때 첫번째 층은 Receptive Field = 2인 일반적인 네트워크이며

그래서 Receptive field(RF)는

#layers * (filter_leng - 1) + 1 = 4 * (2 - 1) + 1 =5

로 너무 적게 된다 그래서 같은 계산량을 유지하면서 최대한 RF를 늘리기 위해

뜨문 뜨문 (희석) 사용하게 된다.

 

그 다음 층 부터는 뜨문뜨문하게 입력을 받는 Dilated 네트워크 이다.

2층은 dilation = 1, 3층은 dilation = 2, dilation = 4, dilation =8로

결과적으로 RF가 5->16으로 향상되어 롱텀 디펜던시가 증가되게 된다.

 

또한 계속적으로 늘려가는 방식 보다는 위와 같이 반복하는 방식으로 하게 되는데 이렇게 되면 RF은 증가를 하긴 하지만 비교적 느리게 증가한다. 하지만 이렇게 하는 이유는 최종 출력단과 입력단의 pathway를 다양하게 하여 다양한 입력을 받게 하기 위함이다. 

 

 

 

결과를 소프트맥스를 사용하게 되는데,

일반적으로 Audio신호는 16bit으로 퀀타이제이션 하는데 이러면 클래스가 65536 필요하다

이건 투 머치고 8비트로 걍 줄일려면 256으로 줄긴하지만 성능이 문제라 

mu-law companding으로 인지적으로 적절하게 256으로 줄인다.

 

위의 그림이 전체 시스템 모습으로

매 층은 dilated conv를 기본으로 통과하고,

위의 이미지 처럼 별도의 웨이트로 게이트를 만든다. 게이트를 통과시킨 결과를 1*1 컨볼루션을 하고, Residual connection을 합친후,

모든 층에 나온 (Residual 제외) 것을 뽑아내서 합쳐준다.

마지막으로 마지막으로 만들지 않고 원하는 것을 만들기 위해 컨디션 h를 줘야하는데(TTS에서는 발화할 텍스트) 이것을 위와 같이 매 입력에 같이 넣어서 출력이 나오도록 해준다. 부가적으로 로컬 컨디션을 해주기 위해 업샘플링도 하게 된다.

 

Nsynth

Audio용 Autoencoder => Wavenet Autoencoder

웨이브넷은 과거의 오디오 정보로 현재의 오디오 프레임을 만들어내는 형태.

물론 컨디션을 걸 수 있어서 컨디션을 잘 걸 경우에는 잘 동작하지만 (TTS의 경우에는 발음할 텍스트)

컨디션이 없으면 제대로 생성되지 않았음 이를 넘어서기 위해

새로운 방식으로 컨디션을 주게되는데 이것이 Nsynth 이다

기존의 웨이브넷처럼의 과거의 오디오 정보도 받지만, 과거의 오디오로 임베딩한 정보도 같이 받아서 롱텀 디펜던시를 늘린다.

 

 

초당 16000 샘플 음원을 4초 단위로 임베딩하고, 스트라이드는 512개이고, 임베딩 사이즈는 16이라면

16000*4/512*16= 2000 크기의 임베딩이 완성됨

이를 universal music translation network에서도 활용하게 되는데 

이는 피아노 음악을 다른 악기(바이올린, 보컬) 등으로 자유자레로 바꿀 수  있다.

 

이 논문에서는 모든 악기 공용으로 인코더를 만들고 악기 별로 디코더를 만든다. 

또한 악기별로 임베딩이 분별력을 갖도록 domain classifier도 붙여준다.

반응형

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

tensorflow example, tfrecord  (0) 2020.03.13
음악생성(raw audio file)  (0) 2020.03.05
음악생성  (0) 2020.03.02
음악 생성 테크트리  (0) 2020.03.01
docker에 대한 모든 것  (0) 2020.01.10