吴恩达深度学习(神经网络)【中】:激活函数(有实验,多类别Softmax);Adam优化算法;反向传播具体计算过程;卷积层;非线性/线性、多项式回归、逻辑回归、神经网络

发布时间:2026/7/8 8:20:08
吴恩达深度学习(神经网络)【中】:激活函数(有实验,多类别Softmax);Adam优化算法;反向传播具体计算过程;卷积层;非线性/线性、多项式回归、逻辑回归、神经网络 视频57.Sigmoid激活函数的替代方案_哔哩哔哩_bilibili笔记吴恩达机器学习笔记 - Sanzo Blog神经网络作业对照着jupyter上的英文看中文翻译版内容更全(99 封私信) 王者归来全新升级吴恩达《机器学习2022》——民间自制中文翻译版 - 知乎一、【必看】激活函数1、非线性 区别 线性1数学本质的区别线性Linear满足“可加性”和“齐次性”。通俗来说输入和输出之间是固定比例的关系。数学公式 yw⋅xb 。无论输入 x 怎么变化 x 永远是一次方且变量之间没有相乘或嵌套。非线性Non-linear不满足上述比例关系。输入和输出之间是复杂多变的关系。数学公式​。变量可能带有指数、对数或者被嵌套在复杂的函数内部。2直观的几何区别画在图上线性的表现在二维坐标系中它画出来永远是一条笔直的线在三维空间中它永远是一个平坦的平面。非线性的表现它可以是弯曲的曲线、波浪线甚至是极其扭曲、折叠的复杂形状。3在机器学习中的核心区别逻辑回归与神经网络的核心分水岭这是你之前学习的逻辑回归与神经网络的核心分水岭线性模型的局限如线性回归、逻辑回归因为只能画出“直线”或“平面”所以它们只能处理线性可分的数据。如果数据是像“靶子”一样呈同心圆分布或者呈月牙形分布线性模型无论怎么调整参数都无法用一条直线将它们完美分开。非线性模型的威力如神经网络神经网络之所以强大就是因为它在隐藏层中引入了非线性激活函数如 ReLU, Sigmoid。这些非线性函数赋予了模型“扭曲空间”的能力。通过层层叠加的非线性变换神经网络可以把原本纠缠在一起、无法用直线分开的复杂数据像揉面团一样“揉捏”变形最终变得可以用简单的边界分割开来。4多项式回归 区别 神经网络下述链接十、吴恩达机器学习上线性回归、梯度下降学习率、多特征向量化、特征缩放、多项式回归_吴恩达机器学习算法-CSDN博客1》疑问多项式回归是线性还是非线性多项式回归在“几何形状”上是非线性的但在“机器学习/数学优化”本质上它依然属于线性模型。2》多项式回归 区别 神经网络既然多项式回归也能拟合曲线那它和神经网络的非线性有什么区别多项式回归是“手工”构造非线性。你需要人为地决定引入​ 还是​ 。它的底层依然是线性的使用的是均方误差MSE损失函数是完美的凸函数绝对没有局部最优解一定能找到全局最佳参数。神经网络是“自动”学习非线性。它不需要你手动构造​ 而是通过隐藏层和激活函数如 ReLU、Sigmoid自动去“扭曲”空间。它的参数是嵌套相乘的损失函数是非凸的优化难度远大于多项式回归。2、为什么需要更换激活函数以上面三、2、的“T恤衫需求预测”为例其中一个隐藏单元用于估算“市场认知度”awareness。​​Sigmoid 的局限Sigmoid 函数的输出范围是 (0, 1)这相当于在预测一个概率。但“认知度”不一定是一个概率它可以是任意非负数值比如从“略有耳闻”到“全网爆火”其数值可以非常大。解决方案为了让激活值a能够取到任意非负数我们需要一个不同于 Sigmoid 的激活函数。3、三种最常用的激活函数​1ReLU (默认选择)公式g(z) max(0, z)图像当z小于 0 时输出为 0当z大于等于 0 时输出为z本身一条 45 度直线。特点这是神经网络中最常用的激活函数之一。它允许激活值取任意非负数解决了 Sigmoid 在预测非概率值时的局限性。2Sigmoid公式g(z) 1 / (1 e⁻ᶻ)图像一条平滑的 S 形曲线。特点输出范围在 (0, 1) 之间常用于二分类问题的输出层。3Linear (线性激活函数)公式g(z) z图像一条穿过原点的 45 度直线。特点有时人们会说“不使用任何激活函数”指的就是使用线性激活函数。在这种情况下激活值a就等于z(即w·x b)。这三种是目前神经网络中最主流的激活函数。在十、中还会介绍第四种——Softmax 激活函数。4、【必看】如何为神经网络的不同层级选择合适的激活函数1输出层激活函数的选择对于输出层选择哪种激活函数主要取决于你的目标标签y的类型。通常会有一个非常自然的选择1》二分类问题场景y的取值为 0 或 1。选择Sigmoid函数。原因Sigmoid 函数的输出范围是 (0, 1)可以完美地解释为预测y1的概率这与逻辑回归的原理一致。2》回归问题场景 Ay可以是任意实数包括正数和负数例如预测股票价格的涨跌。选择线性函数。原因线性函数g(z) z的输出范围是 (-∞, ∞)可以覆盖所有可能的数值。场景 By只能是非负数例如预测房价价格不可能为负。选择ReLU函数。原因ReLU 函数的输出范围是 [0, ∞)正好符合非负数的要求。2隐藏层激活函数的选择默认选择ReLU对于隐藏层ReLU是目前绝大多数从业者的默认和最常见选择。尽管我们上述举例一直用 Sigmoid 函数来介绍神经网络但领域已经发展ReLU 因其显著优势而成为主流。1》为什么 ReLU 优于 Sigmoid​计算速度更快ReLU计算max(0, z)非常简单。Sigmoid需要进行指数运算和除法计算成本更高。更利于梯度下降学习 (更重要的原因)Sigmoid 的问题Sigmoid 函数在z值很大或很小时曲线会变得非常平坦。在这些区域函数的梯度导数接近于零。在使用梯度下降进行训练时这会导致参数更新极其缓慢学习过程变慢这种现象被称为“梯度消失”。ReLU 的优势ReLU 函数只在z 0的一侧是平坦的而在z 0的一侧梯度恒为 1。这意味着它“平坦”的区域更少使得梯度下降算法能够更高效地工作从而让神经网络学习得更快。3总结与推荐隐藏层将ReLU作为默认的激活函数。输出层根据y的类型从 Sigmoid、线性函数或 ReLU 中选择最自然的一个。​4疑问为什么必须在隐藏层使用非线性的激活函数如 ReLU而不能全部使用线性激活函数下述链接中的实验有代码可以体会实质与【上】篇的一、是一样的理解王者归来全新升级吴恩达《机器学习2022》 C2-W2 - Heywhale.com1》核心结论线性激活函数的致命缺陷如果在神经网络的所有神经元中都使用线性激活函数即 g(z)z 那么无论你的网络有多少层、多么庞大它最终在数学上都完全等价于一个简单的线性回归模型。这违背了使用神经网络的初衷因为它无法学习任何比线性回归更复杂的特征。2》数学推导线性函数的叠加依然是线性函数​视频通过一个简单的两层网络1个隐藏单元1个输出单元进行了数学证明​3》总结全线性 线性回归如果所有层包括隐藏层和输出层都使用线性激活函数网络等价于线性回归。隐藏层线性 输出层 Sigmoid 逻辑回归如果隐藏层全用线性激活但输出层使用 Sigmoid 激活函数那么整个网络在数学上就完全等价于一个逻辑回归模型。黄金法则永远不要在隐藏层使用线性激活函数。对于隐藏层强烈建议默认使用ReLU激活函数。​二、激活函数Softmax多分类问题【有实验略】60.多类别_哔哩哔哩_bilibili​有实验如下王者归来全新升级吴恩达《机器学习2022》 C2-W2 - Heywhale.com​​三、【必看】Adam优化算法比标准的梯度下降算法训练速度更快性能优势Adam 算法通常比标准的梯度下降算法训练速度更快。事实标准它已成为从业者训练神经网络的“事实标准”。推荐选择如果不确定选择哪种优化算法使用 Adam 是一个安全且高效的选择大多数从业者目前都倾向于使用 Adam 而非传统的梯度下降。1、传统梯度下降的局限​学习率过小当学习率alpha较小时梯度下降在损失函数的等高线图上会沿着同一方向迈出一小步导致收敛速度极慢。学习率过大当学习率较大时参数更新可能会在最小值附近来回震荡无法平滑地接近最优解。需求需要一种算法能够根据梯度下降的进程自动增大或减小学习率。2、Adam 算法核心思想​1全称与定义Adam 全称为“自适应矩估计”Adaptive Moment Estimation。它不再使用单一的全局学习率而是为模型中的每一个参数分配一个独立的学习率。2动态调整机制方向一致时加速如果某个参数如​ 持续向大致相同的方向移动Adam 算法会自动增加该参数的学习率使其更快地向最小值移动。来回震荡时减速如果某个参数在更新过程中出现来回震荡算法会自动减小该参数的学习率以平滑路径减少震荡。3、 TensorFlow代码实现MNIST 全称是Modified National Institute of Standards and Technologydatabase。它是深度学习领域最著名、最基础的手写数字图像数据集。​在编译模型时通过添加参数指定优化器为 Adamoptimizertf.keras.optimizers.Adam需要设置一个初始的全局学习率例如​ 作为算法的起点。超参数调优建议尽管 Adam 对学习率的选择具有较好的鲁棒性但在实践中仍建议尝试几个不同的初始学习率值更大或更小以观察是否能获得更快的学习性能。四、卷积层【略】1、从 Dense 层到卷积层1Dense 层的局限​在 Dense 层中每个神经元都会接收上一层所有神经元的激活值作为输入。虽然这能构建强大的算法但在某些场景下并非最优。2卷积层的机制​在卷积层中每个神经元只关注输入数据的一个局部区域小窗口而不是全局数据。3为什么卷积层不让每个神经元查看所有像素而是只查看部分加速计算因为每个神经元只处理部分数据大大减少了计算量。减少过拟合它需要更少的训练数据或者说在相同数据量下更不容易发生过拟合。2、举例EKG 心电图信号分类​为了便于理解视频没有使用 2D 图像而是使用了 1D 的心电图EKG信号分类作为例子第一隐藏层每个神经元只“看” 100 个时间点中的一小段窗口例如 20 个点不同的神经元负责滑动观察不同的片段。第二隐藏层继续接收上一层的局部激活值再次进行局部特征提取。输出层最后通过一个 Sigmoid 单元汇总所有特征输出是否存在心脏疾病的二元分类结果。3、架构选择与前沿发展超参数选择使用卷积层时需要决定“窗口大小”和“每层神经元数量”等架构参数。前沿研究当今 AI 领域的最新研究如 Transformer、Attention 模型等本质上都是在尝试发明新的“层类型”并将它们像积木一样拼接起来以构建更强大的神经网络。五、反向传播具体计算过程【可选】67.什么是导数可选_哔哩哔哩_bilibili1、什么是导数1导数的直观定义1》核心概念放大倍数导数描述的是当输入变量 w 发生微小变化时函数 J(w) 的值会如何变化。放大效应如果 w 增加一个极小的量 ϵ 例如 0.001导致 J(w) 增加了 k 倍的 ϵ 那么 J(w) 关于 w 的导数就是 k 。数学表达若 w 增加 ϵ 则 J(w) 增加约 k×ϵ 。关键条件 ϵ 必须足够小趋近于无穷小这种线性近似才越准确。2》举例案例 1 w3 对于当 w3 时 J(w)9 。若 w 增加 0.001 J(w) 约增加 0.006即 6×0.001 。因此此处的导数为 6。案例 2 w−3 对于当 w−3 时若 w 增加 0.001 J(w) 反而减少约 0.006。因此此处的导数为 -6。3》使用 Python 的 SymPy 库验证导数的值取决于两个因素函数 J(w) 的形式以及当前 w 的取值。视频使用 Python 的 SymPy 库验证了以下常见函数的导数设 w2 2导数与梯度下降梯度下降的参数更新公式为。导数大意味着 w 的微小变化会引起 J(w) 的巨大变化因此可以大胆地迈出一大步更新幅度大。导数小意味着改变 w 对 J(w) 影响不大因此只需迈出一小步更新幅度小。3导数的符号表示微积分教科书通常会使用下述两种符号单变量函数通常用。多变量函数通常用偏导数符号。讲师观点区分这两种符号会使微积分显得复杂因此在课程中统一使用。2、计算图1计算图前向传播1》核心思想计算图将复杂的计算如神经网络的损失函数分解为一系列更小的、原子化的计算步骤。每个步骤都是一个节点通过箭头连接清晰地展示了数据的流动和依赖关系。2》示例单层神经网络视频以一个简单的线性回归模型为例其成本函数为J 1/2 * (wx b - y)^2。输入参数w2,b8训练样本x-2,y2。计算步骤计算c w * x得到c -4。计算a c b得到a 4。计算d a - y得到d 2。计算J 1/2 * d^2得到J 2。这个过程从左到右一步步计算出最终的成本J。2反向传播计算导数1》核心思想反向传播是计算导数的过程其方向与前向传播相反即从右到左。它利用链式法则通过计算最终输出J对每个中间变量和参数的导数来了解每个变量对最终结果的影响程度。2》计算步骤真正的最终目的只有一个求出所有参数 w 和 b 的导数所以需要找到每个中间量c、a和d的导数。这样就能得到dJ/db 和dJ/dw。视频详细演示了如何一步步计算J对各个变量的导数计算dJ/ddJ 1/2 * d^2当d2时d的微小变化会引起J约两倍的变化因此dJ/dd 2。计算dJ/dad a - ya的变化会 1:1 地传递给d。结合dJ/dd 2可知a的变化会引起J两倍的变化因此dJ/da 2。计算dJ/dc和dJ/dba c bc或b的变化也会 1:1 地传递给a。结合dJ/da 2可知dJ/dc 2且dJ/db 2。计算dJ/dwc w * x当x-2时w增加ε会导致c减少2ε。结合dJ/dc 2可知w增加ε最终会导致J减少4ε因此dJ/dw -4。验证dJ/dw -4如下图:3反向传播的高效性——反向传播计算复杂度O(np)反向传播之所以高效是因为它避免了重复计算。在从右到左的计算过程中每个中间导数如dJ/da只需计算一次就可以被用于计算其所有上游变量如w和b的导数。时间复杂度对于一个有n个节点和p个参数的计算图反向传播可以在大约n p步内计算出所有参数的导数。对比如果使用暴力方法分别计算每个参数的导数则需要n * p步。当网络规模很大时如n10,000,p100,000np(110,000) 远小于n*p(10 亿)效率提升巨大。1》核心机制计算结果的“复用”在神经网络中一个中间变量比如某一层的激活值 aa 可能会影响多个下游参数。暴力计算如果你想求 a 对参数 w1​ 的导数算一次求 a 对参数 w2​ 的导数再算一次……如果有 p 个参数 a 的导数就要被反复计算 p 次。反向传播反向传播从输出端往回走当它计算出 a 的梯度 ∂J/∂a​ 时这个结果会被缓存下来。接下来无论是求 w1​ 还是 w2 的梯度只需要拿这个缓存的结果乘以一个局部导数即可不需要重新计算 ∂J/∂a 。2》 拆解 np 的来源在一个包含 n 个节点和 p 个参数的计算图中反向传播的遍历过程可以这样拆解n 的来源节点遍历反向传播必须从输出层向输入层遍历整个计算图。对于图中的每一个节点共 n 个算法都需要执行一次“接收上游梯度 →→ 乘以局部导数 →→ 累加并传递给下游”的操作。因为每个节点只被访问常数次通常是1次所以这部分的计算量是O(n)。p 的来源参数求导我们的最终目的是求出所有参数的梯度。对于每一个参数共 p 个算法只需要执行一次简单的乘法操作即该参数所连节点的梯度 × 该参数对节点的局部导数。因为每个参数也只被处理常数次所以这部分的计算量是O(p)。3》直观对比为什么不是 n×p n×p 的逻辑意味着“对于每一个参数都要把整个网络从头到尾算一遍”。这就像你要给班里的 100 个学生 p 每人发一张成绩单但每次发之前你都要把全班 50 门课的成绩 n 重新算一遍总共要算 100×505000 次。np 的逻辑反向传播就像是“先花 50 步把全班成绩算好并打印出来 n 然后花 100 步把成绩单依次发给每个学生 p ”。总共只需要 50100150 步。3、更大的神经网络69.更大的神经网络示例可选_哔哩哔哩_bilibili