Sebelum memahami Neural Network diharapkan sudah menguasai ini :
Neural Network (NN) atau bisa juga disebut Artificial Neural Network (ANN) dalah algoritma Machine Learning yang diciptakan dengan meniru jaringan neuron pada otak manusia dengan tujuan agar mesin dapat belajar mirip dengan cara belajar otak manusia, algoritma ini tergolong algoritma paling cerdas sebagai dasar pembuatan AI. Neuron-neuron diwakilkan dengan node-node yang berisi nilai yang memiliki bobot tertentu dan disusun berlapis menggunakan banyak lapisan tersembunyi / hidden layer sehingga dapat melakukan klasifikasi berdasarkan data yang sudah dilatih ditambah penggunaan fungsi aktivasi sehingga output dari Neural Network selalu diantara 0 dan 1, atau diantara−1 and 1.
Konfigurasi Neural Network cukup rumit, dan pelatihan model ini tergolong sulit dikarenakan membutuhkan waktu yang sangat lama untuk hal yang kompleks agar dapat menjadi akurat dan melibatkan banyak step serta tuning parameter yang rumit dan membutuhkan pemahaman yang mendalam.
Perceptron
Perceptron adalah sepotong bagian dari jaringan NN yang terdiri dari input, synapses, neuron dan output, perhitungan dilakukan disetiap perceptron ini, hasilnya tergantung dari jumlah input dan outputnya serta menghitung hasil akhir tergantung dari fungsi aktivasi yang digunakan.
Contoh terdapat 3 variabel input : x1, x2, dan x3, saat disambungkan ke suatu node, tiap node input wajib memiliki bobot (weight) yang awalnya ditentukan secara random, saat masuk ke dalam node semua nilai x dan bobot harus dikalikan kemudian diagregasi dengan rumus diatas.
Nilai input node : (x1*w1+b1) + (x2*w2+b2) + (x3*w3+b3)b adalah nilai bias, boleh digunakan boleh tidak, biasanya digunakan apabila nilai bobot atau nilai input 0 sehingga dikalikan menjadi nol dan tidak teraktivasi, nilai b biasanya 1 untuk menghindari node tidak aktif.Hasil nilai input node dimasukkan kedalam suatu fungsi aktivasi, dan hasilnya akan digunakan sebagai nilai output dari node tersebut, semua hidden node harus tersambung dengan semua dan dikalkulasi.
Untuk lebih jelasnya mari kita simulasi suatu masalah yang sangat sederhana agar mudah dimengerti :
input1 | input2| output
_______________________
0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1
Kasus diatas terdapat 2 variabel input, yang variabelnya hanya berisi nilai 1 atau 1, serta data output yang sudah ada, jika dilihat, output akan bernilai 1 jika input1 dan input2 match nilainya, sementara 0 jika input1 dan input2 tidak match, anggaplah kita sedang mencari algoritma matching ini.
Nilai Node = x1*w1 + x2*w2
Nilai Node A = 1*0.2 + 1*0.2 = 0.4
Nilai Node B = 1*0.1 + 1*0.4 = 0.5
Nilai Node C = 1*0.3 + 1*0.1 = 0.4
Fungsi aktivasi / Activation Function
Nilai hidden layer diatas masih belum diaktivasi, fungsi aktivasi digunakan untuk mengubah nilai hasil hitung bobot menjadi nilai range 0–1 atau -1–1
karena semua nilai yang disimpan di node harus dalam range tersebut. Fungsi aktivasi paling umum adalah Sigmoid untuk range 0–1 dan Tanh untuk range -1–1, fungsi Sigmoid juga biasa dipakai dalam Regresi Logistik / Logistic Regresion, fungsi aktivasi umum lainnya yang sering digunakan adalah ReLU (Rectified Linear Unit) dan Softmax yang biasa digunakan dalam Convolutional Neural Network (CNN).
Nilai Output Node = f(Nilai Node)
Nilai Output A = f(0.4) = 0.59869
Nilai Output B = f(0.5) = 0.62246
Nilai Output C = f(0.4) = 0.59869Nilai Node D = 0.6*0.3 + 0.62*0.2 +0.6*0.1 = 0.364
Nilai Output D = f(0.364) = 0.59
Setelah dihitung ulang menjadi seperti ini
Seperti kita tahu output dari kedua nilai 1 ini seharusnya 1, sehingga 1–0.59 = 0.41, berarti masih ada error sebesar 0.41, untuk menghasilkan perhitungan yang akurat misalnya hasil output 0.9 keatas mendekati 1 dengan selisih error sedikit, diperlukan bobot yang “tepat”, awalnya memang di random, tapi kemudian bobot ini disesuaikan sampai mendapatkan output mendekati 1, penyesuaian bobot ini butuh trial dan error, dan dilakukan berulang-ulang sampai benar, penyesuaian bobot ini tidak lagi dirandom, tetapi menggunakan metode tertentu agar terus mendekati nilai yang benar.
Untuk menyesuaikan bobot ini dibutuhkan metode Backpropagation untuk menyesuaikan nilai bobot dengan bantuan Cost Function dan Optimizer.
Backpropagation adalah proses menghitung mundur semua bobot dari error output sampai kembali ke input menggunakan fungsi derivatif dari fungsi aktivasinya, misalnya jika menggunakan Sigmoid, maka backpropagation menggunakan Sigmoid Derivative, fungsi derivatif memberikan nilai balik x jika diketahui nilai f(x), sampai mendapatkan bobot input, baru kemudian dihitung lagi dengan bobot baru.
Cost Function membantu menghitung selisih error yang benar, sementara Optimizer adalah fungsi pembantu dalam menentukan bobot yang lebih tepat sehingga dapat mengurangi jumlah trial and error secara drastis saat melakukan Backpropagation.
Contoh Optimizer yang umum : Gradient Descent (Default), Stochastic Gradient Descent (SGD), RMSprop, Adam, Adagrad, Adadelta, Adamax, Nadam.
Contoh Cost Functions yang umum : Mean Square Error, Mean Absolute Error, Hinge Loss/Multi class SVM Loss, Cross Entropy Loss/Negative Log Likelihood, Regression Loss Functions.
Error diukur dan dimasukkan ke fungsi tersebut untuk menghasilkan bobot baru, kemudian dicoba kembali dihitung lagi dari input dengan bobot baru, dilakukan berulang-ulang sampai bobot “tepat”.
Mari menghitung kembali Backpropagation dari contoh diatas, tadi diketahui error sebesar 0.41.
Diketahui
Error = 0.41
Nilai Node D = 0.364
Nilai Output D = 0.59
f'(x) = fungsi derivative
f'(x) = f(x)*(1-f(x))Delta Total Output ABC = f'(Nilai Node D) * Error
Delta Total Output ABC = f'(0.364) * 0.41
Delta Total Output ABC = f(0.364)*(1 - f(0.364)) * 0.41
Delta Total Output ABC = 0.59 * (1 - 0.59) * 0.41
Delta Total Output ABC = 0.099179Nilai Output A = f(0.4) = 0.59869
Nilai Output B = f(0.5) = 0.62246
Nilai Output C = f(0.4) = 0.59869Selisih bobot Node = Delta Total Output / Nilai Output Node
Selisih bobot A = 0.099179 / 0.59869 = 0.16558
Selisih bobot B = 0.099179 / 0.62246 = 0.15933
Selisih bobot C = 0.099179 / 0.59869 = 0.16558
Selisih bobot Node adalah nilai adjustment bobot untuk Node tersebutBobot lama A ke D = 0.3
Bobot lama B ke D = 0.2
Bobot lama C ke D = 0.1Bobot baru A ke D = 0.3 + 0.1162 = 0.4162
Bobot baru B ke D = 0.2 + 0.15933 = 0.35933
Bobot baru C ke D = 0.1 + 0.1162 = 0.2162Demikian seterusnya perhitungan bergerak mundur sampai Input untuk mengganti bobot yang baru, setelah iterasi banyak kali, nilai bobot akan akurat untuk menghasilkan output yang benar, demikian cara Neural Network belajar.
Contoh diatas baru menghitung nilai input 1 dan 1, bagaimana dengan input 3 sisanya ?
Contoh diatas hanya menghitung 1 pasang input, dan nilai akhir weight yang didapat hanya cocok untuk input tersebut, lalu bagaimana mendapatkan nilai weight input lainnya? apakah weight untuk input 1 dan 1 cocok untuk pasangan input yang lainnya? jawabnya belum tentu cocok, weight harus dihitung sehingga nilai weight tersebut cocok untuk semua pasangan input.
Cara mendapatkan weight yang benar untuk semua pasangan input dihitung menggunakan matriks, dan nilai weight pun dalam bentuk matriks, bisa digambarkan sebagai berikut :
Untuk memahami, diharapkan mengerti cara perkalian matriks.
Matriks input 4x2 (4 baris, 2 kolom), jika dikalikan dengan matriks weight 2x3 (2 baris 3 kolom), berikut triknya : pastikan kedua angka ini yang didalam () sama : 4x(2) · (2)x3, jika tidak sama, matriks tidak akan pernah bisa dikalikan, jika sudah sama, hasil matriks pasti (4)x2 · 2x(3) = 4x3 (Nilai neuron A,B,C), semua yang masuk ke A,B,C,D tentunya harus diaktivasi terlebih dahulu baru dilanjutkan menghitung.
Bagaimana dengan input 0 dan 0, bukankah jika dikalikan dengan bilangan apapun dan diaktifasi nilainya akan tetap 0? sementara input 0 dan 0 seharusnya menghasilkan angka 1 di output. Melalui code, biasanya nilai 0 ini akan dinormalisasi menjadi nilai -1 melalui fungsi tanh sehingga hasil perkalian tidak menjadi 0, cara lain adalah mengatur nilai bias saat inisialisasi.
Saat prediksi, input hanya 1 pasang saja, maka semua matriks weight akan tetap sama :
Tentang Algoritma Neural Network
Digunakan untuk prediksi dengan mengikuti cara kerja otak manusia
Pros:
- Algoritma terbaik untuk prediksi jika parameter yang digunakan tepat
- Baik untuk data yang berukuran sangat besar
- Baik digunakan untuk deep learning
Cons :
- Sulit dipahami mengapa hasil yang dikeluarkan seperti itu
- Butuh data yang besar untuk training (data sedikit menjadi tidak akurat)
- Memakan waktu training yang lama agar akurat
Bagaimana cara menentukan berapa hidden layer dan jumlah node yang dibutuhkan ?
Tidak ada aturan pasti berapa hidden layer dan jumlah node yang ditentukan, semakin banyak hidden layer dan node, semakin akurat tetapi semakin lama pula waktu trainingnya karena kalkulasi sangat banyak.
Mari implementasi dengan R dan Python, code berikut akan melakukan 2 fase, fase training dan fase prediksi.
library(neuralnet)df <- data.frame( "input1" = c(0,0,1,1),
"input2" = c(0,1,0,1),
"output" = c(1,0,0,1)
)NN = neuralnet(output ~ input1 + input2, df, hidden = 3 , linear.output = T)plot(NN)
#dapat dilihat bahwa training dilakukan 57 kali berulang sampai mendapatkan bobot yang tepat
#kita tes kembali hasil belajar dengan data yang sama (df lagi) :predict_testNN = compute(NN, df)
print(predict_testNN)Output
$neurons
$neurons[[1]]
input1 input2
[1,] 1 0 0
[2,] 1 0 1
[3,] 1 1 0
[4,] 1 1 1$neurons[[2]]
[,1] [,2] [,3] [,4]
[1,] 1 0.267184717 0.3660190 0.9305965
[2,] 1 0.007631621 0.8994818 0.1274150
[3,] 1 0.793271699 0.9731727 0.9995637
[4,] 1 0.074876975 0.9982246 0.9614627$net.result
[,1]
[1,] 0.995059748
[2,] 0.005862227
[3,] 0.009233015
[4,] 0.996415524#dapat dilihat bahwa output sudah sesuai/mendekati aslinya yaitu 1,0,0 dan 1
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# Input data
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
# Output labels
y = np.array([[1], [0], [0], [1]])# Create a sequential model
model = Sequential()# Add an input layer with 2 input nodes (one for each element in the pair)
model.add(Dense(8, input_dim=2, activation='relu'))# Add a hidden layer with 4 nodes
model.add(Dense(4, activation='relu'))# Add an output layer with 1 node (binary classification)
model.add(Dense(1, activation='sigmoid'))# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# Train the model
model.fit(X, y, epochs=1000, verbose=0)# Evaluate the model (optional)
loss, accuracy = model.evaluate(X, y)
print(f"Loss: {loss:.4f}, Accuracy: {accuracy*100:.2f}%")# Make predictions
predictions = model.predict(X)
print("Predictions:")
print(predictions)Predictions:
[[0.95406115]
[0.03945606]
[0.006086 ]
[0.9905874 ]]#dapat dilihat bahwa output sudah sesuai/mendekati aslinya yaitu 1,0,0 dan 1
Apa itu optimizer? SGD? binary_crossentropy? epochs? steps? nanti akan dibahas lebih lanjut pada pembahasan Deep Learning.
Pengukur Akurasi dan Error
Pengukur akurasi dan error Neural Network disarankan menggunakan Confusion Matrix untuk diukur ROC dan AUC nya. Confusion Matrix akan dibahas lebih lanjut.
Materi terkait lainnya