吴恩达《神经网络与深度学习》学习笔记-第二周

2.1 二分类(Binary Classification)

符号定义
𝑥:表示一个 n x n_{x} nx维数据,为输入数据,维度为 ( n x , 1 ) (n_{x},1) (nx,1)
𝑦:表示输出结果,取值为 (0,1)
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)):表示第 𝑖组数据,可能是训练 数据,也可能是测试数据,此处默认为训练数据;

X由输入向量组成,是一个规模为 n x n_{x} nx乘以 𝑚的矩阵,Y为训练的输出值,是一个规模为 1乘以 𝑚的矩阵。在使用python实现时,一般使用X.shape = ( n x n_{x} nx,m),Y.shape = (1,m)

2.2 逻辑回归 (Logistic Regression)

我们用 𝑤来表示逻辑回归的参数,这也是一个 𝑛𝑥维向量(因为 𝑤实际上是特征权重,维度与特征向量相同),参数里面还有 𝑏,这是一个实数(表示偏差)。所以给出输入 𝑥以及参数 𝑤和 𝑏之后,我们让 y ^ = w T x + b \hat{y}=w^{T}x+b y^=wTx+b
为了将线性函数转为非线性,输出应该是 y ^ = σ ( w T + b ) \hat{y}=\sigma (w^{T}+b) y^=σ(wT+b)
下图是 sigmoid 函数的图像
在这里插入图片描述

2.3 逻辑回归的代价函数( Logistic Regression Cost Function

为了训练逻辑回归模型的参数参数𝑤和参数 𝑏我们,需要一个代价函数,通过训练代价函数来得到参数 𝑤和参数 𝑏。先看一下逻辑回归的输出函数:
在这里插入图片描述
为了让模型通过学习调整参数,你需要给予一个𝑚样本的训练集,这会让你在训练集上找到参数 𝑤和参数 𝑏,,来得到你的输出。

损失函数:
损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:𝐿( y ^ , y \hat{y},y y^,y).
我们在逻辑回归中用到的损失函数是: L ( y ^ , y ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(\hat{y},y)=-ylog(\hat{y})-(1-y)log(1-\hat{y}) L(y^,y)=ylog(y^)(1y)log(1y^)
在这门课中有很多的函数效果和现在这个类似,就是如果𝑦等于 1,我们就尽可能让 y ^ \hat{y} y^大,如果 𝑦等于 0,我们就尽可能让 y ^ \hat{y} y^ 变小。

需要定义一个算法的代价函数,算法的代价函数是对 𝑚个样本的损失函数求和然后除以 𝑚:
在这里插入图片描述

2.4 梯度下降法 ( Gradient Descent )

梯度下降法可以在测试集上,通过最小化代价函数(成本函数) 𝐽(𝑤,𝑏)来训练的参数 𝑤和 𝑏,形象化说明如图所示:
在这里插入图片描述
由于逻辑回归的代价函数(成本函数) 𝐽(𝑤,𝑏)特性,我们必须定义代价函数(成本函数) 𝐽(𝑤,𝑏)为凸函数。初始化 𝑤和 𝑏,然后朝最陡的下坡方向走一步,不断地迭代,直到走到全局最优解或者接近全局最优解的地方。
在这里插入图片描述
即:
在这里插入图片描述
其中,𝑎 表示学习率( learning rate),用来控制步长 step),即向下走一步的长度。

2.5 导数( Derivatives)

2.6 更多的导数例子( More Derivative Examples)

2.7 计算图( Computation Graph)

可以说,一个神经网络的计算,都是按照前向或反向传播过程组织的。首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。后者我们用来计算出对应的梯度或导数。计算图解释了为什么我们用这种方式组织这些计算过程。
下面是一个比逻辑回归更加简单的例子,用于计算函数J(从左向右):
在这里插入图片描述

2.8 使用计算图求导数 Derivatives with a Computation Graph)

流程图为:
在这里插入图片描述
我们要从右向左计算其导数:
在这里插入图片描述
其中用到的公式:
在这里插入图片描述

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

关于单个样本实例的梯度下降算法中参数更新一次的步骤:
在这里插入图片描述

2.10 m 个样本的梯度下降 (Gradient Descent on m Examples)

我们要把上一节中的方法扩展到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=w-alpha*dw
b=b-alpha*db

但是这种计算中出现了两个for循环,第一个 for循环是一个小循环遍历 𝑚个训练样本,第二个 for循环是一个遍历所有特征的 for循环。这会使算法效率很低,因此,我们要使用向量化技术

2.11 向量化 (Vectorization)

向量化是非常基础的去除代码中for循环的艺术。

使用非向量化方法去计算 w T x w^{T}x wTx,需要用如下方式 (python):

z=0
for i in range(n_x)
  z+=w[i]*x[i]
z+=b

而如果使用向量化直接计算:

z=np.dot(w,x)+b

向量化相比于for循环,运行时间大大降低。

2.12 向量化的更多例子( More Examples of Vectorization)

2.11中我们已经向量化了2.10中第一个for循环,本节中可以尝试将2.10中的第二个for循环向量化。

在这里插入图片描述

首先,定义 𝑑𝑤 为一个向量,设置 𝑢=𝑛𝑝.𝑧𝑒𝑟𝑜𝑠(𝑛(𝑥),1),然后使用一个向量操作 d w = d w + x ( i ) d z ( i ) dw=dw+x^{(i)}dz^{(i)} dw=dw+x(i)dz(i),最后得到 𝑑𝑤=𝑑𝑤/𝑚。

在这里插入图片描述



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值