การฝึกและประเมิน RNN

Deep Learning ระดับกลางด้วย PyTorch

Michal Oleszak

Machine Learning Engineer

Mean Squared Error Loss

  • ความคลาดเคลื่อน:

    $$prediction - target$$

  • ความคลาดเคลื่อนกำลังสอง:

    $$(prediction - target)^2$$

  • ค่าเฉลี่ยความคลาดเคลื่อนกำลังสอง:

    $$avg[(prediction - target)^2]$$

การยกกำลังสองความคลาดเคลื่อน:

  • ป้องกันไม่ให้ค่าบวกและลบหักล้างกัน
  • ลงโทษความคลาดเคลื่อนขนาดใหญ่มากขึ้น
  • ใน PyTorch:
      criterion = nn.MSELoss()
    
Deep Learning ระดับกลางด้วย PyTorch

การขยาย tensor

  • Recurrent layer รับ input รูปแบบ (batch_size, seq_length, num_features)
  • ที่ได้มาคือ (batch_size, seq_length)
  • ต้องเพิ่มมิติหนึ่งที่ท้าย
for seqs, labels in dataloader_train:
    print(seqs.shape)
torch.Size([32, 96])
seqs = seqs.view(32, 96, 1)
print(seqs.shape)
torch.Size([32, 96, 1])
Deep Learning ระดับกลางด้วย PyTorch

การบีบ tensor

  • ใน evaluation loop ต้องย้อนการ reshape ที่ทำไว้ใน training loop
  • Labels มีรูปแบบ (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • output ของโมเดลมีรูปแบบ (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • รูปแบบของ output และ labels ต้องตรงกันสำหรับ loss function
  • ลบมิติสุดท้ายออกจาก output ของโมเดลได้

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Deep Learning ระดับกลางด้วย PyTorch

Training loop

net = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(
  net.parameters(), lr=0.001
)


for epoch in range(num_epochs): for seqs, labels in dataloader_train:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()
  • สร้างโมเดล กำหนด loss และ optimizer
  • วนซ้ำผ่าน epoch และ batch ของข้อมูล
  • ปรับรูปแบบ input sequence
  • ส่วนที่เหลือ: เหมือนเดิม
Deep Learning ระดับกลางด้วย PyTorch

Evaluation loop

mse = torchmetrics.MeanSquaredError()


net.eval() with torch.no_grad(): for seqs, labels in test_loader:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs).squeeze()
mse(outputs, labels)
print(f"Test MSE: {mse.compute()}")
Test MSE: 0.13292162120342255
  • ตั้งค่า MSE metric
  • วนซ้ำข้อมูล test โดยไม่คำนวณ gradient
  • ปรับรูปแบบ input ของโมเดล
  • บีบ output ของโมเดล
  • อัปเดต metric
  • คำนวณค่า metric สุดท้าย
Deep Learning ระดับกลางด้วย PyTorch

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU ดีกว่า: ผลลัพธ์เทียบเท่าหรือดีกว่า แต่ใช้พลังประมวลผลน้อยกว่า
Deep Learning ระดับกลางด้วย PyTorch

มาฝึกกันเถอะ!

Deep Learning ระดับกลางด้วย PyTorch

Preparing Video For Download...