บทสรุปนี้เป็นส่วนหนึ่งของโครงการ Super AI Engineer และเนื้อหาจาก อ.ปริญญา สถาบันการจัดการปัญญาภิวัฒน์ ต้องขอขอบคุณทางโครงการและอาจารย์เป็นอย่างสูงครับ
วันที่ 1 ภาคเช้า
โครงข่ายประสาทเทียม Artificial Neural Network (ANN)

แนวคิดเริ่มต้นของเทคนิคนี้ได้มาจากการศึกษาโครงข่ายไฟฟ้าชีวภาพในสมอง ซึ่งประกอบด้วย เซลล์ประสาท (neurons) และ จุดประสานประสาท (synapses) ตามโมเดลนี้ ข่ายงานจะเกิดจากการเชื่อมต่อระหว่างเซลล์ประสาทจนเป็นเครือข่ายที่ทำงานร่วมกัน การทำงานจะเลียนแบบระบบประสาทของมนุษย์ โดยเปลี่ยนมาเป็น graph ซึ่งหลักๆจะมี link กับ node
Activation
กราฟการกระตุ้น จะมีค่า threshold เมื่อใดที่แรงกระตุ้นหรือกระแสไฟฟ้านี้มีค่ามากกว่า threshold กระแสงไฟฟ้าจะยิงจากนิวรอลหนึ่งไปอีกนิวรอนหนึ่ง
hard limit function เป็น activation ในช่วงแรก ค่า threshold คือ 0 ถ้า <0 คือ -1 ถ้า >0 คือ 1 ใช้ -1,1 เพราะเป็น vector base คือ ใช้เวคเตอร์ในการอธิบาย perceptron หลักการคือ เวคเตอร์คูณกับ 1 จะได้ค่าเดิมแต่ถ้าคูณ -1 จะได้เท่าเดิมแต่กลับทิศ (ฟังก์ชันนี้จะใช้ไม่ได้กับ gradient base เพราะความชันแกนแนวตั้งเป็นอนันต์)

Perceptron
เป็นอัลกอริทึมง่ายๆแบบแรกของ neural network เป็น supervise learning และใช้งานแบบ binary classifier
การทำงานจะเป็นสมการเส้นตรงหรืออาจเป็นแบบหลายมิติได้ โดยเอาไปผ่าน activation function เช่น เมื่อ f คือ activation function จะได้ f(o) ส่งสมการเส้นตรง o


Homogeneous Coordinates
คู่อันดับเอกพันธ์ ในการพิจารณาแบบ vector base เราจะเพิ่มมิติของ weight เพิ่มขึ้นอีก 1 มิติเสมอ โดยมีค่าให้เป็น 1 นั่นคือ ทำให้เกิด bias ขึ้นมา มีประโยชน์เพื่อให้ hyperplane เลื่อนได้

ตัวอย่าง Perceptron (Vector Base)

แก้ปัญหา OR

แก้ปัญหา AND

แก้ปัญหา XOR
จะเกิดปัญหา infinite loop จะแก้ไขไม่ได้ จากรูป คือ ไม่สามารถหาเส้นตรงมาแบ่งข้อมูลดังกล่าวได้ จึงทำให้เกิด AI WINTER ครั้งที่ 1

Perceptron with TF (Gradient Base)
gradient base ใช้ความชันในการปรับ weight
Dense คือ เชื่อมแต่ละ node ทุกอัน ของชั้น layer หนึ่งไปอีก layer หนึ่ง หรือ FC (fully connected)

Mean Square Error
ยกกำลังสองเพราะทำให้ค่าไม่เป็นลบ กันกรณีที่ error จะหักลบกัน ส่วน MAE (Mean Absolute Error) ไม่ใช้เพราะ diff แล้วจะเป็นเศษส่วน แต่ช่วงหลังๆ MAE ก็เริ่มมีการใช้เยอะขึ้น

Optimal Weights

จุดที่ต่ำสุดของทั้งเส้นเรียก global minimum นอกนั้นคือ local minimum ส่วนใหญ่จะเป็น local minimum
วิธีการหาจุดต่ำสุด คือ diff loss function เท่ากับ 0 จากนั้น หาจุดวิกฤติที่มีค่าน้อยที่สุด แต่ปัญหา คือ เราไม่เห็นเส้นของสมการทั้งหมด เช่น ปัญหาหมา แมว เราหาหมาแมวทั้งหมดทั่วโลกมาไม่ได้ หาได้แค่บางส่วน ดังนั้น จึงต้องแรนดอมสุ่มจุดเริ่มต้นไปเรื่อยๆและเลื่อนหาจุดต่ำสุด
ปัญหาของ gradient descent คือ ต้องการ memory ค่อนข้างเยอะ จึงไม่ค่อยได้รับความนิยม จึงเกิด stochastic gradient descent
Stochastic gradient descent (SGD)
แบ่งข้อมูลเป็น batch แล้วถึงนำไปใช้รันจนครบ 1 epochs
ตัวอย่าง เช่น ถ้ามีข้อมูล train 3200 , ตั้ง batch size คือ 32 จะได้ว่าต้องใช้ 3200/32 = 100 iterations ถึงจะครบ 1 epochs
โดยในการรันครบ 1 iteration หรือ 1 batch จะอัพเดต weight 1 ครั้ง
1 epochs คือ Training ข้อมูลครบทั้ง sample
GD จะอัพเดต weight ครั้งเดียวเมื่อครบ 1 epochs
SGD จะอัพเดต weight หลายครั้ง จำนวนมากถึง batch size ใน 1 epochs
ถ้าความชันเป็นลบ w จะบวกมากขึ้นจะวิ่งลง ถ้าความชันเป็นบวก w จะลบน้อยลงจะวิ่งลง




Perceptron ไม่สามารแก้ปัญหา nonlinear ได้

Multi-Layer Perceptron (MLP)

มีการใช้งานฟังก์ชันเชิงเส้นมากกว่าหนึ่งครั้ง จากในรูป f() ข้างใน คือ perceptron แรก f(f()) ข้างนอกสุด คือ perceptron ที่สอง นี่คือการซ้อนสองครั้ง ซึ่งสามารถซ้อนกี่ครั้งก็ได้ ซ้อนเยอะๆเรียก deep ถ้าซ้อนเยอะๆไม่มี convolution จะเรียก DNN
XOR with MLP
การแก้ปัญหา XOR ด้วย MLPเริ่มด้วยแทนค่า x1,x2 ด้วยจุดทั้ง 4 จุด จะได้จุดพิกัดใหม่ จาก space x เป็น space y

เมื่อเปลี่ยนจาก space x ไปเป็น space y โดยการผ่าน MLP นี้ จะได้ว่ามีจุดเดียวที่เปลี่ยนตำแหน่ง คือ จุด x(1,1) ย้ายไป y(-1,-1) จุดอื่นๆนอกนั้นอยู่ที่เดิม

ทำต่อ โดยเปลี่ยนจาก space y เป็น space z

จาก space z เราก็จะแบ่งได้ด้วย hyperplane เป็นจุดที่อยู่ตรงกลางระหว่างสองจุด

ถ้าพล็อตกราฟเป็น 3 มิติ จะได้ดังในภาพ ซึ่งจะมี space ที่แบ่งระหว่างจุดเขียวกับแดงได้

Backpropagation
แนวคิด backpropagation คือ จากรูปเมื่อ error คำนวณจากผลลัพธ์ a-y และ ค่า a คำนวณจากพารามิเตอร์ W ดังนั้นหากเรารู้ว่า แต่ละพารามิเตอร์ W มีผลกระทบกับ error แค่ไหน เราก็สามารถปรับค่าพารามิเตอร์ W ให้ถูกต้องเพื่อทำให้ error น้อยที่สุด

หลักการ คือ การหาความชันของกราฟทำได้โดยการ diff dy/dx ค่าความชันหมายความว่า ค่า x มีผลกระทบกับค่า y เป็นกี่เท่า พูดง่ายๆ คือ การ diff ทำให้เราทราบว่า ค่า x มีผลต่อค่า y แค่ไหน ดังนั้น หลักการเดียวกันนี้ นำมาใช้กับการทำ backpropagation นั่นคือ หากเรา diff error เทียบกับ W จะทำให้รู้ว่า ค่า W มีผลต่อค่า error แค่ไหน

สรุป MLP
MLP จะแก้ปัญหา nonlinear ได้ คือ แก้ปัญหาที่พบทั่วไปได้ นอกจากนี้ space ที่อยู่ในช่วงของ hidden layer หรือช่วงกลางสามารถนำไปใช้งานได้ และเกิดกระบวนการอื่นๆ เช่น word2vec
Activation Function

ถ้าไม่เขียน activation function จะเป็น linear โดย default ซึ่งค่าที่เข้ามาเท่าไหร่ก็ออกเท่านั้น ส่วนใหญ่ใช้กับ regression เอา linear ไว้ layer สุดท้ายเพื่อดูค่า

ข้อดี smooth การ diff แล้วจะใช้งานง่ายและได้ตลอดทั้งฟังก์ชัน มีค่าระหว่าง [0,1]

ลดความซับซ้อนลง โดยมี slope แค่ 3 ค่า มีค่าระหว่าง [0,1]

เหมือน sigmoid แต่ state จะเปลี่ยนจาก [-1,1]

diff แล้วจะได้ slope เป็น [0,1] และไม่มีเส้นแนวนอนด้านบน ทำให้ค่าไม่ลดทพให้ซ้อน layer ได้มากขึ้น

ถ้าเทียบกับ ReLU มีส่วนโค้งและเปลี่ยนค่า state ฝั่งลบ

ถ้าเทียบกับ ELU มีส่วนปรับนิดหน่อยและเปลี่ยนค่า state ฝั่งลบ

ถ้าฟังก์ชันอื่นส่ง x เข้าแล้วจะส่งค่าออกได้เลย แต่ softmax จะเอา x จากทุกค่ามาคิดพร้อมกัน โดยค่าผลรวมในสมการเป็น 1 ดังนั้น จึงนิยมใช้ softmax ในชั้นสุดท้าย เพื่อที่จะได้ผลออกมาเป็นค่าความน่าจะเป็น
Comment Neural Network
Neural Network เป็น Universal approximator คือ สามารถทำได้ทุกอย่าง เช่น classification,regression,small dataset
Automatic Differentiation

สรุป การใช้งาน gradient tapes เป็นการใช้งาน custom differentiation คือ ช่วยให้เราสามารถ diff สมการได้เอง ทำให้การใช้งานหลากหลายมากยิ่งขึ้น
วันที่ 1 ภาคบ่าย
Deep Learning
เป็น neural network ที่มีหลาย layer ซ้อนกันหลายๆชั้น
ปัญหา vanishing gradient คือ การที่เมื่อเราเทรนโมเดลโดยการอัปเดต Parameter ซ้ำๆ ในกระบวนการ Gradient descent อนุพันธ์ δw บางตัวจะมีค่าน้อยลงจนเหลือน้อยมากๆ โดยเฉพาะในตัวที่อยู่ใน Layer ชั้นแรกๆ ที่ใกล้กับ Input layer ส่งผลให้การอัปเดต Parameter ครั้งถัดไป Loss จะเปลี่ยนแปลงน้อยลงมากจนไม่เกิดผลในการ Optimise หรือต้องใช้เวลา (จำนวนรอบ) สูงมากๆ ในการเทรน
ปัญหา Vanishing gradients นี้มีแนวทางในการแก้ 3 แนวทางด้วยกัน ได้แก่:
1) การเปลี่ยนวิธีการตั้งค่าตั้งต้นของ Parameter
2) การเปลี่ยน Activation function
3) การใช้เทคนิค Batch normalisation
การ train DNN สมัยก่อนจะใช้วิธีการ stacked autoencoder (จะ train เป็นชั้นๆ) ,RBM และอื่นๆ

Image Classification
input ส่งเข้า model แล้ว output ออกมา จะเป็น class label เช่น ส่งรูปดอกไม้เข้าไปแล้วออกมาเป็นข้อความว่า iris แบบนี้คือ class เป็นแบบ discrete เรียกว่า classification ถ้าเป็น continuous เมื่อไหร่จะเรียกว่า regression

MNIST DATASET
ใน kera จะมี dataset ที่โหลดมาใช้งานได้เลย เช่น mnist,imdb,cifar10,cifar100,boston_housing,fasion_mnist,reuters เป็นต้น

MLP with TF for MNIST

Vectorization คือ การยืดของที่มี tensor มากกว่า 1 มิติ ให้กลายเป็นมิติเดียว ข้อเสียคือ ขนาดมิติจะใหญ่มาก ดังนั้นจะได้ X -> 60,000×784

target จะต้อง convert เป็น one-hot encoder เพราะถ้าส่งตัวเลข 5 หรือ 4 จะถูกมองว่ามีค่ามากหรือน้อยกว่า ดังนั้นจึงเปลี่ยนไปอยู่ในรูปของ list โดยมีค่าเป็น 0,1 ถ้ามี 10 class ก็จะได้ 10 ตัว ดังนั้นจะได้ Y -> 60,000×10


สรุป ข้อมูลที่แปลงค่าแล้วแบบนี้มีข้อดี คือ สามารถเข้า classical technic ได้เกือบทุกตัว
Training and Prediction
ข้อมูล input คือ 60,000×784 เลือกค่าใส่ input_shape มาจาก Xtrain.shape[1] จะได้โครงสร้าง MLP ดังนี้
784 -> 200 -> 200 -> 10
จากในโค้ด Xtrain/255. คือ เพื่อให้เปลี่ยนจาก 0-255 เป็น 0-1 และเปลี่ยน int เป็น float เพราะจะดีกว่าในการใช้คำนวณ

Loss and Validation Loss
เมื่อเสร็จ 1 epoch จะมีค่า val_loss เป็นค่า loss ที่เกิดจากเอา Xtest,Ytest ไปทดสอบ ซึ่งในความเป็นจริงจะไม่มีข้อมูลส่วนนี้ จึงเรียกส่วนนี้ว่า validation เพื่อใช้ทดสอบหาประสิทธิภาพ แสดงว่า val_loss จะดีกว่า loss

Use Image without Vectorization
ไม่ต้องทำภาพให้เป็นเส้นตรงแบบ vector และแก้ไขข้อเสียอื่นๆ นั่นคือ วิธี 2D Discrete Cross-correlation

2D Discrete Cross-correlation
correlation ในที่นี้คือ การวัดความคล้ายของ signal 2 อัน ใน image processing นิยมใช้ 2D Discrete Cross-correlation เรียก filtering เช่น noise filtering และอื่นๆ ถ้ากรองหาความถี่สูงจะได้ขอบ (edge detection)
จากรูป จะเป็น filter 3×3 วิธีหาขนาด filter ถ้ากำหนดขนาด in-out มาให้ จาก (in-out)+1 จะได้ (4-2)+1 = 3

Convolution Neural Network (CNN)
cnn ไม่ได้ใช้ convolution ใช้ 2D Discrete Cross-correlation แต่เรียกว่า convolution layer filter
convolution กับ 2D Discrete Cross-correlation เมื่อ filter สมมาตรเมื่อไหร่ 2 ค่านี้จะเท่ากัน แต่ไม่มีผลอะไร เพราะเริ่มต้นก็เป็นค่า random

ถ้าต้องการใช้เป็น Convolution
จะต้องทำการ flip filter 180 องศา ขั้นตอนจากนั้นทำเหมือนเดิม ก็จะได้ค่าออกมา โดยค่าที่ได้จะไม่เท่ากันกับแบบ cross correlation



