我有一个GRU网络,它是手动构建的(即,没有nn.GRU
),具有2个垂直层,128个暗点的隐藏层和64个字符的序列长度。
我正试图从莎士比亚中摘取一个小的语料库:
我进行了500多个纪元的训练,每25个纪元后,我只给出第一个字母“ B”就生成了一个(非常低的温度)样本。起初它是乱码,但最后确实接近实际文本。第一个版本是:
这没有在批次之间传递隐藏状态。我以为这可能是我的问题,所以我在批次之间传递了分离的隐藏状态。但是我仍然没有完美的过拟合,而且实际上似乎使它恶化了:
这是我实施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
,具有正确的形状。
有什么想法可以阻止我过度适应这个微小的主体吗?