当前位置: 首页 > news >正文

机器学习(重学版)基础篇(算法与模型一)

 本篇参考周志华老师的西瓜书,但是本人学识有限仅能理解皮毛,如有错误诚请读友评论区指正,万分感谢。

二、核心算法与模型

2.1线性模型 

2.1.1、线性模型基本形式(3.1节)

1. 数学形式
  • 样本表示:x=(x1;x2;… ;xd)(含 d个属性)

  • 预测函数

    • w=(w1;w2;… ;wd):权重向量,决定各属性对预测的影响方向与强度。

    • b:偏置项,补偿样本均值与真实标记的偏差。

2. 核心特点
  • 可解释性:权重 wi的绝对值大小直接反映属性重要性(如 表示根蒂对判断西瓜好坏更关键)。

  • 基础性:线性决策边界是复杂模型(如神经网络、SVM)的基本组件。

2.1.2、线性回归(3.2节)

线性回归用于预测连续值输出,目标是学得最优参数w和b,使模型对训练数据的预测尽可能接近真实标记。 

1. 问题定义
  • 目标:学习参数 w,b 使得预测值  逼近真实连续值 y_{i}

  • 损失函数:均方误差(MSE)

    选择理由

    1. 几何意义:最小化预测值与真实值的欧氏距离。

    2. 数学性质:严格凸函数,存在唯一全局最小值。

    3. 概率解释:假设噪声 时,MSE 等价于高斯噪声下的极大似然估计(MLE)。

2. 优化方法:最小二乘法
(1) 单变量情形(1个属性)
  • 闭式解

    斜率 w 可进一步化为协方差和方差的比值形式,见下述推导过程。

  • 推导:对​ 求偏导并令导数为零:

接下来简单解释一下数学原理:

 

  • 几何意义:直线穿过所有样本点的“中心” (xˉ,yˉ),且斜率 w 由协方差和方差的比值决定。

  • 优化策略:最小二乘法通过求导得正规方程直接求解最优参数(闭式解)。

(2) 多元情形(d个属性)
  • 参数合并,样本矩阵 X 添加全1列(对应偏置 b)。

  • 损失函数矩阵形式

  • 最优解

    推导

简单来说: 最小二乘法通过巧妙地设计矩阵 X 和参数向量 ŵ,把多元线性回归的“找最优直线/超平面”问题,转化成了一个求解矩阵方程 XᵀXŵ = Xᵀy 的问题。解这个方程,就找到了让总平方误差最小的那组参数

(3) 解的存在性问题
  • 满秩矩阵:当 时,解唯一。

  • 不满秩(属性数 > 样本数):

    • 引入正则化(如 L2 正则化):

    • 作用:限制参数规模,防止过拟合(几何上压缩解空间)。

3. 扩展:对数线性回归

  • 模型形式

  • 应用场景:输出标记呈指数增长(如人口增长、病毒传播)。

  • 本质:将非线性问题转化为线性问题,仍使用最小二乘法求解。


2.1.3、对数几率回归(3.3节) 

对数几率回归(logistic regression)虽名为 “回归”,实则是一种二分类学习方法,其核心是通过线性模型结合对数几率函数实现分类,具有可解释性强、能输出概率预测等优点。 

基本思路:分类任务需将线性回归的实值输出转换为 0/1 类别标记。理想的转换函数是 “单位阶跃函数”,但该函数不连续、不可微,因此采用对数几率函数(logistic function) 作为替代 —— 这是一种 Sigmoid 函数,能将实值映射到 (0,1) 区间,且单调可微:y = \frac{1}{1 + e^{-z}}。其中z = w^Tx + b为线性回归输出。

单位阶跃函数与对数几率函数 

  • 模型表达式:将线性回归结果代入对数几率函数,得到:y = \frac{1}{1 + e^{-(w^Tx + b)}} 变形后可得:\ln \frac{y}{1 - y} = w^Tx + b左边为 “对数几率”(对正例与反例的几率取对数),因此模型本质是用线性回归拟合对数几率,实现对分类概率的建模。

Q1:为何使用Sigmoid函数?
  • 问题:线性回归输出 z = w^T x + b是连续实值,但分类需要概率输出 [0,1]。

  • 解决方案

    y = \frac{1}{1 + e^{-z}} = \sigma(z)

    • Sigmoid函数特性

      • 将 (−∞,+∞) 压缩到 (0,1),满足概率公理

      • 单调连续可微(利于优化)

      • 临界点 z=0时 y=0.5(天然分类阈值)

对数几率(Log Odds)

  • 定义

    Log Odds= \ln \frac{p(y=1|x)}{p(y=0|x)} = \ln \frac{y}{1 - y} =w^T x + b

  • 物理意义

    • 分子 p(y=1∣x):正例概率

    • 分母 p(y=0∣x):反例概率

    • 比值 :正例相对反例的"优势比"(Odds Ratio)

  • 核心思想:用线性模型 直接拟合对数几率(线性决策边界w^T x + b = 0 对应对数几率=0,即正反例概率相等)


损失函数:对数似然损失
  • 核心目标:最大化 “对数似然”,即使每个样本属于其真实标记的概率最大。 若将y视为样本x为正例的概率p(y=1|x),则反例概率为p(y=0|x) = 1 - y。给定数据集\{(x_i, y_i)\},似然函数为:

L(w, b) = \prod_{i=1}^m \left[ p(y_i=1|x_i) \right]^{y_i} \left[ p(y_i=0|x_i) \right]^{1 - y_i}

  • 对数似然函数:取对数后转化为求和形式,最大化似然等价于最小化以下损失函数:

\ell(\beta) = \sum_{i=1}^m \left( -y_i \beta^T \hat{x}_i + \ln(1 + e^{\beta^T \hat{x}_i}) \right)

其中\beta = (w; b)为扩展参数向量,\hat{x}_i = (x_i; 1)为扩展样本向量。该函数是关于\beta的凸函数,可通过凸优化算法求解最优解。

极大似然估计(MLE)推导
  • 概率建模

    p(y_i|x_i) = \begin{cases} \sigma(z_i) & y_i=1 \\ 1 - \sigma(z_i) & y_i=0 \end{cases}

  • 似然函数

    L(\beta) = \prod_{i=1}^m p(y_i|x_i) = \prod_{i=1}^m \sigma(z_i)^{y_i} [1-\sigma(z_i)]^{1-y_i}

  • 负对数似然(NLL)

    \ell(\beta) = -\sum_{i=1}^m \left[ y_i \ln \sigma(z_i) + (1-y_i) \ln (1-\sigma(z_i)) \right]

这上边写公式太费力了接下来的步骤还是手写吧

损失函数凸性证明
  • 关键性质

    • 损失函数 ℓ(β) 是 凸函数

    • Hessian矩阵半正定:
      → 无局部极小值,全局最优解存在

 交叉熵损失

  • 信息论视角

    • 真实分布:[yi,1−yi](One-Hot编码)

    • 预测分布:[σ(zi),1−σ(zi)]

  • 优化目标:最小化预测概率分布与真实分布的差异(KL散度)

优化方法

由于对数似然损失函数是凸函数,无局部极小值,常用数值优化算法求解参数\beta

  • 梯度下降法:通过计算损失函数对\beta的一阶导数(梯度),沿负梯度方向迭代更新参数:

\frac{\partial \ell(\beta)}{\partial \beta} = -\sum_{i=1}^m \hat{x}_i (y_i - p_1(\hat{x}_i; \beta))

其中p_1(\hat{x}_i; \beta) = \frac{1}{1 + e^{-\beta^T \hat{x}_i}}为正例概率预测值。

  • 牛顿法:利用二阶导数(海森矩阵)加速收敛,迭代更新公式为:

\beta^{t+1} = \beta^t - \left( \frac{\partial^2 \ell(\beta)}{\partial \beta \partial \beta^T} \right)^{-1} \frac{\partial \ell(\beta)}{\partial \beta}

二阶导数为:

\frac{\partial^2 \ell(\beta)}{\partial \beta \partial \beta^T} = \sum_{i=1}^m \hat{x}_i \hat{x}_i^T p_1(\hat{x}_i; \beta) (1 - p_1(\hat{x}_i; \beta))

梯度下降法(一阶优化)

更新公式

