LoRA:大模型下游任務(wù)的低秩適應(yīng)

論文標題:LoRA: Low-Rank Adaptation of Large Language Models
論文鏈接:https://arxiv.org/abs/2106.09685
論文來源:NVIDIA

一、概述

自然語言處理中的一個重要范式是在通用域數(shù)據(jù)上進行大規(guī)模預(yù)訓(xùn)練道媚,然后在特定任務(wù)或域上適配本讥。然而隨著模型規(guī)模(比如GPT-3這樣規(guī)模模型的出現(xiàn))越來越大吞瞪,對大模型的全參數(shù)微調(diào)變得更加困難,這在存儲和部署上都非常具有挑戰(zhàn)性。

目前的一些研究試圖通過只微調(diào)一部分參數(shù)或為新任務(wù)學(xué)習(xí)外部模塊來緩解這個問題。這樣吮炕,我們只需要在進行每個任務(wù)時存儲和加載少量的任務(wù)特定參數(shù)以及預(yù)訓(xùn)練模型,大大提高了部署時的操作效率访得。然而龙亲,現(xiàn)有的技術(shù)也存在一些問題,比如其通過擴展模型深度(adapter等方法)增加了推理延遲(inference latency)悍抑,或者減少了模型可用的序列長度鳄炉。更重要的是,這些方法通常無法達到微調(diào)baseline的效果搜骡,需要在效率和模型性能之間進行權(quán)衡拂盯。

我們的方法Low-Rank Adaptation (LoRA)靈感來源于一些前人的研究,即過度參數(shù)化的神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練后會呈現(xiàn)低秩特性浆兰,也就是說過度參數(shù)化的模型擁有一個很小的內(nèi)在維度(low intrinsic dimension)磕仅。因此我們猜測珊豹,在模型微調(diào)適應(yīng)的過程中權(quán)重的變化也具有“低秩”特性簸呈,這啟發(fā)我們用低秩分解來表示權(quán)重的更新,而不是全參數(shù)訓(xùn)練店茶。LoRA允許我們通過優(yōu)化密集層(dense layer)在適應(yīng)過程中的秩分解矩陣(rank decomposition matrices)來間接訓(xùn)練神經(jīng)網(wǎng)絡(luò)中的一些密集層蜕便,這個過程中保持預(yù)訓(xùn)練的參數(shù)不變,如下所示贩幻。以GPT-3 175B為例轿腺,我們證明了設(shè)置一個非常低的秩(也就是把下圖中的r設(shè)置成是1或2這樣很小的值)就足夠用來微調(diào)两嘴,雖然GPT-3的滿秩高達12,288(也就是GPT-3的隱層維度),因此LoRA在存儲和計算上是非常高效的族壳。

LoRA

總體來說憔辫,LoRA有以下幾個關(guān)鍵的優(yōu)點:
①預(yù)訓(xùn)練模型在不同的下游任務(wù)上可以共享,我們可以為不同的任務(wù)構(gòu)建多個相應(yīng)的LoRA模塊仿荆。我們可以凍結(jié)預(yù)訓(xùn)練模型贰您,在切換任務(wù)時只需要替換上圖中的矩陣AB即可,這可以顯著降低存儲需求和任務(wù)切換的開銷拢操。
②當使用Adam等優(yōu)化器時锦亦,LoRA使訓(xùn)練更高效,其將模型硬件要求的門檻降低了3倍令境,這是因為我們不需要計算預(yù)訓(xùn)練模型的梯度杠园,也不需要維護其大多數(shù)參數(shù)的優(yōu)化器狀態(tài),只需要優(yōu)化插入的低秩矩陣的參數(shù)舔庶。
③低秩矩陣是線性的設(shè)計抛蚁,這允許我們在部署時可以將可訓(xùn)練低秩矩陣與凍結(jié)的預(yù)訓(xùn)練模型權(quán)重合并,這與全參數(shù)微調(diào)的模型相比惕橙,不會引入推理延遲篮绿。
④LoRA與許多先前的方法是正交的,可以與其中的許多方法組合吕漂,例如prefix-tuning亲配。

二妹窖、背景

在本文中澜躺,我們將Transformer模型的輸出維度記作d_{model},使用W_{q},W_{k},W_{v},W_{o}來表示多頭自注意力模塊中的query/key/value/output密集層參數(shù)矩陣匈挖,用W或者W_0來表示預(yù)訓(xùn)練的權(quán)重矩陣苍鲜,\Delta W表示適應(yīng)過程中梯度的累積更新思灰,LoRA模塊中的秩用r表示。

對于一些下游任務(wù)(如摘要混滔、機器閱讀理解洒疚、NL2SQL等),在進行模型的全參數(shù)微調(diào)時坯屿,模型會被預(yù)訓(xùn)練權(quán)重\Phi _{0}初始化油湖,然后按照梯度更新為\Phi _{0}+\Delta \Phi以最大化下游任務(wù)數(shù)據(jù)上的條件概率:

\underset{\Phi }{max}\sum _{(x,y)\in \mathcal{Z}}\sum_{t=1}^{|y|}log(P_{\Phi }(y_{t}|x,y_{< t}))

全參數(shù)微調(diào)在模型參數(shù)規(guī)模很大時在存儲和部署上成本很高。在本文中领跛,模型特定于任務(wù)的參數(shù)增量被使用更小規(guī)模的參數(shù)集\Theta來編碼乏德,也就是\Delta \Phi =\Delta \Phi (\Theta ),這里的|\Theta |\ll |\Phi _{0}|。尋找\Delta \Phi的過程也就變成了對\Theta的優(yōu)化:

\underset{\Theta }{max}\sum _{(x,y)\in \mathcal{Z}}\sum_{t=1}^{|y|}log(P_{\Phi _{0}+\Delta \Phi (\Theta )}(y_{t}|x,y_{< t}))

三喊括、方法

注意盡管在實驗中我們只關(guān)注Transformer語言模型中的某些權(quán)重胧瓜,但是LoRA適用于深度學(xué)習(xí)模型中的任何密集層。

  1. 低秩參數(shù)化的更新矩陣

一個神經(jīng)網(wǎng)絡(luò)包含許多執(zhí)行矩陣乘法的密集層郑什,這些層中的權(quán)重矩陣通常都是滿秩的府喳。當適應(yīng)特定任務(wù)時,早先研究表明預(yù)訓(xùn)練語言模型在隨機投影到較小的子空間后仍然可以高效地學(xué)習(xí)蘑拯,或者說它們具有較低的內(nèi)在維度或者內(nèi)在秩劫拢。受此啟發(fā),我們假設(shè)在微調(diào)適應(yīng)期間權(quán)重的更新也具有低的“內(nèi)在秩”强胰。對于一個預(yù)訓(xùn)練權(quán)重矩陣 W_0 \in \mathbb{R}^{d\times k}舱沧,微調(diào)時其權(quán)重更新為W_0 + \Delta W,我們通過將\Delta W表示為一個低秩分解來限制這個更新過程偶洋,即W_0 + \Delta W = W_0 + BA熟吏,其中B \in \mathbb{R}^{d\times r}A \in \mathbb{R}^{r\times k}玄窝,秩r \ll \min(d, k)牵寺。在訓(xùn)練過程中,W_0是凍結(jié)的恩脂,并不接收梯度更新帽氓,而AB包含可訓(xùn)練參數(shù)。注意W_0\Delta W = BA都與相同的輸入相乘俩块,并且它們各自的輸出向量按坐標求和黎休。對于h = W_0x,我們修改后的前向傳播為:

h = W_0x + \Delta W x = W_0x + BAx

前面的圖1中說明了這個重參數(shù)化過程玉凯。我們對A使用隨機高斯矩陣初始化势腮,對B使用零矩陣初始化,因此在訓(xùn)練開始時\Delta W = BA為零漫仆。然后我們通過\frac{\alpha}{r}縮放\Delta Wx捎拯,其中\alpha是一個常數(shù),也就變成了:

h = W_0x + \frac{\alpha}{r}\Delta W x = W_0x + \frac{\alpha}{r}BAx

當使用Adam優(yōu)化時盲厌,如果我們適當?shù)乜s放初始化署照,那么調(diào)整\alpha大致相當于調(diào)整學(xué)習(xí)率,這是因為反向傳播時對AB求導(dǎo)吗浩,以參數(shù)矩陣A為例參數(shù)更新過程變成了:

\theta=\theta - lr \times grad(\mathcal{L}(\frac{\alpha}{r}BA))=\theta - \frac{\alpha}{r} \times lr \times grad(\mathcal{L}(BA))

因此建芙,我們簡單地將\alpha設(shè)置為我們嘗試的第一個r,并不對其進行調(diào)優(yōu)拓萌。這種縮放有助于減少我們在變化r時需要重新調(diào)優(yōu)超參數(shù)的需求岁钓。

LoRA方法是全參數(shù)微調(diào)的泛化。微調(diào)的一種更普遍的形式是訓(xùn)練預(yù)訓(xùn)練參數(shù)的一個子集微王。LoRA進一步地不要求在適應(yīng)過程中權(quán)重矩陣的累積梯度更新具有滿秩屡限。這意味著當我們將LoRA應(yīng)用于所有權(quán)重矩陣并訓(xùn)練所有偏置時,通過設(shè)置LoRA秩r為預(yù)訓(xùn)練權(quán)重矩陣的秩炕倘,我們大致恢復(fù)了全參數(shù)微調(diào)的表達能力钧大。換句話說,隨著可訓(xùn)練參數(shù)的增加罩旋,LoRA的訓(xùn)練大致收斂到原始模型的訓(xùn)練啊央,而基于adapter的方法收斂到MLP,基于prefix的方法收斂到無法處理長輸入序列的模型涨醋。

LoRA不會引入額外推理延遲瓜饥。在生產(chǎn)環(huán)境中部署時,我們可以明確計算并存儲W = W_0 + BA浴骂,并像往常一樣執(zhí)行推理乓土。注意,W_0BA維度都是\mathbb{R}^{d\times k}溯警。當我們需要切換到另一個下游任務(wù)時趣苏,我們可以通過先減去BA恢復(fù)W_0然后添加不同的B'A',這是一個內(nèi)存開銷很小的快速操作梯轻。關(guān)鍵在于食磕,這可以保證與微調(diào)模型相比,我們在推理期間不會引入任何額外延遲喳挑,這是由結(jié)構(gòu)確定的彬伦。

  1. 將LoRA應(yīng)用于Transformer

原則上,我們可以將LoRA應(yīng)用于神經(jīng)網(wǎng)絡(luò)中的任何權(quán)重子集以減少可訓(xùn)練參數(shù)的數(shù)量伊诵。 在Transformer體系結(jié)構(gòu)中媚朦,自注意力模塊中有四個權(quán)重矩陣(W_q, W_k, W_v, W_o),MLP模塊中有兩個日戈。即使W_q(或W_k, W_v)的輸出維度通常被切片成注意力頭询张,我們也將視為單個d_{model} \times d_{model}矩陣。在本文實驗中我們限制僅對自注意力模塊中的權(quán)重應(yīng)用LoRA(實際上是只對W_qW_v使用)浙炼,凍結(jié)MLP模塊(也就是說它們在下游任務(wù)中不被訓(xùn)練)份氧。

LoRA方法 最重要的好處是內(nèi)存和存儲使用的減少。對于用Adam訓(xùn)練的大型Transformer弯屈,如果r \ll d_{model}蜗帜,由于我們不需要為大多數(shù)參數(shù)存儲優(yōu)化器狀態(tài),因此VRAM使用量減少了多達2/3资厉。 在GPT-3 175B上厅缺,我們將訓(xùn)練期間的VRAM消耗從1.2TB降低到350GB。 當設(shè)置r=4且僅適應(yīng)query和value參數(shù)矩陣時,檢查點大小約減少了10000倍(從350GB減少到35MB)湘捎。這允許我們用明顯更少的GPU進行訓(xùn)練诀豁,并避免I/O瓶頸。 由于我們不需要計算絕大多數(shù)參數(shù)的梯度窥妇,與全參數(shù)微調(diào)相比舷胜,在GPT-3 175B上訓(xùn)練時,我們還觀察到了25%的加速活翩。

LoRA也有其局限性烹骨。如果合并ABW中,會增加推理效率材泄,但是會減少不同人物模塊的靈活性沮焕。如果不合并,可以靈活地為不同任務(wù)動態(tài)選擇模塊拉宗,但推理效率可能會降低峦树。

四、實驗

本文在RoBERTa簿废、DeBERTa空入、GPT-2、GPT-3等模型上進行了實驗族檬,實驗結(jié)果如下:

實驗
實驗
實驗
實驗

五歪赢、理論分析

我們希望進一步解釋從下游任務(wù)中學(xué)習(xí)的低秩更新的屬性。注意单料,低秩結(jié)構(gòu)不僅降低了硬件需求的門檻埋凯,從而使我們能夠并行運行多個實驗,而且還使更新權(quán)重與預(yù)訓(xùn)練權(quán)重的相關(guān)性更具可解釋性扫尖。我們在GPT-3 175B上進行了一系列實證研究白对,以回答以下問題:
①在參數(shù)預(yù)算約束下,我們應(yīng)該適應(yīng)哪些預(yù)訓(xùn)練Transformer中的權(quán)重子集以最大化下游任務(wù)的性能换怖?
②“最優(yōu)”適應(yīng)矩陣\Delta W確實低秩嗎甩恼?如果是這樣,實踐中使用將秩設(shè)置成多少比較好沉颂?
\Delta WW有什么關(guān)系条摸?\Delta WW高度相關(guān)嗎?(數(shù)學(xué)上铸屉,\Delta W主要包含在W的頂部奇異值方向中嗎钉蒲?)此外,與W相對應(yīng)的方向中彻坛,\Delta W有多大?

我們相信顷啼,對問題②和③的回答可以闡明使用預(yù)訓(xùn)練語言模型進行下游任務(wù)的基本原理踏枣,這是自然語言處理中的一個關(guān)鍵主題。

  1. 我們應(yīng)該對Transformer中的哪些矩陣使用LoRA钙蒙?

給定有限的參數(shù)預(yù)算茵瀑,哪種類型的權(quán)重應(yīng)該被使用LoRA適應(yīng)以獲得下游任務(wù)的最佳性能效果?我們僅考慮自注意力模塊中的權(quán)重矩陣仪搔。我們在GPT-3 175B上設(shè)置參數(shù)預(yù)算為18M(如果以FP16存儲約需要35MB)瘾婿,這相當于r=8(如果我們適應(yīng)一種類型的注意力權(quán)重)或r=4(如果我們適應(yīng)兩種類型)蜻牢,對于所有96層都是這樣來設(shè)置烤咧。結(jié)果如下表所示。

實驗

注意抢呆,將所有參數(shù)都適應(yīng)在\Delta W_q\Delta W_k中會導(dǎo)致性能顯著降低煮嫌,而適應(yīng)W_qW_v兩者會產(chǎn)生最佳結(jié)果。這表明即使rank為4也可以在\Delta W中捕獲足夠的信息抱虐。與使用更大的rank適應(yīng)單個權(quán)重類型相比昌阿,適應(yīng)更多權(quán)重矩陣是更合適的。

  1. LoRA的最優(yōu)秩r是多少恳邀?
  • 最優(yōu)秩的設(shè)置

我們將注意力轉(zhuǎn)向rankr對模型性能的影響懦冰。我們適應(yīng)僅W_q\{W_q, W_v\}谣沸、\{W_q, W_k, W_v, W_c\}刷钢,并進行比較。實驗結(jié)果如下圖所示:

實驗

令我們驚訝的是乳附,在這些數(shù)據(jù)集上内地,僅適應(yīng)W_qW_v時,rank為1就足夠了赋除,而僅訓(xùn)練W_q需要更大的r阱缓。實驗結(jié)果表明增大r不會覆蓋更有意義的子空間,因此在使用LoRA時設(shè)置一個較小的r即可举农。

  • 不同rank之間子空間的相似度

給定A_{r=8}A_{r=64}荆针,它們分別是使用相同預(yù)訓(xùn)練模型學(xué)習(xí)得到的rank為8和64的適應(yīng)矩陣。我們對它們進行奇異值分解颁糟,得到右奇異矩陣U_{A_{r=8}}U_{A_{r=64}}航背。我們希望回答:當我們分別取U_{A_{r=8}}的前i個奇異向量和U_{A_{r=64}}的前j個奇異向量(其中1 \leq i \leq 81 \leq j \leq 64)生成的子空間時滚停,這兩個子空間有多大的重疊沃粗?我們用一種基于Grassmann距離的歸一化子空間相似度來衡量:

\phi(A_{r=8}, A_{r=64}, i, j) = \frac {||U_{A_{r=8}}^{iT} U_{A_{r=64}}^{j}||_{F}^{2}}{\min(i,j)} \in [0,1]

其中U_{A_{r=8}}^{i}表示U_{A_{r=8}}對應(yīng)于前i個奇異向量的多個列。

\phi(\cdot)的值域在[0,1]键畴,其中1表示子空間完全重疊最盅,0表示完全正交突雪。參見下圖中隨著ij的變化\phi的變化情況。由于篇幅所限涡贱,我們僅查看第48層(總共96層)咏删,但結(jié)論對其他層同樣成立。

實驗

從上圖中可以觀察到一個重要的結(jié)果:

