github : https://github.com/YAIxPOZAlabs/Generation/tree/master/Group_Encoding

Baseline및 Conditional VAE에서 느낀 문제점으로는 ComMU의 노트 시퀀스에서 한 노트의 구성, 그 안에서의 인코딩 값들의 순서 … 등 미디의 구조를 배우는 데에 Positional Encoding이 필요한데, 현재 NLP 모델의 구조에서 이를 학습하는 것이 효율적이지 못하다는 것이다.

두 토큰이 같은 거리에 있다고 하더라도, 심지어 같은 토큰이 있다고 하더라도 다른 의미를 갖고 있는 경우가 있고, 그와 같은 정보들을 배우는 것이 어렵고 비효율적이다.

따라서 그러한 위치 정보를 배우는 것에 최대한 적은 model capacity를 사용하였으면 좋겠다는 취지에서 인코딩을 할 때 노트 단위로 묶어주는 인코딩 방식을 고안하였다.

또, 노트 단위로 예측까지 한다면 이상한 토큰값이 나와서 예측에 문제가 생기는 일도 없어질 것이며, 한 번의 feed forward로 4개씩 생성할 수 있다면 훈련 시간과 생성 시간도 매우 줄어들 것이라고 생각했다.

Methods

원본 1D 데이터를 아래와 같이 4개씩 묶는다. 이는 각 토큰 임베딩들이 노트 단위로 의미를 갖게 하기 위함이다.

코드 진행은 2개, 메타 데이터, 바, EOS는 한개씩만 넣고 빈칸은 패딩으로 채운다. 4개씩 묶인 하나의 그룹은 후에 각각 d_model개의 임베딩 벡터로 치환될 예정이다.

group.png

그렇게 하면 아래와 같이 인코딩할 수 있다.

EncodedMidi.png

각각의 그룹에 있는 패딩의 개수가 다르고, 그에 따라 같은 토큰값이라도(특히 Position 토큰) 다른 의미를 갖게 된다. 이를 각각 다른 의미로 학습시키기 위해 아래와 같이 패딩 개수에 따라 다르게 임베딩을 생성해 준다.

Encoding.png