\beta^{t+1} = \beta^t - \eta \cdot \underbrace{\left( -\sum_{i=1}^m \hat{x}_i (y_i - p_1(\hat{x}_i; \beta)) \right)}_{\nabla_\beta \ell}

其中:

  • η:学习率(步长)

  • p_1(\hat{x}_i; \beta) = \sigma(\beta^T \hat{x}_i):正例概率预测值

 梯度计算

\frac{\partial \ell}{\partial \beta} = -\sum_{i=1}^m \hat{x}_i (y_i - \sigma(\beta^T \hat{x}_i))

  • 物理意义

    • \sigma(\beta^T \hat{x}_i) - y_i:预测概率与真实标签的误差

    • \hat{x}_i:误差按特征向量方向分配

牛顿法(二阶优化)

算法原理

更新公式

\beta^{t+1} = \beta^t - \underbrace{\left( H^t \right)^{-1}}_{\text{}} \cdot \underbrace{\nabla_\beta \ell^t}_{\text{}}

其中海森矩阵:

H = \sum_{i=1}^m \hat{x}_i \hat{x}_i^T \cdot \sigma(\beta^T \hat{x}_i) (1 - \sigma(\beta^T \hat{x}_i))

2. 关键组件解析

  • 梯度\nabla_\beta \ell = -\sum \hat{x}_i (y_i - \sigma_i)

  • 海森矩阵

    • σi(1−σi):概率不确定度(在0.5时最大)

    • \hat{x}_i \hat{x}_i^T:特征相关性矩阵

  • 矩阵求逆(d+1) \times (d+1) 矩阵求逆代价高

梯度下降实现:

def gradient_descent(X, y, lr=0.01, epochs=1000):"""X: 设计矩阵 (m x (d+1))y: 标签向量 (m x 1)"""beta = np.zeros(X.shape[1])  # 初始化参数for _ in range(epochs):z = X @ beta  # 线性预测p = 1 / (1 + np.exp(-z))  # Sigmoidgrad = -X.T @ (y - p)  # 梯度计算beta -= lr * grad  # 参数更新return beta

牛顿法实现:

def newton_method(X, y, max_iter=10):beta = np.zeros(X.shape[1])for _ in range(max_iter):z = X @ betap = 1 / (1 + np.exp(-z))grad = -X.T @ (y - p)  # 梯度# 海森矩阵计算W = np.diag(p * (1 - p))  # 权重矩阵H = X.T @ W @ X  # 海森矩阵# 避免奇异矩阵H_reg = H + 1e-6 * np.eye(H.shape[0])# 参数更新beta -= np.linalg.inv(H_reg) @ gradreturn beta
优化目标与结果

两种方法均以最小化对数似然损失为目标,最终求解得到最优参数\beta^*

\beta^* = \arg\min_{\beta} \ell(\beta)

参数确定后,模型即可通过p_1(\hat{x}; \beta^*) = \frac{1}{1 + e^{-\beta^{*T} \hat{x}}}输出样本为正例的概率,进而完成分类预测。

小结

对数几率回归的优化核心是利用凸函数性质,通过梯度下降或牛顿法求解对数似然损失的最小值。梯度下降实现简单、适合大规模数据;牛顿法收敛更快,但计算成本较高。两种方法均能有效得到最优参数,为模型提供稳定的概率输出和分类能力。

2.2决策树

决策树是一种基于树结构进行决策的机器学习模型,核心思想是 “分而治之”(divide-and-conquer),通过递归划分样本构建树结构,并通过剪枝处理提升泛化能力。本章核心内容包括基本流程、划分选择、剪枝处理。

引用自西瓜书 

西瓜问题的一棵决策树 

2.2.1、决策树基本流程

递归划分样本构建树结构,具体流程如下:

  1. 核心思想
    从根节点(包含所有训练样本)出发,根据某一属性将样本划分为若干子节点;每个子节点对应该属性的一个取值,包含该取值的所有样本;递归执行此过程,直至子节点满足停止条件。

  2. 递归停止条件

    • 当前节点包含的样本全属于同一类别,无需划分,直接标记为该类别的叶节点;
    • 可用属性集为空,或所有样本在剩余属性上取值相同,无法划分,将节点标记为所含样本数最多的类别的叶节点;
    • 当前节点包含的样本集合为空,不能划分,标记为父节点所含样本数最多的类别的叶节点。
  3. 结构特点
    树由根节点、内部节点(属性测试)和叶节点(决策结果)组成,从根节点到叶节点的路径对应一组决策规则,具有直观的可解释性。 

2.2.2、划分选择

划分选择的核心是选择 “最优属性”,使划分后子节点的样本 “纯度”(同类样本集中程度)最高,常用划分准则包括信息增益、增益率和基尼指数。

1. 信息增益
  • 信息熵:度量样本集合纯度的指标。对于样本集D,若第k类样本占比为p_k,则信息熵定义为Ent(D) = -\sum_{k=1}^{|\mathcal{Y}|} p_k \log_2 p_k,其值越小,纯度越高1。
  • 信息增益:使用属性a划分样本集D后获得的 “纯度提升”。计算公式为Gain(D, a) = Ent(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} Ent(D^v),其中D^v是D中属性a取值为a^v的样本子集。
  • 应用:信息增益越大,说明该属性划分效果越好。ID3 决策树算法即采用信息增益选择划分属性。
2. 增益率
  • 问题背景:信息增益对可取值数目较多的属性有偏好(如 “编号” 这类属性可能获得极高增益但无实际意义)。
  • 定义:为减少这种偏好,引入 “增益率”,计算公式为Gain\_ratio(D, a) = \frac{Gain(D, a)}{IV(a)},其中IV(a) = -\sum_{v=1}^{V} \frac{|D^v|}{|D|} \log_2 \frac{|D^v|}{|D|}为属性a的 “固有值”,属性取值越多,IV(a)通常越大。
  • 应用:C4.5 算法采用增益率,但并非直接选择增益率最大的属性,而是先筛选出信息增益高于平均水平的属性,再从中选择增益率最高的。
3. 基尼指数
  • 基尼值:度量样本集合纯度的另一种指标,反映随机抽取两个样本类别标记不一致的概率。定义为Gini(D) = 1 - \sum_{k=1}^{|\mathcal{Y}|} p_k^2,值越小,纯度越高。
  • 基尼指数:属性a的基尼指数为划分后各子集基尼值的加权和,即Gini\_index(D, a) = \sum_{v=1}^{V} \frac{|D^v|}{|D|} Gini(D^v)
  • 应用:CART 决策树选择基尼指数最小的属性作为最优划分属性10。
核心逻辑

划分选择的核心目标是通过属性划分提高结点纯度,不同准则(信息增益、增益率、基尼指数)从不同角度衡量划分效果,分别被 ID3、C4.5、CART 等经典决策树算法采用,以适应不同场景下的纯度优化需求。

2.2.3 剪枝处理

决策树的 “剪枝处理”是应对决策树过拟合的主要手段。剪枝通过主动移除部分分支,降低模型复杂度,提升泛化能力

1. 剪枝的基本思路

决策树在训练过程中可能因过度拟合训练数据(如分支过多)导致泛化能力下降。剪枝通过判断分支划分是否能提升泛化性能,决定是否保留或移除分支,主要分为两种策略:

  • 预剪枝:在决策树生成过程中,对每个结点划分前先评估,若划分不能提升泛化性能,则停止划分并将当前结点标记为叶结点。
  • 后剪枝:先生成完整决策树,再自底向上考察非叶结点,若将子树替换为叶结点能提升泛化性能,则进行替换。
2. 预剪枝

引用自西瓜书  

  • 核心逻辑:在结点划分前,通过验证集评估划分前后的性能。若划分后验证集精度提升,则执行划分;否则停止划分。
  • 示例:以西瓜数据集 2.0 的训练集和验证集为例,根结点若不划分,验证集精度为 42.9%;用 “脐部” 划分后,验证集精度提升至 71.4%,因此确定划分。后续分支若划分后精度未提升(如 “色泽” 划分后精度降至 57.1%),则禁止划分。
  • 优缺点:能显著减少决策树分支,降低计算开销,但可能因提前停止划分导致 “欠拟合”。
3. 后剪枝

