GaiaEx AcademyGaiaEx Academy
พื้นฐาน PyTorch: การสร้างและฝึกฝนโมเดล
นักพัฒนาAI & ML13 min read

พื้นฐาน PyTorch: การสร้างและฝึกฝนโมเดล

เฟรมเวิร์ก deep learning ที่ได้รับความนิยมสูงสุด — แนะนำแบบลงมือทำ

แชร์โพสต์

Eager Execution กับความเร็วในการวิจัย

PyTorch ใช้ eager execution เป็นค่าเริ่มต้น: tensor ไหลผ่านคำสั่ง Python และคุณสามารถ print, slice และดีบักได้เหมือนข้อมูลทั่วไป เรื่องนี้สำคัญมากในงานการเงิน เพราะครึ่งหนึ่งของงานคือการจัดรูปแบบ feature panel ที่ยุ่งเหยิง และตรวจสอบว่าไม่มี look-ahead แอบเล็ดลอดเข้าไปใน tensor ที่คุณป้อนให้โมเดล

เทียบกับ workflow แบบเก่าที่ "สร้างกราฟแบบ static ก่อน แล้วค่อยรัน session" นักวิจัยยังคงต้อง export โมเดลเพื่อนำไป deploy แต่งานประจำวันได้ประโยชน์จากความฉับไว: แก้ layer หนึ่งชั้น รันเซลล์ใหม่ ตรวจสอบ activation ได้ทันที

กราฟแบบไดนามิก: การ forward pass แต่ละครั้งต่างกันได้ x f g loss .backward Branch และ control flow ของ Python สามารถเปลี่ยนได้ว่า op ใดรันในแต่ละ batch — กราฟตามโค้ด เคล็ดลับด้านการเงิน: ถ้าความยาวลำดับของคุณแตกต่างกันตามสินทรัพย์ ให้ mask padding แทนที่จะ เฉลี่ยวันที่หายไปเข้าไปใน loss แบบเงียบ ๆ
การประมวลผลจะเชื่อมต่อกันเป็นกราฟในช่วง forward pass; autograd จะคลี่กราฟนั้นออกในช่วง backward

Tensor, Device และ Autograd

Tensor คืออาร์เรย์หลายมิติ; requires_grad=True เป็นการระบุ leaf ที่คุณต้องการคำนวณอนุพันธ์ให้ Autograd จะบันทึกการประมวลผลเพื่อสร้างกราฟย้อนกลับ (backward graph) ทำให้ loss.backward() เติมค่าลงใน .grad ของพารามิเตอร์ได้

import torch
x = torch.randn(32, 10, requires_grad=True)
w = torch.randn(10, 1, requires_grad=True)
y = (x @ w).mean()
y.backward()
print(w.grad.shape)

วาง tensor ไว้บน cuda หรือ mps เมื่อมีให้ใช้; รักษาการวาง device ให้สม่ำเสมอ เพื่อไม่ให้เผลอย้าย tensor ขนาดเล็กไปมาในทุกขั้นตอนโดยไม่ตั้งใจ

nn.Module ในฐานะการประกอบส่วนย่อย

สร้างคลาสย่อยจาก nn.Module กำหนด layer ต่าง ๆ ไว้ใน __init__ แล้วเชื่อมต่อกันใน forward การลงทะเบียนแบบนี้ทำให้พารามิเตอร์ปรากฏใน model.parameters() สำหรับตัว optimizer

import torch.nn as nn

class MLP(nn.Module):
    def __init__(self, n):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(n, 64), nn.ReLU(), nn.Linear(64, 1)
        )
    def forward(self, x):
        return self.net(x)

สำหรับโมเดลลำดับข้อมูล (sequence model) layer อย่าง nn.LSTM และ nn.TransformerEncoder เป็นที่นิยม; ส่วนงาน alpha แบบข้อมูลตาราง MLP และ gradient boosting ยังคงแข่งกันอยู่ — เลือกใช้จากความเข้มงวดในการ validate ไม่ใช่จากเทรนด์

ลูปสี่บรรทัด (บวกสุขลักษณะที่ดี)

การ training ทำซ้ำโดยตั้งใจ: forward, loss, zero grad, backward, step ส่วนเสริมก็สำคัญ: model.train() กับ model.eval() ใช้สลับ dropout และ batch norm; torch.no_grad() ครอบการ validation เพื่อประหยัดหน่วยความจำ

ขั้นตอนการฝึกฝนหนึ่งครั้ง (supervised) forward loss zero_grad backward → step Optimizer อัปเดต weight โดยใช้ grad ที่เก็บไว้; clip norm ถ้างานของคุณทำให้ loss พุ่ง Walk-forward validation บน time series — ห้าม shuffle อนาคตเข้าไปในอดีตเด็ดขาด Feature ของ GaiaEx / Hyperliquid: label leakage คือบั๊ก ไม่ใช่จุดเด่น
ลูปเดียวกันนี้จะทำซ้ำในทุก batch จนกว่ากราฟ validation จะหยุดปรับตัวดีขึ้น

Dataset, DataLoader และการรั่วไหลของข้อมูล

สร้างคลาสย่อยจาก Dataset เพื่อสร้าง feature และ label ให้เป็นข้อมูลจริง แล้วห่อด้วย DataLoader เพื่อทำ batching สำหรับข้อมูลตามลำดับเวลา มักคง shuffle=False ไว้ในชุด validation และบ่อยครั้งในชุด training ด้วยหากคุณตัดข้อมูลเป็นหน้าต่างต่อเนื่อง (contiguous window) — ไม่เช่นนั้นข้อมูลจะเกลี่ยข้ามช่วงเวลาโดยไม่ตั้งใจ

ถ้าคุณ train บนข้อมูล tick จาก GaiaEx หรือฟีดที่คล้ายกัน ให้จัดแท่งข้อมูลให้อยู่บนนาฬิกาเดียวกัน จัดการข้อมูลที่ขาดหายอย่างชัดเจน และเก็บเวอร์ชันของโค้ด feature ควบคู่กับ checkpoint ของโมเดล

TorchScript และขอบเขตการให้บริการ

สำหรับการ inference ที่ต้องการ latency ต่ำ ทีมงานมักจะ trace หรือ script โมเดล แล้วรันมันในรันไทม์ C++ หรือบริการ sidecar รักษาสภาพแวดล้อมของการ training (เวอร์ชันของไลบรารี) ให้ตรงกับตอนที่คุณ export ไว้เสมอ

PyTorch Lightning และเฟรมเวิร์กที่คล้ายกันช่วยลดโค้ดซ้ำ ๆ สำหรับการ training แบบหลาย GPU และการ log; แต่มันไม่ได้แทนที่การออกแบบ feature อย่างพิถีพิถัน ความได้เปรียบในการเทรดมักมาจากสุขลักษณะของข้อมูลและการรู้จัก regime มากกว่ามาจาก optimizer ที่ดูล้ำกว่าเล็กน้อย