keep moving

机器学习

Posted on By condy

some are stolen from jiyeqian


机器学习

  • Definition:
    • (1959) Machine learning is the field of study that gives computers the ability to learn without being explicitly programmed.
    • (1998) A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

它可以用于数据挖掘、手写识别、自然语言处理、计算机视觉、推荐系统等等。


线性回归

监督学习:对于每个例子给出正确的答案。

回归问题:预测下一次的输出。

回归函数:

hθ(x)=θTx=θ0x0+θ1x1++θnxnhθ(x)=θTx=θ0x0+θ1x1++θnxn

常数项 x0=1 线性回归模型也可以用于多项式回归(polynomial regression),例如当x1=x,x2=x2,x3=x3,时。

代价函数: J(θ)=12mmi=1(hθ(x(i))y(i))2

m为样本数量, n为特殊数量。

这里我们要选择最合适的θ0,θ1,θ2,,使得Cost Function最小。


梯度下降法

这算是一种搜索算法,总体思路就是从某θ0,θ1,θ2,开始,改变θ的值来减小J(θ)直到到达一个较好的最小值。

Repeat { θj:=θjαθjJ(θ)      (j=0,1,,n) }

θjJ(θ)展开得到: θjJ(θ)=1mmi=1(hθ(x(i))y(i))θj(mk=0θkxiky(i))=1mmi=1(hθ(x(i))y(i))x(i)j

代入得到

Repeat {

θj:=θjα1mmi=1(hθ(x(i))y(i))x(i)j      (j=0,1,,n)

}

α是学习率,选得太小会导致J(θ)收敛太慢,太大可能会错过极值点,不能收敛甚至有可能会发散。

其中有些数据的取值范围相差太多,所以就有了Regularize,其目标是要将数据的范围限定在[0.5,0.5],这样梯度下降会较快地收敛。

常用的方法有2种:

^xi=xixmeanxmaxxmin

^xi=xixmeanxstd

此外还可以用normal equations来求解。

某些需要预先知道的东西~

对于一个函数f:Rm×n -> R,定义它的导数为:

Af(A)=[fA11fA1nfAm1fAmn]

还引入trace操作,写作tr。对于一个n×n的矩阵A来说,A的trace被定义为它的对角线上的数字之和。

trA=ni=1Aii

如果A是一个实数(即1x1的矩阵),则A的trA=A

还有如下性质:

trABC=trCAB=trBCA trABCD=trDABC=trCDAB=trBCDA trA=trAT tr(A+B)=trA+trB traA=atrA AtrAB=BT ATf(A)=(Af(A))T AtrABATC=CAB+CTABT A|A|=|A|(A1)T

上方公式的简单推导过程可见这里

有了上面这些的基础,就可以开始推导了。

θJ(θ)=θ12(Xθy)T(Xθy)=12θ(θTXTXθθTXTyyTXθ+yTy)=12θtr(θTXTXθθTXTyyTXθ+yTy)=12θ(trθTXTXθ2tryTXθ)=12(XTXθ+XTXθ2XTy)=XTXθXTy

为了使J(θ)最小,令θJ(θ)=0,即

θ=(XTX)1XTy

XTX不可逆时,

  • 使冗余数据线性相关
  • 特征数目过多,删除过多的特征或者应用接下来的正则化(regularize)
Gradient Descent(梯度下降) Normal Equation
需要学习因子α 不需要α
需要迭代计算 不需要
当特征数n很大时工作良好 n很大时速度慢

逻辑回归

逻辑回归用于二分类的问题,其回归函数值只能取0,1。其回归模型:

hθ(x)=g(θTx)

hθ(x)0.5,则y=1; 若hθ(x)<0.5, 则y=0。 其中g(z)=11+ez

g(z)被称为sigmoid function, logistic function。它有一个非常美妙的性质: g(z)=g(z)(1g(z))

让我们来参想一下

P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1hθ(x)

由观察发现,这个还可以写成P(y|x;θ)=(hθ(x))y+(1hθ(x))1y

假设m组训练数据都是独立的,则计算似然值得到

L(θ)=P(y|X;θ)=mi=1P(y(i)|x(i);θ)=mi=1(hθ(x(i)))y(i)+(1hθ(x(i)))1y(i)

注意到其有指数,可以取对数来简化运算,得到:

(θ)=logL(θ)=mi=1y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))

通过梯度下降来极大化(θ)

θ:=θ+θ(θ)

θj(θ)=(y1g(θTx)(1y)11g(θTx))θjg(θTx)=(y1g(θTx)(1y)11g(θTx))g(θTx)(1g(θTx))θjθTx=(y(1g(θTx))(1y)g(θTx))xj=(yhθ(x))xj

由此得到了梯度下降的公式:

θi:=θi+αmi=1(y(i)hθ(x))x(i)j

化简一下就变成了线性回归时的梯度下降公式(???),只是里面hθ(x)的含意变了。

选择对数似然损失函数作为Cost Function.即:

J(θ)=1mmi=1(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i))))


另外一种方法

(θ)必定有最大值,则其(θ)必有零点。则可以运用Newton法来求解,它收敛的速度比较快。

θ:=θ(θ)(θ)

其他优化算法:

  • Conjugate gradient
  • BFGS
  • L-BFGS

其他优化算法不需要α学习因子,但是较复杂。(PS:一般高效的算法哪个不复杂?)


处理多分类问题

  • 针对第一类训练一个logistic 分类器h(i)θ(x), 这是第i类与其他类别的二分类问题。
  • 新输入x所属的类别满足maxih(i)θ(x)(属于概率最大的那个类别)。

正则化 (Regularization)

overfitting: 对于训练集拟合较完全,但不适合新的数据。

如何解决?

  • 减少特征数目
  • 正则化,减小θjy的贡献。

underfitting: 对于训练拟合不完全。

如何解决?

  • 可增加1个特征来增加拟合度。

just right: 这个是最棒的!

如何解决?

  • 最好的拟合!能够达到这个就最好了。

正则化线性回归

Cost Function:

J(θ)=12m(mi=1(hθ(x(i))y(i))2+λnj=1θ2j)

增大λ来减小θ的贡献度以减小overfitting; 但是,λ如果太大(1010),有θj0  (j=1,2,,n), 则hθ(x)=θ0, 这会导致underfitting.

梯度下降法:

Repeat {

θ0:=θ0α1mi=1(hθ(x(i))y(i))x(i)0θj:=θjαθjJ(θ)      (j=1,2,,n)

}

正则化只作用于非常数项。


正则化逻辑回归

Cost Function:

J(θ)=1mmi=1(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i))))+λ2mnj=1θ2j

梯度下降法:

Repeat {

θ0=θ0α1mmi=1(hθ(x(i))y(i))x(i)0θj=θjαθjJ(θ)      (j=1,2,,n)

}

实现的时候坐标是从1开始的,所以


神经网络

神经网络是一个巨复杂的东西,具体是啥我也不知道啦。


代价函数

J(θ)=1m_i=1m_k=1K(y_k(i)log(h_θ(x(i)))_k+(1y_k(i))log(1(h_θ(x(i)))_k)) +λ2m_l=1L1_i=1s_l_j=1s_l+1(θ_ji(l))2

别看上面这个公式这么复杂,其实它只是在求对于m个数据而言K个分类器造成的误差再加上Regularized项。

hθ(x)RK, (hθ(x))i是第i个输出;sl表示第l层神经元的个数(不含bias unit);共m组训练数据,K个输出,L层。


参数估计方法

minθJ(θ)

反向传播(BackPropagation algorithm)

依旧是经典的梯度下降法:

θlij=θlijαθlijJ(θ)

α还是如前文所说的学习因子,这里比较「关键」的是θlijJ(θ)

现在利用反向传播算法来求它,它是一种计算偏导数的有效方法。关于这算法的具体思路可参考这里这里

由于ml课程上用的Cost Function比较复杂(相对于方差代价函数而言),还是按照BP的思路来推导一下。

θlijJ(θ)=1mmi=1θlijJ(θ;x,y)+λmθlij,关键就在θlijJ(θ;x,yi).

J(θ;x,y)=ylog(f(x))+(1y)log(1f(x))

使用反向传播的时候到啦。首先计算出输出层的残差:

δli=zliJ(θ;x,y)=f(zli)(yf(zli))f(zli)(1f(zli))=f(zli)y

再计算输出层(l)的前一层残差(l-1):

δl1i=zl1iJ(θ;x,y)=Nj=1yjaljalj(1alj)aljzl1i=Nj=1yjaljalj(1alj)f(zlj)zl1i=Nj=1yjaljalj(1alj)f(zlj)zljzljzl1i=Nj=1yjaljalj(1alj)f(zlj)zljzl1i=Nj=1(yjalj)zljzl1i=Nj=1(yjalj)zl1iMk=1θl1jkal1k=Nj=1(yjalj)θl1jif(zl1i)zl1i=Nj=1δljθl1jif(zl1i)

f(x)为sigmoid函数。

由此可得δliδl+1j的关系:

δli=(Nj=1θljiδl+1j)f(zli)

综上所述,各层误差估计为:

δ(l)={a(l)y(l=L)                            (θ(l))Tδ(l+1).f(z(l))(l=L1,L2,,2)

由于θl1ij只能影响到zli,所以θlijJ(θ;x,y)=aljδl+1i

Now, put it together!

训练数据{(x(1),y(1)),,(x(m),y(m))}

初始化:δ(l)ij=0 for all i,j,l

for i in 1,m:

  1. a(1)=x(i)
  2. 前向传播得到a(l)  (l=2,3,,L)
  3. 利用(???)反向传播计算误差
  4. Δ(l)+=Δ(l+1)(a(l))T
  5. 计算D(l)ij=Θ(l)ijJ(θ):
D(l)ij=1mΔ(l)ij+λmΘ(l)ij(j0)D(l)ij=1mΔ(l)ij(j=0)

注意,上面的公式均是向量化的。


梯度检查

当进行反向传播时可能会因为各种错误造成梯度的误差,可以应用「梯度检查」来检查是否发生错误(感觉好绕口…).

θlijJ(θ)J(θ(whereθlij=θlij+ϵ))J(θ(whereθlij=θlijϵ))2ϵ

随机初始化

因为不可将θlij都初始化为0,因而取胜随机化的方法,可取范围为[ϵ,ϵ],选择ϵ的有效策略是根据每层神经元数目ϵ=6Lin+Lout (Lin=sl,Lout=sl+1).