吴恩达Deeplearning.ai之1-2:神经网络基础

这段时间看了吴恩达老师的deeplearning.ai课程,为了以后回顾相关知识点,特此做了课程的笔记。笔记按照吴恩达老师的教学视频的章节进行记录。这篇笔记是关于神经网络基础的,主要内容如下:

目录

1. 二分类(Binary Classification):

2. 逻辑回归(Logistic Regression):

3. 逻辑回归的代价函数(Logistic Regression cost fuction):

4. 梯度下降法(Gradient Descent):

5. 逻辑回归中的梯度下降(Logistic Regression Gradient Descent):

6. m个样本的梯度下降(Gradient descent on m examples):

7. 向量化(Vectorization):

8. 向量化逻辑回归(Vectorizing Logistic Regression):

 9. 逻辑回归代价函数的解释(Explanation of logistic regression cost function): 

1. 二分类(Binary Classification):

给定特征向量(矩阵)X,预测输出标签y0还是1的分类,称作二分类。比如输入一张动物的图片,判断这张图片中的动物是否是猫,若是猫,输出1,若不是猫,输出0

                                                       吴恩达Deeplearning.ai之1-2:神经网络基础_第1张图片

这就是典型的二分类问题。在本小节中,吴恩达老师主要讲解了几个Notation,如下:

样本:(x,y),其中x\in R^{n},y=\left\{0,1\right\}x属于n维空间,表示样本xn个特征,y表示0,1标签

样本集:\left\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\right\},表示样本集中有m个样本

在神经网络中,输入(特征)矩阵X是按行堆叠而不是按列堆叠的,即输入矩阵X如下所示:

                                              吴恩达Deeplearning.ai之1-2:神经网络基础_第2张图片       

显然,输入矩阵X的形状为 n*m,在python中可以用语句X.shape来查看矩阵X的维度。输出标签向量Y的表示如下:

                                                      Y = \left\{y^{(1)},y^{(2)},...,y^{(m)}\right\}      

输出标签向量Y的形状为1*m,同样可以用语句Y.shape来查看向量Y的维度。

2. 逻辑回归(Logistic Regression):

逻辑回归是常见的二分类模型,它的输出不是具体的0,1标签,而是一个概率,即0-1之间的一个数值,比如说,我想要用逻辑回归预测明天是不是要下雨,它的输出是明天下雨的概率,而不是{下雨,不下雨}。想要让预测输出的值在0-1,引入了Sigmoid函数,它的函数图像如下:

                                                             吴恩达Deeplearning.ai之1-2:神经网络基础_第3张图片

于是就有:

                                                             

其中   

从Sigmoid的函数表达式以及函数图像可以看到,当自变量z是正无穷是,输出无限接近1;当自变量z是负无穷时,输出无限接近于0,当自变量z0时,输出为0.5。这样,Sigmoid函数把定义域在[-\infty,\infty]的数映射到值域[0,1]上。

Sigmoid函数的一阶导数是经常考察的问题,它的一阶导数是它本身的函数,即:

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

可以看到,当\sigma(z)1-\sigma(z)相等时,\sigma'(z)的值最大,即当z=0时,一阶导数\sigma'(z)取得最大值0.25,导数为原函数的0.25倍,随着迭代次数的上升,\sigma'(z)越来越小,最终接近于0,最终产生梯度消失的现象。

3. 逻辑回归的代价函数(Logistic Regression cost fuction):

给定样本集\left\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\right\},我们想让预测值\hat{y}^{(i)}尽量接近实际值y^{(i)},即\hat{y}^{(i)}\approx y^{(i)}。那么我们需要一个损失函数来度量\hat{y}^{(i)}y^{(i)}之间的差值,在线性回归中,我们通常使用平方误差来作为损失函数,即:

                                                                               L(\hat{y},y) = \frac{1}{2}(y-\hat{y})^{2}

但是在逻辑回归中通常不使用平方误差作为损失函数,这是因为平方误差函数是非凸函数,在用梯度下降进行优化时,一般会得到局部最优解而不是全局最优解。因此在逻辑回归中一般使用交叉熵作为损失函数,如下:

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

这样逻辑回归的优化问题就变成了凸优化问题,通过梯度下降可以得到全局最优解。而我们建模训练的目的就是找到一组参数使得损失函数L(y,\hat{y})最小。但是损失函数是针对单样本点。对于全集多样本点,我们需要定义代价函数,即对所有样本点的损失函数求和取平均,如下:

                                    J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y^{(i)}},y^{(i)}) = -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}log\hat{y^{(i)}}+(1-y^{(i)})log(1-\hat{y^{(i)}})

可以看到,代价函数J(w,b)是参数w,b的函数,而我们就是要求得一组能够使代价函数最小的参数。那么怎么去求解呢,需要用到梯度下降的优化算法。

4. 梯度下降法(Gradient Descent):

梯度是机器学习中非常重要的概念,我们在高数中对梯度的定义是这样的:设函数f(x,y)在平面区域D内具有一阶连续偏导数,则对每一点P(x_{0},y_{0})\in D都可以定出一个向量f_{x}(x_{0},y_{0})\vec{i}+f_{y}(x_{0},y_{0})\vec{j}称为f(x,y)在P点处的梯度,记作\vec \bigtriangledown f(x_{0},y_{0})。梯度的负方向是函数下降最快的方向。用一张比较经典的图片来描述梯度下降:

                                                   吴恩达Deeplearning.ai之1-2:神经网络基础_第4张图片

在曲面上随机找一个初始点,沿着这个初始点向下走(类比于下山的过程),直到走到最低位置处。上图中由于J(\theta_{0},\theta_{1})是非凸函数,所以最终会达到多个局部最优点,如上图中的两条路径。

