参考视频: 6 - 4 - Cost Function (11 min).mkv
我们将要介绍如何拟合逻辑回归模型中的参数 θ \theta θ。具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将 h θ ( x ) = 1 1 + e − θ T x h_{\theta}(x)=\frac {1}{1+e^{-\theta^T x}} hθ(x)=1+e−θTx1代入到这样定义了的代价函数中,我们得到的代价函数将是一个非凸函数(non-convex function)。这意味着我们的代价函数有很多局部最小值,这将影响梯度下降算法寻找全局最小值。
回忆一下,线性回归的代价函数为: J ( θ ) = 1 m ∑ i = 1 m 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac {1}{m} \sum_{i=1}^{m}\frac {1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2 J(θ)=m1i=1∑m21(hθ(x(i))−y(i))2
在逻辑回归中,我们重新定义逻辑回归的代价函数为: J ( θ ) = 1 m ∑ i = 1 m C o s t ( h θ ( x ( i ) ) , y ( i ) ) J(\theta)=\frac {1}{m} \sum_{i=1}^{m}Cost(h_{\theta}(x^{(i)}),y^{(i)}) J(θ)=m1i=1∑mCost(hθ(x(i)),y(i))
其中 C o s t ( h θ ( x ) , y ) = { − l o g ( h θ ( x ) ) if y = 1 − l o g ( 1 − h θ ( x ) ) if y = 0 Cost(h_{\theta}(x),y)=\begin{cases} -log(h_{\theta}(x)) & \text{ if } y=1 \\ -log(1-h_{\theta}(x)) & \text{ if } y=0 \end{cases} Cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0
h θ ( x ) h_{\theta}(x) hθ(x)与 C o s t ( h θ ( x ) , y ) Cost(h_{\theta}(x),y) Cost(hθ(x),y)之间的关系如下图所示:
这样构建的 C o s t ( h θ ( x , y ) ) Cost(h_{\theta}(x,y)) Cost(hθ(x,y))函数的特点是:当实际的 y = 1 y=1 y=1 且 h θ h_{\theta} hθ 也为 1 时误差为 0,当 y = 1 y=1 y=1 但 h θ h_{\theta} hθ 不为 1 时误差随着 h θ h_{\theta} hθ 的变小而变大;当实际的 y = 0 y=0 y=0 且 h θ h_{\theta} hθ 也为 0 时误差为 0,当 y = 0 y=0 y=0 但 h θ h_{\theta} hθ 不为 0 时误差随着 h θ h_{\theta} hθ 的变大而变大。
将构建的 C o s t ( h θ ( x ) , y ) Cost(h_{\theta}(x),y) Cost(hθ(x),y)简化如下: C o s t ( h θ ( x ) , y ) = − y × l o g ( h θ ( x ) ) − ( 1 − y ) × l o g ( 1 − h θ ( x ) ) Cost(h_{\theta}(x),y)=-y\times log(h_{\theta}(x))-(1-y)\times log(1-h_{\theta}(x)) Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
代入代价函数得到: J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac {1}{m}\sum_{i=1}^{m} \left[y^{(i)}log h_{\theta}(x^{(i)}) + (1-y^{(i)})log(1-h_{\theta}(x^{(i)}))\right] J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
梯度下降算法:
Repeat{ θ j : = θ j − α ∂ ∂ θ j J ( θ )        ( s i m u l t a n e o u s l y u p d a t e a l l ) } \text{Repeat\{}\\ \quad \theta_j :=\theta_j - \alpha \frac {\partial}{\partial\theta_j}J(\theta) \;\;\;(simultaneously\ update\ all) \\ \} Repeat{θj:=θj−α∂θj∂J(θ)(simultaneously update all)}
求导后得到: ∂ ∂ θ j J ( θ ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac {\partial}{\partial\theta_j}J(\theta) = \frac{1}{m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} ∂θj∂J(θ)=m1∑i=1m(hθ(x(i))−y(i))xj(i)
所以梯度下降算法变为(m为数据集的条目数,因此可以看作常数):
Repeat{ θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) (simultaneously update all) } \text{Repeat\{} \\ \quad \theta_j :=\theta_j - \alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} \quad \text{(simultaneously update all)} \\ \} Repeat{θj:=θj−αm1∑i=1m(hθ(x(i))−y(i))xj(i)(simultaneously update all)}
在这个视频中,我们定义了单训练样本的代价函数,该函数是一个凸函数(凸性分析超出范围,不给出证明直接使用),并且没有局部最优值。
除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann, BFGS)和有限内存局部优化法(LBFGS)。fminunc是matlab和octave中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,下面是octave中使用fminunc函数的代码示例(非重点):
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
在下一节中,我们会把单训练样本的代价函数的这些理念进一步发展,然后给出整个训练集的代价函数的定义。我们还会找到一种比目前用的代价函数更简单的写法,并应用梯度下降法得到我们的逻辑回归算法。
参考视频 : 6 - 5 - Simplified Cost Function and Gradient Descent (10 min).mkv
我们将会找出一种稍微简单一点的方法来写代价函数来替换我们现在用的方法,同时还要弄清楚如何运动梯度下降法来拟合逻辑回归的参数。
逻辑回归的代价函数:
J ( θ ) = 1 m ∑ i = 1 m C o s t ( h θ ( x ( i ) ) , y ( i ) ) C o s t ( h θ ( x ) , y ) = { − l o g ( h θ ( x ) ) if y = 1 − l o g ( 1 − h θ ( x ) ) if y = 0 N o t e : y = 0 o r 1 a l w a y s J(\theta)=\frac {1}{m} \sum_{i=1}^{m}Cost(h_{\theta}(x^{(i)}),y^{(i)}) \\ Cost(h_{\theta}(x),y)=\begin{cases} -log(h_{\theta}(x)) & \text{ if } y=1 \\ -log(1-h_{\theta}(x)) & \text{ if } y=0 \end{cases} \\ Note: y=0\ or\ 1\ always J(θ)=m1i=1∑mCost(hθ(x(i)),y(i))Cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0Note:y=0 or 1 always
使用梯度下降(gradient descent),求导后得到(把常数 1 m \frac{1}{m} m1合并到 α \alpha α中):
Repeat{ θ j : = θ j − α ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) simultaneously update all) } \text{Repeat\{} \\ \quad \theta_j :=\theta_j - \alpha\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} \quad \text{simultaneously update all)} \\ \} Repeat{θj:=θj−α∑i=1m(hθ(x(i))−y(i))xj(i)simultaneously update all)}
我们采用向量化的方法来同时更新所有 θ \theta θ的值:
你会发现这个方法正是用来做线性回归梯度下降的。
在线性回归中讲到了特征缩放,它提高梯度下降的收敛速度,并且也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,也可以逻辑回归的梯度下降收敛更快。
参考视频 : 6 - 6 - Advanced Optimization (14 min).mkv
暂略。
参考视频 : 6 - 7 - Multiclass Classification_ One-vs-all (6 min).mkv
我们用三种不同的符号来表示三个类别,问题就是在三个类型的数据集,我们如何进行分类。
简单来说,一对多的分类工作是:先将class 1看作正类(y=1),其余看作负类(y=0),得到模型 h θ ( 1 ) ( x ) h_{\theta}^{(1)}(x) hθ(1)(x);再将class 2看作正类(y=1),其余看作负类(y=0),得到模型 h θ ( 2 ) ( x ) h_{\theta}^{(2)}(x) hθ(2)(x);最后将class 3看作正类(y=1),其余看作负类(y=0),得到模型 h θ ( 3 ) ( x ) h_{\theta}^{(3)}(x) hθ(3)(x)。所以这个方法也叫做“一对余”方法。如下图:
我们最后会得到一系列模型: h θ ( i ) ( x ) h_{\theta}^{(i)}(x) hθ(i)(x),之前说过逻辑回归模型计算出的结果是一个概率,每个模型计算出概率 p ( y = 1 ∣ x ; θ ) p(y=1|x;\theta) p(y=1∣x;θ),其中 i = ( 1 , 2 , 3 , . . . , k ) i=(1,2,3,...,k) i=(1,2,3,...,k)。
当我们要与测试,我们把所有的分类模型都运行以便,然后对每一个输入变量,选择最高可能性的输出变量作为结果,即 y = m a x i h θ ( i ) ( x ) y=\underset{i}{max}\ h_{\theta}^{(i)}(x) y=imax hθ(i)(x)。
无论 i i i值是多少,我们都有最高的概率值,预测 y y y就是那个值对应的类别。这就是多类别分类问题,以及一对多的方法。
参考资料: