发布时间:2026/7/2 16:00:38
CSDN博客-第3天-XOR与两层MLP
【深度学习入门 Day 3】从线性分不开到两层 MLP用 NumPy 训练 XOR本文记录深度学习学习第 3 天的内容从 XOR 问题出发理解为什么单个神经元只能做线性分类为什么需要隐藏层以及如何用 NumPy 手写一个两层 MLP。最后补充激活函数的选择为什么这次用tanh比ReLU更容易收敛以及不同场景下该怎么选激活函数。文章目录一、今天的问题单个神经元为什么不够二、XOR一条直线分不开的数据三、从单层模型到两层 MLP四、前向传播从输入到预测五、损失函数二元交叉熵 BCE六、反向传播从输出层传回隐藏层七、为什么换成 tanh 后更容易学会 XOR八、激活函数怎么选九、完整 NumPy 训练代码十、今日总结十一、课后自测一、今天的问题单个神经元为什么不够前两天我们训练的是一个 sigmoid 神经元z X w b a sigmoid(z)如果这是一个二维二分类问题那么分类边界来自X w b 0展开就是w1*x1 w2*x2 b 0这在二维平面里是一条直线。所以单个 sigmoid 神经元本质上只能做一件事用一条直线把平面分成两边。如果数据刚好可以被一条直线分开单个神经元就够用。但如果数据本身不是线性可分的一条直线再怎么移动、旋转也分不开。二、XOR一条直线分不开的数据今天使用经典的 XOR 数据Xnp.array([[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],])ynp.array([[0.0],[1.0],[1.0],[0.0]])表格形式x1x2y000011101110XOR 的规律是两个输入相同 - 0 两个输入不同 - 1在平面上看标签为 1 的两个点在对角线上(0, 1), (1, 0)标签为 0 的两个点也在另一条对角线上(0, 0), (1, 1)这就导致没有任何一条直线可以把两个 1 和两个 0 完全分开。这就是 XOR 经常被用来解释神经网络的原因它非常小但足够说明“线性模型不够用”。三、从单层模型到两层 MLP为了解决 XOR我们加一个隐藏层。今天的模型结构是X ↓ z1 X W1 b1 ↓ a1 tanh(z1) ↓ z2 a1 W2 b2 ↓ a2 sigmoid(z2)这就是一个最小版本的两层 MLP。如果隐藏层有 4 个神经元各个变量的形状是X.shape (4, 2) W1.shape (2, 4) b1.shape (1, 4) z1.shape (4, 4) a1.shape (4, 4) W2.shape (4, 1) b2.shape (1, 1) z2.shape (4, 1) a2.shape (4, 1)这里最容易错的是W1的形状。因为X W1 (4, 2) (?, ?) (4, 4)所以W1.shape (2, 4)口诀X: 样本数 x 输入特征数 W1: 输入特征数 x 隐藏神经元数 Z1: 样本数 x 隐藏神经元数隐藏层的意义不是“多算了一层”而是学习一组新的特征表示让原本线性分不开的数据在新的表示空间里变得更容易分开。四、前向传播从输入到预测先初始化参数np.random.seed(42)W1np.random.randn(2,4)*0.1b1np.zeros((1,4))W2np.random.randn(4,1)*0.1b2np.zeros((1,1))定义激活函数deftanh(z):returnnp.tanh(z)defsigmoid(z):return1/(1np.exp(-z))前向传播z1X W1b1 a1tanh(z1)z2a1 W2b2 a2sigmoid(z2)刚初始化时模型基本还不会判断输出通常都在 0.5 附近a2 ≈ [0.5, 0.5, 0.5, 0.5]这很正常。随机初始化的模型一开始就是在猜。五、损失函数二元交叉熵 BCE二分类任务常用 BCE也就是 Binary Cross Entropydefbce_loss(a2,y):eps1e-8return-np.mean(y*np.log(a2eps)(1-y)*np.log(1-a2eps))单样本公式是L -[y log(a) (1-y) log(1-a)]分两种情况看。如果真实标签是 1L -log(a)此时a越接近 1损失越小。如果真实标签是 0L -log(1-a)此时a越接近 0损失越小。所以 BCE 做的事情可以理解成如果真实是 1就惩罚模型没有把概率预测到 1如果真实是 0就惩罚模型没有把概率预测到 0。代码里的eps 1e-8是为了防止出现log(0)避免程序得到inf或nan。六、反向传播从输出层传回隐藏层1. 输出层梯度对于sigmoid BCE输出层梯度有一个非常常用的简化dZ2(a2-y)/N也就是说输出层误差信号 预测值 - 真实值。直觉上很好理解。如果真实标签是 1但模型预测 0.2a2 - y 0.2 - 1 -0.8梯度是负的参数更新会让z2变大从而让sigmoid(z2)也变大。如果真实标签是 0但模型预测 0.8a2 - y 0.8 - 0 0.8梯度是正的参数更新会让z2变小从而让sigmoid(z2)也变小。输出层参数梯度dW2a1.T dZ2 db2np.sum(dZ2,axis0,keepdimsTrue)形状关系a1.T dZ2 (4, 4) (4, 1) (4, 1)正好对应W2.shape (4, 1)2. 隐藏层梯度误差信号继续传回隐藏层dA1dZ2 W2.T形状是(4, 1) (1, 4) (4, 4)因为隐藏层用了tanha1tanh(z1)而tanh(z) 1 - tanh(z)^2所以dZ1dA1*(1-a1**2)第一层参数梯度dW1X.T dZ1 db1np.sum(dZ1,axis0,keepdimsTrue)形状闭环dW1.shape W1.shape (2, 4) db1.shape b1.shape (1, 4)这说明反向传播的矩阵形状是对的。七、为什么换成 tanh 后更容易学会 XOR一开始尝试用ReLUdefrelu(z):returnnp.maximum(0,z)可能会出现模型卡住的情况例如预测变成pred [1, 1, 1, 0]它学到了一个不完整的规则只有 [1, 1] 判成 0其他都判成 1但 XOR 真正应该是pred [0, 1, 1, 0]这不是代码一定写错了而是优化过程可能卡在了不好的位置。ReLU的特点是ReLU(z) max(0, z)当z 0时ReLU(z) 0也就是说对应神经元可能收不到梯度参数不容易继续调整。这种现象常被称为“ReLU 死亡”。而tanh的输出范围是(-1, 1)它有几个特点输出是零中心的既有正值也有负值。对 XOR 这种需要表达“相同/不同”“正反关系”的小问题比较友好。在输入不太大的区域梯度比较连续不会像 ReLU 那样一半区域直接为 0。所以这次 XOR 小实验中把隐藏层从ReLU换成tanh后模型更容易训练到pred [0, 1, 1, 0]要注意不是说 tanh 永远比 ReLU 好而是具体问题、网络深度、初始化、学习率都会影响激活函数的效果。八、激活函数怎么选1. Sigmoid公式sigmoid(z) 1 / (1 exp(-z))输出范围(0, 1)适合二分类输出层需要把结果解释为概率的地方不太适合深层网络的隐藏层原因容易梯度消失输出不是零中心本次实验中sigmoid用在输出层a2sigmoid(z2)因为我们要输出“属于 1 类的概率”。2. Tanh公式tanh(z) (exp(z) - exp(-z)) / (exp(z) exp(-z))输出范围(-1, 1)适合小型网络输入范围较小的问题RNN 等传统序列模型像 XOR 这种需要表达正负关系的小实验优点输出零中心比 sigmoid 更适合做隐藏层缺点输入绝对值很大时仍然会梯度饱和很深的网络中不如 ReLU 系列常用本次实验中tanh用在隐藏层a1tanh(z1)3. ReLU公式ReLU(z) max(0, z)适合大多数前馈神经网络的隐藏层CNN深层网络优点计算简单正区间梯度稳定训练深层网络通常更快缺点当神经元长期落在负区间时梯度为 0可能出现“死亡 ReLU”对学习率和初始化有一定敏感性经验如果没有特别理由隐藏层通常可以先试 ReLU。4. Leaky ReLU公式LeakyReLU(z) max(0.01z, z)适合想用 ReLU但担心神经元死亡小数据或训练不稳定时优点负区间也保留一点梯度比 ReLU 更不容易完全卡死5. GELU常见于 TransformerGELU(z) z * Φ(z)适合TransformerBERT / GPT 等大模型结构经验如果你在写 Transformer默认考虑 GELU 或其近似版本。6. Softmax适合多分类输出层它会把多个类别的分数转成概率分布所有类别概率之和 1例如数字识别 10 分类[0, 1, 2, ..., 9]输出层一般用softmax cross entropy简单选择表场景推荐激活函数二分类输出层Sigmoid多分类输出层Softmax普通隐藏层ReLUReLU 容易卡住Leaky ReLU小型实验 / XOR / 零中心隐藏表示TanhTransformer / 大模型GELU九、完整 NumPy 训练代码importnumpyasnp# XOR 数据Xnp.array([[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],])ynp.array([[0.0],[1.0],[1.0],[0.0]])np.random.seed(42)# 输入层 2 个特征隐藏层 4 个神经元W1np.random.randn(2,4)*0.1b1np.zeros((1,4))# 输出层 1 个神经元W2np.random.randn(4,1)*0.1b2np.zeros((1,1))lr0.1deftanh(z):returnnp.tanh(z)defsigmoid(z):return1/(1np.exp(-z))defbce_loss(a2,y):eps1e-8return-np.mean(y*np.log(a2eps)(1-y)*np.log(1-a2eps))forstepinrange(10001):# forwardz1X W1b1 a1tanh(z1)z2a1 W2b2 a2sigmoid(z2)lossbce_loss(a2,y)# backwardNlen(y)dZ2(a2-y)/N dW2a1.T dZ2 db2np.sum(dZ2,axis0,keepdimsTrue)dA1dZ2 W2.T dZ1dA1*(1-a1**2)dW1X.T dZ1 db1np.sum(dZ1,axis0,keepdimsTrue)# updateW2W2-lr*dW2 b2b2-lr*db2 W1W1-lr*dW1 b1b1-lr*db1ifstep%10000:pred(a20.5).astype(int)print(fstep{step:05d}, floss{loss:.6f}, fa2{a2.ravel().round(3)}, fpred{pred.ravel()})如果训练成功最终预测会接近pred [0 1 1 0]这说明模型已经学会了 XOR。十、今日总结今天的核心内容可以压缩成 5 点单个 sigmoid 神经元的分类边界是一条直线因此无法解决 XOR。XOR 是线性不可分问题需要隐藏层引入非线性表示。两层 MLP 的前向传播是X - tanh hidden - sigmoid output。sigmoid BCE的输出层梯度可以简化为dZ2 (a2 - y) / N。激活函数会影响训练效果本次 XOR 小实验中tanh比ReLU更容易收敛。最终要记住这句话网络结构决定模型有没有能力表达某种规律激活函数、初始化和学习率会影响训练能不能顺利找到这组参数。十一、课后自测为什么单个 sigmoid 神经元只能得到一条线性分类边界XOR 为什么不能被一条直线分开如果X.shape (4, 2)隐藏层有 4 个神经元为什么W1.shape (2, 4)sigmoid BCE为什么可以得到dZ2 (a2 - y) / Ntanh(z)为什么可以写成1 - a1 ** 2ReLU 在什么情况下可能卡住二分类输出层为什么通常用 sigmoid而多分类输出层通常用 softmax

相关新闻

74HC32与PIC18F46K40实现硬件去抖动2x2键盘设计
2026/7/2 16:00:38

74HC32与PIC18F46K40实现硬件去抖动2x2键盘设计

1. 项目背景与核心需求在嵌入式系统开发中,人机交互界面设计往往需要兼顾功能性与简洁性。2x2键盘作为一种精简的输入方案,能够通过有限的物理按键实现多种功能控制,特别适合空间受限或成本敏感的应用场景。传统方案中,微控制器直…

阅读更多
48tools:一站式多媒体内容管理神器,轻松搞定直播录制与视频下载
2026/7/2 16:00:38

48tools:一站式多媒体内容管理神器,轻松搞定直播录制与视频下载

48tools:一站式多媒体内容管理神器,轻松搞定直播录制与视频下载 【免费下载链接】48tools 48工具,提供公演、口袋48直播录源,公演、口袋48录播下载,封面下载,B站直播抓取,B站视频下载&#xff0…

阅读更多
AI 都写三成代码了,程序员是不是快没用了?我天天用它,也去把数据查了
2026/7/2 16:00:38

AI 都写三成代码了,程序员是不是快没用了?我天天用它,也去把数据查了

AI 都写三成代码了,程序员是不是快没用了?我天天用它,也去把数据查了 这一年,干这行的耳朵边总围着两种声音。 一种喊:程序员要完了,AI 全包了,这届是最后一代。另一种喊:AI 就是个高…