A_{r=8}A_{r=64}的頂部奇異向量對應(yīng)的方向有很大的重疊问词,而其他的方向則不相容督函。具體來說,A_{r=8}A_{r=64}\Delta W_v(或者\Delta W_q)在維度為1時共享一個子空間激挪,其歸一化相似度在0.5以上辰狡。這可以解釋為什么在我們的之前的實驗中r=1的表現(xiàn)已經(jīng)相當不錯。

由于A_{r=8}A_{r=64}都是用同一個預(yù)訓(xùn)練模型學(xué)習(xí)得到的垄分,上圖3表明A_{r=8}A_{r=64}的靠前的奇異向量方向是最有用的宛篇,而其他方向可能大多包含了訓(xùn)練過程中累積的隨機噪聲。因此薄湿,適應(yīng)矩陣確實具有非常低的秩叫倍。

  • 不同隨機種子之間子空間的相似度

我們進一步通過繪制在r=64時兩個隨機種子(也就是初始化隨機高斯矩陣A時的隨機種子)的歸一化子空間相似度來確認這一點,結(jié)果如下圖所示豺瘤。與\Delta W_v相比吆倦,\Delta W_q似乎具有更高的“內(nèi)在秩”,因為兩次實驗中共享的奇異值方向更多坐求,這與我們在上表6中的觀察到的結(jié)果一致蚕泽。為了比較,我們還繪制了兩個隨機高斯矩陣的歸一化子空間相似度瞻赶,它們之間沒有共享任何奇異值方向赛糟。

實驗
  1. \Delta WW的關(guān)系如何?

我們進一步研究\Delta WW之間的關(guān)系。具體而言砸逊,\Delta W是否與W高度相關(guān)璧南?(數(shù)學(xué)上,\Delta W主要包含在W的頂部奇異值方向中嗎师逸?)此外司倚,與W相對應(yīng)的方向中,\Delta W有多大篓像?這可以闡明適應(yīng)預(yù)訓(xùn)練語言模型的基本機制。

為了回答這些問題,我們通過計算U^TWV^T丹皱,其中U/V\Delta W的左/右奇異向量矩陣讼油,將W投影到\Delta Wr維子空間上。然后瘦赫,我們比較\left \|U^TWV^T \right \|_{F}\left \|W\right \|_F的Frobenius范數(shù)伞芹。作為比較唱较,我們還通過將U,V替換為W或隨機矩陣的前r個奇異向量來計算\left \|U^TWV^T \right \|_{F}胸遇。實驗結(jié)果如下表所示。

實驗

我們從上表中得出幾個結(jié)論:
①首先逗威,與隨機矩陣相比,\Delta WW之間存在更強的相關(guān)性,表明\Delta W放大了W中已經(jīng)存在的某些特征。
②其次计螺,\Delta W并不是重復(fù)W中的靠前的奇異值方向呐萌,而是放大了W中沒有強調(diào)的方向。
③放大系數(shù)是相當大的:對于r=4,它是21.5\approx 6.91/0.32

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子切距,更是在濱河造成了極大的恐慌话肖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡弹囚,警方通過查閱死者的電腦和手機蛮穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門灸异,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵糠亩,是天一觀的道長廷没。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任亡鼠,我火速辦了婚禮榜揖,結(jié)果婚禮上钳幅,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布窗宇。 她就那樣靜靜地躺著侥加,像睡著了一般镰官。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孙援,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天窥摄,我揣著相機與錄音鸽凶,去河邊找鬼。 笑死掌桩,一個胖子當著我的面吹牛音半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笙纤,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼省容,長吁一口氣:“原來是場噩夢啊……” “哼抖拴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤阿宅,失蹤者是張志新(化名)和其女友劉穎候衍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洒放,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蛉鹿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了往湿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妖异。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖领追,靈堂內(nèi)的尸體忽然破棺而出他膳,到底是詐尸還是另有隱情,我是刑警寧澤绒窑,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布棕孙,位于F島的核電站,受9級特大地震影響回论,放射性物質(zhì)發(fā)生泄漏散罕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一傀蓉、第九天 我趴在偏房一處隱蔽的房頂上張望欧漱。 院中可真熱鬧,春花似錦葬燎、人聲如沸误甚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窑邦。三九已至,卻和暖如春壕探,著一層夾襖步出監(jiān)牢的瞬間冈钦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工李请, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞧筛,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓导盅,卻偏偏與公主長得像较幌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白翻,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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