梯度下降和随机梯度下降之间的关键区别
标准梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查某个训练样例来更新的
在标准梯度下降中,权值更新的每一步对多个样例求和,需要更多的计算
标准梯度下降,由于使用真正的梯度,标准梯度下降对于每一次权值更新经常使用比随机梯度下降大的步长
如果标准误差曲面有多个局部极小值,随机梯度下降有时可能避免陷入这些局部极小值中
sgd、bgd的Python实现
#coding=gbk
'''
Created on Apr 12, 2014
@author: pipi
'''
import numpy as np
def bgd(feature,target,alpha = 0.001,iterateTimes = 200):
'... batch gradient descent ...'
theta = np.zeros(feature.shape[1])
for it in range(iterateTimes): #max iteratetimes is 200
for i in range(feature.shape[0]): #for each sample
error = target[i] - sum(feature[i]*theta)
theta += alpha*error*feature[i]
predict = [sum(theta*sample) for sample in feature]
mse = sum((predict - target)**2)/feature.shape[0]
print 'bgd_mse : ',mse
return theta
def sgd(feature,target,alpha = 0.001,iterateTimes = 101000):#101000
'... stochastic gradient descent ...'
theta = np.zeros(feature.shape[1])#num of theta = num of feature atrribute
for it in range(iterateTimes): #max iteratetimes is 200
i = it%feature.shape[0]
error = target[i] - sum(feature[i]*theta)#对应元素相乘,都是行array
theta += alpha*error*feature[i]
predict = [sum(theta*sample) for sample in feature]
mse = sum((predict - target)**2)/feature.shape[0]
if(mse < 21.8498395893):
break
print 'sgd_mse : ',mse
return theta
def normalizer(feature):
'normalization of feature'
mean_j = np.mean(feature,axis = 0)
for j in range(1,feature.shape[1]):
feature[:,j] = (feature[:,j] - mean_j[j])/std_j[j]
return feature
'''
Created on Apr 12, 2014
@author: pipi
'''
import re
import numpy as np
def loadData(filename):
feature = list()
target = list()
f = open(filename,'rb')
for line in f:
sample = re.split('\s+',line.strip())
feature.append([1] + sample[0:-1])#construct x0 = 1
target.append(sample[-1])
return np.array(feature,np.float),np.array(target,np.float)
代码中使用的数据集可以从http://download.csdn.net/detail/pipisorry/7192349下载
代码中normalize函数用于对feature进行归一化处理,可以尝试一下去掉normalize过程,对于这个数据集会得出很出乎意料的结果。
可能存在的改进
1)样本可靠度,特征完备性的验证
例如可能存在一些outlier,这种outlier可能是测量误差,也有可能是未考虑样本特征,例如有一件衣服色彩评分1分,料子1分,确可以卖到10000万元,原来是上面有一个姚明的签名,这个特征没有考虑,所以出现了训练的误差,识别样本中outlier产生的原因。
2)批量梯度下降方法的改进
并行执行批量梯度下降
3)随机梯度下降方法的改进
找到一个合适的训练路径(学习顺序),去最大可能的找到全局最优解
4)假设合理性的检验
H(X)是否合理的检验
5)维度放大
维度放大和过拟合问题,维度过大对训练集拟合会改善,对测试集的适用性会变差,如果找到合理的方法?
概率解释
在以上的讨论中,得出y与x的关系是线性假设,使用梯度下降也可以从高数中得到依据,唯有损失函数好像是拍脑袋想出来的。有那么多的函数可以用,为什么单选择了一个二次式做为损失函数。其实这里选择二次函数是有其理论基础的。
y与x满足以下公式:
y(i)=θTx(i)+ε(i)
其中ε(i)称为误差,可能由两个原因产生:
feature选择的不合适;
随机噪声;
又假设ε(i)独立同分布,且满足均值为0,方差为σ2的高斯分布,即:
p(ε(i))=12π √σe (ε(i))22σ2
也就是:
p(y(i)|x(i);θ)=12π √σe (y(i) θTx(i))22σ2
以上是一个关于y, X的公式,可以定义一个似然函数,形式如同上式,但是似然函数是关于θ的公式:
L(θ)=L(θ;X,y)=p(y|X;θ)
根据之前ε(i)的独立性假设,L(θ)可以记做
L(θ)=∏i=1mp(y(i)|x(i);θ)=∏i=1m12π √σe (y(i) θTx(i))22σ2
现在已经观察到了很多数据(x, y),那么什么样的模型才能让这些数据出现的可能性最大。这就是最大似然估计的出发点,也就是求解θ以最大化这些数据出现的概率,即最大化似然函数L(θ)。
关于最大似然估计方法更多解释可以看这里。
当然更多时候最大化的是logL(θ),而不是直接最大化L(θ),因为log函数单调递增函数,所以这个转化不会影响θ的最终取值。
l(θ)=logL(θ)=log∏i=1m12π √σe (y(i) θTx(i))22σ2=∑i=1mlog12π √σe (y(i) θTx(i))22σ2=mlog12π √σ 1σ212∑i=1m(y(i) θTx(i))2
因此最大化l(θ)也就是最小化:
12∑i=1m(y(i) θTx(i))2
也就是之前出现的J(θ)。我们从概率和最大似然估计的角度解释了J(θ)选择这个二次式是合理的。