Fungsi aktivasi adalah fungsi tidak linier yang diterapkan pada keluaran setiap neuron sebelum hasilnya diteruskan ke layer berikutnya. Topik ini menunjukkan mengapa jaringan tanpa aktivasi runtuh menjadi satu fungsi linier, membedah sigmoid dan ReLU beserta kelemahannya, dan menutup dengan kaidah pemilihan aktivasi yang dipakai sepanjang jalur. Setelah selesai, pemilihan fungsi aktivasi berhenti menjadi keputusan yang ditebak dan menjadi keputusan yang disadari.
Tanpa aktivasi, kedalaman hanyalah ilusi#
Misalkan dua layer tanpa aktivasi menghitung dan . Substitusi langsung memberikan , yang tetap berbentuk satu perkalian matriks plus satu vektor bias. Dengan kata lain, seratus layer linier setara dengan satu layer linier, sehingga kedalaman tidak menambah kemampuan apa pun.
Properti ini mudah diverifikasi dengan angka. Kode berikut membangun dua transformasi linier kecil, menghitung hasilnya berurutan, lalu membandingkannya dengan satu transformasi linier hasil komposisi keduanya.
import numpy as np
W1 = np.array([[1.0, 2.0], [0.0, -1.0]])
b1 = np.array([0.5, -0.5])
W2 = np.array([[2.0, 0.0], [1.0, 1.0]])
b2 = np.array([-1.0, 0.25])
x = np.array([3.0, -2.0])
via_dua_layer = W2 @ (W1 @ x + b1) + b2
via_satu_layer = (W2 @ W1) @ x + (W2 @ b1 + b2)
print("dua layer :", np.round(via_dua_layer, 2))
print("satu layer :", np.round(via_satu_layer, 2))
print("identik :", np.allclose(via_dua_layer, via_satu_layer))dua layer : [-2. 1.25]
satu layer : [-2. 1.25]
identik : TrueKarena komposisinya identik sampai angka terakhir, satu-satunya cara membuat kedalaman berarti adalah menyela fungsi tidak linier di antara layer. Di situlah letak fungsi aktivasi, dan inilah alasan nonlinieritas disebut esensial, bukan sekadar pemanis.
Sigmoid: pembuka jalan yang kini terbatas#
Sigmoid mendefinisikan , yaitu fungsi berbentuk S yang menekan semua nilai ke rentang . Bentuk ini cocok dibaca sebagai peluang, sehingga sigmoid menjadi pilihan alami pada keluaran klasifikasi biner. Nilainya pada tepat 0,5, dan ia mendekati 0 atau 1 pada kedua ujungnya.
Kelemahan sigmoid berada di ujung-ujungnya. Pada yang besar, turunannya mendekati nol, sehingga sinyal kesalahan yang mengalir mundur melalui banyak sigmoid akan terus mengecil sampai pelatihan nyaris berhenti. Kejadian ini disebut saturasi dan menjadi salah satu penyebab utama lambatnya pelatihan jaringan dalam generasi awal. Karena itu, pada arsitektur modern sigmoid hampir tidak dipakai di layer tersembunyi dan bertahan pada keluaran biner.
ReLU dan keluarganya#
ReLU mendefinisikan , yaitu mempertahankan nilai positif dan menolak nilai negatif menjadi nol. Fungsinya sangat murah dihitung, dan turunannya bernilai 1 atau 0, sehingga sinyal gradien lewat tanpa mengecil pada sisi positif. Kombinasi murah dan tidak tersaturasi pada sisi positif inilah yang membuat ReLU menjadi bawaan de facto untuk layer tersembunyi sejak 2010-an.
Kelemahan ReLU disebut neuron mati (dead neuron). Apabila bobot bergeser sedemikian rupa sehingga masukan suatu neuron selalu negatif, keluarannya selalu nol dan gradiennya juga selalu nol, sehingga neuron itu berhenti diperbarui selamanya. Variannya mengatasi hal ini dengan memberi kemiringan kecil pada sisi negatif, misalnya LeakyReLU dengan kemiringan 0,01, sedangkan GELU dan SiLU menambahkan kehalusan yang dipilih banyak arsitektur transformer. Pada tahap ini ReLU dipakai sebagai bawaan jalur ini, dan variasinya disebutkan agar tidak mengejutkan saat muncul pada literatur.
Memilih aktivasi sesuai posisi#
Kaidah pemilihannya dapat dipadatkan menjadi tiga. Pada layer tersembunyi, pilih ReLU atau GELU, karena keduanya murah dan tidak menyekat gradien pada sisi positif. Pada keluaran regresi, jangan memakai aktivasi apa pun yang membatasi rentang, karena targetnya boleh bernilai apa saja. Pada keluaran klasifikasi, aktivasi menyesuaikan bentuk target, yaitu sigmoid untuk dua kelas dan softmax untuk banyak kelas, dan softmax dibahas bersama cross-entropy pada topik Fungsi loss.
Kode berikut merangkum perilaku ketiga fungsi utama pada nilai-nilai yang sama, sehingga perbedaannya terlihat dalam satu tabel kecil.
import torch
z = torch.tensor([-2.0, -0.5, 0.0, 0.5, 2.0])
print("z :", z.tolist())
print("sigmoid:", [round(v, 3) for v in torch.sigmoid(z).tolist()])
print("tanh :", [round(v, 3) for v in torch.tanh(z).tolist()])
print("relu :", torch.relu(z).tolist())z : [-2.0, -0.5, 0.0, 0.5, 2.0]
sigmoid: [0.119, 0.378, 0.5, 0.622, 0.881]
tanh : [-0.964, -0.462, 0.0, 0.462, 0.964]
relu : [0.0, 0.0, 0.0, 0.5, 2.0]Pembacaan tabelnya sederhana. Tanh menekan ke rentang sampai 1 dan tetap populer pada model sekuens klasik, sigmoid hanya menghasilkan nilai positif, sedangkan ReLU menghasilkan nol tepat untuk semua masukan negatif dan identitas untuk sisanya. Ketiganya tidak linier, sehingga ketiganya memenuhi syarat minimum untuk membuat kedalaman bermakna.
Ringkasan#
- Tanpa aktivasi, komposisi banyak layer linier tepat setara dengan satu layer linier, sehingga kedalaman tidak menambah daya.
- Sigmoid sesuai untuk keluaran biner tetapi tersaturasi pada ujungnya, sedangkan ReLU murah dan tidak tersaturasi pada sisi positif dengan risiko neuron mati.
- Layer tersembunyi modern memakai ReLU atau GELU, keluaran regresi memakai identitas, dan keluaran klasifikasi memakai sigmoid atau softmax.
- Perilaku tiap fungsi terlihat langsung pada tabel kecil nilai yang sama.
Referensi#
- torch.nn.functional — PyTorch — Dokumentasi fungsi aktivasi yang tersedia di PyTorch beserta definisinya.
- Deep Learning — MIT Press — Bagian rectified linear units dan saturasi pada bab Multilayer Perceptrons.
- Dive into Deep Learning — Bab activation functions yang memuat kurva dan sifat tiap aktivasi.