2026년 9월 4일 금요일

[셀프 학습 노트] 드럼 패턴의 유사도를 계산하다가 embedding까지 생각해 보다

오늘은 모아 둔 ADT 드럼 패턴을 대상으로 “서로 비슷한 패턴을 어떻게 찾을 것인가?”를 조금 더 체계적으로 실험했다.

현재 데이터는 한 마디 단위로 정규화한 뒤, 킥·스네어·하이햇 등의 타격 위치를 비교할 수 있게 만들어 놓았다. 서로 다른 드럼맵도 검색할 때에는 다음과 같은 공통 범주로 환산한다.

KK / SN / HH / TOM / CYM / PERC

현재 확보한 2,010개의 1-bar pattern occurrence를 정리하니 1,796개의 canonical pattern이 만들어졌다. 같은 패턴이 여러 파일에 반복해서 등장하는 경우를 하나의 패턴으로 묶은 결과다.

비슷하다는 것을 숫자로 표현하기

이제 두 패턴이 얼마나 비슷한지를 계산해야 한다.

현재 방법은 머신러닝이 아니다. 킥과 스네어는 리듬의 골격을 이루므로 상대적으로 높은 가중치를 주고, 하이햇 등에는 낮은 가중치를 주는 식으로 사람이 규칙을 정해 similarity를 계산한다.

예를 들어 현재 실험에서는 대략 이런 가중치를 사용한다. 이러한 가중치 체계가 정말 올바른지도 고민해 보아야 한다. 

KK   = 3.0
SN   = 3.0
HH   = 1.0
TOM  = 1.5
CYM  = 1.2
PERC = 1.0

오늘 재미있는 사례가 하나 나왔다. 어떤 기준 패턴(RCK_0040)에 대해 검색했더니, 눈으로 보기에 상당히 비슷한 rock 패턴보다 rap 패턴 하나(RAP_0088)가 더 높은 순위로 나타났다.



계산 과정을 뜯어보니 오류가 아니었다. rap 패턴은 하이햇 두 개가 빠졌고, rock 패턴은 킥 하나가 더 들어 있었다. 현재 가중치 체계에서는 후자의 차이를 더 크게 평가하기 때문에 rap 패턴의 점수가 높아진 것이다.

“킥 하나의 차이는 하이햇 두 개의 차이보다 큰가?”

프로그램이 틀린 것이 아니라, 오히려 이런 질문이 튀어나온 셈이다.

타격의 강도(strength)까지 조금 반영해 보니 순위가 다시 달라졌다. 타격 위치뿐 아니라 accent까지 비슷했던 rock 패턴들이 위로 올라왔다. 그렇다고 strength를 지나치게 강조하면 이번에는 리듬 구조가 다른 패턴까지 올라올 수 있다.

결국 ‘비슷하다’는 말 자체를 정의하는 것이 생각보다 어렵다.

그러다 embedding이라는 말에 도달했다

여기서 자연스럽게 이런 생각이 들었다.

이런 가중치를 계속 사람이 정하지 말고, 컴퓨터가 패턴의 특징을 스스로 학습하게 할 수는 없을까?

여기에서 vectorembedding이라는 개념이 등장한다.

벡터화는 생각보다 단순하다. 예를 들어 다음과 같은 패턴이 있다고 하자.

KK  o . . . o . . .
SN  . . . . o . . .
HH  o . o . o . o .

이를 컴퓨터가 다루기 쉬운 숫자로 바꾸면 다음과 같이 표현할 수 있다.

KK = 1 0 0 0 1 0 0 0
SN = 0 0 0 0 1 0 0 0
HH = 1 0 1 0 1 0 1 0

이것도 이미 일종의 vector이다. 쉽게 말하면 드럼 패턴을 숫자들의 묶음으로 표현한 것이다.

Embedding은 여기에서 한 걸음 더 나간다. 많은 패턴과 그 관계를 학습시켜서 비슷한 패턴은 숫자 공간에서도 가까운 곳에 놓이도록 좌표를 만들어 주는 것이다.

          RCK_0040
             ●
          ● RCK_0050


                         ● RAP_0088

실제로는 이런 2차원 지도가 아니라 수십 또는 수백 차원의 공간일 수 있지만 개념은 같다. 새로운 패턴이 들어오면 그 주변에 놓인 패턴을 찾아서 “이것들이 비슷하다”고 제시할 수 있다.

그런데 무엇을 학습시킬 것인가?

여기에서 다시 오늘의 실험으로 돌아온다.

Embedding을 사용한다고 해서 컴퓨터가 저절로 음악적으로 무엇이 비슷한지 깨닫는 것은 아니다. 컴퓨터에게 비슷한 것끼리 가까이 놓으라고 하려면 먼저 무엇이 비슷한지를 알려줄 방법이 필요하다.

킥 하나가 다른 것과 하이햇 두 개가 다른 것 가운데 어느 것이 더 중요한가? 타격 위치가 같고 accent만 다르면 얼마나 비슷한가? 싱코페이션된 킥 하나가 이동하면 얼마나 큰 차이인가?

바로 오늘 사람이 similarity를 계산하면서 고민했던 문제들이다.

그래서 당장 embedding이나 머신러닝으로 넘어갈 생각은 없다. 지금처럼 설명 가능한 방법으로 패턴을 비교하면서 왜 두 패턴이 비슷하게 또는 다르게 평가되는지를 직접 살펴보는 과정이 먼저 필요하다.

오늘의 결론은 의외로 단순하다.

머신러닝을 적용하는 것보다 먼저 해야 할 일은, 머신러닝에게 무엇을 배우라고 할 것인지를 알아내는 것이다.

드럼 패턴을 모으기 시작했을 때에는 이렇게까지 갈 줄 몰랐다. 단순한 MIDI 파일 정리에서 출발했는데, 어느새 “리듬이 비슷하다는 것은 무엇인가?”라는 문제를 붙들고 있다. Drum Patternology라는 이름이 조금씩 그럴듯해지는 것 같기도 하다.

댓글 없음:

댓글 쓰기