试图过度拟合GRU字符RNN

时间:2020-06-22 09:08:47

标签: python pytorch recurrent-neural-network

我有一个GRU网络,它是手动构建的(即,没有nn.GRU),具有2个垂直层,128个暗点的隐藏层和64个字符的序列长度。

我正试图从莎士比亚中摘取一个小的语料库:

enter image description here

我进行了500多个纪元的训练,每25个纪元后,我只给出第一个字母“ B”就生成了一个(非常低的温度)样本。起初它是乱码,但最后确实接近实际文本。第一个版本是:

enter image description here

这没有在批次之间传递隐藏状态。我以为这可能是我的问题,所以我在批次之间传递了分离的隐藏状态。但是我仍然没有完美的过拟合,而且实际上似乎使它恶化了:

enter image description here

这是我实施GRU的方式:

for i in range(self.n_layers):
    layer_input = layer_middle
    layer_middle = torch.zeros((batch_size, seq_len, self.h_dim))
    params = self.layer_params[i]
    for j in range(seq_len):
        x = layer_input[:, j, :].to(torch.device('cuda'))
        z = F.sigmoid(params['W1'](x) + params['W2'](layer_states[i]))
        r = F.sigmoid(params['W3'](x) + params['W4'](layer_states[i]))
        g = F.tanh(params['W5'](x) + params['W6'](r*layer_states[i]))
        layer_states[i] = z*layer_states[i] + (1-z)*g
        layer_middle[:, j, :] = layer_states[i]
    layer_middle = nn.Dropout(self.dropout)(layer_middle)
layer_output = torch.zeros((batch_size, seq_len, self.out_dim))
for j in range(seq_len):
    x = layer_middle[:, j, :].to(torch.device('cuda'))
    layer_output[:, j, :] = self.layer_params[-1]['W7'](x)

参数为nn.Linear,具有正确的形状。

有什么想法可以阻止我过度适应这个微小的主体吗?

0 个答案:

没有答案