第十四章 深度学习 -- 基于模型的方法

一、模型的作用与分类

1.1 环境模型的定义

环境模型(environment model) 是一个学习到的二元转移模型:

P^(s′∣s,a)≈P(s′∣s,a),R^(s,a,s′)≈R(s,a,s′) \hat P(s' \mid s, a) \approx P(s' \mid s, a), \quad \hat R(s, a, s') \approx R(s, a, s') P^(s′∣s,a)≈P(s′∣s,a),R^(s,a,s′)≈R(s,a,s′)

有了模型,智能体可以在不与环境真实交互的情况下"想象"轨迹(rollout),并用这些想象来改进策略。这是基于模型方法的全部动机。

模型的两种等价形式:

形式 表达式 适用
概率模型 P^(s′∣s,a)\hat P(s'\mid s,a)P^(s′∣s,a), R^(s,a)\hat R(s,a)R^(s,a) 环境有随机性、需不确定性估计
确定性模型 s^′=fϕ(s,a)\hat s'=f_\phi(s,a)s^′=fϕ(s,a), r^=gϕ(s,a)\hat r=g_\phi(s,a)r^=gϕ(s,a) 环境近似确定、希望训练稳定

二者并非互斥------确定性模型可视为概率模型的特例(P^=δ(s′−s^′)\hat P=\delta(s'-\hat s')P^=δ(s′−s^′),Dirac 分布)。

标准监督学习框架:

给定数据集 D={(si,ai,si′,ri)}i=1N\mathcal{D}=\{(s_i,a_i,s'i,r_i)\}{i=1}^ND={(si,ai,si′,ri)}i=1N(由策略 πdata\pi_\text{data}πdata 收集),模型学习的目标是

L(ϕ)=−E(s,a,s′)∼Dlog⁡P\^ϕ(s′∣s,a) \mathcal{L}(\phi)= -\mathbb{E}_{(s,a,s')\sim\mathcal{D}}\\log\\hat P_\\phi(s'\\mid s,a) L(ϕ)=−E(s,a,s′)∼DlogP\^ϕ(s′∣s,a)

或对确定性模型取均方误差

L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2 \mathcal{L}(\phi)=\mathbb{E}_{(s,a,s')\sim\mathcal{D}}\\\|f_\\phi(s,a)-s'\\\|\^2 L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2

训练方式是标准的随机梯度下降,与监督学习几乎没有区别。

"模型"不等于"环境的副本":

一个常被误解的点是:以为学到的模型必须全局准确 ,能预测环境所有维度的细节。这是错误的------模型只需要在与决策相关的维度 上准确。例如在 Atari 游戏中,背景天空的颜色对策略选择毫无影响,模型预测天空用粗略插值即可;只有关键对象(敌人、道具、角色位置)的预测需要精细。这意味着可以设计部分模型(partial model) 或 特征空间模型(latent-space model)(Dreamer 系列的核心思想),把算力集中在有用维度上。

1.2 白盒模型与黑盒模型

维度 白盒模型 黑盒模型
假设 已知物理规律或解析形式 完全从数据学习
参数 已知(如质量、重力) 需要估计
例子 刚体动力学方程、电路仿真 神经网络预测下一状态
精度 高(若假设正确) 依赖训练数据
适用 结构已知、规律稳定 规律未知或过于复杂

黑盒模型内部实现:

s^′=fϕ(s,a),r^=gϕ(s,a) \hat s' = f_\phi(s, a), \quad \hat r = g_\phi(s, a) s^′=fϕ(s,a),r^=gϕ(s,a)

其中 fϕ,gϕf_\phi, g_\phifϕ,gϕ 是神经网络。

1.3 基于模型与无模型的对比

维度 基于模型 无模型
是否需要模型 需要学习 不需要
样本效率 高(可"想象"大量数据) 低(只能用真实数据)
计算开销 高(训练模型 + 规划) 较低
模型偏差 有(模型不准则规划错) 无
适用场景 环境有规律、数据昂贵 环境复杂、数据便宜

核心权衡 :基于模型方法的"想象数据"是免费的吗?不是------它受模型误差 限制。模型预测越离谱,想象轨迹就越不可信,规划反而更差。这就是 MBPO(§4.1)只做短程想象而非长程 rollout 的原因。

二、模型学习

2.1 确定性模型的回归

确定性模型 假设给定 (s,a)(s, a)(s,a) 后下一状态唯一:

s^′=fϕ(s,a) \hat s' = f_\phi(s, a) s^′=fϕ(s,a)

用回归训练:

L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2 \mathcal{L}(\phi) = \mathbb{E}_{(s, a, s') \sim \mathcal{D}}\left \\left\\\| f_\\phi(s, a) - s' \\right\\\|\^2 \\right L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2

python 复制代码
class DynamicsModel(nn.Module):
    def __init__(self, state_dim, action_dim, hidden=400):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim + action_dim, hidden), nn.SiLU(),
            nn.Linear(hidden, hidden), nn.SiLU(),
            nn.Linear(hidden, hidden), nn.SiLU(),
            nn.Linear(hidden, state_dim),
        )

    def forward(self, s, a):
        return self.net(torch.cat([s, a], dim=-1))

优点 :损失简单、训练稳定、推理快。缺点:无法表达环境的随机性(如摩擦系数的随机变化、风的扰动)。

2.2 概率模型的密度估计

概率(随机)模型 假设下一状态有分布:

P^(s′∣s,a)=N(μϕ(s,a),Σϕ(s,a)) \hat P(s' \mid s, a) = \mathcal{N}(\mu_\phi(s,a), \Sigma_\phi(s,a)) P^(s′∣s,a)=N(μϕ(s,a),Σϕ(s,a))

用负对数似然训练:

L(ϕ)=−E(s,a,s′)∼Dlog⁡P\^(s′∣s,a) \mathcal{L}(\phi) = -\mathbb{E}_{(s,a,s') \sim \mathcal{D}}\left \\log \\hat P(s' \\mid s, a) \\right L(ϕ)=−E(s,a,s′)∼DlogP\^(s′∣s,a)

其中 Σϕ\Sigma_\phiΣϕ 可以是:

  • 固定对角协方差 :网络只输出 μ\muμ,Σ\SigmaΣ 取常量(最简单、常用)。
  • 状态依赖对角 :网络输出 log⁡σ\log \sigmalogσ。
  • 完整协方差 :网络输出 μ\muμ 与 Cholesky 分解的下三角矩阵 LLL,Σ=LL⊤\Sigma = LL^\topΣ=LL⊤。

完整协方差能表达维度间相关性(如位置与速度相关),但参数量大、易数值不稳定。

python 复制代码
class ProbDynamicsModel(nn.Module):
    def __init__(self, state_dim, action_dim, hidden=400):
        super().__init__()
        self.trunk = nn.Sequential(
            nn.Linear(state_dim + action_dim, hidden), nn.SiLU(),
            nn.Linear(hidden, hidden), nn.SiLU(),
            nn.Linear(hidden, hidden), nn.SiLU(),
        )
        self.mu = nn.Linear(hidden, state_dim)
        self.log_std = nn.Linear(hidden, state_dim)

    def forward(self, s, a):
        h = self.trunk(torch.cat([s, a], dim=-1))
        mu = self.mu(h)
        log_std = self.log_std(h).clamp(-5, 2)
        return Normal(mu, log_std.exp())

2.3 集成与不确定性估计

模型预测的不确定性 是基于模型方法的核心信息:

  • 偶然不确定性(aleatoric):环境的固有随机性,无法通过更多数据消除。
  • 认知不确定性(epistemic):模型对未见数据的无知,可以通过更多数据消除。

集成(ensemble) :训练 KKK 个独立初始化的模型,用它们的预测分歧程度估计认知不确定性:

Eϕμϕ(s,a)±Eϕμϕ(s,a)2−Eϕμϕ(s,a)2 \mathbb{E}{\phi}\\mu_\\phi(s,a) \pm \sqrt{\mathbb{E}{\phi}\\mu_\\phi(s,a)\^2 - \mathbb{E}_\phi\\mu_\\phi(s,a)^2} Eϕμϕ(s,a)±Eϕμϕ(s,a)2−Eϕμϕ(s,a)2

分歧大 → 模型没见过这类数据 → 应主动探索或降低规划深度。

aleatoric vs epistemic 不确定性对照:

维度 aleatoric(偶然) epistemic(认知)
来源 环境本身的固有随机性 模型对未见数据的无知
能否靠更多数据消除 不能 能
建模方式 概率模型 Σϕ(s,a)\Sigma_\phi(s,a)Σϕ(s,a) 直接捕获 集成分歧、dropout、深度集成
对规划的影响 即便数据多也要纳入(噪声客观存在) 决定是否降低规划深度或主动探索

集成估计的公式与决策逻辑:

训练 KKK 个独立初始化模型 {μϕk}k=1K\{\mu_{\phi_k}\}{k=1}^K{μϕk}k=1K,在 (s,a)(s,a)(s,a) 上的预测均值 μˉ=1K∑kμϕk\bar\mu=\frac{1}{K}\sum_k\mu{\phi_k}μˉ=K1∑kμϕk 与分歧 σens=Vark(μϕk)\sigma_\text{ens}=\sqrt{\text{Var}k(\mu{\phi_k})}σens=Vark(μϕk) 。

决策规则 :若 σens(s,a)>τ\sigma_\text{ens}(s,a)>\tauσens(s,a)>τ(阈值),说明模型对该状态分歧大 → 没见过 → 缩短想象步数 HHH 或彻底绕过该区域;反之则可放心规划。MBPO 在选择分支采样时就部分依赖此信号。

完整协方差 vs 对角协方差的取舍:

维度 对角协方差 Σ=diag(σ12,...,σd2)\Sigma=\text{diag}(\sigma_1^2,\dots,\sigma_d^2)Σ=diag(σ12,...,σd2) 完整协方差 Σ=LL⊤\Sigma=LL^\topΣ=LL⊤
参数量 O(d)O(d)O(d) O(d2)O(d^2)O(d2)
数值稳定性 高 低(Cholesky 需正定)
能否表达维度相关性 否 是
训练难度 易 难(易数值崩溃)
适用 大多数控制任务 维度耦合强的物理仿真(如多刚体接触)

三、Dyna 框架

3.1 规划与学习的结合

规划(planning) 是给定模型下计算策略的过程;学习(learning) 是从真实交互中改进模型和价值。Dyna 把两者结合成统一框架:

text 复制代码
Dyna 循环:
1. 用真实交互收集经验 → 更新模型
2. 用真实经验更新价值函数(Q-learning 更新)
3. 用模型生成想象轨迹 → 更新价值函数

关键点:步骤 3 用想象数据也更新价值函数------这是 Dyna 样本效率高的原因。

3.2 Dyna-Q 算法

Dyna-Q 把 Q-learning 与模型想象结合:

python 复制代码
import numpy as np
from collections import defaultdict

class DynaQ:
    """表格 Dyna-Q(Sutton & Barto §8.2)。

    模型即字典:Model(s, a) = (r, s')。每次真实交互后,
    先做一次直接 RL 更新,再从历史 (s, a) 中随机采样 N 次做规划更新。
    """
    def __init__(self, n_actions, gamma=0.9, alpha=0.5,
                 planning_steps=5, epsilon=0.1):
        self.n_actions = n_actions
        self.gamma = gamma
        self.alpha = alpha
        self.planning_steps = planning_steps
        self.epsilon = epsilon
        self.Q = defaultdict(lambda: np.zeros(n_actions))
        self.model = {}                       # (s, a) -> (r, s')

    def act(self, s):
        if np.random.rand() < self.epsilon:
            return np.random.randint(self.n_actions)
        return int(np.argmax(self.Q[s]))

    def update(self, s, a, r, s_next):
        # ---- 直接 RL:标准 Q-learning 更新 ----
        td = r + self.gamma * self.Q[s_next].max() - self.Q[s][a]
        self.Q[s][a] += self.alpha * td
        # ---- 模型学习:记录(或覆盖)该转移 ----
        self.model[(s, a)] = (r, s_next)
        # ---- 规划:从历史 (s̃, ã) 随机采样 N 次 ----
        keys = list(self.model.keys())
        for _ in range(self.planning_steps):
            s_tilde, a_tilde = keys[np.random.randint(len(keys))]
            r_tilde, s_tilde_next = self.model[(s_tilde, a_tilde)]
            td = (r_tilde + self.gamma * self.Q[s_tilde_next].max()
                  - self.Q[s_tilde][a_tilde])
            self.Q[s_tilde][a_tilde] += self.alpha * td

Dyna-Q 的表格版算法:

text 复制代码
Initialize Q(s, a) = 0, Model(s, a, s') = empty
Repeat:
    1. 选动作 a,真实交互得 (s, a, r, s')
    2. Q(s, a) ← Q(s, a) + α[r + γ max_a' Q(s', a') - Q(s, a)]   # 真实 Q 更新
    3. Model(s, a, s') ← r, s'                                   # 模型学习
    4. For k = 1, 2, ..., N:                                      # 规划步数
         任取 s̃, ã
         r̃, s̃' ← Model(s̃, ã)
         Q(s̃, ã) ← Q(s̃, ã) + α[r̃ + γ max_b Q(s̃', b) - Q(s̃, ã)]

3.3 表格形式的 Dyna

Dyna-Maze (Sutton & Barto 图 6.3)是 Dyna 的经典演示:每获得 1 个真实样本,NNN 个规划步就等效于 NNN 个真实样本。N=0N = 0N=0 时退化为纯 Q-learning(需要大量真实交互),NNN 很大时快速收敛------只要模型预测不过于偏离真实。

规划步数 N 的权衡:

  • NNN 太小:样本效率提升有限。
  • NNN 太大:模型误差被反复放大,想象轨迹与真实分布偏离,规划甚至损害性能。

Dyna-π / Dyna-Q+ 的改进:

  • Dyna-π:用模型做完整的策略搜索(蒙特卡洛树搜索风格)。
  • Dyna-Q+ :给久未尝试的转移的奖励加 探索 bonus κτ\kappa\sqrt{\tau}κτ (τ\tauτ 为距上次尝试的步数),鼓励探索久未访问的转移。

Dyna-Maze 的定量说明:

经典实验中,每个真实样本 →\to→ 一次 Q-learning 更新,NNN 个规划步又产生 NNN 次额外更新。N 个规划步等效 N 个真实样本的 Q 更新信号 ------只要模型预测未偏离真实分布太远。Sutton & Barto(图 8.2/8.3)对比了 N=0,5,50N=0,5,50N=0,5,50:NNN 越大,达到同等解迷宫水平所需的真实交互步数 越少------N=50N=50N=50 时在前 50 次左右交互内即快速收敛,N=0N=0N=0 的纯 Q-learning 则需要数倍于 episode 上限的交互(示意性结论,具体倍数取决于迷宫规模与超参,S&B 未给出统一倍率)。

规划步数 N 的权衡表格:

NNN 取值 样本效率 模型误差累积 典型表现
N=0N=0N=0 1×(基线) 无 退化为 Q-learning
N=10N=10N=10 明显提升(S&B 迷宫中已大幅快于 N=0N=0N=0) 几乎可忽略 小规模表格任务常用
N=50N=50N=50 早期收敛最快(S&B 迷宫实验中交互步数最少) 误差积累可控 表格任务可受益,深度模型下常失稳
NNN 过大(>500) 反而下降 模型误差主导 规划损害性能

Dyna-π 与 Dyna-Q+ 的区别:

  • Dyna-π:在模型上做完整的策略搜索(蒙特卡洛树搜索或策略迭代风格),不限于 tabular Q-learning 的单步更新。
  • Dyna-Q+ :给久未尝试的转移加探索激励 ------在每个状态-动作对的奖励上加一个随时间增长的正 bonus(Sutton & Barto 式 8.2):

rbonus(s,a)=r+κτ r_{\text{bonus}}(s, a) = r + \kappa\sqrt{\tau} rbonus(s,a)=r+κτ

其中 τ\tauτ 是自上次真实访问 (s,a)(s,a)(s,a) 以来经过的时间步数(时间戳之差),κ\kappaκ 是缩放系数。τ\tauτ 越大表示该转移越久没被尝试------可能是环境变化导致旧经验失效,或智能体从未充分探索------加 bonus 正是鼓励智能体回头验证这些"被遗忘的"选项。注意方向:这是探索激励(给想象奖励加正项),不是模型误差惩罚。Dyna-Q+ 在变化环境(环境的动力学随时间变化)中尤其有效。

四、基于模型的策略优化

4.1 MBPO 算法

MBPO(Model-Based Policy Optimization)(Janner et al. 2019)是深度强化学习时代最成功的 MBRL 方法之一。

核心设计:

  1. 用 SAC/DDPG 作为基策略 πMBPO\pi_{\text{MBPO}}πMBPO 收集真实数据。
  2. 训练多个概率动力学模型 {Pϕi}i=1K\{P_\phi^i\}_{i=1}^K{Pϕi}i=1K 的集成。
  3. 从最新真实数据中采样初始状态 (s0,a0)(s_0, a_0)(s0,a0),用模型向前短程想象 HHH 步。
  4. 用想象轨迹做策略改进(用 SAC 的更新,但基于想象数据)。

分支采样:每步想象时,随机选一个模型分支:

s^t+1∼Pϕit(st,at),it∼Uniform(1,...,K) \hat s_{t+1} \sim P_\phi^{i_t}(s_t, a_t), \quad i_t \sim \text{Uniform}(1, \ldots, K) s^t+1∼Pϕit(st,at),it∼Uniform(1,...,K)

为什么短程想象(H 通常 3-15 步) :模型误差随想象步数指数增长 。从任意真实状态出发想象 HHH 步后终止,等于"用模型换来了 HHH 倍的数据",但误差被限制在可控范围。想象轨迹末端可接基策略的估计(注意状态与动作交替):

aH−1=πMBPO(s^H−1),s^H=f(s^H−1,aH−1) a_{H-1} = \pi_{\text{MBPO}}(\hat s_{H-1}), \qquad \hat s_H = f(\hat s_{H-1}, a_{H-1}) aH−1=πMBPO(s^H−1),s^H=f(s^H−1,aH−1)

MBPO 的性能结论 :论文(Janner et al. 2019)的明确表述是 MBPO "matches the asymptotic performance of the best model-free algorithms"------即在 MuJoCo 连续控制任务上渐近性能与最优无模型方法(SAC)持平 ,并非输于 SAC;MBPO 的优势体现在样本效率上,在 Ant 任务中达到与 SAC 相当性能所需的步数约为 300k 对比 3M(约 10 倍)。这打破了"模型偏差必然导致渐近性能损失"的旧印象------关键正是短程分支 rollout 把模型偏差限制在了可控范围内。

4.2 模型预测控制

MPC(Model Predictive Control) 是在线反复求解优化问题的控制范式:

text 复制代码
循环:
1. 用模型预测未来 H 步:
     min_{u_0...u_{H-1}} Σ_{t=0}^{H-1} [ -r(s_t, u_t) + λ ||u_t||^2 ]
     s.t.  s_{t+1} = f(s_t, u_t)
2. 只执行最优解的第一步 u_0
3. 收集真实数据,更新模型

滚动优化(receding horizon):每步都用最新模型重新规划,只执行第一步。这让 MPC 对模型误差鲁棒。

MPC 在 RL 中的地位 :MPC 本身不需要学习,是基于模型的"纯规划"方法。RL 的贡献是学一个值函数作为终端代价:

min⁡∑t=0H−1c(st,ut)+Vϕ(sH) \min \sum_{t=0}^{H-1} c(s_t, u_t) + V_\phi(s_H) mint=0∑H−1c(st,ut)+Vϕ(sH)

其中 VϕV_\phiVϕ 由 TD 学习。这样既保留了 MPC 的短程优化(对模型误差鲁棒),又用学习提供了长程规划能力。

动作序列怎么优化:CEM 与 PETS 。MPC 的内层优化 min⁡u0...uH−1\min_{u_0\ldots u_{H-1}}minu0...uH−1 在连续动作下通常用交叉熵方法(CEM)求解:维护一个动作序列上的高斯分布,反复采样一批候选序列、按累积代价保留精英样本、重拟合分布,直至收敛。PETS(Chua et al. 2018)把这两件事拼在一起:用概率集成模型(PETS 中的 PE 模型)做预测、CEM 做优化,并利用集成的不确定性在采样中做风险感知决策。CEM/PETS 适用于中等维度动作、短时域的控制任务------模型免费、不需要值函数,但每步都要做优化,决策频率受限。

4.3 世界模型

世界模型(World Models)(Ha & Schmidhuber 2018)是"在压缩的隐空间里做规划"的范式。

三阶段架构:

python 复制代码
# 阶段 1:VAE 感知模块------把高维观测压缩成隐变量 z
class VAEEncoder(nn.Module):
    def __init__(self, obs_dim, latent_dim=32):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(obs_dim, 256), nn.ELU(),
            nn.Linear(256, 256), nn.ELU(),
        )
        self.mu = nn.Linear(256, latent_dim)
        self.logvar = nn.Linear(256, latent_dim)

# 阶段 2:MDN-RNN 动力学模块------在隐空间预测下一隐状态
class MDNRNN(nn.Module):
    """混合密度网络 RNN:输出下一隐状态的混合高斯参数集。

    每个混合分量 k 输出三个量:混合权重 π_k、均值 μ_k、
    标准差 σ_k,故输出维度为 3 * n_mix * latent_dim
    (π_k 经 softmax、σ_k 经 exp 保证合法性)。
    """
    def __init__(self, latent_dim, action_dim, n_mix=5):
        super().__init__()
        self.rnn = nn.LSTMCell(latent_dim + action_dim, latent_dim)
        self.mdn = nn.Linear(latent_dim, 3 * n_mix * latent_dim)

# 阶段 3:控制器------在隐空间用 CEM(交叉熵方法)搜索动作序列

在隐空间规划的理由:直接在像素空间 rollout 会累积巨大误差;在压缩的隐空间(如 32 维)rollout,误差可控且规划计算量小。

Dreamer 与 RSSM :Dream to Control 系列(Hafner et al. 2019-2023)把这个思路做到极致。其核心世界模型是 RSSM(Recurrent State-Space Model) :每个时刻的隐状态由确定部分 ht=f(ht−1,zt−1,at−1)h_t = f(h_{t-1}, z_{t-1}, a_{t-1})ht=f(ht−1,zt−1,at−1)(GRU/ LSTM 递推)与随机部分 zt∼pψ(zt∣ht)z_t \sim p_\psi(z_t \mid h_t)zt∼pψ(zt∣ht)(条件先验采样)拼接而成------确定通道记住长期信息,随机通道表达环境的固有不确定性。RSSM 的训练目标是序列上的重构 + 奖励预测 (加 KL 正则约束后验 qψ(zt∣ht,ot)q_\psi(z_t\mid h_t,o_t)qψ(zt∣ht,ot) 靠近先验):编码器把观测编码进隐空间,模型在隐空间预测未来,再用解码器与奖励头把预测拉回可监督的信号。actor-critic 完全在隐空间"做梦" rollout 上训练,不需真实环境参与梯度计算。

DreamerV3(Hafner et al. 2023)用一套跨任务固定的超参在 Atari、DeepMind Control Suite(状态与视觉输入两档)、Crafter、Minecraft 等基准上取得强结果:首个在 Minecraft 中不靠人类示范采集到钻石的算法,Atari 上与调参后的无模型方法相当,Crafter 上大幅超越此前方法(因为隐空间模型显式建模了不确定性)。

基于模型方法的现状小结:

  • 优势:样本效率高(数据昂贵的场景,如真机机器人)。
  • 劣势:实现复杂;模型误差是硬约束(但 MBPO 表明短程想象下渐近性能可与无模型方法持平)。
  • 趋势:混合方法(Hybrid)正在成为主流------用模型提供探索信号与短期规划,用无模型保证最终性能(如 TD-MPC2)。
相关推荐
狂师32 分钟前
AI 测试 Skill 大全,我日常在用的 27个,夯爆了!
人工智能·测试·全栈
AI源码33 分钟前
基于机器学习的酒店数据分析及流失预测系统
人工智能·机器学习·数据分析
敢敢のwings37 分钟前
Super Odometry 2.0:相机与激光雷达退化后,机器人如何继续估计运动
人工智能·数码相机·机器人
skywalk816343 分钟前
不用 SSH、不装数据库:我用 1 个 Python 脚本 + Git,把 15 个 AI Agent 串成了一条流水线
数据库·人工智能·python·ssh·集群
AI全栈学习助手1 小时前
告别“转圈等待”:Spring Boot + SSE 让大模型像 ChatGPT 一样流式输出
java·人工智能·spring boot·后端·aigc
天天被压力1 小时前
【A股分钟级高频数据完全手册 #02】Python调用股票1分钟数据接口:Pro版最新分时取数与字段解析
java·人工智能·python
楚山之石1 小时前
【MRM】CAPLEX 对比剂灌注 MRI 开源术语库:ISMRM OSIPI 共识报告
图像处理·人工智能·学习·mri
Godspeed Zhao1 小时前
从零开始学AI22——集成学习
人工智能·机器学习·集成学习
天天被压力1 小时前
【A股分钟级高频数据完全手册 #01】Pro版接口体系总览与REST鉴权:42篇地图与从0接入
java·人工智能·python