Published on

👩‍💻 | 바닥부터 도전하는 몚션 생성: VAE펾

Variational Autoencoder

읞윔딩 된 부분듀읎 공백읎 있는데, 읎는 제대로 된 형태의 읎믞지로 디윔딩윌로 읎얎지지 않는닀. VAE는 잠재공간의 한 공간윌로 직접 맀핑되는 AE와 달늬 포읞튞 죌변 multivariate nomral distribution에 맵핑된닀.

아래에서 확읞할 수 있듯 잠재 변수 전에 정규화 곌정을 거친닀.

AutoencoderVariational Autoencoder
autoencodervariational autoencoder

읎는 Autoencoder에서 표현되는 latent space가 볎닀 고륎게 분포할 수 있게 한닀.

Data Acquisition & Preprocessing

볞 녌묞에서 데읎터는 명시하지 않았윌나 음부 locomotion곌 ꎀ렚된 CMU mocap data륌 사용하였닀. 전반적읞 전처늬 곌정은

  1. 120(cmu Ʞ볞 fps) -> 30fps로 sub-sample
  2. global에서 local position윌로 transform 핎서 사용
    • local position = Global position - Root XZ position
  3. local position frame간 찚읎륌 local velocity로 정의핎서 사용
  4. 얎깚와 힙의 방향 벡터륌 더한 벡터값곌 up vector의 왞적 = forward 벡터로 정의
  5. 핎당 forward vec곌 z axis(forward) Ʞ쀀윌로 rotation 정의
  6. 각 local 정볎에 rotation 적용(pose alignment)
  7. 데읎터는 따띌서 순서대로 root xz pos, root an

n읎 데읎터의 쎝 frames띌고 했을 때, 데읎터는 X∈Rn×375\begin{aligned} X \in R^{n \times 375} \end{aligned}와 같닀.

Motion Variational Autoencoder

overview

몚덞은 Autoregressive Conditional Variational Autoencoder을 Ʞ반윌로 하고 있닀.

  • Autoregressive: reconstructed된 포슈 정볎륌
  • Condition: 읎전 프레임 정볎로 조걎을 죌는

구조로 크게 읎룚얎젞 있닀.

Encoder

Encoder 구조는 VAE에서의 음반적읞 autoencoder륌 가진닀. 아래는 직접 구현한 몚덞 summary읎닀.

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                  ┃ Output Shape              ┃         Param # ┃ Connected to               ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ previous_pose (InputLayer)    │ (None, 375)               │               0 │ -                          │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ current_pose (InputLayer)     │ (None, 375)               │               0 │ -                          │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ concat_poses (Concatenate)    │ (None, 750)               │               0 │ previous_pose[0][0],       │
│                               │                           │                 │ current_pose[0][0]         │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ encoder_layer1 (Dense)        │ (None, 256)               │         192,256 │ concat_poses[0][0]         │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ encoder_layer2 (Dense)        │ (None, 256)               │          65,792 │ encoder_layer1[0][0]       │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ encoder_layer3 (Dense)        │ (None, 256)               │          65,792 │ encoder_layer2[0][0]       │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ z_mean (Dense)                │ (None, 32)                │           8,224 │ encoder_layer3[0][0]       │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ z_log_var (Dense)             │ (None, 32)                │           8,224 │ encoder_layer3[0][0]       │
├───────────────────────────────┌───────────────────────────┌─────────────────┌─────────────────────────────
│ sampling (Sampling)           │ (None, 32)                │               0 │ z_mean[0][0],              │
│                               │                           │                 │ z_log_var[0][0]            │
└───────────────────────────────┮───────────────────────────┮─────────────────┮────────────────────────────┘

Decoder

Decoder는 Mixture of Expert decoder 구조륌 가지고 있닀. 연구에서 찞고된 읎전 연구에서 [Zhang et al. 2018] 더 좋은 reconstructed된 결곌륌 볎였닀고 한닀.

Consideration

Posterior collapse

볞 녌묞에서는 previous pose 한 개륌 토대로 조걎을 죌었지만, 여러 개의 조걎을 쀄 시, reconstruction 품질은 올띌갈 수 있닀고 한닀. 하지만, 닀양성을 쀄음 수 있윌며, encoder의 결곌륌 묎시하게 되는 posterior collapse로 읎얎질 수 있닀. 또한 latent variable을 몚든 expert 넀튞워크에 latent 변수륌 지나가게 섀계하였닀.

def forward(self, z, c):
    coefficients = F.softmax(self.gate(torch.cat((z, c), dim=1)), dim=1)
    layer_out = c.

    for (weight, bias, activation) in self.decoder_layers:
        ...
        input = torch.cat((z, layer_out), dim=1).unsqueeze(1)
.       ...
    return layer_out

Motion quality and generalization

결곌묌 품질은 reconstruction곌 kl loss trade off로 읎룚얎지는데, 품질읎 더 높을 수록 synthesis가 읎룚얎지지 않을 수 있닀.

  • Reconstruction loss: 원볞 데읎터로부터 얌마나 잘 reconstruct되는지 error
  • KL divergence loss: 읎전 distribution에 얌마나 현재 latent space와 얌마나 닀륞지에 대한 error

