Recurrent Neural Network

Created onDibuat pada
Last updated onTerakhir diperbarui
17 min read17 menit baca
IDRNNLSTMdeep-learningdata-science
ContributorsKontributor
Razi Rachman Widyadhana - @zirachw

Recurrent Neural Network (RNN) adalah arsitektur neural network yang dirancang untuk memproses data sekuensial dengan mempertahankan informasi dari timestep sebelumnya melalui koneksi rekuren.

#Link to this headingData Sekuensial

Pembelajaran mesin konvensional mengasumsikan data bersifat independent and identically distributed (IID), yaitu bahwa setiap contoh pelatihan bersifat saling independen dan urutan penyajiannya tidak relevan bagi model. Asumsi ini tidak berlaku ketika data membentuk suatu sekuens, karena urutan antardata menjadi bagian penting dari informasinya.

Data sekuensial (sequential data atau sequences) adalah data yang memiliki keterurutan, baik berdasarkan dimensi waktu maupun keterurutan logis lainnya. Data deret waktu (time series) merupakan jenis khusus data sekuensial di mana setiap contoh dikaitkan dengan dimensi waktu, misalnya harga saham dan rekaman suara. Tidak semua data sekuensial bersifat deret waktu. Teks dan sekuens DNA, misalnya, memiliki keterurutan yang jelas namun tidak dikaitkan dengan dimensi waktu.

Posisi RNN dalam peta arsitektur deep learning secara keseluruhan
Posisi RNN dalam peta arsitektur deep learning secara keseluruhan

#Link to this headingKeterbatasan FFNN untuk Sekuens

Feed Forward Neural Network (FFNN) atau Vanilla Neural Network memiliki keterbatasan mendasar ketika berhadapan dengan data sekuensial.

Vanilla NN: hanya menerima input berukuran tetap dan menghasilkan output berukuran tetap, tanpa memori
Vanilla NN: hanya menerima input berukuran tetap dan menghasilkan output berukuran tetap, tanpa memori

FFNN hanya menerima vektor berukuran tetap sebagai input dan menghasilkan vektor berukuran tetap sebagai output, menggunakan jumlah langkah komputasi yang tetap pula sesuai jumlah layer-nya. Model ini tidak memiliki memori terhadap contoh pelatihan sebelumnya sehingga tidak mampu menangkap ketergantungan antarposisi dalam suatu sekuens. Selain itu, panjang sekuens yang bervariasi sulit diakomodasi tanpa rekayasa fitur tambahan.

#Link to this headingJenis Pemodelan Sekuens

Bergantung pada sifat input dan output, pemodelan sekuens dibagi menjadi tiga kategori utama.

#Link to this headingMany-to-One

Many-to-One: input sekuens, output vektor atau skalar tunggal berukuran tetap
Many-to-One: input sekuens, output vektor atau skalar tunggal berukuran tetap

Input berupa sekuens, sedangkan output berupa vektor atau skalar berukuran tetap. Contoh penerapannya meliputi analisis sentimen (teks ulasan sebagai input dan label sentimen sebagai output), klasifikasi teks, penilaian esai otomatis, churn detection, klasifikasi video, dan peramalan permintaan.

Contoh Many-to-One: sentiment analysis, USD ke IDR forecasting, pose classification
Contoh Many-to-One: sentiment analysis, USD ke IDR forecasting, pose classification

#Link to this headingOne-to-Many

One-to-Many: input vektor tunggal berukuran tetap, output berupa sekuens
One-to-Many: input vektor tunggal berukuran tetap, output berupa sekuens

Input berupa data dalam format standar yang bukan sekuens, sedangkan output berupa sekuens. Contoh penerapannya adalah image captioning, yaitu gambar sebagai input dan frasa deskriptif sebagai output.

Image captioning: CNN encoder (Inception) menghasilkan context vector untuk RNN decoder (LSTM)
Image captioning: CNN encoder (Inception) menghasilkan context vector untuk RNN decoder (LSTM)

#Link to this headingMany-to-Many

Many-to-Many: input dan output keduanya berupa sekuens, tersinkronisasi atau tertunda
Many-to-Many: input dan output keduanya berupa sekuens, tersinkronisasi atau tertunda

Baik input maupun output keduanya merupakan sekuens. Kategori ini dibagi lebih lanjut berdasarkan sinkronisasi input dan output. Pada varian tersinkronisasi (synchronized), contohnya adalah named-entity recognition di mana setiap token diberi label secara langsung. Pada varian tertunda (delayed), contohnya adalah mesin penerjemah di mana output baru dihasilkan setelah seluruh input dibaca.

Contoh Many-to-Many: named-entity recognition (tersinkronisasi) dan forecasting dengan lag (tertunda)
Contoh Many-to-Many: named-entity recognition (tersinkronisasi) dan forecasting dengan lag (tertunda)

#Link to this headingRecurrent Neural Network (RNN)

#Link to this headingArsitektur

Perbandingan dataflow FFNN (forward only) dan RNN (forward + recurrent): hidden layer menerima input dari timestep sebelumnya
Perbandingan dataflow FFNN (forward only) dan RNN (forward + recurrent): hidden layer menerima input dari timestep sebelumnya

Berbeda dengan FFNN yang hanya memiliki koneksi maju (forward link), RNN memiliki koneksi maju sekaligus koneksi mundur (backward link). Hidden layer pada RNN menerima input dari dua sumber, yaitu layer input pada timestep saat ini dan hidden layer yang sama pada timestep sebelumnya. Bobot dibagi (shared) di sepanjang sumbu waktu sehingga parameter lebih efisien (parameter sharing).

#Link to this headingSingle-Layer RNN

Single-layer RNN: representasi kompak dengan recurrent edge dan bentuk unfolded lintas timestep
Single-layer RNN: representasi kompak dengan recurrent edge dan bentuk unfolded lintas timestep

Representasi kompak RNN dengan recurrent edge dapat dibuka (unfolded) sehingga tampak sebagai rangkaian hidden unit yang terhubung lintas waktu. Setiap hidden unit menerima dua input berbeda, yaitu praaktivasi (preactivation) dari layer input dan aktivasi hidden layer yang sama pada timestep sebelumnya h(t1)h(t-1). Pada timestep pertama (t=0t = 0), hidden unit diinisialisasi dengan nol atau nilai acak kecil. Pada t>0t > 0, hidden unit menerima x(t)x(t) dan h(t1)h(t-1).

#Link to this headingMulti-Layer RNN

Multi-layer RNN: hidden layer ke-2 menerima output layer ke-1 pada timestep saat ini dan hidden state sebelumnya
Multi-layer RNN: hidden layer ke-2 menerima output layer ke-1 pada timestep saat ini dan hidden state sebelumnya

Pada RNN berlapis ganda, hidden layer pertama h1(t)h_1(t) menerima input x(t)x(t) dan h1(t1)h_1(t-1), sedangkan hidden layer kedua h2(t)h_2(t) menerima output layer di bawahnya o1(t)o_1(t) dan h2(t1)h_2(t-1).

RNN neuron dengan loop: informasi dibawa melintasi neuron saat membaca input sekuens per timestep
RNN neuron dengan loop: informasi dibawa melintasi neuron saat membaca input sekuens per timestep

Setiap unit rekuren memiliki loop yang memungkinkan informasi terbawa melintasi neuron ketika membaca input. Setiap layer rekuren harus menerima sekuens sebagai input dan semua layer rekuren kecuali yang terakhir harus mengembalikan sekuens sebagai output (dengan return_sequences=True).

#Link to this headingParameter RNN

RNN weights: W_xh (input ke hidden), W_hh (recurrent), W_hy (hidden ke output)
RNN weights: W_xh (input ke hidden), W_hh (recurrent), W_hy (hidden ke output)

Setiap koneksi terarah dalam representasi RNN dikaitkan dengan sebuah matriks bobot yang tidak bergantung pada waktu sehingga dibagi di sepanjang sumbu waktu.

Tiga matriks bobot utama dalam RNN adalah sebagai berikut.

  • WxhW_{xh} adalah matriks bobot dari input x(t)x(t) ke hidden layer hh
  • WhhW_{hh} adalah matriks bobot rekuren dari hh ke hh antar-timestep
  • WhyW_{hy} adalah matriks bobot dari hidden layer hh ke output layer

#Link to this headingDimensi Matriks Bobot

h(t)=fh ⁣(Wxhx(t)+Whhh(t1)+bh)h(t) = f_h\!\left(W_{xh}\,x(t) + W_{hh}\,h(t-1) + b_h\right)

MatriksDimensi
WxhW_{xh}hidden neurons ×\times input dimension
WhhW_{hh}hidden neurons ×\times hidden neurons
WhyW_{hy}output neurons ×\times hidden neurons
bhb_hhidden neurons ×\times 1
byb_youtput neurons ×\times 1
Dimensi matriks bobot RNN: W_xh hidden x input, W_hh hidden x hidden, W_hy output x hidden
Dimensi matriks bobot RNN: W_xh hidden x input, W_hh hidden x hidden, W_hy output x hidden

#Link to this headingJumlah Parameter Simple RNN

Dengan mm dimensi input, nn hidden neurons, dan kk output neurons:

Parameter=(m+n+1)×n+(n+1)×k\text{Parameter} = (m + n + 1) \times n + (n + 1) \times k

Contoh: 1 input, 10 hidden neurons, 1 output regresi:

Total=(1+10+1)×10+(10+1)×1=120+11=131\text{Total} = (1 + 10 + 1) \times 10 + (10 + 1) \times 1 = 120 + 11 = \mathbf{131}

#Link to this headingForward Propagation RNN

Forward propagation RNN: hidden state h(t) dan output y(t) dihitung berurutan per timestep
Forward propagation RNN: hidden state h(t) dan output y(t) dihitung berurutan per timestep

Forward propagation pada RNN dilakukan per timestep dengan formula berikut.

h(t)=fh ⁣(Wxhx(t)+Whhh(t1)+bh)h(t) = f_h\!\left(W_{xh}\,x(t) + W_{hh}\,h(t-1) + b_h\right)

y(t)=fy ⁣(Whyh(t)+by)y(t) = f_y\!\left(W_{hy}\,h(t) + b_y\right)

Fungsi aktivasi fhf_h umumnya menggunakan tanh, sedangkan fyf_y bergantung pada jenis persoalan (softmax untuk klasifikasi multikelas dan linear untuk regresi). Persamaan hidden state juga dapat ditulis dalam bentuk gabungan (concatenated).

h(t)=fh ⁣(Wh[x(t);h(t1)]T+bh)h(t) = f_h\!\left(W_h\,[x(t);\,h(t-1)]^T + b_h\right)

#Link to this headingPersiapan Dataset Deret Waktu

Transformasi data deret waktu menjadi matriks lag: setiap baris berisi window timestep sebelumnya
Transformasi data deret waktu menjadi matriks lag: setiap baris berisi window timestep sebelumnya

Data deret waktu harus ditransformasi menjadi matriks di mana setiap nilai dikaitkan dengan jendela waktu (lag) sebelumnya. Sebagai contoh, dataset Airline Passenger memiliki 144 observasi jumlah penumpang bulanan.

FFNN 1 fitur: X(t) sebagai input tunggal untuk memprediksi Y=X(t+1)
FFNN 1 fitur: X(t) sebagai input tunggal untuk memprediksi Y=X(t+1)

Pada FFNN dengan 1 fitur, model menerima satu nilai sebelumnya untuk memprediksi nilai berikutnya. Keterbatasannya adalah konteks historis yang sangat terbatas.

FFNN 3 fitur: X(t-2), X(t-1), X(t) sebagai input untuk memprediksi Y=X(t+1)
FFNN 3 fitur: X(t-2), X(t-1), X(t) sebagai input untuk memprediksi Y=X(t+1)

Dengan 3 fitur, model menerima tiga nilai historis sekaligus, tetapi panjang jendela harus ditentukan secara manual dan bobot tidak dibagi antar-posisi.

RNN single layer: 3 timestep input [112, 118, 132] untuk memprediksi 129 dengan bobot shared
RNN single layer: 3 timestep input [112, 118, 132] untuk memprediksi 129 dengan bobot shared

RNN memungkinkan penggunaan timestep berurutan secara alami dengan bobot dibagi (shared) di setiap timestep sehingga lebih efisien secara parameter.

FFNN 3 fitur vs RNN 1 fitur dengan 3 timestep: struktur dataset dan perbandingan representasi
FFNN 3 fitur vs RNN 1 fitur dengan 3 timestep: struktur dataset dan perbandingan representasi

#Link to this headingContoh Forward Propagation: Klasifikasi Sekuens

Sebagai contoh konkret, diberikan sekuens karakter "ABCCD" yang di-encode dengan one-hot encoding berukuran 4 (A, B, C, D). Arsitektur RNN menggunakan 3 hidden neurons dengan aktivasi tanh dan 4 output neurons dengan aktivasi softmax.

Arsitektur RNN untuk klasifikasi sekuens: one-hot input 4 dimensi, 3 hidden neurons, 4 output softmax
Arsitektur RNN untuk klasifikasi sekuens: one-hot input 4 dimensi, 3 hidden neurons, 4 output softmax
MatriksDimensiKeterangan
WxhW_{xh}3×43 \times 4hidden neurons ×\times input dimension
WhhW_{hh}3×33 \times 3hidden neurons ×\times hidden neurons
WhyW_{hy}4×34 \times 3output neurons ×\times hidden neurons
bxhb_{xh}3×13 \times 1bias hidden
bhyb_{hy}4×14 \times 1bias output

Formula yang digunakan:

h(t)=tanh ⁣(Wxhx(t)+Whhh(t1)+bxh)h(t) = \tanh\!\left(W_{xh}\,x(t) + W_{hh}\,h(t-1) + b_{xh}\right)

y(t)=softmax ⁣(Whyh(t)+bhy)y(t) = \text{softmax}\!\left(W_{hy}\,h(t) + b_{hy}\right)

Pada t=0t = 0, hidden state diinisialisasi dengan nol. Setiap timestep menghasilkan distribusi probabilitas atas 4 kelas berikutnya.

Inisialisasi bobot random: W_xh (3x4), W_hh (3x3), W_hy (4x3), h(0)=0
Inisialisasi bobot random: W_xh (3x4), W_hh (3x3), W_hy (4x3), h(0)=0
Forward propagation 1 instance 4 timestep: diagram aliran informasi untuk sekuens ABCC
Forward propagation 1 instance 4 timestep: diagram aliran informasi untuk sekuens ABCC

Tabel berikut menunjukkan hasil komputasi numerik pada timestep t1t_1 dan t2t_2.

Computing h dan y untuk timestep t1 dan t2: W_xh*x, W_hh*h, net_h, tanh, W_hy*h, exp, softmax
Computing h dan y untuk timestep t1 dan t2: W_xh*x, W_hh*h, net_h, tanh, W_hy*h, exp, softmax

Dan untuk timestep t3t_3 dan t4t_4:

Computing h dan y untuk timestep t3 dan t4: nilai numerik lanjutan dengan h dari timestep sebelumnya
Computing h dan y untuk timestep t3 dan t4: nilai numerik lanjutan dengan h dari timestep sebelumnya
Output softmax pada timestep t4: distribusi probabilitas atas 4 kelas output
Output softmax pada timestep t4: distribusi probabilitas atas 4 kelas output

Pada contoh language model karakter "hello", prediksi yang dihasilkan pada tiap timestep dibandingkan terhadap karakter target berikutnya.

  • t=1t=1 (input "h"), prediksi "o", target "e"
  • t=2t=2 (input "e"), prediksi "o", target "l"
  • t=3t=3 (input "l"): output "l", target "l" ✓
  • t=4t=4 (input "l"): output "o", target "o" ✓

#Link to this headingImplementasi RNN

from keras import Sequential
from keras.layers import SimpleRNN, Dense
 
# Many-to-One: prediksi harga saham, 50 timestep, 10 hidden neurons
model = Sequential()
model.add(SimpleRNN(10, input_shape=(50, 1)))
model.add(Dense(1, activation='linear'))
# Total parameter = (1+10+1)*10 + (10+1)*1 = 131

Contoh arsitektur multi-layer:

model = Sequential()
model.add(SimpleRNN(64, input_shape=(50, 1), return_sequences=True))
model.add(SimpleRNN(32, return_sequences=True))
model.add(SimpleRNN(16))
model.add(Dense(8, activation='tanh'))
model.add(Dense(1, activation='linear'))
# (1+64+1)*64 + (64+32+1)*32 + (32+16+1)*16 + (16+1)*8 + (8+1)*1
# = 4224 + 3104 + 784 + 136 + 9 = 8257

#Link to this headingBidirectional RNN

Bidirectional RNN: RNN maju (kiri ke kanan) dan RNN mundur (kanan ke kiri) digabungkan
Bidirectional RNN: RNN maju (kiri ke kanan) dan RNN mundur (kanan ke kiri) digabungkan

Pada banyak persoalan, prediksi y(t)y(t) bergantung pada keseluruhan sekuens input, bukan hanya konteks sebelumnya. Bidirectional RNN menggabungkan dua RNN, yaitu satu yang bergerak maju dari awal sekuens dan satu yang bergerak mundur dari akhir sekuens. Contoh penerapannya adalah pengenalan ucapan (co-articulation) dan part-of-speech tagging.

Bidirectional RNN untuk information extraction: konteks kiri dan kanan digabungkan di setiap posisi
Bidirectional RNN untuk information extraction: konteks kiri dan kanan digabungkan di setiap posisi

#Link to this headingLong Short-Term Memory (LSTM)

#Link to this headingMotivasi

RNN standar menghadapi kesulitan menangkap ketergantungan jangka panjang (long-term dependency) karena hidden state yang terbatas. LSTM diperkenalkan oleh Hochreiter & Schmidhuber (1997) dan dirancang secara eksplisit untuk mengatasi masalah ini. Berbeda dengan RNN standar yang modul berulangnya hanya berisi satu layer tanh, modul berulang LSTM mengandung empat layer yang saling berinteraksi.

RNN vs LSTM: modul berulang RNN (satu tanh layer) dibandingkan LSTM (empat layer interaktif dengan cell state)
RNN vs LSTM: modul berulang RNN (satu tanh layer) dibandingkan LSTM (empat layer interaktif dengan cell state)

#Link to this headingCell State dan Gates

LSTM memiliki dua jalur informasi, yaitu hidden state h(t)h(t) dan cell state C(t)C(t).

Cell state C(t)C(t) berfungsi sebagai "memori" jaringan, berperan sebagai jalur transportasi yang membawa informasi relevan sepanjang pemrosesan sekuens. Cell state bergerak lurus sepanjang rantai dengan hanya sedikit interaksi linear sehingga informasi dapat mengalir hampir tanpa perubahan.

Gates berfungsi sebagai pengatur aliran informasi secara opsional. Setiap gate menggunakan layer sigmoid yang menghasilkan nilai antara 0 dan 1, di mana 0 berarti "blokir sepenuhnya" dan 1 berarti "lewatkan sepenuhnya".

LSTM unit lengkap: cell state sebagai jalur lurus dan tiga gate (forget, input, output)
LSTM unit lengkap: cell state sebagai jalur lurus dan tiga gate (forget, input, output)
Notasi LSTM: simbol untuk operasi pointwise, layer neural network, dan vektor
Notasi LSTM: simbol untuk operasi pointwise, layer neural network, dan vektor

#Link to this headingForget Gate

Forget gate layer: memutuskan informasi mana dari cell state C(t-1) yang akan dihapus
Forget gate layer: memutuskan informasi mana dari cell state C(t-1) yang akan dihapus

Forget gate memutuskan informasi mana yang akan dibuang dari cell state. Gate ini melihat h(t1)h(t-1) dan x(t)x(t), kemudian menghasilkan nilai antara 0 dan 1 untuk setiap elemen cell state C(t1)C(t-1).

ft=σ ⁣(Wxfx(t)+Whfh(t1)+bf)=σ ⁣(Wf[h(t1),x(t)]+bf)f_t = \sigma\!\left(W_{xf}\,x(t) + W_{hf}\,h(t-1) + b_f\right) = \sigma\!\left(W_f\,[h(t-1),\,x(t)] + b_f\right)

Nilai mendekati 0 berarti "lupakan", sedangkan nilai mendekati 1 berarti "pertahankan".

#Link to this headingInput Gate dan Tanh Layer

Input gate dan tanh layer: gate memutuskan nilai yang diperbarui, tanh membentuk kandidat cell state
Input gate dan tanh layer: gate memutuskan nilai yang diperbarui, tanh membentuk kandidat cell state

Tahap ini memutuskan informasi baru apa yang akan disimpan ke dalam cell state, terdiri dari dua komponen. Input gate memutuskan nilai mana yang akan diperbarui, sedangkan tanh layer membentuk vektor kandidat nilai baru C^t\hat{C}_t yang dapat ditambahkan ke state.

it=σ ⁣(Wxix(t)+Whih(t1)+bi)=σ ⁣(Wi[h(t1),x(t)]+bi)i_t = \sigma\!\left(W_{xi}\,x(t) + W_{hi}\,h(t-1) + b_i\right) = \sigma\!\left(W_i\,[h(t-1),\,x(t)] + b_i\right)

C^t=tanh ⁣(Wxcx(t)+Whch(t1)+bc)=tanh ⁣(Wc[h(t1),x(t)]+bc)\hat{C}_t = \tanh\!\left(W_{xc}\,x(t) + W_{hc}\,h(t-1) + b_c\right) = \tanh\!\left(W_c\,[h(t-1),\,x(t)] + b_c\right)

#Link to this headingPembaruan Cell State

Update C(t-1) ke C(t): Hadamard product dengan forget gate ditambah input gate dikali kandidat
Update C(t-1) ke C(t): Hadamard product dengan forget gate ditambah input gate dikali kandidat

Cell state lama dikalikan dengan forget gate untuk melupakan informasi yang tidak relevan, kemudian ditambahkan dengan nilai kandidat baru yang diskalakan oleh input gate.

C(t)=(C(t1)ft)(itC^t)C(t) = \bigl(C(t-1) \odot f_t\bigr) \oplus \bigl(i_t \odot \hat{C}_t\bigr)

di mana \odot menunjukkan perkalian elemen per elemen (Hadamard product) dan \oplus menunjukkan penjumlahan elemen per elemen.

#Link to this headingOutput Gate

Output gate: menentukan hidden state h(t) berdasarkan cell state C(t) yang difilter sigmoid dan tanh
Output gate: menentukan hidden state h(t) berdasarkan cell state C(t) yang difilter sigmoid dan tanh

Output gate menentukan bagian mana dari cell state yang akan menjadi hidden state h(t)h(t). Cell state dilewatkan melalui tanh untuk mendorong nilai ke rentang [1,1][-1, 1], kemudian dikalikan dengan output sigmoid gate.

ot=σ ⁣(Wxox(t)+Whoh(t1)+bo)=σ ⁣(Wo[h(t1),x(t)]+bo)o_t = \sigma\!\left(W_{xo}\,x(t) + W_{ho}\,h(t-1) + b_o\right) = \sigma\!\left(W_o\,[h(t-1),\,x(t)] + b_o\right)

h(t)=ottanh ⁣(C(t))h(t) = o_t \odot \tanh\!\left(C(t)\right)

#Link to this headingRingkasan Formula LSTM

GateFormula
Forget gateft=σ(Wf[h(t1),x(t)]+bf)f_t = \sigma(W_f[h(t-1),\,x(t)] + b_f)
Input gateit=σ(Wi[h(t1),x(t)]+bi)i_t = \sigma(W_i[h(t-1),\,x(t)] + b_i)
Kandidat cell stateC^t=tanh(Wc[h(t1),x(t)]+bc)\hat{C}_t = \tanh(W_c[h(t-1),\,x(t)] + b_c)
Pembaruan cell stateC(t)=(C(t1)ft)(itC^t)C(t) = (C(t-1) \odot f_t) \oplus (i_t \odot \hat{C}_t)
Output gateot=σ(Wo[h(t1),x(t)]+bo)o_t = \sigma(W_o[h(t-1),\,x(t)] + b_o)
Hidden stateh(t)=ottanh(C(t))h(t) = o_t \odot \tanh(C(t))

#Link to this headingContoh Forward Propagation LSTM

Forward propagation LSTM timestep t1: inisialisasi h(0)=0, C(0)=0, hitung keempat gate dan cell state baru
Forward propagation LSTM timestep t1: inisialisasi h(0)=0, C(0)=0, hitung keempat gate dan cell state baru
Forward propagation LSTM timestep t2: menggunakan h(1) dan C(1) dari timestep sebelumnya
Forward propagation LSTM timestep t2: menggunakan h(1) dan C(1) dari timestep sebelumnya

#Link to this headingImplementasi LSTM

from keras import Sequential
from keras.layers import LSTM, Dense
 
# Many-to-One: prediksi harga saham, LSTM 50 timestep, 10 hidden neurons
model = Sequential()
model.add(LSTM(10, input_shape=(50, 1)))
model.add(Dense(1, activation='linear'))
# Total parameter = (1+10+1)*4*10 + (10+1)*1 = 480 + 11 = 491

#Link to this headingJumlah Parameter LSTM

Karena LSTM memiliki empat gate, jumlah parameternya empat kali lebih banyak dari Simple RNN dengan ukuran setara. Dengan mm dimensi input, nn hidden neurons, dan kk output neurons:

Parameter LSTM=(m+n+1)×4×n+(n+1)×k\text{Parameter LSTM} = (m + n + 1) \times 4 \times n + (n + 1) \times k

ModelFormulaTotal
Simple RNN(1+10+1)×10+(10+1)×1(1+10+1)\times 10 + (10+1)\times 1131
LSTM(1+10+1)×4×10+(10+1)×1(1+10+1)\times 4 \times 10 + (10+1)\times 1491

#Link to this headingVarian: GRU dan ReGU

Evolusi arsitektur RNN dari Recurrent nets (1985) ke LSTM (1997), Bi-RNN, GRU (2014), hingga Residual Gated Unit (2019)
Evolusi arsitektur RNN dari Recurrent nets (1985) ke LSTM (1997), Bi-RNN, GRU (2014), hingga Residual Gated Unit (2019)

GRU (Gated Recurrent Unit, 2014) merupakan penyederhanaan LSTM tanpa cell state terpisah dan hanya menggunakan dua gate, yaitu reset gate dan update gate. ReGU (Residual Gated Unit, 2019) menambahkan koneksi shortcut untuk mengatasi degradasi performa pada jaringan yang sangat dalam.

#Link to this headingBackpropagation Through Time (BPTT)

BPTT: jaringan di-unfold sepanjang waktu, total loss L adalah jumlah L_t untuk t=1 sampai T
BPTT: jaringan di-unfold sepanjang waktu, total loss L adalah jumlah L_t untuk t=1 sampai T

BPTT (Backpropagation Through Time) adalah ekstensi dari backpropagation standar yang diterapkan pada jaringan yang di-unfold sepanjang waktu. Total loss LL merupakan jumlah loss di setiap timestep dari t=1t = 1 hingga t=Tt = T.

L=t=1TLtL = \sum_{t=1}^{T} L_t

Notasi matriks yang sering digunakan dalam literatur adalah U=WxhU = W_{xh}, W=WhhW = W_{hh}, dan V=WhyV = W_{hy}.

#Link to this headingCross Entropy Loss

Fungsi loss yang umum digunakan pada RNN untuk klasifikasi adalah cross entropy:

L=iyiln(y^i)L = -\sum_{i} y_i \ln(\hat{y}_i)

di mana yy merupakan target one-hot encoded dan y^\hat{y} merupakan prediksi softmax.

Cross entropy loss untuk multiclass: L = -ln(0.71) - ln(0.98) - ln(0.49)
Cross entropy loss untuk multiclass: L = -ln(0.71) - ln(0.98) - ln(0.49)

Contoh untuk satu instance:

Target yyPrediksi y^\hat{y}Loss
[1,0,0][1,0,0][1,0,0][1,0,0]00
[1,0,0][1,0,0][0.7,0.2,0.1][0.7,\,0.2,\,0.1]0.3570.357
[0,1,0][0,1,0][1,0,0][1,0,0]\infty

Untuk output sekuens, loss total dihitung sebagai penjumlahan cross entropy di setiap timestep.

Cross entropy loss untuk sequence output: L = -sum ln(y_hat) pada setiap timestep yang benar
Cross entropy loss untuk sequence output: L = -sum ln(y_hat) pada setiap timestep yang benar

Sebagai contoh pada sekuens 4 timestep:

L=ln(0.253)ln(0.26)ln(0.299)ln(0.240)=5.356L = -\ln(0.253) - \ln(0.26) - \ln(0.299) - \ln(0.240) = 5.356

#Link to this headingAlgoritma BPTT

Prosedur BPTT terdiri dari tiga langkah. Pertama, forward pass menghitung output sekuens saat ini menggunakan formula forward propagation. Kedua, backward pass menghitung cross entropy error menggunakan output saat ini y^1..n\hat{y}_{1..n} dan output aktual y1..ny_{1..n}, kemudian menghitung gradien untuk setiap timestep pada jaringan yang di-unfold. Ketiga, karena bobot sama untuk semua timestep, gradien digabungkan sebelum bobot diperbarui.

LWhy=tLtWhy,LWhh=tLtWhh,LWxh=tLtWxh\frac{\partial L}{\partial W_{hy}} = \sum_{t} \frac{\partial L_t}{\partial W_{hy}}, \qquad \frac{\partial L}{\partial W_{hh}} = \sum_{t} \frac{\partial L_t}{\partial W_{hh}}, \qquad \frac{\partial L}{\partial W_{xh}} = \sum_{t} \frac{\partial L_t}{\partial W_{xh}}

BPTT untuk RNN: penurunan gradient untuk W_hy menggunakan chain rule pada output layer
BPTT untuk RNN: penurunan gradient untuk W_hy menggunakan chain rule pada output layer
BPTT lanjutan: gradient untuk W_hh dan W_xh melibatkan penjumlahan kontribusi dari semua timestep
BPTT lanjutan: gradient untuk W_hh dan W_xh melibatkan penjumlahan kontribusi dari semua timestep
Backward pass: detail δo(t) di output layer dan δh(t) di hidden layer dengan Hadamard product
Backward pass: detail δo(t) di output layer dan δh(t) di hidden layer dengan Hadamard product

Contoh numerik backward pass pada t=1t=1:

Backward phase t=1: perhitungan delta output dan delta hidden untuk contoh forward pass sebelumnya
Backward phase t=1: perhitungan delta output dan delta hidden untuk contoh forward pass sebelumnya
Backward phase t=1 lanjutan: gradien terhadap W_hy dan W_hh
Backward phase t=1 lanjutan: gradien terhadap W_hy dan W_hh
Backward phase t=1 lanjutan: gradien terhadap W_xh dan h(t-1)
Backward phase t=1 lanjutan: gradien terhadap W_xh dan h(t-1)

Contoh numerik backward pass pada t=0t=0:

Backward phase t=0: menyebarkan gradient ke timestep sebelumnya melalui recurrent connection
Backward phase t=0: menyebarkan gradient ke timestep sebelumnya melalui recurrent connection
Backward phase t=0 detail: perhitungan lengkap gradient di timestep pertama
Backward phase t=0 detail: perhitungan lengkap gradient di timestep pertama

Update bobot:

Update phase: W_new = W_old - lambda * gradient, dengan lambda=0.1
Update phase: W_new = W_old - lambda * gradient, dengan lambda=0.1

#Link to this headingTruncated BPTT

Truncated BPTT: forward dan backward pass dibagi menjadi segmen-segmen lebih pendek untuk efisiensi
Truncated BPTT: forward dan backward pass dibagi menjadi segmen-segmen lebih pendek untuk efisiensi

Truncated BPTT dikembangkan untuk mengurangi kompleksitas komputasi pembaruan parameter pada RNN. Algoritma ini membagi forward dan backward pass menjadi sekumpulan operasi lebih pendek dengan panjang yang ditentukan pengguna. Konsekuensinya, gradien dari timestep jauh tidak dapat mengalir kembali sejauh yang diperlukan. Sebagai contoh, dengan panjang segmen 4 dan sekuens panjang 10, informasi dari timestep 0 tidak dapat memengaruhi pembaruan weight dari timestep 10 melalui backpropagation. Dalam praktiknya, truncated BPTT bekerja dengan baik selama panjang segmen dipilih dengan tepat.

#Link to this headingVanishing Gradient

Vanishing gradient pada RNN: gradient mengecil secara eksponensial seiring kedalaman timestep
Vanishing gradient pada RNN: gradient mengecil secara eksponensial seiring kedalaman timestep

Backpropagation menghitung gradien menggunakan chain rule. Pada RNN yang panjang, gradien yang melalui banyak timestep melibatkan perkalian berulang turunan fungsi aktivasi. Fungsi sigmoid memiliki turunan maksimum sebesar 0.250.25 sehingga gradien mengecil secara eksponensial seiring dengan bertambahnya jarak waktu. Weight pada timestep awal tidak mengalami pembaruan yang berarti sehingga pelatihan terhenti secara efektif.

δh=h(1h)kwhkδk\delta_h = h(1-h)\cdot\sum_k w_{hk}\,\delta_k

LSTM mengatasi masalah ini melalui cell state yang bergerak lurus (constant error carousel), di mana gradien dapat mengalir tanpa dikalikan berulang kali oleh turunan aktivasi.

#Link to this headingEncoder-Decoder

Model encoder-decoder (atau sequence-to-sequence) bertujuan memetakan sekuens input ke sekuens output di mana panjang keduanya dapat berbeda. Contoh penerapannya meliputi mesin penerjemah (machine translation), question answering, dan video captioning.

Detail encoder-decoder: encoder mengumpulkan informasi ke encoder vector, decoder menghasilkan output per timestep
Detail encoder-decoder: encoder mengumpulkan informasi ke encoder vector, decoder menghasilkan output per timestep

Encoder merupakan tumpukan beberapa unit rekuren di mana setiap unit menerima satu elemen input, mengumpulkan informasinya, dan menyebarkannya ke depan. Encoder vector adalah hidden state akhir yang dihasilkan encoder, merangkum informasi seluruh sekuens input sebagai representasi konteks. Decoder merupakan tumpukan unit rekuren yang masing-masing memprediksi output yty_t pada timestep tt, dengan encoder vector sebagai hidden state awal.

Contoh machine translation: encoder membaca kalimat bahasa Inggris, decoder menghasilkan kalimat bahasa Prancis
Contoh machine translation: encoder membaca kalimat bahasa Inggris, decoder menghasilkan kalimat bahasa Prancis