Published on

πŸ“– STUDY λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” μƒμ„±ν˜• AI | 생성적 μ λŒ€ 신경망

Generative Adversarial Network

GAN

μ΄ν•˜ GAN은 μƒμ„±μžμ™€ νŒλ³„μž κ°„μ˜ trade off둜 데이터λ₯Ό μƒμ„±ν•œλ‹€. 이 λ•Œ μƒμ„±μžλŠ” λ…Έμ΄μ¦ˆμ—μ„œ 원본을 μƒ˜ν”Œλ§ν•œ 것과 같이 μƒ˜ν”Œμ„ λ³€ν™˜ν•˜λ©°, νŒλ³„μžλŠ” μƒμ„±μžμ˜ μœ„μ‘°ν’ˆμΈμ§€λ₯Ό μ˜ˆμΈ‘ν•œλ‹€. μ „μ²΄μ μœΌλ‘œ μƒμ„±μžλŠ” μƒ˜ν”Œμ„ 생성해내고, νŒλ³„μžλŠ” μ§„μœ„μ—¬λΆ€λ₯Ό νŒλ³„ν•˜κ²Œ λ˜λŠ”λ°, ν›ˆλ ¨μ΄ κ±°λ“­ν•  수둝 μƒμ„±μžλŠ” νŒλ³„μžλ₯Ό 속일 μƒˆλ‘œμš΄ 방법을 찾게 λœλ‹€.

μ±…μ—μ„œ λ‚˜μ˜¨ GAN의 μœ ν˜•μ€ μ•„λž˜μ™€ κ°™λ‹€.

  • Deep Convolutional GAN
  • WGAN
  • CGAN

DCGAN

μƒμ„±λœ μ΄λ―Έμ§€λŠ” 이미지 사이 거리(L1 norm)둜 μœ μ‚¬ν•œ μƒ˜ν”Œμ„ 보여쀀닀.

GAN ν›ˆλ ¨ 팁과 트릭

νŒλ³„μžκ°€ μƒμ„±μžλ³΄λ‹€ λ›°μ–΄λ‚œ 경우

νŒλ³„μžκ°€ κ°•ν•˜λ©΄ μ†μ‹€ν•¨μˆ˜ μ‹ ν˜Έκ°€ μ•½ν•΄μ Έ μ§„μ§œμ™€ κ°€μ§œλ₯Ό μ™„λ²½ν•˜κ²Œ κ΅¬λΆ„ν•˜κ³  κ·Έλž˜λ””μ–ΈνŠΈκ°€ 사라져 ν•™μŠ΅μ΄ 이루어지지 μ•Šμ„ 수 μžˆλ‹€. μƒμ„±μžκ°€ ν–₯μƒλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŒλ³„μžλ₯Ό μ•½ν™”μ‹œν‚΄

  • νŒλ³„μž Dropout측의 rate λ§€κ°œλ³€μˆ˜ 증가 ➑️ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 흐λ₯΄λŠ” 정보양 μ€„μž„
  • νŒλ³„μžμ˜ ν•™μŠ΅λ₯ μ„ μ€„μž„
  • νŒλ³„μžμ˜ ν•©μ„±κ³± ν•„ν„° 수λ₯Ό μ€„μž„
  • νŒλ³„μžλ₯Ό ν›ˆλ ¨ν•  λ•Œ λ ˆμ΄λΈ”μ— 작음 μΆ”κ°€
  • νŒλ³„μž ν›ˆλ ¨ μ‹œ 일뢀 이미지 λ ˆμ΄λΈ”μ„ λ¬΄μž‘μœ„λ‘œ λ’€μ§‘μŒ

μƒμ„±μžκ°€ νŒλ³„μžλ³΄λ‹€ λ›°μ–΄λ‚œ 경우: mode collapse

mode = νŒλ³„μžλ₯Ό 항상 μ†μ΄λŠ” ν•˜λ‚˜μ˜ μƒ˜ν”Œ mode만으둜 νŒλ³„μžλ₯Ό μ‰½κ²Œ μ†μ΄λ―€λ‘œ μƒμ„±μž μž…μž₯μ—μ„œλŠ” λ‹€μ–‘ν•œ 좜λ ₯의 ν•„μš”μ„±μ΄ μ—†λ‹€.

μœ μš©ν•˜μ§€ μ•Šμ€ 손싀

μƒμ„±μžμ˜ 손싀과 이미지 ν’ˆμ§ˆλ‘œ 이루어지지 μ•Šμ„ 수 μžˆλ‹€. μƒμ„±μžμ˜ κ²°κ³ΌλŠ” νŒλ³„μžμ— μ˜ν•΄μ„œλ§Œ ν‰κ°€λ˜κ³ , νŒλ³„μžλŠ” μ§€μ†μ μœΌλ‘œ ν–₯μƒλ˜κΈ° λ•Œλ¬Έμ— ν›ˆλ ¨ κ³Όμ •μ˜ λ‹€λ₯Έ μ§€μ μ—μ„œ ν‰κ°€λœ 손싀을 비ꡐ할 수 μ—†λ‹€.

ν•˜μ΄νΌνŒŒλΌλ―Έν„°

  • batch normalization
  • dropout
  • learning rate
  • activation layer
  • convolutional filter
  • kernel size
  • batch size
  • latent dimension

