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


#91

为什么 squared_loss 函数中需要使用 reshape 函数

做了实验,就算不使用reshape,broadcast机制也可以处理这笔运算
使用reshape是因为性能比较好吗?


#92

可能是因为你用的params是同一个,你第一次训练完成的时候params已经非常接近极小值了,而第二次训练中你用的lr刚好又比较大是0.1,所以有可能越过了极小值点反而使得损失升高了,尝试在第二次训练前重新初始化params,看看是否能够解决。


#93

动手学深度学习(中文版):3.2.3 和 3.2.4 的顺序?

大家好,逻辑顺序上:先定义模型(3.2.4),再初始化模型参数(3.2.3) 似乎更为合理?书中顺序为:初始化模型参数-3.2.3, 定义模型-3.2.4 感觉怪怪的,是否因为我没具备机器学习的基础而导致的认知错觉?

请看到的朋友给我做个说明,谢谢。


#94

有人知道么?
y.shape = (10L,) 而 y_hat.shape=(10L,1L)


#95

老师您好,您能否对

另外batch中训练样本的不同可以帮助相互抵消variance,让训练更稳定不易overfit

这句话再深入解释一下?似乎不是很理解。


#96

Batch size大的时候一个batch的gradient estimate的variance会变小,并且越大的batch越接近gradient descent时对整个dataset的gradient estimate。这样训练更稳定但同时也更不容易跳出non-convex问题的local minima


#97

谢谢回复:grinning:


#98

请问老师和大家,关于这一节中data_iter()函数的实现,如果num_examples不能被batch_size整除,尝试了一下,每一次epoch最后得到的X或者y的样本数量是小于batch_size的,但是在sgd()函数更新模型参数时,却用param.grad / batch_size,这样是否会带来一定的误差?谢谢!


#99

有个地方不明白, 请问在定义loss的最后为什么要除以2呢?
def squared_loss(y_hat, y): # 本函数已保存在d2lzh包中方便以后使用
return (y_hat - y.reshape(y_hat.shape)) ** 2 /2


#100

平方求导后会有个2, 这个1/2是为了和那个2抵消,便于后续计算。


#101

嗯嗯明白了, 谢谢!


#102

这里对最终答案应该不会有影响,如果写成

(lr * last_batch_size / batch_size) * param.grad / (last_batch_size),

可以看成最后一个batch,减小了 lr


#104

19年5月18日版本的书里面的梯度下降函数和b站视频里的不一样 差了一个batch_size 我理解的这个变量的含义应该只是从数据集里面取出来的数据的个数 觉得和梯度下降的过程没有什么关系 不能理解这里 求教
image


#105

因为梯度是每个batch的平均啊,要除以batch_size的嘛,


#106

个人认为影响不大,只不过是除以的batch size比起加总的梯度变得大了,看作lr变小了就好,而且就仅仅这么一次的变化而已


#107
  • 为什么 squared_loss 函数中需要使用 reshape 函数?
    这个问题有人解释下吗?我打印了一下发现y_hat: (10, 1) y: (10,)所以需要reshape.
    然后发现最开始labels = true_w[0] * features [:,0] + true_w[1] * features[:,1] + true_b
    得到的就是labels: (1000,) 所以需要reshape
    所以为啥一开始得到的不是(1000,1)呢~~

#108

这个公式是单层网络的通式。Y = X * W +b
w 和 b 是通过很多组,已知 X 和Y的时候,训练出来的,其实就是求解出来的。


#109

大家试试把 生成features的正态分布标准差scale改成0.1,噪声对应改为0.01。会发现训练得很慢,num_epoch要100多次才能接近答案。这是因为x的值变小了,dw下降得慢了的缘故吗?


#110

各位好,我刚开始学习,这段代码不是很理解,求指点:

def data_iter(batch_size,features,labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    random.shuffle(indices)
    for i in range(0,num_examples,batch_size):
        j = nd.array(indices[i:min(i+batch_size,num_examples)])
        yield features.take(j),labels.take(j)

这里min(i+batch_size,num_examples),什么时候 i+batch_size 会大过num_examples呢?
还有后面的yield features.take(j),labels.take(j),为什么要用take()函数呢? 用features[j] 效果好像是一样的啊?


#111

当你的batch_size大于num_expamples的时候,就需要用到min来确定indices[i:min(i+batch_size,num_examples)]的上界了
第二个问题我也不太清楚,如果你弄明白了。请一定记得告诉我一下。:roll_eyes: