强化学习的数学原理-02章 贝尔曼公式
前情回顾
在引言与01章,我们介绍了强化学习所解决的问题,以及针对强化学习的一些基本概念及其含义,具体内容可以参考强化学习的数学原理-入门篇。在本章节,我们会深入理解状态值,策略评估,贝尔曼公式等概念。
状态值(State Value)
在强化学习中,状态值(又称状态价值,State Value)是指衡量一个状态好坏的标量值。我们之前提到,强化学习是在找最优解,这个最优解本身也是一个状态,一般称为目标状态(Target State)。状态值则可以辅助我们评估当前状态的相对优劣。
状态值是如何由来的呢?
这可能是强化学习中最最重要,最最需要理解清楚的问题。它是整个强化学习的根基。
一般来说,一个状态的state value等于该状态下的折扣回报期望值,具体而言,假设一个状态s的状态值用v表示,则可以写成:
vπ(s)=E(Gt∣St=s)v_\pi(s) = E(G_t| S_t = s)vπ(s)=E(Gt∣St=s)
其中π\piπ表示一个策略,GtG_tGt表示 t 时刻下的折扣回报(本质上是一个概率分布)。
这里我们来解释一下,策略是指我们设置的一种方法,它指导我们在一个State 如何选择Action ,本质上是一个条件概率分布,这一点在第一章已经提及。一般来说,一个状态的State Value一定与策略相关,不针对策略的State Value是毫无意义的。比如,在股市投资中,一个人手上持有 100 万现金,市场行情稳定,在这个状态下,他选择激进投资,追逐高风险高回报所带来的收益期望与选择保守投资,优先现金和低风险债券所带来的收益期望是不一样的,同一个状态在不同的策略下可以有不同的回报,所以状态值的计算一定与策略有关,具体的关联我们稍后在数学推导中可以更加直观地看到。
其次,为什么State Value使用的是折扣回报而不是Action奖励(Reward)或者回报(Return)来估计一个状态?
我们需要解释一下Action Reward的概念以及回报(Return)的概念。
Action Reward表示环境对Agent在一个状态下采取的Action给予的反馈。一般而言,这种Reward源自于一个条件概率分布模型,它基于我们的问题建模。数学上可以写成如下形式:
rt∼P(R∣St=s,At=at)r_t \sim P(R | S_t = s, A_t = a_t)rt∼P(R∣St=s,At=at)
Return则代表了对于当前的Reward以及未来的Reward进行求和。数学上可以写成如下形式:
Qt=rt+rt+1+rt+2...Q_t = r_t + r_{t+1} + r_{t+2} \;... Qt=rt+rt+1+rt+2...
注意到,Return在当前时刻以及未来时刻的权重系数是相等的。我们之所以使用折扣回报G,是因为首先我们希望Agent不光关注眼下的利益,也要注意到未来的收益,否则算法会变成贪心的算法。但未来的收益又没有眼下的收益重要。
我们将用01章提到的机器人与网格世界的例子来说明我们提到的一些概念以及结论:
图2.1 网格世界的实际案例,图(a)表示网格世界中的States(坐标)集合,图(b)表示一个Agent在网格世界中能采取的Actions集合,其中a5代表停止不动。
在图2.1中,环境Reward由我们所研究的问题而建模。比如说如果我们希望Agent找到一条路径通往Target(s9s_9s9),且不经过任何的禁区(s6,s7s_6,s_7s6,s7),则我们可以设置当Agent进入禁区时,环境给予 -1 作为reward表示给予惩罚,当Agent进入Target的时候,环境给予1作为reward表示给予奖励,此时我们可以直接写出Reward的条件概率分布,比如:
P(R∣St=s5,At=a2)={−1p=1othersp=0P(R|S_t = s_5,A_t = a_2) = \{ \begin{array}{ll} -1 & p = 1 \\ others & p = 0 \end{array} P(R∣St=s5,At=a2)={−1othersp=1p=0
那么在某个状态下,Action Reward指的就是Agent在该状态下执行某个动作时,环境即时反馈的奖励值。但如果我们仅仅依赖Action Reward来评估状态的优劣,就会产生偏差,因为它没有考虑到后续可能的长期收益。比如:
- 如果Agent在 s8s_8s8 向右移动进入 s9s_9s9,它会得到 Reward = 1;
- 但如果Agent在 s5s_5s5 向下移动进入 s8s_8s8,它此时的Reward = 0,但实际上这是一个非常有价值的选择,因为它有可能在下一步进入目标状态 s9s_9s9。
这就是为什么Return(回报)和Discounted Return(折扣回报)很重要。
Return QtQ_tQt 直接把所有未来Reward累加,能够反映长期价值;但如果我们不对未来收益进行折扣,可能会导致算法过于看重远期的收益,从而失去对当下最优路径的控制。于是我们引入折扣因子 γ∈[0,1]\gamma \in [0,1]γ∈[0,1],得到折扣回报:
Gt=rt+γrt+1+γ2rt+2+⋯G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdotsGt=rt+γrt+1+γ2rt+2+⋯
折扣因子的意义在于:
- 保证未来收益对当前决策的影响逐步衰减;
- 从而使得Agent在“关注未来”和“立足当下”之间取得平衡。
在我们的网格世界例子里,如果没有折扣,Agent可能会探索无意义的远期路径(只要最后有奖励),而忽视最短路径。折扣回报则有效地让Agent更倾向于选择既能尽快到达目标、又能规避惩罚区的路径。
所以,状态价值函数 Vπ(s)V_\pi(s)Vπ(s) 使用折扣回报来估计状态的好坏,它不仅仅依赖当前一步的Reward,而是综合考虑未来可能的收益,并且通过折扣确保收益的合理权重分配。
贝尔曼公式(代数形式与矩阵形式)
图2.2 网格世界中的策略,图(a)表示一个策略,即在每一个状态下的action是确定性的概率分布;图(b)表示在该策略下采样出来的样本轨迹
状态值最大的作用就是评估策略的优劣。它指导我们将策略调优。同一个状态下,状态值更高的那个策略相对来说更优,状态值最大的策略我们称之为最优策略(Optimal Policy)。所以,我们针对一个策略需要知道这个策略下的状态值如何计算。这里Remind一下,策略π\piπ本身也是一个条件概率,它是给定状态s下采取Action的条件概率分布。在图2.2中列出来的例子,每个状态s的Action是决定性的,我们也可以写出它的条件概率分布,比如:
P(At∣St=s5)={a3p=1otheractionsp=0P(A_t|S_t = s_5) = \{ \begin{array}{ll} a_3 & p = 1 \\ other\;actions & p = 0 \end{array}P(At∣St=s5)={a3otheractionsp=1p=0
我们现在将根据状态值的定义,慢慢推导出状态值的最终计算公式,也叫贝尔曼公式。实际计算状态值的时候,我们不是基于rtr_trt来计算的,而是基于rtr_trt的分布RRR来计算的,因为rtr_trt只有在采样了之后才能得出具体的值。故我们的公式可以写成如下形式:
Vπ(st)=E(Gt∣St=st)=E(Rt+γRt+1+γ2Rt+2⋯∣St=st)V_\pi(s_t) = E(G_t| S_t = s_t) = E(R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} \cdots | S_t = s_t)Vπ(st)=E(Gt∣St=st)=E(Rt+γRt+1+γ2Rt+2⋯∣St=st)
这里的每一个RRR 都是基于State的概率分布,而我们对多个概率分布加权求和的结果还是一个概率分布,所以GtG_tGt也是概率分布 ,GtG_tGt的数学期望就是其概率分布值的概率加权平均数,是一个标量。我们可以将Rt+1R_{t+1}Rt+1以及后面项的γ\gammaγ提取出来,我们会发现后面是 t+1 时刻的折扣回报,即Gt+1G_{t+1}Gt+1,所以有:
Vπ(st)=E[Rt+γ(Rt+1+γRt+2⋯)∣St=st]=E(Rt+γGt+1∣St=st)V_\pi(s_t) = E[R_t + \gamma (R_{t+1} + \gamma R_{t+2} \cdots) | S_t = s_t ] = E(R_t + \gamma G_{t+1} | S_t = s_t)Vπ(st)=E[Rt+γ(Rt+1+γRt+2⋯)∣St=st]=E(Rt+γGt+1∣St=st)
继而有:
Vπ(st)=E(Rt+γGt+1∣St=st)=E(Rt∣St=st)+γE(Gt+1∣St=st)=E(Rt∣St=st)+γE[Vπ(St+1)∣St=st]\begin{align} V_\pi(s_t) &= E(R_t + \gamma G_{t+1} \mid S_t = s_t)\notag \\ &= E(R_t \mid S_t = s_t) + \gamma E(G_{t+1} \mid S_t = s_t)\notag \\ &= E(R_t \mid S_t = s_t) + \gamma E[V_\pi(S_{t+1})\mid S_t = s_t]\notag \end{align} Vπ(st)=E(Rt+γGt+1∣St=st)=E(Rt∣St=st)+γE(Gt+1∣St=st)=E(Rt∣St=st)+γE[Vπ(St+1)∣St=st]
假定我们用rtr_trt来表示t时刻下的Reward期望,我们就得到了最简洁最通用的贝尔曼公式:
Vπ(st)=rt+γE[Vπ(St+1)∣St=st]V_\pi(s_t) = r_t + \gamma E[V_\pi(S_{t+1})\mid S_t = s_t]Vπ(st)=rt+γE[Vπ(St+1)∣St=st]
值得注意的是,我们目前是只有sts_tst作为输入的,公式中出现的St+1S_{t+1}St+1是表示 t+1 时刻的状态,实际上这个状态是一个条件概率分布,因为从sts_tst出发到达的下一个状态st+1s_{t+1}st+1是不确定的。所以我们后面的推导中会尝试将这个贝尔曼公式展开,从而得到一些更加直观,可计算的数学量。
贝尔曼公式的代数形式
数学期望就是对分布中每一个可取的值按概率加权求和,所以奖励期望可以写成如下形式:
rt=E(Rt∣St=st)=∑at[π(at∣St=st)⋅E(Rt∣St=st,At=at)]r_t = E(R_t \mid S_t = s_t) = \sum_{a_t}[\pi(a_t \mid S_t = s_t) \cdot E(R_t \mid S_t = s_t, A_t = a_t)]rt=E(Rt∣St=st)=at∑[π(at∣St=st)⋅E(Rt∣St=st,At=at)]
根据state选择action的行为是由策略π\piπ决定的,对奖励求期望就要遍历所有可采取的Action,并对采取这些Action所得到的奖励期望按概率加权求和从而得到整体奖励的期望。不难发现,分布P(R∣St=s,At=at)P(R | S_t = s, A_t = a_t)P(R∣St=s,At=at)就是我们环境中的奖励模型,它根据状态与Action按一定概率分布给予奖励。然后我们再把后面的期望展开可以得到以下公式:
E(Rt∣St=st,At=at)=∑r[r⋅p(r∣St=st,At=at)]E(R_t \mid S_t = s_t, A_t = a_t) = \sum_{r}[r \cdot p(r \mid S_t = s_t, A_t = a_t)]E(Rt∣St=st,At=at)=r∑[r⋅p(r∣St=st,At=at)]
所以:
rt=∑atπ(at∣St=st)∑r[r⋅p(r∣St=st,At=at)]=∑at∑r[π(at∣St=st)⋅r⋅p(r∣St=st,At=at)]=∑at∑r[π(at∣st)p(r∣st,at)r]\begin{align} r_t &= \sum_{a_t}\pi(a_t \mid S_t = s_t) \sum_{r}[r \cdot p(r \mid S_t = s_t,A_t =a_t)]\notag \\ &= \sum_{a_t}\sum_{r}[\pi(a_t \mid S_t = s_t) \cdot r \cdot p(r \mid S_t = s_t,A_t =a_t)]\notag \\ &= \sum_{a_t}\sum_{r}[\pi(a_t \mid s_t)p(r \mid s_t,a_t)r] \notag \end{align}rt=at∑π(at∣St=st)r∑[r⋅p(r∣St=st,At=at)]=at∑r∑[π(at∣St=st)⋅r⋅p(r∣St=st,At=at)]=at∑r∑[π(at∣st)p(r∣st,at)r]
奖励的期望我们已经能够计算了,然后是后面的Vπ(st+1)V_\pi(s_{t+1})Vπ(st+1),由于从sts_tst到到到s_{t+1}$是不确定的,一方面它与策略有关,另一方面与环境有关,所以我们需要遍历出所有的是不确定的,一方面它与策略有关,另一方面与环境有关,所以我们需要遍历出所有的是不确定的,一方面它与策略有关,另一方面与环境有关,所以我们需要遍历出所有的s_{t+1}$,并按概率加权求和,就像我们处理奖励期望一样。首先根据策略找出我们所采取的所有Action,如下所示:
E[Vπ(St+1)∣St=st]=∑atπ(at∣St=st)E[Vπ(St+1)∣St=st,At=at]=∑atπ(at∣St=st)∑st+1Vπ(st+1)⋅p(st+1∣St=st,At=at)=∑at∑st+1π(at∣st)Vπ(st+1)p(st+1∣st,at)\begin{align}E[V_\pi(S_{t+1})\mid S_t = s_t] &= \sum_{a_t}\pi(a_t \mid S_t = s_t)E[V_\pi(S_{t+1}) \mid S_t = s_t, A_t = a_t] \notag \\ &= \sum_{a_t}\pi(a_t \mid S_t = s_t)\sum_{s_{t+1}}V_\pi(s_{t+1}) \cdot p(s_{t+1} \mid S_t = s_t, A_t = a_t) \notag \\ &= \sum_{a_t}\sum_{s_{t+1}}\pi(a_t \mid s_t)V_\pi(s_{t+1})p(s_{t+1} \mid s_t,a_t) \notag \end{align} E[Vπ(St+1)∣St=st]=at∑π(at∣St=st)E[Vπ(St+1)∣St=st,At=at]=at∑π(at∣St=st)st+1∑Vπ(st+1)⋅p(st+1∣St=st,At=at)=at∑st+1∑π(at∣st)Vπ(st+1)p(st+1∣st,at)
于是我们可以发现,这里出现了另一个关于st+1s_{t+1}st+1的状态值,为了统一,我们把描述状态值的VVV替换为vvv,然后整理一下整个状态值的公式可以得到以下公式:
vπ(st)=∑atπ(at∣st)[∑rp(r∣st,at)r+γ∑st+1p(st+1∣st,at)vπ(st+1)]v_\pi(s_t) = \sum_{a_t}\pi(a_t \mid s_t)[\sum_r p(r \mid s_t,a_t)r + \gamma \sum_{s_{t+1}}p(s_{t+1} \mid s_t,a_t)v_\pi(s_{t+1})]vπ(st)=at∑π(at∣st)[r∑p(r∣st,at)r+γst+1∑p(st+1∣st,at)vπ(st+1)]
这便是贝尔曼公式的代数形式,值得一提的是,方程的左边涉及到一个状态,方程的右边涉及到所有状态,但该方程对所有的状态(假定有N个)都成立,所以我们可以列出N个方程,解N个未知变量,所以方程是有解的,其解就是每个状态的状态值(state value)。
现在我们用一个例子来说明这一点:
图2.3 用于状态值计算的示例,其中绿色箭头(圆圈)的代表策略,r代表环境给予action的奖励
在图2.3中,我们有了一个策略,该策略指导我们如何在state下采取action,比如如果当前的state是s3s_3s3的话,则Agent选择向右走。现在我们通过解贝尔曼方程的方法来获得每个状态的状态值,假定γ=0.9\gamma = 0.9γ=0.9:
由于每个状态的策略是决定性的,所以我们可以写出每个状态的策略概率分布:
π(a3∣s1)=1π(a3∣s2)=1π(a2∣s3)=1π(a5∣s4)=1\begin{align} \pi(a_3 \mid s_1) = 1 \notag \\ \pi(a_3 \mid s_2) = 1 \notag \\ \pi(a_2 \mid s_3) = 1 \notag \\ \pi(a_5 \mid s_4) = 1 \notag \\ \end{align}π(a3∣s1)=1π(a3∣s2)=1π(a2∣s3)=1π(a5∣s4)=1
针对s1s_1s1我们可以写出它的贝尔曼方程:
vπ(s1)=π(a3∣s1)[p(r∣s1,a3)⋅r+γp(s3∣s1,a3)vπ(s3)]=1⋅[1⋅0+0.9⋅1⋅vπ(s3)]=0.9vπ(s3)\begin{align} v_\pi(s_1) &= \pi(a_3 \mid s_1)[p(r \mid s_1,a_3)\cdot r + \gamma p(s_3 \mid s_1,a_3)v_\pi(s_3)] \notag \\ &= 1 \cdot[1 \cdot 0 + 0.9 \cdot 1 \cdot v_\pi(s_3)]\notag \\ &= 0.9v_\pi(s_3) \notag \end{align}vπ(s1)=π(a3∣s1)[p(r∣s1,a3)⋅r+γp(s3∣s1,a3)vπ(s3)]=1⋅[1⋅0+0.9⋅1⋅vπ(s3)]=0.9vπ(s3)
同理我们可以写出其他的贝尔曼方程:
vπ(s2)=1+0.9vπ(s4)vπ(s3)=1+0.9vπ(s4)vπ(s4)=1+0.9vπ(s4)\begin{align} v_\pi(s_2) = 1 + 0.9v_\pi(s_4) \notag \\ v_\pi(s_3) = 1 + 0.9v_\pi(s_4) \notag \\ v_\pi(s_4) = 1 + 0.9v_\pi(s_4) \notag \\ \end{align}vπ(s2)=1+0.9vπ(s4)vπ(s3)=1+0.9vπ(s4)vπ(s4)=1+0.9vπ(s4)
所以我们可以解出每一个状态的state value:
vπ(s1)=9vπ(s2)=10vπ(s3)=10vπ(s4)=10\begin{align} v_\pi(s_1) = 9 \;\; \notag \\ v_\pi(s_2) = 10 \notag \\ v_\pi(s_3) = 10 \notag \\ v_\pi(s_4) = 10 \notag \\ \end{align}vπ(s1)=9vπ(s2)=10vπ(s3)=10vπ(s4)=10
假如我们更改了策略,让s1s_1s1处的策略改为向右走,其他地方的策略和奖励不变,由于进入到了禁区,环境给予-1的奖励,则此时它的贝尔曼方程为:
vπ(s1)=π(a2∣s1)[p(r∣s1,a2)⋅r+γp(s2∣s1,a2)vπ(s2)]=1⋅[1⋅(−1)+0.9⋅1⋅vπ(s2)]=−1+0.9vπ(s2)=8\begin{align} v_\pi(s_1) &= \pi(a_2 \mid s_1)[p(r \mid s_1,a_2)\cdot r + \gamma p(s_2 \mid s_1,a_2)v_\pi(s_2)] \notag \\ &= 1 \cdot[1 \cdot (-1) + 0.9 \cdot 1 \cdot v_\pi(s_2)]\notag \\ &= -1 + 0.9v_\pi(s_2) \notag \\ &= 8 \notag \end{align}vπ(s1)=π(a2∣s1)[p(r∣s1,a2)⋅r+γp(s2∣s1,a2)vπ(s2)]=1⋅[1⋅(−1)+0.9⋅1⋅vπ(s2)]=−1+0.9vπ(s2)=8
这里我们可以看到,这次计算出的s1s_1s1的状态值比上一次计算出的状态值要小,这也就说明了,第二个策略是不如第一个策略的,直观上也是如此,因为第二个策略走到了禁区而第一个策略没有走到禁区。
贝尔曼公式的矩阵形式
前面我们提到,贝尔曼公式是一个状态值之间的关联方程组,也就是说每个状态都可以列一个贝尔曼公式来计算其状态值,自然而然地,我们就可以写出它的矩阵形式。
[vπ(s1)vπ(s2)⋯vπ(sn)]=[r1r2⋯rn]+γ[Pπ(St+1=s1∣s1)Pπ(St+1=s2∣s1)⋯Pπ(St+1=s1∣s2)Pπ(St+1=s2∣s2)⋯⋯⋯⋯Pπ(St+1=s1∣sn)Pπ(St+1=s2∣sn)⋯][vπ(s1)vπ(s2)⋯vπ(sn)]\left[ \begin{array}{c} v_\pi(s_1) \\ v_\pi(s_2) \\ \cdots \\ v_\pi(s_n) \end{array} \right] = \left[ \begin{array}{c} r_1 \\ r_2 \\ \cdots \\ r_n \end{array} \right] + \gamma \left[ \begin{array}{c} P_\pi(S_{t+1} = s_1 \mid s_1) && P_\pi(S_{t+1} = s_2 \mid s_1) && \cdots \\ P_\pi(S_{t+1} = s_1 \mid s_2) && P_\pi(S_{t+1} = s_2 \mid s_2) && \cdots \\ \cdots && \cdots && \cdots \\ P_\pi(S_{t+1} = s_1 \mid s_n) && P_\pi(S_{t+1} = s_2 \mid s_n) && \cdots \end{array} \right] \left[ \begin{array}{c} v_\pi(s_1) \\ v_\pi(s_2) \\ \cdots \\ v_\pi(s_n) \end{array} \right]vπ(s1)vπ(s2)⋯vπ(sn)=r1r2⋯rn+γPπ(St+1=s1∣s1)Pπ(St+1=s1∣s2)⋯Pπ(St+1=s1∣sn)Pπ(St+1=s2∣s1)Pπ(St+1=s2∣s2)⋯Pπ(St+1=s2∣sn)⋯⋯⋯⋯vπ(s1)vπ(s2)⋯vπ(sn)
其中,rir_iri 代表状态为sis_isi时的奖励期望,PπP_\piPπ表示在策略π\piπ下的状态转移概率分布,于是我们可以写成以下形式进行简化:
vπ=rπ+γPπvπ\mathbf{v_\pi} = \mathbf{r_\pi} + \gamma \mathbf{P_\pi} \mathbf{v_\pi}vπ=rπ+γPπvπ
其中,rπ\mathbf{r_\pi}rπ为奖励期望向量,Pπ\mathbf{P_\pi}Pπ为状态转移矩阵。
以图2.3为例,我们可以写出贝尔曼公式的矩阵形式,首先由于其概率分布是确定性的,我们可以写出其状态转移矩阵:
Pπ=[Pπ(St+1=s1∣s1)Pπ(St+1=s2∣s1)⋯Pπ(St+1=s1∣s2)Pπ(St+1=s2∣s2)⋯⋯⋯⋯Pπ(St+1=s1∣sn)Pπ(St+1=s2∣sn)⋯]=[0010000100010001]\mathbf{P_\pi} = \left[ \begin{array}{c} P_\pi(S_{t+1} = s_1 \mid s_1) && P_\pi(S_{t+1} = s_2 \mid s_1) && \cdots \\ P_\pi(S_{t+1} = s_1 \mid s_2) && P_\pi(S_{t+1} = s_2 \mid s_2) && \cdots \\ \cdots && \cdots && \cdots \\ P_\pi(S_{t+1} = s_1 \mid s_n) && P_\pi(S_{t+1} = s_2 \mid s_n) && \cdots \end{array} \right] = \left[ \begin{array}{c} 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \\ 0 && 0 && 0 && 1 \\ 0 && 0 && 0 && 1 \end{array} \right]Pπ=Pπ(St+1=s1∣s1)Pπ(St+1=s1∣s2)⋯Pπ(St+1=s1∣sn)Pπ(St+1=s2∣s1)Pπ(St+1=s2∣s2)⋯Pπ(St+1=s2∣sn)⋯⋯⋯⋯=0000000010000111
所以贝尔曼公式的矩阵形式为:
[vπ(s1)vπ(s2)vπ(s3)vπ(s4)]=[0111]+0.9[0010000100010001][vπ(s1)vπ(s2)vπ(s3)vπ(s4)]\left[ \begin{array}{c} v_\pi(s_1) \\ v_\pi(s_2) \\ v_\pi(s_3) \\ v_\pi(s_4) \end{array} \right] = \left[ \begin{array}{c} 0 \\ 1 \\ 1 \\ 1 \end{array} \right] + 0.9 \left[ \begin{array}{c} 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \\ 0 && 0 && 0 && 1 \\ 0 && 0 && 0 && 1 \end{array} \right] \left[ \begin{array}{c} v_\pi(s_1) \\ v_\pi(s_2) \\ v_\pi(s_3) \\ v_\pi(s_4) \end{array} \right] vπ(s1)vπ(s2)vπ(s3)vπ(s4)=0111+0.90000000010000111vπ(s1)vπ(s2)vπ(s3)vπ(s4)
然后通过一些矩阵论的方法我们也可以将这个齐次线性方程组的解解出来。