用 NumPy 从零实现 FNN:参考答案

目录

\[ \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} \]

用 NumPy 从零实现 FNN:参考答案#

返回正文练习 · 返回答案索引

说明#

以下答案与正文7道题逐题对应。推导题给出主要步骤;编程和实验题给出参考程序和检查方法,并说明结果适用于哪些条件。

  1. \(\bX\)\(5\times2\)⁠,\(\bW^{[1]}\)\(3\times2\)⁠,\(\bb^{[1]}\)\(3\times1\)⁠,\(\bZ^{[1]}\)\(\bA^{[1]}\) 均为 \(5\times3\)⁠;\(\bW^{[2]}\)\(1\times3\)⁠,\(\bb^{[2]}\)\(1\times1\)⁠,\(\bZ^{[2]}\)\(5\times1\)⁠。参数量为 \(3(2)+3+1(3)+1=13\)⁠。偏置在批量轴广播,但保存维度仍应与对应层神经元数一致。

  2. 第一层线性运算结果为 \((1,1)\trans\)⁠,故隐藏激活为 \((s,s)\trans\)⁠,其中 \(s=1/(1+e^{-1})\approx0.7311\)⁠。第二层线性运算结果为 \(s-s=0\)⁠,预测概率为 \(1/2\)⁠。当 \(y=1\) 时,交叉熵为 \(-\log(1/2)=\log2\approx0.6931\)⁠;用稳定形式计算也得到 \(\operatorname{logaddexp}(0,0)-0=\log2\)⁠。

  3. 对每个样本,二元交叉熵关于输出层线性运算结果的导数为 \(a_i^{[2]}-y_i\)⁠,对批均值再除以 \(n\)⁠。因此 \(\mathrm d\bW^{[2]}=(\mathrm d\bZ^{[2]})\trans\cdot\bA^{[1]}\)⁠、\(\mathrm d\bb^{[2]}=\sum_i\mathrm d\bz_i^{[2]}\)⁠;\(\mathrm d\bZ^{[1]}=[\mathrm d\bZ^{[2]}\cdot\bW^{[2]}]\odot\bA^{[1]}\odot(1-\bA^{[1]})\)⁠;\(\mathrm d\bW^{[1]}=(\mathrm d\bZ^{[1]})\trans\cdot\bX\)⁠,偏置梯度沿批次轴求和后转为列向量。各梯度与对应参数同形。

  4. \(\bw\neq\boldsymbol0\)⁠,方程 \(w_1x_1+w_2x_2+b=0\) 是直线;若 \(\bw=\boldsymbol0\)⁠,边界为空或整个平面,都不是非退化圆。正文的等概率集合 \(\lVert\bx\rVert_2=r\) 满足 \(x_1^2+x_2^2=r^2\)⁠,曲率非零,不能与一条直线完全相同。多个隐藏神经元经非线性变换后可组合出分段弯曲边界,宽度增加时能更细致地逼近连续径向函数。

  5. 两类模型在两套数据上复用相同划分、种子和更新次数,并分别在验证集选择阈值。逻辑回归通常足以处理线性数据且参数少、预测快;径向数据上 FNN 的非线性边界通常更有优势。表中报告测试指标均值与标准差、训练秒数、预热后的固定批量时间、单样本延迟、参数量和峰值内存;若 FNN 在线性数据上没有优势,这也是合理结果。

  6. 每个宽度使用同一划分、种子、初始化尺度、更新次数和学习率候选预算。宽度 2 可能表达不足,适中宽度可能改善径向拟合,过宽模型在有限样本上可能过拟合且成本上升。报告测试指标、训练时间、固定批量与单样本预测计时、实际参数量和峰值内存,并画性能—成本曲线;不能只挑单个最好种子。

  7. 各学习率从同一初始参数和批次顺序开始,更新次数相同。过小值可能在预算内尚未收敛,适中值下降较快,过大值可能振荡或产生非有限损失;失败运行也要报告。学习率不改变参数量或前向计算图,所以预测时间理论上相近;结果表仍应给出任务指标、训练秒数、固定批量与单样本延迟、参数量和峰值内存以核对计时波动。