线性回归的从零开始实现 讨论区


#45

也可以啊,他们本质不一样吗?
1是从第二组取数据,0是从第1组取数据


#46

“1是从第二组取数据,0是从第1组取数据” 这个是 array的基本操作,大家都很清楚的; :rofl:
“本质是一样的”,但是数据可视化之后效果差别比较明显;
所以我猜测,这个案例的作者(貌似是沐神)分别尝试了 X[:,0] 和 X[:,1];发现 X[:,1] 可视化效果更好,因此选了 X[:,1];
Any way,感谢回复! :apple:


#47

thank you very much


#48

同问,est_loss 为什么等于moving_loss/(1-(1-smoothing_constant)**niter)?


#49

一般来说,应该越往后的epoch 的learning_rate 越小,这样才会收敛。 你可以把lr = [0.001,0.1] 换成 lr = [0.001,0.00001]试试


#50

quit()或是ctrl+D


#51

有一个问题我一直很奇怪

 with ag.record():
            output = net(data)
            loss = square_loss(output, label)
        loss.backward()
        SGD(params, learning_rate)

ag.record()表示后续的代码片段算梯度。实际是什么含义呢?


#52

注意看SGD函数,params是沿params的梯度方向更新的。注意with这个block,我们需要是用autograd.record()来显示记录我们需要求导的程序(回忆autograd部分z和x的关系),因此loss是与params相关的,loss.backward()让params得到了每个param.grad用来更新。


#53

谢谢解答。剩下的问题是:

  1. With是记录求导的程序,为什么要把net函数也包括进去?
  2. With匹配的求导一直到SDG函数结束吗?

#54
  1. net()函数让我们获得output(预测值),output和label比较得到loss,相当于loss = square_loss(net(data), label),这就是反应了loss和w,b的关系,因为net是关于w和b的函数,而w和b正是我们要更新的。跟autograd例子里面里面y的作用类似。其实这设计到复合函数求导,正是因为我们在with-block里面说明了loss和w,b的关系,loss.backward()才知道如何求导。
  2. 不是,到loss = … (注意python语法的缩进规则)。

#55

谢谢你详细的解释。

我之所以提这个问题是给予我很奇怪他的导数实现方式。

我单步跟踪了一下:loss.backward()并没有对loss的值求出导数——这是我打印出loss得到的结论。

我目前的理解是loss.backward()只是将上面with里面的函数的导数表达式准备好,然后后在param.grad的时候再将这个导数求出来附在param的梯度上,不知道我理解的是否正确。


#56

刚发现loss.backward中是对params的w,b分别求导,请问loss 对w,b求导与loss求和之后再对w,b求导有什么区别?


#57

明白了,loss求和再对参数分别求导是为了减少计算量,由batch size及epochs决定训练总共的迭代次数。


#58

ML里面一般都是对loss求和再求导


#61

请问训练代码中,moving_loss以及est_loss的含义是什么?

# 记录每读取一个数据点后,损失的移动平均值的变化;
niter +=1
curr_loss = nd.mean(loss).asscalar()
moving_loss = (1 - smoothing_constant) * moving_loss + (smoothing_constant) * curr_loss

 # correct the bias from the moving averages
est_loss = moving_loss/(1-(1-smoothing_constant)**niter)

#62

我记得删掉moving loss了吧。那个就是为了平滑下结果,好看点而已


#64

运行线性回归例子时,出现
On entry to SGEMM parameter number 10 had an illegal value

请问如何解决?

win10 + mxnet_cu90-1.1.0b20180213


#65

不是很理解,重新跑还会有问题吗?


#66

还是不太明白,假如X是两个矩阵A以及B的乘,求X对A的倒数时,如何理解X.sum()?


#67

@astonzhang 我们可能需要多解释下求导。