gpt4 book ai didi

python - 损失函数增加而不是减少

转载 作者:行者123 更新时间:2023-12-02 09:59:26 24 4
gpt4 key购买 nike

我一直在尝试从头开始制作自己的神经网络。一段时间后,我成功了,但遇到了一个无法解决的问题。我一直在关注tutorial其中显示了如何执行此操作。我遇到的问题是我的网络如何更新权重和偏差。好吧,我知道梯度下降并不总是会减少损失,在几个时期它甚至可能会增加一点,但它仍然应该减少并且比我的效果好得多。有时整个过程会卡在loss 9和loss 13上而无法摆脱。我检查了很多教程、视频和网站,但我在我的代码中找不到任何问题。self.activate、self.dactivate、self.loss 和 self.dloss:

# sigmoid
self.activate = lambda x: np.divide(1, 1 + np.exp(-x))
self.dactivate = lambda x: np.multiply(self.activate(x), (1 - self.activate(x)))

# relu
self.activate = lambda x: np.where(x > 0, x, 0)
self.dactivate = lambda x: np.where(x > 0, 1, 0)

# loss I use (cross-entropy)
clip = lambda x: np.clip(x, 1e-10, 1 - 1e-10) # it's used to squeeze x into a probability between 0 and 1 (which I think is required)
self.loss = lambda x, y: -(np.sum(np.multiply(y, np.log(clip(x))) + np.multiply(1 - y, np.log(1 - clip(x))))/y.shape[0])
self.dloss = lambda x, y: -(np.divide(y, clip(x)) - np.divide(1 - y, 1 - clip(x)))

我用于前向传播的代码:

self.activate(np.dot(X, self.weights) + self.biases) # it's an example for first hidden layer

这就是反向传播的代码:

第一部分,在DenseNeuralNetwork类中:

last_derivative = self.dloss(output, y)

for layer in reversed(self.layers):
last_derivative = layer.backward(last_derivative, self.lr)

第二部分,在Dense类中:

def backward(self, last_derivative, lr):
w = self.weights

dfunction = self.dactivate(last_derivative)
d_w = np.dot(self.layer_input.T, dfunction) * (1./self.layer_input.shape[1])
d_b = (1./self.layer_input.shape[1]) * np.dot(np.ones((self.biases.shape[0], last_derivative.shape[0])), last_derivative)

self.weights -= np.multiply(lr, d_w)
self.biases -= np.multiply(lr, d_b)

return np.dot(dfunction, w.T)

我还做了一个repl这样您就可以检查整个代码并毫无问题地运行它。

最佳答案

1.

第 12 行

self.dloss = lambda x, y: -(np.divide(y, clip(x)) - np.divide(1 - y, 1 - clip(x)))

如果你要剪辑 x,你也应该剪辑 y。
我的意思是有一些方法可以实现这一点,但是如果您打算使用这种方式。
更改为

self.dloss = lambda x, y: -(np.divide(clip(y), clip(x)) - np.divide(1 - clip(y), 1 - clip(x)))

2.

第 75 行

dfunction = self.dactivate(last_derivative)

这个反向传播部分是错误的。
更改为

dfunction = last_derivative*self.dactivate(np.dot(self.layer_input, self.weights) + self.biases)

3.

第 77 行

d_b = (1./self.layer_input.shape[1]) * np.dot(np.ones((self.biases.shape[0], last_derivative.shape[0])), last_derivative)

last_derivative 应该是 dfunction。我认为这只是一个错误。
更改为

d_b = (1./self.layer_input.shape[1]) * np.dot(np.ones((self.biases.shape[0], last_derivative.shape[0])), dfunction)

4.

第 85 行

self.weights = np.random.randn(neurons, self.neurons) * np.divide(6, np.sqrt(self.neurons * neurons))
self.biases = np.random.randn(1, self.neurons) * np.divide(6, np.sqrt(self.neurons * neurons))

不确定你要做什么,但我认为初始化值太大了。我们没有进行精确的 super 调整,所以我只是将其缩小。

self.weights = np.random.randn(neurons, self.neurons) * np.divide(6, np.sqrt(self.neurons * neurons)) / 100
self.biases = np.random.randn(1, self.neurons) * np.divide(6, np.sqrt(self.neurons * neurons)) / 100

现在一切都好

之后我将学习率更改为 0.01,因为它太慢了,但效果很好。
我认为您误解了反向传播。您可能应该仔细检查它是如何工作的。其他部分我觉得还可以。

关于python - 损失函数增加而不是减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60535079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com