本文结合实例简单介绍梯度下降算法。
梯度下降用处广泛,既可以用于回归也可以用于分类,在神经网络中更是作为主流方法完成网络参数估计任务。
方便起见,用二维点表示我们的训练数据集。
(a) (b)
图1 样本(a) ; 样本分布 (b)
上图中矩阵的每一横行代表一对平面上的点,其分布如右侧图中散点所示。我们的目的是要找到一个函数,来最好的拟合这些点,甚至对未知点的位置进行进行预测。
假设函数为线性的多项式的形式:
(这里样本维度是2,故k=1)
其中 表示第i个系数,为要求解的权重。
表示一个训练样本的第i维的取值,在上例中,因为只有横坐标一个维度值,故n取值为1。如果是在立体空间,那么k取2,当然,样本还可以用更高维的向量表示。
例子中,要预测的值为y轴对应的点,即上图右列的值,机器学习中称其为标签(Label)。
此时要预测的函数形式为:
在模式识别、机器学习中,为方便书写、计算和分析,一般将标量表示的问题通过矩阵、向量表示。上述函数的向量化表示为:
(1)
其中:;
,表示样本特征(一般地,方括号内分号表示按行排,即
是向量第一行,
为第二行。逗号表示按列排)
这里存在一个小问题,在上面拟合的例子中,样本只用一维表示,仅有一维,即图1(a)中第一列。为了能用(1)式表示问题,需要对样本表示进行简单变化:将样本扩展为2维向量,其中第一维全为1,即不论是哪个样本,其第1维
取值均为1。如图2所示。
图2 扩展后的样本的向量表示(特征表示,)
进一步,考虑到样本不止一个,可以将(1)式进一步简化:
其中,,
为第i个样本的标签;
如图2矩阵所示,
的每一行为一个样本的特征表示的转置
那么估计参数的取值呢?
这里需要定义目标函数,当取值"合适"时,该目标函数的取值较小(或较大)。机器学习中,常用最小化预测值于标签值之差的二范数定义目标函数,即,
称为损失函数,目标为最小化
;
为第 i 个样本的标签值,即图1(a)中第2列的某个值
为了方便求导,一般以最小化为目标。
梯度下降方法求解参数的原理为:负梯度方向为函数下降最快的方向(原因请看《高等数学》或博客)
梯度的求解即对函数变量每一维度求偏导,由偏导组合的向量即梯度:
(2)
具体的,随机初始化,求解当前
取值下损失函数的梯度,然后沿此梯度方向更新参数
;上述过程反复执行,直至梯度收敛
下面给出梯度下降算法步骤。
输入: 样本特征表示, 样本标签
输出:
1. 随机初始化 //如全为0.1
2. 重复直至收敛:
3. 以(2)式计算梯度
4.
算法中为步长。步长取值是否合理有时候直接决定上述方法是否可以得到合理的参数估计,取值如0.00005,过小取值迭代速度较慢,过大无法收敛
附上matlab代码:
function W = Gradient_descent(X,Y)
tX = X;%tX的作用只是为了创建detaW时使用
W = 0.1*ones(size(X,2)+1,1);
X = [ones(size(X,1),1),X];
k = 0;%迭代次数
while true
detaW = zeros(size(tX,2)+1,1);
O = X*W;
detaW = detaW + 0.00005*X'*(Y - O);%0.00005是学习速率
W = W + detaW;
k = k+1;
if 1/2*( norm(Y - X*W) )^2 < 5 || k>10000 %如果误差小于5或者迭代次数大于10000则停止
break;
end
fprintf('iterator times %d, error %f\n',k,1/2*( norm(Y - X*W) )^2);
end
实验结果: