函数是用于 AI 计算的可复用机器
从变量走向函数:计算输入—规则—输出的映射,组合简单计算,并理解为什么同一个模型可以处理许多示例。
在第 1 课中,变量为输入、参数和输出提供了名称。函数把这些变量之间的关系打包成一条可复用的规则。
这已经足以描述推理的核心行为。模型接收输入,应用由参数决定的规则,并返回输出。学完本课后,你将能够计算函数,将规则与某一次具体计算区分开,并把同样的关系转换为 Python。
一条规则,多次计算
考虑函数
记号 读作“ 作用于 ”。它表示函数 接收输入值 时产生的输出。
当 时:
当 时:
这是对同一个函数的两次计算。规则 并没有改变。
在当前状态下, f((2)) = 2x 得到 4. 使用相同规则再次输入 2 时,始终会得到相同的输出。
只要记住它省略了哪些内容,机器图示就很有用。数学函数不必通过盒子中的物理步骤来实现。关键承诺是这种映射:允许的输入进入,确定的单一输出离开。
模型是带参数的函数
第 1 课中的微型评分规则是
我们可以把它命名为一个函数:
分号是一种有帮助的约定。它把普通输入 与参数 和 分开。它并没有创造一种新的算术。
训练完成后,假设存储的参数是 和 。那么,部署的模型就是函数
它可以处理许多输入:
训练选择定义部署规则的参数值。推理则针对新的输入计算这条规则。
函数记号让流水线更易读
假设某个应用先把原始测量值 转换为归一化值,然后再把该值转换为分数。
令
为归一化函数,令
为评分函数。当 时,从内到外计算这条流水线:
组合记号
称为复合。 的输出成为 的输入。
这种模式遍布 AI 系统。预处理产生特征;模型层转换表示;最终函数把分数转换为概率或决策。后续课程会说明,反向传播中使用的链式法则沿着同一依赖路径反向进行。
Python 中的同一条规则
Python 的函数语法让输入—规则—输出结构清晰可见。Python 教程将 def 介绍为定义函数的方式。
def normalize(x):
return (x - 10) / 5
def score(z):
return 2 * z + 1
def model(x):
normalized = normalize(x)
return score(normalized)
print(model(20)) # 5.0
print(model(5)) # -1.0
局部名称 normalized 记录了中间输出。函数 model 组合了两条规则,而没有重复其中任何一条。
数学记号和 Python 语法有所不同:
| 概念 | 数学 | Python |
|---|---|---|
| 定义规则 | def f(x): return 2*x + 1 | |
| 计算它 | f(3) | |
| 组合规则 | g(f(x)) | |
| 为中间结果命名 | z = f(x) |
这种对应关系很有用,但并不完美。Python 函数可以读取文件、改变外部状态、使用随机性,或在不同时间返回不同结果。数学函数按定义为每个输入指定一个输出。当机器学习写作把随机过程称为函数时,随机状态必须被视为完整输入或模型描述的一部分。
边界情况:不是每条规则都能在任何地方产生有效输出
考虑
当 时,这个表达式无法产生实数输出,因为除以零没有定义。因此,只说“ 接收一个实数”过于宽泛。它允许的实数输入不包括零。
这对 AI 代码很重要。除以特征标准差的归一化函数需要为零方差制定处理方案。损失函数中使用的对数需要正输入。张量函数需要兼容的形状。函数带有有效性条件;第 3 课会为这些条件提供精确的名称。
检查你的理解
问题 1
计算 f(x) = 3x - 2 在 x = 4 和 x = -1 时的值。
显示分步解答
当 时,在每个出现 的位置代入 :
当 时:
函数规则保持不变。只有输入值改变了。
问题 2
某条规则在一次计算中将输入 2 映射为输出 5,在另一次计算中将其映射为输出 7,但没有说明其他输入或状态。它是仅关于该输入的数学函数吗?
显示分步解答
不是。函数必须为每个允许的输入指定且只指定一个输出。在同一个未改变的函数下,同一个输入 不能同时映射到 和 。
这个过程可能依赖某个被遗漏的输入,例如随机状态或时间。如果把该状态纳入考虑,就可以定义一个更大的函数,例如 ,其中 是随机种子。但它不是仅关于所述输入的函数。
问题 3
令 n(x) = (x - 4) / 2 且 g(z) = z²。逐步计算 g(n(10))。
显示分步解答
先计算内部函数:
用这个输出作为 的输入:
因此,复合函数把 映射为 。
问题 4
在 f(x; w, b) = wx + b 中,普通推理期间什么会改变,训练期间什么发生了改变?
显示分步解答
在普通推理期间,模型接收不同的 值,而存储的参数 和 通常保持不变。训练是改变 和 以适应数据的过程。
两个阶段都在计算函数,但变量角色不同:
问题 5
为什么实现 h(x) = 1/x 时,必须在计算前处理 x = 0?
显示分步解答
当 时,规则要求计算 ,而这个式子没有实数值。该输入位于规则有效的实数定义域之外。
实现必须拒绝这个输入、选择一个单独定义的回退方案,或重新表述这个运算。无声地加上一个小数会改变正在计算的函数;这应被记录为数值约定,而不能被当作精确等式呈现。