ch06 の Rnnlm
を DeZero にポーティングする。以下のような感じで良いはず・・・
class Rnnlm(Model): def __init__(self, vocab_size, wordvec_size, hidden_size): super().__init__() V, D, H = vocab_size, wordvec_size, hidden_size self.embedding = L.EmbedID(V, D) self.embedding.W.data /= 100 self.lstm = L.LSTM(H, D) for gate in ['x2f', 'x2i', 'x2o', 'x2u']: getattr(self.lstm, gate).W.data /= np.sqrt(D) for gate in ['h2f', 'h2i', 'h2o', 'h2u']: getattr(self.lstm, gate).W.data /= np.sqrt(H) self.fc = L.Linear(V, nobias=True, in_size=H) self.fc.W.data /= np.sqrt(H) def reset_state(self): self.lstm.reset_state() def forward(self, x: Variable) -> Variable: x = self.embedding(x) h = self.lstm(x) y = self.fc(h) return y
動作は結構遅いので Colab 上で CuPy を使って訓練させる。イテレーション数も相当になるので、面倒くさいから途中で打ち切った。細かい実装に不備はあるかもしれないけど、まぁまぁこんな感じの動きなんじゃないだろうか・・・?