引用自西瓜书   

  • 核心逻辑:先生成完整决策树,再从叶结点向上回溯,评估将子树替换为叶结点后的验证集性能。若性能提升,则替换。
  • 优缺点:泛化性能通常优于预剪枝,但训练时间开销更大(需先生成完整树再迭代剪枝)。
4. 性能评估依据

剪枝效果通过验证集精度判断,即预留部分数据作为验证集,比较划分 / 替换前后模型在验证集上的分类精度,以此确定是否进行剪枝。剪枝的核心是通过控制决策树复杂度平衡 “拟合能力” 与 “泛化能力”预剪枝高效但可能欠拟合,后剪枝泛化性好但成本较高,实际应用中需根据场景选择。

 2.2.4连续属性属性值缺失处理方法

1. 连续值处理
  • 问题背景:连续属性(如 “密度”“含糖率”)的取值是连续区间,无法像离散属性那样直接根据取值划分样本。
  • 处理方法
    • 确定候选划分点:将连续属性的所有取值排序后,取相邻两个值的中点作为候选划分点,即对属性a的取值\{a_1,a_2,...,a_m\},候选划分点集合为T_a=\{\frac{a_i+a_{i+1}}{2}|1 \leq i \leq m-1\}
    • 选择最优划分点:计算每个候选划分点的信息增益(与离散属性的信息增益计算方式类似),选择增益最大的划分点作为该属性的最优划分点。
    • 特点:连续属性可作为后代结点的划分属性(如父结点用 “密度≤0.381” 划分后,子结点仍可用 “密度≤0.294” 划分)。
