Dance Dance Convolution 구현 부분

https://arxiv.org/abs/1703.06891

: 특정 음악 audio data에서 feature를 뽑아낸 후, 이에 어울리도록 Dance Dance Revolution의 step악보를 생성하는 모델.

(구현부분만 살짝 정리해서 실제로 돌려보고자 한다.)

 

 

Screenshot from 2017-06-07 20-27-46.png

Screenshot from 2017-06-07 20-28-00.png

 

크게 2가지의 작업으로 나누어서 수행했다.

 

1) Step placement : deciding when to place steps

RNN + CNN -> ingest spectrograms of low-level audio features

 

2) Step selection :  deciding which steps to select

conditional LSTM generative model (outperforms n-gram/fixed-window approaches)

– beat phase (step이 있는 영역의 beat number)

– time difference between the last and the next step (measured in beats)

 

-> Learning to choreograph : requires predicting both the timing and the type of events in relation to music

(similar to audio sequence transduction task)

 

 

방법론을 자세히 알아보자.

 

_Audio representation

1) STFT

  • window length : 23ms, 46ms, 93ms
  • stride : 10ms

2) Apply Mel-scale

  • resulting in 80 frequency bands

3) Prepend previous 7 frames + append next 7 frames

-> 15 x 80 x 3 tensor : 150ms of audio

4) Normalize each frequency band -> zero mean / unit variance

 

_Step placement

  • 모델의 output은 하나의 sigmoid unit으로 구성되는데, 이 구간이 step인지 아닌지를 판별한다.
  • 우리는 audio feature에다가 difficulty(난이도)를 나타내는 하나의 one-hot representation을 더했다.
  • Improved musical onset detection using convolutional neural network 논문에서 나오는 CNN architecture를 사용했다.

 

<Reference 논문 (CNN for onset detection)>

improved musical onset detection with convolutional neural networks

(http://www.ofai.at/~jan.schlueter/pubs/2014_icassp.pdf)

  • spectrogram에 대한 CNN
  • 원래 computer vision 쪽에서는 square한 filter를 주로 쓰지만, 우리는 changes over time을 detect해야 하니까 rectangular한 filter를 쓴다.(wide in time / narrow in frequency)
  • 그리고 high time resolution의 결과물을 필요로 하니까 frequency에서만 max-pooling을 실행한다.
  • 여러개의 window size로 얻은 spectrogram을(frame rate, 즉 hop size는 같음) 쌓은 데이터에 대해 CNN을 적용한다. 이때 logarithmic filter bank의 갯수와 같은 수의 frequency bank로 줄인다. => 각 뉴런은 해당 위치에서의 high temporal accuracy의 정보와 high frequency accuracy의 정보를 합치게 된다.
  •  테스트할 때는 트레이닝 때처럼 사이즈를 나눌 필요 없이, 전체 곡을 그대로 input으로 넣어준다. ->  onset activation over time을 얻는다. => 이 function은 5 frame의 Hamming window를 사용한 convolution으로 smoothing되고, 특정 threshold보다 큰 local maxima값들이 onset으로 표기된다.

 

이 논문에서 사용한 CNN architecture 중 하나. :

  • Starting from a stack of three spectrogram excerpts,
  • convolution and max-pooling in turns compute a set of 20 feature maps
  • classified with a fully-connected network.

(-> mini-batch gradient descent 방식(w/ momentum) 사용.)

Screenshot from 2017-06-07 19-39-22

 

  • 2개의 convolutional layer와 그 뒤의 2개의 fully connected layer를 사용.
  • 첫번째 conv layer는 10개의 filter kernel(7-wide in time / 3-wide in frequency)을 사용.
  • 두번째 conv layer는 20개의 filter kernel(3-wide in time / 3-wide in frequency)을 사용.
  • 각 conv layer 뒤에는 stride 3의 1D max-pooling 적용 (frequency dimension에서만)
  • 두 conv layer 모두 ReLU activation 사용
  • 그 뒤에 2개의 fully connected layer(각각 256개, 128개 노드) with ReLU를 붙임.

 

CNN의 성능 개선을 위해서 C-LSTM 모델을 사용했다.

Screenshot from 2017-06-07 20-28-35.png

  • 먼저, 위에서 사용한 CNN구조의 2개의 conv layer를 사용해서 audio input 전체를(unrolling length) encode.
  • 여기서 나온 output은 3-dimensional tensor인데, 이를 flatten 함(channel axis와 frequency axis를 따라 flatten). -> temporal dimension은 유지한다.
  • 이 flatten된 feature의 각 time step의 값들을 2-layer RNN의 input으로 넣어줌.
  • LSTM RNN은 200 node로 이루어진 2개의 layer로 구성.
  • RNN 다음에는 두개의 fully connected ReLU (각각 256, 128개의 node)를 붙임.

100개의 unrolled data를 사용해서 학습했다. (BPTT)

여기에 step의 난이도(difficulty) 정보를 추가.

  • 낮은 난이도의 곡들은 1초에 1개 이하의 step만이 있었다.
  • 높은 난이도의 곡들은 1초에 7개 이상의 step이 있다.
  • 이 난이도 정보를 CNN의 output을 flatten한 vector 뒤에 붙여줬다. -> fully connected layer의 input으로 사용.

 

이렇게 구성한 네트워크의 최종 아웃풋은 binary cross-entropy loss를 통해 학습했다. (mini-batch stochastic gradient descent 사용)

  • batch size : 256
  • l2 norm이 5 이상이 되면 scale down
  • 각 LSTM과 fully connected layer들 다음에 50%의 dropout을 사용.(LSTM에서는 input에서 output으로 가는 방향으로 dropout을 사용하고, temporal 방향에서는 사용하지 않음.)
  • class imbalance (97% negative)를 보였지만,  re-balancing scheme을 사용하는 것보다 그냥 imbalance한 데이터를 그냥 사용하는 것이 더 좋은 결과를 보였다.
  • 첫번째 step 이전, 그리고 마지막 step 이후의 데이터는 사용하지 않았다.

 

RNN에서 보면, 각 frame의 타겟 값이 해당 frame의 ground truth 값이다. 우리는 100 step의 unrolling (즉 1초간의 audio, 또는 120BPM 곡에서의 2개의 beat)에 대해서 BPTT를 실행했다.

학습은 validation 데이터의 precision-recall 커브 아래의 영역에 도달할 때까지 진행하였다.

 

 

_Peak picking

Onset detection의 스탠다드한 방법을 참고해서, 우리는 ‘peak picking process’를 통해 step probability의 sequence를 discrete한 step placement의 set으로 변환했다.

1) Step placement 알고리즘을 전체 곡에 대해서 수행해서. 10ms frame마다의 step occurring probability를 assign했다.

