深度学习教程 | 神经网络基础


标题:如何制作一个简单的AI教程网站

简介:

韩信子是一位在人工智能领域有着丰富经验的专家。他分享了他在创建一个简单而有效的AI教程网站方面的经验和技巧。

步骤1:确定目标用户和内容

首先,需要明确你的目标受众是谁以及你打算涵盖的内容类型。这将帮助你决定如何组织和布局页面,并确保内容对用户有价值。

步骤2:选择平台和工具

根据你的需求,可以选择使用WordPress、Wix等在线网站构建器来创建教程网站。这些平台提供了丰富的模板和工具,可以让你快速搭建自己的AI教程网站。

步骤3:设计页面和布局

在搭建网站后,需要进行页面和布局的设计。确保你的界面简洁而易于导航,内容清晰易懂,并且用户能够轻松找到他们想要的信息。

步骤4:编写教程内容

根据你的目标受众和内容类型,开始撰写教程内容。可以使用Markdown或HTML来创建高质量的文档,同时也可以考虑使用可视化工具如Sketch或Adobe XD来进行设计。

步骤5:测试和优化

在完成教程后,需要对网站进行彻底的测试,确保所有的功能正常工作,并且用户体验良好。根据用户反馈进行调整和优化。

总结:

通过遵循上述步骤,你可以创建一个简单而有效的AI教程网站,帮助更多的用户学习和掌握人工智能的知识。

在ShowMeAI前一篇文章《深度学习概论》中,我们对深度学习(Deep Learning)进行了简单介绍,并以房价预测为例讲解了神经网络的基本结构和基础知识。

我们将针对监督学习中的几个典型神经网络进行分析:标准神经网络(Standard NN)、卷积神经网络(CNN)和循环神经网络(RNN)。同时,我们探讨了“结构性数据”与“非结构性数据”这两大类型的数据,并分析了近年来深度学习成为热门的原因,包括数据、计算能力和算法三个方面。

本节内容将重点介绍神经网络的基础:逻辑回归。我们将通过对其模型结构的深入分析,过渡到后续的神经网络模型。此外,我们还将对逻辑回归进行讲解,让大家更好地理解和应用逻辑回归算法。(关于逻辑回归模型,也可以阅读ShowMeAI的文章《图解机器学习 | 逻辑回归算法详解》)

1. 算法基础与逻辑回归

逻辑回归(Logistic Regression)是一种用于二分类的算法。

1.1 二分类问题与机器学习基础

在深度学习和神经网络中,我们经常会遇到二分类问题。什么是二分类?简单来说,就是将一个对象归入两个不同的类别或状态之一。例如,在垃圾邮件检测中,我们可以将其分为“垃圾”和“非垃圾”两种情况。

机器学习的基本原理是通过训练模型来预测未知数据属于哪个类别的概率分布。这个过程通常涉及以下步骤:

1. 筛选特征:从输入数据中挑选出可能影响分类结果的特性。

2. 模型训练:使用选定的特征和历史数据进行训练,以识别与类别相关的关键模式。

3. 测试与评估:用测试集验证模型预测的结果,并对其进行调整优化。

二分类问题在机器学习中的重要性:

1. 可视化直观:由于只有两个结果,可以更直观地展示决策边界及每个类别的分布情况。

2. 代表性广泛:几乎所有的数据科学和数据分析任务都涉及二分类问题,比如垃圾邮件过滤、疾病诊断等。

二分类问题的常见应用场景包括:

- 垃圾邮件识别

- 预测客户是否会购买产品(是否愿意付费)

- 物流配送中的货物目的地预测

通过以上介绍,希望读者能够对逻辑回归有一个清晰的理解,并掌握其在实际应用中的基本步骤。

在图像识别中,我们将图片分为“是猫”和“不是猫”的两类。具体来说,“是猫”这一类被标记为1,而“不是猫”则被标记为0。例如,在一个“图像识别”问题上,判断一张图片是否是猫的过程就是一个典型的二分类问题。

在这个过程中,我们可能遇到两种情况:

1. **非猫 (not cat)**:这张图片不符合“猫”的特征。

2. **猫 (cat)**:这张图片符合“猫”的特征。

通过这样的二分类模型,我们可以帮助计算机从图像中识别出猫。

根据机器学习的视角来看,在我们当前的情境中,“xxx”是一个图像数据。这幅图像是一个彩色图片,它由三个通道组成,分别是红(Red),绿(Green),蓝(Blue)。图像的尺寸被设定为(64, 64, 3)。

这意味着图像的每一像素都被表示为一个三维向量,其中每个维度对应于红色、绿色和蓝色的分量。例如,每个像素值可能是一个三元组 (R,G,B),代表红色、绿色和蓝色的强度。在实际应用中,这些数值通常以灰度值(0-255)来表示。

这个3D向量被解释为一幅64x64的图像,每个像素都是一个这样的颜色分量组合。因此,“xxx”是一个彩色图片,其中包含了大量的颜色信息和丰富的细节。

有些神经网络的输入是二维的图像。我们可以将这些图像展平为一维特征向量,并将其表示为一个列向量,其长度为65536(对于64x64x3大小的彩色图像)。我们通常用n×n_x×n​来表示样本中的数据,其中n是图像尺寸的大小。如果训练样本有mmm张图片,那么我们可以使用一个矩阵来存储这些数据,此时每个样本的数据维度为(n, m)。

### 矩阵XX和矩阵YY

- **矩阵 XX**:

- 行数 `n` x `m`:每个样本 `x(i)` 的特征个数,表示为 `n×m`。

- 列数 `n`:样本总数量。

- **矩阵 YY**:

- 长度为 `(1, m)`:标签数据的维度调整为1维形式。

### 训练样本的逻辑回归

在训练过程中,我们通常希望对样本标签进行规整化。具体步骤如下:

#### 规整化逻辑回归标签YY

1. **调整为1维形态**:

- 将原始二维标签 `YYY` 转换为1维形式。

- 对于每个样本 `x(i)`,其标签信息可以表示为一个向量 `[y_1, y_2, ..., y_n]`。

- **维度调整为 `(1, m)`**:

- 进一步整理为 `(1, m)` 的格式。

通过这一过程,我们可以得到训练数据的逻辑回归标签 `YY`。

逻辑回归是最常见的二分类算法,其包含以下参数:

输入的特征向量:\(x \in R^{n_x}\),其中 \(nx\) 是特征数量。

用于训练的标签:\(y \in 0,1\),表示类别为 0 或 1。

权重:\(w \in R^{n_x}\)。

偏置:\(b \in R\)。

输出计算使用了Sigmoid函数,这是一种非线性的 S 型函数,其输出被限定在 [0,1] 之间。通常情况下,Sigmoid 函数用于神经网络中的激活函数(Activation Function)。

逻辑回归的基本原理是将输入特征向量 \(x\) 和权重向量 \(w\) 相乘并加上偏置 \(b\),然后通过 Sigmoid 函数计算输出值 \(y^=\sigma(wTx+b)\)。这个过程可以理解为一个线性模型加了一层非线性的激活函数。

在逻辑回归中,Sigmoid 函数的作用是将输入的线性组合转换为一个概率范围 [0,1] 之间的输出值。由于 Sigmoid 函数的特性,它使得输出值能够被用来计算分类的概率,从而实现二分类任务的目标。

### 1.3 逻辑回归的损失函数

在讨论损失函数之前,我们先回顾一下sigmoid函数的定义:

