2-神经网络基础之逻辑回归

2025-01-10 08:55

🍸 神经网络基础 —— 逻辑回归


🔈 本节我们将开始介绍神经网络的基础:逻辑回归(Logistic Regression)。通过对逻辑回归模型结构的分析,为我们后面学习神经网络模型打下基础。本节介绍的逻辑回归和前面所学机器学习中的并无差异,权当作复习了吧~

一、二分类 Binary Classification

我们知道逻辑回归模型一般用来解决二分类(Binary Classification)问题。二分类就是输出 y 只有 {0,1} 两个离散值(也有{-1,1}的情况)。我们以一个图像识别问题为例,判断图片中是否有猫存在,0 代表 noncat,1 代表 cat。主要是通过这个例子简要介绍神经网络模型中一些标准化的、有效率的处理方法和符号 notations。

image.png

如上图所示,这是一个典型的二分类问题。一般来说,彩色图片包含 RGB 三个通道。例如该 cat 图片的尺寸为(64,64,3)。在神经网络模型中,我们首先要将图片输入 x(维度是(64,64,3))转化为一维的特征向量(feature vector)。方法是每个通道一行一行取,再连接起来。由于64x64x3=12288,则转化后的输入特征向量维度为(12288,1)。此特征向量 x 是列向量,维度一般记为 $n_x$。

如果训练样本共有 m 张图片,那么整个训练样本 X 组成了矩阵,维度是($n_x$,m)。注意,这里矩阵 X 的行 $n_x$ 代表了每个样本 $x^{(i)}$ 特征个数,列 m 代表了样本个数。这里,Andrew 解释了 X 的维度之所以是( $n_x$,m) 而不是(m,$n_x$)的原因是为了之后矩阵运算的方便。算是 Andrew 给我们的一个小小的经验吧。而所有训练样本的输出 Y 也组成了一维的行向量,写成矩阵的形式后,它的维度就是(1,m)。

二、逻辑回归 Logistic Regression

接下来我们就来介绍如何使用逻辑回归来解决二分类问题。逻辑回归中,预测值 $\hat h=P(y=1\ |\ x)$ 表示为 1 的概率,取值范围在 [0,1] 之间。这是其与二分类模型不同的地方。使用线性模型,引入参数 w 和 b。权重 w 的维度是($n_x$,1),b 是一个常数项。这样,逻辑回归的线性预测输出可以写成:

$\hat y = w^Tx+b$

值得注意的是,很多其它机器学习资料中,可能把常数 b 当做 $w_0$ 处理,并引入$x_0=1$。这样从维度上来看,x 和w 都会增加一维。但在本课程中,为了简化计算和便于理解,Andrew 建议还是使用上式这种形式将 w 和 b 分开比较好。

上式的线性输出区间为整个实数范围,而逻辑回归要求输出范围在[0,1]之间,所以还需要对上式的线性函数输出进行处理。方法是引入 Sigmoid 函数,让输出限定在[0,1]之间。这样,逻辑回归的预测输出就可以完整写成:

$\hat y = Sigmoid(w^Tx+b)=\sigma(w^Tx+b)$

Sigmoid函数是一种非线性的S型函数,输出被限定在[0,1]之间,通常被用在神经网络中当作**激活函数(Activation function)**使用。Sigmoid 函数的表达式和曲线如下所示:

$Sigmoid(z)=\frac{1}{1+e^{-z}}$

image.png

从Sigmoid函数曲线可以看出,当z值很大时,函数值趋向于1;当z值很小时,函数值趋向于0。且当z=0时,函数值为0.5。还有一点值得注意的是,Sigmoid 函数的一阶导数可以用其自身表示:

$\sigma'(z)=\sigma(z)(1-\sigma(z))$

这样,通过Sigmoid函数,就能够将逻辑回归的输出限定在[0,1]之间了。

三、逻辑回归的代价函数 Logistic Regression Cost Function

逻辑回归中,w 和 b 都是未知参数,需要反复训练优化得到。因此,我们需要定义一个cost function,包含了参数w和 b。通过优化 cost function,当 cost function 取值最小时,得到对应的 w 和 b。

提一下,对于 m 个训练样本,我们通常使用上标来表示对应的样本。例如 $(x^{(i)},y^{(i)})$ 表示第 i 个样本。

如何定义所有m个样本的 cost function 呢?先从单个样本出发,我们希望该样本的预测值 $\hat y$ 与真实值越相似越好。🚨 我们把单个样本的 Cost function 用 Loss function 损失函数来表示,根据以往经验,如果使用平方错误(squared error)来衡量,如下所示:

$L(\hat y,y)=\frac12(\hat y-y)^2$

