強化學習雜談


強化學習從入門到放棄

雜談

我們不一樣?

  • no supervisor , only reward

  • feedback is delayed. 當前行為產生的實際價值可能要很久才能知道

reward hypothesis

All goals can be described by the maximisation of expected cumulative reward

History and State

  • 歷史就是一系列的觀察,反饋,動作,\(H_t = O_1,R_1,A_1,\dots ,O_t,R_t,A_t\)

  • 狀態就是決定將來發生事情的信息,\(S_t = f(H_t)\)

  • information state :包含歷史中所有有用的信息

    • Markov:\(P[S_{t+1} | S_t ] = P[S_{t+1} | S_1, ..., S_t ]\)

      • \(H_{1:t}\to S_t\to H_{t+1:∞}\)

observability and state

直接觀察env,獲得環境狀態MDP

觀察受限,部分狀態POMDP

RL AGENT major components

  • Policy

  • Value Function

  • Model

Policy

a map from state to action

  • deterministic: \(a =\pi(s)\)
  • stochastic:\(\pi(a|s) = P[A_t=a|S_t=a]\)

value function

a prediction of future reward

\(v_{\pi}(s) = E_{\pi}[R_{t+1} + γR_{t+2 }+ γ^2R_{t+3} + ... | S_t = s]\)

model

model predicts what env will do next.

  • \(P_{SS'}^a=P[S_{t+1}=s'|S_t=s,A_t=a]\)

  • \(R_S^a = E[R_{t+1}|S_t=s,A_t=a]\)

Categorizing RL agents

基於什么?

  • value based: value function

  • policy based: Policy

  • actor critic: both

是否需要model

  • Model Free

    • Policy and/or value function
  • Model based

    • 相比model free多建一個model

兩個方面:

  • 不了解Model, RL
  • 了解model,planning

Exploration and Exploitation

探索,去探索未知,降低不確定性。期望未知給我們帶來更好的效果

利用,安於現狀,現在最好的就是最好的

Prediction and Control

預測,給定policy,估計未來

控制,找到最好的policy

MDP

MP

A state \(S_t\) is Markov if and only if \(P [S_{t+1} | S_t ] = P [S_{t+1} | S_1, ..., S_t ]\)

A Markov Process (or Markov Chain) is a tuple <S,P>

MRP

MRP 是帶reward的MP

A Markov Reward Process is a tuple \(<S,P, R, γ>\)

Return

\(G_t = R_{t+1}+\gamma R_{t+2}+\dots=\sum_{k=0}^{\infty} \gamma^kR_{t+k+1}\)

reward是狀態轉移之后才能判斷的,延遲一個時間步

value function

\(v(s_t) = E[G_t|S_t]\)

Bellman Equation

\(v(s) = E[G_t|S_t=s]=E[R_{t+1}+\gamma v(s_{t+1})|S_{t=s}]\)

矩陣格式\(v = R + γPv\)

MDP

Policy:

\(π(a|s) = P [A_t = a | S_t = s]\) 時間無關

MDP>MRP

\(P^π_{s,s'} = \sum_{a∈A} π(a|s)P^a_{ss'}\)

\(R^π_{s} = \sum_{a∈A} π(a|s)R^a_{s}\)

value function,action-value function

  • \(v_π(s) = E_π [G_t | S_t = s]\)

  • \(q_π(s, a) = E_π [G_t | S_t = s, A_t = a]\)

