Image Captioning บน Kaggle TPU และ Keras-TF2!!
ThaiKeras 22 พค. 2563
สวัสดีครับเพื่อนๆ โมเดล “Image Captioning” หรือโมเดลที่ทำหน้าที่เรียนรู้ความหมายจากรูปภาพและถ่ายทอดออกมาเป็นประโยคในภาษามนุษย์ (เรียกว่า captions) เป็นโมเดลที่ผมชอบมากๆ ตั้งแต่ตอนเริ่มศึกษา Deep Learning
ที่ชอบมากๆ เนื่องจากเป็นโมเดล Deep Learning แรกๆ ในกลุ่มที่เรียกว่า “Visio-Linguistic” ที่ต้องรวมพลังของ Computer Vision และ NLP เข้าไว้ด้วยกัน เพราะต้องเข้าใจทั้งความหมายต่างๆ ของรูปภาพ รวมทั้งยังต้องเข้าใจโครงสร้างภาษาในคราวเดียวกันเพื่อสร้างข้อความขึ้นมาอธิบายรูป
Encoder-Decoder Model
ไอเดียของ Image Captioning โมเดลนั้นอยู่ในกลุ่มที่เรียกว่า Encoder-Decoder นั่นคือจะประกอบไปด้วยโมเดลย่อยสองส่วน โดยใน Image Captioning นี้โมเดลแรก “encoder” จะทำหน้าที่แปลความหมายของรูปภาพให้อยู่ในรูปเวกเตอร์ทางคณิตศาสตร์ ในขณะที่โมเดล “decoder” นั้นจะทำหน้าที่ถอดความหมายที่ซ่อนอยู่ในเวกเตอร์ทางคณิตศาสตร์ ให้ออกมาในรูปคำบรรยายบนตัวหนังสือในภาษาอังกฤษครับ
ใน image captioning โมเดล Encoder นั้นคือ CNN (Convolution Neural Networks) ส่วน Decoder นั้นคือ RNN (Recurrent Neural Networks) ซึ่งสามารถศึกษาเพิ่มเติมได้จาก workshops บน ThaiKeras ที่ผ่านมาครับ : http://bit.ly/thaikeras-workshops
—เกร็ดเล็กเกร็ดน้อย— โมเดล Encoder-Decoder นั้น general มากๆ ประยุกต์ใช้งานที่สำคัญได้อีกมาก เช่น งานด้าน “แปลภาษา”(machine translation) ได้ก็เป็นอีกตัวอย่างของโมเดลนี้ โดยเราเพียงปรับ image captioning ให้ Encoder ทำหน้าที่เข้าใจภาษาต้นฉบับเป็นเวกเตอร์ทางคณิตศาสตร์แทนที่จะเป็นรูปภาพ เท่านี้เราก็จะได้โมเดลใหม่ทันที
เนื่องจากการสร้างโมเดล Encoder-Decoder นั้นมีการเตรียมข้อมูลสอนที่ค่อนข้างซับซ้อนพอสมควร ตอนที่เริ่มเข้ามาฝึกใช้ Kaggle ใหม่ๆ ผมพยายามหาตัวอย่าง Image Captioning ดีดี แต่ก็ไม่มีตัวอย่างที่ผลลัพธ์ได้มาตรฐานเลย จนกระทั่งเพิ่งมาพบกับตัวอย่าง Official ของ Tensorflow เมื่อปีก่อน (อ้างอิง 1) ที่เราสามารถรันบน Colab หรือ Kaggle ได้
โดย tutorial บน tensorflow นี้ดีมากๆ เนื่องจากเพิ่มความสามารถของ Encoder-Decoder model ขึ้นไปอีกขั้นด้วยเทคนิกสำคัญมากๆ ของ Deep Learning ที่เรียกว่า Attention (ดูอ้างอิง 2)
อย่างไรก็ดีเนื่องจากงาน image captioning นั้นต้องใช้ computational resources ในการฝึกสอนมหาศาล ทำให้ด้วย resources บน colab หรือ kaggle นั้น เราสามารถใช้ training examples ได้เพียงราวๆ 1-2หมื่น คู่ image-captions เท่านั้น และยังต้องใช้เวลาฝึกสอนหลายชั่วโมง นอกจากนี้ผลลัพธ์ที่ได้ ก็แค่พอใช้ (บรรยายภาพ ผิดๆ แบบไร้วี่แววถูกหลายจุด) ทั้งนี้เป็นเพราะจำนวน training data น้อยเกินไปนั่นเอง
เกมส์เปลี่ยนด้วยพลังของ TF2 + TPU
ไม่นานมานี้ มีข่าวดีมากๆ ถึงสองข่าว โดยข่าวแรกก็คือ Kaggle นั้นอนุญาตให้พวกเราสามารถใช้ TPU (Tensor-Processing Units) ได้ฟรีถึง 30 ชม. ต่อสัปดาห์โดยเจ้า TPU รุ่นใหม่ล่าสุดตัวนี้แรงกว่า GPU P100 ตัวเก่า (ที่ก็ดีมากอยู่แล้ว) ราว 10-20 เท่า!!! นั่นทำให้คนธรรมดาอย่างเราๆ สามารถรันงานขนาดใหญ่ได้ภายในเวลาอันรวดเร็วบน Kaggle ครับ และนั่นก็ทำให้ผมลองกลับมาสนใจเจ้าโมเดล Image Captioning อีกครั้ง
อย่างไรก็ดี เดิมทีนั้นการเขียนโปรแกรมบน TPU นั้นค่อนข้างยากและมีรายละเอียดที่ต่างจาก GPU เยอะมากๆ แต่ข่าวดีที่สองก็คือ Tensorflow เวอร์ชั่น 2 (เรียกว่า TF2) ที่สนับสนุน Keras อย่างเป็นทางการนั้น ได้ทำให้การเขียนโปรแกรมด้วย TPU นั้นง่ายขึ้นมากๆ โดยเฉพาะถ้าเราสร้างโมเดลด้วย Keras ด้วย API ปกติแล้วนั้น โค้ดแทบจะไม่ต่างอะไรจากโค้ดบน CPU/GPU เลยครับ
ดังนั้นผมจึงนำ Tutorial Image Captioning ของ Tensorflow มาปรับปรุงใหม่ให้ใช้งาน TPU ได้ ปรับปรุง Input Pipeline ใหม่ให้รองรับ input มากกว่าเวอร์ชั่นเดิมเกือบ 10 เท่า (ราวๆ 150,000 คู่ภาพ-คำบรรยาย) รวมทั้งเพิ่ม data augmentation เข้าไปด้วย นอกจากนี้เรายังปรับใช้โมเดลฝั่ง image ที่ดีที่สุดคือ EfficientNet ใน Encoder และเพิ่ม Glove pretrained word-vectors เข้าไปในฝั่ง Decoder เพื่อเพิ่มคุณภาพของ Captions ไปอีกขั้นครับ
ซึ่งทั้งหมดนี้ด้วยพลังของ TPU ทำให้เราสามารถสอนโมเดลได้เสร็จในเวลาเพียง 1-2 ชม. เท่านั้น!
ใน tutorial นี้เราจะสอนโมเดลด้วย Custom training loop ซึ่งจะซับซ้อนกว่าการใช้ Keras model.fit หนึ่งขั้น และต้องปรับโค้ดจาก GPU มาเป็น TPU ขึ้นอีกสเต็ปครับ
ถ้าเพื่อนๆ อยากลองเล่นงาน Image Captioning สามารถเข้ามาทดลองเล่นได้ฟรีทันทีที่ Kaggle ที่นี่ครับ ในโน้ตบุ้คนี้เป็นฉบับภาษาอังกฤษ อย่างไรก็ดีถ้าเพื่อนๆ มีจุดไหนอยากสอบถามเพิ่มเติมสามารถสอบถามได้ครับ
https://www.kaggle.com/ratthachat/flickr-image-captioning-tpu-tf2-glove
ถ้าใครยังไม่คุ้นเคยกับ Kaggel ทำความรู้จักได้ที่นี่ครับ
http://bit.ly/thaikeras-kaggle-setup
อ้างอิง