但是,对于逻辑回归,我们一般不使用平方错误来作为 Loss function。原因是这种Loss function一般是 non-convex 非凸优化的。non-convex 函数在使用梯度下降算法时,容易得到局部最小值(local minumum),即局部最优化。而我们最优化的目标是计算得到全局最优化(Global optimization)。因此,我们一般选择的 Loss function 应该是 convex 的

Loss function 的原则和目的就是要衡量预测输出 $\hat y$ 与真实样本输出 y 的接近程度。平方错误其实也可以,只是它是non-convex的,不利于使用梯度下降算法来进行全局优化。因此,我们可以构建另外一种 Loss function,且是convex 的,如下所示:

$L(\hat y,y)=-(ylog\ \hat y+(1-y)log\ (1-\hat y))$

我们来分析一下这个 Loss function,它是衡量错误大小的,Loss function 越小越好。

当 y=1 时,$L(\hat y,y)=-log\ \hat y$。如果 $\hat y$ 越接近1,$L(\hat y,y)\approx 0$,表示预测效果越好;如果 $\hat y$ 越接近 0,$L(\hat y,y)\approx +\infty$,表示预测效果越差。这正是我们希望 Loss function 所实现的功能。

当 y=0 时,$L(\hat y,y)=-log\ (1-\hat y)$。如果 $\hat y$ 越接近0,$L(\hat y,y)\approx 0$,表示预测效果越好;如果 $\hat y$ 越接近1,$L(\hat y,y)\approx +\infty$,表示预测效果越差。这也正是我们希望 Loss function 所实现的功能。

因此,这个Loss function能够很好地反映预测输出 $\hat y$ 与真实样本输出y的接近程度,越接近的话,其Loss function值越小。而且这个函数是convex的。上面我们只是简要地分析为什么要使用这个Loss function,后面的课程中,我们将详细推导该Loss function是如何得到的。

还要提一点的是,上面介绍的Loss function是针对单个样本的。那对于m个样本,我们定义Cost function,Cost function是m个样本的 Loss function 的平均值,反映了m个样本的预测输出 $\hat y$ 与真实样本输出y的平均接近程度。Cost function可表示为:

$J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum_{i=1}^m[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]$

Cost function已经推导出来了,Cost function是关于待求系数w和b的函数。我们的目标就是迭代计算出最佳的w和b值,最小化Cost function,让Cost function尽可能地接近于零。

其实逻辑回归问题可以看成是一个简单的神经网络,只包含一个神经元。这也是我们这里先介绍逻辑回归的原因。

四、正向传播 Forward Propagation

整个神经网络的训练过程实际上包含了两个过程:正向传播(Forward Propagation)和反向传播(Back Propagation)

  • 🔹 正向传播是从输入到输出,由神经网络计算得到预测输出的过程(其实就是按顺序求 Cost Function);

  • 🔹 反向传播是从输出到输入,对参数 w 和 b 计算梯度的过程。反向传播之后,得到各个参数的偏导数,就可以使用梯度下降对模型进行优化

image.png

下面,我们用计算图(Computation graph)的形式来理解这两个过程。

举个简单的例子,假如 Cost function 为 J(a,b,c)=3(a+bc) ,包含a,b,c三个变量。我们用 u 表示 bc,v 表示a+u,则 J=3v 。它的计算图可以写成如下图所示:

image.png

计算图中,这种从左到右,从输入到输出的过程就对应着神经网络或者逻辑回归中输入与权重经过运算计算得到Cost function 的正向过程。

五、反向传播 Back Propagation

上一部分介绍的是计算图的正向传播(Forward Propagation),下面我们来介绍其反向传播(Back Propagation),用于快速计算梯所有参数的的偏导数(可用于梯度下降中更新参数)。

还是上个计算图的例子,输入参数有 3 个,分别是 a,b,c。

  • 首先计算 J 对参数 a 的偏导数。从计算图上来看,从右到左,J 是 v 的函数,v是a的函数。则利用求导技巧,可以得到:

    $\frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial a}=3\cdot 1=3$

  • 根据这种思想,然后计算J对参数b的偏导数。从计算图上来看,从右到左,J是v的函数,v是u的函数,u是b的函数。可以推导:

    $\frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\cdot 1\cdot c=3\cdot 1\cdot 2=6$

  • 最后计算J对参数c的偏导数。仍从计算图上来看,从右到左,J 是 v 的函数,v是u的函数,u是c的函数。可以推导:

    $\frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial c}=3\cdot 1\cdot b=3\cdot 1\cdot 3=9$

这样,各个参数的偏导数就求出来了,可用于梯度下降算法对参数进行更新

为了统一格式,在程序代码中,我们使用 da,db,dc 来表示 J 对参数 a,b,c 的偏导数。

image.png

六、逻辑回归的梯度下降 Gradient Descent

