强化学习进阶:一文通透 On-policy 函数逼近与预测

机器学习概念的生活化解读:从厨房到职场的10个核心概念 机器学习并非高深莫测的数学黑箱,而是对人类经验进行结构化建模的技术范式。其本质是通过数据驱动构建输入与输出之间的条件反射路径,依赖反馈闭环持续校准决策逻辑。监督学习强调带反馈的试错过程,而非静态标签匹配;无监督学习实为在无明确目标下发现数据内在分组规律;神经网络则模拟人脑渐进式抽象认知——如教孩子认猫。这些原理共同支撑着模型在推荐系统、智能硬件、工业质检等场景中的落地价值。本文以电饭煲调参、菜市场辨货、育儿哭声响应等生活案例,将监督学习、神经网络等热词还原为可感知、可验证、可迁移的工程直觉。 阅读详情

简介

“基于函数逼近的同轨策略预测”是强化学习(Reinforcement Learning)中的一个核心概念。简单来说,它的意思就是:用带有参数的模型(如神经网络或线性函数)去估计某个策略的长期收益(价值),而用于训练这个模型的数据,完全是由该策略亲自在环境中“边干边试”采集来的。

把它拆成三个核心部分来看,就非常容易理解了:

1. 预测 (Prediction / 策略评估)

  • 目标: 评估一个给定的策略$\pi$ 到底好不好。

  • 具体做法: 给定一个策略 $\pi$(比如“打羽毛球时尽量打到对方后场”),我们需要计算在每个状态 $s$下,按照这个策略一直打下去,预期能拿到多少累积回报,也就是估计价值函数 $v_\pi(s)$。

2. 同轨策略 (On-policy)

  • 数据来源: “边做边学,用谁的数据学谁”。

  • 在收集交互数据(状态、动作、奖励)时所使用的策略(行为策略),与我们正在评估和优化的策略(目标策略)是同一个策略。

  • 类比: 如果你自己亲自下场打球,并根据你自己打球时的亲身感受和得分情况来评估你的打法,这就是“同轨策略”;如果是看职业选手的录像来总结评估你的打法,那叫“异轨策略(Off-policy)”。

3. 函数逼近 (Function Approximation)

  • 处理大规模状态: 用带参数的函数 $\hat{v}(s, \mathbf{w})$ 来代替“表格”存储价值。

  • 当状态空间很小时(比如棋盘游戏),我们可以用一张大表(Tabular)记录每个状态的价值。但如果是连续空间(如自动驾驶的摄像画面、机器人的关节角度),状态是无限多的,不可能为每个状态建一张表。

  • 函数逼近就是引入参数向量$\mathbf{w}$(例如神经网络的权重),只要输入状态 $s$,模型就能输出估计的价值 $\hat{v}(s, \mathbf{w})$。这赋予了算法对未见过状态的泛化能力。

1.价值函数逼近

价值函数逼近(Value Function Approximation)简单来说就是:用一个带参数的数学模型(如神经网络或线性函数),去“猜”或“推算”某个状态(或动作)的长期价值,而不是逐个去查表。

在强化学习中,价值函数的目标是回答“处于当前状态 s 时,未来预期能拿多少总回报”。

为什么需要“逼近”?(表格法 vs. 逼近法)

为了理解“逼近”的必要性,可以看两个方法的对比:

  1. 表格法(Tabular Method):

    把所有状态和对应的价值记在一个“大字典”里。

    • 例子: 井字棋(Tic-Tac-Toe)的状态很少,我们可以建立一张表格,第 1 个状态价值 0.5,第 2 个状态价值 0.8…… 遇到状态直接查表(Table Lookup)。

    • 瓶颈: 一旦遇到复杂问题,比如围棋(状态数高达 $10^{170}$)或者自动驾驶(摄像头输入的是连续变化的高维图像),我们不可能建立一张包含所有状态的表格——内存会瞬间爆掉,而且绝大多数状态在有生之年都不可能踩到第二次。

  2. 函数逼近法(Function Approximation):

    用一个带有参数 $\mathbf{w}$的模型 $\hat{v}(s, \mathbf{w})$ 来代替大字典。

    • 做法: 把当前的图像、传感器数据作为输入状态 $s$ 传入模型,模型直接计算出一个估算的价值 $\hat{v}(s, \mathbf{w})$。

    • 核心优势(泛化能力): 就算遇到了一个从未见过的全新状态,只要它和之前见过的状态类似,模型就能基于学到的通用规律推算出该状态的大致价值。

常见的三种逼近架构

在算法设计中,根据输入和输出的形式不同,价值函数逼近通常有以下三种典型架构:

  • 状态价值函数 $\hat{v}(s, \mathbf{w})$: 输入状态 $s$,直接输出当前状态的总体价值(对应上图左一)。

  • 动作价值函数 $\hat{q}(s, a, \mathbf{w})$: 输入“状态 $s$+ 特定动作$a$”,输出在该状态下执行特定动作的价值(对应上图中间)。

  • 多输出动作价值函数 $\hat{q}(s, a_i, \mathbf{w})$: 只输入状态$s$,模型一次性并行输出当前状态下所有可能动作的价值(对应上图右一)。经典的 DQN(Deep Q-Network) 采用的就是这种结构,极大提升了决策与评估效率。

常用模型

  • 线性函数逼近: 将状态特征提取后乘以权重向量($\hat{v}(s, \mathbf{w}) = \mathbf{w}^T \mathbf{x}(s)$)。计算速度快、理论收敛性质好,但对复杂非线性问题的表达能力有限。

  • 深度神经网络(Deep Neural Networks): 即深度强化学习(Deep RL)的核心。用多层神经网络作为逼近器,能够直接处理图像、音频等高维原始输入,具有极强的拟合能力。

一句话总结: 价值函数逼近本质上就是从“死记硬背每一个状态的价值”(表格法)升级到了“学会根据特征推算未知状态价值的通用规律”。

2.预测目标 VE

在强化学习的函数逼近预测中,预测目标 VE 是指 $\overline{VE}$(Mean Squared Value Error,均方价值误差)。

简单来说,它就是用来评估“我们模型估算出的价值,距离真实价值到底差了多少”的标尺。在机器学习中,它扮演的角色就相当于损失函数(Loss Function)。

为什么需要这个目标?

在不使用函数逼近(表格法)时,我们可以把每个状态的真实价值都记下来,争取做到 100% 准确。

但使用函数逼近时,参数 $\mathbf{w}$ 的数量远远少于状态的数量。这就意味着我们不可能让模型在所有状态上的预测都完全准确——顾了状态 A 的准确度,可能就会牺牲状态 B 的准确度。

因此,我们需要一个统一的指标来告诉算法:“什么样的参数 $\mathbf{w}$才是全局最优的?遇到冲突时应该优先保哪个状态?” 这个指标就是 VE。

数学公式拆解

$\overline{VE}$ 的数学定义如下:

$\overline{VE}(\mathbf{w}) \doteq \sum_{s \in \mathcal{S}} \mu(s) \left[ v_\pi(s) - \hat{v}(s, \mathbf{w}) \right]^2$

把它拆成四个要素就非常直观了:

  1. 误差项$\left[ v_\pi(s) - \hat{v}(s, \mathbf{w}) \right]$

    • $v_\pi(s)$:状态$s$在策略 $\pi$ 下的真实价值(Ground Truth)。

    • $\hat{v}(s, \mathbf{w})$:我们用模型参数$\mathbf{w}$ 估计出来的价值。

  2. 平方操作 $(\cdot)^2$

    • 确保误差恒为正数,同时惩罚较大的差距,避免正负误差相互抵消。

  3. 权重分布 $\mu(s)$(最核心的部分)

    • $\mu(s)$ 是状态 $s$的访问频率(平稳分布,Stationary Distribution),满足 $\sum_s \mu(s) = 1$。

    • 它决定了每个状态的“重要性”:智能体越常踩到的状态,权重$\mu(s)$ 越高。

    • 这种设计非常合理——既然模型的容量有限,那就优先保证经常遇到的状态预测准确,而偶尔才遇到的极少数状态允许稍大一点的误差。

  4. 加权求和 $\sum_{s \in \mathcal{S}}$

    • 将所有状态按照各自的出现概率进行加权平均,算出一个全局的“平均平方差距”。

它的实际作用是什么?

在算法学习的过程中,我们的目标就是寻找一组最佳参数 $\mathbf{w}$,使得 $\overline{VE}(\mathbf{w})$ 的值最小。

梯度下降算法就是沿着 $\overline{VE}$对 $\mathbf{w}$ 的负梯度方向去不断微调参数的。可以说,$\overline{VE}$ 为整个函数逼近训练指明了优化方向。

3.随机梯度和半梯度方法

这两个概念是强化学习在处理参数化价值函数时,优化更新参数的两种不同手段。

简单来说:

  • 随机梯度方法: 算的是真正的、完整的梯度,只是用单个样本的估计代替了全量数据的平均值。

  • 半梯度方法: 故意忽略了目标项中的一部分梯度,只对估计值求导,算的是“不完整的梯度”。

1. 随机梯度方法 (Stochastic Gradient Method, SGD)

要理解“随机梯度”,首先来看“传统梯度下降”与“随机”的区别:

  • 全量梯度下降: 每次更新参数,都需要把所有可能的状态 $s \in \mathcal{S}$ 全部算一遍。但在强化学习中,状态空间可能无限大,这完全不可行。

  • 随机梯度(Stochastic): 每次只抽取一个当前踩到的样本状态 $S_t$,算出这个状态下的梯度并更新一次参数。只要采样的次数足够多,这些随机单步梯度的平均效果,就等于全量梯度的更新方向。

什么时候能用“真”随机梯度?

当你的更新目标(Target)$U_t$完全不依赖于当前的参数 $\mathbf{w}$ 时,算出来的就是真正的随机梯度。

最典型的例子是 蒙特卡洛(MC)方法:

它的目标$U_t = G_t$ 是从当前状态一直运行到游戏结束实际拿到的总回报。$G_t$是由环境和策略产生的真实数值,和当前的参数$\mathbf{w}$ 无关。

更新公式为:

$\mathbf{w}_{t+1} = \mathbf{w}_t + \alpha \left[ G_t - \hat{v}(S_t, \mathbf{w}_t) \right] \nabla \hat{v}(S_t, \mathbf{w}_t)$

  • 误差项 $\left[ G_t - \hat{v}(S_t, \mathbf{w}_t) \right]$:

    • 告诉我们预估偏高了还是偏低了。如果算出来的预测值偏小($G_t > \hat{v}$),误差为正,参数就需要朝着“能让估计值增大”的方向调整。

  • 梯度项 $\nabla \hat{v}(S_t, \mathbf{w}_t)$(敏感度 / 责任分配):

    • 告诉我们“调整哪一个参数,能够最有效地改变当前状态 $S_t$ 的估计值”。

假设模型是线性的:$\hat{v}(S_t, \mathbf{w}) = w_1 x_1 + w_2 x_2$

此时对权重求导,梯度就是特征向量:

$\nabla_{\mathbf{w}} \hat{v}(S_t, \mathbf{w}) = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}$

  • 如果当前状态下特征$x_1 = 0$(未激活),求导结果为 0。无论误差有多大,w1 的更新量都是 0。因为 w1压根没有参与当前状态的预测,不需要它承担责任。

  • 如果特征 x2 = 10(高度激活),求导结果为 10。w2 会分到很高的更新量,因为当前状态的预测值很大程度上是由 w2 决定的。

此时的梯度完全符合数学上的严谨求导,算法具有很好的收敛保障。

2. 半梯度方法 (Semi-gradient Method)

在强化学习中,相比等整局游戏结束的蒙特卡洛,我们更喜欢用时序差分(TD)方法,因为 TD 可以“边做边学”(自举 / Bootstrapping)。

TD 方法的目标$U_t$是:

$U_t = R_{t+1} + \gamma \hat{v}(S_{t+1}, \mathbf{w}_t)$

注意:这个目标$U_t$ 本身就包含了当前的参数 $\mathbf{w}_t$!

按理说,如果要对平方误差 $\frac{1}{2} \left[ U_t - \hat{v}(S_t, \mathbf{w}) \right]^2$ 求真实的完整梯度,你既要对预测项 $\hat{v}(S_t, \mathbf{w})$求导,也要对目标项里面的 $\hat{v}(S_{t+1}, \mathbf{w})$求导。

但 TD 方法采取了“假装不知道”的处理方式:

在求导数时,把目标项 $U_t = R_{t+1} + \gamma \hat{v}(S_{t+1}, \mathbf{w}_t)$ 当成一个固定的常数标签(Label),直接忽略它对$\mathbf{w}$的导数,只对预测项$\hat{v}(S_t, \mathbf{w})$求导。

因为数学上只算了一半的导数(丢掉了目标项的梯度),所以这种方法被称为“半梯度方法”。

它的更新公式形式和 MC 极其相似,但本质不同:

$\mathbf{w}_{t+1} = \mathbf{w}_t + \alpha \left[ \underbrace{R_{t+1} + \gamma \hat{v}(S_{t+1}, \mathbf{w}_t)}_{\text{ignore}} - \hat{v}(S_t, \mathbf{w}_t) \right] \nabla \hat{v}(S_t, \mathbf{w}_t)$

两者的核心对比

特性随机梯度方法 (SGD)半梯度方法 (Semi-gradient)
典型代表蒙特卡洛函数逼近 (MC)时序差分函数逼近 (TD)
目标项 $U_t$真实回报 $G_t$(不含 $\mathbf{w}$)估计值 $R_{t+1} + \gamma \hat{v}(S_{t+1}, \mathbf{w})$(含 $\mathbf{w}$)
求导处理计算完整的真实梯度忽略目标项对 $\mathbf{w}$的梯度,仅对预测项求导
收敛安全性非常高,稳定收敛至局部最优理论收敛保证较弱(结合非线性逼近+异轨策略时可能发散)
学习效率低(必须等待单局结束,方差大)高(可实时更新,方差小)

总结: 强化学习之所以广泛采用“半梯度”,是因为虽然它在数学求导上做了妥协,但换来了 TD 方法无需等待游戏结束、实时学习的高效率。

4.线性方法

在强化学习和机器学习中,线性方法(Linear Function Approximation) 的意思非常直观:预测出来的价值,完全是各个特征的“加权求和”。

它的数学形式只有加法和乘法,没有任何复杂的嵌套或激活函数:

$\hat{v}(s, \mathbf{w}) \doteq \mathbf{w}^T \mathbf{x}(s) = w_1 x_1(s) + w_2 x_2(s) + \dots + w_d x_d(s)$

这里包含两个关键部分:

  1. 特征向量$\mathbf{x}(s)$: 把状态$s$ 提取成一组具体数字。例如:$\mathbf{x}(s) = [\text{speed}, \text{distance}, \text{hp}]^T$。

  2. 权重向量 $\mathbf{w}$: 模型要学习的参数,代表每个特征对最终价值的重要程度(可正可负)。

一个直观的例子

假设你要评估在一款赛车游戏中,当前赛车状态的“胜率价值”:

  • 特征$x_1$(速度): $100 \text{ km/h}$

  • 特征$x_2$(距离终点): $2 \text{ km}$

  • 特征 $x_3$(剩余油量): $50\%$

如果采用线性方法,估算出的价值就是:

$\hat{v}(s) = (w_1 \times 100) + (w_2 \times 2) + (w_3 \times 50)$

如果经过学习后,算法得到的权重是 $w_1 = +0.5$(速度越快越好),$w_2 = -10$(距离越长越差),$w_3 = +0.2$(油越多越好):

$\hat{v}(s) = (0.5 \times 100) + (-10 \times 2) + (0.2 \times 50) = 50 - 20 + 10 = 40$

一个非常关键的误区:“对参数线性”

很多人以为“线性”指的是特征本身必须是一条直线。其实不是。

数学上所说的“线性方法”,指的是对参数 $\mathbf{w}$是线性的。特征 $x_i(s)$ 本身可以是非常复杂的非线性函数。

  • 例子: 即使你的特征包含了平方向或者交叉项,比如$x_1 = \text{v}^2$,$x_2 = \text{v} \times \text{d}$。

  • 只要模型的输出依然是 $\hat{v}(s) = w_1 \cdot (\text{v}^2) + w_2 \cdot (\text{v} \times \text{d})$,参数 $w_1, w_2$ 没有套在 sin、cos或指数函数里面,它依然属于线性方法。

在深度学习流行之前,强化学习绝大多数理论研究都是基于线性方法的。因为它有两个极其巨大的优势:

1. 求导结果超级简单(责任明确)

在上一轮我们推导的更新公式中,需要求梯度 $\nabla_{\mathbf{w}} \hat{v}(s, \mathbf{w})$。

对于线性模型,偏导数极其干净:$\hat{v}(s, \mathbf{w})$ 对 $w_i$ 求导,结果直接就是对应的特征 $x_i(s)$!

$\nabla_{\mathbf{w}} \hat{v}(s, \mathbf{w}) = \mathbf{x}(s)$

这使得更新公式变得非常简洁:

$\mathbf{w}_{t+1} = \mathbf{w}_t + \alpha \cdot \text{error} \cdot \mathbf{x}(S_t)$

2. 没有局部最优解(绝对收敛)

线性模型的均方误差损失函数是一个完美的凸函数(Convex Function),像一个碗的形状。这意味着:

  • 它只有一个全局最低点,没有各种陷阱(局部最优)。

  • 只要学习率 $\alpha$ 设置得当,无论是蒙特卡洛还是半梯度 TD,保证 100% 收敛。

线性方法 vs. 非线性方法(如神经网络)

比较维度线性方法(Linear)非线性方法(如深度神经网络)
表达式$\hat{v}(s) = \mathbf{w}^T \mathbf{x}(s)$$\hat{v}(s) = f(w_2 \cdot f(w_1 x + b_1) + b_2)$
特征来源需要人类手动设计特征(Feature Engineering)神经网络自动从原始数据提取特征
计算速度极快,消耗资源极少较慢,需要 GPU 计算
理论保障极强(必定收敛,有全局最优)较弱(可能陷入局部最优、发散)
表达能力受限(上限取决于人工特征设计得好不好)极强(几乎可以拟合任何复杂的非线性关系)

总结: 线性方法就是“加权求和”。虽然它的表达能力不如深度神经网络,但因为它计算快、数学性质好、绝对不发散,在很多特征明确的中小型工程问题中依然被广泛使用。

5.线性方法的特征构造

特征构造(Feature Construction / Feature Engineering) 在线性方法里的意思就是:把原始的、看似简单的状态数字,手动转换或扩充成多维的特征向量 $\mathbf{x}(s)$,从而让简单的“线性加权求和”能够拟合出复杂的非线性关系。

核心痛点:为什么必须做特征构造?

线性模型本身其实很“笨”——它只能做乘法加法 $\hat{v}(s) = w_1 x_1 + w_2 x_2 + \dots$。如果直接把原始状态当作特征,它只能拟合出一条过原点的平直线或平稳平面。

假设一个极简例子:

  • 真实的状态价值是一条抛物线曲线:$v(s) = s^2$。

  • 不做特征构造: 直接用原始状态$s$传给模型,特征就是 $x_1 = s$。线性模型是 $\hat{v}(s) = w_1 \cdot s$。这是一条直线,无论怎么调整 $w_1$,都绝对不可能拟合出弯曲的抛物线。

做了特征构造: 我们人为将特征升维,构造一个特征向量 $\mathbf{x}(s) = \begin{bmatrix} s \\ s^2 \end{bmatrix}$。此时线性模型变成了:

$\hat{v}(s) = w_1 \cdot s + w_2 \cdot s^2$

神奇的事情发生了: 模型依然是“对特征进行线性加权”,但通过改变 $w_2$ 的大小,它现在能够拟合出完美的二次曲线了!

强化学习中 4 种最经典的特征构造方法

在实际的强化学习问题中(比如连续控制、机械臂、赛车等),常见的特征构造手段有:

1. 多项式特征 (Polynomial Features)

直接将原始变量进行乘方或交叉组合。

例如,状态包含位置 $p$ 和速度 $v$,构造的特征向量可以是:$\mathbf{x}(s) = [1, p, v, p^2, v^2, p \cdot v]^T$。这样就能拟合出位置与速度之间复杂的协同效应。

2. 状态聚合 (State Aggregation)

把连续的状态空间切分成若干小区间(分箱)。

例如温度范围 [0, 100],切成:低温 [0, 30)、中温 [30, 70)、高温 [70, 100]。如果当前温度是 20,特征向量就是稀疏的独热码 [1, 0, 0]^T。

3. 瓦片编码 (Tile Coding) — 经典算法

强化学习中最流行的高维连续状态特征构造方法。 它用多套相互交错(偏移)的网格(Tilings)覆在状态空间上。

瓦片编码(Tile Coding)具体是如何把 2D 坐标变成二进制向量的

我们用一个极简的 2D 状态空间(比如赛车的位置 $x$和速度$v$)来演示这个过程。

场景与网格设置

假设状态的范围是 $x \in [0, 4]$,速度$v \in [0, 4]$。

我们设计 2 套相互重叠的网格(Tilings):

  • 每套网格都是 $2 \times 2$ 的划分(包含 4 个小格子/瓦片 Tile)。

  • 两套网格一共拥有 $4 + 4 = 8$ 个瓦片,所以生成的特征向量维度为 8 维。

网格 1 (Tiling 1,无偏移)             网格 2 (Tiling 2,向右上方偏移 1 单位)
+---------+---------+                 +---------+---------+
| Tile 2  | Tile 3    |               | Tile 6  | Tile 7    |
| (0-2,2-4)| (2-4,2-4)|               | (1-3,3-5)| (3-5,3-5)|
+---------+---------+                 +---------+---------+
| Tile 0  | Tile 1    |               | Tile 4  | Tile 5    |
| (0-2,0-2)| (2-4,0-2)|               | (1-3,1-3)| (3-5,1-3)|
+---------+---------+                 +---------+---------+

坐标转换步骤

假设当前赛车的坐标点是 $P = (2.5, 2.5)$(即位置 2.5,速度 2.5)。

第一步:检查第一套网格 (Tiling 1)

查看 $P(2.5, 2.5)$ 落在了 Tiling 1 的哪个格子:

  • $x = 2.5 \in [2, 4]$

  • $v = 2.5 \in [2, 4]$

  • 结论: 落在 Tile 3。

  • 生成局部向量: [0, 0, 0, 1](只有索引 3 位置填 1,其余为 0)。

第二步:检查第二套网格 (Tiling 2)

查看 $P(2.5, 2.5)$ 落在了偏移后的 Tiling 2 的哪个格子:

  • $x = 2.5 \in [1, 3)$

  • $v = 2.5 \in [1, 3)$

  • 结论: 落在 Tile 4。

  • 生成局部向量: [1, 0, 0, 0](只有索引 4 位置填 1,其余为 0)。

第三步:拼接成最终的稀疏特征向量

将两套网格的结果串联起来,得到一个 8 维的向量 $\mathbf{x}(s)$:

$\mathbf{x}(s) = [\,\underbrace{0,\, 0,\, 0,\, \mathbf{1}}_{\text{Tiling 1 (Tile 3)}},\, \underbrace{\mathbf{1},\, 0,\, 0,\, 0}_{\text{Tiling 2 (Tile 4)}}\,]$

为什么这叫“稀疏向量”?

  • 极度稀疏: 整个 8 维向量中,只有 2 个位置是 1,剩下的 6 个位置全是 0。

  • 规律: 如果你有 $N$ 套网格,那么无论特征向量总共有多少维(哪怕是 10,000 维),向量里 1 的个数恒等于$N$。在计算线性加权 $\mathbf{w}^T \mathbf{x}(s)$ 时,计算机只需要把这 $N$ 个激活位置对应的权重加起来即可,运算速度极快。

瓦片编码最神奇的地方:自动“泛化”

假设紧接着出现了一个非常接近的全新坐标 $P' = (2.6, 2.6)$:

  • $P'$ 在 Tiling 1 里依然落在 Tile 3;

  • $P'$在 Tiling 2 里依然落在 Tile 4;

  • 生成的向量和 $P$恰好完全相同。

这意味着模型会自动将 $P$ 学到的经验直接共享给 $P'$。

如果出现了一个稍远一点的坐标 $P'' = (2.5, 1.5)$:

  • 它在 Tiling 1 里落在 Tile 1 :对应位置变了;

  • 但在 Tiling 2 里依然落在 Tile 4 :保留了一个相同的 1!

因为共享了 1 个激活位,这两个状态的价值估算就会产生部分关联,这就是瓦片编码平滑泛化能力的来源。

4. 高斯径向基函数 (RBF, Radial Basis Functions)

在状态空间里提前放置 $K$个“锚点”(中心点 $\mathbf{c}_i$)。

每个特征的值由当前状态$s$ 距离锚点的远近决定:距离越近,特征值越接近 $1$(呈高斯钟形曲线)。它能产生极度平滑的非线性拟合效果。

6:非线性函数逼近:人工神经网络

在强化学习的价值函数逼近中,人工神经网络(Artificial Neural Network, ANN)就是一个“全自动的非线性拟合器”。

之前我们讲线性方法时,需要人类手动去做特征构造(比如设计瓦片编码)。而神经网络做的事情是:直接把原始状态输入进去(哪怕是游戏画面像素、传感器原始读数),让网络自己去学习如何提取特征,并直接输出估算的价值 $\hat{v}(s, \mathbf{w})$。

1. 神经网络是怎么实现“非线性”的?

神经网络能够拟合任意复杂的非线性函数,全靠它的基本单元——人工神经元(Neuron)。

一个神经元的计算过程分为两步:

  1. 加权求和(线性计算):把输入的特征向量 $\mathbf{x}$ 乘上权重 $\mathbf{w}$ 并加上偏置 $b$,算出一个线性结果 $z = \mathbf{w}^T \mathbf{x} + b$。

  2. 激活函数(非线性转换):把 $z$ 传进一个非线性函数 $\phi(z)$(如 ReLU、Sigmoid、Tanh)。

关键点: 如果没有激活函数,无论你叠加多少层神经网络,本质上都只是多项线性方程的组合,依然只能绘制“直线”或“平直超平面”。正是激活函数的折弯与转折,赋予了网络拟合各种曲线、曲面的能力。

2. 多层网络在强化学习中扮演什么角色?

如果把很多神经元按层堆叠起来,神经网络在强化学习里的分工非常清晰:

  • 隐藏层(自动特征构造器):隐藏层其实就在做我们之前手动做的事情——特征工程。前几层提取低阶特征,后几层组合出高阶特征。你可以把隐藏层的输出看作是网络自己帮我们生成的高级特征向量 $\boldsymbol{\phi}(s)$。

  • 输出层(线性评估器):最后一层对隐藏层提取出来的特征进行线性加权,输出最终的估算价值 $\hat{v}(s, \mathbf{w})$。

根据通用近似定理(Universal Approximation Theorem),一个包含足够多神经元的隐藏层神经网络,可以以任意精度逼近任何连续函数。

3. 线性逼近 vs 非线性神经网络逼近

对比维度线性逼近(如瓦片编码 + 线性模型)非线性逼近(人工神经网络)
特征来源依赖人类经验手动设计/分割网格网络自己学习,无需人工设计
适用状态低维连续状态(2~10 维)超高维状态(图像像素、自然语言、复杂传感器)
优化曲面凸优化(Convex):只有一个全局最优解非凸优化(Non-convex):存在大量局部最优和鞍点
收敛稳定性结合 TD 学习有严格的数学收敛保证结合半梯度 TD 容易产生发散爆掉的风险

我们用强化学习里最经典的案例——DeepMind 玩 Atari“打砖块”(Breakout)游戏,来看看神经网络是如何搞定“非线性函数逼近”的。

1. 痛苦的原始输入:只有一堆毫无意义的像素

在打砖块游戏中,算法看到的状态 $s$ 只是游戏画面截屏。

  • 假设图片裁剪并缩小为 $84 \times 84$的黑白网格,这意味着状态是由 $7056$ 个像素点的亮度数字 组成的超高维向量。

如果用线性模型(或者瓦片编码):

线性模型只能做简单的乘加:$\hat{v}(s) = w_1 \cdot \text{r}_1 + w_2 \cdot \text{r}_2 + \dots$

  • 线性模型只知道“第 300 个像素点比较亮”,但它根本无法理解“当第 300、301、302 个像素点同时亮起时,它们组合起来代表一颗小球”。

  • 你如果要用瓦片编码,就必须人工写代码去识别球的位置、球拍的位置、砖块剩余数量,这在图像面前几乎是不可能完成的人工工程。

2. 神经网络(ANN)是怎么一步步非线性处理的?

神经网络把这 $7056$个原始像素数字接进来后,通过多层隐藏层 + 非线性激活函数,把复杂的数据一层层加工:

隐藏层 1:提取低级特征(边缘与局部点)

  • 神经元结合 ReLU 激活函数(将负值置 0,保留正值),开始过滤噪声。

  • 这一层的神经元激活状态,表示画面里哪里有“横线”、哪里有“孤立的小方块”。

隐藏层 2 & 3:组合高级特征(物体与动态)

  • 将低级特征组合起来。几个神经元同时亮起时,网络“意识到”:“底部的横线是球拍,中间的小方块是小球”。

  • 如果连续输入 4 帧画面,网络甚至能通过像素的变化算出“小球正在以 45 度角斜着向下掉”。

输出层:线性加权得到最终价值$\hat{v}(s)$

  • 最后一层将前面提取出的高阶概念(如:“球拍在左边”、“球正落向左边”、“砖块还剩一大片”)进行线性汇总。

  • 输出一个最终的估计数值,比如$\hat{v}(s) = 85$分(表示当前这个局势非常有戏,胜率很高)。

3. 为什么这叫“非线性逼近”?

  • “非线性”在哪里?

    单个像素点变亮变暗,对整个局势的价值影响绝不是简单的“正比关系”。比如小球向下跌落时,在距离球拍 5 厘米和距离 1 厘米时,价值估计是陡峭变化的非线性曲线。正是因为网络里加了激活函数(折弯和截断),才能完美勾勒出这种陡峭的变化。

  • “全自动”体现在哪?

    人类从来没有在代码里写过“什么是球”、“什么是球拍”。神经网络完全是通过与环境交互,拿到奖励信号后,利用反向传播(Backpropagation)和梯度下降,自动调整网络中成千上万个权重 $w$。

权重调整好的结果就是:网络自己学会了看懂游戏画面,并精准预测当前画面的价值。

7:最小二乘时序差分

别被这个又长又响亮的名字吓到了;它听起来很复杂,但核心思想其实非常直观且优雅——它就是把原本需要一步步摸索的 TD 学习,变成了我们初中就学过的“解方程组”。

1. 普通 TD 遇到了什么痛点?

之前我们学普通的 TD(时序差分)更新时,逻辑是这样的:

每在环境中走一步,算出一个 TD 误差 $\delta$,然后乘上一个学习率 $\alpha$,把权重 $\mathbf{w}$ 往正确方向“小迈一步”:

$\mathbf{w} \leftarrow \mathbf{w} + \alpha \delta \boldsymbol{\phi}(s)$

这种方法(渐进梯度下降)有两个明显的痛点:

  1. 非常浪费数据(样本效率低):每条数据只用来更新一小步,想要收敛,模型必须在环境中重复跑成千上万次。

  2. 学习率 $\alpha$ 极难调:$\alpha$ 设大了容易震荡发散,设小了半天收敛不了。

2. 最小二乘时序差分(LSTD)的破局点

LSTD 的作者们思考了一个问题:既然我们用的是线性模型,为什么一定要像龟兔赛跑一样,用 $\alpha$ 一小步一小步去挪呢?

在线性逼近下,TD 学习达到收敛(期望更新量为 0)的时候,在数学上必然满足一个简单的线性方程组:

$\mathbf{A} \mathbf{w} = \mathbf{b}$

其中:

  • 矩阵$\mathbf{A}$:记录了状态转移过程中,特征与特征之间的统计相关性。

  • 向量 $\mathbf{b}$:记录了特征与获得的奖励(Reward)之间的关联。

既然是一元一次矩阵方程,何必一步步迭代?直接用线性代数求逆矩阵,一步到位算出最佳权重 $\mathbf{w}$:

$\mathbf{w} = \mathbf{A}^{-1} \mathbf{b}$

为什么叫“最小二乘”?

因为推导这个公式时,数学上是在寻找一个权重 $\mathbf{w}$,使得在所有收集到的样本上,投影后的 TD 误差平方和最小(和线性回归里的最小二乘法是同一个根基)。

普通 TD 是每看到一条样本,就用 TD 误差 $\delta$去微调一次 $w$。 而 LSTD 的终极目标是:把所有样本攒在一起,找到一个完美的 $w$,使得所有样本的“加权 TD 误差”总和刚好抵消为 0。

为什么要乘特征 $x_i$? 因为特征 $x_i$ 相当于“责任权重”。如果当前特征 $x_i = 0$(说明这个特征根本没激活),那这个样本产生的误差就不应该归咎于它;如果 $x_i$ 很长,它就要对这个误差负主要责任。

我们把 TD 误差 $\delta_i$ 的公式代进去:

  • 实际拿到的价值(目标):$r_i + \gamma \cdot (x_i' \cdot w)$ (其中 $x_i'$ 是下一个状态的特征)

  • 预估的价值:$x_i \cdot w$

所以,第 i 条样本的 TD 误差是:

$\delta_i = r_i + \gamma x_i' w - x_i w = r_i - (x_i - \gamma x_i') w$

把 $\delta_i$ 乘上它的责任权重 $x_i$:

$x_i \cdot \delta_i = x_i r_i - x_i (x_i - \gamma x_i') w$

我们要让所有样本的这个值加起来等于 0:

$\sum x_i r_i - \sum \left[ x_i (x_i - \gamma x_i') \right] w = 0$

把含 $w$ 的项移到等号右边:

$\underbrace{\sum \left[ x_i (x_i - \gamma x_i') \right]}_{\text{ } A} w = \underbrace{\sum x_i r_i}_{\text{ } b}$

这就变成了标准的一元一次方程:$A \cdot w = b$。

3. 一张表看懂:普通 TD vs LSTD

对比维度普通 TD(0)最小二乘时序差分(LSTD)
更新方式增量式(Incremental):来一条数据,迈一小步批处理/闭式解(Closed-form):解矩阵方程,一步到位
样本效率低(同一个样本需要看很多遍)极高(少量样本就能精准算出收敛解)
超参数需要极其小心地调节学习率 完全没有学习率 ,免去调参痛苦
计算复杂度极低:每步只需要 O(d)(d 是特征数量)较高:矩阵求逆需要 O(d^3)(或递推版 O(d^2))

我们举个极简的例子,你立刻就能明白普通 TD 和 LSTD 在“干活方式”上的根本区别。

假设有一个只有 2 个关卡的简单游戏,我们要估计关卡的价值 $V(s)$。

为了方便计算,我们用一个参数 $w$的线性模型来表示价值:$V(s) = w \cdot x$($x$ 是关卡的特征数)。

  • 关卡 A(特征 x = 1):通过后拿到 3 分奖励,并进入关卡 B。

  • 关卡 B(特征 x = 2):通过后拿到 10 分奖励,游戏结束。

  • 设定折扣因子 $\gamma = 0.5$。

我们收集到了这两条真实的通关数据:

  1. 样本 1:关卡 A $\rightarrow$关卡 B,获得奖励 R = 3

  2. 样本 2:关卡 B $\rightarrow$游戏结束,获得奖励 R = 10

我们要找出一个最佳的 w,来估计这两个关卡的价值。

方法一:普通 TD(像盲人摸象,一小步一小步挪)

普通 TD 猜答案的过程是这样的:

  1. 初始状态:假设 $w = 0$。此时它认为 $V(A) = 0$,$V(B) = 0$。

  2. 看到样本 1(A $\rightarrow$ B):

    • 实际拿到 3 分,加上未来的估计$0.5 \times V(B) = 0$,理想总分是$3 + 0 = 3$。

    • 但现在估算只有 $V(A) = 0$,产生误差 $\delta = 3 - 0 = 3$。

    • 乘以学习率(比如 $\alpha = 0.1$),把权重抬高一点:$w \leftarrow 0 + 0.1 \times 3 = 0.3$。

  3. 看到样本 2(B $\rightarrow$ 结束):

    • 实际拿到 10 分,但此时 $V(B) = 0.3 \times 2 = 0.6$,产生误差 $\delta = 10 - 0.6 = 9.4$

    • 再乘以学习率更新一点点 $w$……

结果:普通 TD 必须把这两条数据在代码里反复循环跑几十上百遍,让$w$像蜗牛一样一点一点挪动,最终才能慢慢收敛到理想值。如果学习率 $\alpha$ 设得不好,还会一直在附近震荡。

方法二:LSTD(把数据收集起来,一步到位解方程)

LSTD 根本不理会什么“学习率 $\alpha$”,它把两条样本往桌上一放,直接列方程组:

样本 1:关卡 A $\rightarrow$ 关卡 B

  • 当前特征 $x_1 = 1$,下一个关卡特征 $x_1' = 2$,拿到奖励 $r_1 = 3$。

我们来分别计算这一条样本贡献给 $A$和$b$的数字:

  • 贡献给 $A_1$:$x_1 (x_1 - \gamma x_1') = 1 \times (1 - 0.5 \times 2) = 1 \times (1 - 1) = 0$

  • 贡献给 $b_1$:$x_1 \times r_1 = 1 \times 3 = 3$

样本 2:关卡 B $\rightarrow$ 结束

  • 当前特征 $x_2 = 2$,下一个状态是游戏结束(特征 $x_2' = 0$),拿到奖励$r_2 = 10$。

计算这一条样本贡献给 $A$ 和 $b$ 的数字:

  • 贡献给 $A_2$:$x_2 (x_2 - \gamma x_2') = 2 \times (2 - 0.5 \times 0) = 2 \times 2 = 4$

  • 贡献给 $b_2$:$x_2 \times r_2 = 2 \times 10 = 20$

汇总求和,求解 $w$

现在把所有样本的贡献加起来:

  • 总的 A = A1 + A2 = 0 + 4 = 4

  • 总的 b = b1 + b2 = 3 + 20 = 23

列出最终方程:

$4 \cdot w = 23 \implies w = \frac{23}{4} = 5.75$

结果:只需要进行一次普通的除法(求逆),LSTD 瞬间计算出完美结果 w = 5.75。

4. 这么厉害,为什么深度学习/大模型不用它?

LSTD 在传统线性强化学习(比如结合瓦片编码、基函数)时代被誉为“最强样本效率算法”,但在今天的深度强化学习中,大家却很少用它,原因有两个:

  1. 算不动(维度灾难):

    矩阵求逆的计算量是特征维度 $d$的三次方($O(d^3)$)。如果特征数 $d = 100$,求逆瞬间完成;但如果像深度学习那样,特征数或参数量$d$达到了几百万甚至上百亿,矩阵求逆的计算量会直接让顶级算力瘫痪。

  2. 只对线性模型有效:

    $\mathbf{A}\mathbf{w} = \mathbf{b}$ 的推导前提是“价值函数是平直的线性组合”。一旦换成人工神经网络这种复杂的非线性模型,就无法直接写出闭式解方程组了。

所以,LSTD 完美展现了经典线性 RL 的“优雅”:在特征维度可控时,它能用纯粹的数学推导,以极致的样本效率和零调参代价算出最优解。

8:基于记忆的函数逼近

1. 先对比:“参数化” vs “基于记忆”

我们之前讲的神经网络、线性模型、瓦片编码,都属于参数化方法(Parametric Methods):

  • 做法:模型在训练时看海量数据,把规律“浓缩”进一组固定数量的参数/权重 $\mathbf{w}$ 里。训练完成后,原始训练数据全部扔掉。

  • 预测时:输入状态 $s$,直接带入公式 $\hat{v}(s) = f(s; \mathbf{w})$ 算出一个值。

  • 缺点:如果遇到新情况,容易发生“灾难性遗忘”(为了记住新的,把旧的权重冲掉了)。

而基于记忆的方法(Memory-based / Non-parametric Methods) 完全反过来:

  • 做法:它根本不训练固定的权重 $\mathbf{w}$,而是开辟一个“数据库/记忆库”,把在环境中经历过的真实状态和对应价值直接存起来:$\text{mem} = \{(s_1, v_1), (s_2, v_2), \dots, (s_N, v_N)\}$。

  • 预测时:当遇到一个新状态 $s$ 时,它会跑去记忆库里检索:“以前有没有经历过和我现在很像的状态?”然后把最相似的几个旧记忆拿出来做加权平均。

2. 基于记忆的方法是如何工作的?

我们用最经典的核平滑 / 局部加权平均(Kernel Smoothing / Locally Weighted Average) 为例,看看它预测一个新状态价值的完整 4 个步骤。

假设记忆库里已经存了 3 条历史经历:

  • 经历 1:状态 $s_1 = 4$,真实价值 $v_1 = 10$

  • 经历 2:状态 $s_2 = 7$,真实价值$v_2 = 25$

  • 经历 3:状态 $s_3 = 12$,真实价值 $v_3 = 50$

现在,智能体来到了一个新的未知状态 $s_{query} = 5$,需要估算它的价值 $\hat{v}(5)$。

第 1 步:计算新状态与记忆库中各个状态的“距离” $d_i$

距离越小,说明情况越相似。这里我们用最基础的绝对距离 $d_i = \vert{}s_{query} - s_i\vert{}$:

  • 与经历 1 的距离:$d_1 = \vert{}5 - 4\vert{} = 1$

  • 与经历 2 的距离:$d_2 = \vert{}5 - 7\vert{} = 2$

  • 与经历 3 的距离:$d_3 = \vert{}5 - 12\vert{} = 7$

第 2 步:将距离转化为“相似度权重” $w_i$

距离越大,相似度越低,权重应该越小。我们使用最直观的倒数加权(距离倒数 $w_i = \frac{1}{d_i}$):

  • 经历 1 的权重:$w_1 = \frac{1}{d_1} = \frac{1}{1} = 1.0$

  • 经历 2 的权重:$w_2 = \frac{1}{d_2} = \frac{1}{2} = 0.5$

  • 经历 3 的权重:$w_3 = \frac{1}{d_3} = \frac{1}{7} \approx 0.143$

第 3 步:归一化权重(让所有权重加起来等于 1)

这一步是为了做合理的加权平均,必须保证所有权重之和等于 1。

  1. 先求总权重和:

    $\text{Sum} = w_1 + w_2 + w_3 = 1.0 + 0.5 + 0.143 = 1.643$

  2. 计算归一化后的权重 $W_i = \frac{w_i}{\text{Sum}}$:

    • $W_1 = \frac{1.0}{1.643} \approx 0.609$(占约 60.9% 的话语权)

    • $W_2 = \frac{0.5}{1.643} \approx 0.304$(占约 30.4% 的话语权)

    • $W_3 = \frac{0.143}{1.643} \approx 0.087$(占约 8.7% 的话语权)

第 4 步:加权汇总,得到预测价值$\hat{v}(5)$

把每个历史经历的价值$v_i$ 乘以对应的归一化权重 $W_i$,然后相加:

$\hat{v}(5) = W_1 \cdot v_1 + W_2 \cdot v_2 + W_3 \cdot v_3$

代入具体的数值:

$\hat{v}(5) = (0.609 \times 10) + (0.304 \times 25) + (0.087 \times 50)$

$\hat{v}(5) = 6.09 + 7.60 + 4.35 = \mathbf{18.04}$

结论:模型估算出状态 $s = 5$ 的价值约为 18.04。整个过程没有训练任何网络参数,完全依靠记忆库中的局部数据现场计算。

3. 常见种类与强化学习应用

在实际使用中,基于记忆的方法有几种变体:

  1. k-近邻法(k-NN):只挑距离最近的前 k个记忆做平均,其他的直接扔掉。

  2. 局部加权回归(Locally Weighted Regression, LWR):不只是简单平均,而是在新状态附近的这几条记忆上,现场拟合一条局部的小直线/小平面。

  3. 情景记忆强化学习(Episodic Memory RL):比如 Model-Free Episodic Control (MFEC) 算法。智能体把通关成功的完整状态轨迹和回报存入记忆库,下次遇到相似情境,直接照搬当年成功经验的动作和价值。

对比维度参数化逼近(如神经网络)基于记忆的函数逼近(如 LWR / 记忆库)
学习速度慢(需要无数次梯度下降去调权重)极快(拿到数据直接往数据库里存就行)
预测速度极快(一次前向传播 O(1))慢(每次预测都要在记忆库里搜索近邻 O(N))
内存开销固定且小(只需要存网络参数 )随时间膨胀(数据越多,记忆库越大)
灾难性遗忘严重(更新新权重会破坏旧记忆)几乎没有(旧数据好端端存在数据库里)

基于记忆的方法就像人类的“肌肉记忆”或“经验检索”——在刚接触新环境、数据量极少时,它能凭借几条关键的成功记忆快速做出明智决定;但在数据量极大、环境极其复杂时,查数据库的成本太高,就需要交给神经网络这种参数化方法了。

9:核函数函数逼近

上一轮我们在算记忆库里两个状态的相似度时,用了最原始的倒数距离 $\frac{1}{d}$。这种做法有两大缺点:一是曲线不够平滑,容易被噪点干扰;二是无法处理复杂的高维非线性关系。

核函数逼近的核心思想是:引入一个数学上严谨、光滑的“核函数(Kernel Function)” K(s, s') 来精准衡量两个状态的相似程度。

1. 什么是核函数?

最经典、最常用的核函数是高斯核函数(Gaussian RBF Kernel):

$K(s, s') = \exp\left( -\frac{\Vert{}s - s'\Vert{}^2}{2\sigma^2} \right)$

我们把公式里的每一个变量拆开来看:

  • s:当前需要估计的新状态。

  • s':记忆库里的某个历史状态。

  • $\Vert{}s - s'\Vert{}^2$:两个状态之间的距离平方。

  • $\sigma$(Sigma,核宽):一个由我们设定的超参数。$\sigma$ 越大,平滑范围越广;$\sigma$ 越小,模型越关注极近距离的记忆。

  • $K(s, s')$:计算出来的相似度得分,数值严格限制在 0 到 1之间(距离完全重合时为 1,距离很远时迅速趋向于 0)。

核函数逼近远不止“做光滑加权”这么简单。它在数学上隐藏着一个非常惊艳的物理解释——核技巧(Kernel Trick)。

假设在平面(2维)上有两类点:红点全在圆心附近,蓝点环绕在外面。

在 2 维平面上,你无论怎么画直线的线性切刀,都绝对无法把红点和蓝点分开。

怎么办?数学家想了个办法:把这些点从 2 维映射到 3 维! 比如把每个点 $x = (x_1, x_2)$,通过一个变换函数 $\phi(x)$,变成 3 维坐标:

$\phi(x) = \left( x_1^2, \ \sqrt{2} x_1 x_2, \ x_2^2 \right)$

映射到 3 维空间后,原本拱起的数据就被“拉高”了,此时我们拿一张平整的纸(3 维平面),就能一刀把它们完美切开!

但是,麻烦来了: 如果我们要算两个点映射后的高维点积$\langle \phi(x), \phi(y) \rangle$,计算量会随着维度暴涨。

我们准备两个简单的 2 维原始坐标,一步步算给你看:

  • 状态 $x = (2, 3)$ (即 $x_1 = 2, x_2 = 3$)

  • 状态 $y = (4, 5)$ (即 $y_1 = 4, y_2 = 5$)

我们的目标是:算出它们升维后的高维点积 $\langle \phi(x), \phi(y) \rangle$。

路线 A:硬算(不使用核技巧,老老实实升维)

我们要先分别把 x 和 y 转换成 3 维向量,然后再做点积。

第 1 步:把 x = (2, 3)转换成 3 维向量 $\phi(x)$

$\phi(x) = \left( x_1^2, \ \sqrt{2} x_1 x_2, \ x_2^2 \right)$

所以,$\phi(x) = (4, \ 6\sqrt{2}, \ 9)$。

第 2 步:把 $y = (4, 5)$ 转换成 3 维向量 $\phi(y)$

所以,$\phi(y) = (16, \ 20\sqrt{2}, \ 25)$。

第 3 步:计算 3 维向量的点积 $\langle \phi(x), \phi(y) \rangle$

将对应分量相乘后再相加:

$\langle \phi(x), \phi(y) \rangle = (4 \times 16) + (6\sqrt{2} \times 20\sqrt{2}) + (9 \times 25)$

相加:529

路线 A 总结:我们算开方、算平方、把数据升到 3 维,折腾了一大通,最后算出的答案是 529。

路线 B:偷懒(使用“核技巧”)

核技巧说:你根本不需要知道 3 维向量长什么样,直接在原本的 2 维数据上套用核函数公式 $K(x, y) = (x^T y)^2$,就能拿到一模一样的答案!

我们来看看用核公式怎么算:

第 1 步:在 2 维原始数据上算普通点积 $x^T y$

$x^T y = (2 \times 4) + (3 \times 5) = 8 + 15 = 23$

第 2 步:直接套用核函数求平方

$K(x, y) = (23)^2 = \mathbf{529}$

理由:

回到映射:

  • 式 A(核公式):$x_1^2 y_1^2 + 2 x_1 x_2 y_1 y_2 + x_2^2 y_2^2$

  • 式 B(升维点积):$x_1^2 y_1^2 + 2 x_1 x_2 y_1 y_2 + x_2^2 y_2^2$

两式逐字逐句完全一致!

默瑟定理(Mercer's Theorem)

看完上面的推导,你可能会问:“这是因为我们刚好凑出了 $\phi(x)$,那对于那些复杂的核函数(比如高斯核),我们怎么知道它对应什么高维映射?”

数学家默瑟(Mercer)证明了一个极其伟大的定理(默瑟定理):

只要一个核函数 $K(x, y)$满足连续性和平移对称半正定(即满足“默瑟条件”),那么数学上就绝对存在某一个高维(甚至是无限维)的映射 $\phi(x)$,使得 $K(x, y) = \langle \phi(x), \phi(y) \rangle$ 恒成立。

这就意味着:我们根本不需要去关心 $\phi(x)$ 到底长什么样、维度有多高。只要我们选用的核函数符合数学规范,我们就敢 100% 保证:直接算 K(x, y),就等于在某个庞大的高维空间里做了一次精准的点积!

深度学习之Encoder-Only原理与实战 【代码】深度学习之Encoder-Only原理与实战。 阅读详情

相关推荐

深度学习之Seq2Seq原理与实战

【代码】深度学习之Seq2Seq原理与实战。

yumiwangzi30的博客 136

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 198

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 189

图解循环神经网络(RNN)

RNN(循环神经网络)就是“带记忆的网络”:让网络拥有一块“记忆”,在处理当前数据时,能同时参考之前看过的内容;它不一次性看完全部输入,而是像人读书一样,一个字一个字地读,每读一个字就更新一次脑子里的记忆,然后用这份记忆去理解当前这个字。但便签一直在被改写,新信息不断挤占旧信息,传到第 40 步时,“巴黎”的痕迹已经淡得几乎没了。读到“贵”的时候,网络并没有重新去查“好看”这个词——但“好看”的影响已经融在了便签里(那个 1.5)。这三个困难的共同点:答案不在当前这一个字里,而在“前面那串东西”里。

技术管理两手抓,两手都要硬. 369

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 260

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 225

【原创深度学习项目】基于深度学习的建筑工地防护装备检测系统|安全帽与反光衣检测系统(RT-DETR-L 模型)

本文设计并实现了一套基于RT-DETR-L的建筑工地防护装备检测系统,采用Django+Vue前后端架构,实现对安全帽、反光背心等7类装备及“无PPE”“未戴安全帽”等缺失状态的精准识别。系统支持图片、视频、摄像头实时检测,具备参数可调、数据可视化与统计分析功能,有效解决小目标漏检、误检及管理难问题,助力智慧工地安全管理落地。文末可获取源码。

qq_1445749146的博客 217

深度学习之LSTM原理与实战

【代码】深度学习之LSTM原理与实战。

yumiwangzi30的博客 131

神经网络入门指南:从 CNN、RNN 到 Attention

神经网络的学习,本质是“预测—比较—纠错”的循环;CNN 通过局部连接与权重共享理解图像;RNN 通过隐藏状态传递上下文;LSTM 和 GRU 用门控机制管理记忆;Encoder–Decoder 把理解与生成拆成两个阶段;Attention 则让模型在每一步都能主动寻找最相关的信息。到这里,我们已经走完了从普通神经网络到 Attention 的完整路线。下一篇将正式进入 Transformer,看看它如何摆脱 RNN 的顺序计算,又如何让每个 Token 直接找到与自己相关的信息。

爱敲代码的小黄 359

【信息科学与工程学】【通信工程】第一百九十一篇 路由器体系结构01

编号类型领域问题详细的数学分析参数列表(表达式 / 数值范围 / 边界 / 测量)关联知识1路由控制平面 · 图论 / 优化最短路径 / 最优下一跳如何计算?收敛边界?图模型​ G=(V,E),w:E→R+; SPF = Dijkstra O(∥E∥log∥V∥);BGP 策略用稳定路径问题 SPP(NP-hard),用博弈/不动点分析。收敛界:失效检测 tdetect​+tspf​+tupdate​,收敛时间 τ≤thold​+4RTT(BGP)。可用 Lyapunov​ 分析路由震荡。V: 节点数(10

weixin_49199313的博客 394

AI对战五子棋——深度学习策略网络

在本篇博文中,我们完成了:✔ 构建一个 CNN 五子棋策略网络✔ 让神经网络输出落子概率✔ 使用 Policy Gradient 强化学习训练 AI✔ 让 AI 实现人与 AI、AI 自对弈博弈。

X2829352498的博客 26

基于深度学习的垃圾分类系统的设计与实现

本系统是一个基于 Flask Web 框架与 PyTorch 深度学习模型的垃圾分类智能识别平台。系统面向垃圾图像分类场景,能够对上传图片中的玻璃、纸张、纸板、塑料、金属、其他垃圾等六类垃圾进行自动识别与置信度评估,并提供识别历史、数据统计、模型在线训练与记录导出等完整功能。系统使用 TrashNet 公开垃圾分类数据集进行模型训练,管理员可手动发起模型训练,训练完成后自动加载新权重。启动服务不会自动训练。

aiyuanma_vip的博客 385

图像质量评估:使用 SSIM 计算图像相似性

在图像处理领域,衡量两幅图像之间相似性的一种常见方法是使用结构相似性指数(SSIM)。SSIM 是一种全参考的图像质量评估指标,它不仅考虑了图像的亮度、对比度,还考虑了结构信息。在本文中,我们将介绍一个使用 Python 和 OpenCV 实现的 SSIM 计算脚本,并使用该脚本评估两幅图像的相似性。

hasque2019的博客 1153

CNN 卷积神经网络深度解析:卷积、池化与特征提取的底层原理

卷积核(Kernel),也叫滤波器(Filter),本质上是一个可以训练的权重矩阵。1 0 -11 0 -11 0 -1这个卷积核可以对图像中的局部像素进行加权计算。不同的卷积核能够提取不同类型的特征:水平边缘特征垂直边缘特征纹理特征角点特征局部形状特征在传统图像处理中,滤波器通常由人工设计。而在 CNN 中,卷积核的权重通过训练数据和反向传播自动学习得到。这也是 CNN 能够自动提取图像特征的关键。# 第一层卷积padding=1# 第二层卷积padding=1。

2503_90237586的博客 243

群晖NAS下docker安装MySql

本文将一步一步讲解如何在群晖NAS的docker中启用一个MySQL容器 , 算是初学者对问题解决的一个记录.

qq_46375248的博客 5977

科研党必看!Zotero+Claude3插件实战:如何用AI高效阅读文献(附详细配置步骤)

本文详细介绍了如何通过Zotero与Claude3插件的深度整合,实现科研文献的高效阅读与管理。从环境配置到核心功能实战,包括智能摘要生成、精准学术翻译和论文写作辅助等,帮助科研人员大幅提升工作效率。特别适合需要处理大量文献的研究者使用。

o0p1q2r3的博客 433

图解常用深度学习优化器

来隐式构造 Hessian 逆的近似,从而直接估计出“谷底在哪”,而非仅仅判断“哪边最陡”。即SGD/Adam 主要看“当前坡度”,LBFGS 还会看“最近几步坡度怎么变”,像用局部地形图来规划路线。训练 Transformer 时,有些层梯度大,有些层梯度小。如果用 Adam + L2,梯度大的参数反而可能被“少衰减”,正则效果不稳定;:你要下山,但每次迈步前都要派侦察兵把整座山的每一个坡面都测量一遍,算出“绝对最陡”的方向才走一步。:还是下山,但这次你只问身边一个路人“哪边最陡”,然后就走。

技术管理两手抓,两手都要硬. 200

AI人工智能与TensorFlow的教育科技应用

随着科技的飞速发展,AI人工智能在各个领域都展现出了巨大的潜力,教育领域也不例外。本文章的目的在于深入探讨AI人工智能与TensorFlow在教育科技中的具体应用,包括智能教学系统的开发、学生学习情况的评估与预测等方面。范围涵盖了从基础概念到实际项目应用的各个层面,旨在为教育科技工作者和相关研究者提供全面且深入的技术指导。本文将首先介绍AI人工智能和TensorFlow的核心概念及其联系,让读者对相关技术有基本的了解。接着详细讲解核心算法原理和具体操作步骤,并结合数学模型和公式进行深入分析。

AI智能探索者的博客 1697

基于深度学习的猫图像目标检测方法研究:YOLOv8s模型海选、多种子对比训练与Django+ONNX部署实现详解

本课题基于深度学习研究猫图像目标检测问题。数据集含1000张猫图像、1188个标注框,按固定比例划分并冻结清单;训练前在多个候选族中短训海选,确定YOLOv8s为主模型,经学习率搜索与显存标定后完成150轮训练,验证集mAP50达到0.92,并以7个随机种子的对比实验验证稳定性。最优权重导出为ONNX接入Django系统,提供图片、视频、摄像头三种识别方式,配套识别记录管理与统计大屏,形成从训练到应用的完整闭环。

WEIXIN_JSJBSZDS的博客 184

使用R语言读取和处理CSV数据集

查看数据集的结构str(data)# 查看数据集的摘要统计信息str()函数将显示数据集的结构信息,包括变量名称、类型和前几行的值。summary()函数将提供数据集的摘要统计信息,如均值、中位数、最小值、最大值等。

CyberGenius的博客 3856

【微服务】Spring AI Alibaba Jmus 从部署到项目实战详解

Spring AI Alibaba Jmus 从部署到项目实战详解

congge 4188

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

qq_2529413168的博客 184

51智能小车(双轮)

前几天接了个小单子,是一个基于51单品机的作品,发现自己对小车的认识还是不太🆗。也算是完成了任了的;欢迎各位小伙伴来多多交流,大家一起进步。最后有需要单片机课程设计的小伙伴滴滴我哦(有偿)。企鹅:2397746994。

qq_56992543的博客 2348

深度学习0:数学知识:正态分布2(积分,幂函数积分公式)

积分符号∫(\int∫= 把无数个极窄的小矩形面积(高度×dx(\times dx×dx))“拼接”起来。dx(dxdx= 无穷小的宽度。定积分的结果= 曲线下方的总面积(一个具体的数字)。不定积分= 寻找求导前的那个原函数。这就是“积分求面积”最朴素的意思!

tellmewhoisi的博客 210

Android 13.0 设置默认屏幕亮度百分比

在13.0的系统ROM产品开发中,在一些产品开发中,对于设置默认屏幕亮度和屏幕亮度百分比的功能,在开发中也是常见的功能,在10.0的平台设置可能有一些不同,一般的都是在SettingProvider中设置就可以了 在11.0以后的系统中设置默认屏幕亮度的方法就不同了,接下来具体分析功能的实现

安卓兼职framework和app工程师的博客 1560

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python毕设实战:YOLO11+Django实现基于深度学习的面部关键特征识别与检测系统(附核心代码)

针对人脸图像中五官特征自动定位的需求,本文设计并实现了基于深度学习的面部关键特征识别与检测系统。系统采用Python开发,使用约2793张标注图片完成YOLO11模型的训练与对比实验,支持导出PyTorch与ONNX格式;网站端基于Django与Vue构建,提供图片识别、视频识别、摄像头实时识别三种方式,识别结果写入历史记录,并通过统计大屏展示类别分布等数据。测试表明系统运行稳定,检测效果直观,具备一定实用价值。

WEIXIN_JSJBSZDS的博客 196

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 统计学习方法:PCA
下一篇: 强化学习与神经科学的殊途同归
黑箱内外
博客等级 码龄5年 1062粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值