πŸ“Œ νšŒμƒ‰μ΄ DCGAN, 청둝색은 WGAN

DiscriminatorGenerator
epoch_d_lossepoch_g_loss
epoch_d_lossepoch_d_loss

κ²°κ³Ό μ΄λ―Έμ§€λŠ” μ•„λž˜μ™€ κ°™λ‹€.

result

WGAN-GP

WGAN

κΈ°μ‘΄ GAN의 μ†μ‹€ν•¨μˆ˜λŠ” μ•„λž˜μ™€ 같이 κ³„μ‚°λœλ‹€.

d_real_loss = criterion(real_predictions, real_noisy_labels)
g_loss = criterion(fake_predictions, real_labels)

μ™€μ„œμŠ€ν…ŒμΈ μ†μ‹€ν•¨μˆ˜λŠ” [0,1] λ§ˆμ§€λ§‰ 측에 μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό μ œκ±°ν•˜μ—¬ 예츑 λ²”μœ„κ°€ [0,1]이 μ•„λ‹Œ μ–΄λ–€ μˆ«μžκ°€ 될 수 μžˆλ„λ‘ ν•œλ‹€. ν•˜μ§€λ§Œ 비평가(=νŒλ³„μž)에 좔가적인 μ œμ•½μ„ κ°€ν•΄μ•Ό ν•œλ‹€.

∣D(x1)βˆ’D(x2)βˆ£β‰€βˆ£x1βˆ’x2∣∣D(x_1)βˆ’D(x_2)βˆ£β‰€βˆ£x_1βˆ’x_2∣

μž„μ˜μ˜ 두 μž…λ ₯ 이미지에 λŒ€ν•΄ λ‹€μŒ μ˜ˆμΈ‘μ— κ΄€ν•΄μ„œ λΉ„μœ¨μ„ μ œν•œν•œλ‹€. κ°€μ€‘μΉ˜λ₯Ό 클립핑 ν•˜λ‹€λ³΄λ©΄ ν•™μŠ΅ 속도가 크게 κ°μ†Œν•˜κ²Œ λœλ‹€. μ—¬κΈ°μ„œ μΆ”κ°€ν•œ λ°©λ²•μœΌλ‘œλŠ” gradientκ°€ norm 1을 λ²—μ–΄λ‚  경우 gradient penaltyλ₯Ό μ£Όμ–΄ 비평가에 μΆ”κ°€ μ‹œμΌœ λ¦½μ‹œμΈ  μ œμ•½ 쑰건을 직접 κ°•μ œν•œλ‹€.

c_wass_loss = torch.mean(fake_pred) - torch.mean(real_pred)
c_gp = self.gradient_penalty(batch_size, real_images, fake_images)
c_loss = c_wass_loss + self.gp_weight * c_gp

# Gradient Penalty
norm = torch.sqrt(torch.sum(gradients**2, dim=1))
gp = torch.mean((norm - 1.0) ** 2)

ν›ˆλ ¨ κ³Όμ •λ™μ•ˆ κ·Έλž˜λ””μ–ΈνŠΈλŠ” 일뢀 λ¬΄μž‘μœ„ μ§€μ μ—μ„œ λ³΄κ°„ν•œ 이미지듀을 μ΄μš©ν•œλ‹€. μ•ˆνƒ€κΉκ²Œλ„ WGAN의 νŠΉμ„±μƒ ν›ˆλ ¨μ‹œκ°„μ΄ κΈ΄ κ΄€κ³„λ‘œ epoch 40μ—μ„œ λŠμ—ˆλ‹€. μ›λž˜λΌλ©΄μ€ 일반 λͺ¨λΈμ— λΉ„ν•΄ μ•ˆμ •μ μœΌλ‘œ ν›ˆλ ¨μ΄ λœλ‹€.

Critic lossGenerator loss
epoch_c_lossepoch_g_loss
epoch_c_wass_lossepoch_c_gp

λ―Έμ™„μ„±μ΄μ§€λ§Œ.. κ²°κ³Ό μ΄λ―Έμ§€λŠ” μ•„λž˜μ™€ κ°™λ‹€.

wgan-gp

CGAN

속성을 쑰건으둜 λΆ€μ—¬ν•˜λŠ” GAN λͺ¨λΈ ν˜•νƒœ. λ ˆμ΄λΈ”κ³Ό κ΄€λ ¨λœ 정보λ₯Ό μƒμ„±μžμ™€ λΉ„ν‰μžμ—κ²Œ μ „λ‹¬ν•˜λŠ” 차이점이 μžˆλ‹€. 쑰건을 λΆ€μ—¬ν•¨μœΌλ‘œμ¨, 좜λ ₯을 μ œμ–΄ν•  수 μžˆλ‹€. λ˜ν•œ κ°œλ³„ νŠΉμ„±μ΄ λΆ„λ¦¬λ˜λ„λ‘ μž μž¬κ³΅κ°„μ„ ꡬ성할 수 μžˆλ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ λ―Έμ™„μ„±μ΄μ§€λ§Œ.. κ²°κ³Ό μ΄λ―Έμ§€λŠ” μ•„λž˜μ™€ κ°™λ‹€.

cgan

ν•΄λ‹Ή μ½”λ“œμ™€ torch migration은 μ•„λž˜ repository에 μ²¨λΆ€ν•˜μ˜€λ‹€.

Authors