系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 一、什么是神经网络?
- 二、神经网络的基本结构
- 1.输入层(Input Layer)
- 2.隐藏层(Hidden Layer)
- 3.输出层(Output Layer)
- 三、神经网络的构造
- 四、神经网络的介绍
- 五、神经网络学习的核心思想
- 六、确定中间层
- 七、正则化惩罚
- 偏导数、梯度与梯度下降
- BP神经网络训练过程
- 感知器
- 多层感知器
- 偏置
- 为什么需要偏置?
- 八、训练方法——损失函数
- 为什么需要损失函数?
- 常见损失函数
- 交叉熵损失函数(多分类的情况)
- 1. Softmax 函数(输出概率)
- 2. 交叉熵损失函数(单样本)
- 3. 多样本平均交叉熵损失
- 为什么要使用 -log?
- 总结
一、什么是神经网络?
神经网络(Neural Network)是一种模拟人脑神经元工作方式的计算模型,广泛应用于图像识别、语音识别、自然语言处理等领域。
它的核心思想是:通过大量简单单元的连接与学习,实现对复杂问题的建模和预测。
在计算机中,神经网络并不是真正的生物神经,而是由数学公式和程序构成的模型,但其结构和信息传递方式受到了生物神经系统的启发。
二、神经网络的基本结构
一个典型的神经网络通常由以下三部分组成:
1.输入层(Input Layer)
用于接收原始数据
每一个神经元对应一个输入特征
不进行复杂计算,只负责传递数据
例如,在图像识别中,输入层可以是图像的像素值。
2.隐藏层(Hidden Layer)
位于输入层和输出层之间
负责对输入数据进行特征提取和非线性变换
可以有一层或多层
隐藏层的数量和每层神经元的个数,通常需要根据任务复杂度进行设计。
3.输出层(Output Layer)
输出模型的最终结果
用于分类或回归任务
例如:
二分类问题:输出 0 或 1
多分类问题:输出各类别的概率
三、神经网络的构造
图中左侧为多个输入变量,分别表示为 x1、x2、x3、…、xn。
每一个输入变量都对应一个权重参数,表示为 ω1、ω2、ω3、…、ωn,权重用于衡量不同输入对神经元输出结果的影响程度。
所有输入 xi 在进入神经元之前,会先与各自对应的权重 ωi 相乘,然后汇聚到中间的神经元节点中。神经元内部会对这些加权后的输入进行求和运算,并通常加入偏置项,随后通过激活函数得到输出结果。
右侧的箭头表示神经元的输出,该输出可以作为下一层神经元的输入,或者作为整个神经网络的最终输出。
最左边是一个二维平面,上面有两类数据点,用不同的颜色和形状表示。中间画了一条直线,把这两类点分开,说明这是一个可以用直线解决的分类问题。
上方给出了这条直线的推导过程。
从常见的直线表达式 y = kx + b 开始,把它整理成 kx + b − y = 0。
当问题扩展到多个输入时,就可以写成 k1x1 + k2x2 + b = 0。
为了和神经网络的形式一致,把系数统一记为权重,就得到 w1x1 + w2x2 + b = 0。
最后,把偏置 b 看成是一个固定为 1 的输入,就可以写成 w1x1 + w2x2 + 1·w3 = 0。
中间部分画的是一个神经元的结构。
输入包括 x1、x2 以及一个常数 1,它们分别乘以对应的权重 w1、w2、w3,然后一起送进求和单元。求和结果再经过一个函数处理,得到最终输出,用来判断数据属于哪一类。
右边展示的是一个常见的激活函数曲线(Sigmoid)。
它的作用是把神经元算出来的结果压缩到 0 到 1 之间,这样输出就可以理解成“属于某一类的可能性”。
整体来看,这张图表达出:
分类直线 → 加权求和 → 神经元 → 激活函数输出,也就是神经网络中最基本的工作思路。
最左侧是输入层,这一层的节点用来接收原始数据。每一个节点通常对应一个输入特征,比如数据的某一维数值,本身并不进行复杂计算,只负责把数据传给下一层。
中间是多层隐藏层。每一层都由多个神经元组成,并且相邻两层之间是全连接的,也就是说,上一层的每一个神经元都会和下一层的所有神经元相连。
隐藏层的作用是对输入数据进行逐层处理,把原始、简单的信息不断组合和转换,提取出更有用的特征。层数越多,网络能够表达的关系也就越复杂。
最右侧是输出层,用于给出最终结果。输出的形式取决于具体任务,比如在分类问题中,输出可以表示不同类别的可能性,在回归问题中则是一个具体的数值。
整体来看,这个网络的数据流向是从左到右逐层传递的:
输入层接收数据 → 隐藏层不断加工信息 → 输出层给出结果。
这正是深度神经网络的基本工作方式,也是“深度学习”中“深度”二字的来源。
四、神经网络的介绍
经网络是一种模仿人脑神经系统工作方式建立的计算模型,主要用于让计算机从数据中自动学习规律,并完成预测或分类等任务。它的基本思想是:通过大量简单计算单元的组合,来解决复杂问题。
从结构上看,神经网络由多层节点组成,通常包括输入层、隐藏层和输出层。输入层负责接收原始数据,隐藏层对数据进行逐层处理和特征提取,输出层给出最终结果。数据在网络中按照一定的方向逐层传递,完成一次预测过程。
神经网络中的每一个节点可以看作一个“神经元”。神经元会对输入信息进行加权求和,并通过激活函数输出结果。不同神经元之间通过连接线相连,每一条连接线都对应一个权重参数。这些权重并不是固定的,而是通过训练过程不断调整得到的。
神经网络的学习过程,本质上是一个不断优化参数的过程。模型先根据当前参数给出预测结果,再通过损失函数衡量预测值与真实值之间的差距,然后利用反向传播和梯度下降等方法逐步调整权重,使误差不断减小。
由于具备较强的非线性表达能力,神经网络在图像识别、语音识别、自然语言处理等领域得到了广泛应用。随着网络层数的增加,模型可以学习到更加复杂和抽象的特征,这也是“深度学习”名称的由来。
总体来说,神经网络是一种通过数据驱动、自动学习特征的模型,是现代人工智能系统中的重要基础。
五、神经网络学习的核心思想
1.在设计一个神经网络时,输入层和输出层的节点数量通常是确定的。
输入层的节点数由数据本身决定,比如有多少个特征就需要多少个输入节点;输出层的节点数则取决于任务类型,比如分类类别数或回归输出的维度。相比之下,中间的隐藏层结构更加灵活,包括层数以及每一层的节点数量,都可以根据实际需求进行调整。
2.在神经网络的结构示意图中,节点之间的连线和箭头表示的是数据在预测(前向计算)时的传递方向。需要注意的是,这种数据流向主要描述的是从输入到输出的计算过程,而在训练阶段,还会存在参数反向更新的过程,其方向与图中箭头并不完全一致。
3.另外,在理解神经网络结构时,真正的核心并不是图中的圆圈本身。圆圈只是用来表示神经元,而决定模型效果的关键在于神经元之间的连接关系。每一条连接线都对应一个权重参数,不同的权重会对输入信息产生不同的影响。这些权重的具体数值并不是人为设定的,而是通过训练过程不断调整得到的。
六、确定中间层
在实际使用中,中间层并没有一个固定的标准答案,更多是根据任务特点和实验效果来确定的。一般可以从以下几个方面来考虑。
首先是问题的复杂程度。
如果任务本身比较简单,比如线性关系明显、特征数量不多,使用较少的隐藏层甚至一层隐藏层就可以取得不错的效果。而对于关系复杂、特征之间非线性较强的问题,往往需要更多的隐藏层来逐层提取特征。
其次是数据规模的大小。
当训练数据较少时,网络结构如果设计得过深、节点过多,容易出现过拟合的问题,也就是模型在训练集上表现很好,但在新数据上效果较差。这种情况下,隐藏层数量和每层节点数通常需要控制得更简单一些。相反,当数据量较大时,模型可以适当增加复杂度。
第三是隐藏层中节点数量的选择。
常见的做法是让隐藏层节点数介于输入层和输出层之间,或者逐层递减。例如第一隐藏层节点较多,后面的隐藏层逐渐减少,以便逐步压缩和提取有效信息。当然,这并不是硬性规则,而是一种经验做法。
最后是通过实验不断调整。
在神经网络中,隐藏层结构往往需要多次尝试。可以先从较简单的结构开始,根据训练结果和验证效果,再逐步增加层数或节点数量,找到在性能和计算开销之间较为合适的平衡点。
总体来说,中间层的设计是一种经验与实验相结合的过程,需要根据具体问题不断调整,而不是一次就能确定。
七、正则化惩罚
图中假设输入为 x = [1, 1, 1, 1],在这种情况下,给出了两种不同的权重设置方式。
第一种权重为 w1 = [1, 0, 0, 0],可以看到,模型几乎只依赖第一个输入特征,其余特征基本不起作用。
第二种权重为 w2 = [0.25, 0.25, 0.25, 0.25],每个输入特征都会参与计算,并且贡献相同。
虽然这两组权重与输入相乘后得到的结果相同,但它们背后的含义不同。第一种情况下,模型只“记住”了某一个特征,容易对个别输入过度依赖,从而产生过拟合问题;而第二种情况下,信息分布更加均匀,模型能够综合利用多个特征,通常具有更好的泛化能力。
图中下方给出了均方误差损失函数的形式,在原有预测误差的基础上,引入了一个正则化项。这个正则化项的作用是对权重大小进行约束,防止某些权重变得过大,从而降低模型过拟合的风险。
常见的两种正则化方式:
L1 正则化,通过对权重绝对值求和,鼓励部分权重变为 0;
L2 正则化,通过对权重平方求和,倾向于让权重分布得更加平滑。
右侧的曲线示意图对比了加入正则化前后的效果,可以看出,加入正则化后,模型的输出变化更加平稳,不容易出现剧烈波动。
合理的权重分布和正则化机制,可以有效提升模型的稳定性和泛化能力。
#八、 梯度下降
这张图展示的是梯度下降算法寻找最优解的过程。
图中的彩色三维曲面可以理解为损失函数的形状,横轴表示模型参数,纵轴表示损失值的大小。不同颜色代表损失的高低,颜色越高的位置,损失越大;越低的地方,表示模型效果越好。
图中间的黑色折线和箭头表示参数更新的轨迹。模型一开始通常处在曲面上的某个较高位置,然后沿着“下降最快”的方向一步一步移动,每走一步,损失都会减小一些。
梯度下降的核心思想就是:
在当前位置,找一个能让损失下降最快的方向,然后朝这个方向走一小步。
不断重复这个过程,参数就会逐渐靠近曲面的低点,也就是损失函数的最小值。
从图中可以看到,路径并不是一条直线,而是随着地形的变化不断调整方向。这说明在复杂问题中,损失函数往往不是简单的“碗状”,梯度下降需要不断修正前进方向,才能逐步逼近最优解。
梯度下降就是在一张“起伏的地形图”上,一步步往最低点走的过程,而这个最低点对应的,就是模型参数的较优取值。
偏导数、梯度与梯度下降
在处理多变量函数时,常常会用到偏导数。
偏导数可以理解为:当函数中有多个变量时,只对其中一个变量求导,而把其他变量暂时当作不变。通过分别对每一个变量求偏导,就可以了解各个变量对函数变化的影响情况。
在此基础上,就引出了梯度的概念。
梯度可以看作是由一个函数对所有变量的偏导数组成的向量。这个向量不仅包含了各个方向上的变化信息,它的方向还具有明确的意义——梯度指向的是函数值上升最快的方向。因此,如果希望函数值减小,就需要沿着梯度的反方向移动。
**梯度下降法(Gradient Descent)**正是基于这一思想提出的一种优化方法。
它是一种常用的一阶优化算法,也被称为最陡下降法。其基本做法是:在当前位置计算梯度,然后沿着梯度的反方向更新参数,使函数值不断减小,从而逐步逼近函数的局部最小值。
在梯度下降过程中,**步长(也称学习率)**起着非常重要的作用。
梯度只决定了前进的方向,而学习率则决定每一步走多远。如果学习率过大,参数可能在最优值附近来回震荡,甚至无法收敛;如果学习率过小,虽然过程更稳定,但收敛速度会非常慢。因此,学习率通常需要合理设置,不能过大也不能过小。
由于实际问题中的函数往往存在多个极小值,梯度下降有可能停留在局部最小值。一种常见的应对方式是:
从多个不同的初始位置开始进行梯度下降,分别求解最小值,再从中选择效果最好的结果,以提高找到全局最优解的可能性。
BP神经网络训练过程
这张图从整体上展示了 BP(Backpropagation)神经网络是如何完成一次训练的,包括前向计算、损失计算以及反向更新参数的全过程。
第一步:前向传播计算输出
输入数据从输入层开始,经过隐藏层逐层计算。每一层都会对输入进行加权求和,并通过激活函数处理,最终在输出层得到预测结果,记为 yp。这一步的本质就是:用当前的权重,算出模型的预测值。
第二步:计算损失函数
将预测结果 yp 与真实值 y 进行比较,计算两者之间的误差。图中使用的是均方误差损失函数,同时在损失函数中加入了正则化项,用于限制权重大小,防止模型过拟合。
第三步:计算权重的梯度
接下来需要计算损失函数对各个权重的偏导数,也就是每个权重对误差的影响程度。由于网络是多层结构,梯度的计算需要按照链式法则逐层展开,这一步也体现了多层神经网络“逐层求导”的过程。
第四步:误差反向传播
误差信息从输出层开始,沿着网络结构反向传递到隐藏层,再传回输入层。每一层都会根据误差大小,计算出对应权重需要调整的方向和幅度。
第五步:更新权重并重复训练
将计算得到的梯度乘以学习率,对权重进行更新,得到新的权重值。随后重复上述过程,不断调整参数,直到损失函数减小到设定的范围内,或者训练达到停止条件。
感知器
感知器是最简单的神经网络模型,可以看成是一个“带权重的加法器 + 判断器”。
它的工作过程很简单:
1.把输入数据按权重相乘
2.求和
3.通过一个激活函数(如阶跃函数)给出输出结果
核心特点:
只有一层(没有隐藏层)
本质上是 线性模型
只能解决 线性可分问题
局限性:
当数据无法用一条直线(或一个平面)分开时,感知器就无能为力了。
总结:
感知器只能做线性划分。
多层感知器
多层感知器是在感知器基础上的升级版。
它在输入层和输出层之间,加入了一个或多个隐藏层。
多出来的隐藏层有什么用?
1.每一层都会对数据做一次“变形”
2.再加上非线性激活函数
3.就能把原本线性不可分的数据,变成可分的
核心特点:
1.至少包含一个隐藏层
2.可以使用 ReLU、Sigmoid 等非线性激活函数
3.能完成 非线性分类和回归任务
关键点:
隐藏层是神经网络能够进行非线性分类的关键。
总结:
多层感知器通过隐藏层 + 非线性激活,实现复杂问题的建模。
偏置
在神经网络中,通常会在各层神经元中引入偏置(bias)。
偏置可以理解为一个输出恒为 1 的特殊神经元,其主要作用是为神经元提供一个可学习的常数项。
神经元的线性加权形式通常表示为:
z = w_1 x_1 + w_2 x_2 + … + w_n x_n + b
其中:
x_i 表示输入特征
w_i 表示对应的权重
b 表示偏置项
从计算角度看,偏置也可以等价写成:
z = w_1 x_1 + w_2 x_2 + … + w_n x_n + w_b * 1
其中 1 即为偏置神经元的固定输出值。
偏置节点本身不接收来自上一层的输入,一般在网络结构示意图中不会被单独画出,而是通过偏置项 b 体现。
引入偏置可以增强模型的表达能力,使模型不受“必须经过原点”的限制,从而提高神经网络对复杂数据的拟合能力。
为什么需要偏置?
如果没有偏置:
所有输出都被迫经过原点
模型的灵活性会很差
加入偏置之后:
可以整体平移函数
更容易拟合真实数据
提高模型的表达能力
直观理解:
偏置就像一条直线的“截距”。
八、训练方法——损失函数
为什么需要损失函数?
损失函数(Loss Function)的作用是:
把“预测得准不准”变成一个可以计算、可以优化的数值
损失值 越小,说明预测结果 越接近真实值
训练的本质:让 loss 不断下降
常见损失函数
0-1 损失函数(分类)
均方误差损失(回归)
平均绝对误差损失(回归)
交叉熵损失(分类、多分类)
合页损失(SVM)
均方误差损失函数(MSE,回归问题)
适用于:预测连续数值
定义公式:
loss = (1 / N) * Σ(y_i - ŷ_i)^2
或者写成完整形式:
loss = (1 / N) * Σ_{i=1}^{N} (y_i - y_hat_i)^2
各符号含义:
y_i:第 i 个样本的真实值
y_hat_i:第 i 个样本的预测值
N:样本总数
特点:
误差越大,平方后惩罚越大
连续、可导,适合用梯度下降优化
交叉熵损失函数(多分类的情况)
1. Softmax 函数(输出概率)
p_i = exp(z_i) / Σ exp(z_j)
z_i:第 i 类的模型输出
p_i:预测为第 i 类的概率
所有 p_i 之和等于 1
2. 交叉熵损失函数(单样本)
loss = - Σ y_i * log(p_i)
y_i:真实标签(one-hot 编码,正确类为 1,其余为 0)
p_i:模型预测的概率
实际上只计算真实类别对应的那一项。
3. 多样本平均交叉熵损失
loss = -(1 / N) * Σ Σ y_{k,i} * log(p_{k,i})
N:样本数量
k:样本索引
i:类别索引
为什么要使用 -log?
原因很简单:
当 p 接近 1 时,-log§ 接近 0(预测正确,损失小)
当 p 接近 0 时,-log§ 非常大(预测错误,惩罚极重)
这使模型既追求准确,又避免“自信但错误”
总结
神经网络训练的本质,是通过损失函数量化预测误差,并利用梯度下降不断调整模型参数,使预测结果逐步逼近真实值。