大家好,在【深入淺出擴(kuò)散模型系列】中,我們將從原理到源碼,從基石DDPM到DALLE2,Imagen與Stable Diffusion,通過(guò)詳細(xì)的圖例和解說(shuō),和大家一起來(lái)了解擴(kuò)散模型的奧秘。同時(shí),也會(huì)穿插對(duì)經(jīng)典的GAN,VAE等模型的解讀,敬請(qǐng)期待~
本篇將和大家一起解讀擴(kuò)散模型的基石:DDPM(Denoising Diffusion Probalistic Models)。擴(kuò)散模型的研究并不始于DDPM,但DDPM的成功對(duì)擴(kuò)散模型的發(fā)展起到至關(guān)重要的作用。在這個(gè)系列里我們也會(huì)看到,后續(xù)一連串效果驚艷的模型,都是在DDPM的框架上迭代改進(jìn)而來(lái)。所以,我把DDPM放在這個(gè)系列的第一篇進(jìn)行講解。
初讀DDPM論文的朋友,可能有以下兩個(gè)痛點(diǎn):
論文花極大篇幅講數(shù)學(xué)推導(dǎo),可是我看不懂。
論文沒(méi)有給出模型架構(gòu)圖和詳細(xì)的訓(xùn)練解說(shuō),而這是我最關(guān)心的部分。
針對(duì)這些痛點(diǎn),DDPM系列將會(huì)出如下三篇文章:
DDPM(模型架構(gòu)篇):在閱讀源碼的基礎(chǔ)上,本篇繪制了詳細(xì)的DDPM模型架構(gòu)圖(DDPM UNet),同時(shí)附上關(guān)于模型運(yùn)作流程的詳細(xì)解說(shuō)。本篇不涉及數(shù)學(xué)知識(shí),直觀幫助大家了解DDPM怎么用,為什么好用。
DDPM(人人都能看懂的數(shù)學(xué)推理篇):也就是本篇文章,DDPM的數(shù)學(xué)推理可能是很多讀者頭疼的部分。我嘗試跳出原始論文的推導(dǎo)順序和思路,從更符合大家思維模式的角度入手,把整個(gè)推理流程串成一條完整的邏輯線。同樣,我也會(huì)配上大量的圖例,方便大家理解數(shù)學(xué)公式。如果你不擅長(zhǎng)數(shù)學(xué)推導(dǎo),這篇文章可以幫助你從直覺(jué)上了解DDPM的數(shù)學(xué)有效性;如果你更關(guān)注推導(dǎo)細(xì)節(jié),這篇文章中也有詳細(xì)的推導(dǎo)中間步驟。
DDPM(源碼解讀篇):在前兩篇的基礎(chǔ)上,我們將配合模型架構(gòu)圖,一起閱讀DDPM源碼,并實(shí)操跑一次,觀測(cè)訓(xùn)練過(guò)程里的中間結(jié)果。
【如果你粗掃一眼本文,看見(jiàn)大段的公式推導(dǎo),請(qǐng)不要放棄。出于嚴(yán)謹(jǐn)?shù)哪康模疚谋仨毩谐龉酵茖?dǎo)的細(xì)節(jié);但是,如果你只想把握整體邏輯,完全可以跳過(guò)推導(dǎo),只看結(jié)論和圖解,這并不會(huì)影響本文的閱讀。最后,看在這滿滿的手打公式和圖片解讀上,如果大家覺(jué)得本文有幫助,請(qǐng)多多點(diǎn)贊和在看!】
全文目錄如下:
一、DDPM在做一件什么事
在DDPM模型架構(gòu)篇中,我們已經(jīng)討論過(guò)DDPM的作用,以及它為何能成為擴(kuò)散模型/文生圖模型基石的原因。這里為了方便讀者更好了解上下文,我們將相關(guān)講解再放一次。
假設(shè)你想做一個(gè)以文生圖的模型,你的目的是給一段文字,再隨便給一張圖(比如一張?jiān)肼暎?,這個(gè)模型能幫你產(chǎn)出符合文字描述的逼真圖片,例如:
文字描述就像是一個(gè)指引(guidance),幫助模型去產(chǎn)生更符合語(yǔ)義信息的圖片。但是,畢竟語(yǔ)義學(xué)習(xí)是復(fù)雜的。我們能不能先退一步,先讓模型擁有產(chǎn)生逼真圖片的能力?
比如說(shuō),你給模型喂一堆cyberpunk風(fēng)格的圖片,讓模型學(xué)會(huì)cyberpunk風(fēng)格的分布信息,然后喂給模型一個(gè)隨機(jī)噪音,就能讓模型產(chǎn)生一張逼真的cyberpunk照片?;蛘呓o模型喂一堆人臉圖片,讓模型產(chǎn)生一張逼真的人臉。同樣,我們也能選擇給訓(xùn)練好的模型喂帶點(diǎn)信息的圖片,比如一張夾雜噪音的人臉,讓模型幫我們?nèi)ピ搿?/p>
具備了產(chǎn)出逼真圖片的能力,模型才可能在下一步中去學(xué)習(xí)語(yǔ)義信息(guidance),進(jìn)一步產(chǎn)生符合人類意圖的圖片。而DDPM的本質(zhì)作用,就是學(xué)習(xí)訓(xùn)練數(shù)據(jù)的分布,產(chǎn)出盡可能符合訓(xùn)練數(shù)據(jù)分布的真實(shí)圖片。所以,它也成為后續(xù)文生圖類擴(kuò)散模型框架的基石。
二、優(yōu)化目標(biāo)
現(xiàn)在,我們知道DDPM的目標(biāo)就是:使得生成的圖片盡可能符合訓(xùn)練數(shù)據(jù)分布?;谶@個(gè)目標(biāo),我們記:
:模型所產(chǎn)生的圖片的(概率)分布。其中表示模型參數(shù),以作為下標(biāo)的目的是表示這個(gè)分布是由模型決定的,
:訓(xùn)練數(shù)據(jù)(也可理解為真實(shí)世界)圖片的(概率)分布。下標(biāo)data表示這是一個(gè)自然世界客觀存在的分布,與模型無(wú)關(guān)。
則我們的優(yōu)化目標(biāo)可以用圖例表示為:
而求兩個(gè)分布之間的相似性,我們自然而然想到了KL散度。復(fù)習(xí)一下KL散度的定義——分布p與分布q之間的KL散度為:
則現(xiàn)在我們的目標(biāo)函數(shù)就變?yōu)椋何覀兝美檬剑?.1),對(duì)該目標(biāo)函數(shù)做一些變換
經(jīng)過(guò)這一番轉(zhuǎn)換,我們的優(yōu)化目標(biāo)從直覺(jué)上的“令模型輸出的分布逼近真實(shí)圖片分布”轉(zhuǎn)變?yōu)?",我們也可以把這個(gè)新的目標(biāo)函數(shù)通俗理解成“使得模型產(chǎn)生真實(shí)圖片的概率最大”。如果一上來(lái)就直接把式(1.2)作為優(yōu)化目標(biāo),可能會(huì)令很多朋友感到困惑。因此在這一步中,我們解釋了為什么要用式(1.2)作為優(yōu)化目標(biāo)。
接下來(lái),我們近一步來(lái)看,對(duì)式(1.2)還能做什么樣的轉(zhuǎn)換和拆解。
三、最大化ELBO(Evidence Lower Bound)
的本質(zhì)就是要使得連乘中的每一項(xiàng)最大,也等同于使得最大。所以我們進(jìn)一步來(lái)拆解。在開(kāi)始拆解之前,讓我們先回顧一下擴(kuò)散模型的加噪與去噪過(guò)程,幫助我們更好地做數(shù)學(xué)推理。
在Diffusion Process中,我們不過(guò)模型,而是按照設(shè)置好的加噪規(guī)則,隨著time_step的變化,給圖片添加噪聲()。在Denoise Process中,我們則需要經(jīng)過(guò)模型,對(duì)圖片進(jìn)行去噪,逐步將圖片還原成原始的樣子()。Diffusion過(guò)程中遵循的分布,我們記為,Denoise過(guò)程中遵循的分布,我們記為。嚴(yán)格來(lái)說(shuō),Diffusion過(guò)程遵循的分布應(yīng)該記為,下標(biāo)也表示模型參數(shù),也就是說(shuō),“規(guī)則”也算一種“模型”。理論上,你想對(duì)Diffusion單獨(dú)訓(xùn)練一套模型,也是沒(méi)有問(wèn)題的。為了表述嚴(yán)謹(jǐn),我們接下來(lái)都將用進(jìn)行表示。
現(xiàn)在我們可以回到拆解了,即然x和z與Diffusion和Denoise的過(guò)程密切相關(guān),那么我們的目標(biāo)就是要把拆解成用同時(shí)表達(dá)的形式:
就被稱為Evidence Lower Bound(ELBO)。到這一步為止,我們將最大化拆解成最大化ELBO,其中與diffusion過(guò)程密切相關(guān),與denoise過(guò)程密切相關(guān)。
(2.1)這個(gè)公式一出,大家是不是很眼熟?沒(méi)錯(cuò),它其實(shí)也刻畫(huà)了VAE的優(yōu)化目標(biāo),所以這里我們才選用z而不是x來(lái)表示latent space中的變量。有些讀者可能已經(jīng)發(fā)現(xiàn)了,(2.1)描述的是一個(gè)time_step下的優(yōu)化目標(biāo),但是我們的擴(kuò)散模型,是有T個(gè)time_step的,因此,我們還需要把(2.1)再進(jìn)一步擴(kuò)展成鏈?zhǔn)奖磉_(dá)的方式。在這一步擴(kuò)展里,我們將不再使用z變量,取而代之的是用來(lái)表示,更符合我們對(duì)擴(kuò)散模型的整體理解,則我們有:
其中,表示從真實(shí)世界中篩選出來(lái)的干凈的圖片,表示最后一個(gè)time_step加噪后的圖片,通常是一個(gè)近似純?cè)肼?。?xì)心的讀者可能發(fā)現(xiàn),在(2.2)公式中,左邊的是不是寫(xiě)成更合理呀?沒(méi)錯(cuò),因?yàn)閿U(kuò)散模型的目標(biāo)就是去還原來(lái)自真實(shí)世界的。但這里為了前后表達(dá)統(tǒng)一,就不做修改了。讀者們只要理解(2.2)的含義即可。
四、進(jìn)一步拆解ELBO
復(fù)習(xí)一下,到這一步為止,我們經(jīng)歷了如下過(guò)程:
首先,總體優(yōu)化目標(biāo)是讓模型產(chǎn)生的圖片分布和真實(shí)圖片分布盡量相似,也就是
對(duì)KL散度做拆解,將優(yōu)化目標(biāo)轉(zhuǎn)變?yōu)?,同時(shí)也等價(jià)于讓連乘項(xiàng)中的每一項(xiàng)最大
對(duì)做拆解,以優(yōu)化DDPM其中一個(gè)time_step為例,將優(yōu)化目標(biāo)轉(zhuǎn)向最大化下界(ELBO)
以全部time_step為例,將優(yōu)化目標(biāo)轉(zhuǎn)變?yōu)?,也就是式?.2)
恭喜你充滿耐心地看到這一步了!接下來(lái),我們還需要再耐心對(duì)式(2.2)進(jìn)行拆解,畢竟現(xiàn)在它只是一個(gè)偏抽象的形式,因此我們還需對(duì)p與q再做具象化處理。之前我們提過(guò),下標(biāo)的意思是強(qiáng)調(diào)從理論上來(lái)說(shuō),diffusion過(guò)程可以通過(guò)訓(xùn)練一個(gè)模型來(lái)加噪,而并非只能通過(guò)規(guī)則加噪。這兩種方法在數(shù)學(xué)上都是成立的。由于DDPM采用了后者,因此在接下來(lái)的過(guò)程中,我們將會(huì)去掉下標(biāo)。
式(2.2)的進(jìn)一步拆解如下:
(48):分子上,因?yàn)橐咽莻€(gè)近似高斯分布的純?cè)肼暎虼怂姆植紁是已知的,和模型無(wú)關(guān),所以將單獨(dú)提煉出。分子與分母的其余項(xiàng)則是因?yàn)閿U(kuò)散模型遵循馬爾可夫鏈性質(zhì),因此可以通過(guò)鏈?zhǔn)竭B乘規(guī)則進(jìn)行改寫(xiě)
(50):表示來(lái)自真實(shí)世界的干凈圖片,它是diffusion過(guò)程的起源,任意都可由推導(dǎo)而來(lái),因此可將改寫(xiě)成
(52):根據(jù)多變量條件概率的貝葉斯鏈?zhǔn)椒▌t進(jìn)行改寫(xiě),即:
當(dāng)然多變量條件概率的改寫(xiě)方式有很多種,根據(jù)需要我們選擇了上面的這一種
(54):由于q是既定的,可以看作是一個(gè)常量,因此可增加一項(xiàng)
(56)~(57):根據(jù)期望項(xiàng)中涉及到的具體元素,調(diào)整期望E的下標(biāo)
(58):根據(jù)KL散度的定義重寫(xiě)最后兩項(xiàng)。其中prior matching term可看作是常量,reconstruction term和denoising matching term則是和模型密切相關(guān)的兩項(xiàng)。由于兩者間十分相似,因此接下來(lái)我們只需要特別關(guān)注denoising matching term如何拆解即可。
五、重參數(shù)與噪聲預(yù)測(cè)
現(xiàn)在,我們的優(yōu)化目標(biāo)轉(zhuǎn)為最大化,我們繼續(xù)對(duì)該項(xiàng)進(jìn)行拆解。
首先我們來(lái)看一項(xiàng)。
根據(jù)多變量條件概率的鏈?zhǔn)椒▌t,我們有:
現(xiàn)在,我們分別來(lái)看,,具體長(zhǎng)什么樣子。
5.1 重參數(shù)
5.1.1 為什么需要重參數(shù)
回顧模型架構(gòu)篇,我們?cè)?jīng)提過(guò),最樸素的diffusion加噪規(guī)則是,在每一個(gè)time_step中都sample一次隨機(jī)噪聲,使得:
在架構(gòu)篇中,我們直接指出,即篩選的噪聲是來(lái)自一個(gè)標(biāo)準(zhǔn)高斯分布。但是為什么要這么設(shè)計(jì)呢?
我們假設(shè)真實(shí)世界的圖片服從這樣的高斯分布,而現(xiàn)在我們的模型就是要去學(xué)習(xí)這個(gè)分布,更具象點(diǎn),假設(shè)模型遵從的分布是,我們的目的就是讓逼近,逼近。
那么在diffusion過(guò)程中,更符合直覺(jué)的做法是,模型從采樣出一個(gè)噪聲,然后在denoise的過(guò)程中去預(yù)測(cè)這個(gè)噪聲,這樣就能把梯度傳遞到上,使得模型在預(yù)測(cè)噪聲的過(guò)程中習(xí)得真實(shí)圖片的分布。
但這樣做產(chǎn)生的問(wèn)題是,實(shí)際上梯度并不能傳遞到上。舉個(gè)簡(jiǎn)單的例子,假設(shè)你從隨機(jī)采樣出了一個(gè)3,你怎么將這個(gè)隨機(jī)的采樣結(jié)果和聯(lián)系起來(lái)呢?也就是說(shuō),在diffusion過(guò)程中,如果我們從一個(gè)帶參數(shù)的分布中做數(shù)據(jù)采樣,在denoise過(guò)程中,我們無(wú)法將梯度傳遞到這個(gè)參數(shù)上。
針對(duì)這個(gè)問(wèn)題,有一個(gè)簡(jiǎn)單的解決辦法:我從一個(gè)確定的分布(不帶參數(shù))中做數(shù)據(jù)采樣,不就行了嗎?比如,我從先采樣出一個(gè),然后再令最終的采樣結(jié)果z為:。這樣我不就能知道z和間的關(guān)系了?同時(shí)根據(jù)高斯分布性質(zhì),z也服從分布。
以上“從一個(gè)帶參數(shù)的分布中進(jìn)行采樣”轉(zhuǎn)變到“從一個(gè)確定的分布中進(jìn)行采樣”,以解決梯度無(wú)法傳遞問(wèn)題的方法,就被稱為“重參數(shù)”(reparamterization)。關(guān)于重參數(shù)原理的更多細(xì)節(jié),推薦大家閱讀這篇文章(https://spaces.ac.cn/archives/6705)
5.1.2 重參數(shù)的具體方法
到這一步根據(jù)重參數(shù)的思想,我們可以把轉(zhuǎn)變?yōu)榱?。但是現(xiàn)在的diffusion過(guò)程還是太繁瑣:每一個(gè)time_step都要做一次采樣,等我后續(xù)做denoise過(guò)程去預(yù)測(cè)噪聲,傳播梯度的時(shí)候,參數(shù)不僅在這個(gè)time_step有,在之前的一系列time_steps中都有,這不是給我計(jì)算梯度造成困擾了嗎?注意到在diffusion過(guò)程中,隨著time_step的增加,圖片中含有的噪聲是越來(lái)越多的,那我能不能設(shè)定一個(gè)函數(shù),使得每個(gè)time_step的圖片都能由原始圖片加噪推導(dǎo)而來(lái),然后使得噪聲的比例隨著time_step增加而變大?這樣我不就只需要一次采樣了嗎?
當(dāng)然沒(méi)有問(wèn)題,DDPM采用的做法是:
(1)首先,設(shè)置超參數(shù),滿足隨著t增大,逐漸變大。
(2)令:
易推出隨著t增大而逐漸變小
(3)則任意時(shí)刻的都可以由表示出:
我們通過(guò)圖例來(lái)更好理解上面的三步驟:
詳細(xì)的過(guò)程都在圖例中表示出了,這里不做贅述。
5.2 噪聲預(yù)測(cè)
講完了重參數(shù)的部分,我們繼續(xù)回到剛才拆解的步驟上來(lái),復(fù)習(xí)一下,我們已經(jīng)將ELBO拆解成,現(xiàn)在我們的關(guān)注點(diǎn)在q分布上,而q分布又由以下三項(xiàng)組成:
,我們繼續(xù)來(lái)看這三項(xiàng)要怎么具體表示出來(lái)。
由章節(jié)5.1.2,我們知道:
則任意的關(guān)系都可以由此推出:
(友情提示:大家記得看5.1.2中的圖例區(qū)分哦,不是typo)。
同時(shí),我們已經(jīng)知道(假設(shè))都服從高斯分布,則根據(jù)高斯分布的性質(zhì),我們有:
對(duì)于高斯分布,知道了均值和方差,我們就可以把它具體的概率密度函數(shù)寫(xiě)出來(lái):
經(jīng)過(guò)這樣的一頓爆肝推導(dǎo),我們終于將的分布寫(xiě)出來(lái)了(84)。也就是我們當(dāng)前優(yōu)化目標(biāo)中的q部分。
現(xiàn)在,我們來(lái)看部分,根據(jù)優(yōu)化目標(biāo),此時(shí)我們需要讓p和q的分布盡量接近:
而讓p和q的分布接近,等價(jià)與讓。注意到其實(shí)是一個(gè)常量,它只和超參有關(guān)。在DDPM中,為了簡(jiǎn)化優(yōu)化過(guò)程,并且使訓(xùn)練更穩(wěn)定,就假設(shè)也按此種方式固定下來(lái)了。在后續(xù)的擴(kuò)散模型(例如GLIDE)中,則引入對(duì)方差的預(yù)測(cè)。在DDPM中,只預(yù)測(cè)均值。
好,那么預(yù)測(cè)均值,到底是在預(yù)測(cè)什么東西呢?我們對(duì)再做改寫(xiě),主要是根據(jù)我們?cè)O(shè)置的diffusion規(guī)則,將用進(jìn)行表示:
觀察到,式(5.1)的結(jié)果在diffusion過(guò)程中就已決定好。所以現(xiàn)在對(duì)于,我只要讓它在denoise的過(guò)程里,預(yù)測(cè)出,使得,然后令:
這樣,我不就能使得和的分布一致了嗎!
此刻!是不是一道光在你的腦海里閃過(guò)!一切都串起來(lái)了,也就是說(shuō),只要在denoise的過(guò)程中,讓模型去預(yù)測(cè)噪聲,就可以達(dá)到讓“模型產(chǎn)生圖片的分布”和“真實(shí)世界的圖片分布”逼近的目的!
5.3 再次理解training和sampling
現(xiàn)在,我們?cè)賮?lái)回顧training和sampling的過(guò)程,在training的過(guò)程中,我們只需要去預(yù)測(cè)噪聲,就能在數(shù)學(xué)上使得模型學(xué)到的分布和真實(shí)的圖片分布不斷逼近。而當(dāng)我們使用模型做sampling,即去測(cè)試模型能生成什么質(zhì)量的圖片時(shí),我們即可由式(5.1)中的推導(dǎo)結(jié)論,從推導(dǎo),直至還原出。注意到這里,其中是我們式(5.1)中要逼近的均值真值;,則正是我們已經(jīng)固定住的方差。
關(guān)于training和sampling更詳細(xì)的實(shí)操解說(shuō),可以參見(jiàn)模型架構(gòu)篇。
六、總結(jié)(必看)
恭喜你堅(jiān)持看到了這里!我們來(lái)把整個(gè)推導(dǎo)串成完整的邏輯鏈:
(1)首先,DDPM總體優(yōu)化目標(biāo)是讓模型產(chǎn)生的圖片分布和真實(shí)圖片分布盡量相似,也就是。同時(shí),我們假設(shè)真實(shí)世界的圖片符合高斯分布:。因此我們的目標(biāo)就是要讓習(xí)得
(2)但是這兩個(gè)客觀存在的真值是未知的,因此我們必須對(duì)KL散度進(jìn)行不斷拆解,直至能用確定的形式將它表示出來(lái)。
(3)對(duì)KL散度做初步拆解,將優(yōu)化目標(biāo)轉(zhuǎn)變?yōu)?,同時(shí)也等價(jià)于讓連乘項(xiàng)中的每一項(xiàng)最大
(4)繼續(xù)對(duì)做拆解,以優(yōu)化DDPM其中一個(gè)time_step為例,將優(yōu)化目標(biāo)轉(zhuǎn)向最大化下界(ELBO)
(5)依照馬爾可夫性質(zhì),從1個(gè)time_step推至所有的time_steps,將(4)中的優(yōu)化目標(biāo)改寫(xiě)為,也就是式(2.2)
(6)對(duì)式(2.2)繼續(xù)做拆解,將優(yōu)化目標(biāo)變?yōu)?/p>
(7)先來(lái)看(6)中的一項(xiàng),注意到這和diffusion的過(guò)程密切相關(guān)。在diffusion的過(guò)程中,通過(guò)重參數(shù)的方法進(jìn)行加噪,再經(jīng)過(guò)一頓爆肝推導(dǎo),得出,易看出該分布中方差是只和我們?cè)O(shè)置的超參數(shù)相關(guān)的常量。
(8)再來(lái)看(6)中的一項(xiàng),下標(biāo)說(shuō)明了該項(xiàng)和模型相關(guān)。為了讓p和q的分布接近,我們需要讓p去學(xué)習(xí)q的均值和方差。由于方差是一個(gè)常量,在DDPM中,假設(shè)它是固定的,不再單獨(dú)去學(xué)習(xí)它(后續(xù)的擴(kuò)散模型,例如GLIDE則同時(shí)對(duì)方差也做了預(yù)測(cè))。因此現(xiàn)在只需要學(xué)習(xí)q的均值。經(jīng)過(guò)一頓變式,可以把q的均值改寫(xiě)成。因此,這里只要讓模型去預(yù)測(cè)噪聲,使得,就能達(dá)到達(dá)到(1)中的目的!
七、參考
在學(xué)習(xí)DDPM的過(guò)程中,我也看了很多參考資料,但發(fā)現(xiàn)很難將整個(gè)推導(dǎo)過(guò)程串成一條符合思維慣性的邏輯鏈,因此對(duì)很多細(xì)節(jié)也是一知半解。直到我看到李宏毅老師對(duì)擴(kuò)散模型原理的講解(從分布相似性入手),以及閱讀了google的一篇關(guān)于擴(kuò)散模型數(shù)學(xué)推理的綜述,才恍然大悟。自己動(dòng)手推導(dǎo)后,從更符合我慣性思維的角度入手,寫(xiě)了這篇文章。因此,我也把我認(rèn)為非常有幫助的參考資料列在下面,大家可以補(bǔ)充閱讀。
-
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29216 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62631 -
模型
+關(guān)注
關(guān)注
1文章
3244瀏覽量
48848
原文標(biāo)題:深入淺出擴(kuò)散模型(Diffusion Model)系列:基石DDPM(人人都能看懂的數(shù)學(xué)原理篇)
文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論