โจมตีโครงข่ายประสาทเทียมด้วย Adversarial Examples FGSM method

Pranpaveen Lay.
Super AI Engineer
Published in
3 min readMar 28, 2021

สวัสดีครับ วันนี้ผมจะมาพูดถึงการโจมตีระบบโครงข่ายประสาทเทียมด้วย สิ่งที่เรียกว่า Adversarial Examples ด้วยวิธี FGSM (Fast Gradient Sign Method) เชื่อว่าหลายๆท่านคงเคยเห็นภาพนี้มาบ้างแล้ว …

มันคือรูปหมีแพนด้าที่ใส่ Noise เข้าไปในอัตราส่วนที่น้อยมากๆโดยที่เราไม่สามารถหาความแตกก่อนและหลังใส่ Noise ได้ แต่…ไม่ใช่กับ AI จะเห็นให้ว่าตอนแรกโมเดลเราทำนายว่ารูปนี้คือหมีแพนด้าด้วยความมั่นใจ 57.7% แต่พอหลังจากใส่ Noise เข้าไปโมเดลทำนายว่านี่คือ Gibbon(ชะนี) ด้วยความมั่นใจ 99.3%

Fast Gradient Sign Method (FGSM)

FGSM เป็นหนึ่งในวิธีการสร้าง Adversarial Examples ที่ง่ายและรวดเร็วที่สุดโดยการโจมตีนั้นมีสมการดังนี้

โดยที่

หลังจากเข้าใจว่าตัวแปรแต่ละตัวคืออะไรก็มาทำความเข้าใจภาษาคณิตศาสตร์กัน…

ส่วนนี้เป็นหัวใจหลักของการโจมตีซึ่งคือ การหาเกรเดียนต์ของ Loss function ของโมเดลเทียบกับ x หรือก็คือการหาทิศทางของ x ที่ทำให้ Loss function มีค่ามาก ซึ่งถ้า Loss function มีค่ามากก็หมายความว่าโมเดลเราจะแม่นยำน้อยลงนั่นเอง…หลังจากนั้นก็นำไปเข้า sign(ค่าบวกเป็น 1 ค่าลบเป็น -1) แล้วคูณกับ epsilon เพื่อลดทอนความเข้มของ Noise ก่อนที่จะนำไปใส่ในรูปภาพ

โดยสรุปก็คือ FGSM นี้จะได้ค่าที่ทำให้โมเดลมีค่า Loss function มากและเมื่อบวกกลับเข้าไปในข้อมูลตั้งต้นซึ่งจะทำให้โมเดลเราทำนายผิดนั่นเอง

อันนี้เป็นตัวอย่างที่เคยทดลองง่ายๆครับใช้ dataset mnist แค่ class 0,1 เข้าโมเดลดังนี้

ที่ layers ก่อนสุดท้ายเป็น 2 เพราะจะนำมา plot 2d ให้ดูง่ายๆครับ ซึ่งผลที่ได้ดังนี้

กราฟแสดง data แต่ละ class ก่อนและหลังโดนโจมตีใน epsilon ที่ต่างกันยิ่ง epsilon มากหรือก็คือใส่ noise เข้าไปเยอะ data ก็จะข้าม decision boundary เยอะ(และไกล?)

CODE

line 2 : .requires_grad_() จะทำให้ตัวแปรนั้นๆ return gradient กลับมา

line 6,7 : เช็ค input format ให้อยู่ในรูป (batch, channels, width, height)

line 8,9 : นำ input data เข้า model และนำไปหา loss เทียบกับ label

line 10 : loss.backward()ทำการคำนวณ Gradient เมื่อเสร็จแล้วตัวแปร image ก็จะมี gradient แล้ว

line 11 : ทำการดึงค่า gradient ของตัวแปร image แล้วนำไปเข้า sign

line 12 : นำไปคูณกับค่า epsilon แล้วบวกกลับไปใน input image

line 13 : เนื่องจาก input เราถูก scale มาให้อยู่ใจช่วง 0 ถึง 1 เมื่อเราบวกค่า Ad

ทีนี้มาทดลองการโจมตีกัน…และนี่ก็คือเป้าหมายของเราครับ

https://i1.wp.com/meow360.com/wp-content/uploads/2019/05/9231/such-a-cute-face-join-our-group-happy-cats.jpg

ซึ่งใช้ model vgg16 จะทำนายได้ดังนี้

เมื่อโจมตีด้วย epsilon = 0.05

จะเห็นได้ว่าจะเรายังเห็นว่าเป็นแมวอยู่แต่จะมี noise รบกวนนิดหน่อย (ปล.ที่รูปเบลอเพราะ resize เหลือ (244,244) นะครับ) ซึ่งเมื่อดูผลลัพธ์หลังจากนำไปทำการ predict

จะเห็นได้ว่า top5 แทบไม่เกี่ยวกับแมวเลย…

ทีนี้ลองลด epsilon เหลือ 0.01 ดูครับ

จะเห็นได้ว่าเมื่อลด epsilon เหลือ 0.01 แล้วทบจะสังเกตไม่เห็น noise เลยและผลจากการทำนายเป็นดังนี้

ใน top5 นั่นมี class ที่เป็นแมวโผล่มาแล้วแต่ว่าอันดับแรกที่มี prob สูงสุดยังผิดอยู่

ซึ่งก็ขอจบตัวอย่างไว้เพียงเท่านี้ครับสามารถไปลองเล่นกันได้ที่ colab : https://colab.research.google.com/drive/1LaehBF-1QGIyNJ04mOYQanYH5Wu92uOI?usp=sharing

แต่อย่านำไปใช้ในทางที่ไม่ดีหล่ะครับ ขอบคุณครับ :)

--

--