Lewati ke konten utama

Gradient Descent dalam Machine Learning: Tinjauan Mendalam

Pelajari bagaimana gradient descent mengoptimalkan model untuk machine learning. Temukan penerapannya pada regresi linear, regresi logistik, jaringan saraf, serta jenis-jenis utamanya termasuk batch, stochastic, dan mini-batch gradient descent.
Diperbarui 29 Sep 2026  · 15 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Gradient descent adalah salah satu algoritme terpenting dalam seluruh bidang machine learning dan deep learning. Ini adalah algoritme optimisasi yang sangat kuat untuk melatih model regresi linear, regresi logistik, dan jaringan saraf. Jika Anda mulai terjun ke machine learning, memahami algoritme gradient descent secara mendalam adalah hal yang mutlak.

Apa itu Gradient Descent?

Data science berkaitan dengan menemukan pola dan perilaku kompleks dalam analisis big data. Ini disebut "pola", yaitu motif yang berulang. Melalui machine learning, ini berarti melatih algoritme untuk mendeteksi pola dalam analisis data agar melakukan suatu tugas dengan lebih baik. Artinya, mengajarkan perangkat lunak untuk menjalankan tugas atau membuat prediksi secara mandiri. Untuk melakukannya, data scientist memilih dan melatih algoritme untuk melakukan analisis data. Tujuannya tentu untuk meningkatkan ketepatan prediksi seiring waktu.

Akibatnya, machine learning sangat bertumpu pada pelatihan algoritme. Semakin sering algoritme ini terekspos ke data, semakin mereka belajar menjalankan tugas tanpa instruksi spesifik; mereka belajar dari pengalaman. Kita menggunakan berbagai jenis algoritme dalam machine learning. Di antaranya, gradient descent adalah salah satu yang paling berguna dan populer.

Gradient descent adalah algoritme optimisasi. Ia digunakan untuk menemukan nilai minimum sebuah fungsi dengan lebih cepat. Definisi gradient descent cukup sederhana. Ini adalah algoritme untuk menemukan minimum dari fungsi cembung. Untuk melakukannya, algoritme ini mengubah parameter fungsi tersebut secara iteratif. Ini adalah algoritme yang digunakan, misalnya, dalam regresi linear.

Fungsi cembung adalah fungsi yang tampak seperti lembah indah dengan minimum global di tengahnya. Sebaliknya, fungsi non-cembung memiliki beberapa minimum lokal, dan algoritme gradient descent sebaiknya tidak digunakan pada fungsi-fungsi ini karena berisiko terjebak pada minimum pertama yang ditemui.

ilustrasi gradient descent pada fungsi cembung

Gradient descent juga disebut sebagai “algoritme turunan paling curam”. Ini sangat penting dalam machine learning, di mana ia digunakan untuk meminimalkan fungsi biaya. Fungsi ini digunakan untuk menentukan model prediksi terbaik dalam analisis data. Semakin kecil biayanya, semakin baik mesin mampu membuat prediksi yang tepat.

Ada tiga jenis descent yang dikenal luas. Mari kita lihat lebih dekat:

Batch gradient descent

Juga dikenal sebagai vanilla gradient descent, batch gradient descent menghitung galat untuk setiap contoh dalam dataset pelatihan. Namun, ini dilakukan hanya setelah tiap contoh pelatihan dievaluasi secara menyeluruh. Proses ini dapat dianalogikan sebagai satu siklus. Ada juga yang menyebutnya satu era pelatihan.

Batch descent memiliki beberapa keunggulan. Secara khusus, efisiensi komputasinya sangat praktis karena menghasilkan konvergensi yang stabil dan gradien galat yang stabil. Meski begitu, batch gradient descent juga memiliki kekurangan. Terkadang, gradien galat yang stabil dapat mengarah pada keadaan konvergensi yang kurang menguntungkan. Selain itu, ia juga memerlukan keberadaan dataset pelatihan di algoritme dan memori.

Stochastic gradient descent

Stochastic gradient descent memberikan pembaruan parameter secara individual untuk setiap contoh pelatihan. Ini memungkinkan perhatian diberikan pada setiap contoh, sehingga prosesnya minim galat. Bergantung pada masalahnya, ini dapat membantu SGD menjadi lebih cepat dibandingkan batch gradient descent. Pembaruan yang rutin memberi kita laju perbaikan yang lebih rinci.

Namun, pembaruan ini mahal secara komputasi, terutama dibandingkan pendekatan yang digunakan oleh descent bertahap. Selain itu, frekuensi pembaruan dapat menyebabkan gradien yang bising dan dapat mencegah laju galat turun. Alih-alih menurun mulus, laju galat dapat melonjak-lonjak dan menjadi masalah dalam jangka panjang.

Mini-batch gradient descent

Para peneliti menggunakan mini-batch gradient descent sebagai metode awal. Mengapa? Karena ini merupakan perpaduan sempurna antara konsep stochastic descent dan batch descent. Ia membagi dataset (pelatihan) menjadi batch dan melakukan pembaruan untuk setiap batch, menciptakan keseimbangan antara efisiensi BGD dan kekokohan SGD.

Ukuran mini-batch yang populer berkisar dari lima puluh hingga dua ratus lima puluh enam, tetapi seperti banyak metode machine learning lainnya, tidak ada aturan baku karena bervariasi menurut aplikasi. Metode ini kerap digunakan sebagai opsi dasar untuk melatih jaringan saraf. Ini juga merupakan jenis descent yang populer di ranah deep learning.

Mengapa Gradient Descent Begitu Penting dalam Machine Learning?

Dalam machine learning, kita menggunakan algoritme gradient descent pada masalah supervised learning untuk meminimalkan fungsi biaya, yang merupakan fungsi cembung (misalnya, mean square error).

Berkat algoritme ini, mesin belajar dengan menemukan model terbaik. Ingat bahwa meminimalkan fungsi biaya berarti menemukan parameter a, b, c, dan seterusnya yang menghasilkan galat terkecil antara model kita dan titik y pada dataset. Setelah fungsi biaya diminimalkan, ini membuka jalan untuk membangun program pengenalan suara yang akurat, program visi komputer, dan aplikasi untuk memprediksi harga pasar saham.

Anda dapat melihat mengapa algoritme gradient descent itu fundamental: mesin belajar darinya.

Untuk menggambarkan cara kerja dan kegunaan algoritme ini, sering digunakan analogi pegunungan. Bayangkan seseorang tersesat di pegunungan. Pada dasarnya, ia harus menemukan jalan pulang dengan terlebih dahulu mencari arah turunan yang paling curam. Setelah mengikuti arah tersebut sejauh jarak tertentu, metode ini diulang hingga mencapai lembah (nilai terendah). Dalam machine learning, gradient descent terdiri dari mengulang metode ini dalam sebuah loop hingga menemukan minimum untuk fungsi biaya. Itulah mengapa ia disebut algoritme iteratif dan mengapa ia membutuhkan banyak perhitungan.

Berikut strategi 2 langkah yang akan membantu Anda jika Anda tersesat di pegunungan:

  • Dari posisi Anda saat ini, lihat sekeliling untuk menemukan arah di mana kemiringan paling curam menurun.
  • Setelah menemukan arah itu, ikuti sejauh jarak tertentu (misalnya berjalan 300 meter) dan ulangi langkah 1.

Dengan mengulang langkah 1 dan 2 dalam sebuah loop, Anda pasti akan menuju ke minimum lembah. Strategi ini tidak lain adalah algoritme gradient descent.

Langkah 1: Hitung turunan fungsi biaya

Kita mulai dari titik awal acak lalu mengukur nilai kemiringan di titik tersebut. Dalam matematika, kemiringan diukur dengan menghitung turunan dari fungsi.

Langkah 2: Memperbarui parameter model

Kita kemudian bergerak sejauh jarak tertentu d ke arah lereng yang menurun, tetapi tidak 300 meter kali ini. Jarak ini disebut “learning rate.” Hasil dari operasi ini adalah mengubah nilai parameter model kita (koordinat kita di lembah berubah saat kita bergerak).

Bidang Apa yang Menggunakan Gradient Descent?

Algoritme gradient descent terutama digunakan di bidang machine learning dan deep learning. Yang terakhir ini dapat dianggap sebagai versi yang disempurnakan dari machine learning. Ia memungkinkan pendeteksian pola yang paling halus. Disiplin ini memerlukan dasar matematika yang kuat dan latar belakang Python.

Bahasa pemrograman ini memiliki beberapa pustaka yang memudahkan penerapan machine learning. Disiplin ini sangat berguna untuk menganalisis volume data yang besar secara akurat dan cepat. Ia memungkinkan analisis prediktif berdasarkan tren atau kejadian masa lalu.

Machine learning adalah salah satu ilmu yang sangat terkait dengan big data dari sisi peluang pemanfaatannya. Ia memungkinkan kita melampaui keterbatasan kecerdasan manusia dalam menganalisis aliran data yang besar. Dengan besarnya kumpulan data yang tersedia secara daring, kecerdasan buatan (AI) dapat belajar sendiri tanpa campur tangan manusia. Machine learning digunakan, misalnya, di bidang perangkat terhubung. Berkat ini, AI dapat beradaptasi dengan kebiasaan penghuni rumah terhubung dan menjalankan tugasnya dengan mempertimbangkan kebiasaan tersebut.

Misalnya, AI dapat menyesuaikan pemanas ruangan sesuai cuaca. Ilmu ini juga memungkinkan hadirnya robot penyedot debu yang semakin canggih. Gradient descent melalui machine learning berada di jantung kemajuan besar kecerdasan buatan. Dalam praktiknya, ada banyak aplikasi gradient descent oleh para insinyur dan spesialis AI.

Ini berguna untuk mesin telusur seperti Google, dan mesin rekomendasi populer seperti YouTube, Netflix, atau Amazon. Berdasarkan data yang dikumpulkan dari pengguna, algoritme akan mencoba memahami minat pengguna internet. Ini memungkinkan mereka menawarkan hasil pencarian yang relevan dan rekomendasi yang lebih baik.

Machine learning telah memungkinkan komputer untuk memahami dan memroses bahasa manusia. Aplikasi inilah yang melahirkan asisten digital seperti Alexa, Google Assistant, dan Siri. Machine learning dan penerapan gradient descent juga sangat berguna bagi pengembang video game. Tujuannya di sini adalah memungkinkan AI unggul dalam tugas-tugas yang paling manusiawi agar orang dapat fokus pada aktivitas bernilai tinggi. Kecerdasan buatan dan machine learning memungkinkan perusahaan mengantisipasi kebutuhan pelanggan dan tren masa depan.

Cara Menerapkan Gradient Descent

Gradient descent adalah algoritme yang digunakan dalam regresi linear karena kompleksitas komputasinya. Rumus matematika umum untuk gradient descent adalah xt+1 = xt - η∆xt, dengan η mewakili learning rate dan ∆xt arah penurunan. Gradient descent adalah algoritme yang berlaku untuk fungsi cembung. Dengan mengambil ƒ sebagai fungsi cembung yang akan diminimalkan, tujuannya adalah memperoleh ƒ(xt+1) ≤ ƒ (xt) pada setiap iterasi.

Gagasannya di sini adalah menggunakan algoritme yang secara bertahap menghitung minimum dari suatu fungsi matematika. Ketika dihadapkan pada persamaan tertentu, ini adalah cara terbaik untuk menyelesaikannya. Saat membahas gradient descent, kita juga harus memahami konsep fungsi biaya. Dalam mode supervised, fungsi ini memungkinkan pengukuran margin galat antara taksiran dan nilai sebenarnya. Rumus untuk menghitung gradien kuadrat rata-rata dalam kasus masalah regresi linear adalah sebagai berikut:

