吴恩达——神经网络和深度学习——笔记

本文是吴恩达的神经网络和深度学习课程的基础部分笔记,涵盖了二分分类、logistic回归及其损失函数、梯度下降法在logistic回归中的应用,以及向量化logistic回归的介绍。内容包括神经网络的基础概念、损失函数的定义和梯度下降法的原理,旨在帮助读者理解二元分类问题和初步搭建神经网络。
摘要由CSDN通过智能技术生成

1 神经网络基础

1.1 二分分类

logistic回归是一个用于二分分类的算法

在二分分类问题中,目标是训练出一个分类器


在这里插入图片描述
识别图片中的猫,输出1表示是猫,输出0表示不是猫。

计算机保存一张图片,要保存三个独立矩阵,分别对应图中的红绿蓝三个颜色通道。

假设图片是64x64像素的,就有3个64x64的矩阵,分别对应图中红绿蓝三个像素的亮度。

要将这些像素亮度值放入一个特征向量中,就要把这些像素值提取出来,放入一个特征向量x,如上图表示的那样。

将所有像素放在一列中,所以他的维度就是64x64x3。用n或者 n x n_x nx表示维度。


在这里插入图片描述
x是 n x n_x nx维的特征向量

定义一个矩阵X,它由训练集中的 x ( 1 ) , x ( 2 ) . . . x^{(1)},x^{(2)}... x(1),x(2)...组成,这个矩阵有m列,矩阵的高度为 n x n_x nx

有时候每个输入都是横向排列,而不是列向排列,但是在构建神经网络时,会用左边这种约定方式,会让构建过程简单得多

矩阵X是一个 n x ∗ m n_x*m nxm矩阵

将输出y也放到一个矩阵中,形成一个1维m列的矩阵

用m表示样本数: m = m t r a i n m=m_{train} m=mtrain,用 m t e s t m_{test} mtest表示样本集: m t e s t m_{test} mtest=#test example

一般在python中,X.shape=( n x n_x nx,m),Y.shape=(1,m)

1.2 logistic回归(Logistic Regression)

logistic回归是一种学习算法,用于监督学习中输出标签y为0和1时,是一种二元分类问题


在这里插入图片描述
给一个输入特征X,他可能是一个猫图,用来识别他是不是一个猫。你需要一个算法,可以给出一个预测值,用 y ^ \hat{y} y^表示。正式的说我们希望y帽表示一个概率,当输入特征X满足条件时,y就是1

在这里插入图片描述
已知特征向量X是一个 n x n_x nx维的。我们有参数w也是 n x n_x nx维的向量,b是一个实数。我们可以让输出的预测值 y ^ \hat{y} y^= w T w^T wT+b,但是 y ^ \hat{y} y^是一个概率值,属于0-1之间,因此我们需要额外操作

在这里插入图片描述
我们让 y ^ \hat{y} y^等于sigmoid函数作用到 ( w T + b ) (w^T+b) wT+b这个量上,这样的话, y ^ \hat{y} y^就是一个介于0-1之间的概率值了。 s i g m o i d ( z ) = 1 / ( 1 + e ( − z ) ) sigmoid(z)=1/(1+e^{(-z)}) sigmoid(z)=1/(1+e(z)),分析一下,如果z过大, y ^ \hat{y} y^就约等于1,如果z过小, y ^ \hat{y} y^就约等于0

1.3 logistic回归损失函数

为了训练logistic回归模型的参数w和b,需要定义一个成本函数

在这里插入图片描述
为了让模型学习调整参数,需要给一个m个样本的训练集,我们想在训练集中找到参数w和b,以此来得到输出

对训练中的预测值,我们将它写成 y ^ ( i ) \hat{y}^{(i)} y^(i),并且希望他接近于在训练集中的 y ( i ) y^{(i)} y(i)的值

我们用上标(i)来指明数据,表示x,y等等和第i个训练样本有关


损失函数(Loss function),或者叫误差函数,他们可以用来衡量算法的运行情况,损失函数是基于单个样本


在这里插入图片描述
结果表明我们可以用上面这个式子作为损失函数,但通常在logistic回归中,大家都不这么做。因为我们在学习这些参数的时候,会发现之后讨论的优化问题会变成非凸的,最后会得到多个局部最优解。梯度下降法可能找不到全局最优值。我们通过定义这个损失函数来衡量你的预测输出值y帽和y的实际值有多接近。


在这里插入图片描述
实际上我们用上面这个图片作为损失函数,他为什么能起作用呢,分析一下。

y ( i ) y^{(i)} y(i)为1时, L = − l o g ( y ^ ( i ) ) L=-log(\hat{y}^{(i)}) L=log(y^(i)),为了让L尽可能小,就要使 y ^ ( i ) \hat{y}^{(i)} y^(i)尽可能大,而 y ^ ( i ) \hat{y}^{(i)} y^(i)是一个概率值,不可能超过1,所以就要使 y ^ ( i ) \hat{y}^{(i)} y^(i)接近1。

y ( i ) y^(i) y(i)为0时,同理解释。

这个损失函数是在单个训练样本中定义的。


损失函数是基于单个样本,要实现整体样本就要定义成本函数,在这个过程中,要找到合适的参数w和b让J尽可能小
在这里插入图片描述
在这里插入图片描述

1.4 梯度下降法

在这里插入图片描述
首先假设没有b,只有w。重复执行 w : = w − α ( d J ( w ) d w ) w:=w-α(\cfrac{dJ(w)}{dw}) w:=wα(dwdJ(w))其中α代表学习率,他控制着每一次迭代 d J ( w ) d w \cfrac{dJ(w)}{dw} dwdJ(w)是一个导数,表示曲线的斜率。不管导数大于还是小于零,最终结果总是越来越接近最小值。

上图中只给了一个w,实际的logistic函数是一个含有w和b的函数


在这里插入图片描述
上图的两个式子是实际更新参数时进行的操作。

在代码编写中我们会用 d w dw dw表示导数 d J ( w , b ) d w \cfrac {dJ(w,b)}{dw} dwdJ(w,b),用 d b db db表示导数 d J ( w , b ) d b \cfrac{dJ(w,b)}{db} dbdJ(w,b)

1.5 logistic回归中的梯度下降法

在这里插入图片描述

1.6 m个样本的梯度下降

在这里插入图片描述

1.7 向量化logistic回归

在这里插入图片描述
若有m个样本,若是一个一个非向量化对其进行操作,就会非常浪费时间。因此我们对其向量化

  1. 我们将所有x特征向量放入矩阵X中
  2. 定义一个1维m列的z向量
  3. 见图
  4. 用一行代码写出所有过程:z = np.dot(w.T,x)+b。在这里,虽然只有一个b,但是放到python中,它会自动变成一个1维m列的向量,这个过程叫做广播
  5. 同理

1.8 向量化logistic回归的梯度输出

在这里插入图片描述


原先我们是这样做的:
在这里插入图片描述


现在我们可以这样做:
在这里插入图片描述


值得注意的是,上面我们已经对一次迭代去掉了for循环,虽然我们提倡尽量不要用for循环,但如果我们要进行多次迭代,就不得不对其进行for循环

2 浅层神经网络

2.1 神经网络表示

在这里插入图片描述
输入层和输出层都可以被看到,而隐藏层中的数据我们是看不到的

输出层是对 y ^ \hat{y} y^ 值的预测

上面的神经网络人们一般称为双层神经网络,因为没有将输入层算进去,只算上了隐藏层和输出层

在这里插入图片描述

2.2 计算神经网络的输出

在这里插入图片描述

2.3 多个例子中的向量化

在这里插入图片描述
将一组输入归纳为X,如果有n组该怎么做,如上图。有n组后,我们就要for循环n遍上图的四个公式,这样显得太过复杂


在这里插入图片描述
将n组输入特征向量化为X,如3

将四个公式向量化,如1

其中 Z [ 1 ] Z^{[1]} Z[1], A [ 1 ] A^{[1]} A[1]的向量化如2。 Z [ 2 ] Z^{[2]} Z[2], A [ 2 ] A^{[2]} A[2]也是同理。对于2,横向对应了不同的训练样本,从左到右扫的时候,就扫过了整个训练集。竖向指标就对应了神经网络里的不同节点

2.4 激活函数

在这里插入图片描述
大部分场合,我们都会将 σ \sigma σ 函数替换成 g 函数,但在二分分类中有一个例外。输出层我们用 σ \sigma σ 函数,这是因为 σ \sigma σ 函数范围在(0,1),而 g 函数的取值范围是(-1,1),所以可以将 g 用在隐藏层, σ \sigma σ 用在输出层


在这里插入图片描述
g 函数和 σ \sigma σ 函数都有一个缺点,就是 z 特别大的时候,这个函数的斜率可能就很小。这会导致一个问题就是拖慢梯度下降算法

选择激活函数的一条经验法则就是:

  • 如果输出值是(0,1),比如二分分类,就选择 σ \sigma σ 函数
  • 然后其余大部分都选择ReLU函数,虽然也有人会选择 g 函数
  • 实践中,我们根据实际情况选择合适的激活函数

3 深层神经网络

3.1 核对矩阵的维数

在这里插入图片描述
在这里插入图片描述

3.2 搭建深层神经网络块

在这里插入图片描述
在这里插入图片描述
这是神经网络中的计算过程。首先正向传播,计算从 a [ 0 ] a^{[0]} a[0] a [ l ] a^{[l]} a[l]。在这个过程中会缓存 z [ 1 ] z^{[1]} z[1], w [ 1 ] w^{[1]} w[1], b [ 1 ] b^{[1]} b[1] z [ l ] z^{[l]} z[l], w [ l ] w^{[l]} w[l], b [ l ] b^{[l]} b[l]的值。然后反向传播,计算从 d a [ l ] da^{[l]} da[l] d a [ 1 ] da^{[1]} da[1]的值,同时在每一步会计算 d w [ l ] dw^{[l]} dw[l], d b [ l ] db^{[l]} db[l] d w [ 1 ] dw^{[1]} dw[1], d b [ 1 ] db^{[1]} db[1]的值。最后计算出最终的 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l]的值

3.3 前向和反向传播

前向传播:
在这里插入图片描述
反向传播:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值