Saya mencoba untuk melatih satu perceptron (1000 unit input, 1 output, tanpa lapisan tersembunyi) pada 64 titik data yang dihasilkan secara acak. Saya menggunakan Pytorch menggunakan pengoptimal Adam:
import torch
from torch.autograd import Variable
torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1
x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))
model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
y_pred = model(x)
loss = loss_fn(y_pred, y)
print(t, loss.data[0])
optimizer.zero_grad()
loss.backward()
optimizer.step()
Awalnya, kerugian dengan cepat berkurang, seperti yang diharapkan:
(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)
Sekitar 300 iterasi, kesalahan mencapai mendekati nol:
(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)
Ini berlangsung selama beberapa ribu iterasi. Namun, setelah pelatihan terlalu lama, kesalahan mulai meningkat lagi:
(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)
Mengapa ini terjadi?
perceptron
pytorch
Bai Li
sumber
sumber
Jawaban:
Ketidakstabilan kecil ini pada akhir konvergensi adalah fitur Adam (dan RMSProp) karena bagaimana ia memperkirakan besaran gradien rata-rata pada langkah-langkah terbaru dan membaginya.
Ini sebenarnya membuat Adam kurang stabil dan lebih buruk untuk masalah Anda daripada penurunan gradien yang lebih dasar, dengan asumsi Anda ingin mendapatkan angka nol mendekati nol karena perhitungan memungkinkan untuk masalah Anda.
Dalam praktik pada masalah pembelajaran yang mendalam, Anda tidak mendekati konvergensi (dan untuk beberapa teknik regularisasi seperti berhenti dini, Anda tidak ingin melakukannya), jadi biasanya bukan masalah praktis tentang jenis masalah yang Adam dirancang untuk.
Anda benar-benar dapat melihat ini terjadi untuk RMSProp dalam perbandingan pengoptimal yang berbeda (RMSProp adalah garis hitam - perhatikan langkah-langkah terakhir tepat ketika mencapai target):
Anda dapat membuat Adam lebih stabil dan bisa lebih dekat dengan konvergensi sejati dengan mengurangi tingkat pembelajaran. Misalnya
lr=1e-5
sumber
Alasannya persis seperti yang disebutkan dalam jawaban lain dengan saran yang bagus untuk menggunakan tingkat pembelajaran yang lebih kecil untuk menghindari masalah ini di sekitar gradien kecil.
Saya dapat memikirkan beberapa pendekatan:
Anda dapat memotong gradien dengan batas atas / bawah tetapi ini tidak menjamin konvergensi dan dapat mengakibatkan pembekuan pelatihan dengan terjebak dalam beberapa minimum lokal dan tidak pernah keluar darinya.
Berlatihlah dengan ukuran batch yang lebih tinggi, lebih banyak zaman, dan dengan tingkat pembelajaran yang membusuk. Sekarang saya tidak memiliki bukti praktis bahwa meningkatkan ukuran batch menghasilkan gradien yang lebih baik tetapi dari apa yang saya amati dengan menghadapi masalah yang serupa dengan masalah Anda, melakukannya hampir selalu membantu.
Saya yakin ada metode lain (seperti tingkat pembelajaran siklus dll) yang mencoba untuk menemukan tingkat pembelajaran yang optimal berdasarkan statistik.
sumber