Cross-Entropy with Softmax ไม่ยากอย่างที่คิด​

Natthawat Phongchit
3 min readMay 6, 2020

--

สวัสดีผู้อ่านทุกท่านครับ เนื่องด้วยก่อนหน้านี้ผมกำลังเขียนบทความที่เกี่ยวกับ Focal Loss มีหนึ่งในส่วนที่จำเป็นต้องอธิบายเรื่อง Cross-Entropy with Softmax จึงได้ยกเรื่องนี้มาเขียนบทความแยก เพื่ออธิบาย และยกยกตัวอย่างการคำนวณ ให้ทุกคนเข้าใจพฤติกรรมของเจ้า Cross-Entropy with Softmax มากขึ้น

Cross-Entropy with Softmax

  • เนื่องจากโครงสร้างของเน็ตเวิร์คไม่ได้มีค่าน้ำหนักที่เป็นประโยชน์อยู่ภายใน เราจะเอามันไปใช้ทันทีไม่ได้
  • ซึ่งการฝึกนี้จะสำเร็จได้ก็ต้องมีมาตรวัตความสำเร็จก่อน โดยตัวฝึก (Trainer) จะใช้มาตรวัตนี้ในการกำหนดทิศทางการเปลี่ยนค่าน้ำหนัก
  • ในที่นี้เราจะใช้มาตรวัดความสำเร็จเป็นความคลาดเคลื่อนในการฝึก (training loss)
  • ซึ่งคำว่าคลาดเคลื่อนยังไม่แน่ว่าจะทำให้ผิดพลาด (Error) เพราะขึ้นกับการนิยามเพียงแต่เรามักจะตั้งการวัด training loss ให้เป็นฟังก์ชันที่หาอนุพันธ์ได้และถ้าหากความคลาดเคลื่อนที่สูงขึ้นมักนำไปสู่ความผิดพลาดที่สูงขึ้นตามก็จะถือว่าดีเยี่ยม (ทว่าในชีวิตจริงเราอาจจะไม่โชคดีเช่นนั้นเสมอไป)

สำหรับบทความนี้ เราจะลองลงลึกไปที่ Cross Entropy with Softmax กันตามหัวข้อนะครับ

Softmax

  • Softmax เป็น Activation Function (Function ที่ใช้ในการแปลงค่าน้ำหนักจากค่าหนึ่งไปเป็นอีกค่าหนึ่งด้วยฟังก์ชันที่เรากำหนด)
  • Softmax เราจะนำค่าตัวเลขที่ได้จากช่องผลลัพธ์ทุกช่องไปรวมกันก่อนด้วยฟังก์ชัน e^x (e ยกกำลัง x) ใช้รูป e ยกกำลังเพราะหาอนุพันธ์ง่ายและค่าไม่ติดลบ
  • จากนั้นจะนำผลรวมที่ได้ไปเป็นตัวหาร และนำผลลัพธ์จากแต่ละช่องไปเป็นตัวตั้ง ทำให้เรามีตัวตั้งเป็น
จำนวนตัวตั้งที่เกิดจากการคำนวณทั้ง 9 คลาส
ผลรวมของตัวตั้ง

ดังนั้นค่า Softmax ของคลาสเลข 0 ก็คือ

ค่า Softmax ของคลาสเลข 0

Cross-Entropy

ค่าความคลาดเคลื่อนในการทายผลของคลาสที่ i จะถูกคำนวณโดย

Cross-Entropy Function
  • ซึ่งในแบบที่พื้นฐานที่สุดเราจะกำหนด k=1 นั่นความหมายว่า (1−k)=0 และนิพจน์ทางด้านท้ายจะเป็น 0 ไปด้วย (Binary Classes)
  • ก่อนที่จะสรุปความหมายของฟังก์ชัน loss ขอให้สังเกตว่าตัวเศษยังไงก็น้อยกว่าตัวส่วน ดังนั้นเวลาหารกันแล้วยังไงค่าก็จะน้อยกว่าหนึ่ง และค่า log จะติดลบ เมื่อเราใส่เครื่องหมายลบไว้ด้านหน้าเพื่อกลับเครื่องหมาย ผลลัพธ์จากฟังก์ชัน loss ก็จะมีค่าเป็นบวก

เรามาลองดูตัวอย่างกันเลย

  • หากค่าที่เราต้องการมันคือคลาส 9 ผลลัพธ์ของช่องเลข 9 ก็ควรจะเป็นค่าบวกมาก ๆ ส่วนผลลัพธ์ในช่องสำหรับเลขอื่น ๆ ควรจะเป็นค่าลบเยอะ ๆ
  • กลไกการคำนวณพยายามทำให้ช่องผลลัพธ์ที่ตรงกับคลาสที่เป็นคำตอบได้ผลเป็นบวก ส่วนช่องผลลัพธ์ที่ไม่ตรงกับคลาสที่เป็นคำตอบจะได้ผลเป็นลบ
  • ดังนั้นสำหรับค่าคลาส 9 ผลลัพธ์ของช่องเลข 9 ซึ่งก็คือ z9 ควรจะมีค่ามาก ทำให้ e^z9 มีค่ามากตามไปด้วย ส่วนของผลลัพธ์ของเลข 0, 1, 2, …, 8 ซึ่งก็คือ z0, z1, z2, …, z8 ควรมีค่าติดลบมาก ๆ ทำให้ค่าของ e^z0, e^z1, e^z2, …, e^z8 จะมีค่าใกล้ศูนย์
  • จากรูปแบบนี้ ถ้าหากการทำนายมันแม่นมาก ค่าในช่องผลลัพธ์ของคำตอบที่ถูกจะเป็นบวกมาก ๆ อยู่ช่องเดียว ส่วนช่องอื่น ๆ จะติดลบ ซึ่งพอคิดค่า sum ของ e ออกมา เราจะได้ว่ามันมีค่าใกล้ ๆ กับ e^z9 เพราะผลลัพธ์ในพจน์อื่น ๆ มีค่าเกือบเป็นศูนย์ทั้งหมด

เพื่อให้เข้าใจภาพลองมาดูว่า ถ้าหาก z9 = 5 และ z0 = z1 = z2 = … = z8 =−5 ผลลัพธ์จากฟังก์ชัน loss จะเป็นอย่างไร

ez = [0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 148.4131591025766]
sum_e =148.47380062556837

จากผลลัพธ์ด้านบน เราจะเห็นได้ว่าค่าของ e^zi แทบทุกตัวมีค่าเพียง 0.0067 ส่วนของ e9 มีค่า 148.4 และค่า sum ของ e ที่เป็นผลรวมของ e^zi มีค่าประมาณ 148.5 เท่านั้น คราวนี้ลองมาดูว่า ถ้าเรากำหนดให้ k = 1 ผลลัพธ์จากฟังก์ชัน loss จะเป็นเท่าใด

loss = 0.00040851591387269136

ผลลัพธ์ข้างบนแสดงให้เห็นว่าจากฟังก์ชัน loss มีค่าน้อยมาก คือมีค่าเพียง 0.000405 เท่านั้น คราวนี้ลองมาดูว่า ถ้าหากแม่แบบการเรียนรู้ของเราทายผิดไปไกลถึงขั้นที่ว่า ค่าจากช่องผลลัพธ์หมายเลข 9 ติดลบ 5 ส่วนช่องอื่น ๆ เป็นบวก 5 แล้วจะเกิดอะไรขึ้น

ez = [148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 148.4131591025766, 0.006737946999085467]
sum_e =1335.7251698701884
loss = 12.197229621760137

ผลลัพธ์ข้างบนแสดงให้เห็นว่าค่าจากฟังก์ชัน loss เพิ่มขึ้นมาก จาก 0.000405 เปลี่ยนเป็น 12.197 หรือประมาณ 30,000 เท่า แสดงว่าเวลาทายผิดฟังก์ชันนี้จะให้ผลลัพธ์ออกมาเป็นค่าที่สูงขึ้น เป็นตัวแทนผิดพลาดได้

คราวนี้ มาลองดูว่าในกรณีที่ทายถูก แต่ทายถูกแบบไม่แน่ใจ โดยสมมติว่าเครื่องคิดว่าเลขที่อยู่ในภาพอาจจะเป็น 5 6 หรือ 8 แต่ก็ยังทายว่าโอกาสเป็น 9 มากที่สุด โดยในครั้งนี้ เราจะสมมติให้ช่องผลลัพธ์ของเลข 5 6 8 ให้ค่า +4 ออกมา ส่วนช่องผลลัพธ์ของเลข 9 ยังเป็น +5 และช่องผลลัพธ์อื่น ๆ ก็ยังเป็น -5 เช่นเดิม loss จะเป็นเท่าใด

ez = [0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 0.006737946999085467, 54.598150033144236, 54.598150033144236, 0.006737946999085467, 54.598150033144236, 148.4131591025766]
sum_e =312.2480368840038
loss = 1.7437978619851353
  • คราวนี้จะเห็นได้ว่า แม้โปรแกรมจะทายถูกว่าเป็นเลข 9 (เพราะผลลัพธ์จากช่องของเลข 9 มีค่ามากที่สุด) แต่ก็มีอีก 3 ช่องที่มีค่าเป็นบวกค่อนข้างมากเช่นกัน
  • ลักษณะนี่แสดงว่าเครื่องก็ไม่แน่ใจนักว่ามันเป็นเลขอะไรกันแน่ ซึ่งโดยนัยหนึ่งอาจจะหมายความว่าแม่แบบการเรียนรู้ยังดีไม่พอ
  • ต้องปรับเพื่อให้ได้ผลลัพธ์ที่แสดงถึงความแน่ใจว่าเป็นเลข 9 มากขึ้น ซึ่งอาจจะทำได้โดยทำให้ผลลัพธ์จากช่องเลข 9 มีค่าสูงขึ้น หรือผลลัพธ์จากช่อง 5, 6 และ 8 มีค่าน้อยลง

Summary

  • จากผลการทดสอบทั้งสามครั้ง แสดงว่าฟังก์ชัน loss ที่คำนวณมาจาก Cross-Entropy Softmax ช่วยในการบ่งชี้ถึงความคลาดเคลื่อนได้จริง
  • ถ้าทายถูกแบบตรง ๆ อย่างในกรณีแรกค่าจากฟังก์ชัน loss จะมีค่าน้อย ซึ่งแสดงว่ามีความคลาดเคลื่อนต่ำ แต่ถ้าทายผิดไปไกลก็จะค่ามาก
  • ซึ่งแสดงถึงความคลาดเคลื่อนสูง และที่สำคัญที่สุดคือตอนที่ทายถูกแต่ไม่แน่ใจ ค่าความคลาดเคลื่อนก็จะเพิ่มขึ้นมาระดับหนึ่ง
  • พฤติกรรมนี้แสดงให้เห็นว่า training loss ที่คำนวณมาด้วย Cross-Entropy Softmax สะท้อนถึงความสามารถที่แท้จริงของแม่แบบการเรียนรู้ได้เป็นอย่างดี

--

--

Natthawat Phongchit

Interested in Computer Vision, NLP, Reinforcement Learning.