Bagaimana kegagalan pengoptimalan dapat di-debug dan dimitigasi?
Ringkasan: Jika model mengalami kesulitan pengoptimalan, sebaiknya perbaiki model tersebut sebelum mencoba hal lain. Mendiagnosis dan memperbaiki kegagalan pelatihan adalah bidang penelitian yang aktif.
Perhatikan hal-hal berikut terkait Gambar 4:
- Mengubah langkah tidak akan menurunkan performa pada kecepatan pembelajaran yang rendah.
- Kecepatan pembelajaran yang tinggi tidak lagi dilatih dengan baik karena ketidakstabilan.
- Menerapkan 1.000 langkah pemanasan kecepatan pembelajaran akan menyelesaikan kasus ketidakstabilan tertentu ini, sehingga memungkinkan pelatihan yang stabil dengan kecepatan pembelajaran maksimum 0,1.
Mengidentifikasi beban kerja yang tidak stabil
Beban kerja apa pun menjadi tidak stabil jika kecepatan pemelajaran terlalu besar. Ketidakstabilan hanya menjadi masalah jika memaksa Anda menggunakan kecepatan pemelajaran yang terlalu kecil. Setidaknya dua jenis ketidakstabilan pelatihan perlu dibedakan:
- Ketidakstabilan saat inisialisasi atau di awal pelatihan.
- Ketidakstabilan tiba-tiba di tengah pelatihan.
Anda dapat melakukan pendekatan sistematis untuk mengidentifikasi masalah stabilitas dalam beban kerja dengan melakukan hal berikut:
- Lakukan sweep kecepatan pembelajaran dan temukan kecepatan pembelajaran terbaik lr*.
- Memetakan kurva kerugian pelatihan untuk kecepatan pembelajaran tepat di atas lr*.
- Jika kecepatan pembelajaran > lr* menunjukkan ketidakstabilan kerugian (kerugian tidak meningkat selama periode pelatihan), memperbaiki ketidakstabilan biasanya akan meningkatkan pelatihan.
Catat norma L2 dari gradien kerugian penuh selama pelatihan, karena nilai pencilan dapat menyebabkan ketidakstabilan palsu di tengah pelatihan. Hal ini dapat menunjukkan seberapa agresif Anda harus memangkas gradien atau pembaruan berat.
CATATAN: Beberapa model menunjukkan ketidakstabilan sangat awal diikuti dengan pemulihan yang menghasilkan pelatihan yang lambat tetapi stabil. Jadwal evaluasi umum dapat melewatkan masalah ini karena tidak sering mengevaluasi.
Untuk memeriksanya, Anda dapat melatih lari yang disingkat hanya dari ~500 langkah
menggunakan lr = 2 * current best
, tetapi evaluasi setiap langkahnya.
Potensi perbaikan untuk pola ketidakstabilan umum
Pertimbangkan kemungkinan perbaikan berikut untuk pola ketidakstabilan umum:
- Terapkan pemanasan kecepatan pembelajaran. Ini cocok untuk ketidakstabilan pelatihan di awal.
- Terapkan pemotongan gradien. Ini bagus untuk ketidakstabilan awal dan menengah pelatihan, dan dapat memperbaiki beberapa inisialisasi buruk yang tidak bisa dilakukan pemanasan.
- Coba pengoptimal baru. Terkadang Adam dapat menangani ketidakstabilan yang tidak dapat dilakukan Momenttum. Ini adalah bidang penelitian yang aktif.
- Pastikan Anda menggunakan praktik terbaik dan inisialisasi terbaik untuk arsitektur model Anda (contoh akan diikuti). Tambahkan koneksi sisa dan normalisasi jika model belum memuatnya.
- Normalisasikan sebagai operasi terakhir sebelum residu. Contoh:
x + Norm(f(x))
Perlu diketahui bahwaNorm(x + f(x))
dapat menyebabkan masalah. - Coba inisialisasi cabang yang tersisa ke 0. (Lihat ReZero is All You Need: Konvergensi Cepat pada Kedalaman yang Besar.)
- Menurunkan kecepatan pemelajaran. Ini adalah upaya terakhir.
Pemanasan kecepatan pembelajaran
Kapan menerapkan pemanasan kecepatan pemelajaran
Gambar 7a menunjukkan plot sumbu hyperparameter yang menunjukkan bahwa model mengalami ketidakstabilan pengoptimalan, karena kecepatan pemelajaran terbaik berada tepat di tepi ketidakstabilan.
Gambar 7b menunjukkan cara memeriksanya kembali dengan memeriksa kerugian pelatihan dari model yang dilatih dengan kecepatan pemelajaran 5x atau 10x lebih besar dari puncak ini. Jika plot tersebut menunjukkan kenaikan kerugian yang tiba-tiba setelah penurunan yang stabil (misalnya pada langkah ~10k pada gambar di atas), model mungkin mengalami ketidakstabilan pengoptimalan.
Cara menerapkan pemanasan kecepatan pembelajaran
Misalkan unstable_base_learning_rate
menjadi kecepatan pemelajaran saat model menjadi tidak stabil, menggunakan prosedur sebelumnya.
Pemanasan melibatkan penambahan jadwal kecepatan pemelajaran yang meningkatkan kecepatan pembelajaran dari 0 ke base_learning_rate
stabil yang setidaknya berukuran satu urutan magnitudo lebih besar dari unstable_base_learning_rate
.
Defaultnya adalah mencoba base_learning_rate
sebesar 10x unstable_base_learning_rate
. Meskipun demikian, perhatikan bahwa seluruh prosedur ini dapat dijalankan lagi untuk sesuatu seperti unstable_base_learning_rate
100x. Jadwal khususnya adalah:
- Tingkatkan dari 0 menjadi base_learning_rate di atas warmup_steps.
- Latih dengan kecepatan konstan untuk post_warmup_steps.
Sasaran Anda adalah menemukan jumlah warmup_steps
terpendek yang memungkinkan Anda
mengakses kecepatan pembelajaran puncak yang jauh lebih tinggi daripada
unstable_base_learning_rate
.
Jadi, untuk setiap base_learning_rate
, Anda perlu menyesuaikan warmup_steps
dan
post_warmup_steps
. Biasanya tidak masalah untuk menetapkan post_warmup_steps
menjadi
2*warmup_steps
.
Pemanasan dapat disesuaikan secara independen dari jadwal peluruhan yang ada. warmup_steps
harus disapu dengan beberapa urutan besaran yang berbeda. Misalnya, contoh studi dapat mencoba [10, 1000, 10,000, 100,000]
. Titik kelayakan
terbesar tidak boleh lebih dari 10% dari max_train_steps
.
Setelah warmup_steps
yang tidak menghentikan pelatihan di base_learning_rate
telah dibuat, nilai tersebut harus diterapkan ke model dasar pengukuran.
Pada dasarnya, tambahkan jadwal ini ke jadwal yang ada, dan gunakan
pemilihan checkpoint optimal yang dibahas di atas untuk membandingkan eksperimen ini
dengan dasar pengukuran. Misalnya, jika awalnya kita memiliki 10.000 max_train_steps
dan melakukan warmup_steps
untuk 1.000 langkah, prosedur pelatihan baru akan
berjalan untuk total 11.000 langkah.
Jika warmup_steps
yang panjang diperlukan untuk pelatihan stabil (>5% dari max_train_steps
), Anda mungkin perlu meningkatkan max_train_steps
untuk memperhitungkan hal ini.
Tidak ada nilai "standar" yang benar-benar "standar" di seluruh berbagai beban kerja. Beberapa model hanya memerlukan 100 langkah, sementara model lain (terutama transformer) mungkin memerlukan 40 ribu langkah ke atas.
Pemotongan gradien
Pemotongan gradien sangat berguna ketika terjadi masalah gradien besar atau pencilan. Pemangkasan Gradien dapat memperbaiki salah satu masalah berikut:
- Ketidakstabilan pelatihan awal (norma gradien besar lebih awal)
- Ketidakstabilan pelatihan sedang (lonjakan gradien tiba-tiba di tengah pelatihan).
Terkadang periode pemanasan yang lebih lama dapat memperbaiki ketidakstabilan yang tidak dapat disesuaikan dengan pemotongan; untuk mengetahui detailnya, lihat Pemanasan kecepatan pembelajaran.
✘ Bagaimana dengan klip saat pemanasan?
Ambang batas klip yang ideal berada tepat di atas norma gradien "standar".
Berikut adalah contoh bagaimana penyesuaian nilai gradien dapat dilakukan:
- Jika norma gradien $\left | g \right |$ lebih besar dari ambang batas pemotongan gradien $\lambda$, maka lakukan ${g}'= \lambda \times \frac{g}{\left | g \right |}$ dengan ${g}'$ adalah gradien baru.
Catat norma gradien yang tidak terpotong selama pelatihan. Secara default, buat:
- Plot vs. norma gradien vs langkah
- Histogram norma gradien yang digabungkan pada semua langkah
Pilih batas pemotongan gradien berdasarkan persentil ke-90 norma gradien. Ambang batasnya bergantung pada beban kerja, tetapi 90% adalah titik awal yang baik. Jika 90% tidak berhasil, Anda dapat menyesuaikan nilai minimum ini.
⇩ Bagaimana dengan strategi adaptif?
Jika mencoba pemotongan gradien dan masalah ketidakstabilan tetap ada, Anda dapat mencobanya lebih keras; yaitu, Anda dapat memperkecil ambang batas.
Pemotongan gradien yang sangat agresif (yaitu, >50% update yang terpotong), pada dasarnya adalah cara yang aneh untuk mengurangi kecepatan pemelajaran. Jika Anda menggunakan clipping yang sangat agresif, sebaiknya Anda memotong kecepatan pemelajaran sebagai gantinya.
Mengapa kecepatan pembelajaran dan parameter pengoptimalan lainnya disebut hyperparameter? Parameter ini bukan parameter distribusi sebelumnya.
Istilah "hyperparameter" memiliki makna yang tepat dalam machine learning Bayesian, jadi mengacu pada kecepatan pembelajaran dan sebagian besar parameter deep learning lain yang dapat disesuaikan sebagai "hyperparameter" bisa jadi merupakan penyalahgunaan terminologi. Kami lebih suka menggunakan istilah "metaparameter" untuk kecepatan pembelajaran, parameter arsitektur, dan semua hal lain yang dapat disesuaikan, deep learning. Hal itu karena metaparameter menghindari potensi kebingungan yang disebabkan oleh penyalahgunaan kata "hyperparameter". Kebingungan ini sangat mungkin terjadi ketika membahas pengoptimalan Bayesian, saat model permukaan respons probabilistik memiliki hyperparameter yang sebenarnya.
Sayangnya, meskipun berpotensi membingungkan, istilah "hyperparameter" telah menjadi sangat umum dalam komunitas deep learning. Oleh karena itu, untuk dokumen ini, yang ditujukan untuk audiens luas yang mencakup banyak orang yang kemungkinan tidak menyadari hal teknis ini, kami membuat pilihan untuk berkontribusi pada satu sumber kebingungan di lapangan dengan harapan dapat menghindari hal lainnya. Meskipun demikian, kami mungkin membuat pilihan yang berbeda saat memublikasikan makalah penelitian, dan kami akan mendorong yang lain untuk menggunakan "metaparameter" bukan dalam sebagian besar konteks.
Mengapa ukuran tumpukan tidak boleh disesuaikan untuk secara langsung meningkatkan performa set validasi?
Mengubah ukuran batch tanpa mengubah detail pipeline pelatihan lainnya sering kali memengaruhi performa set validasi. Namun, perbedaan performa set validasi antara dua ukuran batch biasanya akan hilang jika pipeline pelatihan dioptimalkan secara independen untuk setiap ukuran batch.
Hyperparameter yang berinteraksi paling kuat dengan ukuran tumpukan, sehingga yang paling penting adalah penyesuaian secara terpisah untuk setiap ukuran tumpukan, adalah hyperparameter dalam pengoptimal (misalnya, kecepatan pembelajaran, momentum) dan hyperparameter regularisasi. Ukuran batch yang lebih kecil menyebabkan lebih banyak derau ke dalam algoritma pelatihan karena varians sampel. Derau ini dapat memiliki efek regularisasi. Dengan demikian, ukuran tumpukan yang lebih besar dapat lebih rentan terhadap overfit dan mungkin memerlukan regularisasi yang lebih kuat dan/atau teknik regularisasi tambahan. Selain itu, Anda mungkin perlu menyesuaikan jumlah langkah pelatihan saat mengubah ukuran tumpukan.
Setelah semua efek ini diperhitungkan, tidak ada bukti yang meyakinkan bahwa ukuran tumpukan memengaruhi performa validasi maksimum yang dapat dicapai. Untuk mengetahui detailnya, lihat Shallue et al. 2018.
Apa saja aturan pembaruan untuk semua algoritma pengoptimalan yang populer?
Bagian ini menyediakan aturan pembaruan untuk beberapa algoritma pengoptimalan yang populer.
Penurunan gradien stokastik (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
Dengan $\eta_t$ adalah kecepatan pemelajaran pada langkah $t$.
Momentum
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
Dengan $\eta_t$ adalah kecepatan pemelajaran pada tahap $t$, dan $\gamma$ adalah koefisien momentum.
Nesterov
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
Dengan $\eta_t$ adalah kecepatan pemelajaran pada tahap $t$, dan $\gamma$ adalah koefisien momentum.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
ADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
NADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]