Deep Reinforcement Learning amidst Lifelong Non-Stationarity)

  • 如有错误,欢迎指正
    • 摘要
    • introduction
    • DPMDP
    • Preliminaries: RL as Inference
      • A Probabilistic Graphical Model for RL
      • Variational Inference
    • Off-Policy Reinforcement Learning in Non-Stationary Environments
      • Non-stationarity as a Probabilistic Model
      • Joint Representation and Reinforcement Learning via Variational Inference
      • Implementation Details
    • 相关工作
    • 实验
    • 结论
  • 感想

如有错误,欢迎指正

本文翻译为机翻,仅作初步了解学习使用,需要用到的时候再回来整理。
原文链接: https://arxiv.org/pdf/2006.10701.pdf.
如有侵权,请私信本人。

摘要

作为人类,我们的目标和环境在我们的一生中都在不断地变化,这取决于我们的经验、行为以及内部和外部的驱动力。相比之下,典型的强化学习问题设置考虑的是跨事件的平稳决策过程。我们是否可以开发强化学习算法,以应对先前更现实的问题设置中的持续变化?虽然原则上在线策略的算法(如策略梯度)可以扩展到非平稳设置,但对于更有效的离线策略算法(在学习时重放过去的经验)则不能如此。在这项工作中,我们形式化了这个问题设置,并借鉴了在线学习和概率推理文献的思想,推导出了一个非策略RL算法,该算法可以对这种终身非平稳性进行推理和处理。我们的方法利用潜在变量模型从当前和过去的经验中学习环境的表示,并使用该表示执行非策略RL。我们进一步介绍了几种具有终身非平稳性的仿真环境,并从经验上发现我们的方法大大优于不考虑环境变化的方法

introduction

在标准强化学习(RL)模型中,假设agent在一个静止的环境中运行,即在固定的动态和奖励下。然而,平稳性的假设在更现实的环境中很少成立,比如在终身学习系统的背景下[54]。也就是说,在其生命周期中,一个agent可能会受到环境动态和随时间变化的奖励。例如,在机器人应用中,这种非平稳性表现在不断变化的地形和天气条件上。在某些情况下,甚至目标都不一定是固定的:考虑一个辅助机器人,帮助一个偏好随时间逐渐改变的人类。这些算法在现有的环境中是不可能很好地执行的,因为这些算法在现有的情况下是不可能很好地执行的。

至关重要的是,在上述每种情况下,环境都是由未知的时变参数指定的。这些潜在参数也不是i.i.d.,例如,如果此时天空晴朗,下一个时刻很可能不会突然开始下雨;换句话说,这些参数有关联但未观察到的动态。在本文中,我们用动态参数马尔可夫决策过程(DP-MDP)来形式化这个问题的设置。DP-MDP对应于一系列平稳的MDP,这些MDP通过一组由自治动力系统控制的潜在参数关联。虽然所有非平稳mdp都是部分可观测Markov决策过程(POMDP)[27]的特例,但在这种情况下,我们可以利用隐藏参数动态中可用的结构,避免在一般情况下求解POMDP。

在线策略RL算法原则上可以处理这种非平稳性[52]。然而,在高度动态的环境中,在环境发生变化之前只允许有限的交互,并且在策略上的方法可能无法在这种低镜头设置下足够快地适应[2]。相反,我们需要一个离线策略的RL算法,它可以利用过去的经验来提高样本效率和对环境动态进行推理。为了适应,agent需要预测MDP参数将如何变化的能力。因此,我们需要MDP的表示以及参数在这个空间中如何演变的模型,这两个都可以从离线策略的经验中学习到。

为此,我们的核心贡献是一个离线策略的RL算法,它可以通过联合学习(1)一个潜在变量模型(它提供了MDP的一个紧凑表示)和(2)一个最大熵策略与此表示相结合来在非平稳性下运行。 我们在一组显示持续非平稳性的模拟环境上验证了我们的方法,我们称之为终身潜在演员批评家(LILAC)。在我们的实验评估中,我们发现我们的方法远远优于不考虑环境动力学的RL算法。

DPMDP

标准RL设置假定与固定MDP发生偶发性交互作用[51]。在现实世界中,假设具有相同mdp的回合式交互作用是有限的,因为它没有捕捉到可能影响决策问题的各种外生因素。避免严格假设马尔科夫观测值的一个常见模型是部分观测MDP(POMDP)公式[27]。虽然POMDP非常通用,但我们在这项工作中重点关注利用非平稳MDP的已知结构来提高性能。特别地,我们考虑一个场景环境,我们称之为动态参数MDP(DP-MDP),其中每个回合中都会出现一个新的MDP(我们也称MDP为任务)。为了反映现实世界非平稳性的规律性,任务通过一组连续的参数进行顺序关联。