Bellman Expectation equation

  • \(v_π(s) = E_π [R_{t+1} + γv_π(S_{t+1}) | S_t = s]\)

  • \(q_π(s, a) = E_π [R_{t+1} + γq_π(S_{t+1}, A_{t+1}) | S_t = s, A_t = a]\)

  • \(v_π(s) = \sum_{a∈A} π(a|s)q_π(s, a)\)

  • \(q_π(s, a) = R^a_s + γ \sum_{ s'∈S} P^a_{ss'}v_π(s')\)

  • \(v_π(s) = \sum_{a∈A} π(a|s) R^a_s + γ \sum_{ s'∈S} P ^a_{ ss'}v_π(s' )\)

  • \(q_π(s, a) = R^a_s + γ \sum_ {s'∈S} P^a_{ss'} \sum_{a'∈A}π(a'|s')q_π(s' ,a' )\)

矩陣格式

\(v_π = R_π + γP_π v_π\)

\(v_π = (I − γP_π )^{ −1} R_π\)

Optimal Value Function

\(v_∗(s) = \underset{π}{max}\, v_π(s)\)

\(q_∗(s, a) = \underset{\pi}max\, q_π(s, a)\)

Optimal policy

\(π≥π'\) if $ v_π(s) ≥ v_{π'}(s), ∀s$

Theorem:

每個MDP存在最優策略

最優策略\(v_{π∗} (s) = v_∗(s)\),\(q_{π∗} (s, a) = q_∗(s, a)\)

if we know $q_\star $,we know the best policy

Bellman Optimality Equation

  • \(v_\star(s) = \underset{a}{max}\, q_{\star}(s, a)\)

  • \(q_\star(s, a) = R^a_s + γ \sum_{ s'∈S} P^a_{ss'}v_\star(s')\)

  • \(v_\star(s) = \underset{a}{max}R^a_s + γ \sum_{ s'∈S} P ^a_{ ss'}v_\star(s' )\)

  • \(q_\star(s, a) = R^a_s + γ\sum_ {s'∈S} P^a_{ss'} \underset{a'}{max}\,q_\star(s' ,a' )\)

Planning by Dynamic Programming

Requirements for Dynamic Programming

  • 最優子結構
  • 重復的子問題

MDP滿足,Bellman方程給了迭代的方程,value function stores,reuses

For prediction:

  • Input:

    • \(MDP<S,A,P,R,γ>\) and policy π
    • or: \(MRP<S,P^π ,R^π ,γ>\)
  • Output:

    • value function \(v_π\)

for control:

  • Input:

  • \(MDP <S, A,P, R, γ>\)

  • Output:

    • optimal value function \(v_∗\) and: optimal policy \(π_∗\)

iterative policy evaluation

給定policy \(\pi\) 計算使用該policy的value function.

bellman expectation equation

\[v_π^{k+1}(s) = \sum_{a∈A} π(a|s) (R^a_s + γ \sum_{ s'∈S} P ^a_{ ss'}v_π^k(s' )) \]

policy iteration

policy evalution 不必真的收斂到\(v_\pi\) .因為我們真正需要的是基於價值函數產生的一個better Policy.

value iteration

如果policy evaluation只迭代一次,那么就是value iteration

如果我們有一個子問題的最優解,我們就能夠回溯求解父問題的最優解,這就是動態規划里的一個很常見的思想

Bellman Optimality Equation

\(v^{k+1}_\star(s)= \underset{a}{max}R^a_s + γ \sum_{ s'∈S} P ^a_{ss'}v_\star^k(s')\)

value function 跟新過程的中間值不和任何策略有關

可以有一些優化動態規划的方法,inplace,只維護一個v, 每一步只更新受影響的state

如果規模太大backup無法使用

期望不能求,只能采樣求均值,采樣數據是\(<s,a,r,s'>\),這樣就不需要MDP中\(R,P\)

這樣就是model free了

contraction mapping theoremcontraction mapping theorem

\(T^π(v) = R^π + γP^πv\)

\(T^\pi\)滿足壓縮映射定理,不動點是最優的v,收斂到不動點

蒙特卡洛 and TD

這一節只講 prediction

Monte-Carlo Policy Evaluation

episodes :must terminate不然沒有辦法計算Goal

under policy \(\pi\),采樣

\(S_1,A_1,R_2,\dots ,S_k \sim \pi\)

\(v_π(s) = E_π [G_t| S_t = s]\)

現如今,沒了model,就沒辦法算期望,

First-visit MCPE

for each in episodes:
	if state s is visited first time in each at time step t:
		N(s)+=1
		S(s)+=G_t
		mean value V(s) = S(s)/N(s)
		

大數定理,保駕護航

EVERY-visit MCPE

for each in episodes:
	if state s is visited in each at time step t:
		N(s)+=1
		S(s)+=G_t
		mean value V(s) = S(s)/N(s)
		

first 跟every的區別TODO

求均值可以用累進更新

\(V(s) =V(s)+ \frac{1}{N(t)}(G(t)-V(s))\)

\(N(t)\)是沒必要的,換成\(\alpha\)

Robbins-Monro sequence of step-sizes \(α_t\)

  • \(\sum_{t=1}^{\infty}\alpha_t=\infty\)

  • \(\sum_{t=1}^{\infty}\alpha_t^2=0\)

更新 之所以用\(\alpha\) 替換\(1/N(t)\)是因為我們的model不一定是穩定的,所以如果用均值就說明,過去的影響跟現在的影響是一樣的,但是我們更關注現在的影響所以用了一個固定的\(\alpha\) 這樣影響是指數衰減的。

滿足RM的才收斂,所以均值是收斂的,固定alpha是不收斂的(第二項不滿足),但是僅僅是理論而已,並且不穩定的環境,收斂個毛

\(V(s) =V(s)+ \alpha(G(t)-V(s))\)

犧牲了一點點精度,換來速度上的提升,我們也可以擁有主動權

TD:Temporal-Difference Learning

MC的一個問題就是\(G(t)\)這玩意太煩人,需要一個完整的終止的episode

G(t)是采樣后我們算到的獲得的goal.我們可以自己猜一個

TD(0)

\(V(S_t) ← V(S_t) + α (R_{t+1} + γV(S_{t+1}) − V(S_t))\)

\(R_{t+1}+\gamma V(S_{t+1})\)被稱之為TD target

\(\delta = R_{t+1} + γV(S_{t+1}) − V(S_t)\) is TD error

理想與現實之間的差距,迫使我們磨平棱角,調整我們的理想,但是現實也不真的

是現實,只是眼前的現實加上遠方的想象,但是我們偏偏要認為他是現實

TD 可以online 學習,不必要最后的outcome

MC 高方差,無偏差unbias.

TD 低方差,有bias

MC就是把原來的期望換成了采樣之后的均值的近似值。實際上沒有利用馬爾科夫性質

  • Bootstrapping: update involves an estimate

    • MC does not bootstrap
    • DP bootstraps
    • TD bootstraps
  • Sampling: update samples an expectation

    • MC samples
    • DP does not sample
    • TD samples

TD可以向前look 1 step也可以look n steps,看到底就是MC

\(V(S_t) ← V(S_t) + α(G^{(n)}_t − V(S_t))\)

我們也可以結合向前看\({n_1,n_2}\)step的均值

產生了TD(\(\lambda\))

$\frac{1}{1-\lambda} =\sum_{i=1}^{\infty}\lambda^i $

\(G^λ_t = (1 − λ)\sum^∞_{n=1}λ^{n−1}G_t(n)\)

\(V(S_t) ← V(S_t) + α(G^λ_t − V(S_t))\)

Eligibility Traces(資格跡)

\(E_0(s) = 0\)
\(E_t(s) = γλE_{t−1}(s) + 1(S_t = s)\)

Backward View TD(λ)

\(δ_t = R_{t+1} + γV(S_{t+1}) − V(S_t)\)
\(V(s) ← V(s) + αδ_tE_t(s)\)

\(TD(\lambda=0)=TD(0)\)

MODEL FREE control

on-policy: learn on the job. learn about policy \(\pi\) form experience sampled from \(\pi\)

off-policy: learn about policy \(\pi\) form experience sampled from \(\mu\)

套路跟MDP control是一樣的

首先基於V求greedy \(\pi\)

\(π'(s) = \underset{a\in A}{argmax}R^a_s + P^a_{ss'}V(s')\)

我們不知道P,所以換成

\(π'(s) = \underset{a\in A}{argmax}Q(s,a)\)

問題是:由於只是采樣,只采用greedy的方式,可能會陷入局部最優。

\(\epsilon\)-Greedy Exploration

每一步都有\(\epsilon\)的概率隨機,確保足夠的探索

\(\epsilon\)-greedy is GLIE if \(\epsilon\) reduces to zero at \(\epsilon_k=\frac{1}{k}\)

  • 每個(s,a)都可以被探索到

  • 策略最終收斂到一個greedy策略:

GLIE MC Control

根據\(\pi\) 采樣

$ {S_1, A_1, R_2, ..., S_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))\)

\(\epsilon ← 1/k\)
\(π ← \epsilon-greedy(Q)\)

Updating Action-Value Functions with Sarsa

\(Q(S,A)←Q(S, A) + α(R + γQ(S', A')−Q(S, A))\)

Convergence of Sarsa

\(Q(s, a) → q_∗(s, a)\)需要滿足兩個條件

  • \(\pi_t(a|s)\)滿足GLIE條件

  • Robbins-Monro sequence of step-sizes \(α_t\)

    • \(\sum_{t=1}^{\infty}\alpha_t=\infty\)

    • \(\sum_{t=1}^{\infty}\alpha_t^2=\infty\)

MDP, TD 上面的n-step,lambda技術都可以用到這里

sarsa lambda算法

Off Policy

evaluate target policy \(π(a|s)\) to compute \(v_π(s)\) or \(q_π(s, a)\)
While following behaviour policy \(µ(a|s)\)
\({S_1, A_1, R_2, ..., S_T } ∼ µ\)

IS importance sampling

\(E_{X∼P}[f(X)]=\sum P(X)f(X)=\sum Q(X)\frac{P(X)}{Q(X)}f(X)= E_{X∼Q}[\frac{P(X)}{Q(X)}f(X)]\)

期望是一樣的,但是抽樣時會不一樣

最后是由梯度反推原函數、

划掉的,可以認為差不多,畢竟不會算。

問題來了,兩個分布不能差太多?

off policy MC

Off-Policy TD

Q-learning

\(Q(S,A)←Q(S,A)+α(R+γ \,\underset{a'}{max} Q(S', a')−Q(S, A))\)

Value Function Approximation

能力越大 ,責任越大,value function or action-value function 需要更多的責任,需要更大的能力,lookup table 不能夠滿足要求。所以需要運用函數近似,或者概率分布學習。

自古以來,我們的一個目標就是要讓我們的policy 盡可能的接近最優的policy

\(J(w) = E_π[(v_π(S)−\overset{ˆ}{v}(S, w))^2]\)

梯度下降法,尋找局部最小

\(∆w=−\frac{1}{2}α∇_wJ(w)=αE_π[(v_π(S)−\overset{ˆ}{v}(S,w))∇_w\overset{ˆ}{v}(S,w)]\)

SGD

\(∆w=α(v_π(S)−\overset{ˆ}{v}(S,w))∇_w\overset{ˆ}{v}(S,w)\)

feature vector

linear value function approximation

\(\overset{ˆ}{v}(S,w)=x(S)^Tw=\sum^n_{j=1}x_j(S)w_j\)

\(∆w =α(v_π(S) − \overset{ˆ}{v}(S,w))x(S)\)

table lookup features 就是特殊的feature vector

回到SGD的公式,我們沒有\(v_\pi(s)\)

MC,TD有要上場了

MC: \(∆w =α(G_t−\overset{ˆ}{v}(S_t, w))∇_w\overset{ˆ}{v}(S_t, w)\)

TD(0):\(∆w = α(R_{t+1} + γ\overset{ˆ}{v}(S_{t+1}, w) − \overset{ˆ}{v}(S_t, w))∇_w\overset{ˆ}{v}(S_t, w)\)

backward TD-lambda

\(δ_t = R_{t+1} + γ\overset{ˆ}{v}(S_{t+1}, w) − \overset{ˆ}{v}(S_t, w)\)

\(E_t = γλE_{t−1} + x(S_t)\) 狀態的積累和衰減
\(∆w = αδ_tE_t\)

因為model free,實際上使用action-value

Batch methods

可以從過去的狀態中采樣,使用batch的方法,計算

DQN

  • experience replay and fixed Q-target

一套網絡結構,target中用的是比較old的參數。因為更加穩定,不然就是自己追自己,兩個亂晃。

我們的目的是讓努力接近我們的target,目標定好了才好追。

DQN 變種很多,這里不講。

Linear Least Squares Prediction 神經網絡收斂不容易

\(\overset{ˆ}{v}(s, w) = x(s)^Tw\)

同樣需要用各種方法近似\(v_t^\pi\)

Policy Gradient

value-based 的方式,太硬,不好。

下面是李宏毅的推倒

約等於那一步省了個狀態轉移矩陣\(P_{ss'}\),還有從\(R(\tau)\) 換成了\(R(\tau^n)\),這一步沒有講。

需要看cs294。相當於直接推過來的梯度下降公式是按照軌跡算的,也就這個軌跡的梯度按照這個軌跡的sum_reward來更改,顯然軌跡上的每一點應該分別算。所以看下面的公式。

這玩意和極大似然很像,就是多了一個量而已,代碼里也很好實現。

\(上面的\)\(R(t^n)\) 需要換成\(Q(s,a)\),不能用整個軌跡的return作用到分別的action上,各算各的

policy based 中策略\(\pi\) 可以看做是\(π_θ(s,a)=P[a|s,θ]\)

目標很明確,獲取最大的Reward,

三種

  • 讓初始狀態的return 期望最大:\(∇_θJ_1(θ)=v_{\pi_\theta}(s_1)=E_{\pi_\theta}[v_1]\)
  • 連續環境,平均值最大:\(J_{avV}(θ)=\sum_{s}d^{π_θ}V^{π_θ}(s)\)
  • 每個時間步的Reward平均值最大\(JavR(θ) = \sum_{s}d^{π_θ}(s)\sum_aπ_θ(s, a)R^a_s\)

\(d^{\pi_\theta}\) 馬爾科夫鏈對\(\pi_\theta\)的平穩分布(stationary distribution) TODO

所以policy based 的RL是一個優化問題,找到\(\theta\)\(J(\theta)\) 最大

很多種方法,這里關注梯度下降法

》大力出奇跡法:

在$\theta $的每個向量分量中微調,算梯度,更新累死人

score function is \(∇_θlog π_θ(s, a)\)

常用的兩種plicy

  • softmax policy

    • weight actions using \(\phi(s,a)^T\theta\)
    • \(\pi_\theta(s,a) ∝ e^{\phi(s,a)^T\theta}\)
    • score function:\(∇_θlog {π_θ}(s,a)=\phi(s,a)−E_{π_θ}[\phi(s,·)]\)
  • gaussian policy

    • mean :\(\mu(s)=\phi(s)^T \theta\),\(\sigma^2\) can be fixed

    • \(a\sim N(\mu(s),\sigma^2)\)

    • score function:\(∇_θlogπ_θ(s,a)=\frac{(a − µ(s))\phi(s)}{σ^2}\)

for any of the policy objective functions \(J= J_1\), \(JavR\), or $\frac{1}{1−γ}J_{avV} $

三種方式的導數都可以如下表示:\(∇_θJ(θ)=E_{π_θ}[∇_θlogπ_θ(s, a)Q_{π_θ}(s, a)]\)

壓力來到了\(Q_{\pi_\theta}(s,a)\)

蒙特卡洛 policy gradient(REINFORCE)

\(v_t\) 作為\(Q^{\pi_\theta}(s_t,a_t)\)的一個無偏采樣

on-policy的缺點,取樣的參數只能用一次,太浪費了。

下面就是off-policy的

PPO

actor-critic

我們自然而然的想到了利用value based的方法計算\(Q_w(s,a)\),來替換原來公式的\(Q^{\pi_\theta}(s,a)\)

\(∇_θJ(θ) ≈ E_{π_θ}[∇_θlog π_θ(s,a)Q_w(s,a)]\)
\(∆θ = α∇_θlogπ_θ(s,a)Q_w (s, a)\)

  • Monte-Carlo policy evaluation
  • Temporal-Difference learning
  • TD(λ)

都可以解決

引入偏差,佛祖說不好,不好

偏差 Compatible Function Approximation Theorem TODO

方差也需要減小

(后面求和為1,導數為0)\(B(s)=V^{\pi_\theta}(s)\)

\(A^{\pi_\theta}(s,a)=Q^{\pi_\theta}(s)-v^{\pi_\theta}(s)\)

DDPG

ddpg適用於連續的action space.就是連續版AC ,其中actor直接給出s對應最優a,critic根據s,a計算他們的value.

critic根據使用td的方式。actor更新的是想讓Q值更大的a出現在actor的預測中的概率最大

TD3

TD3主要是對AC算法的改進,也可以說是對DDPG的改進

改進分為三點,

  • 因為target_critic容易高估,所以用了兩個Q用較小的那個更新critic
  • 更新policy的時候也用延遲更新,更新d次critic然后跟新一次actor.價值函數准確,policy更好
  • 使用policy smoothing,讓價值函數在action上更平滑

Natural Policy Gradient(TODO)

Integrating Learning and Planning(Model based)

從經驗中建立一個model

model free :learn

model based: plan

model based RL

Dyna

  • Learn a model from real experience
  • Learn and plan value function (and/or policy) from real and simulated experience

Simulation-Based Sear

1.forward search

從當前狀態開始解決一個sub-MDP問題

2.Simulation-Based Search

從當前狀態開始采樣,然后使用,model-free方法

Simple Monte-Carlo Search 就是算出來樣本中平均return最大的那個a

MCTS 蒙特卡洛樹搜索

先采樣,用樣本建樹,然后評估。

TD-search

采樣,sarsa方法

Dyna-2

Exploration and Exploitation

多臂賭博機,n個桿,每次只能拉一個,拉完有reward,每個桿都有自己未知的分布,怎么選讓Reward最大

后悔值:我曾經離最好的你究竟有多遠?

\(Q(a) = E [r|a]\)

\(V^∗ = Q(a^∗)= \underset{a∈A}{max}Q(a)\)

\(L_t = E[\sum_{τ=1}^{t}V^∗−Q(a_τ)]\)

gap:\(∆a =V^∗−Q(a)\)

\(L_t=\sum_{a∈A}E[N_t(a)]∆a\)

gaps are unknown

If an algorithm forever explores it will have linear total regret
If an algorithm never explores it will have linear total regret

to be or not to be, this is a question

upper bound確定

所以最好的就是log形式的

  1. naive exploration:\(\epsilon\)-greedy 隨機的部分永遠有gap

    可以用decaying \(\epsilon\)-greedy.

    \(\epsilon = min[1,\frac{c|A|}{d^2t}]\),\(d=\underset{a|\Delta_a>0}{min}\Delta_{i},c>0\)

    log形式的regret ,Problem:不知道gap

  2. Optimistic Initialisation: 再被證明之前,認為他是最好的。

    Simple and practical idea: initialise Q(a) to high value

    這樣算法自然認為那些未知的是最好的,因為已知的不夠好。但是不穩定的model仍然不行,因為這只是改邊了開始而已,對於不穩定的model沒有所謂的開始

  3. Optimism in the Face of Uncertainty: 更喜歡不確定的

    我們選擇的策略可以分兩部分,一部分是均值,一部分是根據分布的不確定性

    \(a_t = \underset{a\in A}{argmax}\overset{ˆ}{Q_t}(a)+\overset{ˆ}{U_t}(a)\)

    \(e^{−2N_t(a)U_t(a)^2}=p\)

    \(U_t(a)= \sqrt{\frac{-log p}{2N_t(a)}}\)

    隨着更多的觀察,我們需要p越來越小,這樣我們的置信度越來越高,不確定程度也會越來越小。比如讓\(p=t^{-4}\)

    \(U_t(a)= \sqrt{\frac{2log\, t}{N_t(a)}}\)

    公式可以很好的讓不確定程度逐漸減小

    \(a_t = \underset{a\in A}{argmax}{Q_t}(a)+\sqrt{\frac{2log\, t}{N_t(a)}}\)

    \(lmt_{t→∞}L_t ≤ 8 log\, t \sum_{a|∆a>0}∆_a\) UCB算法對數漸進

  4. Probability Matching:根據概率分布來選

我們可以使用貝葉斯的思想,使用P(R)的先驗知識、上面我們只是假設reward有界

這叫做 Bayesian bandits

比如使用貝葉斯UCB假設分布是獨立的高斯分布\(a_t = \underset{a∈A}{argmax}\, µ_a + cσ_a/\sqrt{N(a)}\)

另外就是\(π(a|h_t)=P[Q(a)>Q(a'),∀a'\neq a|h_t]\)

從歷史中算出來一個a是最好的a的概率,但是很顯然不好算

  1. Information State Search:結合信息來選

探索之所以有用是因為帶來了信息,如何衡量信息的大小

\(\overset{\sim}{M} = <\overset{\sim}S, A,\overset{\sim}{P}, R, γ>\)

\(\overset{\sim}s=f(h_t)\).

把伯努利賭博機,變成了一個infinite的MDP

可以用model-free 的Q-learning的方法

也可以用Bayesian model based 的RL方法

TODO


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM