假设函数
hypothesis是指拟合的函数,表示为 hθ(x)=θTx h θ ( x ) = θ T x , 其中 θ=[θ0,θ1,⋯,θn,] θ = [ θ 0 , θ 1 , ⋯ , θ n , ] , x=[x0,x1,⋯,xn],x0=1 x = [ x 0 , x 1 , ⋯ , x n ] , x 0 = 1
hθ(x)=[θ0θ1...θn]⎡⎣⎢⎢⎢⎢x0x1⋮xn⎤⎦⎥⎥⎥⎥=θTx h θ ( x ) = [ θ 0 θ 1 . . . θ n ] [ x 0 x 1 ⋮ x n ] = θ T x
这里需要注意的是,为了形式简洁,将 x0 x 0 放入向量中,并且赋值为1.
损失函数
定义线性回归的损失函数为:(均方误差)
对于线性回归,均方误差损失是一个凸函数,具有全局最小值。
优化方法
梯度下降法
这个比较常规
对于损失函数 J(θ) J ( θ ) , 对于每个 θj θ j ,进行更新:
repeat until converge:
θj=θj−α∂∂θjJ(θ) θ j = θ j − α ∂ ∂ θ j J ( θ )
这里需要注意的是,所有的 θj θ j 是同时更新的,也就是上式中的 θ θ 向量都采用同一个向量,直到下次更新。
对于线性回归的损失函数而言,上面的式子可以进一步写为:
θj=θj−α[1m∑mi=1(hθ(x(i))−y(i))x(i)j],(j=0,1,2,,⋯,n) θ j = θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] , ( j = 0 , 1 , 2 , , ⋯ , n )
由于上式中,对所有样本进行了求和,即涉及 了所有样本,因此这种梯度下降法又称为“Batch gradient decent”
Normal Equation
这个方法就是梯度等于零,直接求解。但是使用了向量形式。对于线性迭代推导如下:
假定有m个样本,样本feature个数为n,那么可以定义:
x(i)=⎡⎣⎢⎢⎢⎢⎢⎢x(i)0x(i)1⋮x(i)n⎤⎦⎥⎥⎥⎥⎥⎥ x ( i ) = [ x 0 ( i ) x 1 ( i ) ⋮ x n ( i ) ] , θ=⎡⎣⎢⎢⎢⎢θ0θ1⋮θn⎤⎦⎥⎥⎥⎥ θ = [ θ 0 θ 1 ⋮ θ n ] , y=⎡⎣⎢⎢⎢⎢y0y1⋮ym⎤⎦⎥⎥⎥⎥ y = [ y 0 y 1 ⋮ y m ]
可以看到 x(i)∈Rn+1,θ∈Rn+1,y∈Rm x ( i ) ∈ R n + 1 , θ ∈ R n + 1 , y ∈ R m ,定义:
X=⎡⎣⎢⎢⎢⎢⎢(x(1))T(x(2))T⋮(x(m))T⎤⎦⎥⎥⎥⎥⎥ X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T ⋮ ( x ( m ) ) T ] , X∈Rm×(n+1) X ∈ R m × ( n + 1 )
由损失函数定义可以得到其向量形式为:
因此求导得:
如果 XTX X T X 可逆,得到 θ=(XTX)−1XTy θ = ( X T X ) − 1 X T y 。这个方法称为Normal Equation。
在使用Octave计算时,上式可以写为:pinv(X'*X)*X'*y
使用Normal Equation时,不需要考虑feature scaling.
与梯度下降法相比如下:
Gradient Descent | Normal Equation |
---|---|
Need to choose alpha | No need to choose alpha |
Needs many iterations | No need to iterate |
O(kn2) O ( k n 2 ) | O(n3) O ( n 3 ) , need to calculate inverse of XTX X T X |
Works well when n is large | Slow if n is very large |
从他们的时间复杂度可以看出,当n比较大时,用梯度下降法时间上更有优势。这里的大,吴恩达给出的建议是,当n < 10000时,可以考虑Normal Equation,当n >10000时,使用梯度下降更好。
不可逆
当 XTX X T X 不可逆时,称为singular 或 degenerate, 可能是由于两个原因:
- 有线性相关的feature
- feature 太多,使得 m≤n m ≤ n
解决办法是删除一些feature或者使用正则化方法。
在Octave中,有两个求逆函数qinv
inv
,使用qinv
会在
XTX
X
T
X
不可逆返回其逆矩阵,其中涉及一些数学操作。
过拟合和正则化
欠拟合(under-fitting, high bias):模型没有很好地捕捉数据特征,不能很好地拟合数据
过拟合(over-fitting, high varience) :
过拟合的表现:对于训练集,预测非常准确,对于新数据预测很差,也就是泛化能力差(generalize)。
如何避免过拟合,有两种方式:
减少特征维度,有两种方法:
- 手动选择特征
- 通过模型选择
缺点:损失了部分信息
正则化(regularization):保留所有特征,但是减小参数 θ θ 的值,对于具有很多特征,每个特征都对预测值有贡献的问题,有很好的效果。
正则化是一种避免过拟合的手段,其思想是通过在损失函数中添加参数“惩罚”,控制参数幅度,限制参数搜索空间。从而达到以下目的:
- 简化预测函数(hypothesis) hθ(x) h θ ( x )
- 减小过拟合倾向
正则化后,损失函数可以写为下式:可以看到这里的正则化项从1开始,没有对 θ0 θ 0 进行约束。在实际操作时,加上 θ0 θ 0 对结果的影响也很小。
这将损失函数分成了两个部分:拟合训练集、减小参数值。这两部分的权重通过 λ λ 来调节,因此如何挑选合适的 λ λ 也是十分重要的,有相关算法后续会介绍。
梯度下降法
正则化后,如果使用梯度下降法进行迭代有以下迭代公式:
θ0=θ0−αm∑mi=1(hθ(x(i))−y(i))x(i)0 θ 0 = θ 0 − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i )
θj=θj−α[1m∑mi=1(hθ(x(i))−y(i))x(i)j+λmθj],(j=1,2,,⋯,n) θ j = θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] , ( j = 1 , 2 , , ⋯ , n )
可以写成:
θj=(1−αλm)θj−α[1m∑mi=1(hθ(x(i))−y(i))x(i)j],(j=1,2,,⋯,n) θ j = ( 1 − α λ m ) θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] , ( j = 1 , 2 , , ⋯ , n )
其中, (1−αλm)<1 ( 1 − α λ m ) < 1 ,因此可以将上式理解成:首先将 θj θ j 缩小一点,然后按照正常的梯度下降法进行处理。这样就可以保证 θj θ j 不会太大,从而减小了overfitting 的可能。
Normal Equation
当含有L2正则化项后,损失函数的向量形式可以写为:
因此求导得:
如果 XTX+λL X T X + λ L 可逆,得到 θ=(XTX+λL)−1XTy θ = ( X T X + λ L ) − 1 X T y 。
注意,由于不需要对
θ0
θ
0
进行正则化,因此,
正则化后还有一个好处:当 XTX X T X 不可逆时,通过加上 λL λ L , XTX+λL X T X + λ L 一般是可逆的。
技巧
技巧1:feature scaling
确保所有的属性值都在同一个量级上,梯度下降法会更快收敛。
一般使得每个属性大概满足 xi∈[−1.1] x i ∈ [ − 1.1 ] ,距离此范围不大的可以不用处理。
处理方法有:
除以最大值
mean normalization:
将 xi x i 替换为 xi−μi x i − μ i 或者 xi−μisi x i − μ i s i ,使得属性值的均值大约为0.(不对 x0 x 0 进行处理),其中, μi μ i 为均值, si=max−min s i = m a x − m i n 或标准差。
注意:如果使用了scaling技巧,那么在预测时,同样需要对样本值进行相同的处理!
技巧2:判断收敛和选择步长
通过画 J(θ) J ( θ ) 随迭代次数的图来判断,正常应该是逐渐下降的。如果逐渐上升,应该减小步长。但是步长太小就会导致收敛太慢。
吴恩达给出的选择步长的方法是:从小到大试,首先确定太小的和太大的,然后从这之间按照3倍关系试,例如可以选择0.001,0.003,0.01,0.03,0.1,0.3,1,这个序列。
属性选择和多项式回归
可以有很多方式来改进假设函数,例如
属性选择(feature choice)
有时会面对很多属性,不一定按照原属性进行拟合,而是应该根据实际情况对属性进行一些处理或计算。
比如可以将两个属性相乘得到新属性
多项式回归(polynomial regression)
假设函数可能不是线性的,这时只需要构造新属性,然后在这个属性上进行拟合即可。例如拟合 hθ(x)=θ0+θ1x1+θ2x21+θ3x31 h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 1 2 + θ 3 x 1 3 , 构造 x1=x1,x2=(x1)2,x3=(x1)3 x 1 = x 1 , x 2 = ( x 1 ) 2 , x 3 = ( x 1 ) 3 即可。这时,就需要注意feature scaling的问题了。