Connect with us

Kecerdasan buatan

Memahami Model Difusi: Menyelami Lebih Dalam tentang AI Generatif

mm
Understanding Diffusion Models: A Deep Dive into Generative AI

Model difusi telah muncul sebagai pendekatan yang kuat dalam AI generatif, menghasilkan hasil yang mutakhir dalam generasi gambar, audio, dan video. Dalam artikel teknis mendalam ini, kita akan mengeksplorasi cara kerja model difusi, inovasi kuncinya, dan mengapa mereka menjadi begitu sukses. Kita akan membahas fondasi matematika, proses pelatihan, algoritma sampling, dan aplikasi terkini dari teknologi baru yang menarik ini.

Pengantar Model Difusi

Model difusi adalah kelas model generatif yang belajar untuk secara bertahap menghilangkan noise dari data dengan membalikkan proses difusi. Ide intinya adalah memulai dengan noise murni dan secara iteratif menyempurnakannya menjadi sampel berkualitas tinggi dari distribusi target.

Pendekatan ini terinspirasi oleh termodinamika non-keseimbangan – khususnya, proses membalikkan difusi untuk memulihkan struktur. Dalam konteks pembelajaran mesin, kita dapat menganggapnya sebagai belajar membalikkan penambahan noise bertahap ke data.

Beberapa keunggulan utama model difusi meliputi:

  • Kualitas gambar mutakhir, melampaui GAN dalam banyak kasus
  • Pelatihan stabil tanpa dinamika adversarial
  • Sangat dapat diparalelkan
  • Arsitektur fleksibel – model apa pun yang memetakan input ke output dengan dimensi yang sama dapat digunakan
  • Landasan teoretis yang kuat

Mari kita selami lebih dalam cara kerja model difusi.

Source: Song et al.

Source: Song et al.

Persamaan Diferensial Stokastik mengatur proses maju dan mundur dalam model difusi. SDE maju menambahkan noise ke data, secara bertahap mengubahnya menjadi distribusi noise. SDE mundur, dipandu oleh fungsi skor yang dipelajari, secara progresif menghilangkan noise, mengarah pada pembuatan gambar yang realistis dari noise acak. Pendekatan ini kunci untuk mencapai kinerja generatif berkualitas tinggi dalam ruang keadaan kontinu

Proses Difusi Maju

Proses difusi maju dimulai dengan titik data x₀ yang diambil dari distribusi data nyata, dan secara bertahap menambahkan noise Gaussian selama T langkah waktu untuk menghasilkan versi yang semakin berisik x₁, x₂, …, xT.

Pada setiap langkah waktu t, kita menambahkan sejumlah kecil noise sesuai dengan:

x_t = √(1 - β_t) * x_{t-1} + √(β_t) * ε

Di mana:

  • β_t adalah jadwal varians yang mengontrol berapa banyak noise yang ditambahkan pada setiap langkah
  • ε adalah noise Gaussian acak

Proses ini berlanjut hingga xT hampir murni noise Gaussian.

Secara matematis, kita dapat mendeskripsikan ini sebagai rantai Markov:

q(x_t | x_{t-1}) = N(x_t; √(1 - β_t) * x_{t-1}, β_t * I)

Di mana N menunjukkan distribusi Gaussian.

Jadwal β_t biasanya dipilih kecil untuk langkah waktu awal dan meningkat seiring waktu. Pilihan umum meliputi jadwal linear, kosinus, atau sigmoid.

Proses Difusi Mundur

Tujuan model difusi adalah mempelajari kebalikan dari proses ini – untuk memulai dengan noise murni xT dan secara progresif menghilangkan noise-nya untuk memulihkan sampel bersih x₀.

Kami memodelkan proses mundur ini sebagai:

p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_θ^2(x_t, t))

Di mana μ_θ dan σ_θ^2 adalah fungsi yang dipelajari (biasanya jaringan saraf) yang diparameterisasi oleh θ.

Inovasi kuncinya adalah kita tidak perlu secara eksplisit memodelkan distribusi mundur penuh. Sebagai gantinya, kita dapat memparameterisasinya dalam hal proses maju, yang kita ketahui.

Secara spesifik, kita dapat menunjukkan bahwa mean proses mundur optimal μ* adalah:

μ* = 1/√(1 - β_t) * (x_t - β_t/√(1 - α_t) * ε_θ(x_t, t))

Di mana:

  • α_t = 1 – β_t
  • ε_θ adalah jaringan prediksi noise yang dipelajari

Ini memberi kita tujuan yang sederhana – latih jaringan saraf ε_θ untuk memprediksi noise yang ditambahkan pada setiap langkah.

Tujuan Pelatihan

