1、逻辑回归模型
逻辑回归是一种针对二分类问题的算法。在二分类算法中,标签 y 往往都等于 0 或者 1,以此表示某个样本是否属于某个类别。比如在一个针对猫的二分类任务中,y=0 表示这张图片不是猫,y=1 表示这张图片是猫。
对于输入的 x,逻辑回归算法能够输出一个预测值,我们称之为
y
^
\hat{y}
y^,这代表对真实标签 Y 的估计。准确的说
y
^
\hat{y}
y^ 是当给定输入特征 x 时,预测标签 y 为 1 的概率。
一般来说 x 是一个 n 维的向量,表示一个样本包含 n 个特征。约定逻辑回归的参数是 w 和 b,w 也是一个 n 维的向量,b 是一个实数。给定一个 x 以及参数 w 和 b, 如何产生输出
y
^
\hat{y}
y^ 呢?线性回归
y
^
=
w
T
x
+
b
\hat{y} = w^Tx + b
y^=wTx+b 可以吗。显然这对于二分类并不是一个好的算法,因为我们希望
y
^
\hat{y}
y^ 能够输出 y 为 1 的概率,所以
y
^
\hat{y}
y^ 的值应该在0和1之间。而线性回归
w
T
x
+
b
w^Tx+b
wTx+b 可能会比1大很多或者是一个负,这对于概率就失去了意义。
所以这里我们采用逻辑回归,而逻辑回归就只是在线性回归的基础上加入了 sigmoid 激活函数。如何实现逻辑回归呢?根据刚刚的描述,我们先创建一个线性回归模型
z = w T x + b z = w^Tx + b z=wTx+b
接着再将线性回归的输出传入 sigmoid 函数
y ^ = s i g m o i d ( z ) = 1 1 + e − z \hat{y} = sigmoid(z) = \frac{1}{1+e^{-z} } y^=sigmoid(z)=1+e−z1
这样就使线性模型转变成了一个非线性的模型。我们可以用下图来描述逻辑回归的结构。
根据 sigmoid 函数的表达式,可以描绘出它的曲线:
通过 sigmoid 曲线可以看到,不管 z 取到何值,sigmoid 函数总能巧妙的把 z 映射到 0 到 1 的范围内,这样就能很好的表示样本属于某个类别的概率。sigmoid 函数是使逻辑回归成为一个非线性模型的关键,所以往往又把 sigmoid 函数叫做逻辑函数。
给定包含 m 个样本的数据集,假设每个样本包含一个 n 维的特征向量 x 和 一个标签 y,则可以表示为:
{ ( x ( 1 ) , y ( 1 ) ) , ⋯ , ( x ( m ) , y ( m ) ) } . \{(x(1), y(1)), ⋯ , (x(m), y(m))\} \ . {(x(1),y(1)),⋯,(x(m),y(m))} .
则对于数据集中的第 i 个样本:
y ^ ( i ) = s i g m o i d ( z ( i ) ) = 1 1 + e − z ( i ) , 其 中 z ( i ) = w T x ( i ) + b . \hat{y}^{(i)} = sigmoid(z^{(i)}) = \frac{1}{1+e^{-z^{(i)}}} \ , \ \ \ 其中 z^{(i)} = w^Tx^{(i)} + b \ . y^(i)=sigmoid(z(i))=1+e−z(i)1 , 其中z(i)=wTx(i)+b .
我们希望逻辑回归模型的预测值接近于样本的真实标签,即
y
^
(
i
)
≈
y
(
i
)
\hat{y}^{(i)} \approx y^{(i)}
y^(i)≈y(i)
2、逻辑回归的代价函数
为了优化逻辑回归模型的参数 w 和 b,需要定义一个代价函数。在讨论代价函数之前,先学习一下损失函数。损失函数(Loss function) 用来计算对单个样本的预测值 y ^ ( i ) \hat{y}^{(i)} y^(i) 和期望输出 y ( i ) y^{(i)} y(i) 之间的差异。换句话说,损失函数作用是计算模型在单个样本上的误差。
在线性回归中,损失函数为平方差函数,其是凸函数,执行梯度下降算法时,loss 能很好地收敛,从而得到更优的参数。理论上来说,我们也可以在逻辑回归中使用平方差函数为损失函数,但因为逻辑回归中存在 sigmod 函数,最终得到的损失函数并不能保证是凸函数,存在许多局部最优解,这对于梯度下降是不利的。所以逻辑回归模型需要定义新的损失函数。
参考链接:https://blog.youkuaiyun.com/tianguiyuyu/article/details/79644347
逻辑回归使用交叉熵作为损失函数。以下是它的定义:
当 y ( i ) y^{(i)} y(i) = 1 时, L ( y ^ ( i ) , y ( i ) ) = − l o g ( y ^ ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) =-log( \hat{y}^{(i)}) L(y^(i),y(i))=−log(y^(i)),此时 y ^ ( i ) \hat{y}^{(i)} y^(i) 越靠近 1, L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) L(y^(i),y(i)) 越小。在学习过程中,我们要使 L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) L(y^(i),y(i)) 越来越小,使需要让 y ^ ( i ) \hat{y}^{(i)} y^(i) 逐渐靠近 1。 当 y ( i ) y^{(i)} y(i) = 0 时, L ( y ^ ( i ) , y ( i ) ) = − l o g ( 1 − y ^ ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) =-log(1- \hat{y}^{(i)}) L(y^(i),y(i))=−log(1−y^(i)),此时 y ^ ( i ) \hat{y}^{(i)} y^(i) 越靠近 0, L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) L(y^(i),y(i)) 越小。在学习过程中,我们要使 L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)} ,y^{(i)}) L(y^(i),y(i)) 越来越小,使需要让 y ^ ( i ) \hat{y}^{(i)} y^(i) 逐渐靠近 0。
代价函数(Cost function) 用来计算模型在整个训练集中所有样本的损失的平均值。与损失函数不同的是,它体现的是整体的误差,通过整体误差的高低也可以判断模型性能的好坏。代价函数的定义如下:
逻辑回归的本质是最大似然估计,其代价函数的详细推导可参考: https://www.cnblogs.com/loongofqiao/p/8642045.html
3、梯度下降
需要注意的是,逻辑回归模型的自变量是样本的特征向量 x,因变量是预测结果
y
^
\hat{y}
y^。而代价函数是用来评估这个模型的性能,从它的定义也可以看出它的自变量为模型的参数 w 和 b,它的因变量为模型在整个训练集上的误差。对于不同的 w 和 b,损失函数输出的整体误差也不尽相同。学习的目的就是找到使代价函数达到最小的参数 w 和 b,换句话说就是找到使整体误差最小的参数 w 和 b,而梯度下降算法刚好可以达到这个目的。
模型参数 w 与 x 的维度一样,都是 n 维的向量。但是为了更好地绘图,在这里定义 w 和 b 都是单一实数。代价函数 J(w,b) 是在 水平轴 w 和 b 上的曲面 因此曲面的高度就是 J(w,b)在某一点的值。理想的代价函数是一个凸函数,这样就存在一个全局最优值(最小值),同时它也是梯度下降想要到达的位置,它位于图中最底下的红点处。
对于逻辑回归,几乎所有的初始化方法都有效,通常用 0 来进行初始化。随机初始化也有效,但是对于逻辑回归通常不这么做。但是因为函数是凸函数,无论在哪里初始化,应该达到同一点或大致相同的点。梯度下降算法从初始点开始,每到达一点,都会先找到最陡的下坡方向,然后朝着这个方向向下移动到一个新的位置并且更新参数 w 和 b,重复这两个步骤,最终可以到达至曲面的最低点附近。而这个最低点对应的 w 和 b,就是我们想要得到的 w 和 b。
在数学上,这个最陡的下坡方向可以用代价函数对参数 w 和 b 的偏导来体现。则通过刚刚的描述,我们可以把梯度下降定义为:
重复以下步骤 { w = w − α ∂ J ( w , b ) ∂ w w = w - \alpha \frac{\partial J(w,b)}{\partial w} w=w−α∂w∂J(w,b) b = b − α ∂ J ( w , b ) ∂ b b = b - \alpha \frac{\partial J(w,b)}{\partial b} b=b−α∂b∂J(w,b) }
其中 α \alpha α 被称为 学习率(learning rate),它可以用来控制梯度下降每一步移动的大小,从而控制训练的时间。如果我们令 X = ( x ( 1 ) , x ( 2 ) , ⋯ , x ( m ) ) ; Y = ( y ( 1 ) , y ( 2 ) , . . . , y ( m ) ) ; Y ^ = ( y ^ ( 1 ) , y ^ ( 2 ) , . . . , y ^ ( m ) ) . X=(x^{(1)}, x^{(2)}, ⋯ , x^{(m)}); \ \ \ Y=(y^{(1)},y^{(2)},...,y^{(m)}); \ \ \ \hat{Y}=(\hat{y}^{(1)},\hat{y}^{(2)},...,\hat{y}^{(m)}) \ . X=(x(1),x(2),⋯,x(m)); Y=(y(1),y(2),...,y(m)); Y^=(y^(1),y^(2),...,y^(m)) . 则根据链式求导法则我们可以求得:
∂ J ( w , b ) ∂ w = 1 m ∑ i = 1 m x ( i ) ( y ^ ( i ) − y ( i ) ) = 1 m X ( Y ^ − Y ) T \frac{\partial J(w,b)}{\partial w} = \frac{1}{m} \sum_{i=1}^{m}x^{(i)}(\hat{y}^{(i)}-y^{(i)}) = \frac{1}{m}X(\hat{Y}-Y)^T ∂w∂J(w,b)=m1i=1∑mx(i)(y^(i)−y(i))=m1X(Y^−Y)T ∂ J ( w , b ) ∂ b = 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) \frac{\partial J(w,b)}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)}-y^{(i)}) ∂b∂J(w,b)=m1i=1∑m(y^(i)−y(i))