AI for Youth Academy 青少年AI研究计划

第一年 · 第07周

第七章:一步一步找到最佳直线

上周我们看到柠檬水数据的最佳拟合线是:杯数 = 0.87 × 温度 − 43。但我们是如何找到这些数字的?本周我们学习一个强大的技巧:从一个随机猜测开始,一步一步改进。这与真实AI系统学习的方式相同。

第1部分:Python中的数据

记得上周的柠檬水摊吗?让我们把这些数据放入Python作为两个列表。在Google Colab中打开一个新笔记本并输入:

# 温度 (°F)
x = [60, 65, 70, 75, 80, 85, 90, 95]

# 卖出的杯数
y = [10, 14, 20, 22, 28, 34, 38, 40]

x中的每个数字与y中相同位置的数字匹配。当温度是60时,我们卖出了10杯。当温度是65时,我们卖出了14杯,以此类推。

第2部分:绘制数据

在我们做任何数学之前,让我们先看到我们的数据。我们将使用一个叫做matplotlib的库来绘制散点图。将此添加到你的笔记本中:

import matplotlib.pyplot as plt

plt.scatter(x, y, color="blue")
plt.xlabel("温度 (°F)")
plt.ylabel("卖出的杯数")
plt.title("柠檬水摊数据")
plt.show()

你应该看到八个蓝色的点从左下到右上分布。这个模式看起来可能是一条直线——这正是我们想找到的。

第3部分:从一个随机猜测开始

我们想找到一条适合数据的直线。一条直线的方程是:

直线方程:

y = k × x + b

这里k是斜率(直线有多陡),b是y截距(直线与y轴相交的地方)。上周我们说最佳答案大约是k = 0.87b = -43。但假设我们还不知道这些。

让我们只是猜测。选择任何数字:

# 我们的随机起始猜测
k = 0.5
b = -5

这是一个好的猜测吗?可能不是!但这没关系——我们将一步一步修复它。

第7部分:一步一步下坡——学习率

与其尝试每个可能的k和b,我们可以聪明一点。想法很简单:

  1. 从我们当前的猜测(k和b)开始。
  2. 尝试将k向上微调一点点,向下微调一点点。看看哪个方向使误差更小。
  3. 将k向减小误差的方向移动。
  4. 对b做同样的事情。
  5. 重复!

这就像被蒙住眼睛在山上,用脚感受地面来找出哪个方向是下坡。让我们用Python写出来:

# 从我们的随机猜测开始
k = 0.5
b = -5

# 学习率控制每一步有多大
learning_rate = 0.0001

# 一个微小的调整来测试斜率
nudge = 0.01

第8部分:把所有内容放在一起

一步是不够的。我们需要重复多次。让我们使用for循环执行1000步:

# 重新开始
k = 0.5
b = -5
learning_rate = 0.0001
nudge = 0.01

# 运行1000步
for step in range(1000):
    # 计算斜率
    error_now = total_error(k, b, x, y)
    slope_k = (total_error(k + nudge, b, x, y) - error_now) / nudge
    slope_b = (total_error(k, b + nudge, x, y) - error_now) / nudge

    # 更新k和b
    k = k - learning_rate * slope_k
    b = b - learning_rate * slope_b

    # 每200步打印一次让我们可以观察
    if step % 200 == 0:
        print("第", step, "步 k =", round(k, 3),
              " b =", round(b, 3),
              " 误差 =", round(error_now, 1))

观察输出——你会看到k和b慢慢向最佳值移动,误差变得越来越小。

展望未来

今天你学习了AI中最重要的概念之一:梯度下降——从一个猜测开始,测量误差,一步一步改进。这正是ChatGPT、图像识别器和自动驾驶汽车学习的方式。唯一的区别是它们有数百万个参数而不是只有两个(k和b),而且它们使用更多的数据。

在接下来的几周里,我们将探索当关系不是一条直线时会发生什么,如何处理多个输入,以及这个相同的想法如何驱动神经网络。