强化学习中的脉冲神经网络
简 介: 脉冲强化学习是最近兴起的将脉冲神经网络应用到强化学习中的一个研究领域。固然脉冲神经网络的引入会给强化学习带来一些新的东西,但目前的研究仍然仅仅满足于如何让算法收敛,而没有发挥出脉冲神经网络独特的优势。本文分别对强化学习和脉冲神经网络进行简要介绍,分析了脉冲强化学习的主要难点,然后介绍了目前主要的脉冲强化学习算法,
关键词
: 关键词:脉冲神经网络,强化学习,人工通用智能
Contents
直接转换
传播算法
- 作者:杜宇
- 日期:2022年 1月 4日
§01 简 介
脉冲强化学习是最近兴起的将脉冲神经网络应用到强化学习中的一个研究领域。固然脉冲神经网络的引入会给强化学习带来一些新的东西,但目前的研究大部分仍然仅仅满足于如何让算法收敛,而没有发挥出脉冲神经网络独特的优势。本节首先简要介绍强化学习和脉冲神经网络背景知识,然后提出脉冲强化学习面临的挑战。
强化学习
强化学习 (reinforcement learning)
、监督学习 (supervised learning)
、无监督学习 (unsupervised learning)
是深度学习的三大范式。
强化学习在思想上介于监督学习和无监督学习之间,它既不像监督学习那样有着完全的监督信号,也不像无监督学习没有任何标签 ,而是用存在延时的奖励函数 (reward function)来指导智能体的学习。
在监督学习中,每一个输入都有着对应的目标输出匹配,模型学习的是输入输出的对应关系。无监督学习则完全没有对应的目标输出,而是通过挖 掘自身信息来构造目标函数,模型学习的是数据的内在联系。强化学习则有着稀疏的监督信号即累计回报。
强化学习的要素有环境,奖励,动作和状态。强化学习的目标是针对一个连续决策问题得到一个最优的策略 (policy)
,使得在该策略下获得的累积回报最大。这类似于动物心理学中似乎发生的过程。例如,生物大脑会将诸如疼痛和饥饿之类的信号解释为负面强化,而将愉悦和食物摄入解释为正面强化。在某些情况下,动物可以学习进行能够最大化这些奖励的行为。这表明动物能够进行某种强化学习。
这就涉及到探索 (exploration)
与利用 (exploitation)
的平衡问题。利用是做出当前信息下的最佳决定,探索则是尝试不同的行为继而收集更多的信息。
强化学习是一个交叉学科,涉及到博弈论,控制论,运筹学,信息论,基于仿真的优化,多智能体系统,群体智能和统计。在运筹学和控制文献中,强化学习称为近似动态规划或神经动力学规划。强化学习被众多学者认为是最接近通用人工智能的一种范式,且已经在游戏,电网调度,商品推荐等众多领域展现出了强大实力。家喻户晓的阿法狗背后的算法就是基于模型 (Model-based)
的强化学习。
▲ 图1.1.1 强化学习示意图
马尔可夫决策过程强化学习可以抽象成马尔可夫决策过程 (Markov Deci
¬sion Process)
。马尔可夫性是指在已知“现在”的情况下,“将来”与“过去”无关。
一个标准的马尔可夫决策过程可以如下建模:
• 环境的状态集合 S
• 智能体的动作集合 A
• 在给定当前动作 a时环境的状态转移函数 Pa(s∣s′)=Pr(st+1=s′∣st=s,at=a)P_a \left( {s|s'} \right) = P_r \left( {s_{t + 1} = s'|s_t = s,a_t = a} \right)Pa(s∣s′)=Pr(st+1=s′∣st=s,at=a) 表示由状态 s进入 s ′的概率。
• 在执行动作 a后,由状态 s转移到 s 的即时奖励函数 Ra (s, s ′ ),注意这个奖励函数不是最终的奖励,和之前说的奖励并不即时并不矛盾,我们需要计算一个总的累积回报函数来作为监督信号。
一个基本的强化学习智能体以离散时间步和环境做交互,在时刻 t,智能体接受当前的状态 st和奖励 rt,然后从可行的动作集 A选择一个动作 at,智能体随即进入到一个新的状态 st+1,同时得到一个相应的奖励函数 rt+1。基本公式强化学习需要学习一个策略函数: π : S → A来最大化期望累积回报函数。
首先定义状态价值函数和动作状态价值函数。状态价值函数 V π(s)是指在初始状态 s下根据策略 π进行决策获得收益的期望。而动作状态价值函数 Qπ(s, a)就是在某一时刻的 s状态下 (s ∈S,采取动作 a(a ∈A)能够获得收益的期望。数学表达式如下
Vπ(s)=Eπ[Gt∣St=s]V^\pi \left( s \right) = E^\pi \left[ {G_t |S_t = s} \right]Vπ(s)=Eπ[Gt∣St=s]G=∑t′=t∞γtRtG = \sum\limits_{t' = t}^\infty {\gamma ^t R_t }G=t′=t∑∞γtRtQπ(s,a)=E[Gt∣St=s,At=a]Q_\pi \left( {s,a} \right) = E\left[ {G_t |S_t = s,A_t = a} \right]Qπ(s,a)=E[Gt∣St=s,At=a]
Gt是累计回报,γ为折扣因子,且 0 <γ< 1 (离现在越远的将来的反馈对现在的影响越小)。Vπ(s)是我们想要最大化的对象。
动作状态价值函数 Q和状态价值函数 V可以如下互相转化,
Vπ(s)=∑a∈Aπ(a∣s)Qπ(s,a)V_\pi \left( s \right) = \sum\limits_{a \in A}^{} {\pi \left( {a|s} \right)Q_\pi \left( {s,a} \right)}Vπ(s)=a∈A∑π(a∣s)Qπ(s,a)Qπ(s,a)=Rsa+γ∑s′∈SPss′aVπ(s′)Q_\pi \left( {s,a} \right) = R_s^a + \gamma \sum\limits_{s' \in S}^{} {P_{ss'}^a V_\pi \left( {s'} \right)}Qπ(s,a)=Rsa+γs′∈S∑Pss′aVπ(s′)
另外还有如下递推关系,
vπ(s)=Eπ[Rt+1+γvπ(St+1)∣St=s]v_\pi \left( s \right) = E_\pi \left[ {R_{t + 1} + \gamma v_\pi \left( {S_{t + 1} } \right)|S_t = s} \right]vπ(s)=Eπ[Rt+1+γvπ(St+1)∣St=s]qπ(s,a)=Eπ[Rt+1+γqπ(St+1,At+1)∣St=s,At=a]q_\pi \left( {s,a} \right) = E_\pi \left[ {R_{t + 1} + \gamma q_\pi \left( {S_{t + 1} ,A_{t + 1} } \right)|S_t = s,A_t = a} \right]qπ(s,a)=Eπ[Rt+1+γqπ(St+1,At+1)∣St=s,At=a]
▲ 图1.1.2 Q表格
公式 4
即贝尔曼方程,它把价值函数分解成了当前的即时奖励以及后续状态的折扣价值。
强化学习有基于价值 (Value-based)
和基于策略 (Policy-based)
两种派别。而 Actor Critic
将这两种派别融合在一起,现在的大多数算法是基于 Actor Critic
的框架。下面介绍几种后面会涉及的强化学习算法。
Q Learning
这是最经典的基于价值的强化学习算法 [23]
,主要思想就是将 State
和 Action
建成一张 Q
表来存储 Q
值,
如图 2
,然后根据 Q
值来选择最优动作,
再根据贝尔曼方程进行更新。Q Learning
学习的是动作价值函数,间接得到策略。这种方法只能应用于离散动作空间 (
因为在求取最优动作时会有一个 argmax
的操作) REINFORCE REINFORECE
是一种基于策略的强化学习算法。与基于值函数的方法相比,基于策略函数的方法直接利用梯度上升法求解最优的策略函数 πθ,核心公式为,
θ=θ+α∇J(θ)\theta = \theta + \alpha \nabla J\left( \theta \right)θ=θ+α∇J(θ)J(θ)=E[G∣θ]J\left( \theta \right) = E\left[ {G|\theta } \right]J(θ)=E[G∣θ]∇J(θ)∝Eπ[Gt∂lnπ(St,At,θ)∂θ∣θ]\nabla J\left( \theta \right) \propto E_\pi \left[ {G_t {{\partial \ln \pi \left( {S_t ,A_t ,\theta } \right)} \over {\partial \theta }}|\theta } \right]∇J(θ)∝Eπ[Gt∂θ∂lnπ(St,At,θ)∣θ]
  REINFORCE
需要完整的一轮 (episode)
数据才能更新 ,
利用的是蒙特卡罗方法,即智能体运行直到终止状态。
TD(
λ)时间差分算法 (Temporal difference learning
简称 ````TD)是蒙特卡洛 (MC)
思想和动态规划 (DP)
的结合。它利用当前的估计值来更新估计值,也叫 Bootstrap
。与蒙特卡洛相比,它不用等待最终的结果,每一步都可以进行更新。TD error
定义为,
∇J(θ)=Eπ[(Gt−Vθ(St))∂lnπ(St,At,θ)∂θ∣θ]\nabla J\left( \theta \right) = E_\pi \left[ {\left( {G_t - V^\theta \left( {S_t } \right)} \right){{\partial \ln \pi \left( {S_t ,A_t ,\theta } \right)} \over {\partial \theta }}|\theta } \right]∇J(θ)=Eπ[(Gt−Vθ(St))∂θ∂lnπ(St,At,θ)∣θ]Vθ(St)=Eθ[Gt∣st]V^\theta \left( {S_t } \right) = E_\theta \left[ {G_t |s_t } \right]Vθ(St)=Eθ[Gt∣st]
其更新公式为
δt=Rt+γVπθ(St+1)−Vπθ(St)\delta _t = R_t + \gamma V_\pi ^\theta \left( {S_{t + 1} } \right) - V_\pi ^\theta \left( {S_t } \right)δt=Rt+γVπθ(St+1)−Vπθ(St)
θ←θαδt∂Vπθ(St)∂θ\theta \leftarrow \theta \alpha \delta _t {{\partial V_\pi ^\theta \left( {S_t } \right)} \over {\partial \theta }}θ←θαδt∂θ∂Vπθ(St)
相比蒙特卡洛,显然 TD的偏差更大,但同时 TD的方差相对也更小。 TD(λ)则是 TD(0)的一个扩展算法,在 MC和 TD之间做了一个折中,定义 n步回报和 λ回报,
Gt(n)=Rt+1+γRt+1+⋯+γn−1Rt+n+γnV(St+n)G_t^{\left( n \right)} = R_{t + 1} + \gamma R_{t + 1} + \cdots + \gamma ^{n - 1} R_{t + n} + \gamma ^n V\left( {S_{t + n} } \right)Gt(n)=Rt+1+γRt+1+⋯+γn−1Rt+n+γnV(St+n)Gtλ=(1−λ)∑n=1∞λn−1Gt(n)G_t^\lambda = \left( {1 - \lambda } \right)\sum\limits_{n = 1}^\infty {\lambda ^{n - 1} G_t^{\left( n \right)} }Gtλ=(1−λ)n=1∑∞λn−1Gt(n)
TD(
λ)
用 G
λt
来做更新。然后 G
λt
的这种形式在算法实现上有些困难,所以在实现时通常采用资格迹的做法。在做更新时,在当前奖励之前的所有状态都要被考虑到,用迹 (eligibility)
来记录历史的状态价值函数梯度,并用 γλ来进行加权。
ev←γλev+∂Vπθ(St)∂θe_v \leftarrow \gamma \lambda e_v + {{\partial V_\pi ^\theta \left( {S_t } \right)} \over {\partial \theta }}ev←γλev+∂θ∂Vπθ(St)
参数更新方式为
KaTeX parse error: Undefined control sequence: \alph at position 30: …rrow \theta + \̲a̲l̲p̲h̲``ctor Critic A…
Actor Critic Actor Critic是融合基于价值和基于策略的一类方法,策略和状态价值函数分别用动作执行网络 (actor)和价值评价网络 (critic)来逼近。这里的 J(θ)将 REINFORCE中的 Gt替换成价值评价函数 Ψt,则
∇J(θ)=E[∑t=0∞Ψt∇θlogπθ(at∣st)]\nabla J\left( \theta \right) = E\left[ {\sum\limits_{t = 0}^\infty {\Psi _t \nabla _\theta \log \pi _\theta \left( {a_t |s_t } \right)} } \right]∇J(θ)=E[t=0∑∞Ψt∇θlogπθ(at∣st)]
Ψt可以取动作价值函数 Q(s,a),优势函数 A(s,a)等等。
A(st,at)=Q(st,at)−V(st)A\left( {s_t ,a_t } \right) = Q\left( {s_t ,a_t } \right) - V\left( {s_t } \right)A(st,at)=Q(st,at)−V(st)
1.2脉冲神经网络
近年来,起源于脑科学的脉冲神经网络 链机制,
建议上Sp
传kimg Neural NeotnwrGfjk)
被誉为新一代的神经网络 [5],
以其丰富的时空领域的神经动力学特性、多样的编码机制、事件驱动的优势引起了学者的关注。当前脉冲神经网络的训练算法主要分为以脉冲时间可塑性 (Spike-timing Dependent Plasticity, STDP)
为代表的无监督训练算法 [8]
与 ANN
转换 SNN[13]
和时空域的误差反向传播算法 [25, 24(
。LIF(Liaky IkinggateNeural Network#pic_center =560x)]<center> and Fire)
是最简单也最常用的一种脉冲神经元模型,
τmdVdt=Vrest−V+RmI\tau _m {{dV} \over {dt}} = V_{rest} - V + R_m IτmdtdV=Vrest−V+RmI
dt
其中 τm
表示膜时间常数, Vrest
表示静息电位, Rm,I
分别表示细胞膜的阻抗和输入电流。LIF
模型极大简化了动作电位过程,但保留了实际神经元膜电位的泄露、积累以及阈值激发这三个关键特征。在脉冲神经网络领域中,
▲ 图1.2.1 脉冲神经元丰富的编码方式
特别是 ANN
转换成 SNN
时,可将脉冲发放率和 ANN
中连续输出值等价,这使得频率编码获得大量使用。但除了频率编码, SNN
还有着更为丰富的时间编码,如图 3
所示,从接受刺激到发放首个脉冲的时间以及脉冲之间的时序逻辑也都被认为可以编码重要信息,分别被称为首个脉冲时间编码 [22]
和排序编码 [20]
。
1.3主要难点
脉冲强化学习的主要难点在于强化学习对于网络的表示精度要求非常高。例如,对于一个训练好的 DQN
网络,几个不同的动作输出的 Q
值可以非常接近。如果精度不够的话,就会出现对于几个不同的输入却得到相同的动作值,这会使得智能体的轨迹越来越偏离最优解。而在分类网络中,正确类的分数通常要比其他类高很多,精度要求相对较低。
另外相对于基于 ANN
的强化学习, SNN
在训练时会比 ANN
慢很多,通常和 SNN
的 simulation time
成正比。这会导致更高的研究成本,实际应用时也会存在困难。
§02 脉冲强化学习
也就是带有脉冲神经元的强化学习算法。目前强化学习中 spiking agent所使用的训练算法大致分为三种
- ANN到 SNN的直接转换 (ANN-SNN Conversion)
- 局部学习 (local learning)
- 时空域反向传播算法 (STBP)
下面分别加以介绍
2.1 ANN到 SNN的直接转换
Sengupta
等 [1]
展现了像 VGG[14]
、ResNet[4]
这种非常深的 ANN
网络可以被转化为 SNN
,且在 cifar-10
和 ImageNet
数据集上只有 1%
的精度损失。
ANN
转换为 SNN
的理论核心是建立 SNN
的发射率 (firing rate)
和 ANN
的激活值 (action value)
之间的关系 [10]
。通过这个对应关系,可以将训练好的 ANN
转化为 SNN
,这样就可以直接得到高性能的 SNN
,不需要额外的训练。
最近,Patel
等人 [15]
最近成功将一个在 Atari
游戏 BreakOut
上训练好的 DQN
网络转换为 SNN
网络,几乎没有性能损失,并且鲁棒性甚至更好 (
他们通过将部分游戏图片用黑条模糊化来测试 agent
的鲁棒性))
。
下面简单介绍一下转换方法。
这里以最简单的 IF
模型为例,对于一个 L
层的 IF SNN
网络,令 {Wl},{bl}, l
∈{1, ..., L}
为第 l
层的权重和偏置。第 l
层在 t
时刻的输入 zl(t)
可以如下计算:
zl(t)=Wlθl−1(t)+blz_l \left( t \right) = W_l \theta _{l - 1} \left( t \right) + b_lzl(t)=Wlθl−1(t)+bl
θl−1(t)是一个矩阵,表示第 l-1层的神经元在 t时刻是否发放了脉冲,有
θl(t)=λ[Vl(t−1)+zl(t)−Vthr]\theta _l \left( t \right) = \lambda \left[ {V_l \left( {t - 1} \right) + z_l \left( t \right) - V_{thr} } \right]θl(t)=λ[Vl(t−1)+zl(t)−Vthr]
θ(x)={1,x≥00,x<0\theta \left( x \right) = \left\{ \begin{matrix} {1,\,\,x \ge 0}\\{0,\,\,x < 0}\\\end{matrix} \right.θ(x)={1,x≥00,x<0
这里 Vl(t
− 1)
为第 l
层在 t-1
时刻的膜电位。 Vthr
是脉冲神经元的膜电位发放阈值。
膜电位的更新方式有两种,一种是置零法,即发射脉冲后,直接将膜电位置零,另一种是减去阈值法,即发射脉冲后,从膜电位减去发射阈值,后者保留了膜电位的原始信息,最终的转换效果也更好。因此在这里采用减去阈值法,则
Vl(t)=Vl(t−1)+zl(t)−Vthr⋅θl(t)V_l \left( t \right) = V_l \left( {t - 1} \right) + z_l \left( t \right) - V_{thr} \cdot \theta _l \left( t \right)Vl(t)=Vl(t−1)+zl(t)−Vthr⋅θl(t)
公式 18和 19阐释了 IF神经元模型的主要机理。当 l> 0,经过仿真时间 t,得到公式 19的累积形式
∑t′=1tVl(t′)=∑t′=1tVl(t′−1)+∑t′=1tzl(t′)−∑t′=1tVthrθl(t′)\sum\limits_{t' = 1}^t {V_l \left( {t'} \right)} = \sum\limits_{t' = 1}^t {V_l \left( {t' - 1} \right)} + \sum\limits_{t' = 1}^t {z_l \left( {t'} \right)} - \sum\limits_{t' = 1}^t {V_{thr} \theta _l \left( {t'} \right)}t′=1∑tVl(t′)=t′=1∑tVl(t′−1)+t′=1∑tzl(t′)−t′=1∑tVthrθl(t′)
将公式 18代入到公式 19,并在两边除以 t,得到
Vl(t)−Vl(0)t=∑t′=1tWlθl−1(t′)−Vthrθl(t′)+blt{{V_l \left( t \right) - V_l \left( 0 \right)} \over t} = {{\sum\limits_{t' = 1}^t {W_l \theta _{l - 1} \left( {t'} \right)} - V_{thr} \theta _l \left( {t'} \right) + b_l } \over t}tVl(t)−Vl(0)=tt′=1∑tWlθl−1(t′)−Vthrθl(t′)+bl
这里 Vl(0) = 0, ∑t(t)′ =1 tθl(t ′)= rl(t),即第 l层在时间 t的发射率。又由
Vl(t)t=Wlrl−1−Vthrrl(t)+bl{{V_l \left( t \right)} \over t} = W_l r_{l - 1} - V_{thr} r_l \left( t \right) + b_ltVl(t)=Wlrl−1−Vthrrl(t)+blrl(t)=Wlrl−1(t)+bl−Vl(t)tVthrr_l \left( t \right) = {{W_l r_{l - 1} \left( t \right) + b_l - {{V_l \left( t \right)} \over t}} \over {V_{thr} }}rl(t)=VthrWlrl−1(t)+bl−tVl(t)
令 Vlt(t) 为 ∇Vl,于是:
rl(t)=Wlrl−1(t)+bl−∇VlVthrr_l \left( t \right) = {{W_l r_{l - 1} \left( t \right) + b_l - \nabla V_l } \over {V_{thr} }}rl(t)=VthrWlrl−1(t)+bl−∇Vl
公式 24是转换的核心公式。从该式也可以看出发射率和发射阈值成反比。当 l=0,第 0层是输入层,需要让 SNN和 ANN有相同的输入,即 z0 = a0,则
V0(t)−V0(0)=∑t′=1tz0(t′)−∑t′=1tVthrθ0(t′)V_0 \left( t \right) - V_0 \left( 0 \right) = \sum\limits_{t' = 1}^t {z_0 \left( {t'} \right)} - \sum\limits_{t' = 1}^t {V_{thr} \theta _0 \left( {t'} \right)}V0(t)−V0(0)=t′=1∑tz0(t′)−t′=1∑tVthrθ0(t′)V0(t)=ta0−Vthrt⋅r0(t)V_0 \left( t \right) = ta_0 - V_{thr} t \cdot r_0 \left( t \right)V0(t)=ta0−Vthrt⋅r0(t)r0(t)=a0−∇V0Vthrr_0 \left( t \right) = {{a_0 - \nabla V_0 } \over {V_{thr} }}r0(t)=Vthra0−∇V0
得到 r0(t)后,反复利用公式 24,得到
rl(t)=∏i=1lWiaoVthrl+1+blVthr+Wlbl−1Vthr2+⋯+∏i=2lWib1Vthrl−∇VlVthr−Wl∇Vl−1Vthr2−⋯−∏i=1lWi∇V0Vthrl+1r_l \left( t \right) = {{\prod\limits_{i = 1}^l {W_i a_o } } \over {V_{thr^{l + 1} } }} + {{b_l } \over {V_{thr} }} + {{W_l b_{l - 1} } \over {V_{thr}^2 }} + \cdots + {{\prod\limits_{i = 2}^l {W_i b_1 } } \over {V_{thr}^l }} - {{\nabla V_l } \over {V_{thr} }} - {{W_l \nabla V_{l - 1} } \over {V_{thr}^2 }} - \cdots - {{\prod\limits_{i = 1}^l {W_i \nabla V_0 } } \over {V_{thr}^{l + 1} }}rl(t)=Vthrl+1i=1∏lWiao+Vthrbl+Vthr2Wlbl−1+⋯+Vthrli=2∏lWib1−Vthr∇Vl−Vthr2Wl∇Vl−1−⋯−Vthrl+1i=1∏lWi∇V0
因为一个脉冲神经元每个时刻最多只能发放一个脉冲,所以 0
≤ θl(t)
≤
∑ t t,
而 rl(t)= t
θlt (t) ,
因此发放率 rl(t)
的范围是 [0,1]
,相当于一个输出为 0
到 1
的激活函数,如 sigmoid
。在 ANN
转换为 SNN
的过程中,可以采取一些措施降低误差。根据公式 23,
转化的误差受模拟时间 t
的影响很大,模拟时间越长,则误差越小,但如果模拟时间增加的话,又会增加功耗。那么在不增加模拟时间的情况下,如何降低误差呢,主要有下面两种。
1) 参数正则化
wln=λl−1λlwl,bln=blλ1w_l^n = {{\lambda _{l - 1} } \over {\lambda _l }}w_l ,\,\,\,b_l^n = {{b_l } \over {\lambda _1 }}wln=λlλl−1wl,bln=λ1bl
为了使 ANN
的激活层输出和 SNN
的发放率的范围即 [0,1]
保持一致,需要除以每一层激活值的最大值。 λl
即为第 l
层的激活值(通常为 Relu
层的输出 )
的最大值。 ωl,bl
和 ωln,bnl
分别是正则化之前和正则化之后的权重。
注意,分子上的 λl
−1
是为了恢复前一层的信息 (
前一层的输出也进行了正则化)
。
但在实际过程中,每一层的激活值可能会出现少量的超大值,使得正则化之后大部分值都远远小于 1
。那么一种改进的方法是采用每一层的 p
分位数去做正则化。
2) 最后一层发放率优化
一种优化方式是利用残余电位改善最后一层脉冲神经元的发放率。从公式 20可以看出将最后一层的残余电位加回去可以有效改善最后一层的转化误差。
flast(t)=rlast(t)+Vlast(t)t⋅Vthrf_{last} \left( t \right) = r_{last} \left( t \right) + {{V_{last} \left( t \right)} \over {t \cdot V_{thr} }}flast(t)=rlast(t)+t⋅VthrVlast(t)
这里 rlast(t)和 Vlast(t)分别是最后一层的发放率和残余电位。
2.2局部学习
当在神经形态硬件上训练网络时,需要考虑到每个神经元只能独立进行计算,不能获取全局信息。而梯度反向传播在某些方面与此相悖 (
需要保存全局权重用于前传和反传),因此必须提出新的学习规则,即局部学习规则 (local learning)[2]
。目前,主要有两种局部学习规则。
1)
脉冲时间依赖可塑性 (Spiking-Timing-Dependent-Plasticity,STDP) STDP[7]
根据前后脉冲神经元的脉冲发放顺序来更新权重。
2)
事件驱动的随机反向传播 (event-based Random Backpropagation,eRBP) eRBP
由 Neftci
等人 [9]
首次提出。该方法抑制了在标准反向传播中的局部性问题。
基于局部学习的强化学习通常是在多智能体框架的基础上。Thomas
和 Barto[18]
等人首次提出多智能体强化学习框架,在这个框架中,一群智能体合作来挖掘特征空间的隐藏结构,最终解决原始的 MDP
问题。所以将状态空间映射到动作空间的任务可以被分解为子任务并分配到各个智能体。每一个子任务也都可以被建模成马尔可夫过程,也叫共轭马尔可夫过程。
令 S
为原始 MDP
的状态空间。则当前智能体的状态空间 SA = {S, Ac1 ..., Acn }
也包含了共同智能体的动作空间,而动作空间则仍然是自身 MDP
的动作空间。 MDP
的参数空间变为 θ =(
θA,
θc1 ,...,
θcn ),
其中 θA
是自身的参数,而 θci
为合作智能体的参数。在这样一个范式中,可以证明将 MDP
作为一个整体进行策略梯度下降,
等同于对每个子 MDP
过程分别做梯度下降 [19]
。
∇θJ(θ)=(∇θJθ,∇θc1J(θ),⋯,∇θcnJ(θ))\nabla _\theta J\left( \theta \right) = \left( {\nabla _\theta J_\theta ,\nabla _{\theta _{c1} } J\left( \theta \right), \cdots ,\nabla _{\theta _{cn} } J\left( \theta \right)} \right)∇θJ(θ)=(∇θJθ,∇θc1J(θ),⋯,∇θcnJ(θ))
最终的结论是在合作智能体框架中,对于每个合作智能体分别优化策略等同于对于整个马尔可夫过程做策略优化。
基于共轭马尔可夫过程,我们来探讨基于梯度下降的合作智能体网络 (Policy Gradient Coagent Networks)
。这样一个网络包含了一群智能体,每个智能体通过受时间差分误差 TD error
约束的策略梯度下降来优化自己的策略 ,TD error
则结合全局的评价函数 (critic)
计算得到。这和生物体中多巴胺能神经元向一群神经元发送奖赏信号来调节它们突触可塑性有相似之处 [12]
▲ 图2.2.1 Q表
考虑如图 11.3
所示的 PGCN
的结构,合作智能体 c
的策略为 πc (Sc,Ac,
θc),
每个合作智能体执行自己的策略,而智能体 A
将合作智能体的动作考虑进去,并执行自己的策略 πa (Sa, A,
θa)
。一个全局评价函数,在环境中评价该动作,然后返回 TD error
δ,
传递到每个合作智能体。每个合作智能体则通过随机梯度下降来更新自身的参数。
θc=θc+αcδ∂lnπc(Sc,Ac,θc)∂θc\theta _c = \theta _c + \alpha _c \delta {{\partial \ln \pi _c \left( {S_c ,A_c ,\theta _c } \right)} \over {\partial \theta _c }}θc=θc+αcδ∂θc∂lnπc(Sc,Ac,θc)
全局评价函数则用同样的 TD error
来更新它自己对状态价值函数的估计。这样一种框架下,一个脉冲神经元可以被建模成一个合作智能体,它的策略函数可以定义为随机脉冲发放模式。
对于一个处于活动中的神经元,它的脉冲发放时序是非常不规律的,并且对于一个同样的输入是不可复现的。这种神经元脉冲的易变性被认为有利于学习。 Maass[6]
展现了一个由带有噪声的脉冲神经元构成的网络可以 实时仿真 McGulloch-Pitts
神经元的功能。脉冲发放过程本身的不可依赖性让其适合被建模成一个强化学习智能体。
常用的脉冲神经元模型有脉冲神经元的无记忆伊辛模型 [21]
,随机泄露积分发放模型 [3]
,泛化神经元线性模型 [11]
。
1) 脉冲神经元的无记忆伊辛模型 (Memoryless Ising model of spiking neuron)
在这里考虑基于能量的一个模型 [21]。对于一个有 N个神经元的网络,它的脉冲发放时序以 ∆t的时间块离散化,若神经元在时间块 t发放脉冲,则 σi(t)=1,否则 σi(t)= −1。所以,在任意时间 t,由这群神经元组成的网络可以生成 N-bit的表示。脉冲活动的联合概率分布由玻尔兹曼分布如下给出。
Pr(δ(t))=1Z(bi,Wij)exp(∑ibiσi(t)+∑i,jWijσi(t)σj(t))P_r \left( {\delta \left( t \right)} \right) = {1 \over {Z\left( {b_i ,W_{ij} } \right)}}\exp \left( {\sum\limits_i^{} {b_i \sigma _i \left( t \right)} + \sum\limits_{i,j}^{} {W_{ij} \sigma _i \left( t \right)\sigma _j \left( t \right)} } \right)Pr(δ(t))=Z(bi,Wij)1exp(i∑biσi(t)+i,j∑Wijσi(t)σj(t))
Z (bi,Wij )是配分函数,则给定神经元邻居活动的神经元的脉冲发放概率为
Pr(σi=1∣s)=exp(A(t))exp(A(t))+exp(−A(t))\Pr \left( {\sigma _i = 1|s} \right) = {{\exp \left( {A\left( t \right)} \right)} \over {\exp \left( {A\left( t \right)} \right) + \exp \left( { - A\left( t \right)} \right)}}Pr(σi=1∣s)=exp(A(t))+exp(−A(t))exp(A(t))
其中 A(t)= bi + j Wij
σj
。于是神经元的脉冲发放策略由上述条件函数确定,bi
代表神经元自身的发放倾向,Wij
代表其与邻居神经元的连接强度。这种表示方法和受限玻尔兹曼机 (RBM)
非常相似。受限玻尔兹曼机使用的是对比散度 (contrastive divergence)
算法,
而这里用 RL
更新规则来调整权重。我们将每个神经元看作是一个 RL
智能体,智能体所能采取的动作要么发放脉冲,要么不发放。所以其策略可以定义为 π(s, a)= Pr (at = a | st = s)= Pr (
σi =1 | s),
更进一步的,可以让智能体采取更多的动作。若 a=0
表示以平均发射率发射脉冲,那么 a=1,a=2
则可以代表以高于平均频率一倍或两倍标准差的发射率发射脉冲,a=-1,a=-2
则相应的表示低于平均频率的发射脉冲。最终神经元的策略可以表示为
π(s,a=ak)=exp(akA(t))∑−22exp(aiA(t))\pi \left( {s,a = a_k } \right) = {{\exp \left( {a_k A\left( t \right)} \right)} \over {\sum\limits_{ - 2}^2 {\exp \left( {a_i A\left( t \right)} \right)} }}π(s,a=ak)=−2∑2exp(aiA(t))exp(akA(t))
其中 A(t)= bi + Wij σj ,这种形式的参数化可以用于分类任务。
2) 随机泄露积分发模型 (Stochastic Leaky Integrate & Fire Neu¬ron)
在这种随机 LIF模型中,后一层神经元的膜电位由前一层膜电位的历史所决定。
u(t)=b+∑k=1K∑i=1Nwkzi(t−ti)u\left( t \right) = b + \sum\limits_{k = 1}^K {\sum\limits_{i = 1}^N {w_k z_i \left( {t - t_i } \right)} }u(t)=b+k=1∑Ki=1∑Nwkzi(t−ti)
b是神经元自身的偏置,Wk是和前一层神经元 k的连接权重,zi是前层神经元 k在 ti时刻发放的脉冲对当前神经元的影响。
在这种神经元模型中 PGCN的更新和 STDP非常类似。这里采用首个脉冲时间编码,即在一群脉冲神经元中,只要有一个发放了脉冲,就认为当前一个回合终止。每个神经元在任意时刻发放脉冲的概率为
π(a=1,u,t)=Pr(a=1∣u)=σ(u(t)−θ)\pi \left( {a = 1,u,t} \right) = \Pr \left( {a = 1|u} \right) = \sigma \left( {u\left( t \right) - \theta } \right)π(a=1,u,t)=Pr(a=1∣u)=σ(u(t)−θ)π(a=1,u,t)=1−σ(u(t)−θ)\pi \left( {a = 1,u,t} \right) = 1 - \sigma \left( {u\left( t \right) - \theta } \right)π(a=1,u,t)=1−σ(u(t)−θ)
当有一个神经元发放了脉冲,回合终止,评价函数给出 TD error δTD。权重更新公式为
ΔWk=αδTDdln[π(u,a)]dWk\Delta W_k = \alpha \delta _{TD} {{d\ln \left[ {\pi \left( {u,a} \right)} \right]} \over {dW_k }}ΔWk=αδTDdWkdln[π(u,a)]
dln[π(u,a)]dWk={σ′[u(t)−θ]σ[u(t)−θ]∑i=1Nzi(t−ti),ifa=1−σ′[u(t)−θ]1−σ[u(t)−θ]∑i=1Nzi(t−ti),ifa=0{{d\ln \begin{bmatrix} {\pi \left( {u,a} \right)} \end{bmatrix}} \over {dW_k }} = \left\{ \begin{matrix} {{{\sigma '\begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}} \over {\sigma \begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}}}\sum\limits_{i = 1}^N {z_i \left( {t - t_i } \right)} ,\,\,\,\,if\,\,a = 1}\\{ - {{\sigma '\begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}} \over {1 - \sigma \begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}}}\sum\limits_{i = 1}^N {z_i \left( {t - t_i } \right),\,\,if\,\,a = 0} }\\\end{matrix} \right.dWkdln[π(u,a)]=⎩⎪⎪⎨⎪⎪⎧σ[u(t)−θ]σ′[u(t)−θ]i=1∑Nzi(t−ti),ifa=1−1−σ[u(t)−θ]σ′[u(t)−θ]i=1∑Nzi(t−ti),ifa=0
而 zi会随时间指数衰减,即
zi(t)=exp[(t−ti)/τ]z_i \left( t \right) = \exp \left[ {\left( {t - t_i } \right)/\tau } \right]zi(t)=exp[(t−ti)/τ]
于是
ΔWk={αδTDσ′[u(t)−θ]σ[u(t)−θ]∑i=1Nexp[(t−ti)/τ]−αδTDσ′[u(t)−θ]1−σ[u(t)−θ]∑i=1Nexp[(t−ti)/t]\Delta W_k = \left\{ \begin{matrix} {\alpha \delta _{TD} {{\sigma '\begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}} \over {\sigma \begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}}}\sum\limits_{i = 1}^N {\exp \begin{bmatrix} {\left( {t - t_i } \right)/\tau } \end{bmatrix}} }\\{ - \alpha \delta _{TD} {{\sigma '\begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}} \over {1 - \sigma \begin{bmatrix} {u\left( t \right) - \theta } \end{bmatrix}}}\sum\limits_{i = 1}^N {\exp \begin{bmatrix} {\left( {t - t_i } \right)/t} \end{bmatrix}} }\\\end{matrix} \right.ΔWk=⎩⎪⎪⎨⎪⎪⎧αδTDσ[u(t)−θ]σ′[u(t)−θ]i=1∑Nexp[(t−ti)/τ]−αδTD1−σ[u(t)−θ]σ′[u(t)−θ]i=1∑Nexp[(t−ti)/t]
这种更新方式和 STDP非常类似。
3) 泛化神经元线性模型 (Generalized Linear Model of a Spiking Neu-ron)
考虑图 5所示的 GLM模型,智能体在任意时刻 t的脉冲发放概率 λ(t)由输入 x,自身的脉冲发放历史,其他神经元的脉冲神经元发放历史 yi决定。 ()
λ(t)=σ(k⋅x+h⋅y+∑i1⋅yi+μ)\lambda \left( t \right) = \sigma \left( {k \cdot x + h \cdot y + \sum\limits_i^{} {1 \cdot y_i } + \mu } \right)λ(t)=σ(k⋅x+h⋅y+i∑1⋅yi+μ)
▲ 图2.2.2 GLM模型
▲ 图2.2.3 Spiking Actor Network Deep Critic Network 模型
σ是 sigmoid函数,µ是偏置,k,h,l是脉冲后过滤器。智能体在任意时刻发放脉冲的概率 p(t)= λ(t),则对于长度为 k的脉冲
序列,其发生概率为 t∈ts ,λ(τ)(t) t∈tns 1 − λ(τ)(t), ts代表发放脉冲的时间,而 tns代表没有发放脉冲的时间。因此可以将脉冲序列 Aτ看作是智能体的策略,则在给定状态 Sτ =(x, y, {yi})下产生 Aτ的概率为
π(Sτ,A,θ)=∏t∈tsλ(τ)(t)∏t∈tn,s[1−λ(τ)(t)]\pi \left( {S_\tau ,A,\theta } \right) = \prod\limits_{t \in t_s }^{} {\lambda ^{\left( \tau \right)} \left( t \right)} \prod\limits_{t \in t_{n,s} }^{} {\left[ {1 - \lambda ^{\left( \tau \right)} \left( t \right)} \right]}π(Sτ,A,θ)=t∈ts∏λ(τ)(t)t∈tn,s∏[1−λ(τ)(t)]
因此 GLM智能体的第一层接受环境的状态输入,然后输出脉冲序列作为动作输出。前一层输出的动作脉冲序列成为后续层的状态输入序列,最后一层的输出则为最终的动作输出。
▲ 图2.2.4 Spiking Actor Network Deep Critic Network 模型
由 PGCN模型,期望回报 J(θ)的梯度为
2.3时空域反向传播算法
基于局部学习的方法具有很大的局限性,它们在处理连续空间和复杂高维度任务时经常力不从心 [2]。由于 SNN的高精度表示能力还比较欠缺,经 常会出现对于不同的输入,得到相同的动作值。然而我们又希望利用 SNN的能量高效性,尤其是在部署到硬件上时。 G. Tan et al. [16, 17]想到在训练时将动作评价网络 Critic用 ANN表示,而动作网络 Actor用 SNN表示。而在测试时只需要 Actor就行了 ,实际上部署到芯片上也只需要 Actor。同时他们也想到利用 STBP [25]来作为 Actor的训练算法
在训练时,SNN采用 STBP的一种变形,如图 7和 Algorithm1所示。与标准的 STBP相比,这里多了一个突触电流项 c。
如图 6所示,对于输入的观测向量 s,采用高斯编码
AE=e−12[(s−μ)/σ]2A_E = e^{ - {1 \over 2}\left[ {\left( {s - \mu } \right)/\sigma } \right]^2 }AE=e−21[(s−μ)/σ]2
AE可以用来概率编码 (即神经元以概率 AE发放脉冲),也可以直接作为 IF模型的输入,即
v(t)=v(t−1)+AEv\left( t \right) = v\left( {t - 1} \right) + A_Ev(t)=v(t−1)+AEok(t)=1&vk(t)=vk(t)−(1−ε),ifvk(t)>1−εo_k \left( t \right) = 1\& v_k \left( t \right) = v_k \left( t \right) - \left( {1 - \varepsilon } \right),\,\,if\,\,v_k \left( t \right) > 1 - \varepsilonok(t)=1&vk(t)=vk(t)−(1−ε),ifvk(t)>1−ε
而对于输出动作的每个维度,都采用一簇神经元进行编码,即群编码,对于一簇中神经元的发放率采用加权求和,得到动作的一个维度。具体算法流程见 Algorithm 1。
※ 总结与展望 ※
强化学习是最接近人工通用智能的一种范式,而脉冲神经网络又被誉为最符合生物特性的神经网络,因此如何将脉冲神经网络融入到强化学习框架中是一个值得研究的问题。目前的算法大部分都会声称部署到神经形态芯片上具有能耗优势,但真正在芯片上进行测试的寥寥无几。这里能耗优势是指在做推理时的时候具有稀疏性,但在训练过程中,脉冲神经网络通常会耗费更多算力 (和 timestep成正比 ),如何解决训练慢的问题也是一个难题。
此外,除了推理时的能耗优势之外,是否还具有其他优势。我们知道脉冲神经网络具有独特的时空数据处理能力,而强化学习是一个序列决策问题,因此可以自然地想到能否在强化学习问题上展现脉冲神经网络的这种时序优势。目前笔者在文献中还没有看到有关的实验证明。最后脉冲神经网络丰富的时间编码方式如何应用到强化学习中并且展现出优势也是一个可能的研究方向。
▲ 图3.1 算法描述
参考文献
[1] Abhronil et al. “Going Deeper in Spiking Neural Networks: VGG and Residual Architectures.” In: Frontiers in neuroscience (2019).
[2] Sneha Aenugu. “Training spiking neural networks using reinforcement learning”. In: ArXiv abs/2005.05941 (2020).
[3] Wulfram Gerstner and William K. Kistler. “Spiking Neuron Models”. In: 2002.
[4] Kaiming He et al. “Deep Residual Learning for Image Recognition”. In: 2016 IEEE Conference on Computer Vision and Pattern Recogni¬tion (CVPR) (2016), pp. 770–778.
[5] Wofgang Maas. “Networks of spiking neurons: the third generation of neural network models”. In: Neural Networks 14 (1997), pp. 1659– 1671.
[6] W. Maass. “On the Computational Power of Noisy Spiking Neurons”. In: Advances in Neural Information Processing Systems 8, NIPS, Den-ver, CO, November 27-30, 1995. 1995.
[7] H. Markram et al. “Regulation of Synaptic Efficacy by Coincidence of Postsynaptic APs and EPSPs”. In: Science 275 ().
[8] Timothée Masquelier and Simon J. Thorpe. “Learning to recognize objects using waves of spikes and Spike Timing-Dependent Plastic-ity”. In: The 2010 International Joint Conference on Neural Networks (IJCNN) (2010), pp. 1–8.
[9] E. Neftci et al. “Neuromorphic Deep Learning Machines”. In: (2016).
[10] D Patel et al. “Improved robustness of reinforcement learning poli-cies upon conversion to spiking neuronal network platforms applied to ATARI games”. In: Neural Networks (2019).
[11] Jonathan W. Pillow et al. “Spatio-temporal correlations and visual signalling in a complete neuronal population”. In: Nature 454 (2008), pp. 995–999.
[12] W. Schultz, P. Dayan, and P. R. Montague. “A neural substrate of pre¬diction and reward.(Special Section: Cognitive Neuroscience)(Cover Story)”. In: Science 275.5306 (1997), pp. 1593–1599.
[13] Abhronil Sengupta et al. “Going Deeper in Spiking Neural Networks: VGG and Residual Architectures”. In: Frontiers in Neuroscience 13 (2019).
[14] Karen Simonyan and Andrew Zisserman. “Very Deep Convolutional Networks for Large-Scale Image Recognition”. In: CoRR abs/1409.1556 (2015).
[15] W. Tan, D. Patel, and R. Kozma. “Strategy and Benchmark for Con-verting Deep Q-Networks to Event-Driven Spiking Neural Networks”. In: (2020).
[16] G. Tang, N. Kumar, and K. P. Michmizos. “Reinforcement co-Learning of Deep and Spiking Neural Networks for Energy-Efficient Mapless Navigation with Neuromorphic Hardware”. In: (2020).
[17] G. Tang et al. “Deep Reinforcement Learning with Population-Coded Spiking Neural Network for Continuous Control”. In: Conference on Robot Learning (CoRL) 2020. 2020.
[18] Philip S. Thomas and Andrew G. Barto. “Conjugate Markov Decision Processes”. In: Proceedings of the 28th International Conference on International Conference on Machine Learning. ICML’11. Bellevue, Washington, USA: Omnipress, 2011, pp. 137–144. isbn: 9781450306195.
[19] Philip S. Thomas and Andrew G. Barto. “Conjugate Markov Decision Processes”. In: ICML. 2011.
[20] Simon J. Thorpe and Jacques Gautrais. “Rank order coding”. In: 1998.
[21] G. Tkacik et al. “Optimal population coding by noisy spiking neu-rons”. In: Proceedings of the National Academy of Sciences 107.32 (2010), pp. 14419–14424.
[22] Rufin VanRullen, Rudy Guyonneau, and Simon J. Thorpe. “Spike times make sense”. In: Trends in Neurosciences 28 (2005), pp. 1–4.
[23] Christopher J. C. H. Watkins and Peter Dayan. “Q-learning”. In: Ma-chine Learning 8 (2004), pp. 279–292.
[24] Yujie Wu et al. “Direct Training for Spiking Neural Networks: Faster, Larger, Better”. In: ArXiv abs/1809.05793 (2019).
[25] Yujie Wu et al. “Spatio-Temporal Backpropagation for Training High-Performance Spiking Neural Networks”. In: Frontiers in Neuroscience 12 (2018).
● 相关图表链接:
- 图1.1.1 强化学习示意图
- 图1.1.2 Q表格
- 图1.2.1 脉冲神经元丰富的编码方式
- 图2.2.1 Q表
- 图2.2.2 GLM模型
- 图2.2.3 Spiking Actor Network Deep Critic Network 模型
- 图2.2.4 Spiking Actor Network Deep Critic Network 模型
- 图3.1 算法描述
强化学习中的脉冲神经网络相关推荐
- 强化学习中的递归神经网络
在解决模型训练的机器学习问题时,可以使用已知的输出(监督学习),或者模型可以在事先不知道正确结果的情况下自行学习在可用数据中寻找模式(无监督学习). 强化学习(RL)不属于这两种类型:然而,它同时具有 ...
- 《强化学习周刊》第26期:UCL UC Berkeley发表深度强化学习中的泛化研究综述、JHU推出基于强化学习的人工决策模型...
No.26 智源社区 强化学习组 强 化 学 习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和 ...
- 最新综述 | 强化学习中从仿真器到现实环境的迁移
©PaperWeekly 原创 · 作者|李文浩 学校|华东师范大学博士生 研究方向|强化学习 最近 survey 了一下 sim2real 领域最近的相关工作,先整理个第一版(共有七篇论文)的总结. ...
- 八千字长文深度解读,迁移学习在强化学习中的应用及最新进展
点击我爱计算机视觉标星,更快获取CVML新技术 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载. 机器之心原创 作者:Luo Sainan 编辑:H4O 迁移学习通 ...
- 《强化学习与最优控制》学习笔记(三):强化学习中值空间近似和策略空间近似概述
写在前面的 前一章链接: <强化学习与最优控制>学习笔记(二):强化学习与最优控制的一些术语对比 这章主要是对应书中第二章前面的值空间近似和策略空间近似的简要介绍部分. 在本书的第一章就指 ...
- 强化学习中的基础概念和术语——spinning up文档翻译
Key Concepts and Terminology 以下内容翻译自open ai 的spinning up文档,同时加入了一些自己的理解.原始内容来自spinningup 文章目录 Key Co ...
- 初探强化学习(10)强化学习中的一些术语(non-stationray,sample efficiency,planning和Learnin,Reward,off-policy和on-policy )
1. 关于stationray 参考博客. Stationary or not 根据环境是否稳定.可以将强化学习问题分为stationary.non-stationary. 1.1 stationar ...
- 深度强化学习中的好奇心
本文为 AI 研习社编译的技术博客,原标题 : Curiosity in Deep Reinforcement Learning 作者 | Michael Klear 翻译 | 凝决2018 校对 | ...
- 多智能体强化学习:鼓励共享多智能体强化学习中的多样性
题目:Celebrating Diversity in Shared Multi-Agent Reinforcement Learning 出处:Neural Information Processi ...
最新文章
- mongodb分布式集群搭建手记
- s5pv210——串口通信的基础概念
- SpringCloud03 Ribbon知识点、 Feign知识点、利用RestTemplate+Ribbon调用远程服务提供的资源、利用feign调用远程服务提供的资源、熔断...
- java.lang.ClassNotFoundException: lombok.Data
- 洛谷P1984 SDOI2008烧水问题
- 解决Mac网络连接问题的一些方法
- 单片机和嵌入式哪个值得学?
- edge浏览器被毒霸导航锁定如何解除
- 杀人游戏规则总结(转自龙的天空)
- Tkinter——②entry(文本框)和text(多行文本)
- java菜鸟快速上手指南
- 八种消除沟通上的不良习惯地的方法
- 软件质量之道:PCLint之中的一个
- 多位点序列分型_bionumerics应用16-全基因多位点序列分型(wgMLST)
- 牛客网在线编程专题《剑指offer-面试题39:题目二》判断是否是平衡二叉树
- 四贝夺嫡争代言 骆驼营销背后内幕
- ctypes使用指南
- 如何使用华为云快速搭建个人博客
- NLP-预训练模型-2019:ALBert【 轻Bert;使用 “输入层向量矩阵分解”、“跨层参数共享” 减少参数量;使用SOP代替NSP】【较Bert而言缩短训练及推理时间】
- 二、vis network配置项