Keturunan Gradien di Jawa

1. Pengenalan

Dalam tutorial ini, kita akan belajar mengenai algoritma Gradient Descent. Kami akan mengimplementasikan algoritma di Java dan menggambarkannya langkah demi langkah.

2. Apa itu Keturunan Gradien?

Gradient Descent adalah algoritma pengoptimuman yang digunakan untuk mencari minimum tempatan fungsi tertentu. Ia digunakan secara meluas dalam algoritma pembelajaran mesin peringkat tinggi untuk mengurangkan fungsi kerugian.

Gradient adalah kata lain untuk cerun, dan keturunan bermaksud turun. Seperti namanya, Gradient Descent menuruni lereng fungsi hingga mencapai akhir.

3. Sifat Keturunan Gradien

Gradient Descent menemui minimum tempatan, yang boleh berbeza dengan minimum global. Titik tempatan permulaan diberikan sebagai parameter untuk algoritma.

Ini adalah algoritma berulang , dan dalam setiap langkah, ia berusaha untuk bergerak ke lereng dan mendekati minimum tempatan.

Dalam praktiknya, algoritma adalah mengundur . Kami akan menerangkan dan melaksanakan Gradient Descent backtracking dalam tutorial ini.

4. Ilustrasi Langkah demi Langkah

Gradient Descent memerlukan fungsi dan titik permulaan sebagai input. Mari kita tentukan dan plotkan fungsi:

Kita boleh bermula pada bila-bila masa yang dikehendaki. Mari mulakan pada x = 1:

Pada langkah pertama, Gradient Descent menuruni lereng dengan ukuran langkah yang telah ditentukan:

Seterusnya, ia melangkah lebih jauh dengan ukuran langkah yang sama. Walau bagaimanapun, kali ini berakhir pada y lebih besar daripada langkah terakhir:

Ini menunjukkan bahawa algoritma telah melepasi minimum lokal, sehingga mundur dengan ukuran langkah yang diturunkan:

Selanjutnya, setiap kali arus y lebih besar daripada y sebelumnya , ukuran langkah diturunkan dan ditolak. Iterasi berterusan sehingga ketepatan yang diinginkan dicapai.

Seperti yang kita lihat, Gradient Descent menemui minimum lokal di sini, tetapi bukan minimum global. Sekiranya kita bermula pada x = -1 dan bukannya x = 1, minimum global akan dijumpai.

5. Pelaksanaan di Jawa

Terdapat beberapa cara untuk melaksanakan Gradient Descent. Di sini kita tidak mengira turunan fungsi untuk mencari arah cerun, jadi pelaksanaan kita berfungsi untuk fungsi yang tidak dapat dibezakan juga.

Mari tentukan Pekali ketepatan dan langkah dan berikan nilai awal kepada mereka:

double precision = 0.000001; double stepCoefficient = 0.1;

Dalam langkah pertama, kita tidak mempunyai sebelum y untuk perbandingan. Kita boleh meningkatkan atau menurunkan nilai x untuk melihat apakah y turun atau naik Pekali langkah positif bermaksud kita meningkatkan nilai x .

Sekarang mari kita lakukan langkah pertama:

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

Dalam kod di atas, f adalah Fungsi , dan initialX adalah ganda , kedua-duanya disediakan sebagai input.

Titik utama lain yang perlu dipertimbangkan adalah bahawa Gradient Descent tidak dijamin akan berkumpul. Untuk mengelakkan terjebak dalam lingkaran, mari kita hadkan bilangan lelaran:

int iter = 100;

Kemudian, kami akan SUSUTAN ITER demi satu pada setiap lelaran. Oleh itu, kita akan keluar dari putaran maksimum 100 lelaran.

Sekarang kita mempunyaiX sebelumnya , kita dapat mengatur gelung 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 lelaran, kami mengira y baru dan membandingkannya dengan y sebelumnya . Sekiranya currentY lebih besar dari sebelumnyaY , kita mengubah arah kita dan mengurangkan ukuran langkah.

Gelung berterusan sehingga ukuran langkah kami kurang daripada ketepatan yang diinginkan . Akhirnya, kita dapat mengembalikan currentX sebagai minimum tempatan:

return currentX;

6. Kesimpulannya

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

Kami juga menerapkan Gradient Descent di Jawa. Kod boleh didapati di GitHub.