强化学习总结

在强化学习过程中,对网上一些视频以及文章中的知识点进行了如下整理:

● 强化学习:寻找一个合适的函数,将观察到的环境(environment)作为输入,目标是最大化回报(reward)(从经验中学习)

RL Algorithms

1.0 绪论

在这里插入图片描述

a. 更新策略:
单步更新:DDPG,DQN,Q-learning,Sarsa,PPO,TD3,Actor-Critic
玩完一轮再更新:MC,PG
b. policy结构:
Actor-Critic结构:DDPG(双份),PPO,TD3(双份)
policy_net+target_net:DQN
Q_table:MC,Q-learning,Sarsa
MLP:PG
c. 用到了ReplayBuffer:
DDPG,DQN,Actor-Critic
d. 同策略or异策略:
off-policy:DDPG,DQN,Q-learning,TD3
on-policy:PG,PPO(更新一次后memory被clear了),Sarsa,MC,A2C,A3C
A2C 和 A3C 都是 on-policy (同策略)
e. 离散和连续
离散:DQN
连续:PG DPG PPO A3C AC
f. value-based/policy-based/Actor-Critic
value-based: DQN、DDQN、
policy-based: PPO
Actor-Critic: DDPG A3C
在这里插入图片描述
在这里插入图片描述

1.1 Q-Learning:

Q-learning – value-base
Q-Learning是一种基于价值的强化学习算法,用于使用Q函数找到最优的动作选择策略。我们的目标是最大化价值函数Q。Q表格帮我们找到每个状态的最佳行动,通过找到所有可能行动的最佳者,它可以最大化预期奖励。可以使用Q-Learning来估计该函数,Q-Learning使用贝尔曼方程迭代地更新Q(s,a)。
a. 使用一个初始的actor π 与环境进行互动
b. 学习该actor对应的 Q function
c. 一定存在另外一个表现更好的actor π , 用这个更好的actor来替代原来的actor
d. 重复上述步骤

○ Q-Learning基于的一个关键假设是智能体和环境的交互可看作为一个马尔可夫决策过程(MDP),即智能体当前所处的状态和所选择的动作,决定一个固定的状态转移概率分布、下一个状态、并得到一个即时回报。Q-Learning的目标是寻找一个策略可以最大化将来获得的报酬。
○ Q–Learning中,Q即为Q(s,a),每个Q(s,a)对应一个相应的Q值,就是在某一时刻的 s 状态下(s∈S),采取a (a∈A)动作能够获得收益的期望,环境会根据agent的动作反馈相应的回报reward ®,所以算法的主要思想就是将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。
○ Q-Learning算法的核心是用一张Q-table来存储关于状态s与行为a的期望值Q(s,a),因此这张表是算法的关键。
在这里插入图片描述

Q-Learing中Q(s1,a2)现实值:
○ Q的现实值是该行为对该状态下的奖励+衰减值乘以下一阶段状态中预估的最大行为反馈的奖励
○ Q-Learning 在这一步只是估计了一下下一步的行为动作反馈值,实际上并不一定选择该行为
○ 离线学习(off-policy)激进派
Q-Learning典型 off-policy,Sara为典型 on-policy
Q-learning 是一个 off-policy 的算法, 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验).
On-policy 与 off-policy 本质区别在于:更新Q值时所使用的方法是沿用既定的策略(on- policy)还是使用新策略(off-policy)
在这里插入图片描述

1.2 DQN

DQN可以视为Q-learning的进阶版,DQN与Q-learning十分相似,DQN解决了Q-learning解决不了的问题。
DQN≈Q-learning+神经网络,如果只是简单的结合将会带来两个问题
1.神经网络的样本之间相互独立,互不关联,而强化学习输入的状态是相互关联的
2.引入非线性函数,使用神经网络来近似Q表格,训练结果可能不收敛

DQN的两大改进
1.experience replay 经验池
DQN引入了经验池,DQN利用到了Q-learning是off-policy的特性,behavior-policy在探索或行动获取经验后会将经存储到经验池中,一条经验可以由(s,a,r,s’)来表示。target-policy随机从经验池中抽取一条经验来更新网络,这将带来两个好处:
1、随机抽取,可以切断经验的相关性
2、每一条经验可以重复学习多次,提高了经验的利用率
流程如下:
在这里插入图片描述

2.固定Q-target
DQN中会有两个结构完全相同但是参数却不同的网络,一个用于预测Q估计(MainNet),一个用于预测Q现实(target),MainNet使用最新的参数,target会使用很久之前的参数,Q现实的targetQ计算为:

根据targetQ与Q估计得到损失,损失函数一般采用均方误差损失

过程描述:初始化MainNet和target,根据损失函数从而更新MainNet参数,而target则固定不变,在经过多次迭代之后,将MainNet的参数全部复制给target网络,并一直如此循环迭代。这样一段时间内的targetQ是固定不变的,从而使得算法更新更加稳定.
在这里插入图片描述

经验回放:经验回放就是一种让经验概率分布变得稳定的技术,可以提高训练的稳定性。经验回放主要有 存储和回放 两大关键步骤:
存储: 将经验以形式存储在经验池中。
回放:按照某种规则从经验池中采样一条或多条经验数据

从存储的角度来看,经验回放可以分为集中式回放和分布式回放:
集中式回放:智能体在一个环境中运行,把经验统一存储在经验池中。
分布式回放:多个智能体同时在多个环境中运行,并将经验统一存储在经验池中。由于多个智能体同时生成经验,所以能够使用更多资源的同时更快的收集经验。
从采样的角度来看,经验回放可以分为均匀回放和优先回放:
均匀回放:等概率从经验池中采样经验。
优先回放:为经验池中每条经验指定一个优先级,在采样时更倾向于选择优先级更高的经验。一般的做法是,如果某条经验(例如经验)的优先级为,那么选取该经验的概率为:

DQN的缺陷:
使用了 max 操作,Q-learning、DQN算法都会过高估计(overestimate)Q值。

1.3 Double DQN (DDQN)

在这里插入图片描述
在这里插入图片描述

1.4 Dueling DQN

Dueling DQN算法提出了一种新的神经网络结构——对偶网络(duel network)。网络的输入与DQN和DDQN算法的输入一样,均为状态信息,但是输出却有所不同。Dueling DQN算法的输出包括两个分支,分别是该状态的状态价值V(标量)和每个动作的优势值A(与动作空间同维度的向量)。DQN和DDQN算法的输出只有一个分支,为该状态下每个动作的动作价值(与动作空间同维度的向量)。具体的网络结构如下图所示:
 单分支网络结构(DQN和DDQN)
对偶网络结构(Dueling DQN)

在DQN算法的网络结构中,输入为一张或多张照片,利用卷积网络提取图像特征,之后经过全连接层输出每个动作的动作价值;在Dueling DQN算法的网络结构中,输入同样为一张或多张照片,然后利用卷积网络提取图像特征获取特征向量,输出时会经过两个全连接层分支,分别对应状态价值和优势值,最后将状态价值和优势值相加即可得到每个动作的动作价值(即绿色连线操作)。
Dueling DQN的思想是把神经网络中Q价值的输出分成两部分,第一部分是状态价值V,这部分价值由状态直接决定和Action无关。第二部分就是动作价值和状态价值的差值A,每一个Action都存在一个差值。这两部分构成了倒数第二层的神经网络,节点数为Action数+1。然后最后一层的Q值就可以直接由V和A相加构成。
Q=V+A
Dueling DQN和DDQN唯一不同的地方是网络结构,因此修改程序时只需要修改Network类即可。这种计算结构使得学习性能得到提高。优点在于与DQN相比,无论动作a如何,都可以逐步学习与V(s)相关的网络连接参数,因此学习的轮数比DQN更少,随着动作选择的增加,优势更加明显。
在实际操作中,我们通常需要减去一个平均值:
在这里插入图片描述

采用这种方法,虽然使得值函数V和优势函数A不再完美的表示值函数和优势函数(在语义上的表示),但是这种操作提高了稳定性。而且,并没有改变值函数V和优势函数A的本质表示。如果只是简单相加,由于动作类型的不同,具有不同的偏置量,可能无法得到很好的学习,通过在一个节点内的输出加入另一个节点的信息,可以让神经网络在误差传递的过程中得到更加充分的学习。

1.5 Policy Gradient(PG 策略梯度)

对比起以值为基础的方法,Policy Gradient直接输出动作的最大好处就是,他能在一个连续区间内挑选动作,而基于值的,比如Q-Learning,它如果在无穷多得动作种计算价值,从而选择行为,这他可吃不消。
Policy Gradient是没有误差。但是他的确是在进行某一种的反向传递。这种反向传递的目的是让这次被选中的行为更有可能在下次发生。但是我们要怎么确定这个行为是不是应当被增加被选的概率呢?这时候,reward奖惩正可以在这个时候排上用场。
要点:
Policy Gradient是RL中一个大家族,他不像Value-based方法(Q-Learning,Sarsa),但他也要接收环境信息(observation),不同的是他要输出不是action的value,而是具体的那一个action,这样Policy Gradient就跳过了value这个阶段。而且Policy Gradient最大的一个优势是:输出的这个action可以是一个连续的值,之前我们说到的value-based方法输出的都是不连续的值,然后再选择值最大的action。而Policy Gradient可以在一个连续分布上选取action。
actor在进行训练之前,会先与环境进行交互,然后得到一组训练数据(由多条状态序列构成)。
在这里插入图片描述

对于每条状态序列的奖励表示为该序列得到的所有的奖励之和,如下所示: 在这里插入图片描述

但是Policy Gradient并不是只用一条状态序列来更新策略的,而是会根据所有的采集到的状态序列来计算它的期望奖励。在这里插入图片描述

上式可以理解为:在使用参数为θ的actor与环境进行互动,采集到多条状态序列,其分布可以表示为,对于这些以参数为θ的actor所收集到的状态序列,Policy Gradient会计算它们的期望奖励值,然后以该期望奖励值来更新actor的参数,得到新的参数如此往复,就是Policy Gradient的大致流程。 从这里可以看出,Policy Gradient是基于无模型的算法。
计算其梯度,我们可以得到:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上图就是Policy Gradient的大致流程,也就是数据收集和模型更新的循环。这里需要注意的是,Policy Gradient每次收集到的数据只会对模型进行一次更新,并不会反复使用这些数据。 从这就可以看出,Policy Gradient是一种"On-policy"的算法。

1.6 PPO

简单来说,PPO就是Policy Gradient的"off-policy"版本。为了满足Importance Sampling的使用条件,PPO在目标函数中加入了一个约束项。在这里插入图片描述

PPO算法与TRPO算法的区别在于前者把约束项放入了目标函数中,而不是作为外部约束。
关于PPO算法,还有一个更加容易实现的形式:
在这里插入图片描述
在这里插入图片描述

注意:以上所有形式的目标函数的参数只有θ ,θ k表示的是旧策略的参数,并不参与参数的更新。
在这里插入图片描述

1.7 DPPO (Distributed Proximal Policy Optimization)

分布式近端策略优化,因为就是PPO的分布式实现,整条的架构和A3C差不多,一个主网络,N个子网络,不一样的地方是,A3C的子网络负责采样数据和计算梯度,然后将梯度传回主网络,而DPPO的子网络只是负责采样数据,然后将采样的数据传回主网络进行统一计算。

PPO->DPPO
一般我们将一个算法分布式化会有以下几个步骤:
1.简单实现该算法
2.将算法模块化,各个模块之间通过参数连接
3.将各个模块之间的参数以某种通信方式传递
4.将耗时的模块进行并行化处理
对应到PPO转DPPO的过程:
1.先实现一个有效的PPO算法
2.将PPO算法分成数据采样和策略学习两个独立的模块,之间通过一个buffer参数连接
3.将buffer通过管道或者套接字传递
4.将数据采样模块并行化

分布式的优势主要有两点:
1.并行计算,增加计算速度,比如一个100小时的任务,拆成10份,理想情况下就可以在10小时完成。
2.分工计算,合理利用资源,比如一些简单的采样任务可以交给CPU处理,而一些高密集的计算任务可以交给GPU计算。

1.8 Actor Critic

Actor是一个神经网络,Critic也是一个神经网络,他们是不同的神经网络,Actor用于预测行为的概率, Critic是预测在这个状态下的价值。
结合了Policy Gradient(Actor)和Function Approximation(Critic)的方法,Actor基于概率选行为,Critic(可以用Q-learning或者Value-based)估计每一个状态的价值,用这个状态的价值减去下个状态的价值,(TD-error),Critic就告诉actor下一个动作要被加大更新的,TD-error如果是正的,下个动作就要加大更新,如果是负的,就减小actor的更新幅度,Criric基于Actor的行为评判行为的得分,Actor根据Critic的评分修改选行为的概率。
总结:
(1)演员(Actor)是指策略函数π θ(a∣s),即学习一个策略来得到尽量高的回报。
(2)评论家(Critic)是指值函数 V π(s),对当前策略的值函数进行估计,即评估演员的好坏。
(3)借助于值函数,演员-评论家算法可以进行单步更新参数,不需要等到回合结束才进行更新。

1.优点:Actor-Critic是由Policy Gradients和Value-Based组成的,critic通过学习环境和奖惩的关系能看到所处的状态潜在的奖励,所以来指点actor使actor每一步都在更新,如果使用Policy Gradients,actor只能等到一个回合才能更新。
因此:可以进行单步更新,比传统的Policy Gradient要快。
2.缺点:
(1)Actor— Critic涉及到两个神经网络,每次都在连续状态中更新参数,每次参数更新的前后都存在相关性,导致了神经网络只能片面的看待问题,甚至学不到东西,
(2)Actor的行为取决于Critic的Value,但是因为Critic本来就很难收敛,和Actor一起更新的话就更难收敛了(为了解决收敛问题,后又提出了DDPG)

1.Actor在这里插入图片描述

Actor用于预测行为的概率。输入是现在的状态state,选择生成出各种行为的价值,(左60%,右40%),根据概率来选择行为(选择60%的),输出概率,然后优化行为(TD-error)
2.Critic在这里插入图片描述

输入状态state,输出状态的值。在这里插入图片描述
在这里插入图片描述

1.9 DPG(Deterministic Policy Gradient)

还是基于Actor-critic网络的一种结构,包含策略网络和价值网络。
这里的策略网络为,但输出不再是概率分布,而是一个确定的实数或向量,输出的动作a是确定的,没有随机性,在机械臂的例子中,输出的是二维向量,因为机械臂有两个动作维度。
这里的价值网络有两个输入,分别是状态s和动作a,输出的是一个实数,即对动作的评价。
我们要做的就是训练这两个网络,让策略函数选取动作越来越好,让价值函数打分越来越准确。
价值网络的训练:在这里插入图片描述

1.观测到一个四元组。
2.根据观测到的t时刻的动作和状态,预测t时刻的价值。
3.预测t+1时刻的价值,这里用到的是把输入到策略网络预测出来的,但是这个并不是要去执行的动作,只是为了代入在这里插入图片描述

4.计算TD error,括号里的部分为TD target。
5.进行梯度下降更新参数w。

策略网络的训练:在这里插入图片描述

更新策略网络要依赖于价值网络,价值网络可以评价动作a的好坏,从而指导策略网络进行改进,策略网络自己不知道动作的好坏,要靠价值网络的输出,价值网络的输出越大,就代表评价越好,动作越好,所以我们要改变策略网络的参数θ,让价值网络的输出越大越好。在这里插入图片描述

目标就是增加价值网络的输出,而价值网络中的a是由策略网络得出的,所以这里的DPG(确定策略梯度)就是价值网络关于θ求导,然后最后一步做梯度上升,来更新参数θ。使得θ的值更好,选取的动作的价值评分更高。
小的改进(用target network):在这里插入图片描述

第四步计算时,用的不再是策略网络和价值网络,而是用新的target network,target network的结构和前者一模一样,但是参数略有不同。
其他的改进方法如下:在这里插入图片描述

随机策略和确定策略的区别:在这里插入图片描述

1.10 DDPG

DDPG简介:在这里插入图片描述

算法要点:在这里插入图片描述
在这里插入图片描述

算法流程:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

DDPG算法吸收了DQN的改进方案,使得算法的效率和效果都得到了保障。比如,通过,通过使用经验库,降低了采样数据的相关性。算法执行过程中,用到了两套 AC 网络,因为 很小,所以目标网络通过滑动平均缓慢更新,使得学习过程更加稳定。

1.11 A3C

Actor-Critic算法的代码,其实很难收敛,无论怎么调参,最后的CartPole都很难稳定在200分,这是Actor-Critic算法的问题。但是我们还是有办法去有优化这个难以收敛的问题的。
回忆下之前的DQN算法,为了方便收敛使用了经验回放的技巧。那么我们的Actor-Critic是不是也可以使用经验回放的技巧呢?当然可以!不过A3C更进一步,还克服了一些经验回放的问题。经验回放有什么问题呢? 回放池经验数据相关性太强,用于训练的时候效果很可能不佳。举个例子,我们学习下棋,总是和同一个人下,期望能提高棋艺。这当然没有问题,但是到一定程度就再难提高了,此时最好的方法是另寻高手切磋。
A3C的思路也是如此,它利用多线程的方法,同时在多个线程里面分别和环境进行交互学习,每个线程都把学习的成果汇总起来,整理保存在一个公共的地方。并且,定期从公共的地方把大家的齐心学习的成果拿回来,指导自己和环境后面的学习交互。
通过这种方法,A3C避免了经验回放相关性过强的问题,同时做到了异步并发的学习模型。
A3C的算法优化
相比Actor-Critic,A3C的优化主要有3点,分别是异步训练框架,网络结构优化,Critic评估点的优化。其中异步训练框架是最大的优化。
我们首先来看这个异步训练框架,如下图所示:在这里插入图片描述

图中上面的Global Network就是上一节说的共享的公共部分,主要是一个公共的神经网络模型,这个神经网络包括Actor网络和Critic网络两部分的功能。下面有n个worker线程,每个线程里有和公共的神经网络一样的网络结构,每个线程会独立的和环境进行交互得到经验数据,这些线程之间互不干扰,独立运行。
每个线程和环境交互到一定量的数据后,就计算在自己线程里的神经网络损失函数的梯度,但是这些梯度却并不更新自己线程里的神经网络,而是去更新公共的神经网络。也就是n个线程会独立的使用累积的梯度分别更新公共部分的神经网络模型参数。每隔一段时间,线程会将自己的神经网络的参数更新为公共神经网络的参数,进而指导后面的环境交互。
可见,公共部分的网络模型就是我们要学习的模型,而线程里的网络模型主要是用于和环境交互使用的,这些线程里的模型可以帮助线程更好的和环境交互,拿到高质量的数据帮助模型更快收敛。

现在我们来看看第二个优化,网络结构的优化。之前在强化学习(十四) Actor-Critic中,我们使用了两个不同的网络Actor和Critic。在A3C这里,我们把两个网络放到了一起,即输入状态SS,可以输出状态价值VV,和对应的策略ππ, 当然,我们仍然可以把Actor和Critic看做独立的两块,分别处理,如下图所示:
在这里插入图片描述

