深度学习笔记(二)Logistic Regression 逻辑回归

620 阅读5分钟

一、Binary Classificatioin(二分分类算法)

(一)图像的表示方法

引入:给你一幅图片,识别出是否是猫(1:cat vs 0:non cat)。 在这里插入图片描述

原理:将二维图像表示为三原色(即red、green、blue),每一个原色可以用64×6464 \times 64的矩阵表示出来,在每一个像素点位置叠加,从而得到每个像素点的颜色。 在这里插入图片描述

很容易知道,1或0作为输出yy,而三原色矩阵中的元素作为输入xx。 于是便产生了问题:怎样存储这64×64×364 \times 64 \times 3个数字? 答案很简单,用(64×64×3)×1(64 \times 64 \times 3) \times 1的特征向量存储,从红到绿到蓝依此遍历元素,向量维度为nx=12288.n_x=12288.

x=[255231...255134...255134...].x=\left[ \begin{matrix} 255\\231\\ ... \\255\\134\\...\\255\\134\\... \end{matrix} \right].

(二)符号表示方法(Notation)

(x,y)(x,y)为单独样本,xRnx,y{0,1}.x \in R^{n_x},y \in \{0,1\}. mm个训练样本:{(x(1),y(1))(x(2),y(2))...(x(m),y(m))}.\{(x^{(1)},y^{(1)})、(x^{(2)},y^{(2)})、...、(x^{(m)},y^{(m)})\}. 为更紧凑地表示出训练集,用矩阵的形式囊括:

X=[..............................x(1)x(2)x(3)...x(m)..............................].X=\left[ \begin{matrix} ... & ... & ... & ... & ...\\ ... & ... & ... & ... & ... \\ x^{(1)} & x^{(2)} & x^{(3)} & ... & x^{(m)} \\ ... & ... & ... & ... & ... \\... &...&...&...&...\end{matrix} \right].

其中,列数mm是样本数量,行数nxn_x是每个输入向量的维度。 注意!在深度学习中,我们通常采用如上列堆叠的方式,该约定方式可以让构建过程更简单。

xRnx×m.x \in R^{n_x \times m}. 在python编程中,X.shape = (n_x, m)

同理,将标签yy放入列中,定义如下: Y=[y(1)y(2)y(3)...y(m)].Y=\left[ \begin{matrix} y^{(1)} & y^{(2)} & y^{(3)} & ... & y^{(m)} \end{matrix} \right]. yR1×m.y \in R^{1\times m}. 在python编程中,Y.shape = (1, m)

符号表示方法小结:如果用好的惯例符号表示,能够将不同训练样本的数据联系起来。

三、Logistic回归基础知识

引入:以上一篇笔记中“判断是否是猫”的例子中,当给出输入xx时,我们希望得到一个概率结果,即是“是猫的概率有多大?” 即求解: y^=P{y=1x}.\widehat{y}=P\{y=1|x\}. 已知: xRnx.x\in R^{n_x}. 参数: wRnx,bR.w\in R^{n_x},b\in R. 从而得到输出结果:z=wT+b.z=w^T+b. 但是,这个关于xx的线性函数并不能将结果映射到[0,1][0,1]区间内,即不能表达概率取值。 所以,在Logistic回归中,我们将sigmoidsigmoid函数作用到wT+bw^T+b上,则有, y^=sigmoid(z).\widehat{y}=sigmoid(z).

sigmoid(z)=11+ez.sigmoid(z)=\frac{1}{1+e^{-z}}.

在这里插入图片描述 注:后文的参数w/bw/b的表示中,我们将这两个参数分开处理,而不采用将w/bw/b写在同一个参数向量中的方法。

四、逻辑回归的cost function(成本/代价函数)

我们需要通过给出的mm个样本的训练集来学习,找到最适合的参数w/bw/b,得到输出:y^(i)y(i).\widehat{y}^{(i)} \approx y^{(i)}. 定义loss(error) function损失/误差函数: L(y^,y)=12(y^y)2.L(\widehat{y},y)=\frac{1}{2}(\widehat{y}-y)^2. 但是,在逻辑回归中,不建议用如上的损失函数,因为学习参数时,讨论问题会变成非凸,那么对于梯度下降法来说就不好用(找到多个局部最优解但是可能找不到全局最优) 所以,我们定义了如下损失函数: L(y^,y)=(ylogy^+(1y)log(1y^)).L(\widehat{y},y)=-(ylog\widehat{y}+(1-y)log(1-\widehat{y})). 为什么选择这个函数作为损失函数?下面的式子可以解释原因: 在这里插入图片描述 简单总结即是:

  • y=1y=1时,y^(i)1\widehat{y}^{(i)} \to 1使得L(y^,y)L(\widehat{y},y)最小;
  • y=0y=0时,y^(i)0\widehat{y}^{(i)} \to 0使得L(y^,y)L(\widehat{y},y)最小;

以上的损失函数衡量了单个样本上的表现,现在定义cost function成本函数来衡量在整个样本上的表现: J(w,b)=1mi=1mL(y^(i),y(i)).J(w,b)=\frac{1}{m}\sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)}).

J(w,b)=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))].J(w,b)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log\widehat{y}^{(i)}+(1-y^{(i)})log(1-\widehat{y}^{(i)})].

  • loss损失函数:单个样本的表现
  • cost成本函数:整个样本的表现

五、Gradient Descent(梯度下降法)

总体成本函数: J(w,b)=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))].J(w,b)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log\widehat{y}^{(i)}+(1-y^{(i)})log(1-\widehat{y}^{(i)})].wbw和b放在两个坐标轴上,则J(w,b)J(w,b)即是函数图像上的一个点,我们需要找到的点就是图像的最低点,如下: 在这里插入图片描述 成本函数是一个凸函数,所以不管怎样初始化参数,最终都应该达到一个大致相同的点。 这里我们采用的方法是“梯度下降法”。 梯度下降法:从初始点开始,朝最陡的下坡方向走一步(尽可能快得往下走),这便是梯度下降的第一次迭代过程。继续迭代,最终希望能收敛到全局最优或接近全局最优。 在这里插入图片描述

为了更直观地展示梯度下降法,以wwJ(w)J(w)为例画出二维平面坐标系,要做的工作是不断更新ww使得J(w)J(w)达到最小值。 在这里插入图片描述

w:=wαdJ(w)dw.w :=w-\alpha\frac{d J(w)}{dw}. 其中,式子中的:=符号表示更新变量值,α\alpha是学习率。在编程中,通常将dJ(w)dw\frac{d J(w)}{dw}写作dwdw,即上式可简化为: w:=wαdw.w :=w-\alpha dw. 于是接着分析J(w,b)J(w,b)中的参数更新,有如下式子: w:=wαJ(w,b)w.w:=w-\alpha \frac{\partial J(w,b)}{\partial w}.

b:=bαJ(w,b)b.b:=b-\alpha \frac{\partial J(w,b)}{\partial b}. 同样的,编程时J(w,b)w\frac{\partial J(w,b)}{\partial w}写作dwdwJ(w,b)b\frac{\partial J(w,b)}{\partial b}写作db.db.

六、逻辑回归中的梯度下降

z=wTx+by^=a=σ(z)=11+ezL(a,y)=(ylog(a)+(1y)log(1a))z=w^Tx+b\\\widehat{y}=a=\sigma(z)=\frac{1}{1+e^{-z}}\\L(a,y)=-(ylog(a)+(1-y)log(1-a)) 假设样本2个特征x1,x2x_1,x_2,同时存在参数w1,w2,b.w_1,w_2,b. 在这里插入图片描述 根据计算图的反向传播算法(链式求导法则),我们得到如下计算结果: da=L(a,y)da=ya+1y1adz=dL(a,y)dz=dL(a,y)dadadzda=\frac{L(a,y)}{da}=-\frac{y}{a}+\frac{1-y}{1-a}\\ dz=\frac{dL(a,y)}{dz}=\frac{dL(a,y)}{da}\frac{da}{dz} 那么问题来了!这个问题也是课程中大家积极讨论的地方——dadz\frac{da}{dz}怎么求解? a=σ(z)=11+ezdadz=ez(1+ez)2=a(1a)a=\sigma(z)=\frac{1}{1+e^{-z}}\\ \Rightarrow \frac{da}{dz}=\frac{e^{-z}}{(1+e^{-z})^2}=a(1-a) 其实就是涉及到将关于自变量z的分式代换回关于因变量a的分式。 最终计算得到: dz=ay.dz=a-y. 紧接着往左计算, dw1=x1dzdw2=x2dzdb=dzdw_1=x_1dz\\dw_2=x_2dz\\db=dz 得出上述导数值后,即可实现单个样本实例的一次梯度更新步骤,根据梯度下降法中参数的调整方法使得结果趋近于全局最优。 w1:=w1αdw1w1:=w2αdw2b:=bαdbw_1:=w_1-\alpha dw_1\\w_1:=w_2-\alpha dw_2\\b:=b-\alpha db 注意:更新参数值用:=符号表示。

然而我们知道,训练模型时不仅仅只有一个训练样本,当有mm个样本的整个训练集时,我们将如何应用逻辑回归的梯度下降法?

七、m个样本的梯度下降

将逻辑回归中的梯度下降应用到mm个样本中,其实就是用一个大循环对mm个样本进行参数计算,进而求和求平均得到全局梯度值。 在这里插入图片描述

算法伪代码

在这里插入图片描述

算法的缺点及改进

  • 算法使用两个完全显式forfor循环可能会使算法低效——1到mm个样本的计算过程、遍历所有特征(dw1,...,dwn,dw_1,...,dw_n, 维度是nxn_x
  • 完全不用完全显式for循环,能处理更大的数据集。有一门向量化技术,可以摆脱显式forfor循环!