答案页 · 12 道题

Python 梯度下降:一步一步靠近练习答案

本页汇总 Python 梯度下降:一步一步靠近 的 12 道练习。先做练习页,再回到这里核对准确答案和原因。

快速答案

本答案页包含 Python 梯度下降:一步一步靠近 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。

答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。

01 · 选择题

梯度下降更新时从参数中减去什么?

  1. 步数
  2. 截距
  3. 损失
  4. 梯度乘以学习率正确答案

答案: 梯度乘以学习率

为什么: 梯度给出损失增加的方向,乘以学习率则控制步子大小。

02 · 选择题

如果梯度为负,正常更新后 w 会怎样?

  1. 减小
  2. 完全不变
  3. 增大正确答案
  4. 立刻变成零

答案: 增大

为什么: 减去负梯度相当于给 w 加上一个正数。

03 · 选择题

学习率过大的主要风险是什么?

  1. 损失会变成整数
  2. 更新可能冲过谷底并发散正确答案
  3. 梯度会消失
  4. Python 无法乘浮点数

答案: 更新可能冲过谷底并发散

为什么: 步子太大会越过最小值,让下一次梯度更大。

04 · 选择题

运行结果是什么?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(0, [1, 2], [1, 2]))
  1. -5.0正确答案
  2. -2.5
  3. 5.0
  4. 0.0

答案: -5.0

为什么: 当 w = 0 时每个残差都是负数,所以梯度为负。

05 · 填空题

补全梯度下降更新。

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
w -= 0.1 * ____(w, [1, 2], [2, 4])
print(w)

答案: gradient

为什么: 更新从 w 中减去学习率乘以梯度。

06 · 填空题

补全平方损失求导产生的系数。

def gradient(w, xs, ys):
    return ____ * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(1, [1, 2], [2, 4]))

答案: 2

为什么: 对 (w*x - y) 的平方求导会带来系数 2。

07 · 填空题

补全损失中的平均操作。

def loss(w, xs, ys):
    return sum((w * x - y) ** 2 for x, y in zip(xs, ys)) / ____(xs)

print(loss(1, [1, 2], [2, 4]))

答案: len

为什么: 总平方误差除以观测数量。

08 · 填空题

补全循环,使其执行三次更新。

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
for _ in range(____):
    w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(round(w, 3))

答案: 3

为什么: range(3) 会产生三次迭代。

09 · 输出预测

这段程序打印出什么?

def loss(w, xs, ys):
    return sum((w * x - y) ** 2 for x, y in zip(xs, ys)) / len(xs)

print(loss(2, [1, 2], [2, 4]))

答案: 0.0

为什么: 当 w = 2 时每个预测都等于目标,所以损失是 0.0。

10 · 输出预测

代码的输出结果是什么?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(2, [1, 2], [2, 4]))

答案: 0.0

为什么: 模型已经完全拟合数据,每个残差都是零,所以梯度是 0.0。

11 · 输出预测

屏幕上会显示什么?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(w)

答案: 1.5

为什么: 梯度是 -5.0,减去 0.1 乘以 -5.0,w 从 1.0 增加到 1.5。

12 · 输出预测

这段代码会输出什么?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
for _ in range(2):
    w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(w)

答案: 1.75

为什么: 第一次更新到达 1.5,第二次到达 1.75。

先试一遍题目

打开 Python 梯度下降:一步一步靠近 练习页,用即时反馈回答同样的 12 道题。

练习本课