我想做一个 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
好吧,经过一段时间,我想明白了。
首先,由于这个原因,成本在增加。cost += np.sum(loss)/m
这里不需要加号,因为它会把之前在每个时代计算的所有成本加起来,这不是我们想要的。这种实现通常是在小批量梯度下降时需要的,用于计算每个epoch的成本。
其次是 学习率太高 这就是为什么成本会超过最小值而变成NaN的原因。我看了一下我的代码,发现我的特征的范围非常不同(一个是来自于 -1比1 和其他是 -5000至5000),这限制了我的算法使用更大的学习率值。
所以我应用了特征缩放 。
var = np.var(X, axis=1)
X = X/var
现在学习率可以大很多(<=0.001)。