Lensa ML

Turunan Parsial dan Gradient

Langkah 1 dari 6: Dari 1D ke 2D

Turunan tunggal menjadi turunan parsial dalam banyak dimensi

Transisi: 1D → 2D0.00
f(x) = x²x12468f(x,y) = x² + y²xy
Dimensi
1D
Variabel
x
Turunan
df/dx

Di 1D, f(x) = x² punya satu turunan: df/dx = 2x. Hanya ada satu arah gerak, jadi satu kemiringan sudah cukup untuk menggambarkannya.

Geser slider Transisi dari 1D ke 2D dan lihat parabola berubah menjadi kontur melingkar. Tiap cincin adalah level set: setiap titik di cincin itu punya nilai f(x, y) = x² + y² yang sama. Fungsi satu variabel punya satu kemiringan di tiap titik, tetapi permukaan punya kemiringan di setiap arah yang bisa kamu lalui. Turunan parsial memilih dua arah di antaranya, sepanjang sumbu x dan sepanjang sumbu y, dan dari keduanya kemiringan ke arah lain bisa dihitung.

Langkah 2 dari 6: Notasi Turunan Parsial

Tahan satu variabel, turunkan yang lain

Nilai x1.50
Irisan: f(x, y=1) = x² + x·1 + 1²x
f(x,y)
4.75
∂f/∂x
4.00
x
1.50
y (tetap)
1.0

∂f/∂x = 4.00: f naik terhadap x di titik ini, jadi garis singgung putus-putus miring ke atas. Hanya x yang berubah; y tetap 1.

Gerakkan slider Nilai x sementara y tetap 1. Kurva di layar adalah satu irisan dari f(x, y) = x² + xy + y², yaitu x² + x + 1. Untuk menurunkan terhadap x, perlakukan y sebagai konstanta: ∂f/∂x = 2x + y. Pada x = 1.5 hasilnya 4. Cara yang sama untuk y menghasilkan ∂f/∂y = x + 2y, yaitu 3,5 di titik yang sama. Lambang ∂ yang melengkung menandakan ada variabel lain yang dibekukan, berbeda dengan d pada df/dx.

Langkah 3 dari 6: Vector Gradient

Gabungkan semua turunan parsial menjadi satu vector: ∇f

Posisi x1.50
Posisi y1.00
∇f = (∂f/∂x, ∂f/∂y) = (2x, 2y)∇f
∂f/∂x
3.00
∂f/∂y
2.00
|∇f|
3.61
f(x,y)
3.25

Jauh dari minimum, mangkuknya curam, jadi gradient-nya besar. Di sini |∇f| = 2r, dua kali jarak dari titik asal.

Pakai slider Posisi x dan Posisi y untuk menempatkan titik. Untuk mangkuk ini, ∇f = (2x, 2y), jadi di (1.5, 1) gradient-nya (3, 2) dengan panjang √13 ≈ 3.61. Gradient selalu tegak lurus terhadap kontur yang melewati titik itu, karena bergerak di sepanjang kontur tidak mengubah f. Kemiringan ke arah satuan u adalah dot product ∇f · u, yang disebut turunan berarah. Nilainya paling besar ketika u searah dengan ∇f.

Langkah 4 dari 6: Arah dan Besar Gradient

Gradient menunjuk ke arah menanjak, dan besarnya sama dengan tingkat kecuraman

Posisi x1.00
Posisi y1.50
f(x,y) = sin(x)·cos(y)
|∇f|
0.840
Sudut (°)
-87.4
f(x,y)
0.060

Gradient kuat (|∇f| = 0.84) menunjuk ke -87°. Permukaan di sini curam. Bergerak berlawanan dengan panah adalah cara tercepat untuk turun, dan itulah yang dilakukan gradient descent.

Geser titik di permukaan sin(x)·cos(y) dan perhatikan angka sudut. Di sini ∂f/∂x = cos(x)·cos(y) dan ∂f/∂y = −sin(x)·sin(y). Puncak di (π/2, 0) dan lembah di (−π/2, 0) sama-sama punya gradient nol, begitu juga saddle point di (0, π/2), tempat f naik di satu arah dan turun di arah lain. Gradient nol saja tidak bisa membedakan ketiganya; turunan parsial kedua, yang dikumpulkan dalam Hessian, bisa.

Langkah 5 dari 6: Hubungan dengan Gradient Descent

Melangkah berlawanan dengan ∇f untuk meminimalkan loss

Learning rate0.15
Langkah0
f(x,y) = x² + 3y²min
Langkah
0
f(x,y)
18.250
x
2.500
y
2.000

Titik awal (2.5, 2.0), jauh dari minimum. Panah putus-putus menunjukkan −∇f, arah langkah pertama. Naikkan slider Langkah untuk turun.

