在 上一周的课程 里,Andrew Ng 为我们介绍了什么是机器学习以及监督学习中的线性回归。对于一个监督学习,我们要确定我们的 预测函数,代价函数,然后利用梯度下降算法找到 代价函数 最小时,预测函数 中的参数值。这周我们会接触监督学习中一类新的问题,称为分类问题。
点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看,代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第二周的笔记。
分类问题
对于监督学习中的分类问题,通常已知一些数据并知道它们各自属于什么类别,然后希望基于这些数据来判断新数据是属于什么类别的。比如已知一些症状特征和是否患有某种疾病的数据,基于这些数据来判断新的病人是否患病。再比如根据过去的垃圾邮件数据来判断新邮件是否为垃圾邮件。
预测函数
对于 线性回归 我们的 预测函数 为:
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n = θ T x h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\dots+\theta_nx_n=\theta^Tx hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn=θTx
但这个 预测函数 的输出是个没有范围的连续值,并不适合分类问题。因此在 逻辑回归 中使用了:
h θ ( x ) = g ( θ T x ) h_\theta(x)=g(\theta^Tx) hθ(x)=g(θTx) g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
来作 预测函数,其中
g
(
z
)
g(z)
g(z) 被称为 Sigmoid 函数,它很好地将 预测函数 的输出值控制在 0、1 之间。( 下图为 Sigmoid 函数图像 )
这样就可以将 预测函数 解释为在给定
x
x
x 及参数
θ
\theta
θ 的情况下,
y
=
1
y=1
y=1 ( 属于这个分类 )的概率:
h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_\theta(x)=P(y=1 | x;\theta) hθ(x)=P(y=1∣x;θ)
决策边界
对于分类问题,有一个新的概念称为 决策边界。由于最终我们必须决定输入数据是否属于某个分类,我们设定了
0.5
0.5
0.5 作为阈值,预测函数 输出大于
0.5
0.5
0.5 的就属于该分类,反之不属于。而
h
θ
(
x
)
=
0.5
h_\theta(x) = 0.5
hθ(x)=0.5 时,对应于
θ
T
x
=
0
\theta^Tx=0
θTx=0。我们将
θ
T
x
=
0
\theta^Tx=0
θTx=0 对应的曲线称为决策边界( 注意这里的
x
x
x 并不是指训练数据,决策边界是
h
θ
(
x
)
h_\theta(x)
hθ(x) 的属性,下图为作业中的决策边界 )。
代价函数
再来说说 逻辑回归 中的代价函数。如果沿用 线性回归 中的代价函数,我们会得到类似下图的曲线( 下图为单个特征
θ
0
\theta_0
θ0 所对应的 代价函数 曲线,和 Ng 画的不太一样 ):
在这样的函数上使用梯度下降算法,最终很有可能在平坡处停止。在数学上我们已知如果一个函数是凸的,那么使用梯度下降一定能找到全局最小值。凸函数 是一个很强的限制,可以形象地理解为,在函数上任取一段都是向外凸的( 如下图,详细定义见 维基百科 )。
所以我们使用新的 代价函数 使得它满足 凸函数 的性质。
J ( θ ) = − 1 m ( y T l o g ( g ( X θ ) ) + ( 1 − y ) T l o g ( 1 − g ( X θ ) ) ) J(\theta)= -\frac{1}{m}\Big(y^Tlog\big(g\left(X\theta\right)\big)+(1-y)^Tlog\big(1-g\left(X\theta\right)\big)\Big) J(θ)=−m1(yTlog(g(Xθ))+(1−y)Tlog(1−g(Xθ)))
梯度下降
求解 代价函数 最值的方法还是 梯度下降 算法,所以我们需要对 J ( θ ) J(\theta) J(θ) 进行求导( 求导的计算过程能够给你一个印象,知道求导的结果是怎么来的。但是为了让大家不要淹没在计算的细节中,文章都会省略计算给出最终结果的矩阵形式 )。
∇ J ( θ ) = 1 m X T ( g ( X θ ) − y ) \nabla J(\theta)= \frac{1}{m}X^T\big(g(X\theta)-y\big) ∇J(θ)=m1XT(g(Xθ)−y)
有了 代价函数 和 梯度 就能够自己实现梯度下降算法来求解问题了。不过在课程中 Ng 提到了几种 梯度下降 的优化算法,Conjugate descent、BFGS、L-BFGS。这些算法不需要指定学习率,而且能够更快地找到解,我们可以通过调用内置函数来完成学习( 在作业中由于没有 Octave 的 fminunc 函数,作为代替使用了 scipy 包中的 minimize 函数,算法用的是 BFGS )。
正则化
正则化 的引入是为了防止学习中的 过拟合现象。简单来说 过拟合现象 就是我们的学习算法将很多对问题并不重要的 细节特征甚至 噪声 都考虑了进来,认为它们是决策依据。就像对于作业 ex2_reg.py 中需要分类的数据,假设了 预测函数 :
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
26
x
1
x
2
5
+
+
θ
27
x
2
6
)
g(\theta_0+\theta_1x_1+\theta_2x_2+\dots+\theta_{26}x_1x_2^5++\theta_{27}x_2^6)
g(θ0+θ1x1+θ2x2+⋯+θ26x1x25++θ27x26)
对于含有 28 个参数的 预测函数 ,可以拟合很多类型的数据,但对于作业中的数据有些特征并不需要。我们希望
J
(
θ
)
J(\theta)
J(θ) 取得最小的同时,特征的系数
θ
i
\theta_i
θi 尽可能小。为此对 代价函数 做一些修改变成如下形式:
J ( θ ) = − 1 m ( y T l o g ( g ( X θ ) ) + ( 1 − y ) T l o g ( 1 − g ( X θ ) ) ) + λ 2 m θ T θ J(\theta)= -\frac{1}{m}\Big(y^Tlog\big(g\left(X\theta\right)\big)+(1-y)^Tlog\big(1-g\left(X\theta\right)\big)\Big)+\frac{\lambda}{2m}\theta^T\theta J(θ)=−m1(yTlog(g(Xθ))+(1−y)Tlog(1−g(Xθ)))+2mλθTθ
试中 λ \lambda λ 为正则化系数,用来平衡两个目标,一个是让前半部分的 代价函数 尽量小,一个是避免参数过大导致过拟合。后半部分正则化项中的 θ 0 \theta_0 θ0 取零,因为一般不对其进行约束。线性回归 同样可以使用正则化的方法,这里我们只给出正则化后的代价函数:
J ( θ ) = 1 2 m ( X θ − y ) T ( X θ − y ) + λ 2 m θ T θ J(\theta)=\frac{1}{2m}(X\theta-y)^T(X\theta-y)+\frac{\lambda}{2m}\theta^T\theta J(θ)=2m1(Xθ−y)T(Xθ−y)+2mλθTθ
如果使用正规方程求解的话,那么最后 θ \theta θ 的解为:
θ = ( X T X + λ [ 0 ⋯ ⋯ ⋯ 0 0 1 ⋯ ⋯ 0 ⋮ ⋮ 1 ⋯ 0 ⋮ ⋮ ⋯ ⋱ ⋮ 0 0 ⋯ ⋯ 1 ] ) − 1 X T y \theta=(X^TX+\lambda\left[\begin{array}{ccccc}0 &\cdots &\cdots &\cdots &0 \\ 0 &1 &\cdots &\cdots &0\\ \vdots & \vdots & 1 &\cdots & 0\\ \vdots &\vdots &\cdots &\ddots & \vdots \\ 0 & 0 &\cdots &\cdots &1 \end{array}\right])^{-1}X^Ty θ=(XTX+λ⎣⎢⎢⎢⎢⎢⎢⎡00⋮⋮0⋯1⋮⋮0⋯⋯1⋯⋯⋯⋯⋯⋱⋯000⋮1⎦⎥⎥⎥⎥⎥⎥⎤)−1XTy
正则化 是一个蛮大的主题,在这里一时半会没法讲全,自己理解的也不透彻,等有了更好的体会时再与大家分享。
So~,第二周的内容就是这些了,谢谢大家耐心阅读。