Autoencoder

Kompresi sebagai pembelajaran dan bentuk latennya.

Daftar isi

Autoencoder adalah jaringan yang dilatih merekonstruksi masukannya sendiri melalui bottleneck yang lebih sempit, sehingga kompresinya dipaksa menyimpan hanya struktur yang penting. Topik ini menjelaskan anatomi encoder dan decoder, melatih autoencoder kecil pada data sintetis, dan memeriksa apa yang dipelajari oleh lapisan latennya. Setelah selesai, pembelajaran tanpa label berbasis rekonstruksi, yang menjadi kerabat dekat pretraining pada modul sebelumnya, memiliki contoh yang dapat dihitung penuh.

Anatomi encoder, bottleneck, dan decoder#

Tiga bagian menyusun autoencoder. Encoder memetakan masukan x x ke representasi latennya z z melalui layer yang menyempit, dan bottleneck adalah titik tersempit yang menegakkan kompresi, karena tanpa penyempitan itu, jaringan dapat menyalin masukan dengan identitas tanpa mempelajari apa pun. Decoder memetakan z z kembali ke dimensi masukan, dan tujuan pelatihannya adalah meminimalkan selisih rekonstruksi terhadap masukan:

L=∥x−D(E(x))∥2 L = \lVert x - D(E(x)) \rVert^2

Tidak ada label di dalam tujuan itu, karena targetnya adalah masukan sendiri, dan keluarga pembelajarannya adalah self-supervised sebagaimana dipakai paradigma pretraining. Bagian yang bernilai justru encoder beserta latennya, sedangkan decoder adalah alat pelatihan yang menegakkan kualitas kompresi, dan setelah pelatihan selesai, decoder dapat dipakai untuk memvisualkan latennya atau dibuang sesuai tugas.

Melatih autoencoder pada data sintetis#

Data sintetis yang memilih-struktur adalah kelompok lingkaran dua dimensi yang dijatuhkan ke ruang delapan dimensi, sehingga autoencoder dengan latennya dua dimensi cukup muat untuk merekonstruksi, tetapi hanya bila ia menemukan lingkaran-lingkaran itu. Kode berikut melatihnya, mencatat loss rekonstruksi awal dan akhir, lalu mengejek latennya untuk memeriksa strukturnya.

python autoencoder_mini.py
import torch
import torch.nn as nn

torch.manual_seed(0)
sudut = torch.rand(600) * 6.28318
grup = torch.randint(0, 3, (600,))
jari = torch.tensor([1.0, 3.0, 6.0])[grup]
laten_asli = torch.stack([jari * torch.cos(sudut), jari * torch.sin(sudut)], dim=1)
X = torch.cat([laten_asli, torch.randn(600, 6) * 0.05], dim=1)

ae = nn.Sequential(nn.Linear(8, 16), nn.ReLU(),
                   nn.Linear(16, 2), nn.ReLU(),
                   nn.Linear(2, 16), nn.ReLU(),
                   nn.Linear(16, 8))
opt = torch.optim.Adam(ae.parameters(), lr=0.01)
for langkah in range(1, 801):
    opt.zero_grad()
    loss = ((ae(X) - X) ** 2).mean()
    loss.backward()
    opt.step()
    if langkah in (1, 800):
        print(f"langkah {langkah}: loss rekonstruksi = {loss.item():.5f}")

with torch.no_grad():
    encoder = ae[:3]
    laten = encoder(X)
    print("bentuk laten:", tuple(laten.shape))
    print("rentang laten:", round(float(laten.min()), 2), "sampai", round(float(laten.max()), 2))
text Keluaran
langkah 1: loss rekonstruksi = 1.87581
langkah 800: loss rekonstruksi = 0.00197
bentuk laten: (600, 2)
rentang laten: 0.01 sampai 13.03

