Q:梯度下降法是干嘛的?
A:梯度下降法是一种以最快的速度找到最优解的方法!
梯度下降法流程:
1,初始化theta,w0...wn
2,接着求梯度gradient
3,theta_t+1 = theta_t - grad * learning_rate
learning_rate是个超参数,太大容易来回振荡,太小步子太短,需要走很长时间,不管太大还是太小,
都会迭代次数很多,耗时很长
知乎视频www.zhihu.com
4,等待grad < threshold,迭代停止,收敛,threshold是个超参数
推导线性回归的loss function的导函数,目的是可以更快的求解梯度!
grad_j = (1/m) * (Xj)^Transpose * (X*theta - y)
grads = (1/m) * X^Transpose * (X*theta - y)
上面就是批量梯度下降的时候,去求解gradients梯度的公式!
不管是批量梯度下降,还是随机梯度下降,流程里面的1,3,4都是一样的,只有第二步求梯度稍有不同!
代码自己实现批量梯度下降:
batch_gradient_descent.py
Q:随机梯度下降,怎么随机的呢?
A:其实就是在求梯度的时候,不再用所有的m个样本数据来计算,而是随机的选择一条数据来计算梯度!
Q:随机梯度下降的好处是什么?缺点是什么?
A:在求梯度的时候快,迭代次数有可能更多,最终可能落不到全局最优解上
Q:Mini-Batch GD是什么?
A:就是在求梯度的时候做了一个折中,不用所有的数据,而是随机选择一部分数据来求梯度!
代码实现随机梯度下降:
stochastic_gradient_descent.py
上面代码里面除了随机抽取一条数据来求解梯度,还随着迭代次数的增多,不断减小步长!learning_rate
Q:为什么要不断的调整步长?
A:就是为了让越接近最优解的时候,调整的幅度越小,避免来回震荡!
Q:如果我们不人为的调小步长,会不会随着迭代的次数增多,调整的幅度自动减小?
A:调整的幅度取决于谁?却决于学习率和梯度,梯度事实上越接近最优解,梯度的绝对值越小
Q:为什么要做归一化?
A:只要是基于梯度来进行下降求解最优解,都需要归一化,目的是各个维度梯度可以同时收敛
Q:不做归一化,产生的问题是什么?
A:如果X1<<X2,那么W1>>W2,那么我们W1初始化之后要到达最优解的位置走的距离就远大于
W1初始化之后要到达最优解的位置走的距离!
因为X1<<X2,那么g1 = (y_hat-y)*x1 ,g2 = (y_hat-y) * x2,那么g1<<g2
因为g1<<g2,那么W调整的幅度等于W_t+1 - W_t = - alpha * g
所以g越小,调整的幅度就越小
总结一下上面的推导:
X1<<X2,W1调整的幅度<<W2调整的幅度,但是W1需要调整的距离>>W2需要调整的距离
矛盾就产生了,如果此时不做归一化,去使用梯度下降求解最优解的话,
产生的效果,即会是同样的迭代次数下,W2已经调整好了,W1还在慢慢的往前挪,
整体看起来,就比先做归一化,再做梯度下降,需要的迭代次数要多了!!!
Q:怎么让多个维度对应的W基本上在同一时刻收敛?
A:对多个维度X来进行统一的归一化,比如说,最大值最小值归一化的方法
Q:何为最大值最小值归一化呢?
A:(X-Xmin)/(Xmax-Xmin),最大值最小值归一化的特点是一定可以把一列数据归到0到1之间
Q:什么是过拟合?
A:拟合过度,用算法生成的模型,很好的拟合了你以有的数据,训练集数据,但是当来新的数据的时候,
比如测试集的数据,预测的准确率反而降低了很多,那这个时候就是发生了过拟合现象
Q:如何防止过拟合呢?
A:防止过拟合,等价于提高模型的泛化能力,或者推广能力,或者说白了就是举一反三的能力!
提高了模型的容错能力!
学霸:有监督的机器学习!
学神:有很强的学习能力,能自己找到学习的方法!无监督的机器学习!
学渣:你的算法压根就没选对,数据预处理也没对,学习方法不对!
学痴:做练习题都会,考试稍微一变化,就挂!过拟合了!没有泛化能力!
Q:如何在机器学习里面防止过拟合呢?
A:模型参数W个数,越少越好,无招胜有招
模型参数W的值越小越好,这样如果X输入有误差,也不会太影响y预测结果
通过正则化惩罚项人为的修改已有的损失函数,比如使用L1、L2正则添加到loss func里面去
L1 = n个维度的w绝对值加和
L2 = n个维度的w平方和
让我们的SGD,在找最优解的过程中,考虑惩罚项的影响
Q:当使用惩罚项,会产生什么影响?
A:使用惩罚项,会提高模型的泛化能力,但是因为人为的改变了损失函数,所有在一定程度上牺牲了
正确率,即对训练集已有数据的拟合效果,但是没关系,因为我们的模型目的是对未来新的数据进行预测
在惩罚项里面,会有个alpha,即惩罚项的权重,我们可以通过调整alpha超参数,根据需求来决定
是更看重模型的正确率还是模型的泛化能力!