\[ s = \sigma(w^Tx + b) = \sigma(z) = \frac{1}{1+e^{-z}}s = \sigma(w^Tx+b)=\sigma(z)=1+e−z1​

直观上看,它是一个S形的函数。在逻辑回归模型中,我们关注的是其输出值s是否接近0或1。

#### 逻辑回归的损失函数

在训练逻辑回归模型时,我们需要定义一个衡量误差的方法,这个方法通常被称为损失函数(loss function)。在单例问题上,这个误差通常是预测值与真实值之间的差距。具体来说,在逻辑回归中,我们希望使预测结果接近实际标签。

损失函数常用的形式之一是交叉熵(Cross Entropy):

\[ L = -\frac{1}{n} \sum_{i=1}^{n}[y_i \log(p_i) + (1-y_i) \log(1-p_i)]L = -\frac{1}{n} \sum_{i=1}^{n}[y_i \log(p_i) + (1-y_i) \log(1-p_i)]L=\frac{-1}{n}\sum_{i=1}^{n} y_i \log p_i + [1-y_i] \log(1-p_i)n​\

其中,\(p\)是逻辑回归模型的预测值,而 \(y\) 是真实标签(通常是 0 或 1)。交叉熵用于衡量预测结果和真实标签之间的差距。

在实际应用中,我们可以使用其他形式的损失函数。例如,对于多分类任务,可以使用 Softmax 函数来生成概率分布,并选择一个损失函数如交叉熵或对数损失。

在机器学习中,损失函数(loss function)用于评估预测结果与真实值之间的差距。通过优化损失函数来调整模型的权重,以使模型更好地拟合样本数据。

对于回归类问题,我们通常使用均方差损失(MSE),其公式如下:

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

其中,\(L\) 表示损失函数,\(\hat{y}\) 是预测值,\(y\) 是真实值。

在逻辑回归中,我们一般不采用平方差损失函数。因为逻辑回归使用对数损失(二元交叉熵损失)会得到非凸的损失函数,它有多个局部最优解,梯度下降可能找不到全局最优值,从而增加优化的难度。

因此,调整为使用对数损失:

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

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

刚才我们提到的是单个训练样本中定义的损失函数,它衡量了在单个训练样本上的表现。我们定义代价函数(Cost Function 或者称作成本函数)为全体训练样本上的表现,即 \(m\) 个样本的损失函数的平均值,反映了 \(m\) 个样本的预测输出与真实样本输出 \(y^{(i)}\) 的平均接近程度。

成本函数的计算公式如下:

\[J(w,b) = \frac{1}{m}\sum_{i=1}^m L(y^{(i)}, y^{(i)})\]

2. 梯度下降法(Gradient Descent)

梯度下降是机器学习中用于优化损失函数的方法。当模型的权重 \(w\) 和偏置 \(b\) 调整时,损失函数会相应地变化。通过计算损失函数对 \(w\) 和 \(b\) 的梯度(即导数),可以确定调整方向和步长,从而更快地接近最优解。

梯度下降算法的基本步骤如下:

1. 初始化模型参数 \(w_0, w_1, \dots, w_n, b\)。

2. 计算损失函数对每个参数的梯度:

- 对于权重 \(w_i\):\[ \frac{\partial J}{\partial w_i} = \frac{1}{m}\sum_{i=1}^m (y^{(i)} - \hat{y}^{(i)})x_i \]

- 对于偏置 \(b\):\[ \frac{\partial J}{\partial b} = \frac{1}{m}\sum_{i=1}^m (y^{(i)} - \hat{y}^{(i)}) \]

3. 根据梯度反向传播算法更新权重和偏置:

- 对于权重 \(w_i\):\[ w_{i+1} = w_i - \alpha \frac{\partial J}{\partial w_i} \]

- 对于偏置 \(b\):\[ b_{j+1} = b_j - \alpha \frac{\partial J}{\partial b} \]

4. 重复步骤2和3,直到达到收敛条件:

- 停止条件可以是损失函数不再下降或参数的变化小于某个阈值。

梯度下降法的关键在于选择合适的步长 \(\alpha\)。太大的步长可能导致模型过度拟合;而太小的步长又会使优化过程变得缓慢且可能需要进行更多的迭代。

通过不断调整权重和偏置,梯度下降法可以找到损失函数最小化的最优解,从而提高模型的预测准确性。

在了解损失函数(Loss Function)和成本函数定义之后,下一步我们需要找到最优的参数 `θ` 值来最小化 `m` 个训练样本的Cost Function。这里用到的方法叫做梯度下降(Gradient Descent)算法。

在数学上,1个函数的梯度(gradient)指出了它的最陡增长方向。也就是说,沿着梯度的方向走,函数增长得就最快。那么沿着梯度的负方向走,函数值就下降得最快。

更详细的最优化数学知识可以阅读 ShowMeAI 文章《图解 AI 数学基础 | 微积分与最优化》

模型的训练目标是寻找合适的 `θ` 以最小化代价函数 `J(J)` 值。我们先假设 `θ` 都是一维实数,则代价函数 `JJJ` 关于 `θ` 的图如下所示:

在上图所示的成本函数JJJ是一个凸函数,并且只有一个全局最低点,这意味着无论我们初始模型参数位于何处,都可以找到最优解。基于梯度下降算法,有以下更新公式:

\[ w := w - \alpha \frac{dJ(w, b)}{dw} \]

其中的α\alphaα为学习率,即每次更新时www的步长。

而成本函数JJJ中对应的参数bbb的更新公式为:

\[ b := b - \alpha \frac{dJ(w, b)}{db} \]

对于神经网络而言,训练过程包含两个阶段:前向传播(Forward Propagation)和反向传播(Back Propagation)。这两个阶段分别对应于输入到输出的路径以及输出到输入的过程。

### 前向传播(Forward Propagation)

前向传播是从输入到输出,由神经网络逐层推算得到预测输出的过程。具体来说:

1. **定义变量**:假设我们的 Cost 函数为 \( J(a, b, c) = 3(a + bc) \),其中 \( a, b, c \) 是三个独立的变量。

2. **中间变量**:为了方便计算,我们可以引入一些中间变量:

- \( uu = b + c \)

- \( vv = a + u \)

3. **最终函数**:将中间变量代入原 Cost 函数,我们得到:

\[

J = 3(vv) = 3(a + u + bc)

\]

### 反向传播(Back Propagation)

反向传播是从输出到输入,基于 Cost Function 对参数 \( w, b \) 计算梯度的过程。这个过程可以表示为:

1. **定义变量**:假设我们的参数 \( w \) 和 \( b \) 是两个独立的变量。

2. **计算损失**:在前向传播过程中得到的输出是:

\[

vv = a + u

\]

3. **反向传播**:为了计算梯度,我们需要从输出到输入逐步计算:

- 首先计算 \( dJ/dvv \)(关于 \( v \) 的导数):

\[

\frac{dJ}{dvv} = 3

\]

- 接着计算 \( dv/vu \)(关于 \( u \) 的导数),注意 \( uu = b + c \),因此有:

\[

\frac{du}{dvv} = -\frac{\partial vv}{\partial uu}

\]

- 最后,我们得到:

\[

dJ/dw = 3 \times dv/vu

\]

### 结合计算图理解

下面我们将前向传播和反向传播的计算过程结合在一个计算图的形式中表示:

1. **输入变量**:\( a, b, c \)

2. **中间变量**:

- \( uu = b + c \)

- \( vv = a + u \)

3. **输出变量**:\( J = 3(vv) \)

### 计算图示例

```

+-----------------+

| a |

+--|---------+-----+-----> vvv

| | | | vv

| +------>| +<---+---

| | |

+-------------+ |

uuu uu

```

在这个图中,前向传播是从 \( a \) 到 \( J = 3(vv) \),而反向传播是通过逐层计算从 \( vv \) 反向推导到 \( J, w, b \) 的梯度。

希望这个例子能帮助你更清晰地理解前向传播和反向传播的过程。

在上图中,我们设a = 5, b = 3, c = 2,则有u = bc = 6, v = a + u = 11, J = 3v = 33。

计算图中的这种从左到右、从输入到输出的过程,对应着神经网络基于xxx和www的前向计算过程。

3.2 反向传播(Back Propagation)

首先,让我们继续解释之前的计算图中关于反向传播的计算过程。在上一个例子中,我们的输入参数包括aaa、bbb和ccc。

② 计算JJJ对参数aaa的偏导数

为了计算这个偏导数,我们需要先确定JJJ与aaa之间的函数关系,然后应用链式法则来推导出这个偏导数的具体公式。具体来说,我们可以将JJJ视为一个包含其他变量的复合函数,其中aaa是该复合函数的一个输入参数。

接下来,我们详细解释这个过程:

首先,我们需要找到JJJ关于aaa的偏导数。在计算过程中,我们通常会使用链式法则,即当某个函数的输出依赖于另一个函数时,其一阶导数(偏导数)也可以通过组合这两个函数的一阶导数来求得。

具体步骤如下:

1. 明确JJJ关于aaa的一阶导数。

2. 确定bbb和ccc对JJJ的影响。

3. 用链式法则计算出JJJ对aaa的偏导数。

通过上述步骤,我们就可以得到JJJ对参数aaa的偏导数。

计算图上,从右向左,JJJ是vvv的函数,而vvv又通过aaa得到。根据求导链式法则,我们有:

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

② 计算JJJ对参数bbb的偏导数。

从计算图上来看,从右到左,JJJ是vvv的函数,而vvv通过aaa得到。根据链式法则,我们有:

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

首先,我们从计算图上分析JJJ相对于vvv、vvv相对于uuu以及uuu相对于bbb的函数关系。因此,我们有:

∂J∂b=\partial J∂v⋅\partial v∂u⋅\partial u∂b=3⋅1⋅c=3⋅1⋅2=6 \frac{\partial J}{\partial b} = \frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\times 1\times c=3\times 1\times 2=6∂b∂J​=∂v∂J​⋅∂u∂v​⋅∂b∂u​=3×1×c=3×1×2=6

接下来,我们需要计算JJJ对参数ccc的偏导数。根据上面的分析,我们有:

③ 计算JJJ对参数ccc的偏导数

为了找到这个偏导数的具体值,我们可以将以上计算图中每一个函数都表示成一个具体的公式或表达式。

例如,

vvv可以表示为u(u(1)),因此

∂v∂u=2u∂v∂u = 2u∂v∂u​=2u

uuu可以表示为u(v),因此

∂u∂b=c∂u∂b = c∂u∂b​=c

将这些关系代入之前得到的偏导数表达式,我们有:

∂J∂b=\partial J∂v⋅\partial v∂u⋅\partial u∂b=3⋅1⋅c=6 \frac{\partial J}{\partial b} = \frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\times 1\times c=6 ∂b∂J​=∂v∂J​⋅∂u∂v​⋅∂u∂b​=3×1×c=6

因此,JJJ对参数ccc的偏导数是6。

在机器学习中,我们经常需要对模型进行优化。这里介绍一种常用的方法——梯度下降法。

1. 梯度下降法的工作原理:

- 简单来说,就是通过不断调整参数(在这里指的是权重),使损失函数逐渐减小。

2. 特定场景下如何运用:在训练一个逻辑回归模型时,我们需要对损失函数的梯度进行计算。梯度表示的是在给定点上函数值的变化方向。

3. 从右到左的反向传播与梯度计算过程:

- 我们先假设存在三个基本函数JJJ、vvv和uuu。

- 具体来说,我们有:

∂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}∂c∂J​=∂v∂J​⋅∂u∂v​⋅∂c∂u​

- 为了方便计算,我们设:

∂J∂v=b,∂v∂u=a,∂u∂c=c\frac{\partial J}{\partial v}=b,\frac{\partial v}{\partial u}=a,\frac{\partial u}{\partial c}=c∂v∂J​=b,∂u∂v​=a,∂c∂u​

- 代入后,我们得到:

∂J∂c=b⋅a⋅c\frac{\partial J}{\partial c}=b \cdot a \cdot c∂c∂J​=b⋅a⋅c

4. 在逻辑回归中应用梯度下降法:

- 首先假设损失函数为L(c)。

- 然后通过不断调整权重,使loss(损失)减小。这个过程就是我们所说的梯度下降法。

这是一般情况下对逻辑回归模型进行训练的方法,实际上在具体应用时需要考虑更多的细节和参数设置。

让我们先回到逻辑回归的问题上。假设我们的输入特征向量的维度为2(即[x1,x2][x_1, x_2][x1​,x2​]),对应着权重参数 w1w_1w1​、 w2w_2w2​ 和 bbb,可以得到如下计算图:

然后我们来看一下具体的过程。在逻辑回归模型中,我们的输入特征向量经过线性组合之后会被添加一个偏置项(bias term) bbb,形成一个新的向量 v = wx + bv = w1x1 + w2x2 + bbv=w_1x_1+w_2x_2+bvb​ =w1​x1​+w2​x2​+bbb。然后这个新的向量被传递给激活函数(activation function)进行计算,得到最终的预测值 y = f(v) = h(β0 + β1x1 + β2x2)v=fb_0+b_1x_1+b_2x_2=vβ0​+β1​x1​+β2​x2​。这里,h(h)代表激活函数(如sigmoid或softmax等),f(⋅)(⋅)是输入特征向量 v = wx + bv = w1x1 + w2x2 + bbv=w_1x_1+w_2x_2+bvb​ =w1​x1​+w2​x2​+bbb经过激活函数后的输出。

反向传播计算梯度

① 求出LLL对于aaa的导数

② 求出LLL对于zzz的导数

③ 继续前推计算

④ 基于梯度下降可以得到参数更新公式

前面提到的是对单个样本求偏导和应用梯度下降算法的过程。对于有mmm个样本的数据集,Cost Function J(w,b)J(w,b)J(w,b)、a(i)a^{(i)}a(i) 和 权重参数w1w_1w1​ 的计算如图所示。

完整的Logistic回归中某次训练的流程如下,这里仅假设特征向量的维度为2:

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

接着再对w1w_1w1​、w2w_2w2​、bbb进行迭代。

上述计算过程有一个缺点:整个流程包含两个for循环。其中:

第一个for循环遍历mmm个样本

第二个for循环遍历所有特征

如果有大量特征,在代码中显示使用for循环会使算法很低效。向量化可以用于解决显式使用for循环的问题。

5. 向量化(Vectorization)

向量化(Vectorization)是指通过将数学运算操作应用到数组或矩阵上的方式来简化代码,从而使程序更加高效和易于理解。

在Logistic回归中,我们可以利用向量化方法消除重复的for循环,使算法更简洁。具体来说,在上述过程中,计算dw1、dw2和db的方法可以被替换为:

```python

dz = a - y;

dw = X.T @ dz / m;

db = np.mean(dz, axis=0);

```

这里使用了`@`运算符来实现矩阵乘法,并利用`np.mean()`函数计算bias项的平均值。这种方法显著减少了代码量,同时提高了效率。

通过向量化方法的应用,我们不仅解决了显式for循环的问题,还使Logistic回归算法变得更加简洁和高效。

继续以逻辑回归为例,如果采用非向量化的循环方式计算 \( z = w^T x + b \) 的代码如下:

```python

# 初始化z为0

z = 0

# 遍历x的每个元素,并累加w与x的乘积

for i in range(n_x):

# 更新z

z += w[i] * x[i]

# 最后加上b

z += b

```

基于向量化的操作,可以并行计算极大提升效率:

```python

# 使用numpy库进行计算

import numpy as np

# 初始化w和x为n_x维的数组

w = np.random.randn(n_x)

x = np.random.randn(n_x)

# 计算z的值

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

```

这里使用了 Python 中的 `numpy` 工具库,想了解更多的同学可以查看 ShowMeAI 的《图解数据分析》系列教程中的 `numpy` 教程,或者通过制作的 `numpy速查手册` 快速了解其使用方法。

逻辑回归的梯度下降迭代伪代码如下:

```python

# 初始化z为0

Z = w.T @ x + b # 计算激活函数前的值

A = np.vectorize(σ)(Z) # 激活函数,这里使用sigmoid函数σ(Z)

dZ = A - Y # 计算梯度

dw = (1 / m) * X.T @ dZ # 更新w向量

db = (1 / m) * np.sum(dZ, axis=0) # 更新b的偏导数

# 梯度下降更新权重和bias

w -= σdW # w := w - σdw

b -= σdB # b := b - σdb

```

参考资料:

- 图解机器学习 | 逻辑回归算法详解

- 图解机器学习 | 机器学习基础知识)

- 图解AI数学基础 | 微积分与最优化)

- 图解数据分析

推荐文章:

- 深度学习教程 | 深度学习概论

- 深度学习教程 | 神经网络基础

- 深度学习教程 | 浅层神经网络

- 深度学习教程 | 深层神经网络

- 深度学习教程 | 深度学习的实用层面

- 深度学习教程 | 神经网络优化算法

- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架

- 深度学习教程 | AI应用实践策略(上)

- 深度学习教程 | AI应用实践策略(下)

- 深度学习教程 | 卷积神经网络解读

- 深度学习教程 | 经典CNN网络实例详解

- 深度学习教程 | CNN应用:目标检测

- 深度学习教程 | CNN应用:人脸识别和神经风格转换

- 深度学习教程 | 序列模型与RNN网络

- 深度学习教程 | 自然语言处理与词嵌入

- 深度学习教程 | Seq2seq序列模型和注意力机制