Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 某些迭代后的成本_Machine Learning_Deep Learning_Gradient Descent_Backpropagation_Softmax - Fatal编程技术网

Machine learning 某些迭代后的成本

Machine learning 某些迭代后的成本,machine-learning,deep-learning,gradient-descent,backpropagation,softmax,Machine Learning,Deep Learning,Gradient Descent,Backpropagation,Softmax,我正试图用softmax回归解决一个多类分类问题(包含3个标签) 这是我第一次使用梯度下降和反向传播(不使用正则化和任何高级优化算法)粗略实现,只包含1层 此外,当学习率较大(>0.003)时,成本变为NaN,降低学习率时,成本函数工作正常。 谁能解释我做错了什么 #X是(13177)维的 #y为(3177)尺寸,标签为0/1 m=X.形状[1]#177 W=np.random.randn(3,X.shape[0])*0.01#(3,13) b=0 成本=0 alpha=0.0001#对我来说似

我正试图用softmax回归解决一个
多类分类问题(包含3个标签)

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

此外,当学习率较大(>0.003)时,成本变为
NaN
,降低学习率时,成本函数工作正常。 谁能解释我做错了什么

#X是(13177)维的
#y为(3177)尺寸,标签为0/1
m=X.形状[1]#177
W=np.random.randn(3,X.shape[0])*0.01#(3,13)
b=0
成本=0
alpha=0.0001#对我来说似乎太小了,但对于更大的价值来说,成本变得很低
对于范围(100)内的i:
Z=np.dot(W,X)+b
t=np.exp(Z)
加法=np.和(t,轴=0)
A=t/add
损失=-np.multiply(y,np.log(A))
成本+=总金额(损失)/m
打印('迭代后的成本',i+1,'is',成本)
dZ=A-y
dW=np.dot(dZ,X.T)/m
db=np.总和(dZ)/m
W=W-α*dW
b=b-α*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

过了一段时间我才明白

首先,由于以下原因,成本增加:
成本+=np.总和(损失)/m

在这里加号是不需要的,因为它将增加所有以前的成本计算在每个时代,这不是我们想要的。在小批量梯度下降过程中,通常需要这种实现来计算每个历元的成本

其次,对于这个问题,学习率太大了,这就是为什么成本超过了最小值,变成了NaN。
我查看了我的代码,发现我的特性的范围非常不同(一个是-1到1,另一个是-5000到5000),这限制了我的算法使用更大的学习率值

所以我应用了特征缩放:

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

现在,学习速度可以大得多(好吧,过了一段时间我就明白了

首先,由于以下原因,成本增加:
成本+=np.总和(损失)/m

这里不需要加号,因为它将添加在每个历元上计算的所有以前的成本,这不是我们想要的。在计算每个历元的成本的小批量梯度下降期间,通常需要此实现

其次,对于这个问题,学习率太大了,这就是为什么成本超过了最小值,变成了NaN。
我查看了我的代码,发现我的特性的范围非常不同(一个是-1到1,另一个是-5000到5000),这限制了我的算法使用更大的学习率值

所以我应用了特征缩放:

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

现在学习率可以大得多(因为你在做
cost+=np.sum(loss)/m
应该是
cost=np.sum(loss)/m
因为你在做
cost+=np.sum(loss)/m
应该是
cost=np.sum(loss)/m