Penerapan gradient descent juga menggunakan konsep learning rate. Ini adalah hiperparameter yang memungkinkan pengendalian penyesuaian bobot jaringan terhadap gradien loss. Perlu dicatat bahwa learning rate yang optimal sangat penting untuk memperoleh minimum dengan lebih cepat dan efisien. Nilainya tidak boleh terlalu tinggi atau terlalu rendah.

Seiring nilai menurun, ini menunjukkan bahwa kita secara bertahap bergerak menyusuri lereng ke bawah. Beberapa metode optimisasi menggunakan algoritme gradient descent, seperti RMSprop, Adam, dan SGD. Agar tidak melakukan kesalahan saat menggunakan algoritme ini, disarankan untuk memilih parameternya dengan cermat. Perlu juga diingat bahwa minimum yang ditemukan mungkin bukan minimum global.

Fungsi utama gradien adalah mengukur perubahan setiap bobot terhadap perubahan galat. Anggap gradien sebagai kemiringan suatu fungsi. Kemiringan akan semakin curam saat gradien semakin besar—ini menguntungkan bagi model karena dapat belajar lebih cepat. Namun, model akan berhenti belajar jika kemiringan menjadi nol. Secara matematis, gradien dapat digambarkan sebagai turunan hingga terhadap masukan-masukannya.

visualisasi gradient descent dalam tiga dimensi

Dalam bagian implementasi, kita akan menulis dua fungsi. Satu akan menjadi fungsi biaya yang mengambil keluaran aktual dan keluaran prediksi sebagai masukan dan mengembalikan loss. Yang kedua adalah fungsi gradient descent yang sebenarnya, yang mengambil variabel independen dan variabel target (dependen) sebagai masukan dan menemukan garis terbaik menggunakan algoritme gradient descent.

Jumlah iterasi, learning rate, dan ambang penghentian adalah parameter penyetelan algoritme gradient descent dan dapat diatur oleh pengguna. Dalam fungsi utama, kita akan menginisialisasi data acak yang berhubungan secara linear, dan menerapkan algoritme gradient descent pada data untuk menemukan garis terbaik. Bobot dan bias optimal yang ditemukan menggunakan algoritme gradient descent kemudian digunakan untuk menggambar garis best fit di fungsi utama.

#Importing libraries
import numpy as np
import matplotlib as pyplot

def mean_squared_error(y_true, y_predicted):

   # Calculating the loss or cost
   cost = np.sum((y_true-y_predicted)**2) / len(y_true)
   return cost

# Gradient descent function
# Here iterations, learning rate, stopping threshold are hyperparameters that can be tuned
def gradient_descent((x, y, iterations = 1000, learning_rate = 0.0001, stopping_theshold = 1e-6):

   #Initialzing rate, bias, learning rate, and iterations
   current_rate = 0.1
   current_bias = 0.01
   iterations = iterations
   learning_rate = learning_rate
   n = float(len(x))

   costs = []
   weights = []
   previous_cost = None

   # Estimation of optimal parameters
   for i in range(iterations):
      
      # Making predictions
      y_predicted = (current_weight * x) + current_bias

      # Calculating the current cost
      current_cost = mean_squared_error(y, y_predicted)

      # If the change in cost is less than or equal to stopping threshold we stop the gradient descent
      if previous_cost and abs(previous_cost - current_cost) <= stopping_threshold: 
         break

      previous_cost = current_cost

      costs.append(current_cost)
      weights.append(current_weight)

      # Calculating the gradients
      weight_derivative = -(2/n) * sum(x * (y-y_predicted))
      bias_derivative = -(2/n) * sum(y-y_predicted)

      # Updating weights and bias
      current_weight = current_weight - (learning_rate * weight_derivative)
      current_bias = current_bias - (learning_rate * bias_derivative)

      # Printing the parameters for each 1000th iteration
      print(f"Iteration {i+1}: Cost {current_cost}, Weight \n {current_weight}, Bias {current_bias}")

   # Visualizing the weights and cost for all iterations
   plt.figure(figsize = = (8,6))
   plt.plot(weights, cost)
   plt.scatter(weights, cost, marker = 'o', color = 'red')
   plt.title("Cost vs Weights")
   plt.ylabel("Cost")
   plt.xlabel("Weights")
   plt.show()

   return current_weight, current_bias

def main()

   # Data
   X = np.array(32.5, 53.4, 61.5, 47.4, 59.8, 
   55.1, 52.2, 39.2, 48.1, 52.5, 
   45.4, 54.3, 44.1, 58.1, 56.7, 
   48.9, 44.6, 60.2, 45.6, 38.8])
   Y = np.array(31.7, 68.7, 62.5, 71.5, 87.2,
   78.2, 79.6, 59.1, 75.3, 71.3,
   55.1, 82.4, 62.0, 75.3, 81.4, 
   60.7, 82.8, 97.3, 48.8, 56.8])

   # Estimating weight and bias using gradient descent
   estimated_weight, estimated_bias = gradient_descent(X, Y, iterations = 2000)
   print(f"Estimated Weight: {estimated weight}\nEstimated Bias: {estimated bias}")

   # Making predictions using estimated parameters
   Y_pred = estimated_weight*X = estimated_bias

   #Plotting the regression line
   plt.figure(figsize = 8,6)
   plt.scatter(X, Y, marker = 'o', color = 'red')
   plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color = 'blue')
   plt.ylabel("X")
   plt.xlabel("Y")
   plt.show()

