迷霧探險3 | 強化學習入門

看完《迷霧探險2》的深度學習入門镣隶,又發(fā)現(xiàn)了一些不錯的文章:

通俗易懂的深度學習發(fā)展介紹:從最基本的神經(jīng)網(wǎng)絡算法(單個神經(jīng)元模型的提出,到兩層和三層的簡單神經(jīng)網(wǎng)絡吐限,到BP算法忽刽,到深度神經(jīng)網(wǎng)絡CNN)講到增強學習
增強學習系列之(一):增強學習介紹:從動態(tài)規(guī)劃算法和PageRank算法(和增強學習很像)講到增強學習算法天揖。
增強學習系列之(二):實現(xiàn)一個簡單的增強學習的例子:Q-Learning算法+epsilon_greedy策略+tensorflow訓練神經(jīng)網(wǎng)絡==>Deep Q Learning
增強學習系列之(三):實現(xiàn)一個打磚塊的游戲:在openai的gym里面,針對breakout這款游戲的v3版本跪帝,實現(xiàn)AI打游戲今膊。

強化學習的定義和通俗理解

1.定義

假定一個智能體(agent),在一個未知的環(huán)境中(當前狀態(tài)state),采取了一個行動(action),然后收獲了一個回報(return)伞剑,并進入了下一個狀態(tài)斑唬。最終目的是求解一個策略讓 agent的回報最大化。


RL系統(tǒng)的概念圖.png

增強學習當中經(jīng)常用到的術語:

  • agent,是指訓練當中的個體赖钞,就是我們訓練的算法和參數(shù)的集合
  • environment腰素,是指agent所處的環(huán)境
  • episode,是指一個完整的訓練的階段雪营。從一次訓練開始弓千,到這次訓練成功或者失敗結(jié)束,是一個episode
  • step献起,是指一個episode當中的操作洋访,每采取一次操作,就是一個step
  • state谴餐,是指agent在每個時刻所面臨的狀態(tài)
  • action姻政,是指采取的那個操作究竟是什么
  • value,是指在這個時刻岂嗓,我所能采取的各個動作汁展,所具有的價值

2. 強化學習最基礎的解法:MPD(馬爾可夫決策過程)

一個馬爾可夫決策過程由五元組組成:M = (S, A, Psa, γ, R)

  • S:表示狀態(tài)集(states)
  • A:表示一系列動作(actions)
  • Psa:表示狀態(tài)轉(zhuǎn)移概率。表示的是在當前s ∈ S狀態(tài)下厌殉,經(jīng)過a ∈ A作用后食绿,會轉(zhuǎn)移到的其他狀態(tài)的概率分布情況。比如公罕,在狀態(tài)s下執(zhí)行動作a器紧,轉(zhuǎn)移到s'的概率可以表示為p(s'|s,a)。
  • γ:(dicount factor):表示阻尼系數(shù)[0,1)
  • R:S x A → R楼眷,表示回報函數(shù)(reward function)

MDP 的動態(tài)過程如下:某個智能體(agent)的初始狀態(tài)為s0铲汪,然后從 A 中挑選一個動作a0執(zhí)行,執(zhí)行后罐柳,agent 按Psa概率隨機轉(zhuǎn)移到了下一個s1狀態(tài)掌腰,s1∈ Ps0a0。然后再執(zhí)行一個動作a1硝清,就轉(zhuǎn)移到了s2辅斟,接下來再執(zhí)行a2…,我們可以用下面的圖表示狀態(tài)轉(zhuǎn)移的過程芦拿。

如果回報r是根據(jù)狀態(tài)s和動作a得到的,則MDP還可以表示成下圖:

3. 值函數(shù)

上面我們給出了MDP的定義查邢,作為一個智能體(agent)蔗崎,當它在決定下一步應該走什么時,最簡單的方式就是看下Reward函數(shù)的值是多少扰藕,即比較走不同動作的回報缓苛,從而做出決定。但是就像下棋的時候,我們每走一步都會向后考慮未桥,所謂“走一步看三步”笔刹,所以這里我們只看一步即一次Reward函數(shù)是不夠的,這就引出了值函數(shù)(Value Function)也叫折算累積回報(discounted cumulative reward)

3.1 狀態(tài)值函數(shù)(state value function)

當我們遵循某個策略π冬耿,我們將值函數(shù)定義如下舌菜,對于狀態(tài)序列中的每下一個狀態(tài),我們都設置一個衰減系數(shù)γ:

我們將上面的式子寫作遞推的樣子如下:

另外當策略π亦镶,在狀態(tài)s時日月,我們可以確定唯一的動作a,但是s經(jīng)過動作a會進入哪個狀態(tài)是不唯一的缤骨,比如同樣是擲骰子操作爱咬,可能得到的狀態(tài)有6種,那么利用Bellman等式我們便可以得到下面的公式:

再根據(jù)我們最初增強學習的目的绊起,我們便可以得出精拟,求V的目的就是想找到一個當前狀態(tài)s下,最優(yōu)的行動策略π虱歪,表示如下:

通俗的講就是說串前,我需要判斷一下當前的這個狀態(tài)的價值是多少,從而讓我可以選擇最大化價值的那個狀態(tài)來進行操作实蔽。當前狀態(tài)的價值荡碾,就是之后的狀態(tài)的價值的疊加,只不過越往后局装,噪聲越大坛吁,就需要讓他們的權重減小。而后面的所有狀態(tài)的價值和铐尚,又可以寫成下一個狀態(tài)的價值拨脉。當前狀態(tài)的reward我們是可以直接獲得的,所以我們只需要計算下一個狀態(tài)的權值函數(shù)就可以了

3.2 動作值函數(shù)(action value function)

上面我們的值函數(shù)的只與狀態(tài)s有關宣增,如果與狀態(tài)s和動作a都有關玫膀,便稱為動作值函數(shù),即所謂的Q函數(shù)爹脾,如下:

從上式我們可以看出帖旨,我們不僅僅依賴狀態(tài)s和策略π,并且還依賴于動作a灵妨。

綜上我們可以將MDP的最優(yōu)策略定義如下:

關于MDP的求解主要分為值迭代和策略迭代解阅,分別站在不同的角度對MDP進行求解,這里我們不在贅述泌霍,網(wǎng)上有很多相關資料货抄。下面我們簡單闡述下動作值函數(shù)的值迭代求解方式,即所謂的Q-learning

4. Q-learning

Q學習的基本迭代公式如下:

從公式中我們也可以看出它是一種值迭代方式,因為我們每次更新的是Q函數(shù)的值蟹地,而非策略积暖。簡單起見,整理一個簡單的例子加以說明怪与。

詳細的分析可以參考:Q-learning的一個極簡的例子

假設我們有這樣一個房間:

我們的目的是訓練一個機器人夺刑,使得它在圖中的任意一個房間都能夠到達房間外。

OK琼梆,我們對房間進行建模:

并得到reward矩陣性誉,那么機器人走到這個房間之后,就知道了茎杂,它需要走到相鄰的房間错览,才能走到最后的目標房間,所以相鄰的房間也被賦予了權重煌往。 :

通過迭代倾哺,初始點也就有了權重。這個時候機器人就很省心了刽脖,只要向當前節(jié)點周圍分值最高的點走過去就可以了羞海。通過一下過程的迭代我們最終得出了我們的結(jié)果Q矩陣

可以看出,我們的機器人現(xiàn)在無論在哪個房間曲管,都可以利用我們的Q矩陣順利的走到屋外却邓。

總結(jié)一下上面這個例子:增強學習的特征,就是從現(xiàn)有的狀態(tài)出發(fā)院水,不斷的優(yōu)化自己的策略

5. 基于NEXT算法的馬里奧AI游戲機器人

  • NEXT算法(增強拓撲的進化神經(jīng)網(wǎng)絡腊徙,Evolving Neural Networks through Augmenting Topologies)它不僅會訓練和修改網(wǎng)絡的權值,同時會修改網(wǎng)絡的拓撲結(jié)構檬某,包括新增節(jié)點和刪除節(jié)點等操作撬腾。

NEAT算法幾個核心的概念是:

  • 基因:網(wǎng)絡中的連接
  • 基因組:基因的集合
  • 物種:一批具有相似性基因組的集合
  • Fitness:有點類似于增強學習中的reward函數(shù)
  • generation:進行一組訓練的基因組集合,每一代訓練結(jié)束后恢恼,會根據(jù)fitness淘汰基因組民傻,并且通過無性繁殖和有性繁殖來新增新的基因組
  • 基因變異:發(fā)生在新生成基因組的過程中,可能會出現(xiàn)改變網(wǎng)絡的權重场斑,增加突出連接或者神經(jīng)元漓踢,也有可能禁用突觸或者啟用突觸

下圖展示了算法從最一開始簡單的神經(jīng)網(wǎng)絡,一直訓練到后期的網(wǎng)絡

利用NEAT算法實現(xiàn)馬里奧的只能通關的基本思想便是和簸,利用上面NEAT算法的基本觀點彭雾,從游戲內(nèi)存中獲取實時的游戲數(shù)據(jù),判斷馬里奧是否死忙锁保、計算Fitness值、判斷馬里奧是否通關等,從而將這些作為神經(jīng)網(wǎng)絡的輸入爽柒,最后輸出對馬里奧的操作吴菠,包括上下左右跳躍等操作,如下圖:

大多數(shù)該算法實現(xiàn)馬里奧的智能通關都依賴于模擬器浩村,運用lua語言編寫相應腳本做葵,獲取游戲數(shù)據(jù)并操作馬里奧,真實例子見NeuroEvolution with MarI/O心墅。

馬里奧實現(xiàn)效果圖

6. 基于Deep Reinforcement Learning的馬里奧AI實現(xiàn)

NEAT算法是相對提出較早的算法酿矢,在2013年大名鼎鼎的DeepMind提出了一種深度增強學習的算法,該算法主要結(jié)合了CNN和Q-Learning兩種算法怎燥,DeepMind的研究人員將該算法應用在Atari游戲機中的多種小游戲中進行AI通關瘫筐。

其基本算法核心便是我們之前介紹的CNN和增強學習的Q-Learning,游戲智能通關的基本流程如下圖:

利用CNN來識別游戲總馬里奧的狀態(tài)铐姚,并利用增強學習算法做出動作選擇策肝,然后根據(jù)新的返回狀態(tài)和歷史狀態(tài)來計算reward函數(shù)從而反饋給Q函數(shù)進行迭代,不斷的訓練直到游戲能夠通關隐绵。研究人員在訓練了一個游戲后之众,將相同的參數(shù)用在別的游戲中發(fā)現(xiàn)也是適用的,說明該算法具有一定的普遍性依许。下圖反映了一個學習的過程

而同樣的方法棺禾,將DRL應用在馬里奧上,github上有一個開源的實現(xiàn)方式:aleju/mario-ai峭跳,其最終的實現(xiàn)效果圖如下:

在CNN識別過程中膘婶,每4幀圖像,才會進行一次CNN識別坦康,這是識別速率的問題竣付,圖中曲線反映了直接回報函數(shù)和簡介回報函數(shù)。

7. 增強學習常用策略:

  1. 蒙特卡洛方法:暴力遍歷所有episode
    簡單而言滞欠,蒙特卡洛方法就是對這個策略所有可能的結(jié)果求平均古胆。我們向前走了以后,再做一個action筛璧,根據(jù)這個式子逸绎,直到episode結(jié)束,求出收益的和夭谤,就是向前走這個動作的一個采樣棺牧。我們再不斷地在這個狀態(tài)采樣,然后來求平均朗儒。等到采樣變得非常非常多的時候颊乘,我們的統(tǒng)計值就接近期望值了参淹。所以蒙特卡洛方法是一個非常暴力,非常直觀的方法乏悄。

  2. 動態(tài)規(guī)劃方法:在有向無環(huán)圖結(jié)構的問題中可用
    這個其實就類似于我們在開篇的那個例子里面提到的浙值。我們要確定向前走的這個動作的收益,那么就需要將它所有的子問題先全都計算完檩小,然后取最大值开呐,就是它的收益了。這個方法的好處就是效率高规求,遍歷一遍就可以了筐付;而缺點也很明顯,需要子結(jié)構問題是一個有向無環(huán)圖阻肿。

  3. Temporal Difference(時間差分)
    (1)時間差分瓦戚,簡稱TD,是對蒙特卡洛方法的一種簡化冕茅,也是在實際中應用最多的一種算法伤极。
    (2)同樣是要計算向前走的這個行為的價值的期望值,那么它就等于向前走了到達的那個狀態(tài)的reward姨伤,加上它再轉(zhuǎn)移到后繼狀態(tài)的期望值哨坪。有人會說這不就遞歸下去就是遍歷了嗎?不是乍楚,我們就觀測前面一個狀態(tài)当编,剩下的價值我們不去真的計算了,而是用神經(jīng)網(wǎng)絡來估算徒溪。這樣我們不需要計算就可以得到它的價值了忿偷。這就是TD算法里面最簡單的TD(0)算法。

8. 結(jié)合神經(jīng)網(wǎng)絡的增強學習——DQN

結(jié)合神經(jīng)網(wǎng)絡來對state和reward進行估算:很神奇的居然能收斂臊泌。
(1)可以把神經(jīng)網(wǎng)絡當成一個黑盒鲤桥,輸入是一個狀態(tài),輸出是這個狀態(tài)的價值渠概。
(2)整個系統(tǒng)在運作過程中茶凳,通過現(xiàn)有的策略,產(chǎn)生了一些數(shù)據(jù)播揪,獲得的這些數(shù)據(jù)贮喧,在計算Reward值的時候會有所修正。然后我們用修正的值和狀態(tài)猪狈,作為神經(jīng)網(wǎng)絡進行輸入箱沦,再進行訓練。最后的結(jié)果顯示雇庙,這樣做是可以收斂的谓形,牛逼霸钜痢!

(3)神經(jīng)網(wǎng)絡的運用包括訓練和預測兩部分嘛套耕,訓練的時候輸入是state谁帕,和這個state相應的value 峡继。預測的時候輸入是state冯袍,輸出是這個state預估的value
結(jié)合神經(jīng)網(wǎng)絡的增強學習
  • 一個有意思的問題:使用神經(jīng)網(wǎng)絡來預測value,怎么評估神經(jīng)網(wǎng)絡預測的對不對呢碾牌,換個問法康愤,如何決定下一個步驟的value,一個非常簡單的策略是epsilon-greedy舶吗。
  • 簡單介紹一下epsilon-greedy征冷,我們設置一個閾值,epsilon-boundary,比如說初始值是0.8誓琼,意思就是我們現(xiàn)在選擇action的時候检激,80%的可能性是隨機地從動作集中選擇一個動作,20%的可能性是通過神經(jīng)網(wǎng)絡計算每個動作的收益腹侣,然后選最大的那一個叔收。但是隨著學習過程推進,我們的epsilon-boundary要越來越低傲隶,隨機選擇的次數(shù)要越來越少饺律,到最后幾乎不做隨機的選擇。
  • 另外一個問題:如何跟神經(jīng)網(wǎng)絡相結(jié)合跺株,可以看這篇博文的DNQ :Q值神經(jīng)網(wǎng)絡化复濒,講述了如何用一個深度神經(jīng)網(wǎng)絡來表示一個近似輸出reward的function。神經(jīng)網(wǎng)絡的訓練是一個最優(yōu)化問題乒省,最優(yōu)化一個損失函數(shù)loss function巧颈,也就是標簽和網(wǎng)絡輸出的偏差,目標是讓損失函數(shù)最小化袖扛。利用Q-Learning算法為Q網(wǎng)絡提供標簽的樣本砸泛。然后通過反向傳播使用梯度下降的方法來更新神經(jīng)網(wǎng)絡的參數(shù)。整個算法的流程差不多就是:首先反復隨機action試驗攻锰,然后存儲數(shù)據(jù)晾嘶。接下來數(shù)據(jù)存到一定程度,就每次隨機采用數(shù)據(jù)娶吞,進行梯度下降垒迂!

9. 不同于DQN的Policy Gradient

  • 概念:策略網(wǎng)絡Policy Network:就是一個神經(jīng)網(wǎng)絡,輸入是狀態(tài)妒蛇,輸出直接就是動作(不是Q值)机断。a = π(s, θ) 或者概率Pa = π(a|s, θ)

  • 為什么:我們已經(jīng)知道DQN是一個基于價值value的方法楷拳。換句話說就是通過計算每一個狀態(tài)動作的價值,然后選擇價值最大的動作執(zhí)行吏奸。這是一種間接的做法欢揖。那么,更直接的做法是什么奋蔚?【能不能直接更新策略網(wǎng)絡Policy Network呢她混?】

  • 概率輸出的問題。對于DQN來說泊碑,本質(zhì)上是一個接近于確定性輸出的算法坤按。至多就是采用ε-greedy(ε-貪心)進行探索。但是有很多時候馒过,在某一個特定狀態(tài)下臭脓,很多動作的選擇可能都是可以的。比如說我有20塊錢去買飯腹忽。那么不管我買的是蛋炒飯還是土豆肉片蓋碼飯来累,結(jié)果都是一樣的填飽肚子。因此窘奏,采用輸出概率會更通用一些嘹锁。而DQN并不能輸出動作的概率,所以采用Policy Network是一個更好的辦法蔼夜。

  • 目標函數(shù)兼耀。對于策略網(wǎng)絡,目標函數(shù)其實是比較容易給定的求冷,就是所有帶衰減reward的累加期望
  • 構造一個損失函數(shù)如下:
  • 如何理解Policy Gradient的損失函數(shù):對于AlphaGo而言瘤运,f(s,a)就是最后的結(jié)果。也就是一盤棋中匠题,如果這盤棋贏了拯坟,那么這盤棋下的每一步都是認為是好的,如果輸了韭山,那么都認為是不好的郁季。好的f(s,a)就是1,不好的就-1钱磅。所以在這里梦裂,如果a被認為是好的,那么目標就是最大化這個好的動作的概率盖淡,反之亦然年柠。

10. 結(jié)合DQN和Policy Gradient的Actor Critic

  • 一句話總結(jié)AC:結(jié)合了 Policy Gradient (Actor) 和 Function Approximation (Critic) 的方法. Actor 基于概率選行為, Critic 基于 Actor 的行為評判行為的得分, Actor 根據(jù) Critic 的評分修改選行為的概率.
  • 優(yōu)勢: 可以進行單步更新, 比傳統(tǒng)的 Policy Gradient 要快(回合結(jié)束更新).
  • 劣勢: 取決于 Critic 的價值判斷, 但是 Critic 難收斂, 再加上 Actor 的更新, 就更難收斂. 為了解決收斂問題, Google Deepmind 提出了 Actor Critic 升級版 Deep Deterministic Policy Gradient. 后者融合了 DQN 的優(yōu)勢, 解決了收斂難的問題.
  • 簡單點說:Actor 在運用 Policy Gradient 的方法進行 Gradient ascent 的時候, 由 Critic 來告訴他, 這次的 Gradient ascent 是不是一次正確的 ascent, 如果這次的得分不好, 那么就不要 ascent 那么多.

11.DDPG(Deep Deterministic Policy Gradient)

  • 一句話總結(jié):Google DeepMind 提出的一種使用 Actor Critic 結(jié)構, 但是輸出的不是行為的概率, 而是具體的行為, 用于連續(xù)動作 (continuous action) 的預測. DDPG 結(jié)合了之前獲得成功的 DQN 結(jié)構(讓計算機學會玩游戲), 提高了 Actor Critic (讓 Policy gradient 單步更新)的穩(wěn)定性和收斂性.
  • 基于策略 Policy 的神經(jīng)網(wǎng)絡+基于價值 Value 的神經(jīng)網(wǎng)絡:
    a. Policy Gradient
    (1)估計網(wǎng)絡:輸出實時動作,供actor在顯示中實行褪迟,
    (2)現(xiàn)實網(wǎng)絡:用來實時更新價值網(wǎng)絡系統(tǒng)的(action+state)
    b. Value-Based
    (1)現(xiàn)實網(wǎng)絡:拿著動作實現(xiàn)網(wǎng)絡的(action+state)加以分析
    (2)估計網(wǎng)絡:拿著真實的actor動作作為輸入
  • 在實際運用中, DDPG 的這種做法的確帶來了更有效的學習過程.

12. A3C(Asynchronous Advantage Actor-Critic)

  • 背景:目前的計算機多半是有雙核, 4核, 甚至 6核, 8核. 一般的學習方法, 我們只能讓機器人在一個核上面玩耍. 但是如果使用 A3C 的方法, 我們可以給他們安排去不同的核, 并行運算. 實驗結(jié)果就是, 這樣的計算方式往往比傳統(tǒng)的方式快上好多倍.
  • 一句話概括A3C:Google DeepMind 提出的一種解決 Actor-Critic 不收斂問題的算法. 它會創(chuàng)建多個并行的環(huán)境, 讓多個擁有副結(jié)構的 agent 同時在這些并行環(huán)境上更新主結(jié)構中的參數(shù). 并行中的 agent 們互不干擾, 而主結(jié)構的參數(shù)更新受到副結(jié)構提交更新的不連續(xù)性干擾, 所以更新的相關性被降低, 收斂性提高.

9-12節(jié)來源:強化學習入門簡單實例 DQN

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗恨,一起剝皮案震驚了整個濱河市答憔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掀抹,老刑警劉巖虐拓,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傲武,居然都是意外死亡蓉驹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門谱轨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒幔,“玉大人,你說我怎么就攤上這事土童。” “怎么了工坊?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵献汗,是天一觀的道長。 經(jīng)常有香客問我王污,道長罢吃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任昭齐,我火速辦了婚禮尿招,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阱驾。我一直安慰自己就谜,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布里覆。 她就那樣靜靜地躺著丧荐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喧枷。 梳的紋絲不亂的頭發(fā)上虹统,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音隧甚,去河邊找鬼车荔。 笑死,一個胖子當著我的面吹牛戚扳,可吹牛的內(nèi)容都是我干的忧便。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼咖城,長吁一口氣:“原來是場噩夢啊……” “哼茬腿!你這毒婦竟也來了呼奢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤切平,失蹤者是張志新(化名)和其女友劉穎握础,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悴品,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡禀综,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苔严。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定枷。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖届氢,靈堂內(nèi)的尸體忽然破棺而出欠窒,到底是詐尸還是另有隱情,我是刑警寧澤退子,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布岖妄,位于F島的核電站,受9級特大地震影響寂祥,放射性物質(zhì)發(fā)生泄漏荐虐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一丸凭、第九天 我趴在偏房一處隱蔽的房頂上張望福扬。 院中可真熱鬧,春花似錦惜犀、人聲如沸铛碑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚茬。三九已至,卻和暖如春浓恳,著一層夾襖步出監(jiān)牢的瞬間刹缝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工颈将, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梢夯,地道東北人红省。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓狸涌,卻偏偏與公主長得像底瓣,于是被迫代替她去往敵國和親哮内。 傳聞我的和親對象是個殘疾皇子猫妙,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容