尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

理解f(x; θ):分号如何区分变量与参数,贯通数学与机器学习

理解f(x; θ):分号如何区分变量与参数,贯通数学与机器学习 不管你是在看统计教材、机器学习论文还是随手抄一段 Python 代码应该都见过这种写法f(x; θ)。我第一次看到这个式子的时候愣了很久中间的封号到底想表达什么和逗号有什么区别为什么不能老老实实写成f(x, θ)后来才发现这个分号不是排版习惯而是刻意留下的记号背后藏着一个很重要的分工逻辑x是变量θ是参数。理解了这一点你看公式、读代码、调模型都会顺畅很多。这篇文章我尽量用大白话把这个分号从数学到机器学习、再到编程实战里对应的那点事一次讲清楚。数学基础一般的朋友也完全能跟上因为它本质上不是复杂的推导而是一个“看符号的视角问题”。看懂分号之后你会很容易理解什么是模型参数、什么是超参数也会更明白回调函数、函数指针这些编程概念为什么会叫“参数化设计”。1. 从数学习惯说起分号在区分变量和参数1.1 一个函数里通常有两类角色先从最朴素的例子入手。直线方程y kx b如果在代码里写成一个函数我们一般会写成def line(x, k, b): return k * x bx是输入数据k和b是描述这条直线长什么样的量。同一个x3当k2时结果是2*317当k5时结果就变成16。这意味着k和b一旦变化整个函数输出的“规则”就变了。数学家们想表达这种区别时就会写成f(x; k, b) kx b分号左边放的是“真正的变量”也就是那个会不断变化、通常代表输入的自变量分号右边放的是“参数”也就是在某个具体问题里暂时固定下来的常量。它是这个函数的行为开关你拧到哪个位置函数就呈现出哪种形态。1.2 为什么不用逗号非要加一个分号你可能会说这不就是多一个参数嘛写成f(x, k, b)不也一样从计算角度确实没有本质区别但在数学表达里逗号通常表示“并列的多个变量”比如二元函数g(x, y)表示有两个自变量共同影响输出。如果要强调某个量不是输入、不随样本变化只是“给定的一组条件”就要在记号上做区分。分号在统计学里特别常用就是因为“随机变量”和“待估参数”是两种完全不同的身份。拿正态分布的概率密度函数举例f(x; μ, σ) (1 / (σ√(2π))) * exp(-(x - μ)^2 / (2σ^2))这里的x是随机变量代表我们可能观测到的数据μ和σ是均值和标准差它们决定了这个分布的位置和胖瘦。正态分布簇可以看成无数个具体分布的集合而(μ, σ)就是在集合里选哪个分布的控制开关。用分号把x和(μ, σ)分开读者一眼就能知道哪些量是用来求函数值的哪些量是函数形态的设定。这种写法的另一个好处是减少求偏导时的困扰。如果一个式子写成f(x, θ)你说要对x求偏导还是对θ求偏导初学者容易懵。但写成f(x; θ)后习惯上我们默认分号左边才是求导或研究的主角右边更像是一个“前提条件”。当然这不是死规矩但至少在很多统计和机器学习文献里这种分工非常常见。1.3 一个练习帮你建立直觉假设有一个函数f(x; a) a · x²当a2时你可以把它写成f(x) 2x²因为参数已经被具体数值固定住了。如果输入x3那么f(3; 2) 2 × 9 18。这里的重点是a在计算过程中一直没变所以它被放到分号右边x是输入每次都可能不同所以放在左边。这种视角在阅读更复杂的公式时特别有用。比如你看到一个式子不需要马上展开所有代数运算先问一句“分号左边是什么右边是什么”答案通常就是函数接下来要研究的对象和支持这个对象的前提条件。2. 机器学习里的 f(x; θ)参数到底在学什么2.1 神经网络就是一个巨大的带参数函数现在的深度学习模型名字叫“网络”听起来很有生物感但本质上它就是一个函数。输入一张图片x输出一个类别概率分布输入一段文本输出下一个词的概率。这个海量参数的函数可以被写作f(x; θ)其中x是输入数据θ是模型里的所有可学习参数包括卷积核的权重、全连接层的权重矩阵和偏置项等。一次训练过程要做的就是通过梯度下降不断更新θ让函数f的输出尽可能接近真实标签。比如线性回归模型ŷ f(x; w, b) wᵀx bw是特征权重b是偏置。当模型没训练时w和b是随机初始化的f的输出乱七八糟。随着训练样本进来优化器计算损失对w和b的梯度并更新它们最后得到一个可以用的预测函数。整个过程里输入x是变化的但它不是我们修改的对象我们真正修改的是分号右边那一堆θ。2.2 损失函数里的分号怎么理解在机器学习里常见的不只是f(x; θ)还有损失函数。一个典型写法是L(θ; x, y) (1/N) Σ (f(xᵢ; θ) - yᵢ)²你看这里分号两边的顺序变了。左边是θ右边是(x, y)。这正好呼应了我前面说的“分号左边是主角”这个习惯在训练阶段输入数据(x, y)是固定的从训练集里抽样得到的不再变化我们要优化的是θ所以θ被放到分号左边。这和我们一开始看的f(x; θ)不冲突因为那是前向推理的视角输入x是变量参数θ固定这里是反向训练的角度θ才是变量数据是固定的条件。明白这个关系之后你会更容易读懂反向传播公式。比如梯度更新θ θ - η · ∂L / ∂θ求导时x和y被视为常量只有θ在变化。这个“谁求导谁就是主角”的思路就是分号在暗示你的事。2.3 参数和超参数不是一回事再来说说热搜词里反复出现的“超参数”。很多人刚接触机器学习时会把模型参数和超参数混在一起。其实在分号的语境下它们的位置可以这样大致对应模型参数θ模型内部的、从数据里学出来的值比如权重、偏置。超参数控制模型训练方式的设置比如学习率、批量大小、正则化系数、网络层数等这些不会在训练中自动更新而是我们手动设定或通过搜索确定。我们可以用一张表对比一下角色常见写法来源是否随训练更新输入变量x外部数据否模型参数θ训练过程学习是超参数α学习率人工设定否例如 YOLOv5 这类目标检测模型训练前要配置一堆超参数学习率、动量、权重衰减、图像增强参数。这些超参数虽然也会影响f(x; θ)最后的表现但它们在训练公式里不参与梯度更新。你可以把超参数理解为“控制参数训练过程的参数”是套在模型参数外面的另一层旋钮。3. 编程世界里的参数函数定义、指针与回调3.1 数学符号和代码参数列表的对应关系数学里的分号在编程语言里其实也有类似现象。虽然代码里通常用逗号分隔所有参数但参数列表内部仍然有分工有些是真正的输入数据有些是用来改变函数行为模式的配置项。拿 Python 举个简单例子def scaling(x, factor1.0): return x * factor调用scaling(3)时factor使用默认值1.0调用scaling(3, factor2.5)时factor被显式指定。在这里x是你每次都要传的数据factor更像是一个“参数旋钮”你不传就用默认值。这和f(x; θ)中分号的含义非常相似变量和数据一直在变参数可能带着一个默认状态只在需要时调整。JavaScript 的箭头函数也是同样的道理const f (x, theta 1) x * theta; console.log(f(5)); // 5 console.log(f(5, 2)); // 10箭头函数用把参数和函数体连起来省略了传统function关键字但参数列表里的分工并不变。默认参数theta 1就是编程语言里对“分号右侧参数”的一种实现不传入时它有一个初始设定。3.2 函数作为参数回调函数和函数指针编程里还有一类很有“参数化设计”味道的东西把函数本身作为参数传给另一个函数。最经典的是 C 语言里的函数指针。比如你写一个通用排序函数要让它既能按升序排又能按降序排通常会把比较函数作为参数传进去void sort(int *arr, int n, int (*compare)(int, int));这里的compare是一个函数指针指向某个具体的比较逻辑。传ascending就得到升序排序传descending就得到降序排序。主逻辑不变变的是内部“策略”。这种设计与数学里f(x; θ)中参数决定行为的思想非常相似——只是这里的θ变成了一段更复杂的代码逻辑。JavaScript 里的回调函数也很好理解function processData(data, callback) { let result data.map(x x * 2); callback(result); } processData([1, 2, 3], console.log);callback什么时候执行、执行什么都由调用方决定。这种把“后续动作”作为参数传入并稍后执行的设计就是回调模式。函数在这里不再只是一个被调用的命令而是一个可以被传递、被配置的“参数”。3.3 可变参数和剩余参数参数数量不固定时怎么办有些函数接收的参数数量不是固定的。Python 里可以用*args收集所有位置参数**kwargs收集所有关键字参数JavaScript 里则用剩余参数rest parameters实现类似效果function collect(first, ...rest) { console.log(first); console.log(rest); }这种情况下已经不存在一个“分号”来区分变量和参数了因为参数集合本身可能就是动态的。但理解起来更简单第一个参数是核心输入剩余参数是扩展配置。实际阅读代码时你只需要判断哪些参数在每次调用时都变化哪些只是用来微调行为就可以很快掌握函数的使用方式。4. 参数调整的实战从 PID 控制到超参数调优4.1 PID 控制器也可以写成带参数的函数很多工程应用里参数的地位体现得更直接。比如自动化控制里最常见的 PID 控制器输出公式可以写成u(t; Kp, Ki, Kd) Kp · e(t) Ki · ∫e(τ)dτ Kd · (de/dt)这里的e(t)是当前误差是实际测量值和目标值之间的差随时间变化而Kp、Ki、Kd分别是比例、积分、微分系数它们是工程师在设备调试时需要设定的参数。同一个控制器换一套(Kp, Ki, Kd)控制效果可能天差地别参数调得太激进系统会震荡参数调得太保守系统响应又慢。网上常能看到“变频器参数调试步骤”本质就是在调整这类控制函数里的θ。你不用把每个参数背后的数学推导都记下来关键要知道系统行为由u(t; θ)决定而你的任务就是找到那个合适的θ。4.2 调参时的经验与常见误区我自己的体会是调参这件事最怕的是分不清“变量”和“参数”。变量是环境给的参数是你可以动的。拿 PID 举例e(t)是设备反馈回来的你不可能直接改它你能改的只有Kp、Ki、Kd拿机器学习举例输入x是数据集的属性你不能为了拟合训练集去篡改它你能改的是模型参数和超参数。一个常见的误区是看到验证集效果不好就反复调超参数调到验证集完美为止。这看起来是在调参数实际上是拿验证集当训练集用最后模型在测试集上大概率翻车。正确做法是先把数据集严格划分训练集用来更新模型参数θ验证集用来评估超参数选择测试集只保留一次、在最终评估时使用。另一个心得是从量级上入手。很多人调参喜欢一个参数一个参数地试效率很低。先大概确定哪些参数对结果影响最大比如神经网络里的学习率PID 里的Kp先把大头找到、调到合理区间再去微调次要参数。这个思路和数学里的分号视角是一致的改变分号右边的参数就是在改变整个函数的形态而参数之间的作用往往是耦合的孤立地动一个有时候看不出效果。4.3 参数初始化只是开始在深度学习框架里定义一个全连接层时比如torch.nn.Linear(4, 2)框架会随机初始化一个权重矩阵和一个偏置向量这些就是θ。但初始化只是起点训练过程会让这些参数朝着损失减小的方向更新。真正有意思的是最终学到的θ往往不是一个唯一的解不同的初始化可能收敛到不同的参数组合但都能在测试集上表现不错。这就是为什么你会看到很多人说“模型训练有随机性”。所以别把分号右边的θ想成一个固定不变的数值它在训练阶段是不断流动的。分号的意义更像是在提醒你这一堆数值是一个整体它们共同定义了模型的行为而你要分析模型为什么表现好或不好就要从这一堆参数个体开始去看它们的分布、梯度、激活值。5. 分号、竖线和逗号到底怎么区分5.1 一个表格帮你理清常见记号为了不让你以后看文献继续晕我整理了一个常见记号速查表把容易混淆的几个符号放在一起对比记号表达含义典型用途f(x)只依赖自变量x普通函数f(x; θ)x是变量θ是参数参数化函数如正态分布密度、神经网络f(x | θ)x在给定θ条件下的分布条件概率、贝叶斯统计f(x, θ)x和θ被当成两个并列的自变量二元函数不强调身份差异竖线|在概率里通常表示“条件”比如P(A|B)是 B 发生条件下 A 发生的概率。分号则更多用于强调“参数和变量之间的主次关系”它不想表达因果关系只是想告诉你分号右边的量是一个“设置项”。在一些文本里f(x|θ)也被用来表示“给定参数 θ 时 x 的分布”所以你会发现统计学的约定并不完全统一必须结合上下文判断。5.2 看上下文比背符号更靠谱不同作者、不同教材对分号的使用习惯略有差异。运气好你会看到f(x; θ)有时候写的人也会随手用f(x, θ)但后一种写法的确容易让人忽略参数和变量的区别。我的建议是与其死记硬背不如在看公式时问自己两个问题这个式子中哪些量是我要输入的数据哪些量是帮我选择函数形态的设定只要这两个问题的答案清晰写不写分号都不影响你理解。更具体的判断技巧是如果某个量往往被提前给定、不随输入样本改变甚至拥有先验分布那它多半是参数如果某个量在求梯度时被当作常数那它多半是从数据里来的、固定的观测值。分号左侧和右侧的“主次关系”就藏在这样的推导过程里。我自己一直很喜欢分号这个符号因为它像是一个分隔线把“整个世界给你的输入”和“你自己可以调整的选择”分开。看懂它之后你会觉得很多公式都变得亲切了原来它们不是一堆同等级的变量在开会而是一个操作者和一台机器的关系。我个人在实际操作里的习惯是看到带分号的函数先在草稿纸上画两条竖线左边写输入变量右边写参数。然后问自己如果改变右边的参数函数曲线会怎么变如果改变左边的变量函数值会怎么变。这么练上几次再复杂的公式也能快速拆出骨架。最后再分享一个小技巧调试程序时如果函数行为不对先别一股脑地改参数先去确认你改的到底是参数还是数据变量。分号分隔开的两个区域在工程里就是两种完全不同的修改入口选对了入口问题往往就能少走很多弯路。
返回列表