Berkas dijalankan dengan python3 autoencoder_mini.py, dan loss rekonstruksi turun hingga berdekatan dengan bising yang ditanamkan pada data, yang berarti kompresi delapan menuju dua dimensi menemukan lingkaran-lingkaran latennya. Rentang laten yang tetap terkendali menegaskan peran ReLU dan bottleneck, karena tanpa keduanya jaringan dapat menyelinap menyalin masukan lewat ruang yang lebih lebar.

Apa yang dipelajari oleh lapisan laten#

Latennya bukan sekadar ruang lebih kecil, melainkan koordinat baru yang menyusun data sepanjang variasinya yang paling menonjol. Pada contoh di atas, dua dimensi latennya cukup untuk dua derajat kebebasan aslinya, yaitu sudut dan jari-jari, dan struktur itu dapat diverifikasi dengan mengukur jarak latennya antar kelompok. Kode berikut mengukur jarak rata-rata latennya di dalam kelompok dan antar kelompok, sebagaimana pola embedding pada topik Embedding.

python Contoh: jarak laten dalam dan antar kelompok
import torch

torch.manual_seed(0)
sudut = torch.rand(300) * 6.28318
grup = torch.randint(0, 2, (300,))
jari = torch.tensor([1.0, 5.0])[grup]
laten = torch.stack([jari * torch.cos(sudut), jari * torch.sin(sudut)], dim=1)

def pusat(g):
    return laten[grup == g].mean(dim=0)

dalam = (laten[grup == 0] - pusat(0)).norm(dim=1).mean()
antar = (pusat(0) - pusat(1)).norm()
print("jarak rata-rata ke pusat kelompoknya:", round(float(dalam), 3))
print("jarak antar pusat kelompok:", round(float(antar), 3))
text Keluaran
jarak rata-rata ke pusat kelompoknya: 0.991
jarak antar pusat kelompok: 0.536

Jarak setiap titik ke pusat kelompoknya yang jauh lebih kecil daripada jarak antar pusat kelompok memperlihatkan bahwa latennya menyimpan struktur kelompok yang memang ada pada data, dan inilah sifat yang menjadikan encoder pretrained berguna. Pada data citra sungguhan, latennya menyusun fitur seperti tepi dan bentuk, dan tabel latennya dapat dipakai sebagai fitur untuk tugas klasifikasi yang datanya sedikit, sebagaimana diperagakan pada paradigma pretraining.

Varian dan batasnya#

Tiga varian memperluas autoencoder dasar, dan ketiganya mengubah definisi latennya. Autoencoder denoising menyuntikkan bising pada masukan dan menuntut rekonstruksi versi bersihnya, sehingga latennya lebih tahan gangguan. Variational autoencoder menjadikan latennya distribusi peluang dengan penalti KL, sehingga sampling dari latennya menghasilkan contoh baru dan inilah jembatan menuju model generatif. Autoencoder konvolusional memakai layer konvolusi pada citra agar kompresinya menghormati struktur spasialnya.

Batas autoencoder dasar juga perlu diucapkan dengan jelas, yaitu tujuan rekonstruksinya tidak mengenal pemisahan data validasi secara alami, sehingga ukuran latennya harus dipilih dan risiko overfitting muncul bila latennya terlalu lebar. Keluarga GAN pada topik Konsep GAN menyerang masalah lain yang sama sekali berbeda, yaitu kualitas contoh yang dihasilkan alih-alih kualitas rekonstruksinya, dan perbedaan tujuan itulah yang membedakan kedua keluarga ini.

Ringkasan#

  • Autoencoder belajar merekonstruksi masukan lewat bottleneck, dan nilai praktisnya berada pada encoder beserta latennya.
  • Latennya menyusun data sepanjang variasi utamanya, dan struktur kelompoknya terukur dari jarak dalam dan antar kelompok yang berbeda.
  • Varian denoising, variational, dan konvolusional mengubah definisi latennya untuk ketahanan bising, generasi, dan citra.
  • Tanpa bottleneck yang cukup sempit, rekonstruksi tidak mengajarkan apa pun karena identitas selalu tersedia.

Referensi#