ในปัจจุบันการเทรน Deep Neural Network ใช้พื้นฐานอัลกอริทึมมาจาก Mini-Batch Stochastic Gradient Optimization เป็นส่วนใหญ่ และจำนวนตัวอย่างข้อมูลที่เราป้อนให้โมเดลในหนึ่งครั้ง หรือ 1 Mini-Batch คือ Hyperparameter สำคัญตัวหนึ่งที่เราต้องปรับจูน ซึ่งใน Library ต่าง ๆ จะใช้ชื่อว่า Batch Size
ในเคสที่เรามีข้อมูลขนาดใหญ่ เช่น รูปมีความละเอียดสูง ด้วยข้อจำกัดเรื่องขนาด Memory ของ GPU ทำให้เราต้องลด Batch Size ลง เพื่อให้เทรนโมเดลได้โดยที่ไม่ Out of Memory Error
การเพิ่มลดขนาด Batch Size นี้เอง ไม่ได้แค่มีผลให้โมเดลสามารถเทรนได้เท่านั้น แต่ยังมีผลในเรื่องอื่น ๆ อีก เช่น
- เวลาที่ใช้เทรน – Batch Size เล็กช้ากว่า
- Memory ที่ใช้ – Batch Size เล็กใช้น้อยกว่า
- และที่สำคัญ ความแม่นยำของโมเดล – Batch Size ขนาด <=32 แม่นยำกว่า

สรุปว่า การใช้ Batch Size ขนาดยิ่งใหญ่ยิ่งดี ให้เต็ม GPU Memory ที่สุด จะได้ใช้ GPU คุ้ม ๆ เทรน Deep Neural Network เร็ว ๆ ได้ผลลัพธ์ดี ๆ แต่ในทางปฏิบัติกลับไม่เป็นเช่นนั้น ขนาดของ Batch Size มีผลต่อความแม่นยำของโมเดล และเวลาที่ใช้ในการเทรนด้วย ดังตัวอย่าง Notebook ด้านล่าง
เรามาเริ่มกันเลยดีกว่า
0. Magic Commands¶
%reload_ext autoreload
%autoreload 2
%matplotlib inline
1. Import Library¶
from fastai import *
from fastai.vision import *
from fastai.metrics import accuracy
2. ข้อมูล¶
ใช้ชุดข้อมูล Dataset พันธุ์หมาแมว Oxford-IIIT Pet Dataset by O. M. Parkhi et al., 2012
path = untar_data(URLs.PETS)
path_images = path/'images'
filenames = get_image_files(path_images)
3. เตรียมข้อมูล¶
เพื่อความสะดวก เราจะประกาศฟังก์ชัน แล้วไปเรียกสร้างก่อน fit ด้วย Batch Size แต่ละแบบ
batchsize = 64
epoch = 16
np.random.seed(55)
regex_pattern = r'/([^/]+)_\d+.jpg$'
def get_databunch():
return ImageDataBunch.from_name_re(path_images, filenames,
regex_pattern, ds_tfms=get_transforms(),
size=224, bs=batchsize).normalize(imagenet_stats)
4. สร้างโมเดล¶
เพื่อความสะดวก เราจะประกาศฟังก์ชัน แล้วไปเรียกสร้างก่อน fit ด้วย Batch Size แต่ละแบบ
- เคสนี้เราจะใช้โมเดล models.resnet34
- pretrained=False หมายถึง เราจะเริ่มเทรนตั้งแต่ต้น ไม่เอา Weight ที่เคยเทรนกับ ImageNet มาแล้วมาใช้
def get_learner(databunch):
return cnn_learner(databunch, models.resnet34,
pretrained=False,
metrics=accuracy, callback_fns=ShowGraph).to_fp16()
5. เริ่มต้นเทรนโมเดล¶
ปกติ Batch Size จะมีค่า Default เท่ากับ 64 เราจะลองเทรนด้วย Batch Size สูงมาก และต่ำมาก เปรียบเทียบกับ Image Classification ep.3 ดูว่าจะเป็นอย่างไร
ลองเทรนด้วย Batch Size ใหญ่ ๆ เช่น 512¶
batchsize = 512
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
ลองเทรนด้วย Batch Size เล็ก ๆ เช่น 2¶
batchsize = 2
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
ลองเทรนด้วย Default Batch Size 64¶
batchsize = 64
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
ลองเทรนด้วย Batch Size 32 ตาม Paper¶
batchsize = 32
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
6. สรุป¶
เปรียบเทียบ การเทรนแต่ละ Batch Size ในตารางดังนี้
Batch Size | Time | Accuracy | Memory |
---|---|---|---|
512 | 08:35 | 24% | Large |
2 | 34:00 | 2% | Small |
64 | 07:09 | 54% | Medium |
32 | 07:23 | 62% | Medium |
หมายเหตุ¶
- อันนี้เป็นการทดสอบแบบคร่าว ๆ ให้พอเห็นภาพ มีตัวแปรอีกหลายอย่าง
- ใน Framework มีการใช้อีกหลายอัลกอริทึมโดย Default อาจทำให้ผลลัพธ์แตกต่างกันไป
- แต่ละ learner มีการ Initial Weight ที่แตกต่างกัน