Tensor

GPU / EDGE Computing
gpu (graphic processing unit) จะประมวลผลเร็วกว่า cpu
edge computing การประมวลผลที่ขอบ (ของเครือข่าย) ซึ่งอาจจะอยู่ตรงไหนก็ได้ระหว่างอุปกรณ์นอกสุด (End devices) ซึ่งจะทำหน้าที่เก็บข้อมูลและประมวลผลข้อมูลที่อยู่ใกล้กับแหล่งข้อมูลให้มากที่สุด เช่น Jetson nano

2D Convolution Layer
จากในโค้ด จำนวน 3 filter ขนาด 3×3 และ stripe คือ เลื่อนแกนนอนและแกนตั้งทีล่ะ 5 padding=’same’ ขนาดออกมาจะได้เท่าเดิม ถ้าเป็น ‘valid’ จะลดลง

2D Max Pooling Layer
เป็นการลดขนาด โดยจะเลือกค่าสูงสุดค่าเดียวจากใน pool โดยที่ strides= None คือ เลื่อนตาม pool_size

Lenet5: The First CNN

Cross-Entropy
Cross Entropy เป็นการวัดค่าความต่างกันของการแจกแจงความน่าจะเป็นที่ถูกใช้ในโมเดล Deep Learning ประเภท Classification
ตัวอย่างหนึ่งของการนำเอา Entropy ไปใช้งานก็คือ การที่เราไม่ไว้วางใจผลการคำนวณของโมเดลที่มี Entropy สูง แล้วส่งให้ให้มนุษย์เป็นผู้ตัดสินใจแทน
Categorical Cross-Entropy ใช้กับ multiple class และ targets ต้องทำ one-hot encoder ก่อน
Sparse Categorical Cross-Entropy ไม่ต้องทำ one-hot encoder เพราะ kera ทำให้ ใช้ index เป็น class label
Transfer Learning
กรณี data ที่เรา train มีจำนวนน้อย เราสามารถนำ model และ weight จากที่อื่น มาใช้ train กับ data จำนวนน้อยๆได้ ซึ่ง model อาจจะเป็นแบบ domain ที่เกี่ยวข้องกันหรือไม่เกี่ยวข้องกันก็ได้แต่อาจจะสัมพันธ์กันบ้าง ลักษณะนี้เรียกว่า transfer learning

Adaptive moment estimation (Adam)
adam เป็น optimizer ที่เป็นที่นิยมมากที่สุดเพราะรวมจุดเด่นของแต่ละ optimizer อื่นๆข้อดี คือ ทำให้ gradient ลู่เข้าได้ดีขึ้นและเร็วขึ้น

วันที่ 2 ภาคเช้า
Backbone
backbone คือ neural network ที่เป็น CNN ที่ใช้กับอะไรก็ได้ และสามารถเปลี่ยนเลือก model ที่จะใช้งานได้
ใน keras จะเรียกใช้ได้จากคำสั่ง
1 2 3 |
from tensorflow.keras.application.vgg16 import VGG16 vgg = VGG16(include_top=False, weights='imagenet') |
เราจะใช้ include_top = False เพราะจะอิสระทั้งขาเข้าและออกกำหนดขนาดได้เอง จึงนิยมใช้เป็น backbone ถ้า weights เป็น ‘imagenet’ และ include_top = True จะต้องรู้ว่า input ต้องใช้ 224x224x3

Model ที่เลือกใช้งานได้

Autoencoder
Encoder ทำหน้าที่เป็น feature extractor ให้เราหยิบเอาไปใช้ในงานอื่นได้ โดยไม่ต้องเสียเวลามาทำ supervised training ตามปกติ
Decoder มีความสามารถแบบ generative model ซึ่งสามารถเอาข้อมูล feature (encoded data) ตัวเล็กๆมา reconstruct สร้างกลับเป็นข้อมูล original ได้