形式上,DP-MDP配备有状态空间S、动作空间A和初始状态分布ρS(s1)。根据隐参数MDP(HiP-MDP)[10],一组未观测到的任务参数z∈z定义了每个任务的动力学ps(st+1 | st,at;z)和奖励函数r(st,at;z)。与HiP-MDP相比,DP-MDP中的任务参数z不是i.i.d.采样,而是根据pz(zi+1 | zi)随机移动,初始分布为ρz(z1)。换言之,DP-MDP是一系列由转移函数pz确定参数的任务序列。如果每个事件的任务参数z已知,扩展的状态空间S×z将定义一个完全可观测的MDP,我们可以使用标准RL算法。因此,在我们的方法中,我们的目标是推断隐藏的任务参数并学习它们的转移函数,从而允许我们利用现有的RL算法,通过使用推断出的任务参数来增加观测值。

Preliminaries: RL as Inference

我们首先讨论概率推理和强化学习之间的一种既定联系[55,34],为我们的方法提供一些背景。在较高的层次上,该框架将顺序决策作为一个概率图形模型,从这个角度出发,最大熵RL目标可以作为该模型的推理过程。

A Probabilistic Graphical Model for RL

如图1所示,所提出的模型由状态st、动作at和每次步数最优性变量Ot组成,这些变量与p(Ot=1 | st,at)=exp(r(st,at))相关,表示从状态st采取的动作是否最优。而通过这种关系要求报酬是非正的,只要报酬是有界的,就可以归一化和中心中心化不大于0。轨迹是状态和动作的序列,(s1,a1,s2…,st,at)我们的目的是推断后验分布 p(s1:T,a1:T | O1:T=1),即所有时间步长的最优轨迹分布。

Variational Inference

在现有的推理工具中,结构化变分推理以其可扩展性和高效性来近似兴趣分布尤为引人注目。在变分推理框架下,通过变分下界对一个变分分布q进行优化,以近似另一个分布p。假设action优先,最优轨迹分布为:

我们可以选择
的形式来最大化分布,其中p(s1)和p(st+1 | st,at)是固定的,由环境给出。现在我们将q(at | st)重命名为π(at | st),因为这表示所需的策略。根据Jensen不等式,

给出了证据O1:T=1的变分下界,其为最大熵RL目标[59,55,39,17,19]。该目标增加了一个条件熵项,从而使策略的收益和熵最大化。这个公式以其在探索性、鲁棒性和稳定性方面优于其他RL算法而闻名,因此我们在我们的方法中利用它来继承这些特性。我们通过增加RL作为推理模型,为每个任务i增加潜在变量z i来捕获非平稳性。正如我们将在下一节中看到的,通过从这个概率的角度来看非平稳性,我们的算法可以作为一个统一模型中的推理过程来推导。

Off-Policy Reinforcement Learning in Non-Stationary Environments

基于RL作为推理框架,在本节中,我们提供了一个概率图形模型,它是第2节介绍的动态参数MDP设置的基础。然后,利用变分推理的工具,我们得到了一个进行RL和表示学习的变分下界。最后,我们提出了我们的RL算法,我们称之为终身潜在行为临界(LILAC),它优化了这一目标,并建立在soft actor-critic[20]的非策略最大熵RL算法的基础上。

Non-stationarity as a Probabilistic Model

我们可以将动态参数MDP转换为一个概率层次模型,其中非平稳性发生在回合层次上,并且在每个事件中是一个平稳MDP的实例。为此,我们构建了一个两层模型:在第一层,我们将潜在变量的序列zi作为Markov链,在第二层,我们将每个z i对应的Markov决策过程。DP-MDP的图形模型公式如图2所示。

在这个公式中,从每个事件收集到的轨迹是单独建模的,而不是像第3.2小节那样进行摊销,联合概率分布定义如下:
式中,假设作用前一致,每个轨迹τ给定z的概率为

通过这种分解,环境中的非平稳元素被潜在变量z捕获,在一个任务中,动态和奖励函数必然是平稳的。这表明,学习推断z(相当于用z表示环境的非平稳性元素)会将RL设置降低为平稳设置。采用这种方法很有吸引力,因为对于标准RL设置,已经存在大量的算法。在下一小节中,我们将描述如何在变分推理框架下,通过推导该模型的证据下界来近似z上的后验概率。

Joint Representation and Reinforcement Learning via Variational Inference

回想一下agent是在一个在线学习环境中运行的。也就是说,它必须不断适应一系列任务,并利用从以前的任务中收集的经验进行学习。因此,在任何一回合i>1时,该agent已观察到从第1到第i−1回合,τ1:i−1={τ1,···,τi−1},其中τ={s1,a1,r1。,sT,aT,rT}。

我们的目标是,在每一个回合i中,根据Oi 1:T=1的证据和之前回合τ1:i−1的经验,推断作用的后验分布。根据第3.2小节,我们可以利用变分推理来优化这组证据的对数概率的变分下界,log p(τ1:i−1,Oi 1:T=1)。由于p(τ1:i−1,Oi 1:T=1)分解为p(τ1:i−1)p(Oi 1:T=1 |τ1:i−1),证据的对数概率可以分解为logp(τ1:i−1)+logp(Oi 1:T=1 |τ1:i−1)。这两个项可以分别下界,并求和以形成一个单一目标。

第一项的变分下界来自变分自动编码器[29],使用了证据τ1:i−1和潜在变量z1:i−1:

我们根据第一回合的轨迹,即q(z i |τi),选择我们对潜在变量z i的近似分布。那么,变分下限可以表示为:

下界Lrep对应于序列隐变量模型中无监督表示学习的一个目标。通过优化每个片段的转换和奖励的重建损失,学习的潜在变量应编码MDP的变化参数。此外,通过KL散度对近似分布q施加先验p(z i | z i−1),鼓励潜在变量在时间上顺序一致。该先验知识对应于环境潜在动态的模型,并为agent提供对环境未来条件的预测估计(在可预测的范围内DP-MDP)。
第二阶段,

最后的不等式由第3.2小节中的步骤给出。在最大熵RL目标中,约束LRL对策略收益和策略熵都进行了优化,但这里策略也以MDP的推断潜在嵌入为条件。这个目标基本上执行任务条件强化学习,其中第一阶段的任务变量由p(z i |τ1:i−1)给出。学习多任务RL策略是很有吸引力的,尤其是对于适应不同回合的策略。也就是说,如果环境中的变化与前面所看到的类似,那么即使环境变化很快,我们也不希望它的性能降低,而单个任务策略很可能很难快速适应。我们提出的目标是上述两项的总和L=Lrep+LRL,这也是我们整个模型的一个变分下界。因此,虽然我们的目标来源于概率模型中的推理过程,但它也分解为两个非常直观的目标,第一个目标对应于无监督表示学习,第二个目标对应于强化学习

Implementation Details

为了优化上述目标,我们扩展了SAC[20],它实现了最大熵离线策略RL。我们引入了一个推理网络,它根据第i回合的轨迹,输出第i回合条件下的分布q(z i |τi)。推理网络参数化为前向神经网络,输出高斯分布的参数,我们使用重参数化技巧[29]对z进行采样。解码器神经网络根据潜在嵌入Zi、当前状态st以及在(即p(st+1 | st,at;Zi)和p(rt | st,at;zi)所采取的动作,重建轨迹和奖励。最后,p(z i | z i−1)和p(z i |τ1:i−1)近似于共享长短期记忆(LSTM)网络[25],该网络在每一回合i接收来自q(z i−1 |τi−1)和隐藏态hi−1的z i−1,并产生z i和下一个隐藏态hi。

在图3中,我们在较高的层次上可视化了整个网络以及不同组件如何交互。如图所示,策略和批评都以环境状态和潜在变量z为条件,在训练过程中,z从推理网络输出的q(zi |τi)中采样。在执行时,策略接收到的潜在变量z由LSTM网络根据前一事件推断出的潜在变量z给出。根据SAC[20],演员损失Jπ和批评损失JQ是

其中V表示目标网络。我们的完整算法,终身潜在演员批评(LILAC),总结在算法1。

相关工作

RL中的部分可观测性。POMDP是一个通用的、灵活的框架,用于解决序列决策问题中的非平稳性和部分可观测性。虽然精确解方法只适用于微小的状态空间和作用空间[27],但是(主要)基于近似贝叶斯推断的方法在过去的二十年里已经使规模扩大到更大的问题[31,44]。近年来,表征学习,特别是与摊余变分推理相结合的深度学习,使问题能够扩展到更大的一类问题,包括连续的状态和动作空间[26,23,32,22]和图像观察[32,28]。然而,POMDP公式的普遍性既忽略了利用DP-MDP的结构可能实现的性能改进,也没有明确地考虑事件之间的非平稳性。

在回合制mdp和pomdp之间提出了各种中间问题陈述。Bayes自适应MDP公式(BAMDP)[12,42]以及隐藏参数MDP(HiP MDP)[10]考虑了一个控制奖励和动态的未知参数的MDP,我们的目标是在一个事件的过程中在线推断。在这个公式中,通过对潜在参数的后验信念表示来扩充状态空间来解决勘探开发困境。正如Duff[12]在RL文献中和Feldbaum[14]、Bar Shalom和Tse[5]在控制理论中指出的,由于状态维数的爆炸性,这种表示很快变得难以处理。最近的工作主要通过摊销推断,为BAMDPs中的策略优化开发了有效的方法[60,38,33]。然而,BAMDP框架并没有处理事件之间潜在参数的动态变化,假设一个时间固定的结构。相比之下,我们能够模拟潜在变量在事件过程中的演变,从而为在线推理提供更好的先验知识。

一个高度相关的设置是隐模式MDP[8],它通过一个具有离散状态数的隐马尔可夫模型来增加MDP。在HM-MDP和DP-MDP中,潜在变量很少进化,与POMDP中的每个时间步相反。由于使用标准的HMM推理算法,HM-MDP仅限于固定数量的潜在变量状态。相比之下,我们的方法允许连续的潜在变量,因此广泛地扩展了适用范围。

学习中的非平稳性。LILAC还与在线学习和终身学习的方法在概念上有相似之处[47,18],这些方法旨在捕捉监督学习中的非平稳性,以及旨在快速适应新环境的元学习和元强化学习算法。在元强化学习中,存在两种主要的技术:基于优化的[15,43,61,50]和基于上下文的,其中既包括递归结构[11,56,36]和基于潜在变量推理的结构[38,32,60]。丁香花属于这一分类法中的最后一类,但通过考虑回合制潜在变量动态,扩展了以前的方法。以前基于嵌入的meta-RL算法虽然能够执行潜在变量的在线推断并将这种后验信念纳入动作选择中,但没有考虑这些潜在变量在代理的生命周期内如何演化,就像在DP-MDP设置中一样。丁香花的内隐变量推理成分与持续学习和终身学习环境有很强的相似性[18]。许多持续和终身学习的目标是学习各种任务而不忘记以前的任务[30、58、35、3、37、45、49、40、48]。我们考虑将过去的经验存储在回放缓冲区中的设置[41,16]。与这些先前的工作不同,丁香花的目标是学习与潜在因素相关的动态,并进行在线推理。

Chandak等人的并行工作。[7] 研究了一个类似于我们的环境,在这种环境下,奖励和过渡动态在各个阶段都会平稳地变化,并建议使用曲线拟合来估计未来mdp的性能,并学习一个针对未来性能进行优化的单一策略。在快速变化的环境中,这种持续的策略调整需求会导致性能滞后;相反,LILAC学习了一种潜在变量条件策略,其中不同的mdp映射到这些潜在变量的不同值,因此对非平稳性的速率不太敏感。

实验

在我们的实验中,我们的目标是解决我们的中心假设:现有的非策略RL算法在持续的非平稳性下效果不佳,并且通过利用我们的潜在变量模型,我们的方法可以使学习在这样的环境下既有效又高效。

环境。我们构造了四个连续的控制环境,在奖励和/或动态中有不同的变化源。这些环境的设计使策略需要更改才能获得良好的性能。第一个来源于元世界基准[57]中的模拟索耶到达任务,在这个任务中,目标位置不被观察到,并且在回合之间移动。在基于OpenAI Gym[6]的半猎豹的第二个环境中,我们考虑了agent上风力的方向和大小的变化,以及目标速度的变化。接下来,我们考虑8自由度minitaur环境[53],并在每一回合之间改变agent的质量,代表不同的有效载荷。最后,我们构造了一个二维导航任务在一个无限的,非回合制的非平稳动态环境中,我们称之为二维开放世界。该agent的目标是收集食物颗粒,并避免其他物体和障碍物,同时受到未知扰动的影响,这些扰动会随时间的变化而变化。这些环境如图4所示。有关完整的环境详细信息,请参阅附录A。

比较。我们将我们的方法与标准的SAC[20]进行比较,它对应于我们的方法,没有任何潜在变量,允许我们在非平稳性下评估非策略算法的性能。我们还比较了随机潜在参与者批评(SLAC)[32],它学习用潜在变量模型来模拟部分观察到的环境,但不解决事件间的非平稳性。通过这种比较,我们可以评估在情节之间建立非平稳性模型的重要性。最后,我们将最近策略优化(PPO)[46]作为与on-policy RL的比较。由于Sawyer和Half Cheetah域中的任务涉及目标达成,因此我们可以通过训练目标条件SAC策略来获得预言,即将真实目标与观察值相连接。我们提供这种比较,以帮助将我们的方法与其他算法的性能结合起来。我们调整所有方法的超参数,并使用3个随机种子以最佳超参数设置运行每个方法。有关所有超参数的详细信息,请参阅附录B。

结果。我们的实验结果如图5所示。由于on-policy算法往往具有更差的样本复杂度,我们运行了1000万个环境步骤的PPO,并且只绘制了渐近收益。在所有领域,与SAC、SLAC和PPO相比,LILAC获得了更高、更稳定的回报。由于SAC将跨回合收集的经验分摊到单个回放缓冲区中,我们观察到该算法收敛到一个平均行为。同时,SLAC没有跨回合建模非平稳性的机制,必须从每一回合所采取的初始步骤中推断未知的动态和奖赏,这一点该算法并不十分成功。由于任务的周期性,SLAC的学习行为会导致任务间收益的振荡。同样,PPO也不能适应每回合环境的变化,最终会收敛到学习一个平均策略。与这些方法不同的是,尽管在每一回合中都会经历环境的持续变化,但LILAC可以推断出未来回合中环境的变化,并在训练过程中稳定地保持高回报。此外,LILAC可以在动力和奖励的同时变化下学习,HC WindVel的结果证实了这一点。LILAC也可以熟练地处理二维开放世界环境中的变化,而不需要回合重置。图4显示了此任务中agent生存期的部分快照。

环境变化率。接下来,我们将评估LILAC是否能够处理不同的非平稳率。为此,我们使用Sawyer reaching域,目标沿固定半径的圆移动,并沿圆改变步长(0.2、0.4、0.6和0.8弧度/步),以生成以不同速度移动的环境。如图6所示,LILAC的性能在很大程度上独立于环境的变化率。我们还评估了LILAC在固定条件下,即有固定的目标,并发现LILAC达到了与SAC相同的性能,从而保持了在固定环境中与SAC一样有效的学习能力。这些结果证明了LILAC在一系列非平稳率下的有效性,包括静止情况。

LILAC在非平稳和平稳情况下的性能差距可能是由于先前的pφ(z0 | z)对未来环境条件的不精确估计造成的。目前,执行的策略在事件的整个持续时间内使用previor给定的固定z,但是可以提高性能的一个自然扩展是在每个回合期间更新z。特别地,我们可以用推理网络对收集到的部分轨迹进行编码,并将推断值与先验值相结合,形成一个更新的估计值,类似于贝叶斯滤波。

结论

我们考虑了具有终身非平稳性的强化学习问题,我们认为这个问题对于在现实世界中运行的强化学习系统至关重要。该问题处于部分可观测性下的强化学习(即POMDPs)与在线学习的交叉点,因此我们将该问题形式化为POMDP的一个特例,它也明显更易于处理。我们推导出了这个问题背景下的一个图形模型,并利用它来推导我们在强化学习形式下的方法,即概率推理[34]。我们的方法利用这个潜在变量模型来模拟环境的变化,并对这些潜在变量的推断值进行政策和批评。在具有显著非平稳性的各种具有挑战性的连续控制任务中,我们观察到,与最先进的强化学习方法相比,我们的方法带来了实质性的改进。

虽然DP-MDP公式代表了通常认为的元强化学习设置(通常是BAMDP[60])的严格概括,但其通用性仍有一定的局限性。特别是,假设任务参数会在情节之间发生变化,但不会在其间发生,这可能是一个不切实际的限制。虽然放松这一假设,在最坏的情况下会导致POMDP,但在HM-MDP[8]假设任务参数中不经常、离散、不可观测的变化时,可能会利用额外的结构。特别是,这种罕见的、离散的移位的概念是变化点检测文献[1,13]的基础。先前在不断变化的环境中进行的顺序决策[9,21,4]和在不断变化的数据流中的元学习[24]都可能使LILAC版本能够处理未观察到的变化点,并且这种设置可能是未来研究的一个富有成效的方向。

感想

这篇文章为了使智能体能适应不同的环境,用一个分布z来表示不同的环境,在此基础上获得马尔可夫决策过程进行训练。虽然性能比平稳条件下的算法低,但是保证了在不同环境下性能的稳定性。存在一个问题是真实世界的环境变化应该无法用一个分布z来表示。所以在应用时可能性能堪忧。

Deep Reinforcement Learning amidst Lifelong Non-Stationarity相关推荐

  1. 18 Issues in Current Deep Reinforcement Learning from ZhiHu

    深度强化学习的18个关键问题 from: https://zhuanlan.zhihu.com/p/32153603 85 人赞了该文章 深度强化学习的问题在哪里?未来怎么走?哪些方面可以突破? 这两 ...

  2. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

  3. Deep Reinforcement Learning 深度增强学习资源

    http://blog.csdn.net/songrotek/article/details/50572935 1 学习资料 增强学习课程 David Silver (有视频和ppt): http:/ ...

  4. 深度强化学习(Deep Reinforcement Learning)的资源

    深度强化学习(Deep Reinforcement Learning)的资源 2015-04-08 11:21:00|  分类: Torch |  标签:深度强化学习   |举报 |字号 订阅 Goo ...

  5. 利用Deep Reinforcement Learning训练王者荣耀超强AI

    Mastering Complex Control in MOBA Games with Deep Reinforcement Learning (一)知识背景 (二)系统架构 (三)算法结构 3.1 ...

  6. 论文笔记之:Deep Reinforcement Learning with Double Q-learning

    Deep Reinforcement Learning with Double Q-learning Google DeepMind Abstract 主流的 Q-learning 算法过高的估计在特 ...

  7. 深度学习(19): Deep Reinforcement learning(Policy gradientinteract with environment)

    Deep Reinforcement learning AL=DL+RL Machine 观察到环境的状态,做出一些行为对环境产生影响,环境根据machine的改变给予一个reward.正向的acti ...

  8. [DQN] Playing Atari with Deep Reinforcement Learning

    论文链接:https://arxiv.org/abs/1312.5602 引用:Mnih V, Kavukcuoglu K, Silver D, et al. Playing atari with d ...

  9. 算法笔记:Playing Atari with Deep Reinforcement Learning

    Playing Atari with Deep Reinforcement Learning 比较尴尬,上篇文章不是DQN的来源,这篇才是.上篇Nature文章对于DQN做出的改进上次没读明白,查看其 ...

最新文章

  1. no argument specified with option /LIBPATH:错误的解决
  2. 机器视觉与机器学习牛人博客
  3. 测试晶面间距软件_【干货】高分辨TEM晶面间距的测量与标定丨DM软件
  4. JQuery系列(8) - JQuery插件开发
  5. Java中异常的分类
  6. nginx rtmp module 代码详解 各模块主要功能
  7. [JavaWeb-HTML]HTML概念介绍和快速入门
  8. Replace Exception with Test(以测试取代异常)
  9. python scrapy框架 简书_python爬虫框架——Scrapy架构原理介绍
  10. rundll32的使用和使用c#调用dll
  11. 翁恺老师C语言学习笔记(十)指针_指针运算
  12. 微信H5分享钉钉分享设置方法
  13. Ember.js 初学指南
  14. 计算机磁盘修复工具,CHKDSK磁盘修复工具使用教程
  15. 【毕业设计】基于树莓派的指纹识别考勤系统 - 单片机 嵌入式 物联网
  16. jmeter同步定时器
  17. 【五一专属活动】向所有热爱分享的“技术劳动者”致敬
  18. tensorflow 参数clipping
  19. 电驴服务器搜索文件排序,【图文教程】搜索功能使用全解
  20. 基于python的微信好友数据分析_python 微信好友特征数据分析及可视化

热门文章

  1. [半监督学习] Adversarial Dropout for Supervised and Semi-Supervised Learning
  2. 警务扫描识别车牌号的技术
  3. Redis五大基本类型(狂神视频笔记)
  4. c语言程序翻译软件,C语言基础 (15) 翻译软件
  5. 《pigcms v6.2最新完美至尊版无任何限制,小猪微信源码多用户微信营销服务平台系统》...
  6. 数据科学课程笔记1 --- 导论
  7. 零基础选择原画还是建模好入门呢?
  8. mfc实现计算器的平方功能_电子史 · 计算器,每天都在进化中
  9. 日式减肥食谱1月甩10斤肉
  10. Jon Skeet:我不想知道我在SO上到底花了多少时间