学习率 learning_rate(i_iter * m + i) 参数为啥这么大?

来源:6-7 scikit-learn中的随机梯度下降法

慕粉2056486049

2018-11-24

随机梯度下降法中的学习率 learning_rate(i_iter * m + i) 方法的参数为什么要传 “ i_iter * m + i ” 这么大的数字

写回答

4回答

liuyubobobo

2018-11-24

理解你的问题了:)


注意:我们所编写的sgd算法,其中n_iters的语义,和梯度下降法不同!在梯度下降法中,n_iters就是搜索多少次。而在我们的sgd中,n_iters是指:搜索多少“轮”!而每一轮搜索,需要进行m次。也就是总共进行了 m * n_iters 次搜索!这就是我们的sgd中两层循环的意思:

for i_iter in range(n_iters): # 进行n_iters轮搜索
    # ...
    for i in range(m): # 没轮搜索进行m次
        # 这是第 i_iter * m + i 次搜索!!!
        # ....

     

而,learning_rate的函数中,传入的参数t,在模拟退火中的意思是:当前是第多少次搜索。所以,要传入 i_iter * m + i :)


我们的sgd为什么设计成要进行n_iters“轮”搜索,每轮m次搜索?可以参考这个问答:https://coding.imooc.com/learn/questiondetail/87119.html


加油!:)

0
2
liuyubobobo
回复
慕粉2056486049
继续加油!:)
2018-11-25
共2条回复

慕粉2056486049

提问者

2018-11-24

https://git.imooc.com/coding-169/coding-169/src/master/06-Gradient-Descent/07-SGD-in-scikit-learn/playML/LinearRegression.py   

line86改成: learning_rate(i_iter * i)

使用波士顿房价数据:

data = datasets.load_boston()

X = data.data

y = data.target


X = X[y<50]

y = y[y<50]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)


standardScaler = StandardScaler()

standardScaler.fit(X_train)

X_train_standard = standardScaler.transform(X_train)

X_test_standard = standardScaler.transform(X_test)


reg = LineRegressor()

reg.fit_sgd(X_train_standard, y_train)

reg.r2_score(X_test_standard, y_test)

计算出来的 r2_score  是负数

0
0

liuyubobobo

2018-11-24

你是用什么数据怎么实验对比得到的这个结论?把你的代码配合简单的注释放上来我看一下?

0
2
慕粉2056486049
代码贴进去没有没有格式了, 我截图下
2018-11-24
共2条回复

慕粉2056486049

提问者

2018-11-24


经过测试 对了了下     i_iter * m + i  , i_iter  * i    de 效果  发现学习率必须传   i_iter * m + i  ,  但还是不明白 为啥 t1 需要这么大的数字

随机梯度下降法 得到的结果 也有很大的随机性,  可以增加i_iter 次数来提高准确性

0
0

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程