强化学习之:价值学习Value-Based Learning

参考内容

动作价值函数(Action-value Function)

  • 这部分是对价值函数的回顾,在 强化学习基础 中进行了详细的讲解,看不懂这篇文章的先去简单翻一下
    在这里插入图片描述

  • U t U_t Ut 代表的是 discounted return,是从当前时刻 t t t 到游戏结束得到的 reward 的折算总和,我们的目标是在游戏结束的时候,希望 U t U_t Ut 能够越大越好

  • U t U_t Ut 中的每个 R i R_i Ri 都取决于其所处的环境状态 S i S_i Si 和采取的行为 A i A_i Ai,因此 U t U_t Ut 直接与 R t , R t + 1 , . . . R_t, R_{t+1},... Rt,Rt+1,... 相关,也就是直接与 A t , A t + 1 , . . . A_t, A_{t+1},... At,At+1,... 以及 S t , S t + 1 , . . . S_t, S_{t+1},... St,St+1,... 相关

  • 强化学习过程中有两个部分会引入随机性:

    1. agent 采取 action 的时候是根据 策略函数(分布) π \pi π 进行随机抽样得到的
    2. 是 环境产生 state 的时候是根据 状态转移函数(分布) p ( s ′ , s , a ) p(s',s,a) p(s,s,a) 随机抽样得到的
  • 因为在每个 actionstate 的产生过程中都会引入随机性,就导致了每个 R i R_i Ri 都是随机变量,而这也进而导致了 U t U_t Ut 是个随机变量

  • U t U_t Ut 的值可以反映出从 t t t 直到未来游戏结束的 reward 总和

  • 而由于 s t , a t s_t, a_t st,at 是在 t t t 时刻可以观察到的,因此对于 t t t 时刻往后的 a i a_i ai s i s_i si 我们通过 期望 的计算来消除随机性: Q π ( s t , a t ) = E [ U t ∣ S t = s t , A t = a t ] Q_{\pi}(s_t, a_t)=\mathbb{E}[U_t|S_t=s_t, A_t=a_t] Qπ(st,at)=E[UtSt=st,At=at]

  • 因此 Q π ( s t , a t ) Q_{\pi}(s_t, a_t) Qπ(st,at) 只与 π , s t , a t \pi, s_t, a_t π,st,at 这三个部分有关:

    • π \pi π 是当前 agent 采用的 策略,也可以看做是个概率分布
    • s t s_t st 是在 t t t 时刻的环境状态
    • a t a_t at 是在 t t t 时刻,agent 面对环境 s t s_t st策略 中随机抽样获得的 action
  • 当然, Q π ( s t , a t ) Q_{\pi}(s_t, a_t) Qπ(st,at) 的值越大,代表在当前环境状态 s t s_t st 下,按照当前使用的 π \pi π 策略 采样得到的 action a t a_t at 越正确。但 策略 有很多种,未必当前这种就是最好的,因此如果在所有可选的 策略 中得到一个使 Q π ( s t , a t ) Q_{\pi}(s_t, a_t) Qπ(st,at) 最大的值,即 Q ∗ ( s t , a t ) = max ⁡ π Q π ( s t , a t ) Q^{*}(s_t, a_t)=\max_{\pi}Q_{\pi}(s_t, a_t) Q(st,at)=πmaxQπ(st,at)

  • Q ∗ ( s t , a t ) Q^{*}(s_t, a_t) Q(st,at) 终于摆脱了策略 π \pi π 的影响,能够代表在当前环境状态 s t s_t st 的情况下,无论你采用何种 策略,采取 a t a_t at 在未来得到的最大的 action 收益的总和就是 Q ∗ ( s t , a t ) Q^{*}(s_t, a_t) Q(st,at)

  • 然而 a t a_t at 可能取值的范围是 agent 的所有动作集合,例如马里奥游戏中的 up, right, left 这三种 action 构成了马里奥所有的动作。那么当在 t t t 时刻马里奥面对环境 s t s_t st 时按照 π \pi π 进行抽样得到了 a t → u p a_t \rightarrow up atup,马里奥应该向上跳,此刻我们可以用 Q ∗ Q^{*} Q 来评估出 向上跳 这个动作能够在未来获得的最大 return

  • 我们这里完全可以不采取 随机抽样 的方式得到 a t a_t at ,而是遍历所有的 a t a_t at 从而获得在当前 t t t 时刻对于所有 a t 1 , . . . a t n a_{t1},...a_{tn} at1,...atn 中能够获得最大 Q ∗ Q^{*} Q 分数的 a t a_t at 作为当前 t t t 时刻的 action,比如 t t t 时刻:

    • up 行为的 Q ∗ ( s t , u p ) = 5000 Q^{*}(s_t, up)=5000 Q(st,up)=5000
    • right 行为的 Q ∗ ( s t , r i g h t ) = 3000 Q^{*}(s_t, right)=3000 Q(st,right)=3000
    • left 行为的 Q ∗ ( s t , l e f t ) = 1000 Q^{*}(s_t, left)=1000 Q(st,left)=1000
  • 那么毫无疑问,我们应该让 agent 选择 up 作为 t t t 时刻的 action

深度强化学习(DQN)

学习目标(Goal)

在这里插入图片描述

  • 在游戏结束时获得的总收益 total reward 越大越好
  • 在上个部分我们已经说明了如何用 Q ∗ Q^{*} Q 描述 agent t t t 时刻面对环境 s t s_t st 时采取agent 所有可能的action从而选取最大的 Q ∗ Q^{*} Q 值,这个过程我们描述成: a ∗ = arg max ⁡ a Q ∗ ( s t , a ) a^{*}=\argmax_{a}Q^{*}(s_t, a) a=aargmaxQ(st,a)
  • a ∗ a^{*} a 是在 t t t 时刻面对 s t s_t st 能够选取的最好的 action
  • 下面对几点进行重点的说明:
    • Q ∗ Q^{*} Q 虽然能够帮我们在 t t t 时刻确定最好的行为 a ∗ a^{*} a,但得出这个结论并不代表着这个 a ∗ a^{*} a 完全就是最好选择,而是 期望,证明 a ∗ a^{*} a 这种行为从概率的角度来看是最好的选择,但未来啥样谁也不能精确描述

    • 基于 动作价值函数 的强化学习求解思路就是帮我们用神经网络模拟一个强大的 Q ∗ Q^{*} Q 函数,从而在每个时刻 i i i 帮我们决定采取最好的 a ∗ a^{*} a 作为 action

    • 如果我们想象现实的情况,这似乎不可能,因为 Q ∗ Q^{*} Q 函数好像一个先知,它是怎么知道某个 action 在未来的 期望 的?这就好像是一个人告诉你说:“小伙子,你可以选下面三只股票,虽然我不能告诉你他们的具体交易细节,但是我可以告诉你的是,在游戏结束的时候, a 1 a_1 a1 股票会翻 10 10 10 倍, a 2 a_2 a2 3 3 3 倍,而 a 3 a_3 a3 亏钱”

    • 但其实这在一些特定的环境(游戏环境)中是有可能的。比如你把自己看做一个 Q ∗ Q^{*} Q 当你玩一个特定的游戏 100000 100000 100000 局的时候,你其实就变成了先知,因为对于过去大量的数据,你已经知道因果了,而且你玩的局数越多,对于因果的对应关系和发展规律就捕捉的越全面,所以此时如果你指导一个 agent,他觉得你未卜先知,其实只是你通过大量的数据推算了大致的情况。而且你给他提供的建议也并不完全是真正的 期望,而是你根据你自己的已知情况推出的近似真实 期望 的结果。

    • 更通俗讲:

      • 你看似是先知,其实是看了大量的数据,你可以通过大量的数据无限逼近真实的先知,但你永远是个假的先知
      • 你可以根据看过的数据来推算 agent 在当前状态下采取所有行为的 期望(并非真实的 期望,而是你基于过去数据而计算的 期望
      • agent 根据你提供的 期望 作为参考,选择一个当前时刻最好的行为
    • 深度神经网络就是在扮演这个 伪装的先知 的角色。通过大量的数据训练,神经网络似乎在某个时刻 t t t 能够帮 agent 判断每个动作在未来的 期望收益,如果神经网络足够好,那么 期望 的结果就足够准确,agent 就能够足够好。

如何获得尽可能好的 Q ∗ ( s t , a ) → Q^{*}(s_t, a) \rightarrow Q(st,a) 用神经网络通过学习获得

  • Q ( s t , a ; w ) Q(s_t, a; w) Q(st,a;w) 表示神经网络,我们的目标是近似真实情况的 Q ∗ ( s t , a ) Q^{*}(s_t,a) Q(st,a)
    在这里插入图片描述

  • 我们构造一个神经网络,将 state 作为输入,输出是神经网络对于每个 action 的打分,在这个例子中:

    • left 得分为 2000
    • right 得分为 1000
    • up 得分为 3000
  • 那么我们认为马里奥应该采取 up 作为 action

  • 重复这个过程,流程图如下:
    在这里插入图片描述

    • t t t 时刻根据神经网路的结果选择出 a t a_t at 然后环境状态更新为 s t + 1 s_{t+1} st+1 的同时给出 a t a_t at 的奖励 r t r_t rt
    • 神经网络根据 r t , r t + 1 , . . . r_t, r_{t+1},... rt,rt+1,... 进行训练,得到更好的对动作的评估结果一直到游戏结束

时间差分算法(Temporal Difference, TD)算法

  • 我们要训练一个好的神经网络来模拟 Q ∗ ( s t , a ) Q^{*}(s_t, a) Q(st,a) 要用 TD 算法来完成训练
  • 文章下面的思路是:
    • 讲述 TD 算法的核心思想
    • TD 算法的核心思想应用到强化学习的神经网络训练中,从而获得更好的 Q ∗ ( s t , a ) Q^{*}(s_t, a) Q(st,a) 函数近似

TD 算法的核心思想

  • NYC, Atlanta, DC 都是地名
  • 现在有一个时间评估器 Q ( w ) Q(w) Q(w), 它的参数是 w w w,开始它很不准确,但现在我们想训练 Q ( w ) Q(w) Q(w) 使得它能够给出某地到另一地的路程花费时间精确值。所以训练目标是得到一个更好的 Q ( w ) Q(w) Q(w)
  • 为了训练 Q ( w ) Q(w) Q(w) 我们需要在现实世界中通过多次开车的实际测量值来修正 Q ( w ) Q(w) Q(w) 做出的预测结果,这样 Q ( w ) Q(w) Q(w) 的预测才会越来越准确

  • 用一组实际的数值来更详细地描述这个过程:
    在这里插入图片描述
    • 我要驱车从 NYCAtlanta 假设现在 Q ( w ) Q(w) Q(w) 没有进行任何的训练,那么它给出了一个近似瞎猜的评估结果 q = 1000 q=1000 q=1000,即, Q ( w ) Q(w) Q(w) 认为 NYCAtlanta 要花费 1000 m i n 1000min 1000min
    • 但是当我真正开车从 NYCAtlanta 发现真实的距离 y = 860 k m y=860km y=860km
    • 所以我们定义损失函数 L = 1 2 ( q − y ) 2 L=\frac{1}{2}(q-y)^2 L=21(qy)2 (你可以按照自己的喜好定义损失,这里就用最简单的平方差损失),根据损失函数,我们可以得到这趟旅程 Q ( w ) Q(w) Q(w) 的损失值的具体数值是 14 0 2 140^2 1402
    • 然后采用神经网络优化常用的梯度下降算法来更新 Q ( w ) Q(w) Q(w) 中的权重参数 w w w,这样当我下一次用 Q ( w ) Q(w) Q(w) 的时候,它就能够给出比现在更好的结果了。
    • 当我重复这个过程非常多的次数, Q ( w ) Q(w) Q(w) 就会被训练的越来越好
    • 但现在同样面对一个问题:我只要想更新 Q ( w ) Q(w) Q(w) 就必须完成一整趟旅程,这代价也太大了。有没有一种方式能够利用部分的信息来更新参数,从而不浪费任何一点机会呢?
    • 这就是 TD 算法的核心思想了

在这里插入图片描述

  • NYC 开车去 Atlanta 时车抛锚在了 DC,然后修了三天车从 DC 折返回 NYC
  • 假设 Q ( w ) Q(w) Q(w) 只能给出从 NYCAtlanta 的预测值 q n a q_{na} qna 以及从 DCAtalanta 的预测值 q d a q_{da} qda 那么这时候 TD 算法 是如下更新参数的:
    在这里插入图片描述
    • 首先开车开到 DC 的时候一看路程,发现走了 300 m i n 300min 300min 这是真实的观测值

    • 现在模型给出从 DCAtlanta 要花费的预估时间 600 m i n 600min 600min,所以结合 真实的 300 m i n 300min 300min 和第二次预测的值 600 m i n 600min 600min 我们将从 NYCAtlanta 的整体预估结果更新成 900 m i n 900min 900min,这个 900 m i n 900min 900min 就是 TD-target 虽然这个值也是个估测值,但是比开始的 1000 m i n 1000min 1000min 更加可靠在这里插入图片描述

    • 当你越接近 Atlanta 通过 TD-target 的方式获得的值就估计的越准

    • 现在我们的形式化以上的过程:

      • q = 1000 q=1000 q=1000,但是 y t d = 900 y_{td}=900 ytd=900
      • 因此这时候如果依然采用 均方误差 计算 L L L,那么损失值是 L = ( q − y t d ) 2 = 10 0 2 L=(q-y_{td})^2=100^2 L=(qytd)2=1002,可以看到通过这种方式我们并不需要真正到达目的地,通过 部分真实值 + 部分预估值 的方式也能够不断地更新 Q ( w ) Q(w) Q(w) 的参数

TD 算法在 DQN 中的应用

  • 使用 TD 算法的条件是: T N Y C → A T L ≈ T N Y C → D C + T D C → A T L T_{NYC\rightarrow ATL}\approx T_{NYC\rightarrow DC} + T_{DC\rightarrow ATL} TNYCATLTNYCDC+TDCATL
    • 其中 T N Y C → A T L , T D C → A T L T_{NYC\rightarrow ATL}, T_{DC\rightarrow ATL} TNYCATL,TDCATL 是通过同一个模型 Q ( w ) Q(w) Q(w) 估计值,而 T N Y C → D C T_{NYC\rightarrow DC} TNYCDC 是真实的能够确定的值
      在这里插入图片描述
  • DQN 中,我们知道在 t t t 时刻的奖励 r t r_t rt 是环境在 t + 1 t+1 t+1 时刻给出的,因此我们确切地可以知道 r t r_t rt 的值,因此我们构建公式: Q ( s t , a t ; w ) ≈ r t + γ Q ( s t + 1 , a t + 1 ; w ) Q(s_t, a_t; w) \approx r_t + \gamma Q(s_{t+1}, a_{t+1};w) Q(st,at;w)rt+γQ(st+1,at+1;w)
    • Q ( s t , a t ; w ) Q(s_t, a_t; w) Q(st,at;w) 表示从 t t t 时刻往后直到游戏结束时的 return 的期望值,这个值越大代表当前的 a t a_t at 越合理
    • Q ( s t + 1 , a t + 1 ; w ) Q(s_{t+1}, a_{t+1}; w) Q(st+1,at+1;w) 代表从 t + 1 t+1 t+1 时刻往后直到游戏结束时的 return 的期望值,这个值越大代表 t + 1 t+1 t+1 时刻采取的 a t + 1 a_{t+1} at+1 越好
    • 那么这个公式是怎么得到的呢?
Q ( s t , a t ; w ) ≈ r t + γ Q ( s t + 1 , a t + 1 ; w ) Q(s_t, a_t; w) \approx r_t + \gamma Q(s_{t+1}, a_{t+1};w) Q(st,at;w)rt+γQ(st+1,at+1;w) 公式来源

在这里插入图片描述

  • 之前我们推导过: U t = R t + γ R t + 1 + γ 2 R t + 2 + . . . . U_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+.... Ut=Rt+γRt+1+γ2Rt+2+....
  • 简单地加个括号: U t = R t + γ ( R t + 1 + γ R t + 2 + . . . . ) = R t + γ ( U t + 1 ) U_t=R_t+\gamma (R_{t+1}+\gamma R_{t+2}+....) = R_t+\gamma (U_{t+1}) Ut=Rt+γ(Rt+1+γRt+2+....)=Rt+γ(Ut+1),即: U t = R t + γ U t + 1 U_t= R_t+\gamma U_{t+1} Ut=Rt+γUt+1
  • 又因为我们知道 Q π ( s t , a t ) = E [ U t ∣ s t , a t ] ⇒ max ⁡ π Q π ( s t , a t ) = Q ∗ ( s t , a t ) Q_{\pi}(s_t, a_t)=\mathbb{E}[U_t|s_t, a_t] \Rightarrow \max_{\pi}Q_{\pi}(s_t, a_t)=Q^{*}(s_t, a_t) Qπ(st,at)=E[Utst,at]πmaxQπ(st,at)=Q(st,at),而我们通过神经网络模拟的是 a t = arg max ⁡ a Q ∗ ( s t , a ) ; Q ( s t , a t ; w ) = Q ∗ ( s t , a t ) a_t=\argmax_{a}Q^{*}(s_t, a);\\Q(s_t, a_t; w)=Q^{*}(s_t, a_t) at=aargmaxQ(st,a);Q(st,at;w)=Q(st,at),神经网络的输出结果可以看成是对 U t U_t Ut 期望 的一个估计值(因为我们只能近似 U t U_t Ut 的期望而不可能得到真实的 U t U_t Ut 的期望)
  • 所以我们可以如下表示: Q ( s t , a t ; w ) ≈ E [ U t ] Q(s_t, a_t; w)\approx \mathbb{E}[U_{t}] Q(st,at;w)E[Ut],同样的: Q ( s t + 1 , a t + 1 ; w ) ≈ E [ U t + 1 ] Q(s_{t+1}, a_{t+1}; w)\approx \mathbb{E}[U_{t+1}] Q(st+1,at+1;w)E[Ut+1]
  • 所以我们可以进一步得到: Q ( s t , a t ; w ) ≈ E [ r t + γ Q ( S t + 1 , A t + 1 ; w ) ] Q(s_t, a_t; w)\approx \mathbb{E}[r_t+\gamma Q(S_{t+1}, A_{t+1}; w)] Q(st,at;w)E[rt+γQ(St+1,At+1;w)]
利用 TD 算法更新神经网络模型

在这里插入图片描述

  • 根据以上结果我们知道,在 t t t 时刻:
    • 通过神经网络得到 q = Q ( s t , a t ; w t ) q=Q(s_t, a_t; w_t) q=Q(st,at;wt)
    • 同时 TD target 的结果: y t d = r t + Q ( s t + 1 , a t + 1 ; w t ) , a t + 1 = arg max ⁡ a Q ( s t + 1 , a ; w t ) y_{td}=r_t+Q(s_{t+1}, a_{t+1}; w_t),\\ a_{t+1}=\argmax_{a}Q(s_{t+1},a; w_t) ytd=rt+Q(st+1,at+1;wt),at+1=aargmaxQ(st+1,a;wt)
    • 所以利用 q q q y t d y_{td} ytd 可以求算 L = 1 2 [ q − y t d ] 2 L=\frac{1}{2}[q-y_{td}]^2 L=21[qytd]2
    • 并采用梯度下降来更新神经网络
      在这里插入图片描述

Value-Based 强化学习总结

在这里插入图片描述

  • 最优价值函数定义: Q ∗ ( s t , a t ) = max ⁡ π E [ U t ∣ S t = s t , A t = a t ] Q^{*}(s_t, a_t)=\max_{\pi} \mathbb{E}[U_t|S_t=s_t, A_t=a_t] Q(st,at)=πmaxE[UtSt=st,At=at], 其中

    • a t a_t at 最初是从 π \pi π 中随机采样出来的
    • s t s_t st 是从状态转移函数 p ( s ′ , s , a ) p(s',s,a) p(s,s,a) 中随机采样出来的
    • 当确定了 a t , s t a_t, s_t at,st 之后就可以挑选出当前情况下最大的 Q Q Q Q ∗ ( s t , a t ) Q^{*}(s_t, a_t) Q(st,at)
    • 得到了 Q ∗ ( s t , a t ) Q^{*}(s_t, a_t) Q(st,at) 这个函数之后,我们就可以对所有的 a t a_t at 进行打分(虽然之前的 a t a_t at 是随机采样出来的,但现在不同了,我们已经得到了 Q ∗ Q^{*} Q函数,我们要遍历 t t t 时刻所有的行为从而获得最优的 a t a_t at
  • 基于价值的强化学习最终目标就是学习一个神经网络来近似 Q ∗ ( s , a ) Q^{*}(s, a) Q(s,a) 函数:

    • 输入是环境的某个状态 s s s
    • 输出是当前每个可选行为的分数
  • 使用 TD 算法训练神经网络:
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Value-based 强化学习模型是一种将智能体的行动价值进行评估,从而决策哪个行动更有利可图的强化学习方法。 这种模型的框架如下: 1. 定义状态:确定智能体的环境状态。 2. 定义动作:确定智能体可以执行的动作。 3. 定义奖励函数:确定行动对环境状态的影响,并对每个动作进行评估。 4. 通过价值函数预测动作的价值:根据智能体的当前状态和奖励函数,估算动作的价值。 5. 基于价值函数选择动作:选择价值最高的动作。 该模型的原理是:通过不断地评估动作的价值,来决策智能体的行动。这种方法可以在不知道环境的内部状态的情况下,让智能体学会在复杂的环境中进行决策。 通过迭代不断更新价值函数,智能体可以学习到如何选择最优的行动。随着智能体对环境的了解不断深入,价值函数也会变得更加准确。 ### 回答2: Value-based强化学习模型是一种基于值函数的方法,用于解决强化学习问题。它的基本框架包括状态空间、动作空间、奖励函数和值函数。 在这个框架中,状态空间是所有可能的状态集合,动作空间是所有可能的动作集合。奖励函数用来评估在特定状态下采取某个动作的好坏程度,它为每个状态和动作对分配一个即时奖励。 值函数是定义在状态空间上的函数,用来评估状态的价值。具体而言,值函数可以分为状态价值函数和动作价值函数。状态价值函数(V函数)给出了在特定状态下能够获得多少累积奖励,而动作价值函数(Q函数)给出了在特定状态采取某个动作后能够获得多少累积奖励。 Value-based强化学习模型的原理是通过学习值函数来指导智能体的决策。这种方法的核心思想是,智能体应该选择能够使累积奖励最大化的动作。为了实现这个目标,模型通过利用当前已知的值函数来估计状态动作对的价值,并选择具有最高价值的动作。 具体来说,模型使用了通过迭代更新的方法,例如Q-learning算法或Deep Q网络(DQN)来学习值函数。这些算法通过采样和优化来不断改进值函数的估计,以此来提高智能体的决策性能。 总之,Value-based强化学习模型的框架和原理是通过学习值函数来指导智能体的决策,以实现最大化累积奖励的目标。这个框架包括状态空间、动作空间、奖励函数和值函数,原理则是通过迭代更新值函数,使其能够准确评估状态动作对的价值,从而使智能体能够做出最佳决策。 ### 回答3: value-based强化学习是一种基于值函数的强化学习模型。它的框架包括四个主要的组成部分:状态表示、行动选择、状态转移和值函数更新。 首先,状态表示是指将环境的状态进行合适的编码表示。在value-based强化学习中,通常将状态表示为一个向量或一个张量,它包含了环境中所有重要的信息。 其次,行动选择是指根据当前状态和值函数选择下一步的行动。在value-based强化学习中,行动选择通常是基于一个被称为Q值函数的值函数。Q值函数接受一个状态和一组可能的行动,并输出每个行动的值。根据Q值函数,我们可以选择具有最高Q值的行动作为下一步执行的行动。 然后,状态转移是指在环境中执行选择的行动,并观察到新的状态和获得的奖励。根据环境的动力学,我们能够了解如何从当前状态和选择的行动转移到下一个状态,并且能够获取到与该转移相关的奖励信号。 最后,值函数更新是指通过与环境交互获得的奖励信号更新值函数。在value-based强化学习中,我们使用一种迭代的方法,通过比较实际奖励和预测奖励来改进值函数的估计。常用的值函数更新算法有Q Learning和Deep Q Network(DQN)。这些算法使用经验回放和目标网络来稳定训练过程,并通过不断迭代来逼近最优的值函数。 综上所述,value-based强化学习模型的框架和原理涵盖了状态表示、行动选择、状态转移和值函数更新这四个主要的组成部分。通过这些组成部分的配合和训练,value-based强化学习模型能够学习到最优的值函数,从而能够在环境中做出最佳的决策。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值