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(θ)=12mm∑i=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(θ)=1mm∑i=1(hθ(x(i))−y(i))∂∂θj(m∑k=0θkxik−y(i))=1mm∑i=1(hθ(x(i))−y(i))x(i)j
代入得到
Repeat {
θj:=θj−α1mm∑i=1(hθ(x(i))−y(i))x(i)j (j=0,1,…,n)
}
α是学习率,选得太小会导致J(θ)收敛太慢,太大可能会错过极值点,不能收敛甚至有可能会发散。
其中有些数据的取值范围相差太多,所以就有了Regularize,其目标是要将数据的范围限定在[−0.5,0.5],这样梯度下降会较快地收敛。
常用的方法有2种:
^xi=xi−xmeanxmax−xmin
^xi=xi−xmeanxstd
此外还可以用normal equations来求解。
某些需要预先知道的东西~
对于一个函数f:Rm×n -> R,定义它的导数为:
∇Af(A)=[∂f∂A11⋯∂f∂A1n⋮⋱⋮∂f∂Am1⋯∂f∂Amn]还引入trace操作,写作tr。对于一个n×n的矩阵A来说,A的trace被定义为它的对角线上的数字之和。
trA=n∑i=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|(A−1)T上方公式的简单推导过程可见这里。
有了上面这些的基础,就可以开始推导了。
∇θJ(θ)=∇θ12(Xθ−→y)T(Xθ−→y)=12∇θ(θTXTXθ−θTXT→y−→yTXθ+→yT→y)=12∇θtr(θTXTXθ−θTXT→y−→yTXθ+→yT→y)=12∇θ(trθTXTXθ−2tr→yTXθ)=12(XTXθ+XTXθ−2XT→y)=XTXθ−XT→y为了使J(θ)最小,令∇θJ(θ)=0,即
θ=(XTX)−1XT→y
当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+e−z
g(z)被称为sigmoid function, logistic function。它有一个非常美妙的性质: g′(z)=g(z)(1−g(z))
让我们来参想一下
P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1−hθ(x)由观察发现,这个还可以写成P(y|x;θ)=(hθ(x))y+(1−hθ(x))1−y
假设m组训练数据都是独立的,则计算似然值得到
L(θ)=P(→y|X;θ)=m∏i=1P(y(i)|x(i);θ)=m∏i=1(hθ(x(i)))y(i)+(1−hθ(x(i)))1−y(i)注意到其有指数,可以取对数来简化运算,得到:
ℓ(θ)=logL(θ)=m∑i=1y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))通过梯度下降来极大化ℓ(θ)
∂∂θjℓ(θ)=(y1g(θTx)−(1−y)11−g(θTx))∂∂θjg(θTx)=(y1g(θTx)−(1−y)11−g(θTx))g(θTx)(1−g(θTx))∂∂θjθTx=(y(1−g(θTx))−(1−y)g(θTx))xj=(y−hθ(x))xj→θ:=→θ+∇→θℓ(→θ)
由此得到了梯度下降的公式:
θi:=θi+α∑mi=1(y(i)−hθ(x))x(i)j
化简一下就变成了线性回归时的梯度下降公式(???),只是里面hθ(x)的含意变了。
选择对数似然损失函数作为Cost Function.即:
J(θ)=−1mm∑i=1(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i))))
另外一种方法
ℓ(θ)必定有最大值,则其ℓ′(θ)必有零点。则可以运用Newton法来求解,它收敛的速度比较快。
θ:=θ−ℓ′(θ)ℓ″(θ)
其他优化算法:
- Conjugate gradient
- BFGS
- L-BFGS
其他优化算法不需要α学习因子,但是较复杂。(PS:一般高效的算法哪个不复杂?)
处理多分类问题
- 针对第一类训练一个logistic 分类器h(i)θ(x), 这是第i类与其他类别的二分类问题。
- 新输入x所属的类别满足maxih(i)θ(x)(属于概率最大的那个类别)。
正则化 (Regularization)
overfitting: 对于训练集拟合较完全,但不适合新的数据。
如何解决?
- 减少特征数目
- 正则化,减小θj对y的贡献。
underfitting: 对于训练拟合不完全。
如何解决?
- 可增加1个特征来增加拟合度。
just right: 这个是最棒的!
如何解决?
- 最好的拟合!能够达到这个就最好了。
正则化线性回归
Cost Function:
J(θ)=12m(m∑i=1(hθ(x(i))−y(i))2+λn∑j=1θ2j)
增大λ来减小θ的贡献度以减小overfitting; 但是,λ如果太大(1010),有θj≈0 (j=1,2,…,n), 则hθ(x)=θ0, 这会导致underfitting.
梯度下降法:
Repeat {
θ0:=θ0−α1m∑i=1(hθ(x(i))−y(i))x(i)0θj:=θj−α∂∂θjJ(θ) (j=1,2,…,n)}
正则化只作用于非常数项。
正则化逻辑回归
Cost Function:
J(θ)=−1mm∑i=1(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i))))+λ2mn∑j=1θ2j
梯度下降法:
Repeat {
θ0=θ0−α1mm∑i=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+(1−y_k(i))log(1−(h_θ(x(i)))_k)) +λ2m∑_l=1L−1∑_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(θ)=1m∑mi=1∂∂θlijJ(θ;x,y)+λmθlij,关键就在∂∂θlijJ(θ;x,yi).
J(θ;x,y)=ylog(f(x))+(1−y)log(1−f(x))
使用反向传播的时候到啦。首先计算出输出层的残差:
δli=−∂∂zliJ(θ;x,y)=−f′(zli)(y−f(zli))f(zli)(1−f(zli))=f(zli)−y再计算输出层(l)的前一层残差(l-1):
δl−1i=−∂∂zl−1iJ(θ;x,y)=−N∑j=1yj−aljalj(1−alj)∂alj∂zl−1i=−N∑j=1yj−aljalj(1−alj)∂f(zlj)∂zl−1i=−N∑j=1yj−aljalj(1−alj)∂f(zlj)∂zlj∂zlj∂zl−1i=−N∑j=1yj−aljalj(1−alj)f′(zlj)∂zlj∂zl−1i=−N∑j=1(yj−alj)∂zlj∂zl−1i=−N∑j=1(yj−alj)∂∂zl−1iM∑k=1θl−1jkal−1k=−N∑j=1(yj−alj)∂θl−1jif(zl−1i)∂zl−1i=N∑j=1δljθl−1jif′(zl−1i)f(x)为sigmoid函数。
由此可得δli与δl+1j的关系:
δli=(N∑j=1θljiδl+1j)f′(zli)综上所述,各层误差估计为:
δ(l)={a(l)−y(l=L) (θ(l))Tδ(l+1).∗f′(z(l))(l=L−1,L−2,…,2)
由于θl−1ij只能影响到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:
- a(1)=x(i)
- 前向传播得到a(l) (l=2,3,…,L)
- 利用(???)反向传播计算误差
- Δ(l)+=Δ(l+1)(a(l))T
- 计算D(l)ij=∂∂Θ(l)ijJ(θ):
注意,上面的公式均是向量化的。
梯度检查
当进行反向传播时可能会因为各种错误造成梯度的误差,可以应用「梯度检查」来检查是否发生错误(感觉好绕口…).
∂∂θlijJ(θ)≈J(θ(whereθlij=θlij+ϵ))−J(θ(whereθlij=θlij−ϵ))2ϵ随机初始化
因为不可将θlij都初始化为0,因而取胜随机化的方法,可取范围为[−ϵ,ϵ],选择ϵ的有效策略是根据每层神经元数目ϵ=√6√Lin+Lout (Lin=sl,Lout=sl+1).