2. 缺失值处理
  • 问题背景:样本的某些属性值可能缺失(如 “色泽”“敲声” 等属性无记录),需解决两个问题:如何选择划分属性?样本属性值缺失时如何划分?
  • 处理方法
    • 划分属性选择
      • 仅基于有完整属性值的样本子集\tilde{D}计算信息增益。
      • 定义无缺失值样本占比\rho、子集内各类别占比\tilde{p}_k、子集内属性取值占比\tilde{r}_v,将信息增益推广为Gain(D,a)=\rho \times [Ent(\tilde{D}) - \sum_{v=1}^V \tilde{r}_v Ent(\tilde{D}^v)]其中Ent(\tilde{D})=-\sum_{k=1}^{|\mathcal{Y}|}\tilde{p}_k \log_2 \tilde{p}_k
    • 样本划分
      • 若样本属性值已知,划入对应子结点,权重不变。
      • 若样本属性值缺失,同时划入所有子结点,权重按属性取值占比\tilde{r}_v调整(如权重为\tilde{r}_v \cdot w_x
 用个比方解释:

想象一下:你在玩一个猜水果的游戏(决策树),要根据水果的特征(属性)猜它是什么(类别)。但有些水果的标签掉了(属性值缺失),怎么办?

这个处理方法主要解决两个头疼的问题:

  1. 选哪个特征来猜? (划分属性选择)

  2. 标签掉了的水果放哪里? (样本划分)

1. 选哪个特征来猜? (处理缺失值后的信息增益计算)

  • 问题: 有些水果的“颜色”标签掉了,有些水果的“声音”标签掉了。我们怎么知道用“颜色”还是“声音”来猜水果种类更有效呢?

  • 解决方法:

    • 只看标签完整的: 先别管那些标签掉了的水果。只把所有标签都完整的水果(子集 D_hat)拿出来。

    • 像平常一样算: 用这些标签完整的水果,像没有缺失值一样,计算用“颜色”猜有多好(Ent(D_hat)),用“声音”猜有多好(Ent(D_hat)),以及用了“颜色”或“声音”后猜得有多准(Sum(... Ent(D_hat^v)))。这就算出了基于完整样本的信息增益基础值 [Ent(D_hat) - Sum(...)]

    • 打个折扣: 但是!因为我们只用了部分水果(标签完整的),没用全部水果。所以这个“猜得有多好”的值要打个折。打折的比例就是 “标签完整的水果占所有水果的比例” (ρ)

    • 最终得分 = 打折后的效果: 真正的“用这个特征猜有多好”(信息增益)就是: Gain = ρ * [刚才算的基础值]

    • 谁得分高选谁: 比较“颜色”和“声音”最终的这个 Gain 分数,谁分数高,说明(在考虑缺失值的情况下)用这个特征来猜更有效,就选谁!

简单总结选特征:只看好的水果算效果,算完效果打个折(按好水果的比例),打折后的分数才是真本事。

2. 标签掉了的水果放哪里? (样本划分)

  • 问题: 现在选定用“颜色”来分水果了(比如分成“红”、“绿”、“黄”三个篮子)。但有些水果的颜色标签掉了,该放进哪个颜色的篮子里呢?

  • 解决方法:

    • 标签没掉的水果: 如果水果的颜色标签还在,比如是“红色”,那就正常放进“红色”的篮子里。它在篮子里的“分量”(权重 w_x)还是 1(或者原来的值)。

    • 标签掉了的水果: 如果一个水果的颜色标签掉了,别扔掉它!我们玩个“分身术”:

      • 把它同时放进 所有 颜色的篮子里(红、绿、黄都放)。

      • 但是,它在每个篮子里的“分量”(权重 w_x)要变小。变小的比例就是 “在那些颜色标签完整的水果里,这个颜色出现的比例” (tilde r_v)

      • 例子: 假设在颜色标签完整的水果里:

        • 红色水果占 50% (tilde r_红 = 0.5)

        • 绿色水果占 30% (tilde r_绿 = 0.3)

        • 黄色水果占 20% (tilde r_黄 = 0.2)

      • 那么,一个颜色标签缺失的水果:

        • 放进红篮子时,它在红篮子里的分量是 0.5 * 它原来的分量

        • 放进绿篮子时,它在绿篮子里的分量是 0.3 * 它原来的分量

        • 放进黄篮子时,它在黄篮子里的分量是 0.2 * 它原来的分量

      • 这样,这个缺失标签的水果相当于被“拆分”到了所有可能的篮子里,但在每个篮子里只占了一小部分(根据各颜色出现的可能性)。

简单总结分水果:好水果对号入座,分量不变;掉标签的水果所有位置都坐一点,分量按各位置原来的人数比例打折。

2.3神经网络

2.3.1神经元模型

神经网络的基本构成单元 —— 神经元模型

  1. 神经元模型的生物学基础 神经网络试图模仿人脑的工作方式。人脑由数十亿个神经元(神经细胞)相互连接组成。每个神经元接收来自其他神经元的信号,当接收到的信号足够强时,它就会被“激活”,并向下一个神经元发送自己的信号。人工神经元模型就是对这一生物过程的数学抽象。

  2. M-P 神经元模型 这是最基础的神经元模型,其工作原理为:

    • 接收输入:

      • 神经元接收来自其他 n 个神经元(或输入源)的信号 (x₁, x₂, ..., xₙ)。这些信号就像是它收到的“消息”。

    • 加权求和:

      • 每个输入信号 xᵢ 都有一个与之关联的权重 wᵢ。权重代表了该输入信号对这个神经元的重要性和影响力。

        • 正权重:表示兴奋性输入,会促使神经元激活。

        • 负权重:表示抑制性输入,会阻止神经元激活。

        • 权重绝对值大小:表示影响强度。

      • 神经元将所有输入信号乘以各自的权重后求和,得到总输入值 z
        z = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ + b

      • 注意: 公式中通常包含一个偏置项 b (bias)。你可以把它想象成神经元的“懒惰程度”或“激活难易程度”。它相当于一个固定的输入(通常 x₀ = 1)的权重 w₀,所以 z = w₁*x₁ + ... + wₙ*xₙ + w₀*1。偏置 b 允许我们调整神经元激活的阈值点。

    • 与阈值比较:

      • 神经元有一个内置的阈值 θ。这个阈值代表激活所需的“最低兴奋度”。

      • 计算机会将上一步得到的总输入值 z 与这个阈值 θ 进行比较。

    • 激活函数处理:

      • 基于比较结果 (z - θ) 或 (z + b),神经元需要通过一个激活函数 f 来决定它的输出 y

      • 理想情况(阶跃函数):

        • 如果 (z - θ) >= 0 (即总输入达到或超过阈值),则输出 y = 1 (激活/兴奋)。

        • 如果 (z - θ) < 0 (即总输入低于阈值),则输出 y = 0 (未激活/抑制)。

        • 这个函数就像是一个开关,要么开(1),要么关(0)。数学上称为阶跃函数 (Step Function)

      • 实际情况(常用 Sigmoid):

        • 阶跃函数虽然直观,但在数学上有一个大问题:它在 z - θ = 0 这个点是不可导的(有个“跳跃”),而导数对于训练神经网络(通过梯度下降算法优化权重)至关重要。

        • 因此,实践中常用Sigmoid 函数作为激活函数。它的公式是:
          σ(z) = 1 / (1 + e⁻ᶻ)
          (注:这里的 z 通常已经包含了偏置 b 的效果,即 z = w₁x₁ + ... + wₙxₙ + b,比较 z 和 0 等价于比较 (z - θ) 和 0 如果 b = -θ)。

        • Sigmoid 函数的特性:

          • 输出范围: 将任何实数输入 z 挤压到 (0, 1) 区间内。输出值无限接近于 0 或 1,但永远不会等于它们。

          • 连续性 & 可导性: 它是光滑、连续的曲线,并且在所有点都有定义良好的导数。这点对于训练神经网络(使用梯度下降法更新权重)极其关键。

          • 生物学解释: 可以理解为神经元的“激活程度”,0 代表完全不激活,1 代表完全激活,中间值代表不同程度的激活(兴奋)。这比阶跃函数的“非黑即白”更符合生物神经元的实际响应特性。

          • 概率解释: 在二元分类问题中,Sigmoid 输出值可以自然地解释为样本属于正类(输出接近1)的概率。

    • 产生输出:

      • 最终,激活函数 f (无论是阶跃还是Sigmoid或其他) 的输出值 y 就是该神经元的输出信号。

      • 这个输出信号 y 会沿着连接(带有权重)传递给下游的其他神经元作为它们的输入。

  3. 激活函数 激活函数用于将神经元的输入转换为输出,关键作用是引入非线性:

    • 理想激活函数:阶跃函数(如单位阶跃函数),能将输入映射为 “0”(抑制)或 “1”(兴奋),但存在不连续、不光滑的缺陷;
    • 常用激活函数:Sigmoid 函数(如对数几率函数),可将输入挤压到 (0,1) 区间,具有连续可导的特性,更适合用于神经网络的参数学习。

 引用自西瓜书  

激活函数是神经元模型的核心组件之一,它决定了神经元如何响应其总输入信号。它的作用不仅仅是简单的阈值判断:

  • 引入非线性: 这是激活函数最重要的作用!如果神经元只做线性加权求和(z)而不经过非线性激活函数,那么无论堆叠多少层神经网络,整个网络的表达能力仍然等价于一个单层的线性模型(无法拟合复杂的非线性数据模式)。非线性激活函数(如Sigmoid)使得神经网络能够学习并表达极其复杂的函数关系,成为强大的“万能函数逼近器”。

  • 控制输出范围: 如Sigmoid将输出限制在(0,1),便于解释(如概率)或作为下一层神经元的输入(防止数值爆炸)。

  • 决定神经元激活特性: 不同的激活函数有不同的“激活模式”(饱和性、梯度特性等),影响网络的学习动态和最终性能。

2.3.2感知机(Perceptron)及其扩展的多层网络 

感知机模型

  引用自西瓜书  

把感知机想象成一个非常基础的人工“决策单元”。它接收一些输入(比如传感器信号或数据特征),根据简单的规则做出“是”或“否”(1 或 0)的判断 

1. 结构:两层神经元

  • 输入层:

    • 由多个“神经元”组成,但这些神经元不是真正的计算单元

    • 它们的功能仅仅是接收来自外界的输入信号 (x₁, x₂, ..., xₙ) 以及一个固定输入为 1 的偏置项(对应阈值)。

    • 接收到的信号原封不动地传递给下一层(输出层)的神经元。

  • 输出层:

    • 只有一个真正的计算单元,它是一个 M-P 神经元

    • 这个神经元接收来自输入层的所有信号 (x₁, x₂, ..., xₙ, 1)

    • 它对每个输入信号乘以一个对应的权重 (w₁, w₂, ..., wₙ, w₀)(其中 w₀ 是偏置 b 的权重,通常 b = -θ)。

    • 计算加权和z = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ + w₀*1(或等价于 z = Σ wᵢxᵢ + b)。

    • 将 z 输入激活函数。感知机使用的激活函数是阶跃函数 (Step Function)

      • 如果 z >= 0,则输出 y = 1

      • 如果 z < 0,则输出 y = 0

2. 功能:实现基本逻辑运算

感知机最核心的能力之一就是通过精心设置权重 (w₁, w₂, ..., wₙ, b) 来实现简单的逻辑门功能。这证明了它具有一定的计算能力。让我们用两个输入 (x₁, x₂) 的感知机来演示:

  • “与”运算 (AND)y = x₁ AND x₂ (仅当 x₁ 和 x₂ 都为 1 时,y=1)

    • 权重设置: w₁ = 1w₂ = 1b = -2 (或者等效地 θ = 2)。

    • 计算验证:

      • (0, 0)z = 1*0 + 1*0 + (-2) = -2 < 0 => y=0

      • (0, 1)z = 1*0 + 1*1 + (-2) = -1 < 0 => y=0

      • (1, 0)z = 1*1 + 1*0 + (-2) = -1 < 0 => y=0

      • (1, 1)z = 1*1 + 1*1 + (-2) = 0 >= 0 => y=1

    • 理解: 只有当两个输入信号都足够强(都为1),它们的加权和 (1+1=2) 才能达到或超过阈值 (2),从而激活神经元输出1。

  • “或”运算 (OR)y = x₁ OR x₂ (只要 x₁ 或 x₂ 至少一个为 1,y=1)

    • 权重设置: w₁ = 1w₂ = 1b = -0.5 (或者等效地 θ = 0.5)。

    • 计算验证:

      • (0, 0)z = 1*0 + 1*0 + (-0.5) = -0.5 < 0 => y=0

      • (0, 1)z = 1*0 + 1*1 + (-0.5) = 0.5 >= 0 => y=1

      • (1, 0)z = 1*1 + 1*0 + (-0.5) = 0.5 >= 0 => y=1

      • (1, 1)z = 1*1 + 1*1 + (-0.5) = 1.5 >= 0 => y=1

    • 理解: 只要有一个输入信号为1 (w₁*1=1 或 w₂*1=1),其值就超过了较低的阈值 (0.5),足以激活神经元输出1。两个都为1时更强。

  • “非”运算 (NOT)y = NOT x₁ (输出是输入的相反值)

    • 权重设置 (单输入): w₁ = -1.5b = 1 。

    • 计算验证 (以 w₁ = -1.5b = 1 为例):

      • x₁=0z = (-1.5)*0 + 1 = 1 >= 0 => y=1 (非0是1)

      • x₁=1z = (-1.5)*1 + 1 = -0.5 < 0 => y=0 (非1是0)

    • 理解: 负权重 (w₁) 意味着输入信号会抑制神经元激活。当输入为0时,偏置 b 足够大,直接激活输出1。当输入为1时,负权重带来的抑制 (-1.5) 压倒了偏置 (+1),导致总输入为负 (-0.5),输出0。 

3.学习规则:从错误中学习

感知机真正的力量在于它能自动学习正确的权重和偏置,而无需人工设定。它通过一个非常简单的规则,根据训练数据中的错误来调整自己。

  • 目标: 对于给定的训练样本 (x, y),其中 x = (x₁, x₂, ..., xₙ) 是输入特征,y 是真实标签(通常是 0 或 1),感知机希望自己的预测输出 ŷ 尽可能接近 y

  • 规则 (感知机学习规则):

    1. 输入一个训练样本 (x, y),计算感知机的预测输出 ŷ

    2. 比较预测 ŷ 和真实值 y

      • 如果 ŷ = y预测正确! 什么都不做,权重和偏置保持不变。

      • 如果 ŷ ≠ y预测错误! 需要调整权重和偏置。

    3. 权重/偏置更新公式:

      • wᵢ ← wᵢ + Δwᵢ

      • Δwᵢ = η * (y - ŷ) * xᵢ

      • 等价公式: wᵢ ← wᵢ + η * (y - ŷ) * xᵢ

      • 偏置更新 (同样规则): b ← b + η * (y - ŷ) (因为偏置 b 可以看作是对应输入恒为 1 的权重 w₀,所以 Δb = η * (y - ŷ) * 1)

    • 关键参数:

      • η :学习率 (Learning Rate)。这是一个大于 0 的小常数(例如 0.1)。它控制着每次权重调整的步长

        • 太小的 η:学习速度慢,需要更多次迭代才能收敛。

        • 太大的 η:可能导致权重更新幅度过大,在最优解附近震荡甚至无法收敛。

      • (y - ŷ)误差信号 (Error Signal)。它只有 3 种可能值:

        • ŷ=0, y=1 (预测低了):(1 - 0) = +1 => 增加权重 (wᵢ 向 xᵢ 的方向增加)。

        • ŷ=1, y=0 (预测高了):(0 - 1) = -1 => 减小权重 (wᵢ 向 -xᵢ 的方向增加)。

        • ŷ=y(y - ŷ)=0 => 权重不变。

      • xᵢ输入值。它决定了权重调整的方向和幅度。

        • 如果 xᵢ 是大的正数,错误发生时权重 wᵢ 会获得较大的调整(增加或减少)。

        • 如果 xᵢ 是 0 或很小,它对权重 wᵢ 的调整影响就很小。

        • 方向性: 公式 (y - ŷ) * xᵢ 确保了权重调整的方向是朝着减少当前样本预测错误的方向。

学习过程示例 (学习“或”运算 OR):

假设初始权重 w₁=0w₂=0b=0,学习率 η=0.5

  1. 输入样本 (x₁=0, x₂=0), y=0:

    • 计算 z = 0*0 + 0*0 + 0 = 0ŷ = step(0) = 1 (预测错误! ŷ(1) ≠ y(0))

    • 误差 (y - ŷ) = 0 - 1 = -1

    • 更新权重:

      • Δw₁ = 0.5 * (-1) * 0 = 0 => w₁ 保持 0

      • Δw₂ = 0.5 * (-1) * 0 = 0 => w₂ 保持 0

      • Δb = 0.5 * (-1) * 1 = -0.5 => b = 0 + (-0.5) = -0.5

  2. 输入样本 (x₁=0, x₂=1), y=1:

    • 计算 z = 0*0 + 0*1 + (-0.5) = -0.5ŷ = step(-0.5) = 0 (预测错误! ŷ(0) ≠ y(1))

    • 误差 (y - ŷ) = 1 - 0 = +1

    • 更新权重:

      • Δw₁ = 0.5 * 1 * 0 = 0 => w₁ 保持 0

      • Δw₂ = 0.5 * 1 * 1 = +0.5 => w₂ = 0 + 0.5 = 0.5

      • Δb = 0.5 * 1 * 1 = +0.5 => b = -0.5 + 0.5 = 0

  3. 输入样本 (x₁=1, x₂=0), y=1:

    • 计算 z = 0*1 + 0.5*0 + 0 = 0ŷ = step(0) = 1 (预测正确!) => 权重不变

  4. 输入样本 (x₁=1, x₂=1), y=1:

    • 计算 z = 0*1 + 0.5*1 + 0 = 0.5ŷ = 1 (预测正确!) => 权重不变

  5. 再次输入样本 (x₁=0, x₂=0), y=0:

    • 计算 z = 0*0 + 0.5*0 + 0 = 0ŷ = step(0) = 1 (预测错误! ŷ(1) ≠ y(0))

    • 误差 (y - ŷ) = 0 - 1 = -1

    • 更新权重:

      • Δw₁ = 0.5 * (-1) * 0 = 0 => w₁ 保持 0

      • Δw₂ = 0.5 * (-1) * 0 = 0 => w₂ 保持 0.5

      • Δb = 0.5 * (-1) * 1 = -0.5 => b = 0 + (-0.5) = -0.5

  6. 输入样本 (x₁=0, x₂=1), y=1:

    • 计算 z = 0*0 + 0.5*1 + (-0.5) = 0ŷ = step(0) = 1 (预测正确!) => 权重不变

  7. ... 继续遍历样本,直到所有样本都被正确分类。

经过足够多的迭代(遍历所有样本多次),权重会收敛到类似 w₁≈1w₂≈1b≈-0.5 的值,成功学会“或”运算。

2.3.3. 感知机的局限与多层网络

   引用自西瓜书  

核心问题:感知机的局限 - 只能解决线性可分问题
  1. 什么是线性可分?

    • 想象在二维平面上有两类点(比如红色点和蓝色点)。如果存在一条直线,能够把所有红色点划到直线的一侧,所有蓝色点划到直线的另一侧,那么这两类点就是线性可分的。

    • 在高维空间(比如有 n 个特征),线性可分意味着存在一个 n-1 维的超平面(例如三维空间里的一个平面)可以完美地将不同类别的样本分开。

  2. 感知机的能力边界:

    • 感知机(单层输出层,使用阶跃函数)本质上是一个线性分类器。它的决策边界就是由加权和 z = Σ wᵢxᵢ + b = 0 定义的一个超平面

    • 因此,感知机能够完美学习并分类任何线性可分的数据集。前面展示的“与”(AND)、“或”(OR)、“非”(NOT) 运算都是线性可分问题的典型例子(可以在二维平面上用一条直线分开)。

  3. 致命的局限:非线性可分问题 - 以“异或”(XOR)为例

    • “异或”运算 (XOR) 定义:当两个输入相异(一个为 0,一个为 1)时,输出为 1;当两个输入相同(都为 0 或都为 1)时,输出为 0。

      • (0, 0) -> 0

      • (0, 1) -> 1

      • (1, 0) -> 1

      • (1, 1) -> 0

    • 为什么感知机无法实现 XOR?(如上图所示)

      • 尝试在二维平面上画出这 4 个点:(0,0) 和 (1,1) 是输出为 0 的点(假设用 ○ 表示),(0,1) 和 (1,0) 是输出为 1 的点(假设用 × 表示)。

      • 你会发现,没有任何一条直线能把所有的 ○ (0) 和所有的 × (1) 完美地分隔在直线的两侧!○ 在对角线上,× 在另一条对角线上。

      • 数学证明(尝试设置权重):

破局之道:多层网络(引入隐藏层)

既然一层功能神经元(感知机)能力有限,无法解决像 XOR 这样的非线性问题,很自然的想法就是:堆叠更多的层!

  1. 多层前馈网络 (Multi-Layer Feedforward Network):

    • 结构:

      • 输入层: 和感知机一样,仅接收输入。

      • 隐藏层 (Hidden Layer): 位于输入层和输出层之间的神经元层。这是关键!隐藏层中的神经元是真正的功能神经元(如 M-P 神经元)。一个网络可以有多个隐藏层。

      • 输出层: 产生最终输出的功能神经元。

    • “前馈”: 信号从输入层单向流动,经过隐藏层,最终到达输出层。没有环或反馈。

    • 激活函数: 隐藏层和输出层的神经元都需要激活函数。为了能够学习复杂的非线性关系,必须使用非线性激活函数(如 Sigmoid, ReLU)。如果使用线性激活函数,多层网络最终会等价于一个单层线性网络,失去意义。

  2. 为什么多层网络能解决非线性问题(以 XOR 为例):

    • 核心思想:特征变换。 隐藏层的作用是将原始输入空间映射到一个新的特征空间。在这个新空间中,原本线性不可分的问题可能变得线性可分。

    • 用两层网络实现 XOR(1个隐藏层 + 1个输出层):
      假设隐藏层有两个神经元(H1, H2),输出层一个神经元(O)。使用阶跃函数激活。

      • H1 学习 “与” (AND-NOT): 目标是当 x₁=1 且 x₂=0 时激活。设置 w₁₁=1, w₁₂=-1, θ₁=0.5 (或 b₁=-0.5)。

        • (0,0): 1*0 + (-1)*0 = 0 < 0.5 -> 0

        • (0,1): 1*0 + (-1)*1 = -1 < 0.5 -> 0

        • (1,0): 1*1 + (-1)*0 = 1 >= 0.5 -> 1

        • (1,1): 1*1 + (-1)*1 = 0 < 0.5 -> 0

      • H2 学习 “或” (OR): 目标是当 x₁=1 或 x₂=1 时激活。设置 w₂₁=1, w₂₂=1, θ₂=0.5 (或 b₂=-0.5)。

        • (0,0): 0+0=0 < 0.5 -> 0

        • (0,1): 0+1=1 >= 0.5 -> 1

        • (1,0): 1+0=1 >= 0.5 -> 1

        • (1,1): 1+1=2 >= 0.5 -> 1

      • 输出层 O 学习 “与” (AND): 目标是当 H1 和 H2 的输出不同(即一个是 1,一个是 0)时输出 1。注意 H1 和 H2 的输出 (h₁, h₂)

        • (0,0) -> (0,0) -> O 希望输出 0

        • (0,1) -> (0,1) -> O 希望输出 1 (异)

        • (1,0) -> (1,0) -> O 希望输出 1 (异)

        • (1,1) -> (0,1) 但根据 H1 计算 (1,1)->0,H2 计算 (1,1)->1,所以是 (0,1) -> O 希望输出 1? 等等,不对!

        • 仔细看 H1 在 (1,1) 输出是 0,H2 在 (1,1) 输出是 1,所以组合 (h₁, h₂) = (0,1)。而 (0,1) 在输入层对应 (0,1) 和 (1,1) 两个样本。我们需要 O 在 (0,1) 输出 1 (对应原始输入 (0,1)),在 (0,1) (也对应原始输入 (1,1)) 输出 0。矛盾!

      • 调整(更通用的方法): 让 H1 学习 NAND (与非:NOT (x₁ AND x₂)),即 (1,1) 输出 0,其他输出 1。设置 w₁₁=-1, w₁₂=-1, θ₁=-1.5 (或 b₁=1.5)。

        • (0,0): -0-0=0 >= -1.5? (阶跃 z>=00>=0? 假设 θ 是阈值比较 z>=θ,则 0 >= -1.5 -> 1 (正确)

        • (0,1): -0-1=-1 >= -1.5? -1 >= -1.5 -> 1 (正确)

        • (1,0): -1-0=-1 >= -1.5 -> 1 (正确)

        • (1,1): -1-1=-2 >= -1.5? -2 >= -1.5? No -> 0 (正确)

      • 让 H2 学习 OR (或),如前所述 w₂₁=1, w₂₂=1, θ₂=0.5

      • 现在隐藏层输出 (h₁, h₂)

        • (0,0) -> (NAND=1, OR=0) -> (1,0)

        • (0,1) -> (NAND=1, OR=1) -> (1,1)

        • (1,0) -> (NAND=1, OR=1) -> (1,1)

        • (1,1) -> (NAND=0, OR=1) -> (0,1)

      • 输出层 O 学习 “与非”(NAND) 或 “或非”(NOR)? 观察目标输出 y:

        • 当 (h₁, h₂) = (1,0) (对应 (0,0)) -> y=0

        • 当 (h₁, h₂) = (1,1) (对应 (0,1) 和 (1,0)) -> y=1

        • 当 (h₁, h₂) = (0,1) (对应 (1,1)) -> y=0

      • 这实际上是在 (h₁, h₂) 空间上,对点 (1,0)(0,1) (y=0) 和 (1,1) (y=1) 进行分类。这是线性可分的! 例如,可以学习一个简单的 AND

        • 设置 w_o1=1, w_o2=1, θ_o=1.5 (或 b_o=-1.5)。

        • (1,0): 1*1 + 1*0 = 1 < 1.5? (阶跃 z>=θ1>=1.5? No -> 0 (正确)

        • (1,1): 1*1 + 1*1 = 2 >= 1.5 -> 1 (正确)

        • (0,1): 1*0 + 1*1 = 1 < 1.5 -> 0 (正确)

    • 关键理解:

      • 输入层 (x₁, x₂) 是线性不可分的(无法用一条直线分开 ○ 和 ×)。

      • 隐藏层 H1 (NAND) 和 H2 (OR) 将原始输入空间 (x₁, x₂) 变换到了新的特征空间 (h₁, h₂)

      • 在这个新的 (h₁, h₂) 特征空间中,代表不同原始类别的点 (1,0)(1,1)(0,1) 变得线性可分了(可以用一条直线,比如 h₁ + h₂ >= 1.5 来区分 y=1 和 y=0)。

      • 输出层 O (AND) 在这个新空间上做了一个简单的线性分类

  3. 多层网络的威力和必要性:

    • 解决非线性问题: 通过引入一个或多个隐藏层和非线性激活函数,多层网络能够学习极其复杂的非线性决策边界,解决感知机无能为力的非线性可分问题(如 XOR、复杂的图像分类、自然语言处理等)。

    • 特征学习: 隐藏层自动地从原始输入数据中学习并提取层级化的特征表示 (Hierarchical Feature Representation)

      • 底层隐藏层可能学习到简单的局部特征(如边缘、颜色斑点)。

      • 高层隐藏层可能将这些简单特征组合成更复杂的、全局的特征(如物体部件、整个物体)。

    • 通用近似定理 (Universal Approximation Theorem): 一个关键的理论基础指出,只需一个包含足够多神经元的隐藏层的前馈神经网络,就能够以任意精度逼近定义在实数空间中的任意复杂度的连续函数。这从理论上证明了多层网络强大的表达能力。

    • 超越感知机: 多层感知机 (MLP - Multi-Layer Perceptron),即具有至少一个隐藏层并使用非线性激活函数(如 Sigmoid, ReLU)的前馈网络,成为了构建更复杂、更强大的神经网络模型(如卷积神经网络 CNN、循环神经网络 RNN)的基础构件。

2.3.4多层前馈神经网络

核心概念:超越感知机的“智能”加工厂

想象一个更复杂的工厂(相比感知机那个小作坊):

  1. 原材料入口: 输入层接收原始数据(如图像像素、单词编码、传感器读数)。

  2. 多级加工车间: 隐藏层(可以有多层)对原材料进行多步骤、越来越精细的加工。每个车间(神经元)都有自己独特的加工工具(权重)和质检标准(阈值/偏置)。

  3. 成品输出: 输出层将最终加工结果包装成需要的格式(如分类标签、预测数值)。

  4. 流水线规则: 材料只能从入口(输入层)按顺序流经各个车间(隐藏层),最后到达出口(输出层),不能倒流或跨车间跳跃

层级化与连接性
  • 输入层 (Input Layer):

    • 角色: 纯粹的“接收站”。不进行任何计算。

    • 神经元: 每个神经元代表输入数据的一个特征(例如,一张28x28灰度图片有784个输入神经元,每个对应一个像素的亮度值)。

    • 输出: 直接将接收到的输入值 x₁, x₂, ..., xₙ 原封不动地传递给下一层(第一个隐藏层)的每一个神经元。

  • 隐藏层 (Hidden Layer(s)):

    • 角色: 网络的“大脑”和“引擎”。负责从输入数据中学习、提取和组合特征。是网络具备强大非线性能力的关键。

    • 神经元: 功能神经元。每个隐藏神经元都是一个 M-P神经元 的增强版:

      • 接收输入: 接收来自前一层所有神经元的输出(对于第一个隐藏层,就是输入层的输入值)。

      • 加权求和: 计算加权和 z⁽ˡ⁾_j = Σᵢ (w⁽ˡ⁾_{ji} * a⁽ˡ⁻¹⁾_i) + b⁽ˡ⁾_j

        • l 表示层索引(例如 l=1 表示第一个隐藏层)

        • j 表示当前层第 j 个神经元

        • i 表示前一层(l-1层)的神经元索引

        • w⁽ˡ⁾_{ji}:连接前一层神经元 i 到当前层神经元 j 的权重

        • a⁽ˡ⁻¹⁾_i:前一层神经元 i 的输出值(即激活值)。

        • b⁽ˡ⁾_j:当前层神经元 j 的偏置项

      • 激活函数: 将加权和 z⁽ˡ⁾_j 输入到一个非线性激活函数 g(·) 中,得到该神经元的输出(激活值) a⁽ˡ⁾_j = g(z⁽ˡ⁾_j)

        • 为什么必须是非线性? 如果使用线性函数,无论堆叠多少层,整个网络的最终输出仍然是输入的线性组合,失去解决复杂非线性问题的能力。常用非线性激活函数包括 Sigmoid, Tanh, ReLU (Rectified Linear Unit) 等。

    • 层数 & 神经元数量: 网络可以包含一个或多个隐藏层。每层可以包含任意数量的神经元。层数和每层神经元数是网络的超参数,需要根据任务和数据调整。

    • “隐藏”含义: 这些层在训练数据和最终输出之间,其值不直接可见于输入或输出,故称“隐藏”。

  • 输出层 (Output Layer):

    • 角色: 产生网络的最终预测结果。

    • 神经元: 功能神经元。结构与隐藏层神经元类似:

      • 接收来自最后一个隐藏层所有神经元的输出。

      • 计算加权和 z⁽ᴸ⁾_k = Σⱼ (w⁽ᴸ⁾_{kj} * a⁽ᴸ⁻¹⁾_j) + b⁽ᴸ⁾_k (L 表示输出层)。

      • 通过激活函数 σ(·) 得到最终输出 yₖ = σ(z⁽ᴸ⁾_k) 或 ŷₖ = σ(z⁽ᴸ⁾_k)

    • 激活函数选择: 取决于任务类型:

      • 回归任务 (预测连续值): 通常使用线性激活函数σ(z) = z)或 ReLU。

      • 二分类任务: 通常使用 Sigmoid 函数,将输出压缩到 (0,1) 区间,解释为属于正类的概率。

      • 多分类任务: 通常使用 Softmax 函数,将输出转化为概率分布(所有输出神经元之和为1)。

  • 连接方式:全连接 (Fully Connected / Dense):

    • 定义: 本层的每一个神经元都与下一层的每一个神经元相连接。

    • 图示: 想象每一层的神经元排成一排,相邻两层的神经元之间,所有可能的连接线都存在,形成一个完全二分图,如下图所示。

关键约束:

  • 无同层连接: 同一层内的神经元之间没有连接。它们彼此独立计算,仅通过下一层进行交互。

  • 无跨层连接: 信号只能逐层传递,不能跳过中间层(如输入层不能直接连到输出层)。

  • 无反馈/循环: 信号单向流动,从输入层 -> 隐藏层1 -> 隐藏层2 -> ... -> 输出层。没有信号从后层流回前层(这是与前馈循环网络 RNN 的关键区别)。

   引用自西瓜书  

2.3.5误差逆传播(BP)算法

BP算法就是让多层神经网络通过前向传播做预测、计算误差,然后利用梯度下降链式法则进行误差反向传播,一层层计算出每个参数(权重/阈值)该负多少责任(梯度),再用这个责任和学习率去更新参数,不断迭代让预测越来越准。为了防止学成“书呆子”(过拟合),要用早停正则化来提升泛化能力。本质是:试错 -> 追责 -> 改进 -> 再试错。

 引用自西瓜书  

 核心目标:
通过迭代调整网络中的所有权重(w)和偏置(b,使网络对于训练样本的预测输出 ŷ 尽可能接近真实目标 y,从而最小化一个预先定义的损失函数 L

基本原理:梯度下降与误差反向传播

BP 算法是梯度下降(Gradient Descent)算法在神经网络这一特定、复杂结构上的高效实现。其核心思想可以概括为:

  1. 前向传播 (Forward Pass): 输入一个训练样本 x,数据从输入层流向输出层。网络根据当前的权重 w 和偏置 b 逐层计算每个神经元的加权输入 z 和激活输出 a,最终得到预测输出 ŷ

  2. 计算误差 (Loss Calculation): 比较预测输出 ŷ 和真实目标 y,计算损失函数 L(ŷ, y) 的值。损失函数量化了网络当前预测的“错误程度”(例如,均方误差 MSE 或交叉熵损失 Cross-Entropy)。

  3. 反向传播 (Backward Pass): 这是 BP 算法的精髓所在。 目标是计算损失函数 L 相对于网络中每一个可学习参数(每一个 w 和 每一个 b)的梯度 ∂L/∂w 和 ∂L/∂b

    • 为什么叫“反向”? 计算梯度的过程从输出层开始,利用链式法则,沿着与信息前向传播相反的方向(从输出层 -> 最后一个隐藏层 -> ... -> 第一个隐藏层 -> 输入层),将“误差信号”或“责任”一层一层地反向传播回去。

    • 关键概念:误差项 δ 为了高效计算梯度,BP 算法定义了一个非常重要的中间量:第 l 层第 j 个神经元的误差项 δⱼ⁽ˡ⁾。它被定义为损失函数 L 相对于该神经元加权输入 zⱼ⁽ˡ⁾ 的偏导数:
      δⱼ⁽ˡ⁾ = ∂L / ∂zⱼ⁽ˡ⁾
      这个误差项 δⱼ⁽ˡ⁾ 直观地表示了:该神经元的加权输入 zⱼ⁽ˡ⁾ 发生微小变化时,对最终损失 L 的影响大小和方向。它是反向传播过程中传递的核心信息。

  4. 参数更新 (Parameter Update): 利用在第 3 步中计算出的所有梯度 (∂L/∂w, ∂L/∂b),按照梯度下降的原则更新网络参数:

    • w⁽ˡ⁾_{ji} ← w⁽ˡ⁾_{ji} - η * (∂L / ∂w⁽ˡ⁾_{ji})

    • bⱼ⁽ˡ⁾ ← bⱼ⁽ˡ⁾ - η * (∂L / ∂bⱼ⁽ˡ⁾)
      其中 η 是学习率 (Learning Rate),一个控制参数更新步长大小的超参数。负号表示沿着梯度的反方向(即损失函数下降最快的方向)更新参数,目的是减小损失 L

用一个比方来解释:
基本原理:学做菜的厨房
  • 适用场景: 你想训练一个有很多层“厨师”(神经元)的厨房(神经网络),让它学会做一道复杂的菜(比如:预测房价、识别人脸)。厨房结构是固定的(输入层->隐藏层->输出层),但每个厨师放调料的习惯(连接权)和火候偏好(阈值)一开始都是瞎蒙的。

  • 核心思想: 试错 + 改进

    • 前向传播 (做菜): 你把食材(输入数据)交给第一个厨师(输入层)。他简单处理一下传给下一层的几个“资深厨师”(隐藏层)。资深厨师们根据自己的调料习惯(权重)和火候偏好(阈值)加工食材,然后把半成品传给最后的大厨(输出层)。大厨综合所有半成品,加入自己的调料和火候,端出最终菜品(预测结果)。

    • 尝味道 (算误差): 你尝一口(对比预测结果 ŷ 和真实结果 y),皱眉头说:“太咸了!离标准味道差得远!” 这个“差得远”的程度就是误差 (E)

    • 反向传播 (找责任): 现在关键来了!菜做砸了,谁的责任?是大厨盐放多了?还是某个资深厨师提供的酱料本身就太咸?或者是食材处理阶段就出了问题?BP算法就像一个精明的监工:

      • 他先批评大厨(输出层):“你的菜太咸了(误差大),扣你工资(更新权重/阈值)!扣多少?根据你多放了多少盐(误差的梯度)来定!”

      • 接着,大厨说:“我的咸是因为张资深厨师(隐藏层某个神经元)给我的酱料本身就咸!” 监工就去找张厨师:“大厨说你的酱料太咸导致了他的问题(误差反向传播到隐藏层),你也要负责!扣你工资(更新权重/阈值)!扣多少?根据你的酱料对大厨的咸度有多大影响(链式法则计算梯度)来定!”

      • 张厨师可能还会甩锅给处理食材的小工... 就这样一层层反向追责下去,直到最开始的食材处理环节(输入层)。

    • 更新参数 (改进): 监工根据追责结果(计算出的梯度),告诉每个厨师:“你下次做这道菜时,盐少放一点(调整权重),火候调小一点(调整阈值)。” 调整的幅度由一个叫“学习率 (η)”的老板决定,老板怕厨师改得太猛(学习率太大)或者太保守(学习率太小)。

简单总结: 前向传播是做菜,反向传播是根据菜的味道(误差)一层层追责,找到每个厨师(神经元)该背多少锅(梯度),然后让他们下次做菜时调整调料和火候(更新权重和阈值),目标是让菜越做越好吃(误差越来越小)。 

网络结构与变量:厨房的架构和工具
  • 结构:

    • 输入层: 处理原始食材的人(比如洗菜工、切菜工)。人数 (d) 由食材种类决定(比如客户资料有年龄、收入、职业等 d 项)。

    • 隐藏层: 真正的烹饪主力(资深厨师)。厨房可以有多层,这里假设一层 (q 个厨师)。他们负责把初步处理的食材加工成复杂的半成品(特征提取)。

    • 输出层: 最终摆盘的大厨 (l 个)。人数由要预测的结果决定(比如预测“违约/不违约”就是1个厨师;预测“猫/狗/兔子”就是3个厨师)。

  • 关键变量 (厨师的习惯):

    • 权重 (v_ihw_hj): 厨师们“放调料的比例”。比如 v_ih 是洗菜工 i 传给资深厨师 h 的菜量对 h 最终调味的影响权重。w_hj 是资深厨师 h 的半成品对大厨 j 最终调味的影响权重。

    • 阈值 (γ_hθ_j): 厨师们的“火候偏好”或“敏感度”。阈值越高,这个厨师越“迟钝”,需要更强烈的输入(更浓的味道)才能被激活(做出反应)。

    • 激活函数 (f,常用 Sigmoid): 每个厨师自己独特的“调味方式”。Sigmoid 函数就像一个“压汁器”,不管输入多大(多浓的汤汁),它都给你压成一个 0 到 1 之间的值(比如 0.2 代表微辣,0.8 代表特辣)。它有个超棒的特性:厨师调整调料(输入)对最终味道(输出)的改变率(导数 f')很容易算出来(f' = f(1-f)),这对监工计算责任(梯度)非常方便!

    • 输出 (b_hŷ_j): 资深厨师 h 做好的半成品味道 (b_h),大厨 j 最终端上桌的菜的味道 (ŷ_j)。

误差计算与参数更新:监工的算盘
  • 误差 (E_k): 监工尝菜后,计算实际味道 (y_j^k) 和 大厨做的味道 (ŷ_j^k) 差了多少。用的是均方误差:把每种味道的差的平方加起来再除以2(方便计算导数)。差得越多,误差越大,监工越生气。

  • 参数更新规则 (扣工资/改进方案):

    • 输出层 (大厨 j 的责任):

      • 责任 (g_j): g_j = (大厨的菜味道 ŷ_j) * (1 - ŷ_j) * (真实味道 y_j - ŷ_j)。这考虑了:1) 大厨当前味道的“可调性”(Sigmoid 特性 ŷ(1-ŷ));2) 味道差多少 (y_j - ŷ_j)。差越大,责任越大。

      • 调整调料 (Δw_hj): 大厨 j 调整他从资深厨师 h 那里拿的半成品 (b_h) 的重视程度。Δw_hj = η * g_j * b_h。责任 (g_j) 越大、资深厨师 h 的半成品 (b_h) 味道越重,调整幅度越大。学习率 (η) 控制整体调整力度。

      • 调整火候 (Δθ_j): Δθ_j = -η * g_j。责任 (g_j) 越大,火候偏好(阈值)调整幅度越大(负号表示往减少误差的方向调)。

    • 隐藏层 (资深厨师 h 的责任):

      • 责任 (e_h): e_h = (资深厨师的半成品味道 b_h) * (1 - b_h) * (他影响的所有大厨的责任之和 ∑ w_hj * g_j)。这考虑了:1) 资深厨师自己半成品的“可调性” (b_h(1-b_h));2) 他影响的所有大厨的责任 (g_j) 有多大,以及他对那些大厨的影响权重 (w_hj) 有多强。他影响的大厨们责任越大、他影响越大,他的责任也越大。

      • 调整调料 (Δv_ih): 资深厨师 h 调整他从洗菜工 i 那里拿的原始食材 (x_i) 的重视程度。Δv_ih = η * e_h * x_i。他的责任 (e_h) 越大、原始食材 (x_i) 分量越足,调整幅度越大。

      • 调整火候 (Δγ_h): Δγ_h = -η * e_h。责任 (e_h) 越大,火候偏好(阈值)调整幅度越大。

简单总结: 监工先算大厨的责任有多重(g_j),扣他工资(更新 w_hjθ_j)。大厨甩锅:“是张资深厨师 (h) 的酱料害的!”。监工就去算张厨师的责任 (e_h),这责任取决于:1) 张厨师自己的问题 (b_h(1-b_h));2) 被他坑的大厨们 (g_j) 的问题有多严重以及他对大厨们 (w_hj) 的影响有多大。然后扣张厨师的工资(更新 v_ihγ_h)。

数学推导 

 

2.3.6 神经网络训练中的 “参数寻优” 问题

 “全局最小” 与 “局部极小” 的概念及相关优化策略

1. 基本概念
  • 误差函数:神经网络在训练集上的误差E是关于连接权w和阈值\theta的函数,训练过程本质是寻找使E最小的参数(w,\theta)
  • 局部极小:若存在参数(w^*;\theta^*),其邻域内所有参数的误差均不小于E(w^*;\theta^*),则(w^*;\theta^*)为局部极小解,对应的误差为局部极小值。
  • 全局最小:若参数空间中所有参数的误差均不小于E(w^*;\theta^*),则(w^*;\theta^*)为全局最小解,对应的误差为全局最小值。 关系:全局最小一定是局部极小,但局部极小不一定是全局最小(可能存在多个局部极小,仅一个全局最小)。
2. 梯度下降法的局限

基于梯度的搜索(如 BP 算法使用的梯度下降)是常用参数寻优方法,其沿负梯度方向更新参数。但当误差函数存在多个局部极小时,算法可能陷入局部极小(此时梯度为零,参数更新停止),无法找到全局最小。

3. 跳出局部极小的策略

实际任务中,常用启发式策略尝试接近全局最小:

  • 多初始点:用多组不同初始参数训练多个网络,选择误差最小的结果(增加找到全局最小附近参数的概率)。
  • 模拟退火:每步以一定概率接受 “次优解”(误差更大的解),概率随时间降低,既可能跳出局部极小,又保证最终收敛。
  • 随机梯度下降:计算梯度时引入随机因素,即使陷入局部极小,梯度仍可能非零,有机会继续搜索。
  • 遗传算法:通过模拟生物进化的选择、交叉、变异机制优化参数,有助于跳出局部极小。
核心逻辑

神经网络训练的参数寻优易受局部极小影响,需通过多种策略缓解;这些策略虽缺乏严格理论保障,但在实践中能有效提升找到全局最小附近参数的概率,改善网络泛化性能。

http://www.lryc.cn/news/602820.html

相关文章:

  • 热斑漏检率↓78%!陌讯多模态算法在无人机光伏巡检的轻量化实践
  • PBR技术
  • 利用软件定义无线USRP X410、X440 电推进无线原型设计
  • 5.Linux ssh远程登录配置及sftp,scp命令
  • 排序算法 (Sorting Algorithms)-Python示例
  • 一个高效的阿里云漏洞库爬虫工具,用于自动化爬取和处理CVE数据
  • AW2013 LED驱动芯片 工作方式介绍
  • 阿里云Ubuntu 22.04 ssh隔一段时间自动断开的解决方法
  • 解决 nginx 加载css文件时无效问题、解决 nginx 加载css文件识别成 text/plan 的问题
  • github copilot接入openai-compatible模型以及去除安全限制的方法
  • 嵌入式开发学习———Linux环境下数据结构学习(四)
  • UV安装并设置国内源
  • golang--函数栈
  • 学习lxml库:Python XML/HTML处理利器
  • 微型化IMU如何突破无人机与机器人的性能边界?
  • Vue 工程化
  • Facenet(MTCNN+InceptionResnetV1)人脸考勤项目(有缺点,但可用)
  • 前端实现PDF在线预览的8种技术方案对比与实战
  • 【kafka】消息队列
  • 专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
  • 4、如何生成分布式ID?
  • C++入门自学Day2-- c++类与对象(初识2)
  • Deepseek + browser-use 轻松实现浏览器自动化
  • “本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止”解决方式
  • Linux系统之Ansible安装与入门
  • Word VBA快速制作试卷(2/2)
  • STM32——寄存器映射
  • 安宝特新闻丨安宝特与Logivations正式建立合作伙伴关系,共筑物流新未来
  • AI应用—C++在AI中的应用
  • 1.DRF 环境安装与配置