Tujuan pelatihan untuk model difusi dapat diturunkan dari inferensi variasional. Setelah beberapa penyederhanaan, kita sampai pada loss L2 sederhana:

L = E_t,x₀,ε [ ||ε - ε_θ(x_t, t)||² ]

Di mana:

  • t diambil secara seragam dari 1 ke T
  • x₀ diambil dari data pelatihan
  • ε adalah noise Gaussian yang diambil
  • x_t dibangun dengan menambahkan noise ke x₀ sesuai proses maju

Dengan kata lain, kita melatih model untuk memprediksi noise yang ditambahkan pada setiap langkah waktu.

Arsitektur Model

Arsitektur U-Net adalah pusat dari langkah penghilangan noise dalam model difusi. Ini menampilkan struktur encoder-decoder dengan koneksi skip yang membantu melestarikan detail halus selama proses rekonstruksi. Encoder secara progresif melakukan downsampling pada gambar input sambil menangkap fitur tingkat tinggi, dan decoder melakukan up-sampling pada fitur yang dienkode untuk merekonstruksi gambar. Arsitektur ini sangat efektif dalam tugas yang memerlukan lokalisasi yang tepat, seperti segmentasi gambar.

Jaringan prediksi noise ε_θ dapat menggunakan arsitektur apa pun yang memetakan input ke output dengan dimensi yang sama. Arsitektur gaya U-Net adalah pilihan populer, terutama untuk tugas pembuatan gambar.

Arsitektur tipikal mungkin terlihat seperti:

 class DiffusionUNet(nn.Module): def __init__(self): super().__init__() # Downsampling self.down1 = UNetBlock(3, 64) self.down2 = UNetBlock(64, 128) self.down3 = UNetBlock(128, 256) # Bottleneck self.bottleneck = UNetBlock(256, 512) # Upsampling self.up3 = UNetBlock(512, 256) self.up2 = UNetBlock(256, 128) self.up1 = UNetBlock(128, 64) # Output self.out = nn.Conv2d(64, 3, 1) def forward(self, x, t): # Embed timestep t_emb = self.time_embedding(t) # Downsample d1 = self.down1(x, t_emb) d2 = self.down2(d1, t_emb) d3 = self.down3(d2, t_emb) # Bottleneck bottleneck = self.bottleneck(d3, t_emb) # Upsample u3 = self.up3(torch.cat([bottleneck, d3], dim=1), t_emb) u2 = self.up2(torch.cat([u3, d2], dim=1), t_emb) u1 = self.up1(torch.cat([u2, d1], dim=1), t_emb) # Output return self.out(u1) 

Komponen kuncinya adalah:

  • Arsitektur gaya U-Net dengan koneksi skip
  • Embedding waktu untuk mengkondisikan pada langkah waktu
  • Kedalaman dan lebar yang fleksibel

Algoritma Sampling

Setelah kita melatih jaringan prediksi noise ε_θ, kita dapat menggunakannya untuk menghasilkan sampel baru. Algoritma sampling dasarnya adalah:

  1. Mulai dengan noise Gaussian murni xT
  2. Untuk t = T ke 1:
    • Prediksi noise: ε_θ(x_t, t)
    • Hitung mean: μ = 1/√(1-β_t) * (x_t - β_t/√(1-α_t) * ε_θ(x_t, t))
    • Sample: x_{t-1} ~ N(μ, σ_t^2 * I)
  3. Kembalikan x₀

Proses ini secara bertahap menghilangkan noise pada sampel, dipandu oleh jaringan prediksi noise yang kita pelajari.

Dalam praktiknya, ada berbagai teknik sampling yang dapat meningkatkan kualitas atau kecepatan:

  • Sampling DDIM: Varian deterministik yang memungkinkan lebih sedikit langkah sampling
  • Sampling leluhur: Menggabungkan varians yang dipelajari σ_θ^2
  • Sampling terpotong: Berhenti lebih awal untuk generasi yang lebih cepat

Berikut adalah implementasi dasar dari algoritma sampling:

def sample(model, n_samples, device): # Start with pure noise x = torch.randn(n_samples, 3, 32, 32).to(device) for t in reversed(range(1000)): # Add noise to create x_t t_batch = torch.full((n_samples,), t, device=device) noise = torch.randn_like(x) x_t = add_noise(x, noise, t) # Predict and remove noise pred_noise = model(x_t, t_batch) x = remove_noise(x_t, pred_noise, t) # Add noise for next step (except at t=0) if t > 0: noise = torch.randn_like(x) x = add_noise(x, noise, t

I have spent the past five years immersing myself in the fascinating world of Machine Learning and Deep Learning. My passion and expertise have led me to contribute to over 50 diverse software engineering projects, with a particular focus on AI/ML. My ongoing curiosity has also drawn me toward Natural Language Processing, a field I am eager to explore further.