我正在阅读PyTorch的文档,并找到了他们编写的示例
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
Run Code Online (Sandbox Code Playgroud)
其中x是一个初始变量,从中构造y(一个3向量).问题是,渐变张量的0.1,1.0和0.0001参数是什么?文档不是很清楚.
我试图从头开始构建一个神经网络.在所有AI文献中,人们都认为权重应该初始化为随机数,以便网络更快地收敛.
但为什么神经网络的初始权重被初始化为随机数?
我曾在某处读到这样做是为了"打破对称性",这使得神经网络学得更快.打破对称性如何让它学得更快?
将权重初始化为0是不是更好的主意?那样,权重能够更快地找到它们的值(无论是正面还是负面)?
除了希望在初始化时它们接近最佳值时,是否存在一些其他潜在的哲学背后的权重?
artificial-intelligence machine-learning mathematical-optimization neural-network gradient-descent
我注意到在培训期间经常出现这种情况NAN.
通常情况下,内部产品/完全连接或卷积层中的重量似乎会被引入.
这是因为梯度计算正在爆发吗?或者是因为重量初始化(如果是这样,为什么重量初始化会产生这种效果)?或者它可能是由输入数据的性质引起的?
这里的首要问题很简单:在培训期间发生NAN的最常见原因是什么?其次,有什么方法可以解决这个问题(为什么它们有效)?
machine-learning neural-network gradient-descent deep-learning caffe
在线性回归空间中使用Gradient Descent有什么好处?看起来我们可以通过分析方法解决问题(找到最小成本函数的θ0-n),那么为什么我们仍然希望使用梯度下降来做同样的事情呢?谢谢
def gradient(X_norm,y,theta,alpha,m,n,num_it):
temp=np.array(np.zeros_like(theta,float))
for i in range(0,num_it):
h=np.dot(X_norm,theta)
#temp[j]=theta[j]-(alpha/m)*( np.sum( (h-y)*X_norm[:,j][np.newaxis,:] ) )
temp[0]=theta[0]-(alpha/m)*(np.sum(h-y))
temp[1]=theta[1]-(alpha/m)*(np.sum((h-y)*X_norm[:,1]))
theta=temp
return theta
X_norm,mean,std=featureScale(X)
#length of X (number of rows)
m=len(X)
X_norm=np.array([np.ones(m),X_norm])
n,m=np.shape(X_norm)
num_it=1500
alpha=0.01
theta=np.zeros(n,float)[:,np.newaxis]
X_norm=X_norm.transpose()
theta=gradient(X_norm,y,theta,alpha,m,n,num_it)
print theta
Run Code Online (Sandbox Code Playgroud)
从上面的代码我的theta是100.2 100.2,但它应该100.2 61.09在matlab中是正确的.
python numpy machine-learning linear-regression gradient-descent
我理解Gradient Descent的作用.基本上它试图通过缓慢向下移动曲线来向局部最优解.我想了解计划梯度下降和牛顿方法之间的实际差异是什么?
从维基百科,我读了这条短线"牛顿的方法使用曲率信息来采取更直接的路线." 这直觉意味着什么?
machine-learning mathematical-optimization data-mining newtons-method gradient-descent
为什么我们需要在PyTorch中明确归零渐变?loss.backward()调用时为什么渐变不能归零?通过在图表上保持渐变并要求用户明确归零渐变来实现什么样的场景?
zero_grad()需要在训练期间调用该方法.但文档不是很有帮助
| zero_grad(self)
| Sets gradients of all model parameters to zero.
Run Code Online (Sandbox Code Playgroud)
为什么我们需要调用这个方法?
python neural-network gradient-descent deep-learning pytorch
我正在尝试使用SGD对大型数据集进行分类.由于数据太大而无法放入内存,我想使用partial_fit方法来训练分类器.我选择了适合内存的数据集样本(100,000行)来测试拟合与partial_fit:
from sklearn.linear_model import SGDClassifier
def batches(l, n):
for i in xrange(0, len(l), n):
yield l[i:i+n]
clf1 = SGDClassifier(shuffle=True, loss='log')
clf1.fit(X, Y)
clf2 = SGDClassifier(shuffle=True, loss='log')
n_iter = 60
for n in range(n_iter):
for batch in batches(range(len(X)), 10000):
clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y))
Run Code Online (Sandbox Code Playgroud)
然后我用相同的测试集测试两个分类器.在第一种情况下,我得到100%的准确度.据我了解,SGD默认在训练数据上传递5次(n_iter = 5).
在第二种情况下,我必须通过60次数据才能达到相同的准确度.
为什么会出现这种差异(5对60)?或者我做错了什么?
我只是试着找出如何使用Caffe.为此,我只是看了一下.prototxt示例文件夹中的不同文件.有一个我不明白的选择:
# The learning rate policy
lr_policy: "inv"
Run Code Online (Sandbox Code Playgroud)
可能的值似乎是:
"fixed""inv""step""multistep""stepearly""poly" 有人可以解释一下这些选择吗?
machine-learning neural-network gradient-descent deep-learning caffe
gradient-descent ×10
python ×3
pytorch ×3
caffe ×2
data-mining ×1
gradient ×1
numpy ×1
scikit-learn ×1
torch ×1