简单的自动纠正神经网络不学习

时间:2018-04-20 14:47:58

标签: python numpy machine-learning neural-network

我正在用Python构建一个简单的自动纠正神经网络。这是完整的代码:Code&Data

训练数据只是一个单词列表(包含在上面的链接中),例如:

yellow
woods
four

现在,每个单词都分配了一个唯一的数字,如:

yellow => 0.101

然后通过用随机字符替换输入字中的一个字符来生成拼写错误。 因此,为每个单词生成大约4-5个拼写错误,如:

yelbow => 0.101
ytllow => 0.101

然后我提供拼写错误列表及其正确的唯一数字,以使其学习模式。

很抱歉,如果说明不好,请查看上面的代码。

以下是培训逻辑:

syn0 = 2*np.random.random((x_dim, hidden_dim)) - 1
syn1 = 2*np.random.random((hidden_dim, x_dim)) - 1


for j in range(20000):
    err = 0
    input_arr, output_arr = shuffle(input_arr, output_arr)
    for i in range(len(input_arr)):
       X = input_arr[i]
       y = output_arr[i]

       l0 = X
       l1 = sigmoid(np.dot(l0, syn0))
       l2 = sigmoid(np.dot(l1, syn1))
       l2_err = y - l2

       l2_delta = l2_err * sigmoid(l2, deriv=True)
       l1_err = l2_delta.dot(syn1.T)
       l1_delta = l1_err * sigmoid(l1, deriv=True)

       syn1 += l1.T.dot(l2_delta) * alpha
       syn0 += l0.T.dot(l1_delta) * alpha
       err += np.mean(np.abs(l2_err))

    if(j % 1000) == 0:
       print str(j) + ", Error:" + str(err)

我的问题是它正确地学习了大约10-15个单词,错误减少到了0.009以下但是更多的单词它没有学习它们并且错误仍然在0.4左右

Full Code and Data

请帮忙。

1 个答案:

答案 0 :(得分:3)

如果您的代码适用于少量字词,则很可能代码中没有代码错误,而是编码问题的方式存在错误。

对于一个我不认为用浮点数编码单词是个好主意。在这种情况下,您可以使用两个具有非常相似编码的不同单词:字:0.101(黄色)和字:0.102(四)(它们仅相差0.001)。这两个单词的编码与单词(相对)非常不同:0.11(黄金)(它们相差0.01,大10倍)。所有这些单词都不同,最好将其保留在编码中。

我认为在你的问题中编码单词的好方法是使用从0到N-1的整数,其中N是你的单词数。然后,您可以使用softmax层和交叉熵损失来训练您的网络。使用绝对损失的一个好处是,您将获得更有意义的损失:您的网络所做的良好猜测的百分比,这比您的损失更容易解释。

在训练神经网络时,可能会出现许多方面的问题,如果您对代码没有具体的问题,很难轻易回答这些问题。您应该考虑调试代码的事项:

- 训练它没有噪音的话。在这种情况下,您的网络应该学习身份,它不应该太难,如果它不起作用,可能是因为您的代码中存在错误。

- 改变噪音量

- 您可以查看神经网络的权重。他们确实会收敛到一些价值,还是随机波动?