一、随机梯度下降的随机近似【背景】:
既然是随机近似,则顾名思义,肯定是用近似方法来改善梯度下降时候的时间复杂度问题。
一般梯度下降法采用:∂E/∂wi=∑(h(x)-y)*(xi) 的时候∑耗费了大量的时间,特别是在训练集庞大的时候。
所以猜想,如果把求和去掉如何,即变为∂E/∂wi=(h(x)-y)*(xi)。(也可以是总体样本中随机抽取少量样本)
幸运的是,猜想成立了。
二、只是要注意一下标准的梯度下降和随机梯度下降的【区别】:
1.标准下降时在权值更新前汇总所有样例得到的标准梯度,随机下降则是通过考察每次训练实例来更新。
2.对于步长 η的取值,标准梯度下降的η比随机梯度下降的大。
因为标准梯度下降的是使用准确的梯度,理直气壮地走,随机梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心误入歧途南辕北辙了。
3.当E(w)有多个局部极小值时,随机梯度反而更可能避免进入局部极小值中。
三、以感知机为典型代表,其学习算法就是随机梯度下降算法!
感知机是二分类器,背景结构如下:
1.给定许多组数据(xi, yi),xi (向量)为输入,yi为输出。设计一个线性函数y=h(x)去拟合这些数据。
2.感知机:感知机(perceptron)为二类分类的线性分类模型。 输入为实例的特征向量,输出为实例的类别, 取+1 和 -1 二值。
随机选取一个误分类点(xi, yi), 即模型yi* h(x) = yi*(w0*x0 + w1*x1+b)<=0 ,对w, b进行更新:
w <—— w - η * (-yixi)
b <—— b - η * (-yi) 式中η(0 < η <= 1)是步长,在统计学习中又称为学习率(learning rate)
感知机学习算法是误分类驱动的,具体采用随机梯度下降,实质是误分类点位于分离超平面的错误一侧时,则调整w,b,使得分离超平面向该误分类点的一侧移动,以减少该误分类点于超平面的距离,直至超平面越过该误分类点,使其正确分类。感知机采用不同的初始值得到最后的模型不同,同时也会影响迭代次数,但是无论经过多少次迭代总是可以有限次样本分类。
四、随机梯度实现感知机分类C代码
#include<stdio.h>
#include <stdlib.h>
int main()
{
double x[3][2] = { { 3, 3 }, { 4, 3 }, { 1, 1 } };//{x0,x1}
double y[4] = { 1, 1, -1 };
double w[2] = { 0, 0 };//初始为零向量
double b = 0;
int j;
const double n = 1; //步长
while (1)
{
for (j = 0; j<3; j++)
{
if (y[j] * (w[0] * x[j][0] + w[1] * x[j][1] + b) <= 0)//每次只选其中一个样本作为学习,有一个不满足分类就立刻跳出
break;
}
if (j < 3)
{
for (int k = 0; k<2; k++)
w[k] += n * y[j] * x[j][k]; //这里是关键,更新学习参数
b += n * y[j];
}
else //所有样本都满足,学习完毕
break;
printf("%d :%lf,%lf %lf\n", j, w[0], w[1], b);
}
system("pause");
return 0;
}