第三个优化点是Critic评估点的优化,在强化学习(十四) Actor-Critic第2节中,我们讨论了不同的Critic评估点的选择,其中d部分讲到了使用优势函数AA来做Critic评估点,优势函数AA在时刻t不考虑参数的默认表达式为:
A(S,A,t)=Q(S,A)−V(S)A(S,A,t)=Q(S,A)−V(S)
Q(S,A)Q(S,A)的值一般可以通过单步采样近似估计,即:
Q(S,A)=R+γV(S′)Q(S,A)=R+γV(S′)
这样优势函数去掉动作可以表达为:
A(S,t)=R+γV(S′)−V(S)A(S,t)=R+γV(S′)−V(S)
其中V(S)V(S)的值需要通过Critic网络来学习得到。
在A3C中,采样更进一步,使用了N步采样,以加速收敛。这样A3C中使用的优势函数表达为:
A(S,t)=Rt++γRt+1+…γn−1Rt+n−1+γnV(S′)−V(S)A(S,t)=Rt++γRt+1+…γn−1Rt+n−1+γnV(S′)−V(S)
对于Actor和Critic的损失函数部分,和Actor-Critic基本相同。有一个小的优化点就是在Actor-Critic策略函数的损失函数中,加入了策略ππ的熵项,系数为c, 即策略参数的梯度更新和Actor-Critic相比变成了这样:
θ=θ+α∇θlogπθ(st,at)A(S,t)+c∇θH(π(St,θ))θ=θ+α∇θlogπθ(st,at)A(S,t)+c∇θH(π(St,θ))
以上就是A3C和Actor-Critic相比有优化的部分。下面我们来总价下A3C的算法流程。
A3C算法流程
这里我们对A3C算法流程做一个总结,由于A3C是异步多线程的,我们这里给出任意一个线程的算法流程。
输入:公共部分的A3C神经网络结构,对应参数位θ,wθ,w,本线程的A3C神经网络结构,对应参数θ′,w′θ′,w′, 全局共享的迭代轮数TT,全局最大迭代次数TmaxTmax, 线程内单次迭代时间序列最大长度TlocalTlocal,状态特征维度nn, 动作集AA, 步长α,βα,β,熵系数c, 衰减因子γγ, 探索率ϵϵ
输入:公共部分的A3C神经网络参数θ,wθ,w

  1. 更新时间序列t=1t=1
  2. 重置Actor和Critic的梯度更新量:dθ←0,dw←0dθ←0,dw←0
  3. 从公共部分的A3C神经网络同步参数到本线程的神经网络:θ′=θ,w′=wθ′=θ,w′=w
  4. tstart=ttstart=t,初始化状态stst
  5. 基于策略π(at|st;θ)π(at|st;θ)选择出动作atat
  6. 执行动作atat得到奖励rtrt和新状态st+1st+1
  7. t←t+1,T←T+1t←t+1,T←T+1
  8. 如果stst是终止状态,或t−tstarttlocalt−tstarttlocal,则进入步骤9,否则回到步骤5
  9. 计算最后一个时间序列位置stst的Q(s,t)Q(s,t):
    Q(s,t)={0V(st,w′)terminalstatenoneterminalstate,bootstrappingQ(s,t)={0terminalstateV(st,w′)noneterminalstate,bootstrapping
  10. for i∈(t−1,t−2,…tstart)i∈(t−1,t−2,…tstart):
  1. 计算每个时刻的Q(s,i)Q(s,i):Q(s,i)=ri+γQ(s,i+1)Q(s,i)=ri+γQ(s,i+1)
  2. 累计Actor的本地梯度更新:
    dθ←dθ+∇θ′logπθ′(si,ai)(Q(s,i)−V(Si,w′))+c∇θ′H(π(si,θ′))dθ←dθ+∇θ′logπθ′(si,ai)(Q(s,i)−V(Si,w′))+c∇θ′H(π(si,θ′))
  3. 累计Critic的本地梯度更新:
    dw←dw+∂(Q(s,i)−V(Si,w′))2∂w′dw←dw+∂(Q(s,i)−V(Si,w′))2∂w′
  1. 更新全局神经网络的模型参数:
    θ=θ−αdθ,w=w−βdwθ=θ−αdθ,w=w−βdw
  2. 如果T>TmaxT>Tmax,则算法结束,输出公共部分的A3C神经网络参数θ,wθ,w,否则进入步骤3
    以上就是A3C算法单个线程的算法流程。

A3C解决了Actor-Critic难以收敛的问题,同时更重要的是,提供了一种通用的异步的并发的强化学习框架,也就是说,这个并发框架不光可以用于A3C,还可以用于其他的强化学习算法。这是A3C最大的贡献。目前,已经有基于GPU的A3C框架,这样A3C的框架训练速度就更快了。
除了A3C, DDPG算法也可以改善Actor-Critic难收敛的问题。它使用了Nature DQN,DDQN类似的思想,用两个Actor网络,两个Critic网络,一共4个神经网络来迭代更新模型参数。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值