Perilaku aneh dengan Adam optimizer saat berlatih terlalu lama


11

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?


Saya tidak berpikir overfitting menjelaskannya - kehilangan pelatihan meningkat, bukan hilangnya validasi. Misalnya, ini tidak terjadi ketika menggunakan SGD, hanya dengan Adam.
Bai Li

Model memiliki 1000 parameter dan hanya ada 1 titik data, sehingga model harus sesuai dengan data dengan tepat dan kerugiannya harus nol.
Bai Li

Oh maaf, kamu benar. Ada 64 titik data.
Bai Li

Ada 64 titik data (yaitu, kendala) dan 1000 parameter, sehingga dimungkinkan untuk menemukan pilihan untuk parameter sehingga kesalahan adalah nol (dan ini mudah dilakukan secara analitik). Pertanyaan saya adalah mengapa Adam tidak menemukan ini.
Bai Li

Jawaban:


19

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.

10-1010-5 params ), dan ukuran langkah akan mulai melompat-lompat, sebelum menetap lagi.

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):

masukkan deskripsi gambar di sini

Anda dapat membuat Adam lebih stabil dan bisa lebih dekat dengan konvergensi sejati dengan mengurangi tingkat pembelajaran. Misalnya

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-510-7


Ini visualisasi yang spektakuler, Neil. Apa dimensi sebenarnya? Apa yang diwakili x dan y? Apakah frame beberapa delta t atau n zaman per frame? Saya menduga bintang adalah optimum global dalam representasi topografis perbedaan (kesalahan) dalam kaitannya dengan dua parameter yang dipilih. Apakah tebakan saya benar?
Douglas Daseeco

Ini bukan visualisasi saya, Anda akan menemukannya di banyak tempat. Dimensi adalah unit arbitrer dari parameter input ke fungsi tes, dan grafik menunjukkan garis kontur untuk fungsi tersebut (lagi-lagi dalam unit arbitrer, mungkin diskalakan sehingga NN berfungsi OK). Setiap frame adalah langkah pembaruan berat. Ini mungkin sama dengan pembaruan mini-batch, dan karena perilaku SGD, saya berharap bahwa itu sebenarnya sedang diselesaikan dengan tepat menggunakan gradien sebenarnya dari fungsi tes - yaitu tidak ada set data atau pengambilan sampel.
Neil Slater

1

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:

  1. 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.

  2. 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.