DeepHear정리1/2

 

원문 : Scott Joplin’s music into deep neural network (Deep Belief Network)

http://126kr.com/article/8eonheg4pqd

 

 

DBN : Deep belief network

(RBM 같은 energy-based deep network)

 

 

75E6502A-77C0-42AC-897D-01B7E1A3BA4F.png

 

 

Initial value for W and B is very important.

 

Flipping a DBN – Autoencoders

저렇게 디자인한 DBN의 경우, 많은 양의 인풋 데이터를 넣으면 조금의 아웃풋이 나온다.

우리가 원하는 것은 반대이다.(적은 양의 인풋을 넣으면 많은 양의 데이터가 나오도록)

피라미드를 invert시키면 간단히 해결되는 것 같다. 하지만 인풋으로 무엇을 넣을 것인가?

랜덤한 벡터를 넣는 것도 시도해볼 수 있다.

랜덤한 짧은 ‘레이블’을 각각의 음악 조각에 부여해서 DBN으로 하여금 이 레이블을 이용해 음악을 생성하게 하는 것이다.

 

D8BA455C-FD36-44B6-9A1F-35E6E2C85C10.png

(64 bit의 랜덤한 레이블을 이용해서 음악을 재생하도록 하는 방식.)

 

하지만 랜덤한 방식보다는 결과물인 음악과 무언가 연관이 되도록 인풋을 도출하는 것이 좋다.

한가지 방식은 수작업으로 각 음악 조각들에게 레이블을 할당하는 것이다. (코드, 분위기 등) 하지만 이건 편법이다.

우리는 음악 그 자체로부터 좋은 음악을 재생하는 뉴럴넷을 만들기 원한다.

따라서 Autoencoding을 이용해서 레이블링을 하고자 한다.

Autoencoding은 음악조각을 large-to-small classifier로 레이블링을한 후 small-to-large generator로 새로운 음악을 만들어낸다.

(음악 조각은 달라질 수 있다.)

 

F0C7824E-B3ED-4F68-ACEA-A165F45AB302.png

 

이렇게 하면 어떤 음악을 넣었을 때 그 레이블과 그에 따라 생성된 음악을 동시에 얻을 수 있다.

(W와 WT는 레이어들 간의 연결관계를 나타낸다.)

 

이는 “Shared weights”이라는 개념을 사용해서 구축한 뉴럴넷이다.

Encoding layer(classifier)는 Decoding layer와 같은 W를 사용한다. (Decoding layer는 transpose된 weight를 사용)

W는 데이터를 요약하는 손실 압축 코드 정도로 생각하면 된다. 이 압축코드는 복원을 위해서 다시 사용될 수 있다.

 

학습을 위해서는 backpropagation을 사용하면 된다. Error는 input과 output의 차이로 정하면 된다. 이상적으로는 인풋과 동일한 아웃풋이 나오게 된다 .

 

Autoencoding DBN의 초기값들을 정하는 데 있어서 좋은 방법이 있다. Encoder/Decoder pair들을 한 pair 씩 따로 학습시키는 것이다. Restricted Boltzmann machines를 사용해서 single level encoder/decoder system을 학습시키는 빠른 알고리즘이 있다.

 

 

BD8FE752-EDDE-4A9A-BC54-DC11EDCF7C13.png

 

 

각 Encoder/decoder 레이어들이 학습되어 autoencoder가 되고 나면, 전체 DBN 또한 이미 Autoencoder가 되어 있다.

그러고나면, backpropagation을 통해 fine-tuning할 수 있게 되는 것이다.

그림에서 보면 빨간 글자로 표시된 부분만 해당 step에서 학습을 하게 된다.

 

 

최종적으로 학습이 다 된 후에는, 우리는 decompressing part만 따로 떼어내어서 음악 생성기를 만든다.

여기서는 16-neuron으로 이루어져 있는 인풋을 받아서 음악을 만들어내게 된다.

neural net의 아웃풋은 0와 1사이의 연속값이기 때문에 threshold를 0.5로 정해야 한다.

 

 

600개 정도의 Scott Japlin’s ragtime music을 학습시켰다.

이 음악은 binary matrix로 convert 시켰는데, 각 열은 16분 음표 간격의 시간을 의미하고, 각 행은 음정을 나타낸다. 1과 0은 해당 노트가 연주되는지 여부를 나타낸다. 음악은 4마디 영역으로 나뉘어진다.

 

학습은 RBM initialization으로 이루어진 후, gradient descent로 이루어진다. Gradient descent는 L2 norm(sum of squares)로 진행하였다. (트레이닝 인풋 데이터와 뉴럴넷 아웃풋 사이의 거리) 트레이닝 reconstruction error 는 5000개 중에 10개 정도의 다른 노트들을 보였다. 이는, decompressed 음악이 오리지널 음악과 10군데 정도 다르다는 것을 의미한다.

 

secret : 사실 generation 과정은 랩탑에서도 1초 정도 걸리는 일이기 때문에, 사이트에서는 미리 generate한 1000개의 샘플을 저장해 놓고 틀어주고 있다.

이 방식은 사실 표절 문제를 비껴갈 수 없다. 2의 16승, 약 60000개 정도의 레이블이 generative net에서 가능한데, 이중 600개의 레이블은 실제 트레이닝 데이터에 들어왔던 곡들에 대응한다. 따라서, 1% 정도의 랜덤 아웃풋은 트레이닝 데이터와 직접적으로 대응하게 되는 것이다.

 

따라서 가끔 곡 전체를 표절할 수 있기 때문에 오리지널리티를 따져봐야 한다. 나는 생성된 음악과 전체 트레이닝 셋을 비교해 보았다. 각 생성된 음악은 59.6%의 노트를 트레이닝 데이터에서 베꼈다. 하지만 이들은 오리지널 음악과 전혀 다른 곡이라는 느낌을 준다. 그러므로 큰 문제가 되지 않는다.

 

대부분의 경우, 뉴럴넷은 대부분의 노트들을 하나의 트레이닝 음악에서 가져온 후, variation을 더한다. 이것은 마치 즉흥연주를 하는 것과 유사하다. 때때로는 매우 오리지날한 것을 만들기도 한다.

 

 

 

 

_Things to try..

 

2 LSTM

– one to learn chord structure and local note structure

– one to learn longer term dependencies in order to try to learn a melody and retain it throughout the piece

 

2 layered LSTM RNN to produce a character level model to predict the next note in a sequence

 

Deep Belief Net (how it processes data)

 

Autoencoders / Autoencoding DBN

 

 

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s