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


#1

http://zh.diveintodeeplearning.org/chapter_deep-learning-basics/linear-regression-scratch.html


#2

#3

比较好奇,loss是个10*1的向量,而不是元素之和,那么对这个向量求params的导数是什么呀?


#4

求导 x.backward() 等价于 x.sum().backward()


#6

谢谢老师,这下明白了


#7

param[:] = param - lr * param.grad

请问老师,视频里的原地操作是什么意思,之前的基础不行没有弄懂。


#8

就是直接杂param上进行修改,不会新开辟内存


#9

明白了谢谢!是我自己忽略了,之前讲过了。


#10

请问能帮忙解释下x.sum().backward()吗? 是对向量的和的导数?
谢谢

另外learning rate 可以设置为一个数组吗?这样不同的 w就有不同的 求导比例。 eg.

learning_rate = mx.nd.array([[0.01], [0.001]])
但是这个运行的时候会出错


#11

一楼的问题挺好,我还没怎么注意。

原文代码中:

    with autograd.record():
        loss = square_loss(w,b,label,data)
    loss.backward()

这里的loss是代价矩阵,其中每一行(列,具体看你个人设置,这里我个人的w设置与原文有点出入)的标量代表某个样本的loss。那么求和之后,就是所有样本的代价。(《统计学习方法》里的代价函数和经验损失函数)

至于“另外learning rate 可以设置为一个数组吗?”

当然可以,直接设置learning_rate = [0.01,0.001]
不过需要对SGD进行改写


#12

请问,上述我想实现多个learning_rate来对比试验结果。本来用循环,可是结果总是很奇怪。现简化如下,发现还是结果还是有问题:

epchos = 5
#learning_rate设置为list
lr = [0.001,0.1]

for e in range(epchos):
    total_loss1 = 0
    for data,label in data_iter(10):
        with autograd.record():
            loss1 = square_loss(w,b,label,data)
        loss1.backward()
        SGD(params,lr[0])
        total_loss1 += nd.sum(loss1).asscalar()
    print("round_1 ,Epoch %d, average loss: %f" % (e, total_loss1/num_examples))
    
for e in range(epchos):
    total_loss2 = 0
    for data,label in data_iter(10):
        with autograd.record():
            loss2 = square_loss(w,b,label,data)
        loss2.backward()
        SGD(params,lr[1])
        total_loss2 += nd.sum(loss2).asscalar()
     
    
    print("round_2 ,Epoch %d, average loss: %f" % (e, total_loss2/num_examples))

结果:

2222


#13

loss里有sample weight可以用


#14

把每个batch的x, y, loss打印出来,看看是不是正常


#15

在读取数据时为什么每次读取batch_size个?每次只读一个也是可以的吧?


#17

minibatch update的好处是,每次运算时候因为量大所以需要发起新计算的次数少,额外开销的损耗也会少
另外batch中训练样本的不同可以帮助相互抵消variance,让训练更稳定不易overfit


#18

请教一个问题


i 从0开始,间隔batchsize,遍历。那么i一共要遍历100次,因为一共有100个样本
但是 i好像只取了一次0值,for循环没有完成,
这个地方怎么理解


#19

百度下python里yield的用法。
这里用了yield已经不是一个正常的函数了。


#20

为什么把param[:] = param - lr * param.grad换成param = param - lr * param.grad,训练结果就不对了?


#21
param = ...

会重新创建新param,这个是没有attach_grad的


#22

在教程里标注上对应的Jupyter notebook教程文件目录,这样可以按教程顺序去手动尝试,教程里的顺序是字母顺序,不适合从简到繁。