Music Transformer를 사용하여 피아노 음악 생성하기
서론
. 지난 5년간 머신러닝 알고리즘을 사용한 음악 생성 방법에 대한 학습이 큰 관심을 얻었습니다. 딥러닝의 등장과 함께, 합성곱 신경망(convolutional neural networks, CNN), 장기 메모리 네트워크(long-short term memory networks, LSTM), 제한된 볼츠만 머신 (restricted Boltzmann machines, RBM)과 같은 여러 신경망 아키텍처는 알고리즘 음악 생성 작업을 위한 대중적인 선택지가 되었습니다 (더 자세한 정보는, 이 설문지를 참조하시기 바랍니다).
이 리포트에서 저희는 최신 기술의 언어 모델 기반 음악 생성 아키텍처를 제안한 Google Magenta의 Music Huang외 여러 저자들이 작성한 Transformer 논문을 살펴보겠습니다. Transformers는 NLP 분야에서 큰 성공을 거두었으며, 이는 이러한 트랜스포머를 심볼릭 음악 생성 영역으로 도입한 첫 작업 중 하나입니다.
배경
일반적으로, 생성 작업에서 음악을 나타내는 두 가지 주요 방식이 있습니다. 첫 번째는 오디오 파형(audio waveforms)로 음악을 나타내는 것입니다. 이 방식을 사용한 일반적인 음악 데이터 표현은 원시 파형(raw waveform), 스펙트로그램(spectrograms), Mel 스펙트로그램, constant-Q-transform (CQT) 등을 포함합니다. 두 번째 방식은 심볼릭 이벤트 토큰(symbolic event toekns)로 음악을 표현하는 것입니다. 이는 MIDI 이벤트(이 리포트에서 사용됨), 피아노 롤(piano rolls), 텍스트 (예: ABC 표기법(notation)) 등의 형식으로 나타날 수 있습니다. 앞선 W&B 리포트에서는 음악 생성을 위한 오디오 기반 접근 방식을 사용한 JukeBox를 소개하고 있습니다. 이 리포트에서는 대신 심볼릭 기반 접근법을 사용하는 Music Transformer를 소개하겠습니다.
이벤트 토큰으로 피아노 음악 표현하기
MIDI 이벤트는 피아노를 연주하는 동안 각각의 미세 동작을 이벤트 토큰으로 매핑합니다. 이 작업에서 다음의 4가지 이벤트가 모델링 됩니다:
- NOTE_ON - 노트(note) 누르기
- NOTE_OFF - 노트 릴리스(release)
- TIME_SHIFT - 다음 시간 단계로 이동
- SET_VELOCITY - 노트의 재생 속도 설정
이 작업에서, 총 128개의 NOTE_ON 및 NOTE_OFF 이벤트가 도입되었으며, 이는 128개의 노트 피치(note pitches)뿐만 아니라 100개의 TIME_SHIFT 이벤트 (10ms ~ 1초) 및 128개의 서로 다른 노트 속도에 상응하는 128개의 SET_VELOCITY 이벤트에 해당합니다. 이 논문의 예시는 다음과 같습니다.
이 방식을 사용함으로써 이 방식이 자연어 프로세싱에서의 토큰화(tokenization)에 해당함을 알 수 있습니다:
- 음악의 한 부분은 문장 또는 단락에 해당합니다;
- 각 노트(note) 이벤트는 문장 / 문단의 단어에 해당합니다;
- 가능한 모든 노트 이벤트는 “어휘 세트”를 형성합니다.
따라서, 음악 생성을 언어 생성 작업처럼 취급하고 있으므로, 생성 모델(generative model)의 아키텍처로 Transfomers를 사용하는 것은 합리적입니다.
Music Transformer 대 Vanilla Transformer
Vanilla Transformers는 2차 메모리 요구 조건으로 인해 긴 시퀀스를 처리할 때 악명이 높습니다. 이는 특히 음악 생성의 경우에 큰 문제로, 1분 길이의 작곡은 수천 개의 MIDI 이벤트 토큰을 쉽게 포함할 수 있기 때문입니다. 또한, 저자는 음악이 종종 반복(repetition), 음계(scale), 아르페지오(arpeggio)와 같은 구조화된 악구(structured phrases)로 구성되어 있기 때문에 음악 애플리케이션에서 상대적 위치 정보가 중요하다고 주장했습니다. 따라서, 모델은 보다 효율적인 방식으로 상대적 위치 정보를 포착할 수 있어야 합니다.
상기의 사항을 고려하여, 다음의 변경 사항과 함께 저자들은 Transformer 모델을 개선했습니다.
1 - Relative attention (상대적 어텐션)
두 Transformers의 주요 차이점은 셀프 어텐션 메커니즘(self-attention mechanism)에 있습니다. Vanilla Transformer는 스케일드 닷-프로덕트 어텐션(scaled dot product attention)에 의존하며, 이는 아래의 공식으로 설명할 수 있습니다:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = softmax(\frac{Q K^T}{\sqrt{d_k}})V
여기서 QQ, KK, VV는 쿼리(query), 키(key) 및 값(value) tensors를 나타내며, 각 텐서는 각각 모델에 사용된 시퀀스 길이 및 차원을 나타내는 tensor shape ((ll, dd)을 갖고 있습니다.
Shaw 등이 제안한 상대적 어텐션을 통해 모델이 시퀀스에서 두 위치가 얼마나 떨어져 있는지에 의해 영향을 받게 됩니다. 이 정보를 나타내기 위해 공식은 다음과 같이 변경됩니다:
Attention(Q,K,V)=softmax(QKT+Sreldk)VAttention(Q, K, V) = softmax(\frac{Q K^T + S_{rel}}{\sqrt{d_k}})V
추가 용어, SrelS_{rel}은 (ll, ll)-shape tensor이며, tensor vi,jv_{i, j}의 값은 길이(length) l에서 위치(position) ii와 jj의 상대적 거리와 관련 있습니다. 이는 본질적으로 상대적이며, 즉, i1−j1=i2−j2i_1 - j_1 = i_2 - j_2 이면 vi1,j1=vi2,j2v_{i_1, j_1} = v_{i_2, j_2}임을 의미합니다.
그렇다면 어떻게 SrelS_{rel}을 구할 수 있을까요?
- 우선, 각 상대적 거리(relative distance) r=i−jr = i - j에 대한 고유한 임베딩 ere_r이 있는 고정 임베딩 ErE_r세트를 초기화합니다.
- 그런 다음, shape(l,l,d)(l, l, d)의 3D-tensor RR 을 구성합니다. 여기서 Ri,j=ei−jR_{i, j} = e_{i -j}입니다.
- 마지막으로 QQ를 a (l,1,d)(l, 1 ,d)tensor, 및 Srel=QRTS_{rel} = QR^{T}으로 재구성합니다.
2 – 메모리 최적화 구현(Memory efficient implementation)
위의 차트에서 중간 tensor R은 긴 시퀀스에 적합하지 않은 메모리 사용량(memory footprint) O(L2D)O(L^{2}D)을 필요로 한다는 점은 명백합니다. 따라서, 저자들은 RR을 계산하지 않고도 Srel을 얻을 수 있고, 메모리 사용량(memory footprint)를O(LD)O(LD) 내에 유지할 수 있는 “스큐잉”(skewing) 트릭을 제안했습니다.
순서는 다음과 다음과 같습니다:
- QQ에 ErE_r을 곱합니다
- 맨 왼쪽 열 앞에 더미 벡터(dummy vector)를 패딩(pad) 합니다.
- shape (l+1,l)(l + 1, l)을 가지도록 행렬을 재구성합니다; 4.행렬을 나눠 마지막 l 행을 얻습니다. 이는 SrelS_{rel}에 해당합니다.
결과
논문에 설명된 바와 같이, 제안된 Music Transformer 아키텍처는 Vanilla Transformers 및 LSTM-기반 모델(주로 PerformanceRNN으로 불림)이 생성한 피아노 음악과 비교해봤을 때 몇 가지 분명한 이점을 가지고 있습니다.
-
Transformers와 LSTM을 비교해봤을 때, Transformer 기반 모델은 일반적으로 프라이머 ��티브(primer motif)를 보존하고 재사용하는데 더 뛰어납니다. 상대적 어텐션(relative attention)을 사용하기 때문에, Music Transformer는 반복되고 변화하는 구문(phrases)를 생성하는 반면, Vanilla Transformers는 보다 균일하게 모티브(motif)를 사용합니다. LSTM 모델은 처음에는 모티브를 사용하지만, 이내 다른 것으로 옮겨갑니다.
-
Vanilla Transformer 와 Music Transformer를 비교해봤을 때, 상대적 어텐션은 훈련된 것 보다 더 긴 길이로 일반화할 수 있음이 관측되었습니다. Vanilla Transformer는 훈련 길이를 넘어서면서 나빠지는 것으로 보이지만, Music Transformer는 여전히 일관된 음악 구조를 생성할 수 있습니다.
생성
사전 훈련된 Music Transformer 모델을 사용하여 음악을 생성할 수 있는 3가지 다른 모드가 있습니다. 처음부터 생성하기, 프라이머 멜로디(primer melody)에서 생성하기, 그리고 멜로디 반주 생성하기가 그것입니다.
우선 Google Magenta가 제공하는 Colab notebook을 사용하겠습니다. 이 노트북은 이미 사전 훈련된 모델 로딩, tensor2tensor
프레임워크 초기화 및 문제 정의(problem definition)을 다루고 있기 때문입니다. 생성된 오디오 파일뿐 아니라 해당 피아노 롤 플롯(piano roll plots)은 Weights and Biases wandb
라이브러리를 사용하여 아래와 같이 로그됩니다.
이 Colab notebook을 통해 결과 재현하기
처음부터 생성하기
프라이머 멜로디(primer melody)에서 생성하기
멜로디 반주 생성하기
요약
Music Transformer는 심볼릭 음악 생성의 영역에 언어 모델의 힘을 가져다준 훌륭한 논문으로 일관된 음악 구조와 스타일로 더 긴 피아노 음악을 생성할 수 있습니다. 다양한 linear complexity Transformers(선형 복잡도 트랜스포머)의 등장과 함께, Music Transformer 아키텍처를 Linformer 및 Transformers are RNNs와 같은 후보군으로의 대체 시 영향력을 탐색하는 것도 흥미로는 사안으로,
더 자세한 내용은 원본 논문 및 Music Transformer 블로그 게시물을 참조하시기 바랍니다.
여러분께서 만든 피아노 음악을 저희와 공유해 주시기 바랍니다! @weights_biases, @gudgud96으로 트윗 해주세요.