Vince Jiang

CSCI3230 / 作业与题解 · 本站更新

CSCI3230 HW01:按小问手把手做题(2026T1)

学习衔接:本次课件内容补全后,可直接学习 回归建模、最小二乘、逻辑回归 与 梯度下降,再逐小问作答;本篇保持原作业题号、数据及提示/答案边界。作业题面核验记录沿用此前版本,本次不称重新核对试卷。

课程:CSCI3230 / ESTR3108 · Fundamentals of Artificial Intelligence · 2026–2027 Term 1 原题:HW01-2026T1-题目.pdf(本地课件),PDF p.1–4 用法:对着题号读;每问都从题目要求开始,接着代入、计算、解释和验算。 版本:2026-10-04 按原题与个人草稿统一记号;所有训练数据、测试数据、初始参数均按这一版原题。

直接跳到正在做的小问:

本文是解题教学笔记。公式从原题重新排版;解释放在对应步骤旁。数值展示会舍入,后续计算使用未舍入的参数。

Q1:用十个训练点拟合,再用十个测试点比较

公共题面(HW01-2026T1-题目.pdf · Q1 · p.1;数据表为图片,已视觉核对)

p.1 Assume we have a training set and a test set as follows:

Let’s try to find some linear models to fit the training data. We use the RSS objective function J(Θ)=∥f^Θ(X)−Y∥22J(\boldsymbol{\Theta})=\lVert \hat f_{\boldsymbol{\Theta}}(\mathbf{X})-\mathbf{Y}\rVert_2^2.

公式按原题重排。拟合后的三种模型沿用你的 f^1(x)\hat f_1(x)、f^2(x)\hat f_2(x)、f^4(x)\hat f_4(x),下标是次数;它们分别对应原题同一记号 f^Θ(x)\hat f_{\boldsymbol{\Theta}}(x) 在三个模型下的拟合结果。样本编号写作 x(i),y(i)x^{(i)},y^{(i)};X\mathbf{X} 是含常数列的设计矩阵,Y\mathbf{Y} 是标签列向量。下面把原题左右两张表并列;每一侧各有十条数据。

Index Train x Train y Test x Test y
1 7 0.9 7.2 0.6
2 1.6 1.4 1.1 1
3 3.8 0.7 3.6 0.3
4 4.7 −0.3 4.8 −0.4
5 4 0 4.3 0
6 6.3 0.6 6.6 0.2
7 7.9 1.7 7.8 1.8
8 5.7 0.1 5.6 0.6
9 7.1 2.1 7.3 1.7
10 8 1.3 8.2 1.3

(a)–(c) 只用左边的训练集求参数。右边的测试集留到 (d),把已经求好的模型代进去,检查预测得好不好。

Q1(a):求直线的两个系数并画图(p.1,5%)

题面(同上原件 · Q1(a) · p.1)

p.1 Calculate the analytic solution of the linear model f^Θ(x)=θ0+θ1x\hat f_{\boldsymbol{\Theta}}(x)=\theta_0+\theta_1x. Then, plot the line of your obtained linear model together with the data points in training set. (5%)

这问要做完两件事:算出截距、斜率;把这条直线和十个训练点画在一起。 analytic solution 指通过求导、解方程求出参数,这里不需要反复做梯度下降。

第 1 步:把题目给的模型代进 RSS。

未知数只有 θ0\theta_0 和 θ1\theta_1。例如第一个点为 (7,0.9)(7,0.9),模型预测是 θ0+7θ1\theta_0+7\theta_1,预测减真实值为 θ0+7θ1−0.9\theta_0+7\theta_1-0.9。这个点对 RSS 的贡献就是它的平方。

十个点全部这样做:

J(θ0,θ1)=∑i=110(θ0+θ1x(i)−y(i))2. J(\theta_0,\theta_1)=\sum_{i=1}^{10}(\theta_0+\theta_1x^{(i)}-y^{(i)})^2.

展开开头两项和最后一项,你就能看清求和符号装着什么:

J=(θ0+7θ1−0.9)2+(θ0+1.6θ1−1.4)2+⋯+(θ0+8θ1−1.3)2. J=(\theta_0+7\theta_1-0.9)^2 +(\theta_0+1.6\theta_1-1.4)^2 +\cdots+(\theta_0+8\theta_1-1.3)^2.

第 2 步:分别对两个未知数求导,再令导数等于零。

对 θ0\theta_0 求导时,括号内部对它的导数是 1;对 θ1\theta_1 求导时,括号内部对它的导数是 x(i)x^{(i)}。平方的导数还会带出一个 2:

∂J∂θ0=2∑i=110(θ0+θ1x(i)−y(i))=0, \frac{\partial J}{\partial\theta_0} =2\sum_{i=1}^{10}(\theta_0+\theta_1x^{(i)}-y^{(i)})=0, ∂J∂θ1=2∑i=110x(i)(θ0+θ1x(i)−y(i))=0. \frac{\partial J}{\partial\theta_1} =2\sum_{i=1}^{10}x^{(i)}(\theta_0+\theta_1x^{(i)}-y^{(i)})=0.

两式各除以 2。第一式收集常数、x(i)x^{(i)}、y(i)y^{(i)};第二式先把外面的 x(i)x^{(i)} 乘进去:

10θ0+(∑ix(i))θ1=∑iy(i),(∑ix(i))θ0+(∑i(x(i))2)θ1=∑ix(i)y(i). \begin{aligned} 10\theta_0+\left(\sum_i x^{(i)}\right)\theta_1&=\sum_i y^{(i)},\\ \left(\sum_i x^{(i)}\right)\theta_0+\left(\sum_i (x^{(i)})^2\right)\theta_1&=\sum_i x^{(i)}y^{(i)}. \end{aligned}

第一式为什么有 10θ010\theta_0?因为每个点都有一个截距,十项相加就是十倍截距。

第 3 步:按训练表算出方程里的四个总和。

i x y x² xy
1 7 0.9 49 6.3
2 1.6 1.4 2.56 2.24
3 3.8 0.7 14.44 2.66
4 4.7 −0.3 22.09 −1.41
5 4 0 16 0
6 6.3 0.6 39.69 3.78
7 7.9 1.7 62.41 13.43
8 5.7 0.1 32.49 0.57
9 7.1 2.1 50.41 14.91
10 8 1.3 64 10.4
总和 56.1 8.5 353.09 52.88

于是刚才的两个方程变成:

{10θ0+56.1θ1=8.5,56.1θ0+353.09θ1=52.88. \begin{cases} 10\theta_0+56.1\theta_1=8.5,\\ 56.1\theta_0+353.09\theta_1=52.88. \end{cases}

第 4 步:消元,先求斜率,再求截距。

第一式除以 10,移项:

θ0=0.85−5.61θ1. \theta_0=0.85-5.61\theta_1.

把它代入第二式:

56.1(0.85−5.61θ1)+353.09θ1=52.88,47.685−314.721θ1+353.09θ1=52.88,38.369θ1=5.195,θ1=0.1353957622. \begin{aligned} 56.1(0.85-5.61\theta_1)+353.09\theta_1&=52.88,\\ 47.685-314.721\theta_1+353.09\theta_1&=52.88,\\ 38.369\theta_1&=5.195,\\ \theta_1&=0.1353957622. \end{aligned}

再代回第一式:

θ0=0.85−5.61(0.1353957622)=0.0904297740. \theta_0=0.85-5.61(0.1353957622)=0.0904297740.

所以求出的直线是:

f^1(x)=0.0904297740+0.1353957622x. \boxed{\hat f_1(x)=0.0904297740+0.1353957622x.}

这确实使 RSS 最小:RSS 是平方和,关于两个参数的二次函数是凸的;本题各个 xx 不全相同,方程给出唯一最小点。无需再找另一个驻点比较。

第 5 步:画出直线,叠加原训练点。

可以先拿第一个点验算:输入 x=7x=7,模型给出

f^1(7)=0.0904297740+0.1353957622(7)=1.0382001094. \hat f_1(7)=0.0904297740+0.1353957622(7)=1.0382001094.

真实值是 0.9,所以这个点不会正好落在拟合线上。最小二乘要求十个点的总平方误差最小,不要求每个点都穿过。

以下代码可单独运行;xx 是从左到右的画图横坐标,x, y 才是原训练点。散点用 scatter,模型线用 plot。

import numpy as np
import matplotlib.pyplot as plt

x = np.array([7, 1.6, 3.8, 4.7, 4, 6.3, 7.9, 5.7, 7.1, 8])
y = np.array([.9, 1.4, .7, -.3, 0, .6, 1.7, .1, 2.1, 1.3])
A = np.column_stack([np.ones(10), x])  # 每一行是 [1, x_i]
theta_a = np.linalg.lstsq(A, y, rcond=None)[0]
xx = np.linspace(1, 8.4, 400)
yy = theta_a[0] + theta_a[1] * xx
plt.scatter(x, y, label="training data")
plt.plot(xx, yy, label="degree 1")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
print(theta_a)

代码中的 A、y、theta_a 分别对应公式中的 X\mathbf{X}、Y\mathbf{Y}、一次模型的 Θ^\hat{\boldsymbol{\Theta}};Python 变量名不影响数学记号。这里 lstsq 直接求解上面同一个最小二乘问题;前面的手算已经说明了它为什么得到这两个数。

**本问完成检查:**有两个系数、有代回后的直线、有训练散点与直线同图。只写一个通用的矩阵公式还没算完这问。

Q1(b):增加平方项,求三个系数(p.1,5%)

题面(同上原件 · Q1(b) · p.1)

p.1 Suppose we want to increase the model complexity, by considering yy as a linear function of both xx and x2x^2: f^Θ(x)=θ0+θ1x+θ2x2\hat f_{\boldsymbol{\Theta}}(x)=\theta_0+\theta_1x+\theta_2x^2. In this case, calculate the analytic solution of the model and plot the curve of the model, together with the data points in training set. (5%)

原题矩阵提示转写:X\mathbf{X} 每一行为 (1,x(i),(x(i))2)(1,x^{(i)},(x^{(i)})^2),Θ=(θ0,θ1,θ2)T\boldsymbol{\Theta}=(\theta_0,\theta_1,\theta_2)^T。这问是在同一批训练数据上,增加一个待求系数。 x2x^2 是已知输入的平方,不是给标签 yy 平方。

第 1 步:按题目提示把每个输入扩成三列。

例如第一行由 77 变成 (1,7,49)(1,7,49);第二行由 1.61.6 变成 (1,1.6,2.56)(1,1.6,2.56)。第一列 1 用来乘截距。下面直接用题目的 X\mathbf{X} 表示设计矩阵;小写 xx 仍是单个输入:

X=(174911.62.5613.814.4414.722.09141616.339.6917.962.4115.732.4917.150.411864),Θ=(θ0θ1θ2). \mathbf{X}=\begin{pmatrix} 1&7&49\\1&1.6&2.56\\1&3.8&14.44\\1&4.7&22.09\\ 1&4&16\\1&6.3&39.69\\1&7.9&62.41\\1&5.7&32.49\\ 1&7.1&50.41\\1&8&64 \end{pmatrix},\qquad \boldsymbol{\Theta}=\begin{pmatrix}\theta_0\\\theta_1\\\theta_2\end{pmatrix}.

矩阵乘法 XΘ\mathbf{X}\boldsymbol{\Theta} 就是十个预测值。例如第一行乘出来是 θ0+7θ1+49θ2\theta_0+7\theta_1+49\theta_2,正是题目要求的二次模型。

第 2 步:写 RSS,求导得到三个方程。

每条残差现在是 ri=θ0+θ1x(i)+θ2(x(i))2−y(i)r_i=\theta_0+\theta_1x^{(i)}+\theta_2(x^{(i)})^2-y^{(i)}。分别对三个参数求导,括号内部的导数分别为 1,x(i),(x(i))21,x^{(i)},(x^{(i)})^2,所以条件是:

∑iri=0,∑ix(i)ri=0,∑i(x(i))2ri=0. \sum_i r_i=0,\qquad \sum_i x^{(i)}r_i=0,\qquad \sum_i (x^{(i)})^2r_i=0.

三式可以合写成 XT(XΘ−Y)=0\mathbf{X}^T(\mathbf{X}\boldsymbol{\Theta}-\mathbf{Y})=0,移项得到 XTXΘ=XTY\mathbf{X}^T\mathbf{X}\boldsymbol{\Theta}=\mathbf{X}^T\mathbf{Y}。这就是“正规方程”,本质上仍是刚才的三个偏导等于零。

第 3 步:把本题数字填进去。

XTX\mathbf{X}^T\mathbf{X} 的每个格子是两列对应元素乘完后求和。例如第一行第三格是 ∑i(x(i))2=353.09\sum_i (x^{(i)})^2=353.09;第二行第三格是 ∑i(x(i))3=2367.981\sum_i (x^{(i)})^3=2367.981。右侧第三格是 ∑i(x(i))2y(i)=373.386\sum_i (x^{(i)})^2y^{(i)}=373.386。

(1056.1353.0956.1353.092367.981353.092367.98116523.1077)(θ0θ1θ2)=(8.552.88373.386). \begin{pmatrix} 10&56.1&353.09\\ 56.1&353.09&2367.981\\ 353.09&2367.981&16523.1077 \end{pmatrix} \begin{pmatrix}\theta_0\\\theta_1\\\theta_2\end{pmatrix} = \begin{pmatrix}8.5\\52.88\\373.386\end{pmatrix}.

第 4 步:先消掉截距,再解两个未知数。

第一行除以 10,整理为:

θ0=0.85−5.61θ1−35.309θ2. \theta_0=0.85-5.61\theta_1-35.309\theta_2.

把这一式分别代进第二、第三行。合并同类项后得到:

{38.369θ1+387.1461θ2=5.195,387.1461θ1+4055.85289θ2=73.2595. \begin{cases} 38.369\theta_1+387.1461\theta_2=5.195,\\ 387.1461\theta_1+4055.85289\theta_2=73.2595. \end{cases}

这里以第一行的平方项系数为例,387.1461=2367.981−56.1(35.309)387.1461=2367.981-56.1(35.309),来自代入截距后的两部分合并。

再用第二式减去第一式的 387.1461/38.369387.1461/38.369 倍,θ1\theta_1 被消掉:

(4055.85289−387.1461238.369)θ2=73.2595−387.1461(5.195)38.369. \left(4055.85289-\frac{387.1461^2}{38.369}\right)\theta_2 =73.2595-\frac{387.1461(5.195)}{38.369}.

算出两边的数:

149.5195806823θ2=20.8415587062,θ2=0.1393901629. 149.5195806823\theta_2=20.8415587062, \qquad \theta_2=0.1393901629.

先回代求 θ1\theta_1,再回代求 θ0\theta_0:

θ1=5.195−387.1461θ238.369=−1.2710614804,θ0=0.85−5.61θ1−35.309θ2=3.0589276435. \begin{aligned} \theta_1&=\frac{5.195-387.1461\theta_2}{38.369} =-1.2710614804,\\ \theta_0&=0.85-5.61\theta_1-35.309\theta_2 =3.0589276435. \end{aligned}

二次模型因此为:

f^2(x)=3.0589276435−1.2710614804x+0.1393901629x2. \boxed{\hat f_2(x)=3.0589276435-1.2710614804x+0.1393901629x^2.}

第 5 步:画曲线。

接着 (a) 已定义的 np、plt、x、y、xx,运行下面这一段。这里的 x**2 和 xx**2 都是在计算输入的平方,系数仍只乘一次。

A = np.column_stack([np.ones(10), x, x**2])
theta_b = np.linalg.lstsq(A, y, rcond=None)[0]
yy = theta_b[0] + theta_b[1] * xx + theta_b[2] * xx**2
plt.figure()
plt.scatter(x, y, label="training data")
plt.plot(xx, yy, label="degree 2")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
print(theta_b)

**本问完成检查:**矩阵是十行三列,参数有三个;模型代入 xx 时要有平方项;曲线和训练散点画在一起。

Q1(c):增加到四次项,求五个系数(p.2,5%)

题面(同上原件 · Q1(c) · p.2)

p.2 Let’s further increase the model complexity, by assuming yy is related to higher-order forms of xx, i.e., f^Θ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4\hat f_{\boldsymbol{\Theta}}(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4. Again, calculate the analytic solution of the model, plot the curve of the function, together with the data points in training set. (5%)

原题还给了设计矩阵提示。已核对 PDF:提示最后一行的第四列印成了四次幂,与上面模型中的三次项不一致;本节依明确给出的模型建立 1,x,x2,x3,x41,x,x^2,x^3,x^4 五列。

第 1 步:把十个输入的三次方、四次方算出来。

i 1 x x² x³ x⁴
1 1 7 49 343 2401
2 1 1.6 2.56 4.096 6.5536
3 1 3.8 14.44 54.872 208.5136
4 1 4.7 22.09 103.823 487.9681
5 1 4 16 64 256
6 1 6.3 39.69 250.047 1575.2961
7 1 7.9 62.41 493.039 3895.0081
8 1 5.7 32.49 185.193 1055.6001
9 1 7.1 50.41 357.911 2541.1681
10 1 8 64 512 4096

把后五列作为矩阵 X\mathbf{X},一行乘以五个系数,就给出一个预测。比如第一行是 θ0+7θ1+49θ2+343θ3+2401θ4\theta_0+7\theta_1+49\theta_2+343\theta_3+2401\theta_4。

第 2 步:仍然让五个偏导分别等于零。

对第 jj 个系数求导,j=0,1,2,3,4j=0,1,2,3,4:

∂J∂θj=2∑i=110(x(i))j(θ0+θ1x(i)+θ2(x(i))2+θ3(x(i))3+θ4(x(i))4−y(i))=0. \frac{\partial J}{\partial\theta_j} =2\sum_{i=1}^{10}(x^{(i)})^j (\theta_0+\theta_1x^{(i)}+\theta_2(x^{(i)})^2+\theta_3(x^{(i)})^3+\theta_4(x^{(i)})^4-y^{(i)})=0.

因此仍然解 XTXΘ=XTY\mathbf{X}^T\mathbf{X}\boldsymbol{\Theta}=\mathbf{X}^T\mathbf{Y}。这里 XTX\mathbf{X}^T\mathbf{X} 为五行五列;每一格对应 ∑i(x(i))r+c\sum_i (x^{(i)})^{r+c},行列编号 r,cr,c 从 0 开始。

第 3 步:把要解的方程组具体写出来。

为了不把五列大数挤成一行,下面每行就是一个方程的五个系数及右侧常数;各列依次乘 θ0,θ1,θ2,θ3,θ4\theta_0,\theta_1,\theta_2,\theta_3,\theta_4。

方程 θ₀ 的系数 θ₁ 的系数 θ₂ 的系数 θ₃ 的系数 θ₄ 的系数 右侧
1 10 56.1 353.09 2367.981 16523.1077 8.5
2 56.1 353.09 2367.981 16523.1077 118449.43101 52.88
3 353.09 2367.981 16523.1077 118449.43101 865703.617829 373.386
4 2367.981 16523.1077 118449.43101 865703.617829 6418500.4415421 2745.6248
5 16523.1077 118449.43101 865703.617829 6418500.4415421 48113659.522994 20503.14858

第一行例如就是:

10θ0+56.1θ1+353.09θ2+2367.981θ3+16523.1077θ4=8.5. 10\theta_0+56.1\theta_1+353.09\theta_2+2367.981\theta_3+16523.1077\theta_4=8.5.

第 4 步:用线性代数工具解这个方程组,并画图。

原题允许用 Python/MATLAB 做计算。这里不要求手算五元消元;关键是先构造正确方程,再说明软件具体解了什么。下面接着 (a) 的数据运行:

A = np.column_stack([np.ones(10), x, x**2, x**3, x**4])
G = A.T @ A       # 上表左边的五行五列
b = A.T @ y       # 上表的右侧列
print(G)
print(b)
print(np.linalg.solve(G, b))  # 直接解正规方程,便于核对
# 用原设计矩阵求最小二乘,避免显式求逆带来的数值误差
theta_c = np.linalg.lstsq(A, y, rcond=None)[0]
print(theta_c)
B = np.column_stack([np.ones(len(xx)), xx, xx**2, xx**3, xx**4])
yy = B @ theta_c
plt.figure()
plt.scatter(x, y, label="training data")
plt.plot(xx, yy, label="degree 4")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

五个输出按幂次从低到高排列:

Θ=(−12.176904104816.4457655738−6.37774874900.9546521253−0.0484786041). \boldsymbol{\Theta}=\begin{pmatrix} -12.1769041048\\16.4457655738\\-6.3777487490\\0.9546521253\\-0.0484786041 \end{pmatrix}.

把它们放回题目中的模型:

f^4(x)=−12.1769041048+16.4457655738x−6.3777487490x2+0.9546521253x3−0.0484786041x4. \boxed{\hat f_4(x)=-12.1769041048+16.4457655738x-6.3777487490x^2 +0.9546521253x^3-0.0484786041x^4.}

**检查:**四次模型要有五个系数;训练矩阵应为十行五列。拿未舍入的解代回,XT(XΘ−Y)\mathbf{X}^T(\mathbf{X}\boldsymbol{\Theta}-\mathbf{Y}) 应接近全零。四次式里较大的正负项会抵消,不要把系数只留两位就拿去计算测试误差。

下面的配套图把 (a)–(c) 并排显示;每幅黑点都是同一组训练数据:

一次、二次、四次模型与训练点(本地素材,未公开)

Q1(d):用测试集判断哪一个模型更合适(p.2,10%)

题面(同上原件 · Q1(d) · p.2)

p.2 Observe the above three functions, please point out which could be faced with underfitting, which could be faced with overfitting, and which one is relatively a good one? Then, you can calculate the values of prediction error on the test data to verify your thoughts. (10%)

这问接着使用刚才三个模型。参数已经确定,测试时不再重新拟合。

第 1 步:先看形状,提出初步判断。

训练点大致是中间低、两侧高。直线弯不了,可能欠拟合;二次曲线能表达这个走势;四次曲线能拐得更多,但这些额外弯曲是否对新数据有帮助,还要算测试误差。

第 2 步:每个测试输入分别代入三个模型。

拿第一条 (7.2,0.6)(7.2,0.6) 先算直线:

f^1(7.2)=0.0904297740+0.1353957622(7.2)=1.0652792618. \hat f_1(7.2)=0.0904297740+0.1353957622(7.2)=1.0652792618.

该点的误差是 1.0652792618−0.6=0.46527926181.0652792618-0.6=0.4652792618,平方误差约为 0.216484790.21648479。

再算二次模型的同一个点:

f^2(7.2)=3.0589276435−1.2710614804(7.2)+0.1393901629(51.84)≈1.13327103. \hat f_2(7.2)=3.0589276435-1.2710614804(7.2)+0.1393901629(51.84) \approx1.13327103.

平方误差是 (1.13327103−0.6)2≈0.28437799(1.13327103-0.6)^2\approx0.28437799。一个点上直线更好,不代表十个点加起来仍更好,所以必须继续算整张表。

测试行 x 真实 y 一次预测 二次预测 四次预测
1 7.2 0.6 1.06527926 1.13327103 1.65140686
2 1.1 1 0.23936511 1.82942211 −0.60397351
3 3.6 0.3 0.57785452 0.28960283 0.76993383
4 4.8 −0.4 0.74032943 0.16938189 −0.33813244
5 4.3 0 0.67263155 0.17068739 −0.05702999
6 6.6 0.2 0.98404180 0.74175737 1.02220921
7 7.8 1.8 1.14651672 1.62514561 1.66608441
8 5.6 0.6 0.84864604 0.31225886 −0.11089380
9 7.3 1.7 1.07881884 1.20828062 1.71215141
10 8.2 1.3 1.20067502 2.00881806 1.02086280

第 3 步:逐点做“预测减真实,再平方”,最后相加。

例如一次模型的测试 RSS 是:

RSStest,1=(1.06527926−0.6)2+(0.23936511−1)2+(0.57785452−0.3)2+(0.74032943+0.4)2+(0.67263155−0)2+(0.98404180−0.2)2+(1.14651672−1.8)2+(0.84864604−0.6)2+(1.07881884−1.7)2+(1.20067502−1.3)2≈4.12435607. \begin{aligned} \mathrm{RSS}_{\mathrm{test},1} ={}&(1.06527926-0.6)^2+(0.23936511-1)^2\\ &+(0.57785452-0.3)^2+(0.74032943+0.4)^2\\ &+(0.67263155-0)^2+(0.98404180-0.2)^2\\ &+(1.14651672-1.8)^2+(0.84864604-0.6)^2\\ &+(1.07881884-1.7)^2+(1.20067502-1.3)^2\\ \approx{}&4.12435607. \end{aligned}

第四项是加 0.4,因为真实值为 −0.4。不要把十个有正有负的误差先加起来再平方,那不是 RSS。

运行下面这段可把三列预测和全部误差一次复算出来,依赖 (a)–(c) 已求出的三个 theta:

xt = np.array([7.2, 1.1, 3.6, 4.8, 4.3, 6.6, 7.8, 5.6, 7.3, 8.2])
yt = np.array([.6, 1, .3, -.4, 0, .2, 1.8, .6, 1.7, 1.3])
for degree, theta in [(1, theta_a), (2, theta_b), (4, theta_c)]:
    A = np.column_stack([x**j for j in range(degree + 1)])
    B = np.column_stack([xt**j for j in range(degree + 1)])
    prediction = B @ theta
    squared_errors = (prediction - yt)**2
    print("degree", degree)
    print("test prediction, squared error:", np.column_stack([prediction, squared_errors]))
    print("train RSS", np.sum((A @ theta - y)**2))
    print("test RSS", np.sum(squared_errors))
degree train RSS test RSS train MSE test MSE 本题判断
1 4.7816190154 4.1243560665 0.4781619015 0.4124356067 欠拟合:训练走势都难以表达
2 1.8765107524 2.4768381114 0.1876510752 0.2476838111 三者中相对最好:测试误差最低
4 0.7711673245 5.1835018034 0.0771167324 0.5183501803 过拟合迹象:训练更好,测试反而更差

训练集、测试集各有 10 条,所以两列 MSE 分别等于对应 RSS 除以 10;列顺序与你的 Q1(d) 一致。

第 4 步:用比较结果解释结论。

二次变四次时,训练 RSS 从 1.8765 降至 0.7712,测试 RSS 却从 2.4768 升至 5.1835。多出的复杂度更贴合训练点,但没有改善这里的测试预测,这才是判断四次过拟合的依据。

还能定位到具体错误:四次模型在测试 x=1.1x=1.1 时预测 −0.604,真实值为 1,单点平方误差约 2.5727。这个输入低于最小训练输入 1.6,已经在训练范围之外,四次曲线的外推在这里出了明显偏差。

**本问完成检查:**三个判断都给出理由,同时用测试 RSS 支持判断。若写 MSE,应把各 RSS 除以 10 并明确名称,不能把 2.4768 称作本题的 MSE。

Q2:按 (a) 求截距、(b) 代回、(c) 求斜率的顺序推导

公共题面(HW01-2026T1-题目.pdf · Q2 · p.2)

p.2 Recall that we have learned ridge regression which is a shrinkage method to regularize the coefficients in linear models. Suppose we have MM samples X=(X(1),X(2),…,X(m))T\mathbf{X}=(\mathbf{X}^{(1)},\mathbf{X}^{(2)},\ldots,\mathbf{X}^{(m)})^T. The ridge regression penalizes L2 norm of the model parameters: Θ^ridge=arg⁡min⁡Θ∥XΘ+θ0−Y∥22+λ∥Θ∥22\hat{\boldsymbol{\Theta}}^{\mathrm{ridge}}=\arg\min_{\boldsymbol{\Theta}}\lVert\mathbf{X}\boldsymbol{\Theta}+\theta_0-\mathbf{Y}\rVert_2^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2, with λ\lambda as a positive scalar (λ>0\lambda>0). Let’s find the analytic solution for the ridge regression.

公式按原题重排。原题同时出现样本数 MM 和求和上限 mm,下文统一记为 MM;X(i)\mathbf{X}^{(i)} 表示第 ii 条样本的特征行。这一题没有给具体数据,是要证明一个公式,不要代用 Q1 的十个点。

沿用你 Q2(a)–(b) 的大写样本记号,后面不再换成小写缩写。粗体用标准 LaTeX 的 \mathbf{X}、\boldsymbol{\Theta};范数写成 \lVert \boldsymbol{\Theta}\rVert_2^2。先认清这几个符号:

原题与本节记法 这是什么 维度
X(i)\mathbf{X}^{(i)} 第 i 条样本的一行特征 1×p1\times p
Y(i)Y^{(i)} 第 i 条样本的真实输出 标量
Θ\boldsymbol{\Theta} 特征系数列,不含截距 p×1p\times1
θ0\theta_0 给每条预测统一加上的截距 标量
Xˉ,Yˉ\bar{\mathbf{X}},\bar Y 特征逐列均值、标签均值 行向量、标量

如果每条样本有 pp 个特征,那么 X(i)\mathbf{X}^{(i)} 是一行 pp 个数,Θ\boldsymbol{\Theta} 是一列 pp 个数,X(i)Θ\mathbf{X}^{(i)}\boldsymbol{\Theta} 相乘后得到一个预测数。题目中的正则项只惩罚 Θ\boldsymbol{\Theta},没有 λθ02\lambda\theta_0^2。

Q2(a):证明给定斜率时,哪个截距使损失最小(p.2,10%)

题面(同上原件 · Q2(a) · p.2)

p.2 First of all, in order to be more convenient for the derivation, we rewrite the error function as:

J(Θ,θ0)=∑i=1m[X(i)Θ+θ0−Y(i)]2+λ∥Θ∥22J(\boldsymbol{\Theta},\theta_0)=\sum_{i=1}^{m}[\mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)}]^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2.

Set Xˉ\bar{\mathbf{X}} be the mean vector of all the raw vectors of X\mathbf{X}, then, if we change the form of J(Θ,θ0)J(\boldsymbol{\Theta},\theta_0) into the following rewritten function:

J(Θ,θ0)=∑i=1m[(X(i)−Xˉ)Θ+θ0+XˉΘ−Y(i)]2+λ∥Θ∥22J(\boldsymbol{\Theta},\theta_0)=\sum_{i=1}^{m}[(\mathbf{X}^{(i)}-\bar{\mathbf{X}})\boldsymbol{\Theta}+\theta_0+\bar{\mathbf{X}}\boldsymbol{\Theta}-Y^{(i)}]^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2.

Prove that, when θ0=Yˉ−XˉΘ\theta_0=\bar Y-\bar{\mathbf{X}}\boldsymbol{\Theta}, we can get the minimal value for J(Θ,θ0)J(\boldsymbol{\Theta},\theta_0). (10%)

这问先把 Θ\boldsymbol{\Theta} 当作固定的,只调整 θ0\theta_0。 要证明的是“无论当前斜率是什么,与它配套的最佳截距都满足这个式子”;斜率本身到 (c) 才求。

第 1 步:对截距求导。

从目标函数开始:

J=∑i=1M(X(i)Θ+θ0−Y(i))2+λ∥Θ∥22. J=\sum_{i=1}^{M}(\mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)})^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2.

正则项里没有 θ0\theta_0,对它求导就是 0。每个平方项用链式法则,内部对 θ0\theta_0 的导数为 1:

∂J∂θ0=2∑i=1M(X(i)Θ+θ0−Y(i)). \frac{\partial J}{\partial\theta_0} =2\sum_{i=1}^{M}(\mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)}).

第 2 步:令导数为零,把截距单独移到一边。

∑i=1M(X(i)Θ+θ0−Y(i))=0,(∑i=1MX(i))Θ+Mθ0−∑i=1MY(i)=0,Mθ0=∑i=1MY(i)−(∑i=1MX(i))Θ,θ0=1M∑i=1MY(i)−(1M∑i=1MX(i))Θ. \begin{aligned} \sum_{i=1}^{M}(\mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)})&=0,\\ \left(\sum_{i=1}^{M}\mathbf{X}^{(i)}\right)\boldsymbol{\Theta}+M\theta_0-\sum_{i=1}^{M}Y^{(i)}&=0,\\ M\theta_0&=\sum_{i=1}^{M}Y^{(i)}-\left(\sum_{i=1}^{M}\mathbf{X}^{(i)}\right)\boldsymbol{\Theta},\\ \theta_0&=\frac{1}{M}\sum_{i=1}^{M}Y^{(i)}-\left(\frac{1}{M}\sum_{i=1}^{M}\mathbf{X}^{(i)}\right)\boldsymbol{\Theta}. \end{aligned}

第二行中,Θ\boldsymbol{\Theta} 对所有样本都相同,所以可以从求和中拿出来。最后一行两处“总和除以样本数”正是均值,于是:

θ0=Yˉ−XˉΘ. \boxed{\theta_0=\bar Y-\bar{\mathbf{X}}\boldsymbol{\Theta}.}

第 3 步:证明是最小值,不能只停在导数为零。

对截距再求一次导数:

∂2J∂θ02=2M>0. \frac{\partial^2J}{\partial\theta_0^2}=2M>0.

因为 MM 是正的样本数,损失关于截距是一条开口向上的抛物线,刚才的驻点就是唯一最小点。

如果想沿原题“减均值”的提示证明,也可以直接把平方拆开。

先在原残差里加减均值,使它分成两个部分:

X(i)Θ+θ0−Y(i)=(X(i)−Xˉ)Θ−(Y(i)−Yˉ)⏟ri+(θ0+XˉΘ−Yˉ)⏟a. \mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)} =\underbrace{(\mathbf{X}^{(i)}-\bar{\mathbf{X}})\boldsymbol{\Theta}-(Y^{(i)}-\bar Y)}_{r_i} +\underbrace{(\theta_0+\bar{\mathbf{X}}\boldsymbol{\Theta}-\bar Y)}_{a}.

这里 rir_i 随样本变,aa 对所有样本相同。因为每列减均值之后的总和都是 0,∑iri=0\sum_i r_i=0。所以:

∑i(ri+a)2=∑iri2+2a∑iri+Ma2=∑iri2+Ma2. \begin{aligned} \sum_i(r_i+a)^2 &=\sum_i r_i^2+2a\sum_i r_i+Ma^2\\ &=\sum_i r_i^2+Ma^2. \end{aligned}

固定 Θ\boldsymbol{\Theta} 时,只有 Ma2Ma^2 随截距变化。平方最低是 0,令 a=0a=0 就得到 θ0=Yˉ−XˉΘ\theta_0=\bar Y-\bar{\mathbf{X}}\boldsymbol{\Theta}。这和求导法得出同一个结论。

与你原稿对照:这里得到的是“固定 Θ\boldsymbol{\Theta} 后,驻点给出 JJ 关于 θ0\theta_0 的最小值”,不是说 θ0\theta_0 本身是 JJ 的最小值,也不是已经同时优化全部参数。

**本问完成检查:**公式已推出,而且说明了为什么是最小值。此时仍不能声称已经求出了整个岭回归的所有参数。

Q2(b):把刚得到的截距代回去(p.2,5%)

题面(同上原件 · Q2(b) · p.2)

p.2 Next, let’s define the centered input as Xc(i)=X(i)−Xˉ\mathbf{X}_c^{(i)}=\mathbf{X}^{(i)}-\bar{\mathbf{X}}, and the corresponding centered label as Yc(i)=Y(i)−YˉY_c^{(i)}=Y^{(i)}-\bar Y. Plug the above θ0\theta_0 into the loss function, try to derive that:

J(Θ,θ0)=Jc(Θ)=∑i=1m[Xc(i)Θ−Yc(i)]2+λ∥Θ∥22J(\boldsymbol{\Theta},\theta_0)=J_c(\boldsymbol{\Theta})=\sum_{i=1}^{m}[\mathbf{X}_c^{(i)}\boldsymbol{\Theta}-Y_c^{(i)}]^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2. (5%)

这问只做代入和整理,不需要再次求导。 “centered” 就是减去均值;没有除标准差。

第 1 步:先只看一个样本的残差,代入 (a) 的截距。

X(i)Θ+θ0−Y(i)=X(i)Θ+(Yˉ−XˉΘ)−Y(i)=X(i)Θ−XˉΘ+Yˉ−Y(i)=(X(i)−Xˉ)Θ−(Y(i)−Yˉ)=Xc(i)Θ−Yc(i). \begin{aligned} \mathbf{X}^{(i)}\boldsymbol{\Theta}+\theta_0-Y^{(i)} &=\mathbf{X}^{(i)}\boldsymbol{\Theta}+(\bar Y-\bar{\mathbf{X}}\boldsymbol{\Theta})-Y^{(i)}\\ &=\mathbf{X}^{(i)}\boldsymbol{\Theta}-\bar{\mathbf{X}}\boldsymbol{\Theta}+\bar Y-Y^{(i)}\\ &=(\mathbf{X}^{(i)}-\bar{\mathbf{X}})\boldsymbol{\Theta}-(Y^{(i)}-\bar Y)\\ &=\mathbf{X}_c^{(i)}\boldsymbol{\Theta}-Y_c^{(i)}. \end{aligned}

第二行把含 Θ\boldsymbol{\Theta} 的两项放一起;第三行对这两项提取 Θ\boldsymbol{\Theta},并把 Yˉ−Y(i)\bar Y-Y^{(i)} 写为 −(Y(i)−Yˉ)-(Y^{(i)}-\bar Y)。最后一行直接使用题目给的两个 centered 定义。

第 2 步:每个残差都已相等,平方后求和也相等。

J(Θ,Yˉ−XˉΘ)=∑i=1M(Xc(i)Θ−Yc(i))2+λ∥Θ∥22=Jc(Θ). \boxed{ J(\boldsymbol{\Theta},\bar Y-\bar{\mathbf{X}}\boldsymbol{\Theta}) =\sum_{i=1}^{M}(\mathbf{X}_c^{(i)}\boldsymbol{\Theta}-Y_c^{(i)})^2+\lambda\lVert\boldsymbol{\Theta}\rVert_2^2 =J_c(\boldsymbol{\Theta}). }

正则项没变,因为你只替换了截距,Θ\boldsymbol{\Theta} 还是原来的斜率向量。现在目标里不再出现独立的 θ0\theta_0,你的 Q2(b) 最后一式把上限写成了小写 mm;这里按 (a) 统一用 MM,指同一批样本。所以 (c) 可以只对 Θ\boldsymbol{\Theta} 求导。

**本问完成检查:**两个均值都减了:输入要减 Xˉ\bar{\mathbf{X}},标签也要减 Yˉ\bar Y。只减输入而不减标签,就推不出题目中的式子。

Q2(c):对中心化后的目标求导,解出斜率(p.2,10%)

题面(同上原件 · Q2(c) · p.2)

p.2 Finally, with calculating the first-order derivatives of Jc(Θ)J_c(\boldsymbol{\Theta}), try to find the analytic solution Θ^\hat{\boldsymbol{\Theta}} for the ridge regression. (10%)

这问从 (b) 最后一行接着做。 为了用矩阵解方程,把全部 Xc(i)\mathbf{X}_c^{(i)} 叠成 Xc\mathbf{X}_c,全部 Yc(i)Y_c^{(i)} 叠成 Yc\mathbf{Y}_c:

Jc(Θ)=(XcΘ−Yc)T(XcΘ−Yc)+λΘTΘ. J_c(\boldsymbol{\Theta})=(\mathbf{X}_c\boldsymbol{\Theta}-\mathbf{Y}_c)^T(\mathbf{X}_c\boldsymbol{\Theta}-\mathbf{Y}_c)+\lambda\boldsymbol{\Theta}^T\boldsymbol{\Theta}.

第 1 步:展开,找出哪些项含未知参数。 Jc=ΘTXcTXcΘ−2ΘTXcTYc+YcTYc+λΘTΘ. J_c=\boldsymbol{\Theta}^T\mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta}-2\boldsymbol{\Theta}^T\mathbf{X}_c^T\mathbf{Y}_c+\mathbf{Y}_c^T\mathbf{Y}_c+\lambda\boldsymbol{\Theta}^T\boldsymbol{\Theta}.

中间本来有两个交叉项,但它们都是同一个标量,所以合成两倍。YcTYc\mathbf{Y}_c^T\mathbf{Y}_c 只由数据决定,是常数。

第 2 步:逐项求导。

目标中的项 对 Θ 的导数 理由
ΘTXcTXcΘ\boldsymbol{\Theta}^T\mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta} 2XcTXcΘ2\mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta} 对称矩阵的二次型,类似对平方求导
−2ΘTXcTYc-2\boldsymbol{\Theta}^T\mathbf{X}_c^T\mathbf{Y}_c −2XcTYc-2\mathbf{X}_c^T\mathbf{Y}_c 参数的一次项
YcTYc\mathbf{Y}_c^T\mathbf{Y}_c 00 不含参数
λΘTΘ\lambda\boldsymbol{\Theta}^T\boldsymbol{\Theta} 2λΘ2\lambda\boldsymbol{\Theta} 每个参数平方分别求导

如果第一行的矩阵求导不熟,可以逐个看标量分量 θj\theta_j:一个残差平方的导数是 2(Xc(i)Θ−Yc(i))Xc,j(i)2(\mathbf{X}_c^{(i)}\boldsymbol{\Theta}-Y_c^{(i)})X_{c,j}^{(i)},其中 Xc,j(i)X_{c,j}^{(i)} 是第 i 条中心化样本的第 j 个标量特征;加上所有样本后,这正是向量 2XcT(XcΘ−Yc)2\mathbf{X}_c^T(\mathbf{X}_c\boldsymbol{\Theta}-\mathbf{Y}_c) 的第 jj 个分量。

所以总梯度为:

∇ΘJc=2XcTXcΘ−2XcTYc+2λΘ. \nabla_{\boldsymbol{\Theta}} J_c =2\mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta}-2\mathbf{X}_c^T\mathbf{Y}_c+2\lambda\boldsymbol{\Theta}.

第 3 步:令导数为零,解方程。

2XcTXcΘ−2XcTYc+2λΘ=0,XcTXcΘ+λΘ=XcTYc,(XcTXc+λIp)Θ=XcTYc. \begin{aligned} 2\mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta}-2\mathbf{X}_c^T\mathbf{Y}_c+2\lambda\boldsymbol{\Theta}&=0,\\ \mathbf{X}_c^T\mathbf{X}_c\boldsymbol{\Theta}+\lambda\boldsymbol{\Theta}&=\mathbf{X}_c^T\mathbf{Y}_c,\\ (\mathbf{X}_c^T\mathbf{X}_c+\lambda I_p)\boldsymbol{\Theta}&=\mathbf{X}_c^T\mathbf{Y}_c. \end{aligned}

第二行除以了 2 并移项;第三行把 λΘ\lambda\boldsymbol{\Theta} 写成 λIpΘ\lambda I_p\boldsymbol{\Theta} 才能提取右侧的 Θ\boldsymbol{\Theta}。IpI_p 是 pp 行 pp 列的单位矩阵,大小等于特征数,不是样本数。

因此:

Θ^=(XcTXc+λIp)−1XcTYc. \boxed{\hat{\boldsymbol{\Theta}}=(\mathbf{X}_c^T\mathbf{X}_c+\lambda I_p)^{-1}\mathbf{X}_c^T\mathbf{Y}_c.}

第 4 步:说明为什么这个逆存在。

取任意非零向量 vv:

vT(XcTXc+λIp)v=∥Xcv∥22+λ∥v∥22>0. v^T(\mathbf{X}_c^T\mathbf{X}_c+\lambda I_p)v =\lVert \mathbf{X}_cv\rVert_2^2+\lambda\lVert v\rVert_2^2>0.

第一项至少为 0,第二项因为题目给了 λ>0\lambda>0 而严格大于 0。这个矩阵因此正定、可逆;目标的 Hessian 是它的两倍,也正定,所以求到的是唯一最小值。

第 5 步:如果要回到原输入坐标,恢复截距。

θ^0=Yˉ−XˉΘ^,Y^=XnewΘ^+θ^0. \boxed{\hat\theta_0=\bar Y-\bar{\mathbf{X}}\hat{\boldsymbol{\Theta}},\qquad \hat Y=\mathbf{X}_{\mathrm{new}}\hat{\boldsymbol{\Theta}}+\hat\theta_0.}

其中 Xnew\mathbf{X}_{\mathrm{new}} 是一条新输入的行向量。

**补充验算(以下数字为演示自取,原题没有数据):**用两个样本 (1,2),(3,6)(1,2),(3,6),取 λ=2\lambda=2。这只是核对 (a)–(c) 如何接起来:

  1. 均值:Xˉ=2\bar{\mathbf{X}}=2,Yˉ=4\bar Y=4。
  2. 减均值:Xc=(−1,1)T\mathbf{X}_c=(-1,1)^T,Yc=(−2,2)T\mathbf{Y}_c=(-2,2)^T。
  3. 相乘求和:XcTXc=1+1=2\mathbf{X}_c^T\mathbf{X}_c=1+1=2;XcTYc=2+2=4\mathbf{X}_c^T\mathbf{Y}_c=2+2=4。
  4. 代入 (c):Θ^=4/(2+2)=1\hat{\boldsymbol{\Theta}}=4/(2+2)=1。
  5. 代入 (a):θ^0=4−2(1)=2\hat\theta_0=4-2(1)=2,模型为 y^=x+2\hat y=x+2。
  6. 原数据预测为 3、5,残差为 1、−1,RSS 为 2;正则项为 2(1)2=22(1)^2=2,总损失为 4。中心化残差也是 1、−1,损失不变,核对了 (b)。

**本问完成检查:**逆矩阵里出现的是 XcTXc+λIp\mathbf{X}_c^T\mathbf{X}_c+\lambda I_p;系数解要用中心化数据;截距没有被一起惩罚。

Q3:从题目给的初始参数开始,只更新一次

公共题面(HW01-2026T1-题目.pdf · Q3 · p.2–3;数据表为图片,已视觉核对)

p.2 Assume that we have a training set and a test set as follows:

表(题面,p.3):训练集与测试集。

Index Train x1 Train x2 Train y Test x1 Test x2 Test y
1 0.15 0.35 0 0.28 0.82 1
2 0.30 0.45 0 0.45 0.75 1
3 0.55 0.25 0 0.58 0.62 1
4 0.30 0.80 1 0.72 0.48 1
5 0.55 0.60 1 0.22 0.40 0
6 0.70 0.50 1 0.50 0.26 0

p.3 Use these data to implement a logistic regression classifier. We use the linear model fΘ(x1,x2)=θ0+θ1x1+θ2x2f_{\boldsymbol{\Theta}}(x_1,x_2)=\theta_0+\theta_1x_1+\theta_2x_2 and the logistic regression function as σ(fΘ(x1,x2))=11+e−fΘ(x1,x2)\sigma(f_{\boldsymbol{\Theta}}(x_1,x_2))=\frac{1}{1+e^{-f_{\boldsymbol{\Theta}}(x_1,x_2)}}. The error function uses cross-entropy error function.

Now, let’s use the gradient descent to update the model in the training set. The initial weights are set as θ0=−1,θ1=1.5,θ2=0.5\theta_0=-1,\theta_1=1.5,\theta_2=0.5. The learning rate is 0.1.

公式按原题重排。先把初始参数 −1、1.5、0.5 和学习率 0.1 写在手边。下面使用六条训练样本的交叉熵总和,与 L03 原课件(本地课件) PDF p.35–36 一致;这会直接影响 (b) 一步更新的数值。

Q3(a):写概率模型,再写六条样本的损失(p.3,5%)

题面(同上原件 · Q3(a) · p.3)

p.3 Please write down the logistic model P(y^=1∣x1,x2)P(\hat y=1\mid x_1,x_2) and its cross-entropy error function. (5%)

这问还不更新参数。先写清楚模型如何从两个输入产生一个概率,以及什么叫预测得不好。

与你新增的 Q3(a) 对照:sigmoid 的分母是 1+e−z1+e^{-z},不是 1−e−z1-e^{-z};后者在 z=0z=0 时无定义,也不能保证概率落在 0 到 1 之间。这里 z=θ0+θ1x1+θ2x2z=\theta_0+\theta_1x_1+\theta_2x_2,x1,x2x_1,x_2 是题目表中的两列独立特征,不能把第二列写成 x2x^2。单条交叉熵 ℓi=−yiln⁡pi−(1−yi)ln⁡(1−pi)\ell_i=-y_i\ln p_i-(1-y_i)\ln(1-p_i) 的写法正确;本题再对六条训练样本求和。

第 1 步:把直线模型放进 sigmoid。

先算一个分数 z=θ0+θ1x1+θ2x2z=\theta_0+\theta_1x_1+\theta_2x_2,再计算:

P(y^=1∣x1,x2)=11+exp⁡[−(θ0+θ1x1+θ2x2)]. \boxed{P(\hat y=1\mid x_1,x_2) =\frac{1}{1+\exp[-(\theta_0+\theta_1x_1+\theta_2x_2)]}.}

代入给定参数,初始模型为:

P(y^=1∣x1,x2)=11+exp⁡[−(−1+1.5x1+0.5x2)]. P(\hat y=1\mid x_1,x_2) =\frac{1}{1+\exp[-(-1+1.5x_1+0.5x_2)]}.

例如训练第一条:

z1=−1+1.5(0.15)+0.5(0.35)=−0.6,p1=11+e0.6=0.3543436938. z_1=-1+1.5(0.15)+0.5(0.35)=-0.6, \qquad p_1=\frac{1}{1+e^{0.6}}=0.3543436938.

指数是正 0.6,因为 sigmoid 里用的是 −z-z。这里 p1p_1 是“属于类别 1 的概率”,还不是最终的 0/1 判断。

第 2 步:按真实标签写交叉熵。

记第 ii 条的概率为 pip_i,真实标签为 yiy_i。单条损失是:

ℓi=−yiln⁡pi−(1−yi)ln⁡(1−pi). \ell_i=-y_i\ln p_i-(1-y_i)\ln(1-p_i).

为什么是这样?真实标签为 1 时只留下 −ln⁡pi-\ln p_i,模型给类别 1 的概率越高,损失越低;真实标签为 0 时只留下 −ln⁡(1−pi)-\ln(1-p_i),模型给类别 0 的概率越高,损失越低。

第 3 步:把本题六条数据的标签代进去。

前三条真实标签为 0,后三条为 1,因此:

E(Θ)=−ln⁡(1−p1)−ln⁡(1−p2)−ln⁡(1−p3)−ln⁡p4−ln⁡p5−ln⁡p6. \boxed{ E(\boldsymbol{\Theta})=-\ln(1-p_1)-\ln(1-p_2)-\ln(1-p_3) -\ln p_4-\ln p_5-\ln p_6. }

一般求和写法是:

E(Θ)=−∑i=16[yiln⁡pi+(1−yi)ln⁡(1−pi)]. E(\boldsymbol{\Theta})=-\sum_{i=1}^{6}[y_i\ln p_i+(1-y_i)\ln(1-p_i)].

这里每个 pip_i 都由上面的模型和训练集第 i 行计算。例如第一条损失是 −ln⁡(1−0.3543436938)≈0.43748795-\ln(1-0.3543436938)\approx0.43748795。

**本问完成检查:**既写了模型也写了损失;真实标签 0 的三条通过 ln⁡(1−pi)\ln(1-p_i) 参与,不能漏掉。

Q3(b):算六条梯度贡献,合起来更新一次(p.3,10%)

题面(同上原件 · Q3(b) · p.3)

p.3 Use gradient descent to update θ0\theta_0, θ1\theta_1 and θ2\theta_2 for one iteration. Write down the updated logistic regression model. (10%)

这问要拿到三个新参数,最后写出新概率模型。 全批量的一次更新顺序是:先用同一套旧参数算六条数据 → 六条贡献相加 → 统一更新一次。算到第二条时还不能改参数。

第 1 步:先确定要累加的梯度公式。

对一条样本,(a) 给出 ℓ=−yln⁡p−(1−y)ln⁡(1−p)\ell=-y\ln p-(1-y)\ln(1-p)。沿着“参数影响分数,分数影响概率,概率影响损失”求导:

∂ℓ∂p=−yp+1−y1−p,∂p∂z=p(1−p). \frac{\partial\ell}{\partial p} =-\frac{y}{p}+\frac{1-y}{1-p}, \qquad \frac{\partial p}{\partial z}=p(1-p).

第二个导数可以直接从 p=(1+e−z)−1p=(1+e^{-z})^{-1} 算:外层倒数求导带负号,内层 e−ze^{-z} 求导也带负号,两者抵消,得到 e−z/(1+e−z)2=p(1−p)e^{-z}/(1+e^{-z})^2=p(1-p)。

把两段相乘,约去分母:

∂ℓ∂z=(−yp+1−y1−p)p(1−p)=−y(1−p)+(1−y)p=−y+yp+p−yp=p−y. \begin{aligned} \frac{\partial\ell}{\partial z} &=\left(-\frac{y}{p}+\frac{1-y}{1-p}\right)p(1-p)\\ &=-y(1-p)+(1-y)p\\ &=-y+yp+p-yp=p-y. \end{aligned}

分数 z=θ0+θ1x1+θ2x2z=\theta_0+\theta_1x_1+\theta_2x_2 对三个参数的导数分别是 1,x1,x21,x_1,x_2。所以一条样本对三个梯度的贡献是:

∂ℓ∂θ0=p−y,∂ℓ∂θ1=(p−y)x1,∂ℓ∂θ2=(p−y)x2. \frac{\partial\ell}{\partial\theta_0}=p-y,\qquad \frac{\partial\ell}{\partial\theta_1}=(p-y)x_1,\qquad \frac{\partial\ell}{\partial\theta_2}=(p-y)x_2.

第 2 步:六条训练数据逐条算旧分数。 z1=−1+1.5(0.15)+0.5(0.35)=−0.600,z2=−1+1.5(0.30)+0.5(0.45)=−0.325,z3=−1+1.5(0.55)+0.5(0.25)=−0.050,z4=−1+1.5(0.30)+0.5(0.80)=−0.150,z5=−1+1.5(0.55)+0.5(0.60)=0.125,z6=−1+1.5(0.70)+0.5(0.50)=0.300. \begin{aligned} z_1&=-1+1.5(0.15)+0.5(0.35)=-0.600,\\ z_2&=-1+1.5(0.30)+0.5(0.45)=-0.325,\\ z_3&=-1+1.5(0.55)+0.5(0.25)=-0.050,\\ z_4&=-1+1.5(0.30)+0.5(0.80)=-0.150,\\ z_5&=-1+1.5(0.55)+0.5(0.60)=0.125,\\ z_6&=-1+1.5(0.70)+0.5(0.50)=0.300. \end{aligned}

第 3 步:把每个分数变成概率,再减去真实标签。

每行都用 pi=1/(1+e−zi)p_i=1/(1+e^{-z_i})。例如第四条 p4=1/(1+e0.15)=0.4625701547p_4=1/(1+e^{0.15})=0.4625701547,真实标签是 1,所以 p4−y4=−0.5374298453p_4-y_4=-0.5374298453。

训练行 z p y p−y
1 −0.600 0.3543436938 0 0.3543436938
2 −0.325 0.4194576952 0 0.4194576952
3 −0.050 0.4875026035 0 0.4875026035
4 −0.150 0.4625701547 1 −0.5374298453
5 0.125 0.5312093734 1 −0.4687906266
6 0.300 0.5744425168 1 −0.4255574832

第 4 步:各行的残差乘以相应输入,得到三列贡献。

先手算第四行,这行容易丢负号:

θ0 contribution=−0.5374298453,θ1 contribution=(−0.5374298453)(0.30)=−0.1612289536,θ2 contribution=(−0.5374298453)(0.80)=−0.4299438763. \begin{aligned} \theta_0\text{ contribution}&=-0.5374298453,\\ \theta_1\text{ contribution}&=(-0.5374298453)(0.30)=-0.1612289536,\\ \theta_2\text{ contribution}&=(-0.5374298453)(0.80)=-0.4299438763. \end{aligned}

注意这里是梯度贡献,还没有乘学习率,也还没有从参数中减去。六行完整结果:

训练行 截距贡献 p−y 第一系数贡献 (p−y)x1 第二系数贡献 (p−y)x2
1 0.3543436938 0.0531515541 0.1240202928
2 0.4194576952 0.1258373086 0.1887559628
3 0.4875026035 0.2681264319 0.1218756509
4 −0.5374298453 −0.1612289536 −0.4299438763
5 −0.4687906266 −0.2578348446 −0.2812743760
6 −0.4255574832 −0.2978902382 −0.2127787416
各列求和 −0.1704739627 −0.2698387419 −0.4893450873

例如截距这一列就是:

g0=0.3543436938+0.4194576952+0.4875026035−0.5374298453−0.4687906266−0.4255574832=−0.1704739627. \begin{aligned} g_0={}&0.3543436938+0.4194576952+0.4875026035\\ &-0.5374298453-0.4687906266-0.4255574832\\ ={}&-0.1704739627. \end{aligned}

第一系数那一列必须乘 x1x_1 再相加:

g1=0.15(0.3543436938)+0.30(0.4194576952)+0.55(0.4875026035)+0.30(−0.5374298453)+0.55(−0.4687906266)+0.70(−0.4255574832)=−0.2698387419. \begin{aligned} g_1={}&0.15(0.3543436938)+0.30(0.4194576952)+0.55(0.4875026035)\\ &+0.30(-0.5374298453)+0.55(-0.4687906266)+0.70(-0.4255574832)\\ ={}&-0.2698387419. \end{aligned}

第二系数用另一列 x2x_2:

g2=0.35(0.3543436938)+0.45(0.4194576952)+0.25(0.4875026035)+0.80(−0.5374298453)+0.60(−0.4687906266)+0.50(−0.4255574832)=−0.4893450873. \begin{aligned} g_2={}&0.35(0.3543436938)+0.45(0.4194576952)+0.25(0.4875026035)\\ &+0.80(-0.5374298453)+0.60(-0.4687906266)+0.50(-0.4255574832)\\ ={}&-0.4893450873. \end{aligned}

第 5 步:每个旧参数减去“0.1 × 对应梯度”。

θ0′=−1−0.1(−0.1704739627)=−0.9829526037,θ1′=1.5−0.1(−0.2698387419)=1.5269838742,θ2′=0.5−0.1(−0.4893450873)=0.5489345087. \begin{aligned} \theta_0'&=-1-0.1(-0.1704739627)=-0.9829526037,\\ \theta_1'&=1.5-0.1(-0.2698387419)=1.5269838742,\\ \theta_2'&=0.5-0.1(-0.4893450873)=0.5489345087. \end{aligned}

三个梯度都是负数,所以三个参数都增加。第一个仍然为负,但 −0.983 比 −1 大,方向没有写反。

第 6 步:把新参数放回概率模型。 P(y^=1∣x1,x2)=11+exp⁡[−(−0.9829526037+1.5269838742x1+0.5489345087x2)]. \boxed{ P(\hat y=1\mid x_1,x_2) =\frac{1}{1+\exp[-(-0.9829526037+1.5269838742x_1+0.5489345087x_2)]}. }

这就是 (c) 要用的模型。用六条训练数据复算,总交叉熵从 3.6076515301 降到 3.5756262189,可作为本次更新的验算。

**如果你的结果只变化了这里的六分之一:**先检查是否把六条损失取了平均。平均交叉熵会使梯度除以 6,在同样学习率 0.1 下得到 (−0.9971587673,1.5044973124,0.5081557515)(-0.9971587673,1.5044973124,0.5081557515)。这是另一种损失缩放下的一步;本解析从 (a) 开始明确采用求和,因此后面全部沿用求和结果。

**本问完成检查:**六条都用旧参数;三列贡献分别累加;学习率乘一次;三个参数一起更新;最终仍写 sigmoid 概率模型。

Q3(c):逐条预测测试集,再数 TP、FP、TN、FN(p.3,10%)

题面(同上原件 · Q3(c) · p.3)

p.3 Use the above new model to make predictions for all the samples in the test dataset. Then, calculate the accuracy, precision and recall to evaluate this model. (10%)

这一问用的是 (b) 的新参数和右半边测试表。 以下以类别 1 为正类,概率达到 0.5 判为 1,否则判为 0。

第 1 步:逐条计算新分数。

把参数先固定为刚求出的 (−0.9829526037,1.5269838742,0.5489345087)(-0.9829526037,1.5269838742,0.5489345087):

z1′=−0.9829526037+1.5269838742(0.28)+0.5489345087(0.82)=−0.1052708218,z2′=−0.9829526037+1.5269838742(0.45)+0.5489345087(0.75)=0.1158910212,z3′=−0.9829526037+1.5269838742(0.58)+0.5489345087(0.62)=0.2430374387,z4′=−0.9829526037+1.5269838742(0.72)+0.5489345087(0.48)=0.3799643499,z5′=−0.9829526037+1.5269838742(0.22)+0.5489345087(0.40)=−0.4274423479,z6′=−0.9829526037+1.5269838742(0.50)+0.5489345087(0.26)=−0.0767376944. \begin{aligned} z_1'&=-0.9829526037+1.5269838742(0.28)+0.5489345087(0.82) =-0.1052708218,\\ z_2'&=-0.9829526037+1.5269838742(0.45)+0.5489345087(0.75) =0.1158910212,\\ z_3'&=-0.9829526037+1.5269838742(0.58)+0.5489345087(0.62) =0.2430374387,\\ z_4'&=-0.9829526037+1.5269838742(0.72)+0.5489345087(0.48) =0.3799643499,\\ z_5'&=-0.9829526037+1.5269838742(0.22)+0.5489345087(0.40) =-0.4274423479,\\ z_6'&=-0.9829526037+1.5269838742(0.50)+0.5489345087(0.26) =-0.0767376944. \end{aligned}

第 2 步:分数变概率,概率变 0/1。

第一条举例:

p1′=11+e0.1052708218=0.4737065719<0.5,y^1=0. p_1'=\frac{1}{1+e^{0.1052708218}}=0.4737065719<0.5, \qquad\hat y_1=0.
测试行 新分数 新概率 预测 真实 如何计数
1 −0.1052708218 0.4737065719 0 1 FN:真实为正,没报出来
2 0.1158910212 0.5289403717 1 1 TP:报正且正确
3 0.2430374387 0.5604620420 1 1 TP:报正且正确
4 0.3799643499 0.5938645045 1 1 TP:报正且正确
5 −0.4274423479 0.3947372404 0 0 TN:报负且正确
6 −0.0767376944 0.4808249851 0 0 TN:报负且正确

第 3 步:数四种情况。

真实 / 预测 预测 1 预测 0
真实 1 TP = 3(第 2、3、4 行) FN = 1(第 1 行)
真实 0 FP = 0 TN = 2(第 5、6 行)

四格合计 3+1+0+2=63+1+0+2=6,等于测试样本数。

第 4 步:分别确定三个指标的分母。

Accuracy:六条里预测对了几条?正确的是第 2–6 行,共五条。

Accuracy=TP+TNTP+TN+FP+FN=3+26=56≈83.33%. \boxed{\mathrm{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN} =\frac{3+2}{6}=\frac{5}{6}\approx83.33\%.}

Precision:模型报为正类的那些样本里,有多少是真的正类?模型报正的是第 2、3、4 行,三条都正确。

Precision=TPTP+FP=33+0=100%. \boxed{\mathrm{Precision}=\frac{TP}{TP+FP}=\frac{3}{3+0}=100\%.}

Recall:本来真实为正类的那些样本里,找出了多少?真实正类是第 1、2、3、4 行,共四条;找到后三条。

Recall=TPTP+FN=33+1=75%. \boxed{\mathrm{Recall}=\frac{TP}{TP+FN}=\frac{3}{3+1}=75\%.}

所以 precision 达到 100% 并不表示没犯错:第 1 条仍被漏掉。Precision 的分母只包含“报出来的正类”,漏报由 recall 反映。

**独立复算 Q3 的代码:**每一段对应上面的一个步骤,可直接运行,无需 Q1 的变量。

import numpy as np

train = np.array([[.15,.35], [.30,.45], [.55,.25],
                  [.30,.80], [.55,.60], [.70,.50]])
y = np.array([0, 0, 0, 1, 1, 1])
test = np.array([[.28,.82], [.45,.75], [.58,.62],
                 [.72,.48], [.22,.40], [.50,.26]])
yt = np.array([1, 1, 1, 1, 0, 0])
A = np.column_stack([np.ones(6), train])
B = np.column_stack([np.ones(6), test])
old = np.array([-1., 1.5, .5])
p = 1 / (1 + np.exp(-(A @ old)))
r = p - y
contributions = r[:, None] * A
print("each training contribution:", contributions)
gradient = contributions.sum(axis=0)
new = old - .1 * gradient
print("gradient:", gradient)
print("new parameters:", new)
prob = 1 / (1 + np.exp(-(B @ new)))
pred = (prob >= .5).astype(int)
print("test probability, prediction, label:", np.column_stack([prob, pred, yt]))
tp = np.sum((pred == 1) & (yt == 1))
fp = np.sum((pred == 1) & (yt == 0))
tn = np.sum((pred == 0) & (yt == 0))
fn = np.sum((pred == 0) & (yt == 1))
print("accuracy, precision, recall:", (tp+tn)/6, tp/(tp+fp), tp/(tp+fn))

Q4:先对类别分数求导,再沿链式法则求到参数

公共题面(HW01-2026T1-题目.pdf · Q4 · p.3)

p.3 In multi-class tasks we discriminate between three or more classes. As usual, we imagine that we have one sample X=(x(1),x(2),…,x(n))T\mathbf{X}=(x^{(1)},x^{(2)},\ldots,x^{(n)})^T with n-dimensional features. Suppose there are K classes in this task. Instead of representing the output labels as 1, 2, …, K, we present the vector to be 0 in each component except for the one corresponding to the correct label. For example, if there are 5 classes and a particular sample belongs to class 3, then its label vector is [0, 0, 1, 0, 0]. In other words, the label y3=1y_3=1 and y1=y2=y4=y5=0y_1=y_2=y_4=y_5=0.

In many cases, we perform multi-class tasks by softmax function, with the probability written as:

P(y^i=1∣X)=eXTΘi∑k=1KeXTΘkP(\hat y_i=1\mid\mathbf{X})=\frac{e^{\mathbf{X}^T\boldsymbol{\Theta}_i}}{\sum_{k=1}^{K}e^{\mathbf{X}^T\boldsymbol{\Theta}_k}}.

Here XTΘi\mathbf{X}^T\boldsymbol{\Theta}_i is the linear model. As there are K classes in this task, we have a set of K weight vectors for multi-class classification: Θ1,Θ2,…,ΘK\boldsymbol{\Theta}_1,\boldsymbol{\Theta}_2,\ldots,\boldsymbol{\Theta}_K. The P(y^i=1∣X)P(\hat y_i=1\mid\mathbf{X}) indicates the probability that the prediction for the sample is class i.

公式按原题重排。这道题只有一个样本,KK 表示类别数。 别把这里的求和当成 Q3 中“对六个样本求和”。这里 X\mathbf{X} 是一个样本的列向量,也不同于 Q2 中整张数据表的矩阵。

为减少长式子,只做三个缩写,后面全部对应原题中的同一个量:

zi=XTΘi,S=∑k=1Kezk,pi=P(y^i=1∣X)=eziS. z_i=\mathbf{X}^T\boldsymbol{\Theta}_i,\qquad S=\sum_{k=1}^{K}e^{z_k},\qquad p_i=P(\hat y_i=1\mid\mathbf{X})=\frac{e^{z_i}}{S}.

其中 ziz_i 是第 i 类的分数,pip_i 是第 i 类的概率,SS 是所有类的指数分数之和。ii 表示“正在看哪个概率”,jj 表示“正在改哪个分数或哪组参数”。

Q4(a):分别计算同一类和不同类的导数(p.3,10%)

题面(同上原件 · Q4(a) · p.3)

p.3 Calculate that the derivative of P(y^i=1∣X)P(\hat y_i=1\mid\mathbf{X}) w.r.t. XTΘj\mathbf{X}^T\boldsymbol{\Theta}_j is:

∂P(y^i=1∣X)∂(XTΘj)={P(y^i=1∣X)[1−P(y^j=1∣X)],j=i,−P(y^i=1∣X)P(y^j=1∣X),j≠i. \frac{\partial P(\hat y_i=1\mid\mathbf{X})}{\partial(\mathbf{X}^T\boldsymbol{\Theta}_j)}= \begin{cases} P(\hat y_i=1\mid\mathbf{X})[1-P(\hat y_j=1\mid\mathbf{X})],&j=i,\\ -P(\hat y_i=1\mid\mathbf{X})P(\hat y_j=1\mid\mathbf{X}),&j\ne i. \end{cases}

p.3 (hint: you can separately discuss the two situations for j=ij=i and j≠ij\ne i) (10%)

题面公式按原题重排。目标就是求 ∂pi/∂zj\partial p_i/\partial z_j。 先固定一个输出概率 pi=ezi/Sp_i=e^{z_i}/S,看看改变 zjz_j 时,分子和分母分别怎么变。

第 1 步:写商法则,不急着代概率。

如果 pi=u/vp_i=u/v,那么:

∂pi∂zj=v ∂u/∂zj−u ∂v/∂zjv2. \frac{\partial p_i}{\partial z_j} =\frac{v\,\partial u/\partial z_j-u\,\partial v/\partial z_j}{v^2}.

本题的 u=eziu=e^{z_i},v=Sv=S。接下来唯一需要分情况的地方,就是分子的导数。

第 2 步:当 j=i,分子、分母都含正在改变的分数。

∂ezi∂zi=ezi,∂S∂zi=ezi. \frac{\partial e^{z_i}}{\partial z_i}=e^{z_i},\qquad \frac{\partial S}{\partial z_i}=e^{z_i}.

第二式为什么只剩一个指数?因为 S=ez1+⋯+ezKS=e^{z_1}+\cdots+e^{z_K},对 ziz_i 求导时只有第 i 项变化,其他类的分数暂时固定。

把这两个导数放进商法则:

∂pi∂zi=Sezi−ezieziS2=eziS−eziSeziS=pi−pi2=pi(1−pi). \begin{aligned} \frac{\partial p_i}{\partial z_i} &=\frac{S e^{z_i}-e^{z_i}e^{z_i}}{S^2}\\ &=\frac{e^{z_i}}S-\frac{e^{z_i}}S\frac{e^{z_i}}S\\ &=p_i-p_i^2\\ &=p_i(1-p_i). \end{aligned}

第二行把分式拆成两项;第三行每一个 ezi/Se^{z_i}/S 都替换为 pip_i。这就得到原题第一种情况。

第 3 步:当 j≠i,分子不变,分母仍会变。

此时分子是 ezie^{z_i},对另一个变量 zjz_j 求导为 0;但分母中确实有 ezje^{z_j},所以:

∂ezi∂zj=0,∂S∂zj=ezj. \frac{\partial e^{z_i}}{\partial z_j}=0,\qquad \frac{\partial S}{\partial z_j}=e^{z_j}.

再次代商法则:

∂pi∂zj=S(0)−eziezjS2=−eziSezjS=−pipj. \begin{aligned} \frac{\partial p_i}{\partial z_j} &=\frac{S(0)-e^{z_i}e^{z_j}}{S^2}\\ &=-\frac{e^{z_i}}S\frac{e^{z_j}}S\\ &=-p_ip_j. \end{aligned}

负号表示:提高别的类的分数,会增大共同分母,从而降低当前类的概率。即使分子不含 zjz_j,也不能说整个概率对它的导数为零。

第 4 步:把两种情况合起来。 ∂pi∂zj={pi(1−pi),j=i,−pipj,j≠i. \boxed{\frac{\partial p_i}{\partial z_j}= \begin{cases}p_i(1-p_i),&j=i,\\-p_ip_j,&j\ne i.\end{cases}}

**补充算一遍(数字为演示自取):**设三类分数为 (0,ln⁡2,ln⁡3)(0,\ln2,\ln3),指数为 (1,2,3)(1,2,3),所以 S=6S=6、概率为 (1/6,1/3,1/2)(1/6,1/3,1/2)。若观察第二类概率:

∂p2∂z2=13(1−13)=29,∂p2∂z1=−1316=−118. \frac{\partial p_2}{\partial z_2}=\frac{1}{3}\left(1-\frac{1}{3}\right)=\frac{2}{9}, \qquad \frac{\partial p_2}{\partial z_1}=-\frac{1}{3}\frac{1}{6}=-\frac{1}{18}.

同类导数为正,异类为负,与刚才的分子分母分析吻合。这是导数的数值,不是在说分数增加 1 后概率恰好增加这么多;导数描述的是局部变化率。

**本问完成检查:**两种情况各有求导过程;特别是异类情况下,分母的导数不能漏。

Q4(b):由分数的导数,得到参数向量的导数(p.4,5%)

题面(同上原件 · Q4(b) · p.4)

p.4 Calculate the derivative of P(y^i=1∣X)P(\hat y_i=1\mid\mathbf{X}) w.r.t. Θj\boldsymbol{\Theta}_j. (5%)

(hint: ∂P(y^i=1∣X)∂Θj=∂P(y^i=1∣X)∂(XTΘj)∂(XTΘj)∂Θj\frac{\partial P(\hat y_i=1\mid\mathbf{X})}{\partial\boldsymbol{\Theta}_j}=\frac{\partial P(\hat y_i=1\mid\mathbf{X})}{\partial(\mathbf{X}^T\boldsymbol{\Theta}_j)}\frac{\partial(\mathbf{X}^T\boldsymbol{\Theta}_j)}{\partial\boldsymbol{\Theta}_j}.)

(a) 对一个数 zjz_j 求导,(b) 要对一整列参数 Θj\boldsymbol{\Theta}_j 求导。 中间只差“zjz_j 怎样由参数算出来”这一段。

第 1 步:把点积展开,逐个参数求导。

如果 X=(x(1),…,x(n))T\mathbf{X}=(x^{(1)},\ldots,x^{(n)})^T,第 j 类参数为 Θj=(θ1j,…,θnj)T\boldsymbol{\Theta}_j=(\theta_{1j},\ldots,\theta_{nj})^T,那么:

zj=XTΘj=x(1)θ1j+x(2)θ2j+⋯+x(n)θnj. z_j=\mathbf{X}^T\boldsymbol{\Theta}_j =x^{(1)}\theta_{1j}+x^{(2)}\theta_{2j}+\cdots+x^{(n)}\theta_{nj}.

对 θ1j\theta_{1j} 求导得到 x(1)x^{(1)},对 θ2j\theta_{2j} 求导得到 x(2)x^{(2)},一直到最后一个参数。把这些偏导按列摆好:

∇Θjzj=(x(1)x(2)⋮x(n))=X. \nabla_{\boldsymbol{\Theta}_j}z_j =\begin{pmatrix}x^{(1)}\\x^{(2)}\\\vdots\\x^{(n)}\end{pmatrix} =\mathbf{X}.

因此这一步得到的是输入列向量,不是标量,也不是行向量 XT\mathbf{X}^T。

第 2 步:接上 (a) 已算出的导数。

链式法则是:

∇Θjpi=∂pi∂zj∇Θjzj=∂pi∂zjX. \nabla_{\boldsymbol{\Theta}_j}p_i =\frac{\partial p_i}{\partial z_j}\nabla_{\boldsymbol{\Theta}_j}z_j =\frac{\partial p_i}{\partial z_j}\mathbf{X}.

把 (a) 的两种结果分别代入:

∇Θjpi={pi(1−pi)X,j=i,−pipjX,j≠i. \boxed{\nabla_{\boldsymbol{\Theta}_j}p_i= \begin{cases} p_i(1-p_i)\mathbf{X},&j=i,\\ -p_ip_j\mathbf{X},&j\ne i. \end{cases}}

换回原题概率记号,即

∂P(y^i=1∣X)∂Θj={P(y^i=1∣X)[1−P(y^j=1∣X)]X,j=i,−P(y^i=1∣X)P(y^j=1∣X)X,j≠i. \frac{\partial P(\hat y_i=1\mid\mathbf{X})}{\partial\boldsymbol{\Theta}_j} =\begin{cases} P(\hat y_i=1\mid\mathbf{X})[1-P(\hat y_j=1\mid\mathbf{X})]\mathbf{X},&j=i,\\ -P(\hat y_i=1\mid\mathbf{X})P(\hat y_j=1\mid\mathbf{X})\mathbf{X},&j\ne i. \end{cases}

这就是 (b) 要求的结果。不需要重新对整个 softmax 分式求一遍商法则。

**补充数值检查:**沿用 (a) 的自取概率,再取 X=(2,−1)T\mathbf{X}=(2,-1)^T。这些概率可由参数实现,例如令 Θk=(zk/2,0)T\boldsymbol{\Theta}_k=(z_k/2,0)^T,就有 XTΘk=zk\mathbf{X}^T\boldsymbol{\Theta}_k=z_k。

于是:

∇Θ2p2=29(2−1)=(4/9−2/9), \nabla_{\boldsymbol{\Theta}_2}p_2=\frac{2}{9}\begin{pmatrix}2\\-1\end{pmatrix} =\begin{pmatrix}4/9\\-2/9\end{pmatrix}, ∇Θ1p2=−118(2−1)=(−1/91/18). \nabla_{\boldsymbol{\Theta}_1}p_2=-\frac{1}{18}\begin{pmatrix}2\\-1\end{pmatrix} =\begin{pmatrix}-1/9\\1/18\end{pmatrix}.

**本问完成检查:**参数有 n 个分量,梯度就要有 n 个分量;(a) 的标量结果必须再乘输入向量。

Q4(c):对全部类别的损失求导,化成预测减真实(p.4,10%)

题面(同上原件 · Q4(c) · p.4)

p.4 We use the following negative log-likelihood loss function for this multi-class task:

E(Θ)=−∑i=1Kyiln⁡P(y^i=1∣X)E(\boldsymbol{\Theta})=-\sum_{i=1}^{K}y_i\ln P(\hat y_i=1\mid\mathbf{X})

where yiy_i indicates the label for class i. Prove that the derivative of E(Θ)E(\boldsymbol{\Theta}) w.r.t. Θj\boldsymbol{\Theta}_j is

∂E(Θ)∂Θj=XP(y^j=1∣X)−Xyj\frac{\partial E(\boldsymbol{\Theta})}{\partial\boldsymbol{\Theta}_j}=\mathbf{X} P(\hat y_j=1\mid\mathbf{X})-\mathbf{X} y_j. (10%)

(hint: ∂E(Θ)∂Θj=∂E(Θ)∂P(y^i=1∣X)∂P(y^i=1∣X)∂(XTΘj)∂(XTΘj)∂Θj\frac{\partial E(\boldsymbol{\Theta})}{\partial\boldsymbol{\Theta}_j}=\frac{\partial E(\boldsymbol{\Theta})}{\partial P(\hat y_i=1\mid\mathbf{X})}\frac{\partial P(\hat y_i=1\mid\mathbf{X})}{\partial(\mathbf{X}^T\boldsymbol{\Theta}_j)}\frac{\partial(\mathbf{X}^T\boldsymbol{\Theta}_j)}{\partial\boldsymbol{\Theta}_j}.)

公式按原题重排。要证明的目标用缩写就是 ∇ΘjE=(pj−yj)X\nabla_{\boldsymbol{\Theta}_j}E=(p_j-y_j)\mathbf{X}。 注意原题 hint 展示了一条经过 pip_i 的求导路径;因为损失里有对 i 的求和,完整求导时要把所有路径加起来。

第 1 步:从损失出发,把求和保留到求导式里。

E=−∑i=1Kyiln⁡pi. E=-\sum_{i=1}^{K}y_i\ln p_i.

真实标签 yiy_i 是已知常数。对 ln⁡pi\ln p_i 求导会带出 1/pi1/p_i,再乘概率对参数的导数:

∇ΘjE=−∑i=1Kyipi∇Θjpi. \nabla_{\boldsymbol{\Theta}_j}E =-\sum_{i=1}^{K}\frac{y_i}{p_i}\nabla_{\boldsymbol{\Theta}_j}p_i.

这里不能只保留 i=ji=j 一项,因为改变第 j 类分数也会改变其他类别的概率。

第 2 步:把 i=j 的一项和所有 i≠j 的项拆开。

∇ΘjE=−yjpj∇Θjpj−∑i≠jyipi∇Θjpi. \nabla_{\boldsymbol{\Theta}_j}E =-\frac{y_j}{p_j}\nabla_{\boldsymbol{\Theta}_j}p_j -\sum_{i\ne j}\frac{y_i}{p_i}\nabla_{\boldsymbol{\Theta}_j}p_i.

这样拆的目的,是为了直接使用 (b) 的两种情况。

第 3 步:分别代入 (b) 的导数。

同类项代 pj(1−pj)Xp_j(1-p_j)\mathbf{X};异类项代 −pipjX-p_ip_j\mathbf{X}:

∇ΘjE=−yjpjpj(1−pj)X−∑i≠jyipi(−pipjX). \nabla_{\boldsymbol{\Theta}_j}E =-\frac{y_j}{p_j}p_j(1-p_j)\mathbf{X} -\sum_{i\ne j}\frac{y_i}{p_i}(-p_ip_j\mathbf{X}).

第一项的 pjp_j 约掉;求和里的 pip_i 约掉,两个负号变正号:

∇ΘjE=−yj(1−pj)X+∑i≠jyipjX. \nabla_{\boldsymbol{\Theta}_j}E =-y_j(1-p_j)\mathbf{X}+\sum_{i\ne j}y_ip_j\mathbf{X}.

第 4 步:把求和里不随 i 变化的量提出来。

X\mathbf{X} 始终是同一个输入样本;pjp_j 的 j 固定,也不随 i 变化。因此:

∇ΘjE=[−yj(1−pj)+pj∑i≠jyi]X. \nabla_{\boldsymbol{\Theta}_j}E =\left[-y_j(1-p_j)+p_j\sum_{i\ne j}y_i\right]\mathbf{X}.

第 5 步:使用题目给的 one-hot 标签。

one-hot 标签只有一个 1,其他全是 0,所以 ∑iyi=1\sum_i y_i=1。从全部类别中扣掉第 j 类,就得到:

∑i≠jyi=1−yj. \sum_{i\ne j}y_i=1-y_j.

代入上一式,并逐项展开:

∇ΘjE=[−yj(1−pj)+pj(1−yj)]X=[−yj+yjpj+pj−pjyj]X=(pj−yj)X=XP(y^j=1∣X)−Xyj. \begin{aligned} \nabla_{\boldsymbol{\Theta}_j}E &=[-y_j(1-p_j)+p_j(1-y_j)]\mathbf{X}\\ &=[-y_j+y_jp_j+p_j-p_jy_j]\mathbf{X}\\ &=(p_j-y_j)\mathbf{X}\\ &=\mathbf{X} P(\hat y_j=1\mid\mathbf{X})-\mathbf{X}y_j. \end{aligned}

中间的 yjpjy_jp_j 和 −pjyj-p_jy_j 是同一个数的正负两项,互相抵消,证明完成。

第 6 步:用一组数检查类别和符号有没有写反。

补充自取例子继续用 p=(1/6,1/3,1/2)p=(1/6,1/3,1/2)、X=(2,−1)T\mathbf{X}=(2,-1)^T,现在规定真实类别是第 3 类,所以 y=(0,0,1)y=(0,0,1)。三个参数向量的梯度分别为:

∇Θ1E=(1/6−0)(2,−1)T=(1/3,−1/6)T,∇Θ2E=(1/3−0)(2,−1)T=(2/3,−1/3)T,∇Θ3E=(1/2−1)(2,−1)T=(−1,1/2)T. \begin{aligned} \nabla_{\boldsymbol{\Theta}_1}E&=(1/6-0)(2,-1)^T=(1/3,-1/6)^T,\\ \nabla_{\boldsymbol{\Theta}_2}E&=(1/3-0)(2,-1)^T=(2/3,-1/3)^T,\\ \nabla_{\boldsymbol{\Theta}_3}E&=(1/2-1)(2,-1)^T=(-1,1/2)^T. \end{aligned}

也可只从真实类的损失检查第二个结果。因为真实是第 3 类,损失为 E=−ln⁡p3E=-\ln p_3。由 (b),对第二类参数有 ∇Θ2p3=−p3p2X\nabla_{\boldsymbol{\Theta}_2}p_3=-p_3p_2\mathbf{X},因此:

∇Θ2E=−1p3(−p3p2X)=p2X=(2/3,−1/3)T. \nabla_{\boldsymbol{\Theta}_2}E =-\frac{1}{p_3}(-p_3p_2\mathbf{X}) =p_2\mathbf{X}=(2/3,-1/3)^T.

它和总公式一致,说明异类路径和负号都保留正确。

**本问完成检查:**保留类别求和 → 分同类、异类 → 使用 (b) → 使用 one-hot 的和为 1 → 化简到 (pj−yj)X(p_j-y_j)\mathbf{X}。只写最终公式,或者只对同类项求导,都缺少这道证明的关键过程。

补充核验:把公式正确、数值正确和任务完成分开

本段不改题目数据或既有答案,补充独立验算的路线。Q1的每个次数可以将已求参数代回设计矩阵,检查 XT(Xθ^−Y)X^T(X\hat\theta-Y) 是否在与数据尺度相称的数值容差内接近0。截距列对应残差和,其余列对应各幂次加权残差和。只检查训练RSS小,不足以说明已经解到该次数的最小值;只检查正规方程也不能替代原题要求的图与测试比较。

尤其四次幂列的尺度远大于常数列,直接比较各梯度分量的绝对大小可能误导。可检查相对残差,例如分母加入 ∥X∥2∥Xθ^−Y∥2\lVert X\rVert_2\lVert X\hat\theta-Y\rVert_2 及防零的小量;也应使用未舍入参数重新计算。这里不规定一个适用于所有尺度的固定阈值,显示用的小数截断会使本来正确的解不再严格满足方程。

Q2的正则项只对题目指定参数生效。把候选代入原始未中心化目标的各偏导,再与中心化后方程对照,比只在最后一行重复同样的代数更独立。Q3用旧参数先计算一份完整梯度,然后一次性更新;对比更新前后损失时重新算全部概率,不能沿用旧概率。损失变化是诊断信息,单步下降并不是梯度绝对正确的证明。

Q4的Softmax概率和始终为1,因此对任一分数或参数分量求导后,各类别概率导数相加应为0。这个关系来自恒等式求导,能发现漏掉其他类别分母贡献的错误。但通过该关系也不充分:全部误写成0同样满足它,还需逐项链式法则与维度核对。多个独立检查互相补充,才比“和参考结果看起来差不多”更可靠。

做完之后,按题号检查有没有漏项

小问 应当已经能独立做到
Q1(a) 从四个数据总和解出两个系数,并画直线
Q1(b) 写出三列特征,建立三元方程,求出二次曲线
Q1(c) 写出五列特征,用线性代数工具求五个系数并画图
Q1(d) 参数固定后代入测试集,比较三个 RSS 并解释拟合情况
Q2(a) 对截距求导、解出均值关系,并证明最小性
Q2(b) 把截距代回,逐行化成输入与标签都减均值的残差
Q2(c) 对中心化损失求导,写出带 λI 的方程与解
Q3(a) 写出初始 sigmoid 和六条交叉熵之和
Q3(b) 六行概率、残差、三列贡献、三个新参数全部对得上
Q3(c) 用新参数得到六个预测,数出 TP=3、FN=1、FP=0、TN=2
Q4(a) 用商法则分别处理同类与异类
Q4(b) 接上分数对参数的导数,也就是输入列向量
Q4(c) 对全部类别求和,用 one-hot 性质完成化简

跨小问概念复习(保留此前网页的解释)

前文按原题13个小问逐步作答;以下保留此前网页按概念串讲的材料,用于第二遍复习、数值稳定性理解和独立复算。两条路线使用相同2026数据,复算记录属于此前版本。

HW01 · 2026T1 · 逐题详细解析

这是包含完整结果与推导的解析版。想先自己挑战,请先读 分级提示版,不要继续向下翻本页。两份笔记各有用途:提示版只扶你走下一步,本篇则把省略的计算与理由展开。

来源为 官方题目(本地课件),即2026–27 Term 1版本:Q1在PDF p.1–2,Q2在p.2,Q3在p.3,Q4在p.3–4。原有 完整参考答案(本地资料)保留本地,本页也提供独立阅读所需的数据与计算。这里的参考解析不代表已生成或提交正式作业。

阅读顺序建议:每题先看“要解决什么”,拿纸重算一行,再看一般式。四题的联系是:Q1学会拟合,Q2控制参数大小,Q3将输出改成二类概率,Q4把类别数扩展到多个。所有作业数字均来自当前原题,2025年的数据与学习率不能搬来替换。

Q1:从训练数据得到三个模型

1. 先把“线性”理解准确

题目给十条已知输入与标签,要求我们找一条能描述它们的函数。先不要同时算三个模型:第一步只是规定每个模型允许长什么样。一次模型只能画直线,二次模型可以有弯曲,四次模型有更多可调的弯曲方式。

这里的“线性模型”是对未知参数线性。例如二次模型 θ0+θ1x+θ2x2\theta_0+\theta_1x+\theta_2x^2 中,x2x^2 虽然是输入的平方,但拟合时输入已知,未知的每个系数仍只出现一次。它没有 θ12\theta_1^2 或 θ1θ2\theta_1\theta_2,因此能用线性最小二乘。曲线弯不弯与能否用线性代数求参数是两回事。

本题输入如下,训练与测试按原题PDF p.1表格顺序保留。左右两半是两个数据集,同一行号不表示左右两个点必须配对训练。

行 训练 x 训练 y 测试 x 测试 y
1 7.0 0.9 7.2 0.6
2 1.6 1.4 1.1 1.0
3 3.8 0.7 3.6 0.3
4 4.7 −0.3 4.8 −0.4
5 4.0 0.0 4.3 0.0
6 6.3 0.6 6.6 0.2
7 7.9 1.7 7.8 1.8
8 5.7 0.1 5.6 0.6
9 7.1 2.1 7.3 1.7
10 8.0 1.3 8.2 1.3

为了统一记法,设多项式次数为 dd,定义第 ii 行特征为 ai=(1,xi,xi2,…,xid)a_i=(1,x_i,x_i^2,\ldots,x_i^d)。首项1负责截距:乘 θ0\theta_0 时得到常数 θ0\theta_0。把十行叠起来成为设计矩阵 AA,系数按次数从低到高排成列向量 θ\theta,预测向量就是 AθA\theta。

模型 一行设计特征 A的形状 参数列的形状 预测列的形状
一次 (1,x)(1,x) 10×210\times2 2×12\times1 10×110\times1
二次 (1,x,x2)(1,x,x^2) 10×310\times3 3×13\times1 10×110\times1
四次 (1,x,x2,x3,x4)(1,x,x^2,x^3,x^4) 10×510\times5 5×15\times1 10×110\times1

拿二次模型的第一行慢算:输入7变成 (1,7,49)(1,7,49);与 (θ0,θ1,θ2)T(\theta_0,\theta_1,\theta_2)^T 相乘,正好得到 θ0+7θ1+49θ2\theta_0+7\theta_1+49\theta_2。对应真实标签仍是0.9,不要也对标签平方。第二行输入1.6变成 (1,1.6,2.56)(1,1.6,2.56),真实标签仍1.4。

你此刻只需弄清:每行是一个样本,每列是一种幂次特征,每个参数在所有样本之间共享。 不是每行学出一套新参数,也不是把测试标签加入训练矩阵。

2. 正规方程从哪里来

RSS 是 residual sum of squares,即残差平方和。对一组候选参数,先为每条样本算预测,再减真实标签,最后平方并相加:

y^i=∑j=0dθjxij,ri=y^i−yi,J(θ)=∑i=110ri2. \hat y_i=\sum_{j=0}^{d}\theta_jx_i^j,\qquad r_i=\hat y_i-y_i,\qquad J(\theta)=\sum_{i=1}^{10}r_i^2.

这里约定 xi0=1x_i^0=1;rir_i 正负都可能,平方让高估与低估不互相抵消。JJ 输出一个非负标量,参数向量是它的输入。求参数就是让这个数尽量小。

先对一个参数 θk\theta_k 求导,不急着背矩阵结果。残差中的第 kk 项是 θkxik\theta_kx_i^k,因此 ∂ri/∂θk=xik\partial r_i/\partial\theta_k=x_i^k。平方求导给 2ri2r_i,再乘内部残差对参数的导数,最后对十条相加:

∂J∂θk=∑i=1102ri∂ri∂θk=2∑i=110rixik. \frac{\partial J}{\partial\theta_k} =\sum_{i=1}^{10}2r_i\frac{\partial r_i}{\partial\theta_k} =2\sum_{i=1}^{10}r_ix_i^k.

当 k=0k=0,这是两倍残差和;当 k=1k=1,是两倍“残差乘输入”的和;当 k=2k=2,换成“残差乘输入平方”的和。它们不是三种不同规则,只是设计矩阵的不同列。

把所有参数的偏导排列成列,就是 2AT(Aθ−y)2A^T(A\theta-y)。形状上,ATA^T 是 (d+1)×10(d+1)\times10,残差是 10×110\times1,结果为 (d+1)×1(d+1)\times1,与参数数目一致。

也可以从矩阵展开核对同一结论:

J(θ)=(Aθ−y)T(Aθ−y)=θTATAθ−θTATy−yTAθ+yTy=θTATAθ−2θTATy+yTy. \begin{aligned} J(\theta)&=(A\theta-y)^T(A\theta-y)\\ &=\theta^TA^TA\theta-\theta^TA^Ty-y^TA\theta+y^Ty\\ &=\theta^TA^TA\theta-2\theta^TA^Ty+y^Ty. \end{aligned}

两个交叉项为什么能合并?它们都是标量,一个是另一个的转置,而标量转置不变。yTyy^Ty 不含未知参数,对参数求导为0;ATAA^TA 对称,二次项给两倍矩阵乘参数。因此

∇J=2ATAθ−2ATy. \nabla J=2A^TA\theta-2A^Ty.

令每个偏导为0,得到正规方程:

ATAθ^=ATy. A^TA\hat\theta=A^Ty.

“正规方程”是一个方程组,不是说已经求出了逆。如果 ATAA^TA 可逆,才可写 θ^=(ATA)−1ATy\hat\theta=(A^TA)^{-1}A^Ty。本题十个训练输入互不相同;一个非零的至多四次多项式不能在十个不同点全为零,因此这三种设计矩阵均列满秩,正规矩阵可逆。实际计算用 lstsq 通常比显式求逆更稳定,数学目标没有改变。

一次模型还可不用矩阵软件复算:先由截距方程得到 θ^0=yˉ−θ^1xˉ\hat\theta_0=\bar y-\hat\theta_1\bar x,代入斜率方程后得到

θ^1=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2,θ^0=yˉ−θ^1xˉ. \hat\theta_1=\frac{\sum_i(x_i-\bar x)(y_i-\bar y)}{\sum_i(x_i-\bar x)^2},\qquad \hat\theta_0=\bar y-\hat\theta_1\bar x.

xˉ\bar x 是十个训练输入的平均,yˉ\bar y 是十个训练标签的平均;分母衡量输入围绕均值的分散程度。本题 xˉ=5.61\bar x=5.61、yˉ=0.85\bar y=0.85,代入得 θ^1≈0.1353957622\hat\theta_1\approx0.1353957622、θ^0≈0.0904297740\hat\theta_0\approx0.0904297740。二次与四次只是增加设计矩阵列数,不需要发明另一套损失。

补充 · 正规方程是推导依据,不是唯一数值实现(通识讲解;演示数据不属于原题)。

高次幂列可能数量级相差很大,或彼此近似相关。这会让参数对微小舍入误差敏感;显式形成 ATAA^TA 再求逆还可能放大数值困难。因此纸面用正规方程解释最优条件,实际核验可直接使用最小二乘求解器,而不是要求每个程序必须真的计算逆矩阵。

检查重点有两层:一是用原始输入和尽量完整的系数代回预测,再算RSS;二是确认正规方程残差在与数据尺度相称的容差内。不要先把高次系数截成两位小数再判断它们不满足方程,幂次会放大舍入影响。两套显示精度不同的系数可能预测十分接近,所以应同时比较系数、预测与目标,而非只逐字符比较答案。

本题下文保留原数据、系数和逐点表;这一段解释怎样可靠地复查它们,不改变训练/测试划分,也不把数值容差当成可以忽略明显错误的理由。

3. 三个结果应该怎么看

训练点与三个拟合模型(本地素材,未公开)

上方图是本地配套素材;即使网页不提供图片,下面的模型与误差表也足以复核结论。画图时横轴应是按大小递增的连续输入,纵轴是模型预测;训练数据另外画成散点。不能把原表未排序的十行直接连线,当成拟合曲线。

一次模型为

y^=0.09042977+0.13539576x. \hat y=0.09042977+0.13539576x.

它只有截距与斜率,无法同时跟随中间较低、两侧较高的趋势。训练RSS为4.78161902,说明即便在用来拟合的这十点上,直线也有较大残差。

二次模型为

y^=3.05892764−1.27106148x+0.13939016x2. \hat y=3.05892764-1.27106148x+0.13939016x^2.

正的平方项允许形成谷底,训练RSS降到1.87651075。这个模型不是逐点穿过,而是让全体残差平方和最小;某些点仍会预测不好是正常的。

四次模型为

y^=−12.17690410+16.44576557x−6.37774875x2+0.95465213x3−0.04847860x4. \hat y=-12.17690410+16.44576557x-6.37774875x^2 +0.95465213x^3-0.04847860x^4.

五个参数给更多自由度,训练RSS进一步降到0.77116732。但自由度多只说明能更好适应训练数据,并没有保证新输入预测更好。把两种误差一起看:

模型 训练RSS 测试RSS
一次 4.78161902 4.12435607
二次 1.87651075 2.47683811
四次 0.77116732 5.18350180

四次式中各项可能是很大的正数与负数,最后相互抵消得到较小的预测。因此系数只保留两位就代入,会放大舍入误差;上面的系数仅供展示,下面逐点表和RSS均用未舍入解计算。

4. 用逐点预测验证泛化判断

得到参数后把它们冻结,不再用测试标签调整。对测试输入构建相同幂次特征;例如二次模型测试第1行输入7.2,应使用 (1,7.2,51.84)(1,7.2,51.84),与训练得到的同一组系数相乘。

测试行 真实 y 一次预测 二次预测 四次预测
1 0.6 1.06527926 1.13327103 1.65140686
2 1.0 0.23936511 1.82942211 −0.60397351
3 0.3 0.57785452 0.28960283 0.76993383
4 −0.4 0.74032943 0.16938189 −0.33813244
5 0.0 0.67263155 0.17068739 −0.05702999
6 0.2 0.98404180 0.74175737 1.02220921
7 1.8 1.14651672 1.62514561 1.66608441
8 0.6 0.84864604 0.31225886 −0.11089380
9 1.7 1.07881884 1.20828062 1.71215141
10 1.3 1.20067502 2.00881806 1.02086280

RSS的逐点流程可以只用第一列示范一次:一次模型第1行预测约1.06527926,真实值0.6,残差约0.46527926,平方约0.21648479。第二行预测约0.23936511,真实1,残差约−0.76063489,平方约0.57856543。继续十行相加才得到总RSS;不能把预测直接相加,也不能先加正负残差再整体平方。

四次模型第2行尤其值得停下来观察:

(−0.6039735054−1)2≈2.57273100. (-0.6039735054-1)^2\approx2.57273100.

仅这一点就贡献很大误差。测试输入1.1还小于所有训练输入,是外推;模型在未被训练点包围的区域更容易出现不稳定弯曲。这个观察支持解释误差,而不是拿“多项式一定不能外推”代替本题数据证据。

按题目给定的三种比较,一次模型有欠拟合迹象,四次有过拟合迹象,二次相对最好。关键证据是训练误差从二次到四次继续下降,但测试误差反而上升。仅说“次数高所以过拟合”没有完成论证。实际开发通常用验证集选模型、独立测试集做最后评价;本题遵照题意使用给定test set比较,不将它误称为一般无偏的模型选择流程。

下面是一段独立复算代码,只在内存里计算,不读写原作答或核验文件。需要Python与NumPy;若还要画图,后半段另需Matplotlib。increasing=True明确列顺序是1、x、平方……,否则系数顺序会反过来。

import numpy as np

x = np.array([7, 1.6, 3.8, 4.7, 4, 6.3, 7.9, 5.7, 7.1, 8])
y = np.array([.9, 1.4, .7, -.3, 0, .6, 1.7, .1, 2.1, 1.3])
xt = np.array([7.2, 1.1, 3.6, 4.8, 4.3, 6.6, 7.8, 5.6, 7.3, 8.2])
yt = np.array([.6, 1, .3, -.4, 0, .2, 1.8, .6, 1.7, 1.3])
models = {}
for degree in (1, 2, 4):
    A = np.vander(x, N=degree + 1, increasing=True)
    B = np.vander(xt, N=degree + 1, increasing=True)
    theta = np.linalg.lstsq(A, y, rcond=None)[0]
    train_prediction = A @ theta
    test_prediction = B @ theta
    train_rss = np.sum((train_prediction - y) ** 2)
    test_rss = np.sum((test_prediction - yt) ** 2)
    models[degree] = theta
    print(degree, theta, train_rss, test_rss)
    print(test_prediction)

    # Optional: sorted dense x coordinates make a model curve.
import matplotlib.pyplot as plt
xx = np.linspace(min(x.min(), xt.min()), max(x.max(), xt.max()), 300)
plt.scatter(x, y, label="train")
for degree, theta in models.items():
    curve = np.vander(xx, N=degree + 1, increasing=True) @ theta
    plt.plot(xx, curve, label=f"degree {degree}")
plt.xlabel("x")
plt.ylabel("prediction")
plt.legend()
plt.show()

小自查:这题每个数据集都有十条,若把RSS除以10,模型排名会改变吗?把四次系数粗略舍入后重新算RSS,结果还能视作同一个数值解吗?

参考答案

除以同一个正数10得到MSE,排名不变,数值与名称要同时更换。提前舍入系数会改变实际预测函数,尤其高次项相互抵消时误差明显,所以不能拿粗舍入结果要求完全复现未舍入解的RSS。

Q2:为什么中心化能消掉截距

1. 截距与斜率扮演不同角色

Q2不是要求再代Q1的十条数据,而是对一般的 MM 条、每条 pp 个特征的数据推导。题面p.2明确 λ>0\lambda>0,正则项为 λ∥Θ∥22\lambda\lVert\Theta\rVert_2^2:只惩罚斜率向量 Θ\Theta,不惩罚单独列出的截距 θ0\theta_0。这是后续结论的前提。

先用一个小例子理解截距(以下数字为补充自取,不是原题数据)。输入为1、3,标签为2、6;假设斜率暂时固定为1。不加截距时预测1、3,残差−1、−3。若把整体往上移2,预测变3、5,残差变1、−1;误差变得居中,残差和为0。这一步只是在给定斜率下找合适高度,还没说斜率1是整个问题最好的选择。

再建立原题的形状。这里 xix_i 按行向量表示第 ii 条样本,与Q4的列向量约定不同,需看清转置。

符号 形状 含义
XX M×pM\times p 原始特征表,不含截距列
xix_i、xˉ\bar x 1×p1\times p 一条特征行、所有特征行的均值
Θ\Theta p×1p\times1 斜率参数列
yy M×1M\times1 所有标签
yi,yˉ,θ0y_i,\bar y,\theta_0 标量 单个标签、标签均值、截距
1\mathbf1 M×1M\times1 全1列,给每条预测加同一截距

于是第 ii 条预测是 xiΘ+θ0x_i\Theta+\theta_0,总目标是

J(Θ,θ0)=∑i=1M(xiΘ+θ0−yi)2+λ∥Θ∥22. J(\Theta,\theta_0)=\sum_{i=1}^{M}(x_i\Theta+\theta_0-y_i)^2 +\lambda\lVert\Theta\rVert_2^2.

先固定 Θ\Theta,只对高度 θ0\theta_0 求导。每条残差对截距的导数都是1,正则项不含截距,故

∂J∂θ0=2∑i=1M(xiΘ+θ0−yi)=0. \frac{\partial J}{\partial\theta_0} =2\sum_{i=1}^{M}(x_i\Theta+\theta_0-y_i)=0.

把同类项收集,注意截距出现了 MM 次:

(∑ixi)Θ+Mθ0−∑iyi=0. \left(\sum_i x_i\right)\Theta+M\theta_0-\sum_i y_i=0.

除以正的样本数 MM,由均值定义得到 xˉΘ+θ0−yˉ=0\bar x\Theta+\theta_0-\bar y=0,所以

θ^0=yˉ−xˉΘ. \hat\theta_0=\bar y-\bar x\Theta.

因此预测均值等于真实均值,也即训练残差之和为0。小例子中 xˉ=2,yˉ=4,Θ=1\bar x=2,\bar y=4,\Theta=1,恢复出截距2,正好对应前面的整体上移。但如果 Θ\Theta 尚未优化,这仍只是固定斜率后的条件最优截距。

2. 从平方分解看全局最小

上节让导数为0,还可以用“多出来的是一个平方”解释为什么该截距确实最好。先定义中心化残差

rc,i=(xi−xˉ)Θ−(yi−yˉ), r_{c,i}=(x_i-\bar x)\Theta-(y_i-\bar y),

再把全部样本共有的偏移定义为 a=θ0+xˉΘ−yˉa=\theta_0+\bar x\Theta-\bar y。逐项展开就知道原残差等于它们相加:

rc,i+a=xiΘ−xˉΘ−yi+yˉ+θ0+xˉΘ−yˉ=xiΘ+θ0−yi. \begin{aligned} r_{c,i}+a &=x_i\Theta-\bar x\Theta-y_i+\bar y +\theta_0+\bar x\Theta-\bar y\\ &=x_i\Theta+\theta_0-y_i. \end{aligned}

中间的均值项正负抵消;这不是改变原模型,而是换一种分组方式。同样,由 ∑i(xi−xˉ)=0\sum_i(x_i-\bar x)=0 与 ∑i(yi−yˉ)=0\sum_i(y_i-\bar y)=0,可得 ∑irc,i=0\sum_i r_{c,i}=0。

现在平方、求和,每一步单独看:

∑i(rc,i+a)2=∑i(rc,i2+2arc,i+a2)=∑irc,i2+2a∑irc,i+Ma2=∑irc,i2+Ma2. \begin{aligned} \sum_i(r_{c,i}+a)^2 &=\sum_i(r_{c,i}^2+2ar_{c,i}+a^2)\\ &=\sum_i r_{c,i}^2+2a\sum_i r_{c,i}+Ma^2\\ &=\sum_i r_{c,i}^2+Ma^2. \end{aligned}

交叉项消失是因为中心化残差和为0;最后的 Ma2Ma^2 来自每条样本都有同一个 a2a^2。正则项不依赖 aa,所以把它留在中心化目标 JcJ_c 中:

J(Θ,θ0)=Jc(Θ)+M(θ0+xˉΘ−yˉ)2. J(\Theta,\theta_0)=J_c(\Theta)+M(\theta_0+\bar x\Theta-\bar y)^2.

对任意固定斜率,JcJ_c 不随截距改变,额外平方项又总非负,只有 a=0a=0 时取0。这直接证明前节截距是该斜率下的全局最低高度,而不仅是一个驻点。

小例子中心化输入为−1、1,中心化标签为−2、2,斜率仍1,所以中心化残差为1、−1,平方和为2。如果截距偏离最佳值2达 aa,总RSS变成 2+2a22+2a^2。例如截距0即 a=−2a=-2,RSS是10;截距2时RSS是2,数字和前节一致。

3. 中心化不等于标准化

中心化就是每列减掉自己的均值,不除标准差,因此不改变单位。XX 若以厘米记长度,中心化后仍以厘米记“比平均长多少”;标准化再除标准差才是另一种变换。

矩阵写法为

Xc=X−1xˉ,yc=y−yˉ1. X_c=X-\mathbf1\bar x,\qquad y_c=y-\bar y\mathbf1.

1xˉ\mathbf1\bar x 是 (M×1)(1×p)=M×p(M\times1)(1\times p)=M\times p,把每个特征均值复制到每一行,才能与 XX 相减。ycy_c 仍是 M×1M\times1。代入最佳截距后:

XΘ+θ^01−y=XΘ+(yˉ−xˉΘ)1−y=(X−1xˉ)Θ−(y−yˉ1)=XcΘ−yc. \begin{aligned} X\Theta+\hat\theta_0\mathbf1-y &=X\Theta+(\bar y-\bar x\Theta)\mathbf1-y\\ &=(X-\mathbf1\bar x)\Theta-(y-\bar y\mathbf1)\\ &=X_c\Theta-y_c. \end{aligned}

因此原题(b)的中心化目标就是

Jc(Θ)=∥XcΘ−yc∥22+λ∥Θ∥22. J_c(\Theta)=\lVert X_c\Theta-y_c\rVert_2^2 +\lambda\lVert\Theta\rVert_2^2.

接下来对斜率求导。数据拟合项仍按Q1“残差乘设计列”的规则给 2XcT(XcΘ−yc)2X_c^T(X_c\Theta-y_c);惩罚是 λ∑jΘj2\lambda\sum_j\Theta_j^2,逐个参数求导给 2λΘj2\lambda\Theta_j。排列成向量:

∇Jc=2XcTXcΘ−2XcTyc+2λΘ. \nabla J_c=2X_c^TX_c\Theta-2X_c^Ty_c+2\lambda\Theta.

除以2并令为0,把 λΘ\lambda\Theta 写成 λIpΘ\lambda I_p\Theta,才能和另一矩阵项合并:

(XcTXc+λIp)Θ=XcTyc. (X_c^TX_c+\lambda I_p)\Theta=X_c^Ty_c.

IpI_p 是 p×pp\times p 单位矩阵,右边是 p×1p\times1。在下一节证明可逆之后,答案为

Θ^=(XcTXc+λIp)−1XcTyc,θ^0=yˉ−xˉΘ^. \hat\Theta=(X_c^TX_c+\lambda I_p)^{-1}X_c^Ty_c, \qquad \hat\theta_0=\bar y-\bar x\hat\Theta.

顺序因此很明确:先减均值,再求斜率,最后加回截距。若只给出 Θ^\hat\Theta,还没有完整恢复原坐标里的预测函数。

4. 为什么加上 λI 后一定能求逆

本题明确假设 λ>0\lambda>0。若两列特征重复,数据可能无法分辨某些参数变化方向,XcTXcX_c^TX_c 可能不可逆;正则项为每个非零参数方向增加代价。

取任意非零 p×1p\times1 向量 vv,检查正规矩阵在该方向的二次型:

vT(XcTXc+λIp)v=vTXcTXcv+λvTv=∥Xcv∥22+λ∥v∥22>0. \begin{aligned} v^T(X_c^TX_c+\lambda I_p)v &=v^TX_c^TX_cv+\lambda v^Tv\\ &=\lVert X_cv\rVert_2^2+\lambda\lVert v\rVert_2^2\\ &>0. \end{aligned}

第一项是平方和,至少为0;第二项因 v≠0v\ne0 且 λ>0\lambda>0 严格为正。因此矩阵正定,没有非零的零空间向量,故可逆。目标Hessian为 2(XcTXc+λIp)2(X_c^TX_c+\lambda I_p),也正定,所以中心化斜率有唯一最优解,再通过均值关系得到唯一截距。

若 λ=0\lambda=0,第二项消失,要另查 XcX_c 是否列满秩,不能沿用“无条件可逆”。负的 λ\lambda 不在题目范围内,也不能用上述正定性证明。

小自查:如果把残差项改成MSE,但正则项仍用相同数值的 λ\lambda,公式中还是 λIp\lambda I_p 吗?

参考答案

不是。若目标为 M−1∥XcΘ−yc∥2+λ∥Θ∥2M^{-1}\lVert X_c\Theta-y_c\rVert^2+\lambda\lVert\Theta\rVert^2,求导后乘 M/2M/2,得到 XcTXc+MλIpX_c^TX_c+M\lambda I_p。这改变了数据拟合与惩罚的相对比例,不是只改显示单位。若把整个目标同时除以M,最优解才保持不变。

同时检查:单位矩阵维数是特征数 pp,不是样本数 MM;截距没有混进罚项;证明条件是题面正的 λ\lambda;中心化与标准化不能混称。

Q3:一步梯度下降究竟做了什么

1. 先区分分数、概率和类别

这题不再预测一个连续标签,而是预测0或1。模型先产生分数,再转换成概率,最后才决定类别。如果把三件事都叫“输出”,求损失时很容易用错对象。

z=θ0+θ1x1+θ2x2,p=σ(z)=11+e−z. z=\theta_0+\theta_1x_1+\theta_2x_2,\qquad p=\sigma(z)=\frac{1}{1+e^{-z}}.

zz 是任意实数,pp 是有限分数下严格介于0和1之间的正类概率;最后按 p≥0.5p\ge0.5 判1、否则判0。训练计算交叉熵时需要连续的 pp,不能先把它四舍五入变成类别。

本题PDF p.3的完整数据如下。表的前三列属于训练,后三列属于测试,训练时只用左半边。

行 训练x1 训练x2 训练y 测试x1 测试x2 测试y
1 0.15 0.35 0 0.28 0.82 1
2 0.30 0.45 0 0.45 0.75 1
3 0.55 0.25 0 0.58 0.62 1
4 0.30 0.80 1 0.72 0.48 1
5 0.55 0.60 1 0.22 0.40 0
6 0.70 0.50 1 0.50 0.26 0

2026题目给定初始参数 (−1,1.5,0.5)(-1,1.5,0.5),学习率0.1。先在一张纸上写下这四个数;不要用旧题的第三参数1.5或学习率0.3。

为方便同时处理截距,给每条输入补常数1:x~i=(1,xi1,xi2)T\tilde x_i=(1,x_{i1},x_{i2})^T,是 3×13\times1 列;参数 θ=(θ0,θ1,θ2)T\theta=(\theta_0,\theta_1,\theta_2)^T 也是 3×13\times1;点积 zi=x~iTθz_i=\tilde x_i^T\theta 是一个标量。所有六条数据共用这同一组参数。

拿第1行演算:

z1=−1+1.5(0.15)+0.5(0.35)=−0.6,p1=11+e0.6≈0.3543436938. \begin{aligned} z_1&=-1+1.5(0.15)+0.5(0.35)=-0.6,\\ p_1&=\frac{1}{1+e^{0.6}}\approx0.3543436938. \end{aligned}

注意指数是 −z1=+0.6-z_1=+0.6。真实标签0,所以正确类别概率是 1−p11-p_1,该行损失为 −ln⁡(1−p1)-\ln(1-p_1)。第4行的标签是1,就用 −ln⁡p4-\ln p_4。这不是两个损失规则,只是由标签选择同一个式子的哪项保留。

对应(a),一般模型概率就是上面的sigmoid,初始模型为 σ(−1+1.5x1+0.5x2)\sigma(-1+1.5x_1+0.5x_2)。全体训练的求和交叉熵写成

E(θ)=−∑i=16[yiln⁡pi+(1−yi)ln⁡(1−pi)]. E(\theta)=-\sum_{i=1}^{6}\left[y_i\ln p_i+(1-y_i)\ln(1-p_i)\right].

标签为1时第二项系数为0,标签为0时第一项系数为0。不要把真实为0的数据删掉,它们通过第二项参与训练。

2. 为什么梯度恰好是“预测减真实”

先对一条样本求导,再对六条相加,这样每个负号的来源都能看清。单样本损失为

ℓ=−yln⁡p−(1−y)ln⁡(1−p). \ell=-y\ln p-(1-y)\ln(1-p).

训练时特征与标签固定,参数变化依次影响分数、概率、损失。链式法则沿这个顺序串三个变化率:损失对概率、概率对分数、分数对参数。

第一段,对 pp 求导:

∂ℓ∂p=−yp+1−y1−p. \frac{\partial\ell}{\partial p}=-\frac{y}{p}+\frac{1-y}{1-p}.

第一项只是对数导数 1/p1/p 乘常数 −y-y。第二项前面原有负号,而 ln⁡(1−p)\ln(1-p) 求导再带一个−1,负负得正,所以不能把两项都写成负号。

第二段,对sigmoid求导。先把倒数写为负一次幂,再应用链式法则:

∂p∂z=ddz(1+e−z)−1=−(1+e−z)−2(−e−z)=e−z(1+e−z)2=11+e−ze−z1+e−z=p(1−p). \begin{aligned} \frac{\partial p}{\partial z} &=\frac{d}{dz}(1+e^{-z})^{-1}\\ &=-(1+e^{-z})^{-2}(-e^{-z})\\ &=\frac{e^{-z}}{(1+e^{-z})^2}\\ &=\frac{1}{1+e^{-z}}\frac{e^{-z}}{1+e^{-z}} =p(1-p). \end{aligned}

最后一步用 1−p=e−z/(1+e−z)1-p=e^{-z}/(1+e^{-z})。这不是凭空记一个导数,两个因子正好分别是正类概率与负类概率。

第三段,z=θ0+θ1x1+θ2x2z=\theta_0+\theta_1x_1+\theta_2x_2 对三个参数的导数依次为1、x1x_1、x2x_2,所以 ∇θz=(1,x1,x2)T\nabla_\theta z=(1,x_1,x_2)^T。

前两段先合并:

∂ℓ∂z=(−yp+1−y1−p)p(1−p)=−y(1−p)+(1−y)p=−y+yp+p−yp=p−y. \begin{aligned} \frac{\partial\ell}{\partial z} &=\left(-\frac{y}{p}+\frac{1-y}{1-p}\right)p(1-p)\\ &=-y(1-p)+(1-y)p\\ &=-y+yp+p-yp\\ &=p-y. \end{aligned}

接上第三段:

∇θℓ=(p−y)(1,x1,x2)T. \nabla_\theta\ell=(p-y)(1,x_1,x_2)^T.

这里 p−yp-y 是标量,但梯度是三个数的列向量。预测减真实只是到分数的梯度,求参数梯度还必须乘各自的输入特征。 sigmoid导数已在化简过程中使用,最终式外再乘一遍 p(1−p)p(1-p) 会重复计算。

直觉上,第1行标签0而概率约0.3543,残差为正;负梯度会试图降低其分数。第4行标签1但概率小于1,残差为负;负梯度会试图提高其分数。全批量时这些贡献相加,模型要同时兼顾六条,不是逐行独立选参数。

3. 逐行累加三个梯度

先冻结题目给的旧参数,为每行算分数、概率、残差。不要算到第2行时已经修改了第1行用过的参数。

训练行 旧分数z 旧概率p 真实y 概率残差p−y
1 −0.600 0.3543436938 0 0.3543436938
2 −0.325 0.4194576952 0 0.4194576952
3 −0.050 0.4875026035 0 0.4875026035
4 −0.150 0.4625701547 1 −0.5374298453
5 0.125 0.5312093734 1 −0.4687906266
6 0.300 0.5744425168 1 −0.4255574832

这也保留了原先的六行残差向量,顺序不可重排后却仍拿原特征逐项相乘:

(0.3543436938,0.4194576952,0.4875026035,−0.5374298453,−0.4687906266,−0.4255574832). (0.3543436938,0.4194576952,0.4875026035, -0.5374298453,-0.4687906266,-0.4255574832).

每条对截距的贡献是残差乘1,对第一权重的贡献是残差乘 x1x_1,对第二权重的贡献是残差乘 x2x_2。把“乘完再加”的过程列开:

训练行 截距贡献 第一权重贡献 第二权重贡献
1 0.3543436938 0.0531515541 0.1240202928
2 0.4194576952 0.1258373086 0.1887559628
3 0.4875026035 0.2681264319 0.1218756509
4 −0.5374298453 −0.1612289536 −0.4299438763
5 −0.4687906266 −0.2578348446 −0.2812743760
6 −0.4255574832 −0.2978902382 −0.2127787416
总和 −0.1704739627 −0.2698387419 −0.4893450873

因此截距梯度 g0=−0.1704739627g_0=-0.1704739627。第一权重原始展开如下,能用来核对表中每个乘法:

g1=0.15(0.3543436938)+0.30(0.4194576952)+0.55(0.4875026035)+0.30(−0.5374298453)+0.55(−0.4687906266)+0.70(−0.4255574832)=−0.2698387419. \begin{aligned} g_1={}&0.15(0.3543436938)+0.30(0.4194576952)+0.55(0.4875026035)\\ &+0.30(-0.5374298453)+0.55(-0.4687906266)+0.70(-0.4255574832)\\ ={}&-0.2698387419. \end{aligned}

第二权重同理:

g2=0.35(0.3543436938)+0.45(0.4194576952)+0.25(0.4875026035)+0.80(−0.5374298453)+0.60(−0.4687906266)+0.50(−0.4255574832)=−0.4893450873. \begin{aligned} g_2={}&0.35(0.3543436938)+0.45(0.4194576952)+0.25(0.4875026035)\\ &+0.80(-0.5374298453)+0.60(-0.4687906266)+0.50(-0.4255574832)\\ ={}&-0.4893450873. \end{aligned}

三个负梯度意味着此次更新会让三个参数都增大。截距仍是负数,但从−1变为约−0.983,也是“增大”,不要将负数和减小混淆。

θ0′=−1−0.1g0=−0.9829526037,θ1′=1.5−0.1g1=1.5269838742,θ2′=0.5−0.1g2=0.5489345087. \begin{aligned} \theta_0'&=-1-0.1g_0=-0.9829526037,\\ \theta_1'&=1.5-0.1g_1=1.5269838742,\\ \theta_2'&=0.5-0.1g_2=0.5489345087. \end{aligned}

更新后的完整概率模型为

P(y^=1∣x1,x2)=σ(−0.9829526037+1.5269838742x1+0.5489345087x2). P(\hat y=1\mid x_1,x_2) =\sigma(-0.9829526037+1.5269838742x_1+0.5489345087x_2).

这里的“一次iteration”按课程求和交叉熵的全批量更新解释:六行形成一份梯度,再一起改三个参数。先改截距再拿新截距计算另两个梯度,是混用两套模型;每读一条数据就更新一次则是另一种更新方式,都不是上面的同一次向量更新。

复算当前求和训练损失,旧值约3.6076515301,新值约3.5756262189,确实下降。这是对本次数值与符号的检查,不表示任意学习率都会下降,也不表示测试集一定改善。

4. sum 与 mean 为什么会改变数值

课程L03把交叉熵写成六条之和,因此主结果也采用 E=∑iℓiE=\sum_i\ell_i。一些程序库默认取平均,即 Emean=E/6E_{\mathrm{mean}}=E/6。求导是线性的,所以平均损失的每个梯度也除6。

若学习率仍为0.1,平均损失的一步为

(−0.9971587673,1.5044973124,0.5081557515). (-0.9971587673,1.5044973124,0.5081557515).

这组参数比主答案移动得更少。两个目标只是乘一个正数,最低点位置相同,却不能推出有限一步的更新相同。更新还依赖梯度大小和学习率。

要抵消这六分之一,把平均损失的学习率设为0.6:0.6(g/6)=0.1g0.6(g/6)=0.1g,才能复现求和损失0.1的同一步。说明你采用哪种损失定义,是让后面的参数和概率可核对的必要条件,不是写作格式的装饰。

5. 如何把概率变成评价指标

现在固定新参数,把六条测试输入依次代入。测试标签只用于最后比较,不再参与参数更新。第1行的分数慢算为

z=−0.9829526037+1.5269838742(0.28)+0.5489345087(0.82)=−0.1052708218. \begin{aligned} z&=-0.9829526037+1.5269838742(0.28)+0.5489345087(0.82)\\ &=-0.1052708218. \end{aligned}

sigmoid给 p=0.4737065719<0.5p=0.4737065719<0.5,预测0,真实标签1,所以这一行是漏报FN:本来有正类,模型却没找到。

本文直接列完整测试结果,不必跳到本地参考答案才能继续读。

测试行 x1 x2 真实y 新分数z 新概率p 预测类别 归类
1 0.28 0.82 1 −0.1052708218 0.4737065719 0 FN
2 0.45 0.75 1 0.1158910212 0.5289403717 1 TP
3 0.58 0.62 1 0.2430374387 0.5604620420 1 TP
4 0.72 0.48 1 0.3799643499 0.5938645045 1 TP
5 0.22 0.40 0 −0.4274423479 0.3947372404 0 TN
6 0.50 0.26 0 −0.0767376944 0.4808249851 0 TN

预测依次为 (0,1,1,1,0,0)(0,1,1,1,0,0),真实标签为 (1,1,1,1,0,0)(1,1,1,1,0,0)。正类是1,先用真实/预测两个条件给每条归格,再数格子:

真实类别 / 预测类别 预测 1 预测 0
真实 1 TP = 3 FN = 1
真实 0 FP = 0 TN = 2

四格相加为6,与样本数一致。接着,每个指标问一个不同问题:

  • Accuracy问“全部六条里正确几条”:(TP+TN)/6=5/6≈83.33%(TP+TN)/6=5/6\approx83.33\%。
  • Precision问“模型报出的三个正类里,真正正类几条”:TP/(TP+FP)=3/3=1TP/(TP+FP)=3/3=1。
  • Recall问“真实存在的四个正类里,找到几条”:TP/(TP+FN)=3/4=0.75TP/(TP+FN)=3/4=0.75。

因此precision是100%,仍有一个漏掉的正类。它只检查报出来的正类有没有误报,没有衡量漏掉了多少;recall正好补上这一面。不是任何一个指标等于100%就说明模型完美。

小自查:假设你错把第1行叫FP,precision与recall会发生什么问题?

参考答案

第1行真实1、预测0,只能是FN。误记成FP会把两个分母换错:本题实际报正3条、真实正4条,必须对应precision分母3和recall分母4。先数这两个集合,比机械记英文缩写更可靠。

最后核对:用的是更新后的模型,正类编码1,指数为 −z-z,学习率是2026的0.1;这些条件都比最后显示几位小数更重要。

Q4:从二分类推广到多分类

1. Softmax 的分母把所有类别连在一起

二分类时,一个正类概率决定另一个概率;多分类时需要同时给 KK 个互斥类别分配概率,并让总和为1。它不是让每一类各自独立跑一个sigmoid,否则多个输出的总和未必为1。

先用三类做补充自取示例。令三个分数为 z=(0,ln⁡2,ln⁡3)Tz=(0,\ln2,\ln3)^T,取指数后是 (1,2,3)T(1,2,3)^T;合计6,分别除以6得到

p=(1/6,2/6,3/6)T=(1/6,1/3,1/2)T. p=(1/6,2/6,3/6)^T=(1/6,1/3,1/2)^T.

三个概率总和1,第3类最有可能。若只把第2类分数增加 ln⁡2\ln2,它的指数从2变4,另外两类指数不变;新总和变8,所以新概率为 (1/8,4/8,3/8)(1/8,4/8,3/8)。第1类和第3类的分数没改,概率却都变小了:共同分母让类别彼此竞争。

现在回到原题符号。输入 X∈RnX\in\mathbb R^n 是一个样本的 n×1n\times1 特征列向量;类别 ii 有自己的参数列 Θi∈Rn\Theta_i\in\mathbb R^n;分数 zi=XTΘiz_i=X^T\Theta_i 是标量。共有 KK 个参数列,不是 KK 条训练样本。令

S=∑k=1Kezk,pi=eziS. S=\sum_{k=1}^{K}e^{z_k},\qquad p_i=\frac{e^{z_i}}{S}.

指数保证各项为正,除以全部指数之和保证 ∑ipi=1\sum_i p_i=1。pp 作为整体是 K×1K\times1 概率列,和输入的 nn 维不是同一回事。

本题标签是one-hot:正确类别位置为1,其余为0。例如原题五类中真实第3类,标签为 (0,0,1,0,0)T(0,0,1,0,0)^T。这个向量不是概率预测,而是已知答案的编码,后面会用到其分量之和为1。

2. Q4(a):为什么要分 j=i 与 j≠i

先说清求导对象:ii 表示“观察哪一个输出概率”,jj 表示“改变哪一个类别分数”。因为每个概率的分母都含每个分数,改变 zjz_j 一定会影响分母;只有当 j=ij=i 时,还同时影响分子。

对自己的分数,即 j=ij=i,商法则为“分母乘分子导数,减分子乘分母导数,再除分母平方”。这里分子 ezie^{z_i} 的导数是 ezie^{z_i},分母的导数也只是求和中的第 ii 项 ezie^{z_i},其余项对 ziz_i 都是常数:

∂pi∂zi=Sezi−ezieziS2=eziS−ezieziS2=pi−pi2=pi(1−pi). \begin{aligned} \frac{\partial p_i}{\partial z_i} &=\frac{S e^{z_i}-e^{z_i}e^{z_i}}{S^2}\\ &=\frac{e^{z_i}}{S}-\frac{e^{z_i}e^{z_i}}{S^2}\\ &=p_i-p_i^2=p_i(1-p_i). \end{aligned}

当 j≠ij\ne i,分子导数为0,分母导数是 ezje^{z_j},所以

∂pi∂zj=S⋅0−eziezjS2=−eziSezjS=−pipj. \begin{aligned} \frac{\partial p_i}{\partial z_j} &=\frac{S\cdot0-e^{z_i}e^{z_j}}{S^2}\\ &=-\frac{e^{z_i}}{S}\frac{e^{z_j}}{S}\\ &=-p_ip_j. \end{aligned}

也可以把分母写成负一次幂,保留原来的另一条推导路线:

ezi∂S−1∂zj=−eziS−2ezj=−pipj(j≠i). e^{z_i}\frac{\partial S^{-1}}{\partial z_j} =-e^{z_i}S^{-2}e^{z_j}=-p_ip_j\quad(j\ne i).

负号来自倒数求导。它与上一节竞争直觉一致:提高自己的分数,自己概率增加;提高竞争者分数,自己概率减少。

定义 Kronecker delta δij\delta_{ij}:同下标为1,不同为0。这只是一个方便合并两种情况的记号,不是这里的梯度本身。两式合成

∂pi∂zj=pi(δij−pj). \frac{\partial p_i}{\partial z_j}=p_i(\delta_{ij}-p_j).

把所有 i,ji,j 排起来得到Jacobian,行对应被观察的概率,列对应改变的分数,形状为 K×KK\times K:

J=diag⁡(p)−ppT. J=\operatorname{diag}(p)-pp^T.

diag⁡(p)\operatorname{diag}(p) 将各概率放在对角线上;ppTpp^T 是外积,第 i,ji,j 格为 pipjp_ip_j。因此对角格为 pi−pi2p_i-p_i^2,非对角格为 −pipj-p_ip_j,与上面一致。

用三类补充例 p=(1/6,1/3,1/2)Tp=(1/6,1/3,1/2)^T,改变第2类分数,对三种概率的导数分别是 −1/18,2/9,−1/6-1/18,2/9,-1/6。相加为0,说明第2类得到的概率增加,被另外两类减少的总量抵消。这是局部变化率的自检,不是说任意大幅改分数都能直接用导数作精确概率增量。

3. Q4(b):标量导数变成向量梯度

(a)得到的是“一个概率对一个标量分数”的导数;(b)要对第 jj 类整个权重列求导,答案应是一列 nn 个数。先展开分数:

zj=XTΘj=∑r=1nXrΘjr. z_j=X^T\Theta_j=\sum_{r=1}^{n}X_r\Theta_{jr}.

Θjr\Theta_{jr} 表示第 jj 类参数中的第 rr 个特征权重。数据 XrX_r 固定,对该参数分量求导得到 XrX_r;把全部分量排成列,便是 ∇Θjzj=X\nabla_{\Theta_j}z_j=X。

不同类别参数列互相独立,改变 Θj\Theta_j 直接改变的分数只有 zjz_j,所以再接上这一段链式法则:

∇Θjpi=∂pi∂zj∇Θjzj=pi(δij−pj)X. \begin{aligned} \nabla_{\Theta_j}p_i &=\frac{\partial p_i}{\partial z_j}\nabla_{\Theta_j}z_j\\ &=p_i(\delta_{ij}-p_j)X. \end{aligned}

前面是一个标量,后面是 n×1n\times1 列,结果与待求导的 Θj\Theta_j 形状相同。若最后只剩 −pipj-p_ip_j,说明你停在(a),没有把分数怎样依赖参数这段接上。

补充自取形状验算:输入取 X=(2,−1)TX=(2,-1)^T,仍用上节三类概率。第1概率对第2类权重的梯度为 (−1/18)X=(−1/9,1/18)T(-1/18)X=(-1/9,1/18)^T。两个分量符号不同不是矛盾:增加第一个权重会提高该类分数,而增加第二个权重因输入−1会降低分数,故对竞争概率的影响相反。

4. Q4(c):不能漏掉其他类别的链式法则项

损失是一个标量:

E=−∑i=1Kyiln⁡pi. E=-\sum_{i=1}^{K}y_i\ln p_i.

每一项是“真实标签权重乘该类别概率的负对数”。one-hot最终只保留真实类的一项,但求导时不能误认为只有 pjp_j 才受 Θj\Theta_j 影响;所有 pip_i 都通过共同分母依赖 Θj\Theta_j。

先对每一项使用链式法则,再加起来:

∇ΘjE=−∑i=1Kyipi∇Θjpi=−∑i=1Kyipi pi(δij−pj)X=−∑i=1Kyi(δij−pj)X. \begin{aligned} \nabla_{\Theta_j}E &=-\sum_{i=1}^{K}\frac{y_i}{p_i}\nabla_{\Theta_j}p_i\\ &=-\sum_{i=1}^{K}\frac{y_i}{p_i}\,p_i(\delta_{ij}-p_j)X\\ &=-\sum_{i=1}^{K}y_i(\delta_{ij}-p_j)X. \end{aligned}

第一行用 dln⁡pi/dpi=1/pid\ln p_i/dp_i=1/p_i,标签是固定常数;第二行代入(b);第三行约去 pip_i,softmax有限分数下概率为正,因此这一步有依据。

接着拆成两项。XX 与 pjp_j 对求和索引 ii 不变,可提到求和号外:

−X∑iyiδij+Xpj∑iyi. -X\sum_i y_i\delta_{ij}+Xp_j\sum_i y_i.

第一个求和中的delta只留下 i=ji=j,所以为 yjy_j;第二个求和是全部one-hot标签之和,等于1。因此

∇ΘjE=−Xyj+Xpj=X(pj−yj). \nabla_{\Theta_j}E=-Xy_j+Xp_j=X(p_j-y_j).

这就是题目要证的式子。题面hint省略了完整求和符号,实际推导须恢复,不能只对 i=ji=j 那一项求导就说已经处理总损失。

用三类小例作检查:若真实为第3类,则第2类标签 y2=0y_2=0。即使损失中 y2ln⁡p2y_2\ln p_2 系数为0,梯度对 Θ2\Theta_2 仍是 Xp2=X/3Xp_2=X/3,并不为0,因为提高第2类分数会挤压真正类别的概率。这个例子能直接发现“只看第j项”的漏项错误。

5. 换一种写法再次验证

将真实类别记为 cc。one-hot让损失剩下 E=−ln⁡pcE=-\ln p_c,代入softmax:

E=−ln⁡(ezc∑kezk)=−ln⁡ezc+ln⁡(∑kezk)=−zc+ln⁡(∑kezk). \begin{aligned} E&=-\ln\left(\frac{e^{z_c}}{\sum_ke^{z_k}}\right)\\ &=-\ln e^{z_c}+\ln\left(\sum_ke^{z_k}\right)\\ &=-z_c+\ln\left(\sum_ke^{z_k}\right). \end{aligned}

第二行使用商的对数等于对数之差,并处理了外面的负号;第三行用 ln⁡ezc=zc\ln e^{z_c}=z_c。现在对分数 zjz_j 求导:

  • 若 j=cj=c,第一项导数是−1;否则为0,统一写成 −δcj=−yj-\delta_{cj}=-y_j。
  • 第二项先对外层对数求导为 1/S1/S,再乘内部求和对 zjz_j 的导数 ezje^{z_j},结果是 pjp_j。

所以 ∂E/∂zj=pj−yj\partial E/\partial z_j=p_j-y_j,再乘 ∇Θjzj=X\nabla_{\Theta_j}z_j=X,仍得 X(pj−yj)X(p_j-y_j)。两条推导路线一条追踪所有概率,一条直接展开真实类负对数,结果一致,但都保留了共同分母的影响。

真实类的 pc−1<0p_c-1<0,负梯度更新会沿 XX 方向增大该类参数;其他类 pj>0p_j>0,则沿反方向更新。在单样本、独立各类参数的情形,点积还会让真实类分数上升、其他类分数下降(输入为零时不动)。批量训练还要加上其他样本贡献,不能保证每条样本同时变好。

这与Q3的“概率残差乘输入”很像,但不要混淆模型:Q3是二类sigmoid,这题是共同归一化的softmax;简洁梯度来自它们分别与交叉熵的配对。

小自查:固定第 jj 个分数,将所有概率对它的导数相加,为什么应为0?这与把所有类别参数梯度加起来是否为0有何关系?

参考答案

因为 ∑ipi=1\sum_i p_i=1 是恒等式,对任何分数求导都为0;公式也给 ∑ipi(δij−pj)=pj−pj∑ipi=0\sum_i p_i(\delta_{ij}-p_j)=p_j-p_j\sum_i p_i=0。对本题单样本交叉熵,全部类别梯度之和为 X∑j(pj−yj)=X(1−1)=0X\sum_j(p_j-y_j)=X(1-1)=0。前者对输出概率求和,后者对类别参数梯度求和,对象不同,但都依赖正确的归一化。

最后核对索引:ii 是当前概率类别,jj 是正在求导的类别参数,kk 是分母求和的哑下标,rr 是特征分量。输入维数为 nn,类别数为 KK,本题此处只处理一个样本,不能额外乘样本数。

复习路线与核验

Q1、Q2对应 L02 最小二乘 和 L02 收缩方法;若不懂可逆条件,再读 L02 矩阵与投影 的相关段落。Q3先回 L03 逻辑回归模型辨认分数与概率,再看 L03 交叉熵与梯度下降。这些课程笔记的历史作业附录可能使用2025数据,本题只使用当前2026原表。

此前版本的数据逐项对照当前原题PDF p.1与p.3表格;Q2的正则条件对照p.2;Q4的两种导数与one-hot设定对照p.3–4。原题并未说明x、y的现实物理单位,本篇没有擅自补出单位或应用背景。三类softmax和两样本中心化例明确为教学补充。

此前发布版本的独立数值复算记录:Q1三个最小二乘解及逐点测试预测与本文表格一致;Q3解析梯度的中心有限差分最大误差约 1.9×10−111.9\times10^{-11}(步长 10−510^{-5}),更新将求和训练损失从约3.6076515301降为3.5756262189;三类补充例的softmax Jacobian差分最大误差约 4.1×10−124.1\times10^{-12}。有限差分是数值自检,不代替上文的代数证明。

既有 核验记录(本地资料) 与 核验脚本(本地资料) 是本地历史配套资料,本次没有运行或改写它们,也没有修改题目PDF、参考答案和正式作答。网页无法打开本地材料时,正文完整数据、公式与Q1独立脚本仍可用于复算。

来源与证据

  • 题面、数据、分值与小问顺序:HW01-2026T1-题目.pdf(本地课件),Q1 p.1–2、Q2 p.2、Q3 p.2–3、Q4 p.3–4;均为 PDF 页号。
  • Q1、Q3 图片数据表已逐格视觉核对;Q1(c) 提示矩阵的末行幂次已与 p.2 渲染图复核,按题目模型的三次项、四次项建立特征。
  • Q3 求和交叉熵的定义:L03-Logistic-Regression-2026T1.pdf(本地课件),PDF p.35–36。
  • 计算、证明与自取验算例为本解析展开;自取数字均就地标明。题目演练不新增讲义课程索引条目。
  • 本次没有以同学答案或既有参考答案作为正确性依据。
  • 考试证据:读了 HW01-2026T1-题目.pdf;未识别用途的 PDF:无