[强化学习] 蒙特卡洛方法

写在前面

强化学习系列方法主要学习Sutton的书,本文主要讲使用蒙特卡洛做预测和控制涉及到的问题。

一、动态规划的局限

动态规划中状态价值更新函数为:
V ( k + 1 ) ( S ) = ∑ A ∈ A π ( A ∣ S ) ( R S A + γ ∑ S ′ ∈ S P S S ′ A V ( k ) ( S ′ ) ) V^{(k+1)}(S) = \sum_{A \in \mathcal{A}} \pi(A|S) (R_S^A + \gamma \sum_{S' \in \mathcal{S}} P_{SS'}^A V^{(k)}(S')) V(k+1)(S)=AAπ(AS)(RSA+γSSPSSAV(k)(S))
V ( k ) ( S ) V^{(k)}(S) V(k)(S)表示时刻 k k k S S S状态下对应的状态值。 π ( A ∣ S ) \pi(A|S) π(AS)表示在状态 S S S下选择行为 A A A的概率。 R S A R_S^A RSA为在状态 S S S下采取行为 A A A对应的即时奖励(reward), γ \gamma γ为折扣因子。

从上面的更新公式我们可以看出,动态规划有以下局限:

① 从动态规划的更新方程中可以看到,每次更新一个状态的价值,需要遍历计算后续所有状态的价值,复杂度较高。
② 很多时候,状态转移概率 P S S ′ A P_{SS'}^A PSSA未知,这时候我们无法使用动态规划求解。即,动态规划需要已知状态转移概率 P S S ′ A P_{SS'}^A PSSA

所以,下面我们引入蒙特卡洛方法来解决策略评估和策略提升的问题。

二、蒙特卡洛方法介绍

首先,我们需要明确的是,蒙特卡洛并非一个特定的算法,而是一类随机算法的统称,其基于思想是:用事件发生的“频率”来替代事件发生的“概率”。进一步地说,我们可能无法准确知道一个事件发生的概率,这时候我们可以使用多次采样,使用该事件发生的频率来替代其发生的概率。

蒙特卡洛方法的特点如下:

① 可以通过随机采样得到近似结果
② 采样次数越多,估计结果越近似真实值。

对于强化学习中基于model-free的蒙特卡洛方法来说:蒙特卡洛方法直接从采样的轨迹序列中学习。如,基于Agent与Environment的交互,我们可以得到以下轨迹:

轨迹1:loc1,east,2,loc3,west,4,loc10,north,10,des
轨迹2:loc2,north,4,loc1,west,-1,loc6,south,7,des
轨迹3:loc8,east,0,loc6,west,4,loc7,east,8,des

即,其轨迹序列为: S 0 , A 0 , R 1 , S 1 , A 1 , R 2 , . . . S_0,A_0,R_1,S_1,A_1,R_2,... S0A0R1S1A1R2...

而后,基于采样得到的序列,我们可以计算得到相应状态对应的价值,如对于loc1来说:

① 从轨迹1可以得到loc1的价值(即累计奖励),其计算公式为: V 1 = 2 + γ ∗ 4 + γ 2 ∗ 10 V_1=2 + \gamma * 4 + \gamma^2 * 10 V1=2+γ4+γ210,其中 γ \gamma γ为折扣因子。
② 从轨迹2可以得到loc1的价值(即累计奖励),其计算公式为: V 2 = − 1 + γ ∗ 7 V_2=-1 + \gamma * 7 V2=1+γ7
③ 于是我们可以得到在整个采样过程中(上例为3条轨迹样本),loc1的价值为: V ( l o c 1 ) = V 1 + V 2 2 V(loc1)=\frac{V_1 + V_2}{2} V(loc1)=2V1+V2

关于价值的定义详见[强化学习] 概念、举例、分类。简单来说,我们基于采样得到的轨迹,计算某一个状态在多条轨迹下的平均价值,这个值就是该状态的价值。

三、蒙特卡洛预测

蒙特卡洛预测过程即强化学习策略评估的过程,其目标是根据策略 π \pi π采样得到的轨迹序列学习价值函数 V π ( S ) V_\pi(S) Vπ(S),使得 S 1 , A 1 , R 2 , . . . , S k ∼ π S_1, A_1, R_2, ...,S_k \sim \pi S1,A1,R2,...,Skπ

回顾前面的内容:
价值函数 V π ( S ) V_\pi(S) Vπ(S)的定义为 V π ( S ) = E π ( G t ∣ S t = S ) V_\pi(S)=\mathbb{E}_\pi(G_t|S_t=S) Vπ(S)=Eπ(GtSt=S)
累积奖励 G t G_t Gt的定义为 G t = R t + 1 + γ R t + 2 + . . . + γ T − 1 R T G_t=R_{t+1} + \gamma R_{t+2} + ... + \gamma^{T-1}R_T Gt=Rt+1+γRt+2+...+γT1RT

所以,蒙特卡洛策略评估就是使用经验奖励的平均来代替期望奖励
V π ( S ) ≈ a v e r a g e ( G t ) ,     s . t .     S t = S V_\pi(S) \approx average(G_t), \ \ \ s.t. \ \ \ S_t = S Vπ(S)average(Gt),   s.t.   St=S

S t = S S_t = S St=S其含义是对于状态 S S S,我们需要计算所有出现状态 S S S的轨迹序列中 S S S对应的价值平均。

到此基于蒙特卡洛方法进行评估的核心思想已经讲完了,但是如果轨迹序列中出现了重复的状态怎么办呢?此时该状态的价值该如何计算?

1、轨迹序列中出现重复状态怎么办?

轨迹序列中出现重复状态,一般有以下两种方法:

首次访问MC:仅把状态序列中第一次出现状态时的奖励值纳入到奖励平均值的计算中,即如果某一状态出现了多次,则在第2~n次出现的时候,我们把它当做和其他的状态一样进行计算。
每次访问MC:状态序列中每次出现这个状态,都计算对应的奖励值并纳入到奖励平均值的计算中。可以理解成:重复的状态将计算多次,每次的价值都是基于该状态出现的时间 t t t之后的累积奖励,当然,计算该状态被采样次数的时候若一个序列中某状态出现多次,则计数值也是多次。

上述稍有抽象,下面以一个例子来进一步说明。假设由如下状态序列: l o c 1 , e a s t , 2 , l o c 3 , w e s t , 4 , l o c 5 , n o r t h , − 1 , l o c 3 , e a s t , 5 , l o c 4 , 6 , d e s loc_1, east, 2, loc_3, west, 4, loc_5, north, -1, loc_3, east, 5, loc_4, 6, des loc1,east,2,loc3,west,4,loc5,north,1,loc3,east,5,loc4,6,des,设 γ = 0.9 \gamma=0.9 γ=0.9,下面使用上述两种方法来计算 l o c 3 loc_3 loc3对应的价值:

① 使用首次访问MC的方法:
G ( l o c 3 ) = 4 + 0.9 ∗ ( − 1 ) + 0. 9 2 ∗ 5 + 0. 9 3 ∗ 6 ;      N ( l o c 3 ) = 1 G(loc_3) = 4 + 0.9 * (-1) + 0.9 ^2 * 5 + 0.9^3 * 6; \ \ \ \ N(loc_3) = 1 G(loc3)=4+0.9(1)+0.925+0.936;    N(loc3)=1
② 使用每次访问MC的方法:
G ( l o c 3 ) = 4 + 0.9 ∗ ( − 1 ) + 0. 9 2 ∗ 5 + 0. 9 3 ∗ 6 + 5 + 0.9 ∗ 6 ;      N ( l o c 3 ) = 2 G(loc_3) = 4 + 0.9 * (-1) + 0.9 ^2 * 5 + 0.9^3 * 6 + 5 + 0.9 * 6; \ \ \ \ N(loc_3) = 2 G(loc3)=4+0.9(1)+0.925+0.936+5+0.96;    N(loc3)=2

2、蒙特卡洛预测问题-增量计算

上面讲到,蒙特卡洛预测计算的方法是计算所有轨迹序列中该状态的价值之和,而后取平均。但是这样,我们需要存储多个该状态下的价值(涉及多个轨迹序列的),浪费存储时间,因此我们可以采取增量计算的方式。

定义 μ k \mu_k μk k k k x i x_i xi的均值,则:
μ k = 1 k ∑ j = 1 k x j = 1 k ( x k + ∑ j = 1 k − 1 x j ) = 1 k ( x k + ( k − 1 ) μ k − 1 ) = μ k − 1 + 1 k ( x k − μ k − 1 ) \begin{aligned} \mu_k &= \frac{1}{k} \sum_{j=1}^k x_j = \frac{1}{k}(x_k + \sum_{j=1}^{k-1} x_j) \\ &= \frac{1}{k} (x_k + (k-1)\mu_{k-1} ) = \mu_{k-1} + \frac{1}{k}(x_k - \mu_{k-1}) \end{aligned} μk=k1j=1kxj=k1(xk+j=1k1xj)=k1(xk+(k1)μk1)=μk1+k1(xkμk1)

于是,状态价值更新公式可以改写为:
N ( S t ) = N ( S t ) + 1 V ( S t ) = V ( S t ) + 1 N ( S t ) ( G t − V ( S t ) ) N(S_t) = N(S_t) + 1 \\ V(S_t) = V(S_t) + \frac{1}{N(S_t)} (G_t - V(S_t)) N(St)=N(St)+1V(St)=V(St)+N(St)1(GtV(St))

注意: 这里的 S t S_t St不是指 t t t时刻的状态,而是指某一个状态(在多次的轨迹采样过程中,该状态出现多次)。 N ( S t ) + 1 N(S_t) + 1 N(St)+1表示该状态的计数值加1, V ( S t ) V(S_t) V(St)的更新基于前一个该状态下的计算结果:比如有5条轨迹序列,其中涉及状态loc1的有3条序列,则在计算loc1对应的价值的时候,现在利用第一条涉及loc1的序列计算loc1的价值,此时 N ( S t ) = 1 N(S_t)=1 N(St)=1(以首次MC方法为例),计算出对应的 V ( S t ) V(S_t) V(St);接下来,利用第二条涉及loc1的序列计算loc1的价值,此时 N ( S t ) = 2 N(S_t)=2 N(St)=2,计算出对应的 V ( S t ) V(S_t) V(St);…以此类推。

下面来看一个使用首次MC的预测过程:

算法过程比较简单,首先生成轨迹序列,而后计算 G t G_t Gt值,最后求得某状态下平均状态价值之和。需要说明的是图中①的内容:因为首次MC的计算过程,一个轨迹序列中只有第一次出现了状态 S t S_t St的时候,需要将其计算,第二次及之后的出现不需要多次计算。因此①就是若 S t S_t St在之前已经计算过,就不需要进入下面的算法流程;若 S t S_t St在该轨迹序列中第一次出现,则将其添加到 R e t u r e s ( S t ) Retures(S_t) Retures(St)中,并增加计算值1。

蒙特卡洛预测的过程就是策略评估的过程,即基于当前策略采样样本,并基于采样的轨迹序列计算每个状态的价值。

四、蒙特卡洛控制

蒙特卡洛控制问题,即找到最后价值函数和最优策略。

策略估计和策略提升的迭代过程如下:
π 0 ⟶ E q π 0 ⟶ I π 1 ⟶ E q π 1 ⟶ I π 2 ⟶ E . . . ⟶ I π ∗ ⟶ E q π ∗ \pi_0 \stackrel{E}{\longrightarrow} q_{\pi_0} \stackrel{I}{\longrightarrow} \pi_1 \stackrel{E}{\longrightarrow} q_{\pi_1} \stackrel{I}{\longrightarrow} \pi_2 \stackrel{E}{\longrightarrow} ... \stackrel{I}{\longrightarrow} \pi_{*} \stackrel{E}{\longrightarrow} q_{\pi_*} π0Eqπ0Iπ1Eqπ1Iπ2E...IπEqπ
即,给出初始策略 π 0 \pi_0 π0,而后不断进行策略评估和策略改进的过程,直到找到最优策略。

与上面增量计算价值函数的方法类似,动作价值函数的计算公式如下:
N ( S t , A t ) = N ( S t , A t ) + 1 Q ( S t , A t ) = Q ( S t , A t ) + 1 N ( S t , A t ) ( G t − Q ( S t , A t ) ) N(S_t,A_t) = N(S_t, A_t) + 1 \\ Q(S_t, A_t) = Q(S_t, A_t) + \frac{1}{N(S_t, A_t)}(G_t - Q(S_t, A_t)) N(St,At)=N(St,At)+1Q(St,At)=Q(St,At)+N(St,At)1(GtQ(St,At))

使用蒙特卡洛方法计算动作价值函数的必要性:

① 动态规划中计算价值 π ( S ) \pi(S) π(S)的公式为 π ( S ) = arg max ⁡ A ∑ S ′ , R p ( S ′ , R ∣ S , A ) [ R + γ V ( S ′ ) ] \pi(S)=\argmax_A \sum_{S',R}p(S',R|S,A)[R+\gamma V(S')] π(S)=AargmaxS,Rp(S,RS,A)[R+γV(S)],该公式中,我们需要转移概率 p ( S ′ , R ∣ S , A ) p(S',R|S,A) p(S,RS,A),这是比较困难的。
② 蒙特卡洛方法计算 π ( S ) \pi(S) π(S)的过程是为 π ( S ) = arg max ⁡ a Q ( S , A ) \pi(S)=\argmax_a Q(S, A) π(S)=aargmaxQ(S,A),因此,我们使用蒙特卡洛方法计算动作价值函数。

但是,存在一个这样的问题,当状态空间和动作空间较大,采样序列不充分时,有许多“动作-状态”对没有被访问到,导致动作价值无法更新,这怎么解决呢?

1、许多“动作-状态”对没有被访问到的问题

对于许多“动作-状态”对没有被访问到,导致动作价值无法更新的问题,一般有两种方法解决这个问题:

① 探索开端:限制每个“状态-动作”对都可能作为序列的起始,并且采样次数尽可能多。
② 随机策略:选择一个随机策略,该策略保证在每个状态下,每个动作被选择的概率都大于0。

上图是使用搜索开端方法的蒙特卡洛控制过程, 可以看出,图中红色圈起来的地方就是搜索开端的控制。

2、随机策略选择方法

选择一个随机策略,保证在每个状态下,所有动作被选择的概率都非0,这种方法包含两种策略(这个在[强化学习] 概念、举例、分类中也有提到):

on-policy:用于采样轨迹序列的策略(即行为策略)和评估、更新使用的策略(即目标策略)是同一个,如 ϵ − \epsilon- ϵgreedy
off-policy:用于采样轨迹序列的策略(即行为策略)和评估、更新使用的策略(即目标策略)是不同的,如重要性采样。

因为off-policy中行为策略和目标策略是不同的,因此需要使用两个策略:

行为策略:用来采样轨迹序列,一般更具探索性。具有探索性主要是为了陷入局部最优。
目标策略:待评估和更新的策略,一般使用贪心策略。

Q-learning就是典型的off-policy方法。

3、重要性采样过程

先来看一般的重要性采样的定义:

重要性采样用来评估随机变量在一个分布上的期望值,但采用的样本是来自另一个分布。
E X ∼ P [ f ( X ) ] = ∑ P ( X ) f ( X ) = ∑ Q ( X ) P ( X ) Q ( X ) f ( X ) = E X ∼ Q [ P ( X ) Q ( X ) f ( X ) ] \begin{aligned} \mathbb{E}_{X \sim P}[f(X)] &= \sum P(X)f(X) \\ &= \sum Q(X) \frac{P(X)}{Q(X)}f(X) \\ &= \mathbb{E}_{X \sim Q} [\frac{P(X)}{Q(X)}f(X)] \end{aligned} EXP[f(X)]=P(X)f(X)=Q(X)Q(X)P(X)f(X)=EXQ[Q(X)P(X)f(X)]

因为最开始 X X X服从分布 P P P,但是分布 P P P不容易计算,所以我们将其转化为基于简单的分布 Q Q Q来采样的过程。对应到蒙特卡洛的控制过程中, X X X表示采样的轨迹序列, P P P表示最优策略, f ( X ) f(X) f(X)是其价值。因为最优策略我们是未知的,因此能否借助一个已知的策略来进行轨迹序列采样呢?

我们将上式中的 P ( X ) Q ( X ) \frac{P(X)}{Q(X)} Q(X)P(X)定义为重要性采样率:根据目标策略和行为策略采样到某个轨迹的概率比值得到的加权的奖励,该比值即称为重要性采样率。

给定初始状态 S t S_t St,接下来的状态动作轨迹为: A t , S t + 1 , A t + 1 , . . . , S T A_t,S_{t+1},A_{t+1},...,S_T At,St+1,At+1,...,ST,其在策略 π \pi π下发生的概率为:
P r { A t , S t + 1 , A t + 1 , . . . , S T ∣ S t } = π ( A t ∣ S t ) p ( S t + 1 ∣ S t , A t ) π ( A t + 1 ∣ S t + 1 ) . . . p ( S T ∣ S T − 1 , A T − 1 ) = ∏ k = t T − 1 π ( A k ∣ S k ) p ( S k + 1 ∣ S k , A k ) \begin{aligned} &Pr\{A_t, S_{t+1}, A_{t+1}, ..., S_T | S_t\} \\ &=\pi(A_t|S_t)p(S_{t+1}|S_t, A_t)\pi(A_{t+1}|S_{t+1})...p(S_T|S_{T-1}, A_{T-1}) \\ &= \prod_{k=t}^{T-1}\pi(A_k|S_k)p(S_{k+1}|S_k, A_k) \end{aligned} Pr{At,St+1,At+1,...,STSt}=π(AtSt)p(St+1St,At)π(At+1St+1)...p(STST1,AT1)=k=tT1π(AkSk)p(Sk+1Sk,Ak)

重要性采样率为:
ρ : T − 1 ≐ ∏ k = t T − 1 π ( A k ∣ S k ) p ( S k + 1 ∣ S k , A k ) ∏ k = t T − 1 b ( A k ∣ S k ) p ( S k + 1 ∣ S k , A k ) = ∏ k = t T − 1 π ( A k ∣ S k ) b ( A k ∣ S k ) \rho:T-1 \doteq \frac{ \prod_{k=t}^{T-1}\pi(A_k|S_k)p(S_{k+1}|S_k, A_k)}{ \prod_{k=t}^{T-1}b(A_k|S_k)p(S_{k+1}|S_k, A_k)} = \prod_{k=t}^{T-1} \frac{\pi(A_k|S_k)}{b(A_k|S_k)} ρ:T1k=tT1b(AkSk)p(Sk+1Sk,Ak)k=tT1π(AkSk)p(Sk+1Sk,Ak)=k=tT1b(AkSk)π(AkSk)

其中, π \pi π为目标策略, b b b为行为策略。

4、原始重要性采样和加权重要性采样

基于上述 ρ \rho ρ的定义,给出原始重要性采样和加权重要性采样的定义:

  • 原始重要性采样
    V ( S ) ≐ ∑ t ∈ T ( s ) ρ t : T − 1 G t ∣ T ( S ) ∣ V(S) \doteq \frac{\sum_{t \in \mathcal{T}(s)} \rho_{t:T-1} G_t}{|\mathcal{T}(S)|} V(S)T(S)tT(s)ρt:T1Gt
  • 加权重要性采样
    V ( S ) ≐ ∑ t ∈ T ( s ) ρ t : T − 1 G t ∑ t ∈ T ( s ) ρ t : T − 1 V(S) \doteq \frac{\sum_{t \in \mathcal{T}(s)} \rho_{t:T-1} G_t}{\sum_{t \in \mathcal{T}(s)} \rho_{t:T-1}} V(S)tT(s)ρt:T1tT(s)ρt:T1Gt

其中, T ( s ) \mathcal{T}(s) T(s)表示所有含状态 S S S的轨迹序列。

比如,现仅有一条轨迹序列: S 1 , A 1 , R 2 , S 2 , A 2 , R 3 , d e s S_1, A_1, R_2, S_2, A_2, R_3, des S1,A1,R2,S2,A2,R3,des,则:

① 原始重要性采样 V ( S 2 ) V(S_2) V(S2)计算: V ( S 2 ) = ρ t : T − 1 G t 1 = ρ t : T − 1 × R 3 V(S_2) = \frac{\rho_{t:T-1} G_t}{1}=\rho_{t:T-1} \times R_3 V(S2)=1ρt:T1Gt=ρt:T1×R3
② 加权重要性采样 V ( S 2 ) V(S_2) V(S2)计算: V ( S 2 ) = ρ t : T − 1 G t ρ t : T − 1 = R 3 V(S_2) = \frac{\rho_{t:T-1} G_t}{\rho_{t:T-1}}=R_3 V(S2)=ρt:T1ρt:T1Gt=R3

因此,我们可以看出:

  • 对于原始重要性采样来说,因为分母是涉及到该状态的轨迹序列数,与 ρ \rho ρ的值无关,因此 ρ \rho ρ的值可能变化很大,即方差较大,且原始重要性采样是对 V π ( S ) V_\pi(S) Vπ(S)无偏估计
  • 加权重要性采样是有偏的,如上例 V ( S 2 ) = R 3 V(S_2)=R_3 V(S2)=R3,与重要性采样率无关(假设重要性采样率不为零),价值计算的结果就是我们观察到的结果,但是,它的期望值是 V b ( S ) V_b(S) Vb(S)而不是 V π ( S ) V_\pi(S) Vπ(S)。从统计意义上看,这是有偏估计。加权重要性采样求得的价值方差更小

五、总结

  • 蒙特卡洛方法基于轨迹序列计算动作价值函数
  • 策略评估,即蒙特卡洛预测问题:
    Q ( S t , A t ) = Q ( S t , A t ) + 1 N ( S t , A t ) ( G t − Q ( S t , A t ) ) Q(S_t, A_t) = Q(S_t, A_t) + \frac{1}{N(S_t,A_t)} (G_t - Q(S_t, A_t)) Q(St,At)=Q(St,At)+N(St,At)1(GtQ(St,At))
  • 策略提升,即蒙特卡洛控制问题:
    π ( S ) = arg max ⁡ a Q ( S , A ) \pi(S) = \argmax_a Q(S,A) π(S)=aargmaxQ(S,A)
  • 若一个状态在一个完整轨迹序列中重复出现,其状态价值函数的计算方法为:首次访问MC、每次访问MC。
  • 为提高计算效率,我们对价值函数使用增量的方法计算。
  • 状态-动作对未访问到,价值函数无法更新问题的解决方案:探索开端、随机策略。
  • 动态规划和蒙特卡洛方法的区别:动态规划具有需要遍历后续状态和状态转移概率未知的局限,蒙特卡洛由此提出。
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
强化学习中的蒙特卡洛方法是一种model-free的学习方法,它不需要对环境的动态进行建模。蒙特卡洛方法是根据与环境进行交互的样本序列来估计值函数或者策略函数。 简单来说,蒙特卡洛方法通过多次实验得到在不同状态下的回报样本,然后利用这些样本来估计值函数或者策略函数。蒙特卡洛方法的核心思想是根据样本的平均回报来近似真实的值函数。 蒙特卡洛方法有多种算法,其中最简单的是MC Basic算法。MC Basic算法的核心步骤包括: 1. 首先,通过与环境进行交互来生成样本序列。在每个样本序列中,采取一系列的动作,并观察环境的反馈,包括奖励和下一个状态。 2. 接下来,根据样本序列计算每个状态的回报。回报是从当前状态开始,经历一系列的动作和环境的反馈后所获得的累计奖励。 3. 然后,利用回报样本来估计值函数。对于每个状态,将其对应的回报样本求平均值作为值函数的估计。 4. 最后,根据值函数来改进策略。根据估计的值函数,选择在每个状态下具有最高值的动作作为最优策略。 这样,通过多次实验和样本的平均回报,MC Basic算法可以逐渐学习到值函数和策略函数,并不断优化策略来实现更好的决策。 除了MC Basic算法,还有其他蒙特卡洛方法,如MC Exploring Starts和ϵ-Greedy算法。这些算法在具体实现上有所差异,但都基于蒙特卡洛方法的核心思想。 综上所述,蒙特卡洛方法是一种model-free的强化学习算法,通过样本序列来估计值函数或策略函数,从而实现更好的决策。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值