迭代后成本变为NaN

问题描述 投票:2回答:1

我想做一个 multiclass classification 问题 软最大值回归.

这是我第一次使用梯度下降和反向传播的粗略实现(不使用正则化和任何高级优化算法),仅包含了 1层.

另外,当学习率大(>0.003)时,成本就会变成 NaN谁能解释一下我做错了什么?

# X is (13,177) dimensional
# y is (3,177) dimensional with label 0/1

m = X.shape[1]                                        # 177
W = np.random.randn(3,X.shape[0])*0.01                # (3,13)
b = 0
cost = 0
alpha = 0.0001                                        # seems too small to me but for bigger values cost becomes NaN


for i in range(100):
    Z = np.dot(W,X) + b
    t = np.exp(Z)
    add = np.sum(t,axis=0)
    A = t/add
    loss = -np.multiply(y,np.log(A))
    cost += np.sum(loss)/m
    print('cost after iteration',i+1,'is',cost)
    dZ = A-y
    dW = np.dot(dZ,X.T)/m
    db = np.sum(dZ)/m
    W = W - alpha*dW
    b = b - alpha*db

这是我得到的。

cost after iteration 1 is 6.661713420377916

cost after iteration 2 is 23.58974203186562

cost after iteration 3 is 52.75811642877174

.............................................................

...............*upto 100 iterations*.................

.............................................................

cost after iteration 99 is 1413.555298639879

cost after iteration 100 is 1429.6533630169406
machine-learning deep-learning gradient-descent backpropagation softmax
1个回答
0
投票

好吧,经过一段时间,我想明白了。

首先,由于这个原因,成本在增加。cost += np.sum(loss)/m 这里不需要加号,因为它会把之前在每个时代计算的所有成本加起来,这不是我们想要的。这种实现通常是在小批量梯度下降时需要的,用于计算每个epoch的成本。

其次是 学习率太高 这就是为什么成本会超过最小值而变成NaN的原因。我看了一下我的代码,发现我的特征的范围非常不同(一个是来自于 -1比1 和其他是 -5000至5000),这限制了我的算法使用更大的学习率值。

所以我应用了特征缩放 。

var = np.var(X, axis=1)
X = X/var

现在学习率可以大很多(<=0.001)。

© www.soinside.com 2019 - 2024. All rights reserved.