읎 둘의 loss Ʞ쀀윌로 latent space가 잘 만듀얎졌는지에 대한 Ʞ쀀은 one order of magnitude 슉, 두 loss가 10ë°° 읎낎 찚읎륌 볎읎멎 heuristic하게 훈령 결곌 유추가 가능하닀.

Training stability

훈렚의 안정성을 위핎 3닚계로 나뉘얎 훈렚한닀. autoregression읎 듀얎가는 곌정에서 시간읎 지날 수록 예잡읎 점점 불안정한 묞제륌 지니고 있닀. 읎는 loss가 누적읎 되얎서 조걎읎 듀얎가게 되므로, 결곌 데읎터가 점점 읎상핎지게 된닀.

귞래서 닚계 별로 예잡 결곌륌 입력윌로 사용하는 비윚을 점찚 늘늬는 방향윌로 훈령 방향을 제시하고 있닀.

sample_schedule = torch.cat(
    (
        # First part is pure teacher forcing
        torch.zeros(teacher_epochs),
        # Second part with schedule sampling
        torch.linspace(0.0, 1.0, ramping_epochs),
        # last part is pure student
        torch.ones(student_epochs),
    )
)

Synthesis: Reinforcement learning

볞 연구에서 재구성된 잠재변수륌 통핎 원하는 행동윌로 제얎륌 강화학습을 통핎 가능핚을 볎여쀀닀. 볎상핚수에서는 볎통 exp핚수륌 쓰게 되는데, 읎는 자연슀러욎 볎상곌 지수에 듀얎가는 1에 귌접할 수록 Ʞ하꞉수적윌로 볎상을 많읎 쀌윌로썚, 귞에 맞게 행동읎 제얎되고 학습을 한닀.

자첎 싀험에서는 제공된 두 가지 환겜, Target Environment곌 Joystick Environment 두 개만 싀험을 진행하였닀.

Train

녌묞곌 닀륎게 섀정한 hyperparameter는 아래와 같닀.

LOCOMOTION_SUBJECTS = [2, 9, 16, 35, 38]
HIDDEN_UNITS = 256
LATENT_DIM = 32  # can impact likelihood of posterior collapse
NUM_EXPERTS = 6
BATCH_SIZE = 64
EPOCHS = 140
BETA = 0.2
FRAME_SIZE = 375
NUM_CONDITION_FRAMES = 1
NUM_FUTURE_PREDICTIONS = 1

locomotion 데읎터는 running category만 데읎터륌 넣었닀. 읎전 대학원에서 싀험한 결곌, VAE 닀륞 category로 쉜게 transition을 하지 못하는 몚습을 뎀었는데, 읎는, 닀양하고 복잡한 데읎터륌 하나의 정규분포로 압축하렀 하Ʞ 때묞읎닀. ê·ž 결곌, 동작 사읎륌 부드럜게 읎얎죌Ʞ볎닀 흐늿하거나 얎색한 결곌가 나였는 것을 확읞했닀. 녌묞 limitation에서 적혀있듯, 만앜 핎당 칎테고늬의 데읎터가 현저히 적윌멎, 읎러한 동작을 잘 ì°Ÿì§€ 못하여 one-hot encoding곌 같읎 별도의 condition을 죌는 방법윌로 학습하였닀고 한닀.

RTX 5060 환겜에서 학습하였윌며 CVAE는 앜 50분읎 소요되었고, controller는 앜 4시간 30분 가량 소요가 되었닀.

CVAE training

Reconstruction LossKL-divergence LossTotal Loss
losslossloss

Result

cvae

확싀히 window 사읎슈로 듀얎가던 읎전 autoencoder에서 훈령한 결곌와 달늬, 하나의 frame 조걎윌로 reconstuction읎 잘된 몚습읎닀.

Target EnvironmentJoystick Environment
cvaecvae

생각볎닀 제얎 결곌는 좋지 못한닀. 읎는 읎전에 학습한 cvae loss 사읎가 one order of magnitude륌 따륎지 않았윌며, 읎는 kl-loss가 reconstruction loss 비핎 낮아 posterior collapse가 발생하였닀. 예륌 듀얎 데읎터가 직진윌로 갔닥 우회하는 데읎터가 없윌멎 방향 틀Ʞ와 같은 제얎는 불가능하닀는 것읎닀. (stochastic 하닀는 의믞읎닀)

저자가 데읎터륌 공개하지 않았지만, 원 녌묞의 Fig 5.륌 확읞하멎 사용한 데읎터의 겜로가 나옚닀. 볎멎 Path follower 환겜에 맞는 데읎터륌 넣은 몚양읎고 ꞉격하게 돌아였는 acyclic한 몚션듀읎 많읎 듀얎간 몚양읎닀. 저자도 읎러한 점을 아는지 한계에 부가 섀명을 넣은 듯 ì‹¶ë‹€.

Code

윔드는 최대한 정늬핎서 아래 늬포지터늬에 낚겚놓았닀.

Authors