Penurunan Gradien di Jawa

1. Perkenalan

Dalam tutorial ini, kita akan belajar tentang algoritma Gradient Descent. Kami akan menerapkan algoritme di Java dan mengilustrasikannya selangkah demi selangkah.

2. Apa Itu Gradient Descent?

Gradient Descent adalah algoritme pengoptimalan yang digunakan untuk menemukan minimum lokal dari fungsi tertentu. Ini banyak digunakan dalam algoritma pembelajaran mesin tingkat tinggi untuk meminimalkan fungsi kerugian.

Gradien adalah kata lain untuk kemiringan, dan penurunan berarti turun. Seperti namanya, Gradient Descent menuruni kemiringan suatu fungsi hingga mencapai ujungnya.

3. Properti Penurunan Gradien

Penurunan Gradien menemukan minimum lokal, yang dapat berbeda dari minimum global. Titik awal lokal diberikan sebagai parameter algoritme.

Ini adalah algoritme berulang , dan di setiap langkah, mencoba untuk bergerak menuruni lereng dan mendekati minimum lokal.

Dalam praktiknya, algoritme tersebut mundur . Kami akan mengilustrasikan dan menerapkan backtracking Gradient Descent dalam tutorial ini.

4. Ilustrasi Langkah-demi-Langkah

Gradient Descent membutuhkan fungsi dan titik awal sebagai input. Mari kita definisikan dan plot sebuah fungsi:

Kita bisa mulai dari titik mana pun yang diinginkan. Mari kita mulai dari x = 1:

Pada langkah pertama, Penurunan Gradien menuruni lereng dengan ukuran langkah yang telah ditentukan sebelumnya:

Selanjutnya, melangkah lebih jauh dengan ukuran langkah yang sama. Namun, kali ini berakhir pada y lebih besar dari langkah terakhir:

Ini menunjukkan bahwa algoritme telah melewati minimum lokal, jadi algoritme mundur dengan ukuran langkah yang diturunkan:

Selanjutnya, jika arus y lebih besar dari y sebelumnya , ukuran langkah diturunkan dan dinegasikan. Iterasi berlangsung sampai presisi yang diinginkan tercapai.

Seperti yang bisa kita lihat, Gradient Descent menemukan minimum lokal di sini, tetapi ini bukan minimum global. Jika kita mulai dari x = -1 dan bukan x = 1, minimum global akan ditemukan.

5. Implementasi di Jawa

Ada beberapa cara untuk mengimplementasikan Gradient Descent. Di sini kita tidak menghitung turunan fungsi untuk mencari arah kemiringan, jadi implementasi kita juga berfungsi untuk fungsi yang tidak dapat dibedakan.

Mari tentukan presisi dan stepCoefficient dan beri mereka nilai awal:

double precision = 0.000001; double stepCoefficient = 0.1;

Pada langkah pertama, kita tidak memiliki y sebelumnya untuk perbandingan. Kita bisa menambah atau mengurangi nilai x untuk melihat apakah y turun atau naik. Langkah positif Koefisien berarti kita meningkatkan nilai x .

Sekarang mari kita lakukan langkah pertama:

double previousX = initialX; double previousY = f.apply(previousX); currentX += stepCoefficient * previousY;

Dalam kode di atas, f adalah Fungsi , dan inisialX adalah ganda , keduanya diberikan sebagai input.

Poin penting lainnya yang perlu dipertimbangkan adalah Gradient Descent tidak dijamin akan bertemu. Untuk menghindari macet di loop, mari kita membatasi jumlah iterasi:

int iter = 100;

Kemudian, kami akan pengurangan iter per satu pada setiap iterasi. Akibatnya, kita akan keluar dari loop dengan maksimal 100 iterasi.

Sekarang kita memiliki a priorX , kita dapat mengatur loop kita:

while (previousStep > precision && iter > 0) { iter--; double currentY = f.apply(currentX); if (currentY > previousY) { stepCoefficient = -stepCoefficient/2; } previousX = currentX; currentX += stepCoefficient * previousY; previousY = currentY; previousStep = StrictMath.abs(currentX - previousX); }

Dalam setiap iterasi, kami menghitung y baru dan membandingkannya dengan y sebelumnya . Jika currentY lebih besar dari sebelumnyaY , kami mengubah arah kami dan mengurangi ukuran langkah.

Perulangan berlanjut sampai ukuran langkah kita kurang dari presisi yang diinginkan . Akhirnya, kita bisa mengembalikan currentX sebagai minimum lokal:

return currentX;

6. Kesimpulan

Dalam artikel ini, kami mempelajari algoritma Gradient Descent dengan ilustrasi langkah demi langkah.

Kami juga menerapkan Gradient Descent di Jawa. Kode tersedia di GitHub.