2) 이 sequence에다가 Hamming window로 convolve해서 smoothing을 진행했고, 이를 통해 작은 구간에서 두번의 peak가 나타나는 것을 억제했다.

3) 어떤 peak가 충분히 높은지 threshold를 적용했다. : 이 때, 곡의 난이도에 따라 발생하는 peak의 수가 달라지기 때문에, 각 난이도마다 다른 threshold 사용.

4) Predicted placement가 ground truth의 ±20ms window 안에 들어오면 true positive로 판정했다.

Screenshot from 2017-06-07 21-08-56.png

 

_Step selection 

Step selection은 sequence generation 문제라고 접근했다. 이는 language modeling과 비슷한 접근으로, RNN이 효과적이다.

 

1) LSTM 모델을 사용했다.

2) ground truth step placement를 pass over하면서, 다음 token이 이전의 token들의 sequence 정보를 토대로 predict되도록 하였다.

3) 최종 output은 256가지의 가능한 step들에 대한 softmax distribution이다.

4) 인풋으로는, 좀더 단순한 bag-of-arrows(step의 arrow) representation을 사용했다. : 각 arrow마다 4개씩, 총 16개의 feature로 구성되어서, 이전 step을 나타냄.

5) 각 arrow마다, 4개의 feature들은 on / off / hold / release의 네가지 state를 나타낸다.

6) 이 bag-of-arrows 형식이 one-hot representation을 사용한 것보다 적은 양의 parameter를 사용하면서 동일한 성능을 보여준다는 것을 발견했다.

7) Start token을 사용해서 각 차트의 첫번째 step을 나타내도록 했다.

8) 128개의 노드로 이루어진 2개의 layer의 LSTM을 사용했다.

9) 모델에 추가적인 musical context를 주도록 하기 위해, rhythmic feature로 condition되도록 했다. Step placement사이의 간격이 uniform하지 않기 때문에, 다음 세가지의 feature를 추가했다.

  • ∆-time : 지난번 step으로부터의 시간 / 다음 step까지의 시간 -> 2개의 feature
  • ∆-beat : 지난번 step으로부터의 비트 갯수 / 다음 step까지의 비트 갯수 -> 2개의 feature
  • beat phase : 이 step에서 가장 가까운 note (각 beat를 16분 음표단위로 나눈 note subdivision들 중)

Screenshot from 2017-06-07 21-18-52.png

 

트레이닝은 다음과 같이 진행했다.

  • cross-entropy를 minimize하도록 파라메터 학습
  • mini-batch size : 64
  • step placement때와 마찬가지로 gradient scaling 적용
  • MLP와 RNN 모두 50%의 dropout 적용 (step placement때와 같은 방식)
  • 64개의 step에 대한 unrolling -> 쉬운 난이도의 곡에서는 평균적으로 100초 정도 / 높은 난이도의 곡에서는 평균적으로 9초 정도의 데이터
  • validation data에서의 평균 per-step cross entropy에 따라 early-stopping으로 학습 완료

 

 

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