bp神经网络推导过程
目录
一、前向传播
二、反向传播
1、定义
2、优化算法
三、神经网络整体架构
1、基本架构
2、隐藏层
3、神经元个数对结果的影响
4、正则化对结果的影响
四、数据预处理
1、数据预处理步骤
2、数据标准化
3、参数初始化
4、特征工程
五、神经网络过拟合解决方法
神经网络前向传播(Feedforward Propagation)是指将输入数据在神经网络中进行计算的过程。在神经网络的每一层中,通过激活函数对输入进行转换,再将转换后的结果传递到下一层,直到达到输出层。在前向传播的过程中,每一层的权重和偏置都会被使用。
具体地,前向传播的计算过程如下:
将输入数据传递到网络的第一层
在每一层中,将输入数据乘上对应层的权重矩阵,再加上偏置向量
对每一层的结果使用激活函数进行转换,得到该层的输出
将该层的输出传递到下一层,重复步骤2-3,直到达到输出层
最终得到输出层的结果作为神经网络的预测结果
整个前向传播的过程是一个单向的计算过程,没有反馈回来的信息。这也是为什么它被称为“前向传播”。
神经网络反向传播算法,通常简称为反向传播(Backpropagation),是一种机器学习中用于训练神经网络的算法。它的目的是最小化神经网络模型的损失函数,以提高预测准确度。
反向传播算法基于梯度下降算法,它通过计算损失函数对神经网络中各个参数的偏导数,来反向调整神经网络中的权重和偏置,从而使损失函数最小化。这个过程可以看做是一个误差逆传播,即从损失函数到神经网络的最后一层,再到每一层的节点。
反向传播算法的步骤主要包括:
前向传播,计算神经网络的输出值。
根据输出值计算损失函数。
反向传播误差,计算每个权重的梯度。
使用梯度下降法更新权重和偏置。
重复步骤 1-4,直至损失函数收敛到一个稳定值。
反向传播算法的目的是最小化损失函数,以提高神经网络的预测准确度。这种算法在机器学习中的应用非常广泛,特别是在图像识别、语音识别、自然语言处理等领域。
神经网络高级优化算法
神经网络的优化算法通常用于更新神经元之间的权重和偏置,以最小化损失函数。以下是一些常见的神经网络优化算法:
随机梯度下降(SGD):这是神经网络训练中最基本的优化算法之一,它通过计算训练集中每个样本的梯度来更新神经元的权重和偏置。
动量算法:这种优化算法使用之前的梯度来更新神经元的权重和偏置,从而更好地适应目标函数。
自适应学习率方法:这种算法可以根据每个权重的梯度大小自适应地调整学习率。AdaGrad、RMSprop 和 Adam 等算法都属于这种类型。
L-BFGS:这是一种基于拟牛顿法的优化算法,它使用一个近似的海森矩阵来更新权重和偏置,从而更快地收敛到最优解。
Adagrad 和 Adadelta:这些算法使用一种自适应方法来调整学习率,从而更好地应对目标函数的不同特性。
SGD + 动量:这是一种结合了随机梯度下降和动量算法的优化算法,可以更好地应对训练数据中的噪声和不确定性。
综上所述,选择正确的优化算法是神经网络训练中至关重要的一步,需要考虑到网络的架构、数据集的大小和复杂度以及最终目标函数的特点等因素。
notes:
从后往前按顺序逐层计算。
神经网络是一种结构化的计算模型,它由许多神经元和它们之间的连接组成。神经网络的整体架构可分为以下几个方面:
输入层:输入层通常包含一组输入神经元,用于将输入数据传递到网络中。例如,对于图像分类问题,输入层可以是图像的像素值。
中间层:中间层通常包含一组隐藏神经元,用于在输入层和输出层之间传递信息。中间层可以有多个层,每个层的神经元数量不一定相同。
输出层:输出层包含一组输出神经元,用于将网络的输出传递到外部环境中。例如,对于图像分类问题,输出层可以用于分类图像为不同的类别。
权重和偏置:权重和偏置是神经网络中的重要参数,它们决定了神经元之间的连接强度。权重用于调整输入信号的强度,偏置用于控制神经元的激活阈值。
激活函数:激活函数用于在神经元接收到输入信号后计算输出信号。常用的激活函数有 sigmoid、ReLU、tanh 等。
损失函数:损失函数用于衡量神经网络的预测结果与真实结果之间的差异。常用的损失函数有交叉熵、均方误差等。
神经网络可以使用前向传播和后向传播算法进行训练。前向传播算法用于计算神经网络的输出值,后向传播算法用于计算权重和偏置的梯度并更新它们以最小化损失函数。通过不断地迭代前向传播和后向传播算法,神经网络可以学习到输入数据和目标输出数据之间的映射关系,进而实现各种任务,如分类、回归、语音识别、图像处理等。
notes:
输入层(input layer)中,输入端的神经元数,即中的n值对应了输入数据的特征维度(特征数量),如图像数据为[32X32X3],一共有3072个像元,输入模型时数据作为[3072X1]的特征列向量输入,此时对应模型的输入层则至少有3072个神经元。
全连接层:
神经网络中的全连接层(Fully Connected Layer),也称为密集层(Dense Layer),是一种基本的神经网络层,其中每个神经元都与前一层的所有神经元相连。全连接层通常用于将前一层的输出转换为下一层的输入。
在全连接层中,每个神经元接收前一层的所有输出,并通过权重和偏置进行加权和计算,再通过激活函数进行非线性转换产生输出。因此,全连接层的神经元数量与前一层的神经元数量相等,可以自由调整其数量,使得网络可以适应不同的任务。例如,对于分类问题,通常会在全连接层中增加分类器层,其神经元数量等于类别数,用于对输出进行分类。
全连接层可以堆叠在一起形成深度神经网络,通过反向传播算法进行训练,学习出输入数据和目标输出数据之间的映射关系。全连接层虽然拥有参数量大、训练时间长等缺点,但在一些任务中仍然表现出色,如图像分类、自然语言处理等任务。
卷积层:
神经网络中的卷积层是一种常用于处理图像、语音、文本等二维或三维数据的层。卷积层主要通过卷积核(也称为滤波器)的滑动,在输入数据上提取局部特征,并通过非线性激活函数进行处理和转换。
卷积层的输入是一个包含多个通道(Channel)的特征图(Feature Map)。在卷积的过程中,每个卷积核会对每个通道进行卷积运算,并将运算结果进行叠加。卷积核的大小可以自行设置,通常为正方形或长方形。例如,使用一个 3x3 的卷积核对一个 28x28 的图像进行卷积,可以得到一个 26x26 的特征图。在实际应用中,通常会使用多个卷积核对同一个输入数据进行卷积,并且每个卷积核的权重也是需要训练的。
卷积层的优点在于可以自动提取输入特征的局部关系和细节信息,同时可以通过参数共享减少不必要的训练参数,从而减少过拟合。此外,卷积层还可以通过池化层将特征图尺寸降低,减少计算量和内存占用,同时提高特征的鲁棒性和不变性,避免对细节过度关注。
现代深度学习中,卷积层经常作为卷积神经网络(Convolutional Neural Network)的核心组成部分,广泛应用于图像分类、目标检测、语音识别等领域。
循环层:
循环神经网络(Recurrent Neural Network,RNN)中的循环层是一种常用于处理序列数据的层,如自然语言文本、音频信号、时间序列等。相对于传统的前馈神经网络,循环神经网络在输入数据的维度上增加了一个时间维度,即将序列数据视为一系列时间步上的输入数据,并且在不同时间步之间共享相同的权重和偏置参数,从而能够自动提取序列数据之间的时序信息。
循环层的基本结构是循环单元(Recurrent Unit),一般有基于门控的LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)等多种变体,其主要用途是通过当前时刻的输入和上一时刻的状态,计算当前时刻的输出和下一时刻的状态,并将状态信息传递到后续的时间步中。这里每个时间步的状态都包含了该时间步之前的所有信息。因此,循环层可以自然地处理可变长度的序列数据。
循环层的输出一般会在后续的全连接层或其他神经网络结构中进行进一步处理,例如,可以对输出进行分类、聚类、序列标注等操作。循环神经网络在自然语言处理、语音识别、机器翻译等领域得到广泛应用,并且在图像处理方面也有一定的应用,例如视频分析、光学字符识别等。
池化层:
池化层(Pooling Layer)是神经网络中用于降采样的一种层次结构。它通常紧跟在卷积层之后,用于压缩特征图(Feature Map)的空间尺寸,减小模型参数的数量,降低过拟合风险,同时保留池化区域内特征的主要信息。
常见的池化方式有最大池化(Max Pooling)和平均池化(Average Pooling)两种,其中最大池化取区域内特征的最大值作为该区域的代表特征,平均池化取区域内特征的平均值作为该区域的代表特征。这些池化操作本质上都是对特征图进行降维处理的操作,通常可以通过设置池化窗口(Pool Size)和步幅(Stride)等参数来控制输出特征图的大小。
池化层可以使模型更加鲁棒,具有一定的平移不变性(Translation Invariance),能够缩小特征图的空间尺寸,提高模型的泛化能力。但是如果过度池化,则可能会丢失一些重要的信息,因此在实际应用中,需要根据具体任务和数据集来选择合适的池化方式和参数设置。
notes:
鲁棒性(Robustness)是指系统能够在面对各种不确定性和噪声的情况下,仍能保持稳定的性能和正确的决策能力。在机器学习和深度学习中,鲁棒性是一个非常重要的概念,因为模型往往需要在复杂的、不确定的环境中进行预测和决策。
具有鲁棒性的模型能够更好地应对常见的问题,如数据中的缺失或噪声、输入数据的分布偏移、模型架构的微小变化等。在深度学习中,鲁棒性可以通过一系列方法来提高,包括数据增强、对抗训练、正则化、模型集成等。
鲁棒性是一种非常有价值的性能指标,因为它能够使机器学习系统更加健壮、可靠,并能够在真实世界中发挥更好的作用。
神经网络中的非线性是指神经元激活函数的非线性。神经元激活函数是用于将输入信号转换为输出信号的数学函数。神经网络中使用非线性激活函数的主要原因是,如果使用线性激活函数,则网络的输出将始终是输入的线性组合,这限制了网络的表达能力。而使用非线性激活函数可以使神经元能够学习更复杂的模式和关系,从而提高神经网络的表达能力。
神经网络中神经元个数对结果的影响是一个复杂的问题,它取决于许多因素,如任务类型、数据集大小和复杂度、网络结构等。一般来说,增加神经元数量可以提高网络的表达能力,从而提高网络的性能和准确性。但是,当神经元数量过多时,网络可能会过拟合训练数据,导致泛化性能下降。
在实际应用中,我们通常会通过交叉验证等方法来选择适当的神经元数量,以在准确性和泛化性能之间进行平衡。此外,也可以借助一些自动化调参工具,如网格搜索、随机搜索、贝叶斯优化等方法,来寻找最佳的神经元数量。总之,确定最佳的神经元数量是一个需要不断实验和尝试的过程,需要根据具体情况进行权衡和调整。
神经元增加一个,即增加了一组参数,即模型提取的特征升了一个维度,模型拟合能力增强,增加过拟合风险。
过拟合与正则化
在模型增加了参数和时,能够更好的拟合训练集的数据,但是此时存在过拟合的现象,缺少泛化性,对真实数据的拟合能力并不好。此时通过给成本函数添加正则化项,原本在最小化成本函数时只对预测值和真实值之间的误差进行最小化,力图尽量拟合真实值。
现在加入正则化项之后,在成本函数最小化时,会按照 大小对正则化项中的参数按比例最小化,即降低参数对应的输入特征的重要性。
若 值很大时,正则化项在成本函数中占据的权重就很大,最小化时会优先最小化正则化项中的参数,即降低参数对应的输入特征的作用,此时也是减小参数对应的输入特征对整个模型拟合训练集时的影响程度;若 值很小时,正则化项在成本函数中占据的权重就很小,最小化时就会优先最小化模型预测值与真实值之间的误差,此时模型对训练集的拟合程度就很好,参数对应的输入特征在模型拟合训练集时的重要性就很大。
总结一下:
修改之后的成本函数,成为了预测值与真实值的误差加上额外的正则化项(regularization term)。
新的成本函数权衡了我们的目标,我们希望最小化原始成本时的两个目标:
1)、尝试最小化第一项会鼓励算法通过最小化预测值和实际值的平方差来很好地拟合训练数据。
2)、尽量减少第二项,使得参数w 保持较小,这会有助于减少过拟合。
数据预处理是神经网络应用中至关重要的步骤。它的目标是将数据转换为模型可以理解和处理的格式。以下是神经网络的数据预处理步骤:
数据清洗:这步骤是确保数据集不包含无效或不必要的数据。例如,数据集中可能包含错误或缺失的数据点,需要删除或填充这些数据点。
数据标准化:在神经网络中,大部分情况下要对数据集进行标准化处理。标准化可以将所有数据缩放为相同的尺度,通常是将数据集的均值设置为0,标准差设置为1。
特征工程:特征工程是数据预处理中最重要的步骤之一,它将原始数据转换为更易于理解的形式。例如,如果数据集中包含时间序列数据,可以将其转换为滞后(lag)特征,或者将数据集中的文本内容转换为数字格式。
数据划分:将数据集划分为训练集、验证集和测试集。训练集用于训练神经网络模型,验证集用于调整模型的参数,测试集用于对模型进行评估。
数据增强:数据增强是一种技术,可以通过对原始数据集进行变换来生成更多的训练样本。例如,对图像数据集进行旋转、平移和翻转操作可以生成更多的图像样本,从而提高模型的泛化能力。
数据标准化是神经网络数据预处理中的一个重要步骤,目的是将数据集中的特征缩放到相同的尺度,以便神经网络模型可以更好地处理数据。常见的数据标准化方法有两种:Z-score标准化和Min-Max标准化。
Z-score标准化:该方法通过减去特征均值并除以特征标准差来将数据转换为标准正态分布。它的公式如下:
其中,是原始数据,是该特征的均值,是该特征的标准差,是标准化后的数据。使用该方法可以使得特征的均值为0,标准差为1。
Min-Max标准化:该方法通过将特征缩放到一个指定的最小值和最大值之间来实现标准化。它的公式如下:
其中,和分别表示该特征的最小值和最大值。使用该方法可以使得特征的取值范围为[0, 1]。
参数初始化是神经网络的关键步骤之一,它决定了神经网络初始状态下的参数取值,有利于在训练过程中获得更好的性能。通常情况下,参数初始化的方法可以分为以下几种:
随机初始化:每个参数都随机地初始化为一个小的随机值。这种方法可以避免所有的权重都相等,从而使神经网络具备不同的特征表示能力。
常数初始化:每个参数都初始化为一个固定的常数值。例如,所有的权重都初始化为0,或者都初始化为1。这种方法可以减少模型中的自由参数,但缺点是会导致梯度消失或爆炸等问题。
Xavier初始化:该方法通过使用满足正态分布的随机数来初始化参数,以保持神经元输出的方差不变。该方法的公式如下:
其中,是输入神经元的数量。Xavier初始化方法可以提高神经网络的收敛速度和性能。
He初始化:该方法与Xavier初始化类似,但适用于激活函数为ReLU时的神经网络。该方法的公式如下:
其中,是输入神经元的数量。He初始化方法可以避免ReLU激活函数的梯度消失问题。
notes:
通常使用随机策略进行参数初始化,乘以0.01是调节神经网络中避免权重参数差异过大。
w = 0.01*np.random.randn(D,H) #(D,H)为(行,列)
特征工程是指从原始数据中提取有用特征以提高机器学习算法性能的过程。特征工程包括以下几个方面:
特征选择:选择对目标变量有较强预测能力的特征,避免不必要的特征导致的噪声干扰和维度灾难。
特征提取:通过数学变换将原始数据转换为具有更好表示能力的特征。常见的特征提取方法包括主成分分析(PCA)、奇异值分解(SVD)、非负矩阵分解(NMF)等。
特征创造:通过对原始特征进行组合、交互等操作,创建新的特征。例如,将身高和体重组合成BMI指数。
特征预处理:对特征进行归一化、标准化等操作,以保证不同特征的尺度一致,在样本数据上进行更加稳定的优化。
特征工程对于机器学习算法性能的提升非常重要,因为它能够使原始数据的有用信息更好地表现出来,从而帮助算法更好地学习和预测。同时,特征工程的难度也与问题和数据的特征有关,需要经验和技巧的积累以及反复试验。
以下是神经网络解决过拟合的几种方法:
增加训练数据:增加训练数据可以帮助模型更好地学习数据特征,从而减少过拟合。
数据增强技术:通过增加数据的数量和多样性,例如旋转、翻转、裁剪等,来扩大数据集,提高模型的鲁棒性。
正则化:通过惩罚过大的权重,来避免模型过度拟合。常见的正则化方法有L1正则化和L2正则化。
早停策略:在训练过程中,定期评估验证集的性能,如果发现性能不再提高,则停止训练,以避免过拟合。
Dropout:随机选择一些神经元,在训练过程中忽略其输出,从而防止过度依赖单个神经元的情况发生,提高模型的泛化能力。
Batch Normalization:对每个特征进行标准化处理,从而使得输入分布更加稳定,提高模型的鲁棒性。
模型集成:通过结合多个模型的预测结果,来降低过拟合的风险,提高模型的性能。例如,bagging和boosting等方法都可以用于神经网络模型的集成。
notes:
Drop-out在神经网络训练的过程当中,在一次训练时,每一层随机舍弃一部分神经元,更新权重参数时这一部分保持不变,但是在下一轮训练时又重新每层随机选取一部分神经元保持不变。这样做的好处是,训练一个神经网络模型往往需要很多轮次,Dropout会让每次都简化框架提升训练速度。