当前位置: 首页 > news >正文

Dreamer智能体:用世界模型实现高样本效率的强化学习

1. 项目概述:为什么一个“做梦”的智能体正在改写强化学习的底层逻辑

如果你最近翻过顶会论文、刷过AI技术社区,或者只是在GitHub trending里随手点开过几个仓库,大概率已经和Dreamer打过照面。它不是某个新出的聊天机器人,也不是又一个大语言模型的变体,而是一个在模型驱动型强化学习(Model-Based Reinforcement Learning, MBRL)领域真正捅破天花板的智能体架构。它的全名——Dreamer: A State-of-the-art Model-Based Reinforcement Learning Agent——听起来像一句宣言,实际上就是一份实测成绩单:在DeepMind控制套件(DeepMind Control Suite)、Atari 100k、DMLab等一众高难度基准测试中,Dreamer以显著优势碾压了当时所有主流的无模型(Model-Free)方法,比如SAC、PPO,甚至比同期其他MBRL方案快3–5倍,样本效率提升一个数量级。我第一次在ICLR 2020现场听作者讲完Demo,后背是凉的——不是因为冷气太足,而是意识到:我们过去十年花大力气调参、堆算力、喂数据的那套“试错式”强化学习范式,可能真要被“先做梦、再行动”的新路径重构了。

核心关键词——Dreamer、模型驱动、强化学习、世界模型、隐空间规划、样本效率——不是空洞术语,而是整套系统运转的骨架。它解决的,是强化学习最顽固的“阿喀琉斯之踵”:数据饥渴。传统方法在真实机器人上跑一次episode动辄几十秒,失败十次就浪费十分钟;在Atari游戏里,动辄需要百万帧才能学会一个简单动作。Dreamer不这么干。它用一个轻量但精准的世界模型(World Model),在神经网络内部“梦见”环境的动态规律:看到小车当前状态,就能预测它油门踩深10%后0.1秒的位置、速度、是否即将撞墙;看到Pong球的轨迹,就能推演接下来3帧内拍子该往哪移才能接到。这个“梦”不是幻想,而是基于真实交互数据训练出的概率性动态模型,它把物理世界的因果链条压缩进几兆参数里。然后,智能体不再盲目试错,而是在这个“梦”里高速推演成百上千条未来路径,挑出最优的一条再付诸实践。这就像一个赛车手,不用真车反复撞墙来学漂移,而是先在高保真模拟器里练熟一万次,上真车时第一圈就能控场。

适合谁读?如果你是刚学完Q-learning、还在为CartPole调不出900分发愁的研究生;如果你是工业界做机械臂抓取、无人机避障的算法工程师,每天被客户催着“能不能少采点真实数据”;如果你是好奇AI如何从“条件反射”走向“战略思考”的技术爱好者——这篇就是为你写的。它不假设你精通变分推断或李雅普诺夫稳定性,但要求你愿意跟着代码逻辑走一遍“梦是如何被编译成动作”的全过程。下面,我们就一层层剥开Dreamer的神经结构,看它怎么把“做梦”这件事,做成强化学习领域近五年最硬核的基础设施升级。

2. 整体设计与思路拆解:从“边走边想”到“闭眼推演”的范式跃迁

2.1 为什么必须放弃“边走边想”?传统强化学习的三大硬伤

在拆解Dreamer之前,得先说清楚它要革谁的命。主流无模型方法(如PPO、SAC)本质上是“反应式智能体”:环境给一个状态s,它查表或跑网络输出一个动作a,收到奖励r和新状态s',再更新策略。这种模式在算力和数据充足的云端训练中尚可运转,但一旦落地,立刻暴露三个致命缺陷:

  • 数据黑洞:在DeepMind Control Suite的Cheetah-run任务中,SAC需要约50万步交互才能稳定奔跑;而真实四足机器人每步交互耗时0.5秒,50万步=7天连续运行,且期间任何硬件故障都意味着重头再来。Dreamer在同等任务上仅需3万步,缩短至不到12小时——这不是优化,是降维打击。

  • 灾难性遗忘:当环境微调(比如桌面摩擦系数变化0.1),SAC的策略网络权重几乎全部失效,必须重新训练。因为它学的是“s→a”的强映射,而非“s→f(s,a)→s'”的因果链。而Dreamer的世界模型学到的是动态函数f,只要f的泛化性足够,换台同型号机器人,只需微调世界模型的观测编码器,策略几乎零成本迁移。

  • 不可解释性黑洞:PPO的决策过程是黑箱中的黑箱。当机械臂突然打翻杯子,工程师无法回溯:“它为什么在距离杯子15cm时突然加大扭矩?”Dreamer则不同——它的每一步动作,都对应世界模型中一条可追溯的隐状态轨迹(latent trajectory)。你可以可视化这条轨迹,看到智能体“预见”到杯子重心偏移,提前调整力矩分配。这对安全关键场景(如医疗机器人、自动驾驶)不是锦上添花,而是准入门槛。

提示:这里的数据对比(50万 vs 3万步)不是理论值,而是我在复现Dreamer v2时,在NVIDIA RTX 4090 + PyTorch 2.0环境下实测的中位数结果。环境复现脚本已开源在个人GitHub,链接见文末附录。

2.2 Dreamer的“三幕剧”架构:编码-梦境-执行

Dreamer的精妙,在于它把强化学习拆解成三个严格解耦、可独立优化的阶段,形成闭环流水线:

  1. 编码器(Encoder):将原始高维观测(如64×64像素图像、12维关节角度+角速度)压缩进一个低维隐空间(Latent Space),记作z_t。这不是普通AE的瓶颈层,而是通过变分自编码器(VAE)框架约束:z_t必须服从一个可学习的先验分布p(z_t|z_{t-1},a_{t-1}),确保隐状态具备时序连贯性。举个生活类比:Encoder就像老练的外科医生,不记录手术室每盏灯的亮度、每台仪器的蜂鸣声,而是抽象出“患者血压平稳”“创口出血量中等”“缝合张力适中”这几个关键隐状态。

  2. 世界模型(World Model):这是Dreamer的“大脑皮层”。它由两部分组成:

    • 动态模型(Dynamics Model):输入上一时刻隐状态z_{t-1}和动作a_{t-1},预测当前隐状态z_t的分布参数(均值μ、方差σ²)。它学的是环境的“物理定律”。
    • 观测模型(Observation Model):输入z_t,重建原始观测o_t(如生成一张64×64的预测图像)。它学的是“感官映射”,即隐状态如何投射为我的所见所闻。 二者联合训练,目标是最小化重建误差+KL散度(保证隐变量符合先验)。这个模型不接触真实奖励,只靠“看图说话”就能学会世界如何运转。
  3. 规划器(Planner)与策略网络(Policy Network):这才是真正的“决策中枢”。它不直接输出动作,而是在世界模型生成的隐空间轨迹上进行想象式规划(Imagined Rollout)。具体操作是:从当前z_t出发,用动态模型向前推演H步(H=15是常用值),对每条H步轨迹计算累计想象奖励(Imagined Return),然后用交叉熵方法(CEM)迭代优化初始动作序列,最终选取最优的第一步动作a_t执行。策略网络(Actor)的作用,是将规划器的输出蒸馏成一个轻量级、可实时调用的映射z_t → a_t,用于在线部署。

这个设计的革命性在于:学习(World Model)与决策(Planner)彻底分离。你可以用离线数据预训练一个世界模型,再针对不同任务(跑步、跳跃、搬运)快速训练专属策略,无需重新采集环境交互。这就像建好一座城市数字孪生体后,交通调度、应急响应、商业规划可以并行开展,互不干扰。

2.3 为什么选隐空间而非像素空间?一场关于“认知经济性”的计算博弈

有人会问:既然能处理图像,为什么不直接在像素空间建模?答案直指计算本质——维度诅咒(Curse of Dimensionality)。一张64×64灰度图有4096维,其像素间存在海量冗余(相邻像素高度相关,大部分区域是背景)。若在像素空间建模动态,模型需学习“每个像素如何随动作变化”,参数量爆炸,且极易过拟合噪声。

Dreamer的隐空间通常仅1024维(z_t ∈ ℝ¹⁰²⁴),却能编码运动学、动力学、物体关系等高层语义。我们做过对照实验:在Cheetah任务中,用相同网络结构分别在像素空间和隐空间训练动态模型。结果像素模型的1步预测MSE高达0.87,而隐空间模型仅为0.032;更关键的是,像素模型的规划器在15步推演后,轨迹完全发散(预测位置误差>5m),隐空间模型仍保持厘米级精度。这是因为隐空间天然具备平滑性(Smoothness)解耦性(Disentanglement):z_t的一个维度可能编码“身体俯仰角”,另一个编码“前腿伸展长度”,它们的变化相互独立,符合物理直觉。而像素空间里,“俯仰角增加10度”会导致成百上千个像素同时非线性变化,模型根本无法建立稳定映射。

注意:隐空间维度不是越大越好。我们在消融实验中测试了512/1024/2048维。1024维在Cheetah任务上达到精度与速度的最佳平衡点——2048维虽将MSE再降5%,但单步推演耗时增加40%,导致整体训练吞吐下降,得不偿失。工程实践中,建议从1024起步,根据任务复杂度微调。

3. 核心细节解析与实操要点:世界模型如何“学会做梦”

3.1 隐状态z_t的构造:不只是压缩,更是因果解耦

Dreamer的隐空间不是简单的向量拼接,而是一个分层概率结构,包含两个关键组件:

  • 随机隐状态(Stochastic State)s_t:这是z_t的主体,维度d_s=1024。它通过一个循环神经网络(RSSM)更新:s_t = RSSM(s_{t-1}, a_{t-1}, e_t),其中e_t是Encoder对观测o_t的嵌入。RSSM的核心是引入随机性——s_t的先验分布p(s_t|s_{t-1},a_{t-1})由动态模型输出,而后验分布q(s_t|s_{t-1},a_{t-1},e_t)由Encoder输出,二者通过KL散度约束。这种设计强制模型学习“不确定性”:当环境存在随机扰动(如风力突变),s_t的方差σ²会自然增大,规划器在推演时会主动规避高风险路径。

  • 确定性隐状态(Deterministic State)h_t:维度d_h=200,由另一个RNN(通常为GRU)维护,仅依赖s_{t-1}和a_{t-1},不引入随机性。它捕捉确定性长期依赖,比如“连续5次左转后,大概率进入死胡同”。

最终z_t = [s_t; h_t](拼接),总维度1224。这种混合结构让模型既能处理随机噪声,又能记忆长程模式。我在复现时发现,若去掉h_t(纯随机s_t),在DMLab迷宫任务中,智能体频繁在相似岔路口做出矛盾选择,成功率下降22%;若去掉s_t的随机性(纯确定性),模型在Cheetah任务中遇到地面湿滑时完全无法适应,直接摔倒。

3.2 动态模型的训练:用“预测错误”倒逼物理直觉

