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

神经网络中的那些关键设计:从输入输出到参数更新

在神经网络的世界里,每个层的设计都有其背后的逻辑,而损失函数与参数更新的配合更是模型学习的核心。今天我们就来聊聊几个基础却至关重要的问题:输入层和输出层的神经元数量如何确定?交叉熵损失又是如何推动模型优化的?

输入层:与特征维度 “一一对应”

输入层作为神经网络的 “信息入口”,其神经元数量的设计遵循一个简单直接的原则 —— 与输入样本的特征维度保持一致。

比如经典的 MNIST 手写数字数据集,每张图片是 28×28 像素的灰度图。当我们将图片展开成向量后,就得到了一个 784 维的特征向量。此时,输入层就会设置 784 个神经元,每个神经元对应一个像素值,负责接收这一维度的原始特征信息。

这种设计的逻辑很简单:确保网络能完整捕获输入样本的全部信息。如果输入层神经元数量少于特征维度,就会丢失部分信息;多于特征维度则会引入冗余,增加计算成本。当然,在某些场景下,我们可能会先通过 PCA 等方法对原始特征降维,这时输入层神经元数量就会等于降维后的维度,但本质上仍是与 “输入到网络的特征维度” 保持一致。

输出层:匹配分类任务的类别数

与输入层类似,输出层的神经元数量设计也有明确的依据,尤其是在分类任务中,通常与类别的数量一致。

以手写数字分类为例,我们需要区分 0-9 共 10 个数字,因此输出层会设置 10 个神经元。每个神经元的输出经过 softmax 激活函数处理后,会转化为该样本属于对应类别的概率(10 个概率之和为 1)。比如第 3 个神经元输出概率最高时,模型就会预测这个数字是 “2”(索引从 0 开始)。

不过在二分类任务中,我们有时会简化设计:只用 1 个神经元,通过 sigmoid 激活函数输出 “属于正类” 的概率(范围在 0-1 之间),而 “属于负类” 的概率则为 1 减去该值。这种设计虽简洁,但本质上仍对应着 2 个类别。

交叉熵:衡量差异的 “标尺”

有了输入层和输出层的设计,网络还需要一个 “裁判” 来判断预测结果的好坏,交叉熵损失函数就扮演了这个角色。它的核心作用是衡量模型预测的概率分布与真实标签分布之间的差异。

在多分类场景中,假设真实标签是一个 one-hot 向量(比如真实类别是第 2 类时,标签为 [0,1,0]),模型输出的预测概率分布为y^\hat{y}y^,交叉熵损失LLL的计算公式为:

L=−∑i=1kyi⋅log⁡(y^i)L = -\sum_{i=1}^k y_i \cdot \log(\hat{y}_i)L=i=1kyilog(y^i)

由于真实标签是 one-hot 形式,这个公式其实简化为只计算真实类别对应的预测概率的负对数。损失越大,说明预测与真实值的差异越大。

从损失到参数:反向传播的 “魔法”

交叉熵损失的真正价值,在于它能通过反向传播算法为模型参数(权重、偏置)的更新提供 “梯度信号”。我们用一个简单的网络结构来看看这个过程:

假设输入层有 2 个神经元,隐藏层有 1 个神经元,输出层有 3 个神经元(对应 3 分类任务)。其中,隐藏层输出为a1a_1a1,输出层第iii个神经元的未激活值为z2i=w2i⋅a1+b2iz_{2i}=w_{2i}\cdot a_1 + b_{2i}z2i=w2ia1+b2iw2iw_{2i}w2i为输出层第iii个神经元的权重,b2ib_{2i}b2i为偏置),输出层的预测概率y^i=softmax(z2)i=ez2i∑j=13ez2j\hat{y}_i=\text{softmax}(z_2)_i=\frac{e^{z_{2i}}}{\sum_{j=1}^3 e^{z_{2j}}}y^i=softmax(z2)i=j=13ez2jez2i(记分母为S=∑j=13ez2jS=\sum_{j=1}^3 e^{z_{2j}}S=j=13ez2j)。

下面我们详细推导交叉熵损失对输出层权重w2iw_{2i}w2i的偏导数:

步骤 1:明确链式法则的推导路径

根据复合函数求导的链式法则,损失LLLw2iw_{2i}w2i的偏导数可分解为:

∂L∂w2i=∂L∂y^i⋅∂y^i∂z2i⋅∂z2i∂w2i\frac{\partial L}{\partial w_{2i}}=\frac{\partial L}{\partial \hat{y}_i}\cdot \frac{\partial \hat{y}_i}{\partial z_{2i}}\cdot \frac{\partial z_{2i}}{\partial w_{2i}}w2iL=y^iLz2iy^iw2iz2i

步骤 2:计算∂L∂y^i\frac{\partial L}{\partial \hat{y}_i}y^iL

由交叉熵损失公式L=−∑i=13yi⋅log⁡(y^i)L = -\sum_{i=1}^3 y_i \cdot \log(\hat{y}_i)L=i=13yilog(y^i),对y^i\hat{y}_iy^i求偏导:

∂L∂y^i=−yiy^i\frac{\partial L}{\partial \hat{y}_i}=-\frac{y_i}{\hat{y}_i}y^iL=y^iyi

这是因为当对y^i\hat{y}_iy^i求导时,只有yi⋅log⁡(y^i)y_i\cdot\log(\hat{y}_i)yilog(y^i)这一项涉及y^i\hat{y}_iy^i,根据(log⁡x)′=1x(\log x)'=\frac{1}{x}(logx)=x1,可得上述结果。

步骤 3:计算∂y^i∂z2i\frac{\partial \hat{y}_i}{\partial z_{2i}}z2iy^i

根据 softmax 函数y^i=ez2iS\hat{y}_i=\frac{e^{z_{2i}}}{S}y^i=Sez2i,分两种情况讨论:

  • i=ji=ji=j时(求对自身未激活值的偏导):

    ∂y^i∂z2i=ez2i⋅S−ez2i⋅ez2iS2=ez2iS⋅(1−ez2iS)=y^i(1−y^i)\frac{\partial \hat{y}_i}{\partial z_{2i}}=\frac{e^{z_{2i}}\cdot S - e^{z_{2i}}\cdot e^{z_{2i}}}{S^2}=\frac{e^{z_{2i}}}{S}\cdot(1-\frac{e^{z_{2i}}}{S})=\hat{y}_i(1 - \hat{y}_i)z2iy^i=S2ez2iSez2iez2i=Sez2i(1Sez2i)=y^i(1y^i)

  • i≠ji\neq ji=j时(求对其他未激活值的偏导):

    ∂y^i∂z2j=0⋅S−ez2i⋅ez2jS2=−y^iy^j\frac{\partial \hat{y}_i}{\partial z_{2j}}=\frac{0\cdot S - e^{z_{2i}}\cdot e^{z_{2j}}}{S^2}=-\hat{y}_i\hat{y}_jz2jy^i=S20Sez2iez2j=y^iy^j

在我们的推导中,关注的是∂y^i∂z2i\frac{\partial \hat{y}_i}{\partial z_{2i}}z2iy^i,即i=ji=ji=j的情况,所以∂y^i∂z2i=y^i(1−y^i)\frac{\partial \hat{y}_i}{\partial z_{2i}}=\hat{y}_i(1 - \hat{y}_i)z2iy^i=y^i(1y^i)

步骤 4:计算∂z2i∂w2i\frac{\partial z_{2i}}{\partial w_{2i}}w2iz2i

z2i=w2i⋅a1+b2iz_{2i}=w_{2i}\cdot a_1 + b_{2i}z2i=w2ia1+b2i,对w2iw_{2i}w2i求偏导:

∂z2i∂w2i=a1\frac{\partial z_{2i}}{\partial w_{2i}}=a_1w2iz2i=a1

这是因为w2iw_{2i}w2i只与z2iz_{2i}z2i中的w2i⋅a1w_{2i}\cdot a_1w2ia1项相关,其他项为常数,导数为 0。

步骤 5:合并结果

将上述三步的结果相乘:

∂L∂w2i=(−yiy^i)⋅y^i(1−y^i)⋅a1=(−yi)⋅(1−y^i)⋅a1=(y^i−yi)⋅a1\frac{\partial L}{\partial w_{2i}}=(-\frac{y_i}{\hat{y}_i})\cdot\hat{y}_i(1 - \hat{y}_i)\cdot a_1=(-y_i)\cdot(1 - \hat{y}_i)\cdot a_1=(\hat{y}_i - y_i)\cdot a_1w2iL=(y^iyi)y^i(1y^i)a1=(yi)(1y^i)a1=(y^iyi)a1

这个结果直观地告诉我们:权重的更新方向与 “预测误差”(y^i−yi\hat{y}_i - y_iy^iyi)和前一层输出相关。

有了梯度后,我们就可以用梯度下降等优化算法更新权重,让损失逐渐减小。重复 “前向传播计算损失→反向传播求梯度→参数更新” 的过程,模型就能不断学习,最终实现更准确的预测。

总结

神经网络的设计充满了逻辑与巧思:输入层神经元数量对应特征维度,确保信息完整输入;输出层神经元数量匹配类别数,便于输出各类别概率;交叉熵损失则通过衡量预测与真实值的差异,为参数更新提供关键指引,推动模型不断优化。理解这些基础设计原则和机制,能帮助我们更好地构建和调优神经网络模型。

(注:文档部分内容由 AI 生成)

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

相关文章:

  • 面试题储备-MQ篇 3-说说你对Kafka的理解
  • 图论\dp 两题
  • 设计模式笔记_行为型_命令模式
  • 【React】事件绑定和组件基础使用
  • 从线性回归到神经网络到自注意力机制 —— 激活函数与参数的演进
  • java基础(十二)redis 日志机制以及常见问题
  • 2025年12大AI测试自动化工具
  • 多模态大模型应用落地:从图文生成到音视频交互的技术选型与实践
  • 【模块系列】STM32W25Q64
  • TDengine IDMP 运维指南(4. 使用 Docker 部署)
  • 第六天~提取Arxml中CAN物理通道信息CANChannel--Physical Channel
  • 5. Dataloader 自定义数据集制作
  • C语言基础:(十八)C语言内存函数
  • java17学习笔记-Deprecate the Applet API for Removal
  • 算法——质数筛法
  • yolov5s.onnx转rk模型以及相关使用详细教程
  • 假设检验的原理
  • python的社区互助养老系统
  • word如何转换为pdf
  • MFC中使用EXCEL的方法之一
  • ios使用saveVideoToPhotosAlbum 保存视频失败提示 invalid video
  • 基于单片机的智能声控窗帘
  • 437. 路径总和 III
  • Qt 插件开发全解析:从接口定义,插件封装,插件调用到插件间的通信
  • SWMM排水管网水力、水质建模及在海绵与水环境中的应用
  • 第5章 高级状态管理
  • 结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
  • 深入理解 CAS:无锁编程的核心基石
  • nginx安装配置教程
  • 理解JavaScript中的函数赋值和调用