らんだむな記憶

blogというものを体験してみようか!的なー

ゼロつく 2 (17)

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 を使って訓練させる。イテレーション数も相当になるので、面倒くさいから途中で打ち切った。細かい実装に不備はあるかもしれないけど、まぁまぁこんな感じの動きなんじゃないだろうか・・・?

f:id:derwind:20211118010032p:plain