梯度下降法是常用的最小化代价函数的方法,并可迭代求得使得代价函数最小的参数w,b。每次迭代式如下:

                                                                       w := w - \alpha\frac{\partial J}{\partial w}

                                                                         b := b - \alpha\frac{\partial J}{\partial b}

其中:=符号表示更新,\alpha为学习速率,取值在(0,1)之间。在程序编写中,常用dw表示\frac{\partial J}{\partial w},用db表示\frac{\partial J}{\partial b}。那么梯度下降为什么可以求得函数的最小值呢?

                                          吴恩达Deeplearning.ai之1-2:神经网络基础_第5张图片

5. 逻辑回归中的梯度下降(Logistic Regression Gradient Descent):

对于单个样本,有以下定义:

                                                                       z = w^{T}x + b 

                                                                       \hat{y} = a = \sigma(z)

                                                L(a,y) = -(yloga+(1-y)log(1-a))

假设样本有2个特征,那么逻辑回归计算图如下图:

                                       吴恩达Deeplearning.ai之1-2:神经网络基础_第6张图片

反向传播:

                                 吴恩达Deeplearning.ai之1-2:神经网络基础_第7张图片

得到了dw_{1},dw_{2},db后就可以进行梯度下降了:

                                                                  w_{1} := w_{1} - \alpha dw_{1}

                                                                  w_{2} := w_{2} - \alpha dw_{2}

                                                                       b := b - \alpha db

这样就完成了一次迭代。

6. m个样本的梯度下降(Gradient descent on m examples):

对于m个样本,有以下定义:

                                                                    z^{(i)} = w^{T}x^{(i)} + b

                                                                   \hat{y^{(i)}} = a^{(i)} = \sigma(z^{(i)})

                          J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y^{(i)}},y^{(i)}) = -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}log\hat{y^{(i)}}+(1-y^{(i)})log(1-\hat{y^{(i)}})  

同样假设各个样本都只有2个特征,那么各个参数的偏导数也可以写成各个样本点求和取平均的形式:

                                                                 dw_{1} = \frac{1}{m}\sum_{i=1}^{m}x_{1}^{(i)}(a^{(i)}-y^{(i)})

                                                                 dw_{2} = \frac{1}{m}\sum_{i=1}^{m}x_{2}^{(i)}(a^{(i)}-y^{(i)})

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

在程序实现中,我们可以使用两个for循环对所有的样本进行一次梯度下降,其中外循环表示样本数,内循环表示每个样本的特征数。但是for循环的时间复杂度太高,不适合用于数据量巨大的深度学习,这就引入了向量化。

7. 向量化(Vectorization):

若对含有m个样本的数据集向量化会得到:

特征(输入)矩阵XX.shape=(n,m)

参数向量WW.shape = (n,1)

偏置bb.shape = (1,m)

输出向量YY.shape = (1,m)

那么m个样本的线性输出为:                  Z = W^{T}X + b

接下来我们比较向量化和for循环在计算速度上的差距:

                                  吴恩达Deeplearning.ai之1-2:神经网络基础_第8张图片

可以看到for花费的时间大约是向量化花费时间的500倍。

8. 向量化逻辑回归(Vectorizing Logistic Regression):

python实现向量化的代码:

import numpy as np
Z = np.dot(w.T,X)+b
A = sigmoid(Z)

因为A = [a^{(1)},a^{(2)},...,a^{(m)}], Y = [y^{(1)},y^{(2)},...,y^{(m)}],根据dz^{(i)} = a^{(i)}-y^{(i)}可得到向量化后的dZ为:

                                               dZ = A-Y=[a^{(1)}-y^{(1)},a^{(2)}-y^{(2)},...,a^{(m)}-y^{(m)}]                                                                   db可向量化为:        db = \frac{1}{m}\sum_{i=1}^{m}dz^{(i)}

python代码为:

db = np.sum(dZ)/m

 dw可向量化为:       dw = \frac{1}{m}XdZ^{T}

python代码为:

dw = np.dot(X,dZ.T)/m 

 一次迭代梯度下降算法的代码实现:

import numpy as np
Z = np.dot(w.T,X)+b
A = sigmoid(Z)
dZ = A - Y
dw = np.dot(X,dZ.T)/m
db = np.sum(dZ)/m
w = w - alpha*dw
b = b - alpha*db

 9. 逻辑回归代价函数的解释(Explanation of logistic regression cost function): 

我们知道预测输出\hat{y}是Sigmoid函数,其表达式如下:

                                                                          \hat{y} = \frac{1}{1+e^{-(w^{T}x+b)}}

对上面的式子做变换得到:

                                                                         log\frac{\hat{y}}{1-\hat{y}} = w^{T}x+b

我们假设P(y=1|x) = \hat{y}P(y=0|x) = 1-\hat{y},那么上面的式子可以变为:

                                                                        log\frac{P(y=1|x) }{P(y=0|x) } = w^{T}x+b

假设数据集中有m个样本,那么得到似然函数:

                                                                               \prod_{i= 1}^{m}\hat{y}^{y_{i}}(1-\hat{y})^{1-y_{i}}               

对数似然函数为:

                                                        L(w,b) = \sum_{i=1}^{m}y^{(i)}log\hat{y^{(i)}}+(1-y^{(i)})log(1-\hat{y^{(i)}})        

我们要最大化似然函数,即通过max \ L(w,b)求得参数w^{\star},b^{\star}  ,等价于通过min\ J(w,b)求得参数 w^{\star},b^{\star},其中J(w,b)为代价函数,其表达是为:

                                      J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y^{(i)}},y^{(i)}) = -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}log\hat{y^{(i)}}+(1-y^{(i)})log(1-\hat{y^{(i)}})                                              

你可能感兴趣的:(深度学习)