在某些迭代后成本变为 NaN
cost becoming NaN after certain iterations
我正在尝试用 softmax 回归.
做一个 multiclass classification
问题(包含 3 个标签)
这是我第一次使用梯度下降和反向传播(不使用正则化和任何高级优化算法)的粗略实现,仅包含 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
这里不需要加号,因为它会添加所有以前在每个时期计算的成本,这不是我们想要的。在小批量梯度下降期间通常需要此实现以计算每个时期的成本。
其次,对于此问题,学习率太大,这就是成本超过最小值并变为 NaN 的原因。
我查看了我的代码,发现我的特征范围非常不同(一个是从 -1 到 1,另一个是 -5000 到 5000) 这限制了我的算法使用更大的学习率值。
所以我应用了特征缩放:
var = np.var(X, axis=1)
X = X/var
现在学习率可以更大 (<=0.001)。
我正在尝试用 softmax 回归.
做一个multiclass classification
问题(包含 3 个标签)
这是我第一次使用梯度下降和反向传播(不使用正则化和任何高级优化算法)的粗略实现,仅包含 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
这里不需要加号,因为它会添加所有以前在每个时期计算的成本,这不是我们想要的。在小批量梯度下降期间通常需要此实现以计算每个时期的成本。
其次,对于此问题,学习率太大,这就是成本超过最小值并变为 NaN 的原因。
我查看了我的代码,发现我的特征范围非常不同(一个是从 -1 到 1,另一个是 -5000 到 5000) 这限制了我的算法使用更大的学习率值。
所以我应用了特征缩放:
var = np.var(X, axis=1)
X = X/var
现在学习率可以更大 (<=0.001)。