LSTM と GRU セル

PyTorchによる中級ディープラーニング

Michal Oleszak

Machine Learning Engineer

短期記憶の課題

  • RNN セルは隠れ状態でメモリを保持
  • ただし記憶はごく短期
  • より強力な 2 種で解決:
    • LSTM(Long Short-Term Memory)セル
    • GRU(Gated Recurrent Unit)セル

再帰ニューロンの模式図。時刻 2 に h2 と x2 を受け取り、y2 と h3 を出力する。

PyTorchによる中級ディープラーニング

RNN セル

RNN セルの模式図。

  • 入力は 2 つ:
    • 現在の入力データ x
    • 直前の隠れ状態 h
  • 出力は 2 つ:
    • 現在の出力 y
    • 次の隠れ状態 h
PyTorchによる中級ディープラーニング

LSTM セル

LSTM セルの模式図。

  • 出力の hy は同一
  • 入出力は 3 つ(隠れ状態 2 種):

    • h: 短期状態
    • c: 長期状態
  • 3 つの「ゲート」:

    • 忘却ゲート: 長期記憶から除く内容
    • 入力ゲート: 長期記憶に保存する内容
    • 出力ゲート: 現時点で返す内容
PyTorchによる中級ディープラーニング

PyTorch での LSTM

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.RNNnn.LSTM に置換
  • forward():
    • もう一つの隠れ状態 c を追加
    • ch をゼロ初期化
    • 両方の隠れ状態を lstm に渡す
PyTorchによる中級ディープラーニング

GRU セル

GRU セルの模式図。

  • LSTM の簡略版
  • 隠れ状態は 1 つのみ
  • 出力ゲートなし
PyTorchによる中級ディープラーニング

PyTorch での GRU

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.RNNnn.GRU に置換
  • forward():
    • gru レイヤーを使用
PyTorchによる中級ディープラーニング

RNN・LSTM・GRU の使い分け

  • RNN は現在ほとんど使われない
  • GRU は LSTM より簡潔=計算が軽い
  • 相対性能は用途で変わる
  • 両方試して比較

LSTM と GRU セルの模式図。

PyTorchによる中級ディープラーニング

Passons à la pratique !

PyTorchによる中級ディープラーニング

Preparing Video For Download...