Hinton dan Salakhutdinov dalam Mengurangi Dimensi Data dengan Neural Networks, Science 2006 mengusulkan PCA non-linear melalui penggunaan autoencoder yang mendalam. Saya telah mencoba membangun dan melatih autoencoder PCA dengan Tensorflow beberapa kali tetapi saya tidak pernah dapat memperoleh hasil yang lebih baik daripada PCA linier.
Bagaimana saya bisa melatih autoencoder secara efisien?
(Kemudian diedit oleh @amoeba: versi asli dari pertanyaan ini berisi kode Python Tensorflow yang tidak berfungsi dengan benar. Orang dapat menemukannya di riwayat edit.)
Jawaban:
Berikut adalah tokoh kunci dari makalah Science 2006 oleh Hinton dan Salakhutdinov:
Ini menunjukkan pengurangan dimensi dataset MNIST ( gambar hitam dan putih dari satu digit) dari 784 dimensi asli menjadi dua.28 × 28
Kode ini disalin dari notebook Jupyter. Dalam Python 3.6 Anda perlu menginstal matplotlib (untuk pylab), NumPy, seaborn, TensorFlow dan Keras. Saat menjalankan shell Python, Anda mungkin perlu menambahkan
plt.show()
untuk memperlihatkan plot.Inisialisasi
PCA
Output ini:
Pelatihan autoencoder
Ini membutuhkan ~ 35 detik pada desktop pekerjaan saya dan menghasilkan:
jadi Anda sudah bisa melihat bahwa kami melampaui kehilangan PCA setelah hanya dua zaman pelatihan.
(Omong-omong, itu adalah instruktif untuk mengubah semua fungsi aktivasi ke
activation='linear'
dan untuk mengamati bagaimana kerugian konvergen tepat ke hilangnya PCA. Itu karena autoencoder linier setara dengan PCA.)Merencanakan proyeksi PCA berdampingan dengan representasi bottleneck
Rekonstruksi
Dan sekarang mari kita lihat rekonstruksi (baris pertama - gambar asli, baris kedua - PCA, baris ketiga - autoencoder):
Seseorang dapat memperoleh hasil yang lebih baik dengan jaringan yang lebih dalam, beberapa regularisasi, dan pelatihan yang lebih lama. Percobaan. Belajar mendalam itu mudah!
sumber
from __future__ import absolute_import from __future__ import division from __future__ import print_function
Alat peraga besar untuk @amoeba untuk membuat contoh yang bagus. Saya hanya ingin menunjukkan bahwa pelatihan auto-encoder dan prosedur rekonstruksi yang dijelaskan dalam pos itu dapat dilakukan juga di R dengan kemudahan yang sama. Auto-encoder di bawah ini adalah setup sehingga mengemulasi contoh amuba sedekat mungkin - pengoptimal yang sama dan arsitektur keseluruhan. Biaya pastinya tidak dapat direproduksi karena back-end TensorFlow tidak diunggulkan dengan cara yang sama.
Inisialisasi
PCA
Autoencoder
Merencanakan proyeksi PCA berdampingan dengan representasi bottleneck
Rekonstruksi
Kita bisa melakukan rekonstruksi digit dengan cara biasa. (Baris atas adalah digit asli, baris tengah rekonstruksi PCA dan baris bawah rekonstruksi autoencoder.)
sumber
Ini adalah notebook jupyter saya tempat saya mencoba mereplikasi hasil Anda, dengan perbedaan-perbedaan berikut:
Input PCA disimpan menjadi data dengan mean = 0 dan std = 1Mungkin saya akan menjalankannya kembali nanti dengan data [0-1] untuk PCA dan AEHasil MSE saya untuk PCA dari pengurangan dimensi 1 hingga 6 (di mana input memiliki 6 kolom) dan untuk AE dari redup. merah. dari 1 hingga 6 di bawah ini:
Dengan input PCA sedang (berarti = 0, std = 1) sedangkan input AE menjadi [0-1] berkisar - 4e-15: PCA6 - .015: PCA5 - .0502: AE5 - .0508: AE6 - .051: AE4 - .053: AE3 - .157: PCA4 - .258: AE2 - .259: PCA3 - .377: AE1 - .483: PCA2 - .682: PCA1PCA linier tanpa pengurangan dimensi dapat mencapai 9e-15 karena hanya dapat mendorong apa pun yang tidak dapat masuk ke komponen terakhir.
sumber