if __name__=="__main__": 
   main()

Keluaran kode di bawah ini akan seperti berikut:

Anda dapat menguji dan menjalankan kode di atas dengan notebook ini.

Learning Rate: Peran Hiperparameter

Elemen lain yang penting untuk ditekankan adalah learning rate. Dalam machine learning, faktor seperti ini disebut hiperparameter karena bukan parameter model secara langsung, tetapi tetap berdampak pada kinerja akhir model (sama seperti parameter model).

Learning rate (sering dilambangkan α atau kadang η) menunjukkan kecepatan koefisien berubah. Kuantitas ini bisa tetap atau berubah. Salah satu metode yang saat ini populer adalah Adam, yang memiliki learning rate yang menyesuaikan seiring waktu.

Ada banyak skenario yang perlu diantisipasi dan dipertimbangkan saat menggunakan gradient descent:

Learning rate terlalu tinggi

Jika learning rate terlalu besar, Anda akan melangkah terlalu jauh dalam gradient descent. Keuntungannya, Anda turun dengan cepat menuju minimum fungsi biaya, tetapi Anda berisiko melewatkan minimum tersebut dengan berosilasi di sekitarnya tanpa henti. Dalam analogi lembah, ini seperti Anda bergerak beberapa kilometer setiap kali, sehingga melewati tempat berlindung tanpa menyadarinya.

Learning rate terlalu kecil

Untuk menghindari kasus sebelumnya, Anda mungkin tergoda memilih learning rate yang sangat rendah. Namun jika terlalu kecil, Anda berisiko membutuhkan waktu tak berhingga sebelum berkumpul ke minimum fungsi biaya. Ini seperti memilih bergerak milimeter demi milimeter di pegunungan untuk menemukan titik terendah di lembah.

  • Mengapa learning rate begitu penting?

Menetapkan learning rate pada nilai yang tepat sangat penting agar penurunan lereng mencapai minimum lokal. Karena itu, sebaiknya tidak ditetapkan terlalu tinggi atau terlalu rendah. Ini penting karena mencapai minimum bisa menjadi rumit dengan langkah yang terlalu panjang. Jika kita menetapkan learning rate ke nilai yang lebih rendah, gradient descent pada akhirnya mungkin mencapai minimumnya. Namun, ini bisa memakan waktu.

Dampak berbagai learning rate pada konvergensi (Kredit Gambar: cs231n)
  • Cara menemukan learning rate terbaik

Sayangnya, tidak ada rumus ajaib untuk menemukan learning rate yang tepat. Sebagian besar waktu, Anda harus mencoba-coba dan menguji beberapa nilai sebelum menemukan yang pas. Ini disebut hyperparameter tuning, dan ada berbagai strategi untuk melakukannya dengan benar.

