เซลล์ LSTM และ GRU

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

Michal Oleszak

Machine Learning Engineer

ปัญหาหน่วยความจำระยะสั้น

  • เซลล์ RNN จดจำข้อมูลผ่าน hidden state
  • หน่วยความจำนี้สั้นมาก
  • เซลล์ที่ทรงพลังกว่าสองชนิดช่วยแก้ปัญหานี้:
    • เซลล์ LSTM (Long Short-Term Memory)
    • เซลล์ GRU (Gated Recurrent Unit)

แผนผังของนิวรอนแบบ recurrent ที่ time step 2 รับอินพุต h2 และ x2 และส่งออก y2 และ h3

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

เซลล์ RNN

แผนผังของเซลล์ RNN

  • อินพุต 2 ค่า:
    • ข้อมูลอินพุตปัจจุบัน x
    • hidden state ก่อนหน้า h
  • เอาต์พุต 2 ค่า:
    • เอาต์พุตปัจจุบัน y
    • hidden state ถัดไป h
Deep Learning ระดับกลางด้วย PyTorch

เซลล์ LSTM

แผนผังของเซลล์ LSTM

  • เอาต์พุต h และ y มีค่าเดียวกัน
  • อินพุตและเอาต์พุต 3 ค่า (hidden state 2 ตัว):

    • h: สถานะระยะสั้น
    • c: สถานะระยะยาว
  • "เกต" 3 ตัว:

    • Forget gate: สิ่งที่จะลบออกจากหน่วยความจำระยะยาว
    • Input gate: สิ่งที่จะบันทึกลงหน่วยความจำระยะยาว
    • Output gate: สิ่งที่จะส่งคืนที่ time step ปัจจุบัน
Deep Learning ระดับกลางด้วย PyTorch

LSTM ใน PyTorch

class Net(nn.Module):
    def __init__(self, input_size):
        super().__init__()

self.lstm = nn.LSTM( input_size=1, hidden_size=32, num_layers=2, batch_first=True, ) self.fc = nn.Linear(32, 1)
def forward(self, x): h0 = torch.zeros(2, x.size(0), 32) c0 = torch.zeros(2, x.size(0), 32)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :]) return out
  • __init__():
    • แทนที่ nn.RNN ด้วย nn.LSTM
  • forward():
    • เพิ่ม hidden state c
    • กำหนดค่าเริ่มต้น c และ h เป็นศูนย์
    • ส่ง hidden state ทั้งสองไปยังเลเยอร์ lstm
Deep Learning ระดับกลางด้วย PyTorch

เซลล์ GRU

แผนผังของเซลล์ GRU

  • เวอร์ชันที่เรียบง่ายกว่าของเซลล์ LSTM
  • มี hidden state เพียงตัวเดียว
  • ไม่มี output gate
Deep Learning ระดับกลางด้วย PyTorch

GRU ใน PyTorch

class Net(nn.Module):
    def __init__(self, input_size):
        super().__init__()

self.gru = nn.GRU( input_size=1, hidden_size=32, num_layers=2, batch_first=True, ) self.fc = nn.Linear(32, 1)
def forward(self, x): h0 = torch.zeros(2, x.size(0), 32) out, _ = self.gru(x, h0) out = self.fc(out[:, -1, :]) return out
  • __init__():
    • แทนที่ nn.RNN ด้วย nn.GRU
  • forward():
    • ใช้เลเยอร์ gru
Deep Learning ระดับกลางด้วย PyTorch

ควรใช้ RNN, LSTM หรือ GRU?

  • RNN ไม่ค่อยได้ใช้งานแล้วในปัจจุบัน
  • GRU เรียบง่ายกว่า LSTM จึงคำนวณน้อยกว่า
  • ประสิทธิภาพสัมพัทธ์ขึ้นอยู่กับกรณีใช้งาน
  • ลองทั้งสองแบบแล้วเปรียบเทียบผล

แผนผังของเซลล์ LSTM และ GRU

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

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

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

Preparing Video For Download...