很多人一听到"机器学习要学微积分",第一反应是去刷导数、刷梯度,结果梯度下降还没玩明白,就一头撞上了更麻烦的东西——积分。而且最尴尬的是,不定积分不像导数有机械化的求导法则,它更像一门"猜"出来的艺术。我在给团队做内部培训的时候,发现大多数同学不是卡在梯度,而是卡在积分上,尤其是看到概率密度函数、贝叶斯公式、变分推断里出现了一个 ∫ 符号的时候,整个人就懵了。
这篇内容就是专门讲机器学习里的不定积分:先把核心概念掰开揉碎,再把真正会用到的场景一个个拆开,最后分享一些我踩过的坑和实际可用的学习方法。适合正在补数学基础、准备啃论文、或者面试前突击概率论和贝叶斯方向的朋友。内容本身不追求数学系的严谨证明,只追求"够用、能用、不留下隐患"。
1. 为什么学机器学习的会卡在不定积分上
1.1 从"梯度"说起:微分几乎无处不在,积分才是真正难啃的骨头
在机器学习里,你接触的第一个数学工具一定是微分。神经网络的误差反向传播,核心就是链式法则;梯度下降的每一次参数更新,算的都是损失函数对参数的偏导数。这些内容非常"机械化",只要你记住了导数表,掌握几个求导法则,基本就能应付大多数情况。
但是积分完全是另一回事。微积分里有句话叫"微分靠公式,积分靠经验",这话一点不假。你在机器学习里遇到的积分,往往不是考试题那种精心设计好的、能算出漂亮解析式的问题,而是出现在概率分布的归一化、期望计算、KL散度推导这些场景里。这些积分号不是单独出现的,它总是和分布、密度、推断这些概念绑在一起。如果你对不定积分的理解只停留在"求原函数"这个操作层面,遇到实际问题时很容易用错方向。
我自己带过不少从应用转算法方向的朋友,他们普遍有一个共同点:看论文的时候,公式推导到 ∫ 这一步就读不下去了,不是因为不会算积分,而是根本不知道这个积分"从哪来、要干什么"。所以这篇文章我会先把不定积分的直觉建立起来,再讲具体怎么算,最后落到机器学习场景里。
1.2 不定积分在机器学习知识体系里的位置
如果要给"机器学习数学基础"画一张地图,大概是这样的:
- 微分:无处不在,梯度下降、反向传播、正则化项求导,全都依赖它。
- 线性代数:矩阵、向量、特征分解,深度学习框架的底层全是这些。
- 积分/概率:两者永远绑定出现,概率密度函数的累积分布函数就是积分,期望就是积分,贝叶斯推断里的证据项也是积分。
- 优化:你最终做的事情就是"找个函数,算梯度,然后更新参数",而很多优化理论里的推导绕不开积分不等式。
不定积分真正出现在哪里?主要是在"从密度函数到概率"这一步。机器学习里,你看到一个概率密度函数 (f(x)),你想要知道"某个范围内的概率",就需要做定积分。而定积分的基本功就是不定积分——你们在做数值计算前,先用解析手段找原函数。更抽象一点,贝叶斯推断中求后验分布的分母 (P(D)),本质上是一个对参数空间的积分;变分推断里被我们变分逼近的那个证据下界,展开之后也全是积分项。
所以我的建议是:不定积分不是一门孤立的数学课,它是你通向概率论、贝叶斯推断、信息论的一座必经桥。你迟早要过桥,不如一开始就把桥墩子打结实。
2. 不定积分的核心概念:原函数与微分逆运算
2.1 不定积分到底在算什么
先说定义。不定积分就是求导的逆运算。给你一个函数 (f(x)),不定积分的结果是一个函数族 (F(x)+C),使得 (F'(x) = f(x))。这个名字里的"不定",指的就是那个常数 (C) 是不确定的、可以任意变化的。
我用一句话帮你记住:导数回答的是"这个函数在每个点的变化率是多少",不定积分回答的是"什么函数导出来会是这个变化率"。
举个例子,如果 (f(x) = 2x),那么不定积分就是 (\int 2x , dx = x^2 + C)。你可以验证一下,((x^2)' = 2x),常数项求导后是0,所以任何 (x^2 + C) 的导数都是 (2x)。反过来想,你就明白了为什么积分要带一个 (+C)——因为求导会把常数信息丢掉,积分自然无法恢复它。
我在实际培训中常把这个过程类比成"把速度还原成位置"。你只知道一辆车的瞬时速度曲线,想算出它从起点开始走了多远,就必须做积分;但问题是,你不知道它的起点在哪里,所以答案只能是一个"相对位置"加一个未知常量。这个常量就是 (C)。机器学习里很多地方明明算的是定积分,结果因为省略了原函数的常数,导致某些推导在边界条件上对不上——这个问题我在后面第5章会专门讲。
2.2 从物理和概率两个视角理解原函数
物理视角刚刚已经提了,速度积分得到位移,加速度积分得到速度。这个类比能帮你建立最基本的直觉:积分不是"电脑里的符号操作",它是对"累积量"的还原。
另一个对机器学习更重要的视角是概率视角。假设 (f(x)) 是一个连续概率密度函数(PDF),那么它的不定积分 (F(x) = \int f(x) , dx) 就是累积分布函数(CDF)的"骨架"。你如果用 (x) 是"某个随机变量的取值",那么:
- (f(x)) 告诉你:样本落在 (x) 附近的可能性有多大;
- (F(x)) 告诉你:样本小于等于 (x) 的概率是多少;
- (P(a \le x \le b) = F(b) - F(a)),也就是定积分。
这个视角非常重要。因为机器学习的很多模型,本质上是"用一个参数化的函数去拟合某个概率分布"。比如高斯混合模型里的每个分量,你要计算一个样本属于某个分量的后验概率,分子分母全是密度函数的积分(或者密度函数本身)。如果你不理解"密度积分就是概率累积"这件事,后面看 Expectation-Maximization(EM)算法的推导会非常痛苦。
2.3 积分常数:最容易丢分也最容易出错的地方
我说积分常数容易丢分,不只是说考试扣分,而是说在实际的机器学习推导里,它会造成真实的影响。
举个例子:有些模型推导里需要计算一个"未归一化的后验分布",你算完不定积分后,如果直接把它当概率密度来用,但它却是一个"差了一个常数"的函数。这在某些场景下是没问题的,因为最后模型会靠归一化因子把它拉回来;但在另一些场景,比如你计算某个损失函数里包含的积分项,常数没写对,梯度的量级就完全不对了。
另外还有一个小细节:不定积分的常数在"分段函数"里会体现得更隐蔽。比如你求 (\int |x| , dx),需要分 (x>0) 和 (x<0) 两段来讨论,两段的常数可以不一样。很多符号计算工具在处理这类问题时容易忽略,结果推导到一半发现"不连续",其实不是公式错了,而是常数没处理干净。
所以我的建议是:在机器学习推导里,凡是遇到不定积分,先养成一个习惯,把 (+C) 写上,然后再看下一步是否需要定积分把这个常数消掉。如果最后要做的是定积分,你完全可以等算出原函数之后,用上下限相减,常数自然消失。但如果你跳过了中间那一步,直接想从"未归一化的函数"里猜一个归一化系数,就非常容易搞出平方根不对、归一化系数差个 (\pi) 之类的低级事故。
3. 掌握不定积分的三大核心方法
3.1 基本积分表:先背熟这些,后面才有底气
我不喜欢"死记硬背"这四个字,但在积分这件事上,基本积分公式确实要求形成肌肉记忆。原因很简单:机器学习里你不大可能遇到复杂到要"推导积分表"的题目,但你一定会频繁遇到"这个分布长得很像某个已知积分"的情况。如果你连最基础的公式都要现查,推导论文的速度会慢得让人崩溃。
我建议你至少要把下面这些公式背到脱口而出:
| 函数 | 不定积分 | 备注 |
|---|---|---|
| (x^n) | (\frac{x^{n+1}}{n+1} + C) | (n \neq -1) |
| (\frac{1}{x}) | (\ln | x |
| (e^x) | (e^x + C) | 指数函数 |
| (a^x) | (\frac{a^x}{\ln a} + C) | 通用指数 |
| (\sin x) | (-\cos x + C) | 注意负号 |
| (\cos x) | (\sin x + C) | |
| (\frac{1}{1+x^2}) | (\arctan x + C) | 在概率论里频繁出现 |
| (\frac{1}{\sqrt{1-x^2}}) | (\arcsin x + C) |
这里面特别要注意的是 (\int \frac{1}{x} dx = \ln |x| + C)。我在给数据科学方向的同事做辅导时发现,很多人因为常年用 (\log(x)) 做损失函数,潜意识里觉得"(\log) 的积分就是它自己",结果一做题就错。实际上,(\log x) 的积分是 (x\ln x - x + C),可以用分部积分推出来,不是 (1/x) 的积分。这种"直觉反转"在机器学习里特别坑人。
还有 (e^{-x^2}) 这个函数——它就是高斯分布的未归一化形式。它的不定积分没有初等表达式,但它的定积分从 (-\infty) 到 (+\infty) 等于 (\sqrt{\pi})。这个结论不是靠"算原函数"得出来的,而是靠"极坐标变换"这个技巧得到的。我在第4章会详细讲它,因为这是统计机器学习最重要的一个积分,没有之一。
3.2 换元积分法:处理复合函数
换元法说白了就是"链式法则的逆运算"。求导时你有链式法则 ((f(g(x)))' = f'(g(x))g'(x)),积分时你就需要"看穿"这个结构,把 (g'(x)dx) 当成一个整体 (du) 替换掉。
我给你一个机器学习里最典型的例子:计算 (\int x e^{-x^2} dx)。你第一眼看不出来它怎么积,但是如果令 (u = -x^2),那么 (du = -2x dx),原积分就变成 (-\frac{1}{2}\int e^u du = -\frac{1}{2} e^u + C = -\frac{1}{2} e^{-x^2} + C)。这个形式在处理高斯分布的期望时会反复出现,尤其是计算 (E[X]) 或者某些正则化项的梯度时,你会碰到很多类似的"多项式乘指数"结构。
换元法的关键在于识别哪一部分是"内部函数的导数"。我给团队培训时常用一个判断标准:看被积函数里是不是有一部分"看着就像另一个函数导出来的"。比如 (\int \frac{2x}{1+x^2} dx),你看分子 (2x) 刚好是分母里 (1+x^2) 的导数,那就直接令 (u=1+x^2),结果就是 (\ln(1+x^2)+C)。一句话:分子是分母的导数,结果就会带 (\ln)。
换元法的常见误区是想把根号、指数、对数一次性全消掉。实际上,换元的目标只是"让被积函数长得更像基本积分表里的样子",不需要一步到位。你可以在一次换元后发现仍然不好办,就再换一次,或者转用分部积分。卡住的时候先停下来,看一眼当前积分式子里哪部分最让人难受,就从哪里换掉。
3.3 分部积分法:处理乘积形式
分部积分的公式是从乘积求导法则倒推出来的:
[ \int u , dv = uv - \int v , du ]
它的使用场景是被积函数是两个不同类型函数的乘积,例如多项式乘以指数、多项式乘以三角函数、对数函数乘以多项式。机器学习里最典型的例子是计算 (\int x \ln x , dx)。
你选 (u = \ln x),(dv = x dx),那么 (du = \frac{1}{x} dx),(v = \frac{x^2}{2}),代入公式:
[ \int x \ln x , dx = \frac{x^2}{2} \ln x - \int \frac{x^2}{2} \cdot \frac{1}{x} dx = \frac{x^2}{2}\ln x - \frac{x^2}{4} + C ]
是不是很简单?分部积分的关键是"谁当 (u),谁当 (dv)"。我的经验口诀是:把容易求导的放前面当 (u),把容易积分的放后面当 (dv)。比如对于"多项式 × 对数",对数求导后会变简单,所以对数当 (u);对于"多项式 × 指数",指数积分不改变形式,多项式积分后次数会升高,所以多项式当 (u) 反而更合适。
再给一个机器学习里相当常见的例子:计算高斯分布的方差时,会遇到 (\int x^2 e^{-x^2} dx)。这里需要连续用两次分部积分(或者说先用换元再用分部),过程比较绕,但思路是固定的:先通过换元把 (x^2) 塞进指数,再做分部积分。建议你自己动手推一遍,推完你对高斯分布相关推导的恐惧会消除一半。
4. 机器学习里真正会用到的不定积分场景
4.1 概率密度函数与累积分布函数
这是最直接、最频繁的用法。连续随机变量 (X) 的概率密度函数 (p(x)),它的累积分布函数定义为:
[ F(x) = \int_{-\infty}^{x} p(t) dt ]
你可能要说,这不是不定积分而是定积分。没错,但从计算角度讲,你需要先找到密度函数的一个原函数,再代入上下限。所以不定积分的熟练程度直接决定你能不能顺畅算出 (F(x))。
举例,指数分布 (p(x) = \lambda e^{-\lambda x})((x \geq 0)),它的不定积分是 (-e^{-\lambda x} + C)。累积分布函数就是:
[ F(x) = \int_0^x \lambda e^{-\lambda t} dt = 1 - e^{-\lambda x} ]
这个推导在生存分析、强化学习中的回报衰减模型、排队论里都会遇到。你如果不定积分功底好,看到这种分布能直接写出 CDF,而不需要每次都去翻公式表。反过来,如果你看到一张"某个模型输出的分数分布",你想把它当成"概率值",就得先理解这个 CDF 的实际含义。很多人在做模型校准(calibration)时容易胡涂,其实本质就是对分布函数的变换理解不到位。
还有一个需要注意的点:有些密度函数本身不是"一眼就能看出原函数"的,比如贝塔分布、伽马分布。它们包含 (x^{a-1}(1-x)^{b-1}) 这样的结构,原函数通常需要借助不完全贝塔函数来表示,解析式不是普通初等函数。这时候不要硬积,要能识别"这是哪类分布",直接调统计工具里的现成 CDF 函数。这个识别能力,恰恰建立在你对基本不定积分的熟练度上。
4.2 期望与方差的连续形式
连续随机变量的期望定义为:
[ E[X] = \int_{-\infty}^{+\infty} x p(x) dx ]
方差则是:
[ \text{Var}(X) = E[X^2] - (E[X])^2 = \int_{-\infty}^{+\infty} x^2 p(x) dx - \left(\int_{-\infty}^{+\infty} x p(x) dx \right)^2 ]
这里的核心就是算 (\int x p(x) dx) 和 (\int x^2 p(x) dx)。它们全是"多项式 × 密度函数"的积分,处理方法就是我们前面讲的换元加分部积分。
以标准正态分布 (p(x) = \frac{1}{\sqrt{2\pi}} e^{-x^2/2}) 为例:
- (E[X] = \int x p(x) dx = 0),因为奇函数在对称区间积分为 0;
- (E[X^2]) 需要算 (\int x^2 e^{-x^2/2} dx),用一次分部积分,结果是 1。
如果这些基础积分你能手算出来,后面理解"为什么正态分布的方差是1"就不只是背结论,而是真正"看到"了推导过程。更底层的意义在于,很多机器学习算法的目标函数其实就是某个期望的估计:策略梯度里的目标函数是奖励的期望,变分自编码器(VAE)的损失函数里包含对数似然的期望,蒙特卡洛采样做的是用样本均值估计期望积分。你把"期望=积分"这个等式刻在脑子里,看论文的速度会快上一大截。
4.3 贝叶斯推断中的分母项
贝叶斯公式 (p(\theta | D) = \frac{p(D | \theta) p(\theta)}{\int p(D | \theta) p(\theta) d\theta}) 中,分母是一个对参数空间 (\theta) 的积分。这个积分很多时候没有解析解。
我印象特别深的一次是我在某个项目里试图实现一个简单的贝叶斯线性回归。模型本身不复杂,但当我试图推导后验分布的归一化常数时,发现分母里的积分带着一个 (e^{-\lambda \theta^2}) 项。当时如果用解析积分去硬算,理论上是可以算出来的,因为那是高斯分布的标准积分;但如果先验不是高斯,比如用到拉普拉斯先验 (e^{-\lambda |\theta|}),分母积分就需要分段处理,而且如果你用数值积分工具去算,在高维参数空间里会爆炸。
这就是不定积分功底发挥作用的地方:你能一眼看出分母积分是什么分布族的归一化常数,就能直接写出答案,或者决定放弃解析解、转为数值方法。你不能算每种积分,但你必须能判断"这是什么积分、代价有多大、值不值得算"。这个判断力不是从天而降的,是在反复的推导练习里磨出来的。
4.4 变分推断与KL散度里的积分处理
变分推断(Variational Inference)是很多现代机器学习方法的基础。你要最小化变分分布 (q(z)) 和后验 (p(z|x)) 之间的KL散度:
[ KL(q \parallel p) = \int q(z) \log \frac{q(z)}{p(z|x)} dz ]
把它展开,会得到两个积分项:
[ KL(q \parallel p) = \int q(z) \log q(z) dz - \int q(z) \log p(z|x) dz ]
第一项叫负熵,第二项是交叉熵。这里你需要处理的积分类型包括"分布函数 × 分布的log":比如 (q(z)) 是高斯分布时,(\int q(z)\log q(z) dz) 是有解析解的,结果和协方差矩阵的行列式有关。
很多做深度学习的朋友第一次接触变分自编码器(VAE)时,看到损失函数里有两个期望项就放弃推导了。其实如果你把期望还原成积分,就会发现它们全都是我们前面练过的高斯积分、换元、分部积分的组合。正则化项里那个 KL 散度,拆开之后就是一个 (\frac{1}{2}(\mu^2 + \sigma^2 - \log \sigma^2 - 1))——这个式子的推导过程,用到的就是:
- 高斯密度函数的积分;
- 期望和方差的公式;
- 简单的代数展开。
我建议你把 VAE 的损失函数从积分形式推到最终形式走一遍,这一遍下来,不定积分在你眼里就再也不是"数学课遗留问题"了。
4.5 符号积分与数值积分的分工
到了真实工作里,你会遇到大量根本积不出来解析式的函数。这时候有两种选择:
- 符号积分:用 SymPy、Mathematica 这样的工具求精确的解析原函数。适合推导公式、理解结构。
- 数值积分:用 SciPy 的
quad函数、蒙特卡洛采样等方式近似计算具体数值。适合最终工程实现。
我在实际项目中的分工原则是:推导阶段先符号积分,实现阶段再用数值积分。举个例子,假设你要算一个复杂pipeline中某个分布的期望,先用 SymPy 试着找解析解:
import sympy as sp x = sp.symbols('x', real=True) # 计算高斯分布未归一化的期望试试 f = x * sp.exp(-x**2 / 2) # 积分结果应为 -exp(-x**2/2) result = sp.integrate(f, x) print(result)输出会是-exp(-x**2/2),说明确实有解析原函数。如果遇到积不出来的:
f_weird = sp.log(1 + x**2) * sp.exp(-x**2) result = sp.integrate(f_weird, x) print(result)SymPy 会返回一个无法化简的积分表达式,或者直接卡住。这时候就别纠结了,直接转数值积分:
from scipy.integrate import quad import numpy as np # 数值计算定积分 val, err = quad(lambda t: np.log(1 + t**2) * np.exp(-t**2), -np.inf, np.inf) print(val, err)我认为 "先尝试符号、不行就转数值" 是最高效的工程策略。很多人一上来就数值积分,结果公式里的结构规律完全看不见;另一些人死磕解析解,浪费大量时间。你要掌握的是"分界线在哪"。
5. 常见问题与现场排查实录
5.1 积分积不出来怎么办
这是新手最普遍的问题:拿到一个积分式子,换元也试了、分部也试了,就是积不出来。我的经验是先做一个"三连自查":
- 它是不是某个已知分布的一部分?比如含有 (e^{-x^2}),它大概率和高斯有关,你可以直接查对应分布的归一化常数和矩。
- 能不能换一个变量重新表达?比如含有 (x^2) 和 (1+x^2),令 (x = \tan t) 可能把它们化为三角积分。
- 这个积分真的需要解析解吗?如果你的目标是算数值,那就不要再耗时间,直接切数值积分。
我见过有人花一整天试图用解析方法算一个根本不能用初等函数表示的椭圆积分,最后用scipy.integrate.quad一行代码就解决了。学会"适时放弃解析解"是机器学习工程师必备的素养。
5.2 符号积分结果对不上
用 SymPy 算出来的积分结果和你手算的结果不一致,这种情况很常见。原因往往是符号工具处理常数项的方式不同,或者它用了不同的积分路径(比如用了双曲替换)。
举个例子,SymPy 对 (\int \frac{1}{1+x^2} dx) 可能直接给出 (\arctan x),但如果你自己做代换 (x = \tan t) 也能得到同样的结果。而对于更复杂的式子,SymPy 可能给出一个包含atan、log混合的结果,你看着完全陌生,但实际上它是某个三角恒等式的不同写法。
这时候我的排查步骤是:
- 将两个结果求导,看是否还原成原被积函数;
- 如果导数一样,说明两个结果只差一个常数,写成等式互相转化;
- 如果导数不一样,说明其中一个是错的,检查符号。
用 SymPy 做这个验证非常方便:
F1 = sp.integrate(f, x) F2 = sp.simplify(sp.diff(F1, x)) print(sp.simplify(F2 - f)) # 结果应为0这个验证习惯能帮你过滤掉一半以上的"公式看着不对"的焦虑。
5.3 省略积分常数的隐患
我在前面第2.3节已经强调过一次常数的重要性,这里再说一个真实踩坑案例。在做某个概率模型的推导时,我需要计算一个变分下界(ELBO)里的一项,它由一个不定积分和一个边界项组合而成。我当时偷懒把积分常数直接设为 0,结果导致后面求梯度时多了一个齐次项,整个损失曲线出现了一个奇怪的漂移。排查了很久,最后发现就是那个 (+C) 在作怪。
正确的做法是:在出现不定积分的推导里,先把常数写成一个符号(比如 (C_0)),等到做定积分时利用上下限消除;如果全程只有不定积分,那就得记住最终表达式里任何"多余常数"都可能影响梯度。尤其是在自定义损失函数里直接用某个原函数表达式时,漏掉常数会导致梯度方向偏移。这一点在写自定义 PyTorch 损失函数的时候尤其容易出问题,因为自动微分只会对你写的表达式求导,不会帮你补常数。
6. 我的学习路线建议与心得
6.1 学习顺序:先定积分直觉,再不定积分技巧
我推荐的顺序可能和传统教材相反:先理解定积分的几何意义和概率意义,再倒回去练不定积分技巧。为什么?因为定积分有明确的"面积"和"概率"直觉,你先知道"积分结果是可解释的量",练习不定积分时才不会觉得是在做无意义的符号游戏。
我自己带过几轮内部培训,效果最好的路径是:
- 先用定积分理解"累积"和"面积"的概念;
- 然后认识到定积分的计算依赖原函数,从而进入不定积分;
- 再回头把不定积分技巧练熟,之后遇到任何定积分都能通过原函数相减快速求解。
这个过程有点像先学会开车,再回去研究发动机原理,你带着真实需求去学原理,吸收效率会高很多。
6.2 练习与工具:别只看不练,动手去积
学习不定积分最忌讳"眼高手低"。看视频看懂了,觉得"这不就是几个法则吗",结果一合上书就写不出来。我建议准备一个练习本,每天挑5道题,不求多但求"裸写"——不能先翻公式表,而是靠记忆里的基本积分表和两个核心方法去试。错了再回看公式,标出错误原因。这样坚持三周,基本积分表就长在你的肌肉记忆里了。
工具层面,我建议让 SymPy 当你的"计算器 + 验算器",但不要过度依赖它。我一直用的是双轨策略:先手推一遍,再用 SymPy 验证;如果手推结果和 SymPy 不一致,就当作一次免费的学习机会,仔细找原因。Python 环境里可以直接启动一个 Jupyter notebook,随手写sp.integrate(),比传统查积分表方便太多。
6.3 我个人在实际操作中的体会
从我自己做算法落地和带人培训的经验来看,不定积分在机器学习里更多是一种"识别能力",而不是"计算能力"。你不会在写训练代码时手算积分,但你会在推导损失函数、理解论文模型、排查数值异常时不断地用到它。如果你能快速识别出一个积分对应哪个分布、哪类技巧,你的推导速度和代码调试速度会明显优于只能靠quad硬算的人。
我最后特别想说的一点是积累"积分经验"的方式:每当你在论文里看到一个带积分的公式,不要跳过它,试着亲手把它从积分推到最后的解析形式。第一次可能会花很多时间,但推完几个常见场景之后,你会发现积分题之间高度相似。到那时候,不定积分就不再是你的短板,而是你看理论论文时的一件顺手的工具。
另外再分享一个扩展方向:如果你接下来要学更深的概率模型、扩散模型或者随机微分方程,不定积分的"逆向思维"会成为你理解连续时间动态系统的钥匙。现在多花的时间,后面都会以"读论文速度快十倍"的形式返还给你。