Cara yang bagus untuk memastikan operasi penurunan lereng berjalan optimal adalah dengan memplot fungsi biaya saat optimisasi berlangsung. Masukkan jumlah pengulangan pada sumbu X, dan nilai fungsi biaya pada sumbu Y. Ini akan membantu Anda melihat nilai fungsi biaya setelah setiap iterasi gradient descent sekaligus melacak kecocokan learning rate. Anda juga dapat mencoba nilai yang berbeda dan memplotnya bersama-sama.

Fungsi biaya akan menurun setelah setiap iterasi jika gradient descent berjalan optimal. Gradient descent berkonvergensi ketika tidak lagi mampu mengurangi fungsi biaya, dan tetap pada tingkat yang sama. Jumlah iterasi yang diperlukan untuk konvergensi sangat bervariasi. Terkadang membutuhkan lima puluh iterasi, terkadang bisa mencapai dua atau tiga juta. Sulit untuk memperkirakan jumlah iterasi sebelumnya.

Beberapa algoritme dapat memberi tahu Anda secara otomatis jika telah terjadi konvergensi dalam gradient descent. Namun, akan lebih baik untuk menetapkan ambang konvergensi di awal, yang juga cukup sulit diperkirakan. Ini adalah alasan penting mengapa plot sederhana paling baik untuk uji konvergensi.

Kesimpulan

Sementara para ilmuwan menggunakan gradient descent untuk menemukan nilai parameter suatu fungsi guna meminimalkan biaya fungsi, para programmer menggunakannya sebagai algoritme optimisasi saat melatih model machine learning. Gradient descent secara iteratif menyesuaikan sebagian parameternya untuk meminimalkan fungsi tertentu berdasarkan fungsi cembung.

Gradient descent mungkin adalah strategi optimisasi yang paling dikenal digunakan dalam deep learning dan machine learning. Data scientist sering menggunakannya saat ada kesempatan untuk menggabungkan tiap algoritme dengan model pembelajaran. Memahami algoritme gradient descent relatif sederhana, dan mengimplementasikannya bahkan lebih sederhana. Untuk menyelami lebih jauh ranah deep learning, lihat katalog lengkap kursus machine learning kami.

FAQ Gradient Descent

Apa itu gradient descent?

Gradient descent adalah algoritme optimisasi yang digunakan untuk meminimalkan fungsi biaya pada model machine learning dan deep learning. Algoritme ini secara iteratif memperbarui parameter model ke arah turunan terdalam untuk menemukan titik terendah (minimum) dari fungsi tersebut.

Bagaimana cara kerja gradient descent?

Gradient descent bekerja dengan menghitung gradien (atau kemiringan) dari fungsi biaya terhadap setiap parameter. Lalu, ia menyesuaikan parameter ke arah yang berlawanan dengan gradien dengan langkah tertentu, atau learning rate, untuk mengurangi galat.

Apa itu learning rate dalam gradient descent?

Learning rate adalah sebuah hiperparameter yang mengontrol besar langkah menuju minimum fungsi biaya. Learning rate yang lebih kecil menghasilkan konvergensi yang lebih lambat, sementara learning rate yang lebih besar dapat membuat algoritme melampaui titik minimum.

Apa tantangan umum pada gradient descent?

Gradient descent dapat menghadapi tantangan seperti terjebak pada lokal minimum, konvergensi lambat, dan sensitivitas terhadap pemilihan learning rate. Teknik seperti momentum, adaptive learning rates (Adam, RMSprop), dan regularisasi dapat membantu mengatasi masalah ini.

 
Topik
Kecerdasan Buatan
Machine Learning

Belajar bersama DataCamp

Program

Ilmuwan Pembelajaran Mesin dalam Python

85 jam
Pelajari machine learning dengan Python dan mulailah perjalanan Anda untuk menjadi seorang ilmuwan machine learning. Jelajahi pembelajaran terawasi, pembelajaran tanpa pengawasan, dan pembelajaran mendalam.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya