Bagaimana rumus menghitung jumlah parameter Simple RNN?
Bagaimana menghitung parameter pada stacked RNN bertingkat?
Apa itu Bidirectional RNN dan kapan digunakan?
Aplikasi apa yang cocok untuk Bidirectional RNN?
Reference Points
IF3270 Pembelajaran Mesin - RNN Pt. 1 (Pages 42-47)
Implementasi RNN di Keras: Many-to-One
Untuk kasus many-to-one (mis. memprediksi harga penutupan saham Amazon dari 50 timestep), implementasi Keras sederhana:
# predict amazon stock closing prices, RNN 50 timestepfrom keras import Sequentialfrom keras.layers import SimpleRNN, Densemodel = Sequential()model.add(SimpleRNN(10, input_shape=(50, 1)))# simple recurrent layer, 10 neurons & process 50x1 sequencesmodel.add(Dense(1, activation='linear'))# linear output because this is a regression problem
Layer SimpleRNN(10, input_shape=(50,1)) memproses sekuens berukuran 50×1 dengan 10 neuron hidden, dan secara default hanya mengembalikan state terakhir (cocok untuk many-to-one). Layer Dense(1) dengan aktivasi linear menghasilkan output regresi tunggal.
Perhatikan bahwa input dimension layer RNN ke-2 dan ke-3 adalah jumlah neuron layer sebelumnya (64 dan 32), bukan dimensi fitur asli.
Bidirectional RNN
Pada banyak aplikasi, kita ingin menghasilkan prediksi y(t) yang bergantung pada seluruh sekuens input — bukan hanya konteks masa lalu. Bidirectional RNN menggabungkan satu RNN yang bergerak maju (forward) melalui waktu mulai dari awal sekuens dengan RNN lain yang bergerak mundur (backward) mulai dari akhir sekuens. Output di setiap timestep adalah gabungan hidden state dari kedua arah, sehingga setiap posisi memiliki konteks kiri dan kanan sekaligus.
Aplikasi yang cocok: POS tagging (penentuan kelas kata bergantung pada tetangga kanan), speech recognition (co-articulation antar fonem), dan information extraction / sequence tagging secara umum — semua kasus di mana output suatu posisi bergantung pada seluruh konteks sekuens.
Implementasi RNN many-to-one di Keras cukup dengan SimpleRNN(10, input_shape=(50,1)) lalu Dense(1). Jumlah parameter dihitung dengan (input + hidden + 1) × hidden untuk layer RNN dan (hidden + 1) × output untuk Dense, contohnya (1+10+1)×10 + (10+1)×1 = 131. Pada stacked RNN (64→32→16 dengan return_sequences=True), input layer berikutnya adalah jumlah neuron sebelumnya, menghasilkan total 8257 parameter. Bidirectional RNN menggabungkan RNN maju + mundur sehingga setiap output mendapat konteks seluruh sekuens — berguna untuk POS tagging dan speech recognition di mana output bergantung pada konteks kiri dan kanan.
Additional Information
SimpleRNN vs LSTM vs GRU di Keras
SimpleRNN rawan vanishing/exploding gradient pada sekuens panjang. Keras menyediakan LSTM dan GRU sebagai pengganti drop-in dengan API identik (return_sequences, input_shape) namun dengan gating untuk mengatasi long-term dependency. Jumlah parameter LSTM ≈ 4× Simple RNN (empat gate), GRU ≈ 3×.
Membungkus dengan Bidirectional
Di Keras, bidirectional dibuat dengan wrapper: model.add(Bidirectional(SimpleRNN(10, return_sequences=True))). Ini menggandakan jumlah unit output (forward + backward di-concat secara default), sehingga parameter dan dimensi output menjadi dua kali lipat.
Verifikasi Jumlah Parameter
Selalu konfirmasi perhitungan manual dengan model.summary() di Keras, yang mencetak jumlah parameter per layer dan total. Ini cara cepat menangkap kesalahan dimensi input_shape.
Proyek Eksplorasi Mandiri
Bangun model many-to-one untuk prediksi harga saham, lalu bandingkan SimpleRNN, LSTM, dan GRU pada metrik RMSE dan jumlah parameter (model.summary()).
Implementasikan Bidirectional LSTM untuk POS tagging pada dataset Penn Treebank dan bandingkan akurasinya dengan RNN searah.