前文回顾
上篇文章链接:地址
1.什么是神经网络
神经网络(Neural Network)是一种机器学习算法,模仿人脑的神经系统结构和工作原理。它由多个称为神经元的节点(或单元)组成,这些节点通过连接(权重)相互传递信息,并在输入数据上执行复杂的非线性计算,基本原理为
- 输入层(Input Layer)接收外部输入数据,并将其传递给下一层
- 隐藏层(Hidden Layer)是位于输入层和输出层之间的一系列层,负责处理和转换输入数据
- 输出层(Output Layer)产生最终的结果或预测
- 每个连接都有一个相关的权重,用于调整输入值的重要性
- 神经元应用激活函数(Activation Function)来处理加权总和,并产生输出
对于一个简单的神经网络,我们可以使用以下公式来表示:
输入层到隐藏层的计算
h i = σ ( ∑ j = 1 n w i j x j + b i ) h_i = \sigma \left( \sum_{j=1}^{n} w_{ij} x_j + b_i \right) hi=σ(j=1∑nwijxj+bi)
- h i h_i hi 表示隐藏层中第 i i i 个神经元的输出
- σ \sigma σ 是激活函数
- ∑ j = 1 n w i j x j \sum_{j=1}^{n} w_{ij} x_j ∑j=1nwijxj 表示输入层到隐藏层的加权总和
- w i j w_{ij} wij 是连接输入层第 j j j 个神经元与隐藏层第 i i i 个神经元的权重
- x j x_j xj 表示输入层中第 j j j 个神经元的输出
- b i b_i bi 是偏置(bias),用于调整加权总和的阈值
隐藏层到输出层的计算
o k = σ ( ∑ i = 1 m w k i h i + b k ) o_k = \sigma \left( \sum_{i=1}^{m} w_{ki} h_i + b_k \right) ok=σ(i=1∑mwkihi+bk)
- o k o_k ok 表示输出层中第 k k k 个神经元的输出
- ∑ i = 1 m w k i h i \sum_{i=1}^{m} w_{ki} h_i ∑i=1mwkihi 表示隐藏层到输出层的加权总和
- w k i w_{ki} wki 是连接隐藏层第 i i i 个神经元与输出层第 k k k 个神经元的权重
- b k b_k bk 是输出层的偏置
下面是一个简化的图示说明:
输入层 隐藏层 输出层
x1 ----> | | ---------> y1
x2 ----> | 神 经 | ---------> y2
. | 网 络 | .
. | | .
. | | .
xn ----> | | ---------> yn
在实际应用中,神经网络可以有多个隐藏层,每个隐藏层都可以有不同数量的神经元。这种多层结构称为深度神经网络(Deep Neural Network)
2.前馈神经网络
神经网络(Neural Network)是一种计算模型,受到人脑的神经系统启发而设计。它由多个连接的处理单元(称为神经元)组成,这些神经元之间通过权重来传递和处理信息,基本原理为
- 神经元:每个神经元接收输入信号,并根据权重对这些输入信号进行加权求和,然后通过激活函数将结果转换为输出信号
- 权重:每个输入信号都与对应的权重相乘,权重决定了输入对神经元输出的影响程度
- 激活函数:激活函数对加权和进行非线性变换,使神经网络能够更好地拟合复杂的数据模式。常见的激活函数包括Sigmoid、ReLU和Tanh等
以下是一个简单的神经网络公式:
输入层到隐藏层
a 1 = ∑ i = 1 n ( w 1 i x i ) + b 1 a 2 = ∑ i = 1 n ( w 2 i x i ) + b 2 h 1 = f ( a 1 ) h 2 = f ( a 2 ) \begin{align*} a_1 &= \sum_{i=1}^{n} (w_{1i} x_i) + b_1 \\ a_2 &= \sum_{i=1}^{n} (w_{2i} x_i) + b_2 \\ h_1 &= f(a_1) \\ h_2 &= f(a_2) \\ \end{align*} a1a2h1h2=i=1∑n(w1ixi)+b1=i=1∑n(w2ixi)+b2=f(a1)=f(a2)
隐藏层到输出层
a 3 = ∑ i = 1 m ( w 3 i h i ) + b 3 y = f ( a 3 ) \begin{align*} a_3 &= \sum_{i=1}^{m} (w_{3i} h_i) + b_3 \\ y &= f(a_3) \\ \end{align*} a3y=i=1∑m(w3ihi)+b3=f(a3)
其中, x i x_i xi 表示输入值, w w w 代表权重, b b b 代表偏差(偏置项), h i h_i hi 表示隐藏层的输出, y y y 是神经网络的最终输出, f ( ⋅ ) f(\cdot) f(⋅) 表示激活函数
这个公式描述了一个具有一个隐藏层和一个输出层的简单前馈神经网络。通过调整权重和偏差,神经网络可以学习输入与输出之间的复杂映射关系,从而用于解决各种问题,如分类、回归、图像识别和自然语言处理等
3.神经网络中的激活函数
激活函数(Activation Function)在神经网络中起到非线性变换的作用。它对神经元的加权和进行非线性映射,使神经网络能够更好地拟合非线性数据和复杂模式。激活函数引入非线性性质,增加了神经网络的表达能力,并且通过梯度传播算法(如反向传播)可以有效地进行训练,以下是一些常见的激活函数
-
Sigmoid函数:
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1
Sigmoid函数将输入映射到0到1之间,具有平滑的S形曲线。它可以将任意实数映射到一个概率值,适用于二分类问题和输出层的概率估计 -
ReLU函数(Rectified Linear Unit)
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
ReLU函数在 x > 0 x > 0 x>0时返回 x x x,在 x ≤ 0 x \leq 0 x≤0时返回0。ReLU函数简单、易于计算,并且在处理大规模神经网络时效果良好。它可以缓解梯度消失问题,但可能会导致一些神经元“死亡”(输出始终为0)问题 -
Leaky ReLU函数
f ( x ) = { x , if x > 0 α x , if x ≤ 0 f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{if } x \leq 0 \end{cases} f(x)={x,αx,if x>0if x≤0
Leaky ReLU函数是ReLU函数的改进版本,当 x ≤ 0 x \leq 0 x≤0时引入一个小的斜率 α \alpha α,以解决ReLU函数中神经元“死亡”问题 -
Tanh函数(双曲正切函数)
f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+e−xex−e−x
Tanh函数将输入映射到-1到1之间,并具有S形曲线。它在处理具有负值的数据时比Sigmoid函数更适用,但与Sigmoid函数一样容易出现梯度消失问题
这些是常见的激活函数,每个函数都有不同的特点和应用场景。选择合适的激活函数取决于具体的任务和网络结构,以及对梯度传播和模型稳定性的要求。在实际应用中,人们也尝试了许多其他类型的激活函数来提高神经网络的性能和稳定性
4.深度神经网络VS深度学习
深度神经网络(Deep Neural Network)是深度学习(Deep Learning)的一种具体实现方式。深度学习是一种机器学习的方法,通过使用深度神经网络来模拟人脑的神经系统,以便实现对复杂数据的学习和分析。深度学习利用深度神经网络的多层结构进行特征提取、数据表示和模式识别,从而能够处理各种领域的大规模数据,并在图像分类、语音识别、自然语言处理等任务中达到令人印象深刻的性能。一个具体的案例是图像分类。当面临海量的图像数据集时,传统的机器学习算法可能需要手动设计和提取特征,这是一项耗时繁琐的工作。然而,通过深度学习中的深度神经网络,我们可以更好地处理这个问题。首先,我们可以使用卷积神经网络(CNN)作为深度神经网络的一种形式来处理图像分类任务。CNN具有多个卷积层和池化层,可以通过局部感知和参数共享来提取图像的局部特征。然后,通过堆叠多个卷积层和全连接层,CNN能够逐层学习并提取出更高级的语义特征。接下来,我们使用深度学习中的反向传播算法对神经网络进行训练。通过将已标记的图像数据作为输入,并将其与相应的标签进行比较,我们可以通过最小化损失函数来调整网络的权重和偏差。这使得网络能够逐渐学习到图像的特征和模式,并最终实现准确的分类
通过以上深度学习中的深度神经网络方法,我们可以在图像分类任务中取得出色的表现,例如在ImageNet挑战赛中,深度神经网络模型(如ResNet、Inception和VGG等)在大规模图像分类上取得了令人惊讶的结果,并超越了传统机器学习方法
5.如何训练神经网络
训练神经网络通常涉及两个主要步骤:前向传播和反向传播
-
前向传播: 在前向传播过程中,输入数据通过神经网络从输入层向前传递到输出层,计算出预测结果。对于每个样本,按照以下步骤执行前向传播:
- 将输入值送入输入层神经元
- 在每个隐藏层和输出层的神经元中,计算加权和(根据输入值和神经元的权重)
- 将加权和输入到激活函数中,得到相应的激活值(输出值)
- 将激活值传递给下一层的神经元,直至达到输出层。最后,得到神经网络的预测结果
-
反向传播: 反向传播是用于训练神经网络的关键算法,它基于梯度下降的思想,通过计算损失函数关于权重和偏差的梯度来更新网络参数。反向传播包括以下步骤:
- 计算损失函数:比较神经网络的预测输出与真实标签之间的差距,得到一个代表误差的损失值
- 反向传播误差:从输出层开始,计算每个神经元对损失的贡献,并将误差传播回前面的层。这是通过使用链式法则计算每一层的梯度来实现的
- 更新参数:根据计算得到的梯度信息,利用梯度下降优化算法更新网络中的权重和偏差,以减小损失函数的值
- 重复迭代:反复执行前向传播和反向传播的步骤,直到达到预定的停止条件(如达到最大迭代次数或损失函数收敛)
梯度下降是反向传播算法中常用的优化算法之一,它基于损失函数的梯度方向来调整网络参数。在梯度下降中,通过不断更新参数,网络会逐渐朝着损失函数的最小值移动。除了普通的梯度下降外,还有一些改进的变体,如随机梯度下降(Stochastic Gradient Descent, SGD)和批量梯度下降(Batch Gradient Descent)等。总结起来,通过前向传播计算预测结果,然后使用反向传播算法计算梯度并更新参数,可以训练神经网络以最小化损失函数。这个过程被称为监督学习,因为它需要有标签的输入数据来指导网络的训练
6.神经网络的优化方法
神经网络的优化方法是通过调整网络的权重和偏差,以最小化损失函数来提高网络的性能。以下是一些常见的优化方法、正则化技术和防止过拟合的策略:
-
梯度下降法(Gradient Descent):梯度下降是最常见的优化算法之一,通过计算损失函数关于参数的梯度来更新网络中的权重和偏差。它有几个不同的变体,如批量梯度下降、随机梯度下降和小批量梯度下降,根据每次更新所使用的样本数量的不同
-
学习率调度(Learning Rate Scheduling):学习率决定了每次参数更新的步长大小。为了获得更好的训练效果,可以使用学习率调度策略,在训练过程中逐渐降低学习率。常见的方法包括固定学习率、指数衰减、余弦退火等
-
正则化(Regularization):正则化技术有助于防止模型过拟合,即在训练集上表现良好但在测试集上泛化能力较差。常见的正则化技术包括:
- L1正则化(L1 Regularization):通过在损失函数中添加所有权重的绝对值之和的乘以一个正则化参数,促使网络学习稀疏权重
- L2正则化(L2 Regularization):通过在损失函数中添加所有权重的平方和的乘以一个正则化参数,促使网络学习较小的权重,也称为权重衰减(Weight Decay)
-
Dropout:Dropout是一种常用的防止过拟合的策略。在训练过程中,随机将一部分神经元的输出设置为0,这样可以强制网络学习到冗余特征,并增强模型的泛化能力
-
批标准化(Batch Normalization):批标准化是一种在网络的每个批次上标准化输入数据的技术。它有助于加速训练过程并提高模型的稳定性,同时还可以起到正则化的效果,减少过拟合的可能性
-
早停法(Early Stopping):早停法是一种简单但有效的防止过拟合的策略。当验证集上的性能不再改善时,停止训练,避免进一步拟合训练集
以上是一些常见的优化方法、正则化技术和防止过拟合的策略。在实际应用中,可以根据具体问题和数据集的特点选择合适的方法或组合多种方法来提高神经网络的性能和泛化能力