反向传播之后,我们就可以使用梯度下降(Gradient Descent)算法来不断优化参数 w 和 b 的值,从而最小化 m 个训练样本的 Cost function,即 J(w,b)。

由于J(w,b)是 convex function,梯度下降算法是先随机选择一组参数w和b值,然后每次迭代的过程中分别沿着w和b的梯度(偏导数)的反方向前进一小步,不断修正w和b。**每次迭代更新w和b后,都能让J(w,b)更接近全局最小值。**梯度下降的过程如下图所示。

image.png

梯度下降算法每次迭代更新,w和b的修正表达式为:

  • $w:=w-\alpha\frac{\partial J(w,b)}{\partial w}$

  • $b:=b-\alpha\frac{\partial J(w,b)}{\partial b}$

上式中,$\alpha$ 是学习因子(learning rate),表示梯度下降的步进长度。$\alpha$ 越大,w和b每次更新的“步伐”更大一些;$\alpha$ 越小,w和b每次更新的“步伐”更小一些。

在程序代码中,我们通常使用 dw 来表示 $\frac{\partial J(w,b)}{\partial w}$,用 db 来表示 $\frac{\partial J(w,b)}{\partial b}$。微积分里, $\frac{df}{dx}$ 表示对单一变量求导数,$\frac{\partial f}{\partial x}$ 表示对多个变量中某个变量求偏导数。

① 基于单个样本的梯度下降

对单个样本而言,逻辑回归 Loss function 表达式如下:

$L(a,y)=-(ylog(a)+(1-y)log(1-a))$

$z=w^Tx+b$,$\hat y = a = Sigmoid(w^Tx+b)=\sigma(w^Tx+b)$

首先,该逻辑回归的正向传播过程非常简单。根据上述公式,例如输入样本x有两个特征 $(x_1,x_2)$,相应的权重w维度也是2,即 $(w_1,w_2)$。则 $z=w_1x_1+w_2x_2+b$,最后的 Loss function 如下所示:

image.png

然后,计算该逻辑回归的反向传播过程,即由 Loss function 计算参数 w 和 b 的偏导数。推导过程如下:

$da=\frac{\partial L}{\partial a}=-\frac ya+\frac{1-y}{1-a}$

$dz=\frac{\partial L}{\partial z}=\frac{\partial L}{\partial a}\cdot \frac{\partial a}{\partial z}=(-\frac ya+\frac{1-y}{1-a})\cdot a(1-a)=a-y$

知道了dz之后,就可以直接对$w_1$,$w_2$和b进行求导了。

$dw_1=\frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w_1}=x_1\cdot dz=x_1(a-y)$

$dw_2=\frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w_2}=x_2\cdot dz=x_2(a-y)$

$db=\frac{\partial L}{\partial b}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial b}=1\cdot dz=a-y$

则梯度下降算法可表示为:

$w_1:=w_1-\alpha\ dw_1$

$w_2:=w_2-\alpha\ dw_2$

image.png

② 基于多个样本的梯度下降

上一部分讲的是对单个样本求偏导和梯度下降。如果有 m 个样本,其Cost function表达式如下:

$J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum_{i=1}^m[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]$

其中,$z^{(i)}=w^Tx^{(i)}+b$,$\hat y^{(i)}=a^{(i)}= Sigmoid(w^Tx^{(i)}+b) = \sigma(z^{(i)})$

Cost function关于w和b的偏导数可以写成和平均的形式:

$dw_1=\frac1m\sum_{i=1}^mx_1^{(i)}(a^{(i)}-y^{(i)})$

$dw_2=\frac1m\sum_{i=1}^mx_2^{(i)}(a^{(i)}-y^{(i)})$

$db=\frac1m\sum_{i=1}^m(a^{(i)}-y^{(i)})$

这样,每次迭代中 w 和 b 的梯度都由 m 个训练样本计算平均值得到。其算法流程图如下所示:

J=0; dw1=0; dw2=0; db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;

经过每次迭代后,根据梯度下降算法,w和b都进行更新:

$w_1:=w_1-\alpha\ dw_1$

$w_2:=w_2-\alpha\ dw_2$

$b:=b-\alpha\ db$

这样经过 n 次迭代后,整个梯度下降算法就完成了。

值得一提的是,在上述的梯度下降算法中,我们是利用for循环对每个样本进行dw1,dw2和db的累加计算最后再求平均数的。在深度学习中,样本数量m通常很大,使用for循环会让神经网络程序运行得很慢。所以,我们应该尽量避免使用for循环操作,而使用矩阵运算,能够大大提高程序运行速度。关于vectorization 向量化的内容我们放在下次笔记中再说。

📚 Reference

相关文章
热点文章
精彩视频
Tags

站点地图 在线访客: 今日访问量: 昨日访问量: 总访问量: