CSCI3230 T02 · Part 2/2 Play with gradient descent in Python
课程:CSCI3230 (ESTR3108) Fundamentals of Artificial Intelligence · 2025T1 本讲:T02,第 2 部分 / 共 2 部分 · 原件 T02-Gradient-Descent-2025T1.pdf(本地课件) p.11–11 定位:原讲义此页只有第二部分标题,实际代码按独立原件阅读。 前后:上一份 Gradient Descent
这是一页很短的过渡材料,不能从标题页推断它没有写出的Python实现。它的教学作用是把上一份手算递推接到程序:程序应当实现我们已经能手算的过程,而不是用输出替代理解。
从标量参数进入分类参数(p.11)
p.11 只写第二部分标题“Play with gradient descent in Python”,没有给完整算法代码。下面为学习路线补充;具体示例见独立的 T02Code-梯度下降代码。该代码PDF文件名保留“未核”,不据此推断其发布学期、提交要求或运行环境。
原页没有隐藏的题目、参数表或作业要求;它的全部文字就是第二部分名称。本篇下面的学习桥接与独立代码材料已明确区分,因此不用再打开这一标题页寻找缺失实现。
第一步先跑通脑中的“一元版本”。目标 输入一个数,输出一个非负数;梯度 也输出一个数。给初值10、学习率0.4,一次更新得到2,下一次0.4,再下一次0.08。这些数字来自前面Lecture的演示条件,能作为理解程序的手工基线。
程序需要保存当前参数、计算当前位置的梯度、生成新参数、记录迭代次数、检查停止条件。变量名 x 或 theta 不改变数学意义,关键看传入的是样本特征还是优化参数。代码里都叫 x 很常见,但你读的时候应在纸上标出角色。
补充·再扩大到两个参数(自取例子):假设目标 ,参数是长度2的向量,梯度是 。从 以0.1更新,得到 。规则没换,只是每个坐标有自己的偏导,并且必须同步更新。输入由一个数变成一列数,目标输出仍然是一个损失数。
最后进入逻辑回归:参数也是向量,但目标不再直接平方参数,而是先利用固定训练数据算出概率,再利用标签算交叉熵。这里有两个不同输入层次:训练数据对整个优化过程固定;参数在循环内每轮改变。可以将数据固定在目标函数中,使优化器看到的接口仍是“给参数,返回损失”和“给参数,返回同形状梯度”。
| 层次 | 一元平方示例 | 逻辑回归 |
|---|---|---|
| 每轮变化 | 一个参数 | 一列权重,可能含截距 |
| 每轮固定 | 函数定义 | 特征、标签、损失定义 |
| 目标输出 | 一个平方值 | 一个总交叉熵值 |
| 梯度输出 | 一个数 | 与参数同形状的向量 |
在看代码前的三个检查:能否不用运行就写出第一次更新?目标输出是否只有一个数?梯度能否和参数逐项相减?若第三项形状对不上,应先查矩阵维数,不能靠NumPy“没报错”判断正确,因为广播可能悄悄生成更大的数组。
小检查:六条样本、每条两个特征,是否意味着需要六个权重?
参考答案
不意味着。权重数由特征数和是否含截距决定,样本数决定要累加多少条训练贡献。两个原始特征无截距有两个权重;另加截距则有三个参数。六条数据共用这同一组参数。
补充 · 每个变量活多久,决定日志有没有说真话(通识讲解;演示数据不属于原题)。
一轮开始时,旧参数与旧损失描述同一状态;更新后,新参数必须重新前向才能得到新损失。如果日志打印“新参数、旧损失”,读者就会误以为两者对应。保存轨迹时还要区分复制数值与保存同一个可变对象的引用:若列表里每格都指向同一数组,之后原地更新它,历史记录可能一起变成最后一轮。
在进入复杂分类前,可先用两轮标量例检查日志:第一行明确写更新前,第二行明确写更新后,并用保存的参数重新计算损失。数组版则保存独立快照或避免原地修改旧对象。这是执行状态的检查方法,不是原标题页已经提供的代码;它帮助你知道一张下降曲线究竟对应哪些参数。
补充:广播没报错,可能已把逐样本残差变成两两比较
自编三个概率为0.2、0.7、0.9,标签为0、1、1。若概率数组形状是(3,1),标签是(3,),NumPy会把后一项视为可按列广播,减法输出(3,3):第一行0.2−0、0.2−1、0.2−1;第二行0.7−0、0.7−1、0.7−1;第三行同理。这不是三个样本各减自己的标签,而是每个概率都减了所有标签。
期望的残差应为 ,形状可统一为(3,)或(3,1),但不能一边一列、一边一维而任由广播决定。随后矩阵乘法有时仍能运行并产出一个矩阵,错误会一路传到“权重更新”,所以只看程序是否抛异常不够。
在预测、残差、梯度、参数更新四处分别检查形状,并给一个手算样本核对应元素。不要用随意的 reshape 消掉报错:重塑应依据每条轴的语义,确保没有把样本轴与特征轴交换。
本讲核心考点
- 同一梯度下降循环可接不同目标,但参数和梯度形状必须一致(p.11延伸,C级通识)。
- 代码示例要先与手工一轮对照;样本数不等于参数数(补充)。
附录
阅读代码建议依次看“数据形状→预测函数→目标函数→梯度→更新→停止→画图”。从最后的漂亮图开始反猜前面逻辑,容易漏掉无截距或阈值硬编码等限制。详细核对放在 T02Code。
来源与证据
实际核对 T02-Gradient-Descent-2025T1.pdf(本地课件) PDF p.11;该页仅为Python实践分节页。补充内容明确不冒称该页原文。考试证据:本篇无新增试卷证据,不推断2026T1考核安排。