动态模型的损失函数是Dreamer最精巧的设计之一,它由三部分加权构成:

  1. 观测重建损失 L_obs:衡量世界模型“梦见”的图像o'_t与真实图像o_t的差异。使用L1损失而非L2,因其对异常值(如突然出现的障碍物边缘)更鲁棒。公式:L_obs = ||o_t - o'_t||₁。

  2. 奖励预测损失 L_rew:世界模型还需预测即时奖励r_t。这里用Huber损失(平滑L1),平衡小误差的线性敏感性和大误差的二次抑制。公式:L_rew = Huber(r_t, r'_t)。

  3. KL散度损失 L_kl:约束后验q(s_t|...)与先验p(s_t|...)的差异,防止隐状态坍缩到单一模式。但Dreamer采用自由比特(Free Bits)技巧:仅当KL > β(β=0.1是常用值)时才计入损失,否则置零。这避免了模型为省事而学出无信息的s_t。

总损失:L_world = L_obs + L_rew + λ·max(0, KL - β)

λ的取值至关重要。λ=0.1时,模型专注重建精度,但隐空间缺乏语义;λ=1.0时,KL主导,模型过度关注隐变量结构,重建模糊。我们通过网格搜索确定λ=0.5在多数任务中表现最优——它让模型在“看清世界”和“理解规律”间取得黄金分割。

3.3 规划器的实现:在隐空间里“下棋”的数学

规划器是Dreamer的“灵魂”,其核心是交叉熵方法(Cross-Entropy Method, CEM)的隐空间变体。步骤如下(以H=15步推演为例):

  1. 初始化候选动作集:生成K=1000条长度为H的动作序列{a^{(i)}_1,...,a^{(i)}_H},每条序列中每个动作a_t ∼ N(μ_t, σ²_t),初始μ_t=0, σ²_t=0.3²(对应动作空间归一化后的标准差)。

  2. 隐空间推演:对每条序列,从当前z_t出发,用动态模型递归计算z_{t+1},...,z_{t+H},再用奖励模型得到r_{t+1},...,r_{t+H}。

  3. 评估与筛选:计算每条序列的想象回报R^{(i)} = Σ_{k=1}^H γ^k r_{t+k}(γ=0.995),取前ρ=10%(即100条)最高分序列。

  4. 更新分布:用这100条序列重新估计μ_t和σ²_t(均值与方差),作为下一轮采样的新参数。

  5. 迭代:重复步骤2-4共C=5轮,最终输出最优序列的首动作a_t。

这个过程的计算开销集中在步骤2的推演。为加速,Dreamer采用并行张量运算:将1000条序列的a_t堆叠成[1000, H, d_a]张量,z_t广播为[1000, d_z],动态模型一次前向即可产出[1000, H, d_z]的隐状态序列。在RTX 4090上,单次CEM迭代耗时<80ms,完全满足实时控制需求(125Hz)。

实操心得:CEM的超参数(K, ρ, C)需按任务调整。在Atari Breakout这类快节奏游戏,K=500+ρ=5%+C=8效果最佳,因需更高精度定位球拍;而在Cheetah慢速奔跑中,K=1000+ρ=10%+C=5已足够,节省算力。切勿盲目套用默认值。

4. 实操过程与核心环节实现:从零搭建你的第一个Dreamer智能体

4.1 环境准备与依赖安装:避开CUDA版本的“雷区”

Dreamer对PyTorch版本和CUDA驱动极其敏感。根据我踩过的坑,强烈推荐以下组合(2024年实测稳定):

  • 操作系统:Ubuntu 22.04 LTS(Windows WSL2亦可,但性能损失约15%)
  • GPU驱动:NVIDIA Driver 535.129.03(对应CUDA 12.2)
  • PyTorch:2.0.1+cu118(注意:不是cu121!cu121与Dreamer的RSSM CUDA kernel存在兼容问题)
  • 关键库
    pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install dm_control gymnasium numpy matplotlib tqdm # Dreamer官方实现依赖 pip install git+https://github.com/danijar/dreamerv3.git@v3.0.0

警告:若使用conda,务必禁用conda-forge源安装PyTorch,因其打包的cu118版本缺少Dreamer所需的torch._C._nn.silu算子。曾有同事因此调试三天,最后发现是conda源的锅。

4.2 数据采集:用“人类示范”启动世界模型

Dreamer不需要从零开始随机探索。我们采用专家演示(Expert Demonstration)加速冷启动:

  1. 先用SAC训练一个基础策略,在Cheetah任务上跑出1000个高质量episode(每episode 1000步),保存为cheetah_expert.h5

  2. 用Dreamer的dataset.py工具提取观测o_t、动作a_t、奖励r_t、下一观测o_{t+1},构建TFRecord格式数据集。

  3. 启动世界模型预训练:

    python dreamer.py \ --logdir ./log/cheetah_world \ --configs defaults,cheetah,world_model \ --dataset ./data/cheetah_expert.tfrecord \ --batch_size 50 \ --train_steps 100000

    关键参数说明:

    • --batch_size 50:每个batch含50条轨迹,每条轨迹16步(足够覆盖短期动态)。
    • --train_steps 100000:约需12小时,Loss曲线会在80000步后收敛。

训练过程中,实时监控三项指标(TensorBoard):

  • loss/obs: 应降至<0.05(L1重建误差)
  • loss/kl: 稳定在0.08–0.12(证明隐变量有效学习)
  • imag/return: 想象回报,应与真实环境回报趋势一致(验证奖励模型可信)

4.3 策略训练:用“梦境”替代“现实”的艺术

世界模型训练完成后,冻结其权重,单独训练策略网络:

python dreamer.py \ --logdir ./log/cheetah_policy \ --configs defaults,cheetah,policy \ --world_model_dir ./log/cheetah_world \ --batch_size 50 \ --train_steps 500000

此时,--world_model_dir指向预训练好的模型,所有梯度只更新策略网络(Actor)和价值网络(Critic)。策略网络的输入是z_t,输出是动作a_t;价值网络输入z_t,输出V(z_t)(状态价值)。

训练的关键在于想象数据(Imagined Data)的生成频率。Dreamer默认每100步环境交互,生成1000条想象轨迹用于策略更新。我们发现,在Cheetah任务中,将频率提高到每50步生成2000条,可使收敛速度提升40%,但显存占用增加25%。权衡之下,推荐使用--imag_freq 50 --imag_batch 2000

4.4 部署与推理:从训练到真机的“一键切换”

训练完成的策略网络可直接导出为TorchScript模型,部署至边缘设备:

# 导出脚本 export_policy.py import torch from dreamer import DreamerAgent agent = DreamerAgent.load('./log/cheetah_policy') agent.eval() # 将Encoder+WorldModel+Actor打包为单模型 traced_agent = torch.jit.trace(agent, (torch.randn(1, 3, 64, 64),)) traced_agent.save('dreamer_cheetah.pt')

在Jetson AGX Orin上加载:

model = torch.jit.load('dreamer_cheetah.pt').cuda() obs = preprocess_camera_frame() # 64x64 RGB action = model(obs.unsqueeze(0)).cpu().numpy()[0] # 实时推理<15ms robot.apply_action(action)

实操心得:真机部署时,务必校准观测预处理。我们曾因摄像头自动白平衡导致输入图像色温漂移,世界模型误判地面反光为障碍物。解决方案:在相机驱动层关闭所有自动调节,用固定曝光+手动白平衡,并在preprocess中加入色度归一化(Chroma Normalization)模块。

5. 常见问题与排查技巧实录:那些文档里不会写的“血泪史”

5.1 世界模型训练不收敛?先查这三个“隐形杀手”

问题现象根本原因排查与修复
loss/obs一直>0.3,且波动剧烈观测归一化失效:原始图像未除以255,导致Encoder输入超出[0,1]范围,ReLU神经元饱和检查dataset.pynormalize_image()函数,确认image = image.astype(np.float32) / 255.0已启用;用np.min/max打印输入张量值域
loss/kl持续为0Free Bits阈值β设错:β过大(如β=1.0),导致KL始终<β,损失项恒为0查看训练日志中kl_loss标量,若长期为0,将β调至0.05–0.1;或临时注释max(0, KL-β),观察KL值是否合理(0.05–0.2)
imag/return与真实回报符号相反奖励模型过拟合:在专家数据中,奖励多为正,模型学出“高奖励=好”,但真实环境中惩罚性奖励(如碰撞-100)被忽略在数据集中强制加入10%的“失败样本”(如故意让Cheetah摔倒),或修改奖励模型损失为Huber(r_t, r'_t, delta=10),扩大对大误差的敏感度

5.2 规划器“梦游”?隐空间轨迹发散的四大征兆与对策

当规划器推演的隐状态z_{t+H}严重偏离真实z_{t+H},表现为智能体动作僵硬、重复、或突然崩溃。我们总结出四个典型征兆及应对:

  1. 征兆:z_t的L2范数逐帧指数增长(如从1.2→3.5→12.8)
    对策:在动态模型输出端添加隐状态裁剪(Latent Clipping)z_t = torch.clamp(z_t, -5, 5)。这是Dreamer v3新增的稳定技巧,实测可消除90%的发散。

  2. 征兆:CEM迭代中,最优序列的想象回报R^{(i)}方差极大(>1000)
    对策:降低动作探索噪声σ²_t的初始值(从0.3²→0.15²),或增加CEM筛选比例ρ(从10%→20%),让规划器更保守。

  3. 征兆:推演轨迹在隐空间中画出密集螺旋,而非平滑曲线
    对策:检查RSSM的GRU隐藏层维度。若h_t维度<128,长期依赖建模不足,易产生混沌振荡。将deter_size从200提升至300。

  4. 征兆:同一z_t输入,多次CEM推演结果差异巨大(动作标准差>0.5)
    对策:启用确定性规划(Deterministic Planning):在CEM中禁用动作采样,改为a_t = μ_t,用梯度上升直接优化μ_t。虽牺牲探索性,但大幅提升稳定性。

5.3 工业落地必问:Dreamer能用在我们的产线上吗?

这是客户问得最多的问题。答案是:能,但需定制化改造。我们为某汽车零部件厂部署的案例可供参考:

  • 场景:视觉引导的机械臂螺栓拧紧,要求定位精度±0.1mm,节拍<8秒。
  • 挑战:产线光照变化大,工件表面反光强,传统视觉定位易失效。
  • Dreamer改造
    1. 将RGB-D相机点云(而非RGB图像)作为观测输入,Encoder改用PointNet++架构;
    2. 世界模型的观测模型输出,不仅是重建点云,还预测拧紧扭矩曲线(100维向量),与实际传感器数据比对;
    3. 规划器的目标函数加入轨迹平滑性约束min Σ||a_{t+1}-a_t||²,避免机械臂急启停。
  • 效果:上线后,定位失败率从3.2%降至0.17%,平均节拍缩短至6.3秒,且支持“光照突变”下的无缝切换(通过在线微调Encoder)。

最后分享一个小技巧:在真实系统中,永远保留一个“安全兜底策略”。我们用一个极简PID控制器监听机械臂末端加速度,一旦检测到异常抖动(>5g),立即接管控制,将Dreamer策略输出置零。这层物理保险,比任何算法都可靠。

我在实际部署中发现,Dreamer最强大的地方,从来不是它多快或多准,而是它把“理解世界”这件事,从玄学变成了可测量、可调试、可迭代的工程模块。当你看着自己的智能体在隐空间里安静推演,然后稳稳地执行一个你从未教过它的新动作时,那种感觉,就像第一次看见孩子自己系上鞋带——不是代码在运行,而是某种认知正在生长。

http://www.cnnetsun.cn/news/2534200.html

相关文章:

  • 二、Linux基础开发工具(2)
  • PIC32MX驱动铱星9602实现全球短数据通信(SBD)
  • Redis for Windows 2025终极指南:从零开始搭建高性能内存数据库
  • 136、运动控制中的同步机制:时间戳与触发
  • 为ClaudeCode配置Taotoken作为备用API解决访问限制
  • Seraphine:你的英雄联盟智能助手,3大核心功能提升游戏决策力
  • 移动储能车远程管理平台解决方案
  • 为什么92%的AI翻译Agent项目在L10阶段失败?——解密头部语言服务商未公开的5层校验协议
  • agent-skills 完整使用教程(2026最新版)
  • RMSNorm:LLM 里的归一化为什么换成了这个
  • Midjourney颗粒感失控?3分钟定位根源:从--stylize参数误用到--quality陷阱的9个致命误区
  • 政府科技管理部门如何推动区域创新?
  • TIPTOP ERP二次开发实战:从服务器拉取程序到本地Genero Studio调试的完整流水线
  • Boss-Key:职场隐私保护终极指南,一键隐藏窗口的智能解决方案
  • 专业级EdgeRemover配置指南:5种高效部署方案深度解析
  • ROS2 TurtleBot3仿真SLAM导航:RVIZ不显示机器人模型的终极排查与修复指南
  • Node.js后端服务如何集成多模型能力并管理API成本
  • 告别内存爆炸!用UNETR搞定3D医学图像分割,保姆级PyTorch+MONAI复现教程
  • 别再死记硬背!用Python+NetworkX可视化理解拉普拉斯矩阵的5个核心性质
  • 深度解析:xiaozhi-esp32-server语音交互系统的架构设计与工程实践
  • 用C语言指针实战分析双色球历史数据:一个C语言初学者的趣味项目
  • 独立开发者如何借助 Taotoken 低成本实验多种大模型
  • 【收藏干货】2026 版大模型推理底层原理拆解!吃透 Prefill/Decode 与 vLLM 核心优化
  • Qt QLineEdit的editingFinished信号为啥按回车会触发两次?一个弹窗引发的‘血案’与三种修复方案
  • HLK-LD1125H-24G雷达模块配置避坑指南:手把手教你调参实现最佳检测效果
  • 别再傻傻分不清了!一文搞懂Windows 11/10下搜狗/微软拼音输入法的全角半角切换(含快捷键设置)
  • Windows右键菜单终极清理指南:用ContextMenuManager告别杂乱,重获高效桌面
  • 从POS机到你的钱包:拆解一次刷卡背后的ISO8583协议‘暗语’
  • 从‘最大熵’到‘瑞丽熵’:手把手推导RDP公式,理解差分隐私的理论进化
  • 开始转到拼多多上面销售APP