\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bw}{\boldsymbol{w}} \newcommand{\bx}{\boldsymbol{x}} \newcommand{\by}{\boldsymbol{y}} \newcommand{\bz}{\boldsymbol{z}} \newcommand{\bd}{\boldsymbol{d}} \newcommand{\bv}{\boldsymbol{v}} \newcommand{\bs}{\boldsymbol{s}}\\\newcommand{\btheta}{\boldsymbol{\theta}} \newcommand{\bbeta}{\boldsymbol{\beta}} \newcommand{\bgamma}{\boldsymbol{\gamma}} \newcommand{\bsigma}{\boldsymbol{\sigma}} \newcommand{\md}{\mbox{d}} \newcommand{\bmu}{\boldsymbol{\mu}} \newcommand{\bone}{\boldsymbol{1}} \newcommand{\bzero}{\boldsymbol{0}} \newcommand{\bepsilon}{\boldsymbol{\epsilon}} \newcommand{\bphi}{\boldsymbol{\phi}} \newcommand{\bh}{\boldsymbol{h}} \newcommand{\bc}{\boldsymbol{c}} \newcommand{\br}{\boldsymbol{r}} \newcommand{\bQ}{\boldsymbol{Q}} \newcommand{\bK}{\boldsymbol{K}} \newcommand{\bV}{\boldsymbol{V}} \newcommand{\bSigma}{\boldsymbol{\Sigma}} \newcommand{\bg}{\boldsymbol{g}} \newcommand{\bxi}{\boldsymbol{\xi}} \newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}} \newcommand{\bdelta}{\boldsymbol{\delta}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bJ}{\boldsymbol{J}} \newcommand{\bp}{\boldsymbol{p}} \newcommand{\bi}{\boldsymbol{i}} \newcommand{\bo}{\boldsymbol{o}} \newcommand{\bE}{\boldsymbol{E}} \newcommand{\bH}{\boldsymbol{H}} \newcommand{\bL}{\boldsymbol{L}} \newcommand{\bu}{\boldsymbol{u}} \newcommand{\bLambda}{\boldsymbol{\Lambda}} \newcommand{\trans}{^{\rm\scriptsize T}} \newcommand{\var}{\mathrm{var}}\\\newcommand{\bA}{\boldsymbol{A}} \newcommand{\bB}{\boldsymbol{B}} \newcommand{\bC}{\boldsymbol{C}} \newcommand{\bD}{\boldsymbol{D}} \newcommand{\bG}{\boldsymbol{G}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bP}{\boldsymbol{P}} \newcommand{\bS}{\boldsymbol{S}} \newcommand{\bU}{\boldsymbol{U}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor[RGB]{48,209,88}{TP}} \newcommand{\cotn}{\textcolor[RGB]{100,210,255}{TN}} \newcommand{\cofp}{\textcolor[RGB]{94,92,230}{FP}} \newcommand{\cofn}{\textcolor[RGB]{191,90,242}{FN}}\\\newcommand{\numcotp}{\textcolor[RGB]{48,209,88}{50}} \newcommand{\numcotn}{\textcolor[RGB]{100,210,255}{30}} \newcommand{\numcofp}{\textcolor[RGB]{94,92,230}{10}} \newcommand{\numcofn}{\textcolor[RGB]{191,90,242}{10}} \DeclareMathOperator*{\argmin}{arg\,min}\end{aligned}\end{align} \]

从逻辑回归到神经元#

学习目标与记号#

  1. 准确解释神经元、仿射变换与 sigmoid 激活函数;

  2. 根据公式和张量维度分析二元交叉熵,并识别常见实现错误;

  3. Python 实现或验证决策边界。

  本节沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;层编号写作上标 \([l]\)⁠,样本或时间编号写作下标;转置写作 \(\trans\)⁠。除非另有说明,批量样本按行存放。正文与练习中的程序都应同时检查数值结果和数组维度。本节练习的参考答案见 从逻辑回归到神经元答案⁠。

  关于概率模型、损失与梯度的完整推导,参见 逻辑回归逻辑回归与交叉熵⁠;sigmoid 函数的性质见 Sigmoid 激活函数⁠。

  上一章已经介绍 逻辑回归⁠。给定参数 \(\btheta=(b,\bw\trans)\trans\) 和特征向量 \(\bx\)⁠,一个样本的计算过程如下。

向前传播

  1. 线性运算(仿射运算):\(z=b+\bx\trans\cdot\bw\)⁠;

  2. 非线性变换(激活):\(a = \sigma(z)\)⁠。

  3. 二元交叉熵损失:\(\mathcal{L}(a,y)=-\{y\log a+(1-y)\log(1-a)\}\)⁠。

  从输入出发,依次计算中间量、模型输出和损失的过程称为 前向传播 (forward propagation)。特征 \(\bx\) 位于输入层;线性运算与激活运算共同构成输出神经元。逻辑回归的输出 \(a\) 可解释为 \(P(Y=1\mid\bx)\) 的估计,因此它也可以看作只有一个输出神经元、没有隐藏层的神经网络。

  后续将在线性输入与输出层之间加入隐藏层。隐藏层的作用不是简单增加线性变换的次数;若没有非线性激活,多个仿射变换仍可合并为一个仿射变换。正是激活函数使隐藏层能够学习非线性表示。

全连接神经网络与多层感知机的联系和区别

  联系。 多层感知机(multilayer perceptron,MLP)是包含一个或多个隐藏层的全连接前馈神经网络,是全连接神经网络最经典、最常见的形态。两者都采用相邻层全连接的结构,每一层都做"仿射变换加非线性激活",并用前向传播、反向传播与梯度优化进行训练;在深度学习语境下,二者经常直接互换使用。例如,本章标题"全连接神经网络"所覆盖的、从单隐藏层到多隐藏层网络的全部内容,就是多层感知机。

  区别。 "全连接神经网络"强调层与层之间的 连接方式 ,是更宽的概念:它不要求存在隐藏层,逻辑回归这类没有隐藏层的网络同样属于全连接神经网络。"多层感知机"则强调 隐藏层与历史谱系 ,按本章约定必须至少包含一个隐藏层,通常指由全连接层堆叠而成的完整前馈模型。历史上一层的感知机没有隐藏层、使用阶跃激活且不可微,只能处理线性可分问题,并不是多层感知机;正是通过引入隐藏层和可微的非线性激活,多层感知机才获得表示非线性函数的能力。

  还要区分作为 构件 的"全连接层"(dense layer,可嵌入 CNN、RNN、Transformer 等网络内部)与作为 完整模型 的"全连接神经网络";多层感知机可以看作只由全连接层堆叠而成的前馈模型。

Shiny 交互演示:逻辑回归的参数更新与模型比较

  “逻辑回归与 Softmax 回归”页面可以逐步查看 Newton-Raphson 算法的参数更新、损失变化和二维决策边界;其中的 Softmax 标签页还可核对稳定概率计算。“逻辑回归与小型神经网络”页面用于比较逻辑回归和多层感知机在二维二分类数据上的决策边界。多层感知机是包含输入层、一个或多个隐藏层和输出层的全连接前馈神经网络,通过非线性激活函数逐层组合仿射变换,从而能够表示线性模型无法表达的非线性决策边界。通常来讲,我们将不区分全连接神经网络和多层感知机。页面显示的训练准确率只描述当前随机生成的训练数据,不能代替验证集或测试集评价。

核心推导与实现核验#

核心关系

\[a=\sigma(z),\qquad z=\bw\trans\cdot\bx+b.\]

  推导路径。 先通过仿射变换得到可以取任意实数的结果 \(z\)⁠,再用 sigmoid 函数将其转换为正类概率;结合伯努利负对数似然,损失对 \(z\) 的导数化简为 \(a-y\)⁠。

关键条件

  sigmoid 函数严格单调且 \(\sigma(0)=1/2\)⁠,所以当阈值为 0.5 时,决策边界恰为 \(\bw\trans\cdot\bx+b=0\)⁠。

数据规模

  一个样本有 \(d\) 个特征时,特征 \(\bx\) 和权重 \(\bw\) 都包含 \(d\) 个数,而线性结果 \(z\)⁠、概率 \(a\) 和偏置 \(b\) 都只是一个标量。一次输入 \(n\) 个样本时,模型会输出 \(n\) 个概率。

常见误区

  把 sigmoid 函数的输出直接按某一阈值转换为 0 或者 1 的估计标签会丢失阈值信息。

数值稳定性与规模

  sigmoid 函数采用正负分支计算,交叉熵根据线性运算结果并使用 logaddexp 直接计算;这样避免 exp 溢出和 log(0)Newton 步用线性方程求解并监控 Hessian 条件数。对 logaddexp 感兴趣的同学,请参见 logaddexp 的含义与提出背景⁠。

本节小结#

  1. 逻辑回归是理解单个神经元的直接入口。

  2. sigmoid 映射前的线性运算结果 \(z\) 可以取任意实数,sigmoid 函数的输出才是概率。

  3. 损失、阈值与评价指标承担不同职责。

综合练习#

  题目覆盖概念、证明、维度、编程实现和数值稳定性。程序题应固定随机种子、写出维度断言并报告运行环境。全部参考答案见 从逻辑回归到神经元答案⁠。

  1. 概念辨析。 分别解释“神经元”“仿射变换”和“sigmoid 函数”的输入、操作与输出;说明三者在本节中承担的角色,不能只给名词翻译。

  2. 证明题。 证明使用 sigmoid 函数且以 0.5 为阈值的分类器,其决策边界等价于 \(z=0\)⁠。写清假设、关键等式以及结论的适用边界。

  3. 维度检查。 针对“从逻辑回归到神经元”,按正文的批量约定写出核心关系中输入、参数、中间量和输出的维度;逐项验证乘法、求和、转置或广播是否合法。

  4. 核心编程。 实现单样本和批量逻辑回归,并验证二者结果一致。函数应检查输入、避免不必要的隐式广播,并返回便于核验的中间量。

  5. 循环与批量实现。 基于本节的蒙特卡洛模拟实验的设定,分别完成基于 for 循环和基于向量化的编程,对比两个程序的参数估计结果以及计算效率。

  6. 数值稳定性。 针对“sigmoid 函数”及 \(a=\sigma(z),\qquad z=\bw\trans\cdot\bx+b\) 检查真正可能出现的溢出、下溢、除零、病态或消减问题;不要机械罗列与本节无关的风险,并给出稳定改写。