AI 数学课程 · 第 2 课,共 180

函数是用于 AI 计算的可复用机器

从变量走向函数:计算输入—规则—输出的映射,组合简单计算,并理解为什么同一个模型可以处理许多示例。

分享这篇文章

第 1 课中,变量为输入、参数和输出提供了名称。函数把这些变量之间的关系打包成一条可复用的规则。

这已经足以描述推理的核心行为。模型接收输入,应用由参数决定的规则,并返回输出。学完本课后,你将能够计算函数,将规则与某一次具体计算区分开,并把同样的关系转换为 Python。

一条规则,多次计算

考虑函数

f(x)=2x+1.f(x)=2x+1.

记号 f(x)f(x) 读作“ff 作用于 xx”。它表示函数 ff 接收输入值 xx 时产生的输出。

x=3x=3 时:

f(3)=2(3)+1=6+1=7.\begin{aligned} f(3) &= 2(3)+1 \\ &= 6+1 \\ &= 7. \end{aligned}

x=2x=-2 时:

f(2)=2(2)+1=4+1=3.\begin{aligned} f(-2) &= 2(-2)+1 \\ &= -4+1 \\ &= -3. \end{aligned}

这是对同一个函数的两次计算。规则 2x+12x+1 并没有改变。

函数是一条规则,而不是一个答案。更改输入或选择一条规则,并沿着相同的三阶段路径追踪。
输入2
规则f(x) = 2x
输出4

在当前状态下, f((2)) = 2x 得到 4. 使用相同规则再次输入 2 时,始终会得到相同的输出。

只要记住它省略了哪些内容,机器图示就很有用。数学函数不必通过盒子中的物理步骤来实现。关键承诺是这种映射:允许的输入进入,确定的单一输出离开。

模型是带参数的函数

第 1 课中的微型评分规则是

s=wx+b.s=wx+b.

我们可以把它命名为一个函数:

f(x;w,b)=wx+b.f(x;w,b)=wx+b.

分号是一种有帮助的约定。它把普通输入 xx 与参数 wwbb 分开。它并没有创造一种新的算术。

训练完成后,假设存储的参数是 w=1.5w=1.5b=1b=-1。那么,部署的模型就是函数

f(x)=1.5x1.f(x)=1.5x-1.

它可以处理许多输入:

f(1)=0.5,f(3)=3.5,f(2)=4.f(1)=0.5, \qquad f(3)=3.5, \qquad f(-2)=-4.

训练选择定义部署规则的参数值。推理则针对新的输入计算这条规则。

函数记号让流水线更易读

假设某个应用先把原始测量值 xx 转换为归一化值,然后再把该值转换为分数。

n(x)=x105n(x)=\frac{x-10}{5}

为归一化函数,令

g(z)=2z+1g(z)=2z+1

为评分函数。当 x=20x=20 时,从内到外计算这条流水线:

n(20)=20105=2,g(n(20))=g(2)=2(2)+1=5.\begin{aligned} n(20) &= \frac{20-10}{5}=2, \\ g(n(20)) &= g(2)=2(2)+1=5. \end{aligned}

组合记号

(gn)(x)=g(n(x))(g\circ n)(x)=g(n(x))

称为复合nn 的输出成为 gg 的输入。

这种模式遍布 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
定义规则f(x)=2x+1f(x)=2x+1def f(x): return 2*x + 1
计算它f(3)f(3)f(3)
组合规则g(f(x))g(f(x))g(f(x))
为中间结果命名z=f(x)z=f(x)z = f(x)

这种对应关系很有用,但并不完美。Python 函数可以读取文件、改变外部状态、使用随机性,或在不同时间返回不同结果。数学函数按定义为每个输入指定一个输出。当机器学习写作把随机过程称为函数时,随机状态必须被视为完整输入或模型描述的一部分。

边界情况:不是每条规则都能在任何地方产生有效输出

考虑

h(x)=1x.h(x)=\frac{1}{x}.

x=0x=0 时,这个表达式无法产生实数输出,因为除以零没有定义。因此,只说“hh 接收一个实数”过于宽泛。它允许的实数输入不包括零。

这对 AI 代码很重要。除以特征标准差的归一化函数需要为零方差制定处理方案。损失函数中使用的对数需要正输入。张量函数需要兼容的形状。函数带有有效性条件;第 3 课会为这些条件提供精确的名称。

检查你的理解

问题 1

计算 f(x) = 3x - 2 在 x = 4 和 x = -1 时的值。

显示分步解答

x=4x=4 时,在每个出现 xx 的位置代入 44

f(4)=3(4)2=122=10.f(4)=3(4)-2=12-2=10.

x=1x=-1 时:

f(1)=3(1)2=32=5.f(-1)=3(-1)-2=-3-2=-5.

函数规则保持不变。只有输入值改变了。

问题 2

某条规则在一次计算中将输入 2 映射为输出 5,在另一次计算中将其映射为输出 7,但没有说明其他输入或状态。它是仅关于该输入的数学函数吗?

显示分步解答

不是。函数必须为每个允许的输入指定且只指定一个输出。在同一个未改变的函数下,同一个输入 22 不能同时映射到 5577

这个过程可能依赖某个被遗漏的输入,例如随机状态或时间。如果把该状态纳入考虑,就可以定义一个更大的函数,例如 f(2,r)f(2,r),其中 rr 是随机种子。但它不是仅关于所述输入的函数。

问题 3

令 n(x) = (x - 4) / 2 且 g(z) = z²。逐步计算 g(n(10))。

显示分步解答

先计算内部函数:

n(10)=1042=62=3.n(10)=\frac{10-4}{2}=\frac{6}{2}=3.

用这个输出作为 gg 的输入:

g(n(10))=g(3)=32=9.g(n(10))=g(3)=3^2=9.

因此,复合函数把 1010 映射为 99

问题 4

在 f(x; w, b) = wx + b 中,普通推理期间什么会改变,训练期间什么发生了改变?

显示分步解答

在普通推理期间,模型接收不同的 xx 值,而存储的参数 wwbb 通常保持不变。训练是改变 wwbb 以适应数据的过程。

两个阶段都在计算函数,但变量角色不同:

推理:改变 x,训练:更新 w,b.\text{推理:改变 }x, \qquad \text{训练:更新 }w,b.

问题 5

为什么实现 h(x) = 1/x 时,必须在计算前处理 x = 0?

显示分步解答

x=0x=0 时,规则要求计算 1/01/0,而这个式子没有实数值。该输入位于规则有效的实数定义域之外。

实现必须拒绝这个输入、选择一个单独定义的回退方案,或重新表述这个运算。无声地加上一个小数会改变正在计算的函数;这应被记录为数值约定,而不能被当作精确等式呈现。

资料来源

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. Python documentation: defining functions