我正在用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左右
请帮忙。
答案 0 :(得分:3)
如果您的代码适用于少量字词,则很可能代码中没有代码错误,而是编码问题的方式存在错误。
对于一个我不认为用浮点数编码单词是个好主意。在这种情况下,您可以使用两个具有非常相似编码的不同单词:字:0.101(黄色)和字:0.102(四)(它们仅相差0.001)。这两个单词的编码与单词(相对)非常不同:0.11(黄金)(它们相差0.01,大10倍)。所有这些单词都不同,最好将其保留在编码中。
我认为在你的问题中编码单词的好方法是使用从0到N-1的整数,其中N是你的单词数。然后,您可以使用softmax层和交叉熵损失来训练您的网络。使用绝对损失的一个好处是,您将获得更有意义的损失:您的网络所做的良好猜测的百分比,这比您的损失更容易解释。
在训练神经网络时,可能会出现许多方面的问题,如果您对代码没有具体的问题,很难轻易回答这些问题。您应该考虑调试代码的事项:
- 训练它没有噪音的话。在这种情况下,您的网络应该学习身份,它不应该太难,如果它不起作用,可能是因为您的代码中存在错误。
- 改变噪音量
- 您可以查看神经网络的权重。他们确实会收敛到一些价值,还是随机波动?