Skip to main content

Music Transformer를 사용하여 피아노 음악 생성하기

Google Magenta의 Music Transformer가 피아노 음악을 어떻게 생성하는지에 대해 기초부터 알아보겠습니다
Created on January 28|Last edited on January 21
이는 여기에서 볼 수 있는 영어 기사를 번역한 것이다.

서론

. 지난 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가지 이벤트가 모델링 됩니다:

  1. NOTE_ON - 노트(note) 누르기
  2. NOTE_OFF - 노트 릴리스(release)
  3. TIME_SHIFT - 다음 시간 단계로 이동
  4. 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) iijj의 상대적 거리와 관련 있습니다. 이는 본질적으로 상대적이며, 즉, 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}을 구할 수 있을까요?

  1. 우선, 각 상대적 거리(relative distance) r=i−jr = i - j에 대한 고유한 임베딩 ere_r이 있는 고정 임베딩 ErE_r세트를 초기화합니다.
  2. 그런 다음, shape(l,l,d)(l, l, d)의 3D-tensor RR 을 구성합니다. 여기서 Ri,j=ei−jR_{i, j} = e_{i -j}입니다.
  3. 마지막으로 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) 트릭을 제안했습니다.

순서는 다음과 다음과 같습니다:

  1. QQErE_r을 곱합니다
  2. 맨 왼쪽 열 앞에 더미 벡터(dummy vector)를 패딩(pad) 합니다.
  3. shape (l+1,l)(l + 1, l)을 가지도록 행렬을 재구성합니다; 4.행렬을 나눠 마지막 l 행을 얻습니다. 이는 SrelS_{rel}에 해당합니다.

결과

논문에 설명된 바와 같이, 제안된 Music Transformer 아키텍처는 Vanilla Transformers 및 LSTM-기반 모델(주로 PerformanceRNN으로 불림)이 생성한 피아노 음악과 비교해봤을 때 몇 가지 분명한 이점을 가지고 있습니다.

  1. Transformers와 LSTM을 비교해봤을 때, Transformer 기반 모델은 일반적으로 프라이머 ��티브(primer motif)를 보존하고 재사용하는데 더 뛰어납니다. 상대적 어텐션(relative attention)을 사용하기 때문에, Music Transformer는 반복되고 변화하는 구문(phrases)를 생성하는 반면, Vanilla Transformers는 보다 균일하게 모티브(motif)를 사용합니다. LSTM 모델은 처음에는 모티브를 사용하지만, 이내 다른 것으로 옮겨갑니다.

  2. 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을 통해 결과 재현하기



처음부터 생성하기




Run: stoic-bush-8
1


프라이머 멜로디(primer melody)에서 생성하기




Run: stoic-bush-8
1


멜로디 반주 생성하기




Run: stoic-bush-8
1


요약

Music Transformer는 심볼릭 음악 생성의 영역에 언어 모델의 힘을 가져다준 훌륭한 논문으로 일관된 음악 구조와 스타일로 더 긴 피아노 음악을 생성할 수 있습니다. 다양한 linear complexity Transformers(선형 복잡도 트랜스포머)의 등장과 함께, Music Transformer 아키텍처를 LinformerTransformers are RNNs와 같은 후보군으로의 대체 시 영향력을 탐색하는 것도 흥미로는 사안으로,

더 자세한 내용은 원본 논문Music Transformer 블로그 게시물을 참조하시기 바랍니다.

여러분께서 만든 피아노 음악을 저희와 공유해 주시기 바랍니다! @weights_biases, @gudgud96으로 트윗 해주세요.



Iterate on AI agents and models faster. Try Weights & Biases today.