Setel Learning rate, lalu naikkan Langkah dari 0 ke 20. Pada f = x² + 3y², satu langkah mengalikan x dengan (1 − 2η) dan y dengan (1 − 6η). Di atas η ≈ 0.17, faktor y menjadi negatif dan jalurnya berzigzag melintasi lembah. Pada η = 0.15, y menyusut menjadi sepersepuluhnya di tiap langkah sementara x masih tersisa 70%, sehingga sebagian besar jarak yang tersisa ada di sepanjang x. Ketidakcocokan antara arah curam dan landai inilah alasan adaptive optimizer seperti Adam menskalakan tiap turunan parsial secara terpisah.

Langkah 6 dari 6: Dimensi Lebih Tinggi

Ide yang sama berlaku sampai jutaan parameter

Jumlah dimensi2
2x14x2∇f = (2, 4)Tiap batang = ∂f/∂xᵢ di titik (1,1,...,1)
Dimensi
2
|∇f|
4.47
Parameter
2
Maks ∂f/∂xᵢ
4

Di 2D, gradient adalah vector dengan 2 komponen, satu turunan parsial per variabel. Ini masih cukup kecil untuk dibayangkan.

Naikkan Jumlah dimensi dari 2 ke 10 dan perhatikan batangnya. Fungsinya f = Σ (i+1)·xᵢ², dievaluasi di titik yang semua koordinatnya bernilai 1, jadi turunan parsialnya 2, 4, 6, dan seterusnya. Dengan 10 dimensi, |∇f| = 2√385 ≈ 39.2. Memperkirakan tiap turunan parsial dengan finite difference butuh satu evaluasi f tambahan per dimensi. Backpropagation mendapat semuanya dengan biaya kelipatan konstan kecil dari satu evaluasi, dan itulah yang membuat training dengan miliaran parameter menjadi mungkin.

Apa itu turunan parsial?

Turunan parsial mengukur perubahan fungsi beberapa variabel ketika satu input bergerak dan semua input lain ditahan tetap. Untuk f(x, y), turunan parsial ditulis ∂f/∂x atau ∂f/∂y. Mengumpulkan semua turunan parsial dari fungsi skalar ke dalam satu vector menghasilkan gradient, ∇f, yang menunjuk ke arah kenaikan paling curam.

Loss neural network adalah fungsi skalar dari semua weight-nya, jadi training membutuhkan satu turunan parsial per weight. Backpropagation menghitung seluruh gradient itu, dan optimizer seperti SGD dan Adam memakainya untuk memperbarui semua parameter sekaligus. Ide yang sama mendasari analisis sensitivitas, feature attribution seperti saliency map, dan simulasi fisika.

Ide utama

  • Turunan parsial mengubah satu input dan menahan semua input lain tetap.
  • Gradient ∇f adalah vector berisi semua turunan parsial dari fungsi skalar.
  • Gradient menunjuk ke arah kenaikan paling curam, dan panjangnya adalah kemiringan paling curam itu.
  • Gradient tegak lurus terhadap garis kontur fungsi.
  • Gradient nol menandai titik kritis, yang bisa berupa minimum, maksimum, atau saddle point.
  • Gradient descent melangkah berlawanan arah dengan gradient, diskalakan oleh learning rate.

Pertanyaan umum

Apa bedanya turunan parsial dan turunan total?

Turunan parsial menahan input lain tetap. Turunan total membiarkannya ikut berubah ketika input itu bergantung pada variabel dasar yang sama. Jika x dan y sama-sama bergantung pada t, maka df/dt = (∂f/∂x)(dx/dt) + (∂f/∂y)(dy/dt), yang menjumlahkan pengaruh lewat setiap jalur.

Apakah urutan turunan parsial berpengaruh?

Untuk fungsi yang mulus, tidak. Teorema Schwarz (disebut juga teorema Clairaut) menyatakan ∂²f/∂x∂y = ∂²f/∂y∂x selama kedua turunan parsial kedua itu kontinu. Untuk f = x² + xy + y², kedua turunan parsial campurannya sama dengan 1.

Apa arti turunan parsial yang besar bagi sebuah feature?

Artinya output peka secara lokal terhadap input itu: perubahan kecil di sana menggerakkan f cukup banyak. Saliency map untuk model gambar memakai ini, dengan menampilkan ∂(class score)/∂(pixel) sebagai heatmap. Ukuran ini bersifat lokal dan bergantung pada skala input, jadi nilai besar bukan bukti bahwa sebuah feature penting secara global.

Bagaimana cara mendapatkan turunan parsial di PyTorch?

Tandai input dengan requires_grad=True, hitung output skalar, lalu panggil .backward() padanya. Atribut .grad pada tiap input kemudian berisi turunan parsial output terhadap input itu. torch.autograd.grad mengembalikan nilai yang sama tanpa menyimpannya di tensor.

Penjelasan terkait

Referensi

  1. Deisenroth, Faisal & Ong, "Mathematics for Machine Learning", ch. 5 Vector Calculus
  2. Goodfellow, Bengio & Courville, "Deep Learning", ch. 4 Numerical Computation
  3. Simonyan, Vedaldi & Zisserman (2013), "Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps"

Terakhir diperbarui