阅读更多
OA系统渗透测试实战:从资产识别到漏洞验证的自动化工具链设计
2026/7/2 17:00:38

OA系统渗透测试实战:从资产识别到漏洞验证的自动化工具链设计

1. 项目概述:从新手到实战的OA系统漏洞评估路径看到这个标题,很多刚入行的安全爱好者或者想从理论转向实践的朋友,眼睛肯定会一亮。市面上关于渗透测试的教程很多,但往往要么是纯理论,要么是零散的靶机练习&#xff0c…

阅读更多
特殊弹簧设计与制造工艺详解:从异形弹簧到模具弹簧的工程实践
2026/7/2 17:00:38

特殊弹簧设计与制造工艺详解:从异形弹簧到模具弹簧的工程实践

概述 特殊弹簧(Special Springs)区别于通用标准弹簧,其设计需综合考虑空间约束、载荷特性、工作环境与寿命要求。本文从工程师视角出发,系统梳理异形弹簧、模具弹簧、扭簧及气弹簧的技术要点,涵盖材料选型、工艺控制与…

阅读更多
2026必看:新手AI编程工具综合推荐
2026/7/2 17:00:38

2026必看:新手AI编程工具综合推荐

作为一个写代码要听白噪音才能专注的人,AI编程工具的「存在感」对我来说很关键:太吵烦人,太安静又没用。5款对比。作为刚升技术管理的资深开发,我在在线教育平台「学知云」开发中踩过安全与租户隔离的大坑,也深度试用了…

阅读更多
AI Agent成本陷阱:推理链、工具调用与上下文的三大开销源
2026/7/2 17:00:38

AI Agent成本陷阱:推理链、工具调用与上下文的三大开销源

1. 项目概述:为什么“AI Agent”正在悄悄吃掉你的预算最近三个月,我帮六家不同行业的客户落地AI Agent方案——有做跨境电商客服自动响应的,有给本地律所搭合同初审助手的,也有为制造业工厂部署设备报修调度Agent的。结果很意外&a…

阅读更多
如何轻松掌握DRG存档编辑器:5分钟快速上手完整指南
2026/7/2 17:00:38

如何轻松掌握DRG存档编辑器:5分钟快速上手完整指南

如何轻松掌握DRG存档编辑器:5分钟快速上手完整指南 【免费下载链接】DRG-Save-Editor Rock and stone! 项目地址: https://gitcode.com/gh_mirrors/dr/DRG-Save-Editor 还在为《深岩银河》中稀有的矿物资源而苦恼吗?是不是觉得职业升级太慢&#…

阅读更多
CSDN博客-第3天-XOR与两层MLP
2026/7/2 16:00:38

CSDN博客-第3天-XOR与两层MLP

【深度学习入门 Day 3】从线性分不开到两层 MLP:用 NumPy 训练 XOR本文记录深度学习学习第 3 天的内容:从 XOR 问题出发,理解为什么单个神经元只能做线性分类,为什么需要隐藏层,以及如何用 NumPy 手写一个两层 MLP。最…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/7/2 4:50:04

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/7/2 2:06:24

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
BurpSuite Cluster Bomb模式深度避坑指南:从原理到实战的完整爆破策略
2026/7/2 0:00:34

BurpSuite Cluster Bomb模式深度避坑指南:从原理到实战的完整爆破策略

1. 项目概述:从“能用”到“精通”的必经之路如果你正在学习或从事网络安全测试,尤其是Web应用安全评估,那么BurpSuite的Intruder模块绝对是你绕不开的核心工具。而Intruder模块里,功能最强大、也最让人又爱又恨的,莫过…

阅读更多
Selenium元素定位全解析:从八大方法到实战策略
2026/7/2 0:00:34

Selenium元素定位全解析:从八大方法到实战策略

1. 项目概述:从“找东西”到“精准操控” 做自动化测试,尤其是Web UI自动化,最核心也最让人头疼的一步是什么?不是写复杂的业务逻辑,也不是处理异步加载,而是最基础的—— 让程序找到页面上那个你想操作的…

阅读更多
移动端UI自动化测试框架Maestro终极指南:从入门到实战
2026/7/2 0:00:34

移动端UI自动化测试框架Maestro终极指南:从入门到实战

1. 项目概述:为什么是Maestro? 如果你正在寻找一个能让你快速上手、告别繁琐配置、并且对移动端UI自动化测试真正友好的框架,那么Maestro很可能就是你一直在等的那个答案。我接触过Appium、Espresso、XCUITest,也折腾过各种基于图…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/1 0:00:31

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/1 0:00:31

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/1 0:00:31

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多