日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AutoEncoder、RBM、DBM、DBN

發(fā)布時(shí)間:2025/3/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AutoEncoder、RBM、DBM、DBN 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AutoEncoder自動(dòng)編碼器

??????? Deep Learning最簡(jiǎn)單的一種方法是利用人工神經(jīng)網(wǎng)絡(luò)的特點(diǎn),人工神經(jīng)網(wǎng)絡(luò)(ANN)本身就是具有層次結(jié)構(gòu)的系統(tǒng),如果給定一個(gè)神經(jīng)網(wǎng)絡(luò),我們假設(shè)其輸出與輸入是相同的,然后訓(xùn)練調(diào)整其參數(shù),得到每一層中的權(quán)重。自然地,我們就得到了輸入I的幾種不同表示(每一層代表一種表示),這些表示就是特征。自動(dòng)編碼器就是一種盡可能復(fù)現(xiàn)輸入信號(hào)的神經(jīng)網(wǎng)絡(luò)。為了實(shí)現(xiàn)這種復(fù)現(xiàn),自動(dòng)編碼器就必須捕捉可以代表輸入數(shù)據(jù)的最重要的因素,就像PCA那樣,找到可以代表原信息的主要成分。

?????? 具體過程簡(jiǎn)單的說明如下:

1)給定無標(biāo)簽數(shù)據(jù),用非監(jiān)督學(xué)習(xí)學(xué)習(xí)特征:

?

?????? 在我們之前的神經(jīng)網(wǎng)絡(luò)中,如第一個(gè)圖,我們輸入的樣本是有標(biāo)簽的,即(input, target),這樣我們根據(jù)當(dāng)前輸出和target(label)之間的差去改變前面各層的參數(shù),直到收斂。但現(xiàn)在我們只有無標(biāo)簽數(shù)據(jù),也就是右邊的圖。那么這個(gè)誤差怎么得到呢?

????????如上圖,我們將input輸入一個(gè)encoder編碼器,就會(huì)得到一個(gè)code,這個(gè)code也就是輸入的一個(gè)表示,那么我們?cè)趺粗肋@個(gè)code表示的就是input呢?我們加一個(gè)decoder解碼器,這時(shí)候decoder就會(huì)輸出一個(gè)信息,那么如果輸出的這個(gè)信息和一開始的輸入信號(hào)input是很像的(理想情況下就是一樣的),那很明顯,我們就有理由相信這個(gè)code是靠譜的。所以,我們就通過調(diào)整encoder和decoder的參數(shù),使得重構(gòu)誤差最小,這時(shí)候我們就得到了輸入input信號(hào)的第一個(gè)表示了,也就是編碼code了。因?yàn)槭菬o標(biāo)簽數(shù)據(jù),所以誤差的來源就是直接重構(gòu)后與原輸入相比得到。

2)通過編碼器產(chǎn)生特征,然后訓(xùn)練下一層。這樣逐層訓(xùn)練:

?????? 那上面我們就得到第一層的code,我們的重構(gòu)誤差最小讓我們相信這個(gè)code就是原輸入信號(hào)的良好表達(dá)了,或者牽強(qiáng)點(diǎn)說,它和原信號(hào)是一模一樣的(表達(dá)不一樣,反映的是一個(gè)東西)。那第二層和第一層的訓(xùn)練方式就沒有差別了,我們將第一層輸出的code當(dāng)成第二層的輸入信號(hào),同樣最小化重構(gòu)誤差,就會(huì)得到第二層的參數(shù),并且得到第二層輸入的code,也就是原輸入信息的第二個(gè)表達(dá)了。其他層就同樣的方法炮制就行了(訓(xùn)練這一層,前面層的參數(shù)都是固定的,并且他們的decoder已經(jīng)沒用了,都不需要了)。

3)有監(jiān)督微調(diào):

????? 經(jīng)過上面的方法,我們就可以得到很多層了。至于需要多少層(或者深度需要多少,這個(gè)目前本身就沒有一個(gè)科學(xué)的評(píng)價(jià)方法)需要自己試驗(yàn)調(diào)了。每一層都會(huì)得到原始輸入的不同的表達(dá)。當(dāng)然了,我們覺得它是越抽象越好了,就像人的視覺系統(tǒng)一樣。

?????? 到這里,這個(gè)AutoEncoder還不能用來分類數(shù)據(jù),因?yàn)樗€沒有學(xué)習(xí)如何去連結(jié)一個(gè)輸入和一個(gè)類。它只是學(xué)會(huì)了如何去重構(gòu)或者復(fù)現(xiàn)它的輸入而已?;蛘哒f,它只是學(xué)習(xí)獲得了一個(gè)可以良好代表輸入的特征,這個(gè)特征可以最大程度上代表原輸入信號(hào)。那么,為了實(shí)現(xiàn)分類,我們就可以在AutoEncoder的最頂?shù)木幋a層添加一個(gè)分類器(例如羅杰斯特回歸、SVM等),然后通過標(biāo)準(zhǔn)的多層神經(jīng)網(wǎng)絡(luò)的監(jiān)督訓(xùn)練方法(梯度下降法)去訓(xùn)練。

??????? 也就是說,這時(shí)候,我們需要將最后層的特征code輸入到最后的分類器,通過有標(biāo)簽樣本,通過監(jiān)督學(xué)習(xí)進(jìn)行微調(diào),這也分兩種,一個(gè)是只調(diào)整分類器(黑色部分):

?????? 另一種:通過有標(biāo)簽樣本,微調(diào)整個(gè)系統(tǒng):(如果有足夠多的數(shù)據(jù),這個(gè)是最好的。end-to-end learning端對(duì)端學(xué)習(xí))

?????? 一旦監(jiān)督訓(xùn)練完成,這個(gè)網(wǎng)絡(luò)就可以用來分類了。神經(jīng)網(wǎng)絡(luò)的最頂層可以作為一個(gè)線性分類器,然后我們可以用一個(gè)更好性能的分類器去取代它。

?????? 在研究中可以發(fā)現(xiàn),如果在原有的特征中加入這些自動(dòng)學(xué)習(xí)得到的特征可以大大提高精確度,甚至在分類問題中比目前最好的分類算法效果還要好!

??????? AutoEncoder存在一些變體,這里簡(jiǎn)要介紹下兩個(gè):

Sparse AutoEncoder稀疏自動(dòng)編碼器:

????? 當(dāng)然,我們還可以繼續(xù)加上一些約束條件得到新的Deep Learning方法,如:如果在AutoEncoder的基礎(chǔ)上加上L1的Regularity限制(L1主要是約束每一層中的節(jié)點(diǎn)中大部分都要為0,只有少數(shù)不為0,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法。

?????? 如上圖,其實(shí)就是限制每次得到的表達(dá)code盡量稀疏。因?yàn)橄∈璧谋磉_(dá)往往比其他的表達(dá)要有效(人腦好像也是這樣的,某個(gè)輸入只是刺激某些神經(jīng)元,其他的大部分的神經(jīng)元是受到抑制的)。

Denoising AutoEncoders降噪自動(dòng)編碼器:

????????降噪自動(dòng)編碼器DA是在自動(dòng)編碼器的基礎(chǔ)上,訓(xùn)練數(shù)據(jù)加入噪聲,所以自動(dòng)編碼器必須學(xué)習(xí)去去除這種噪聲而獲得真正的沒有被噪聲污染過的輸入。因此,這就迫使編碼器去學(xué)習(xí)輸入信號(hào)的更加魯棒的表達(dá),這也是它的泛化能力比一般編碼器強(qiáng)的原因。DA可以通過梯度下降算法去訓(xùn)練。

?

Sparse Coding稀疏編碼

?????? 如果我們把輸出必須和輸入相等的限制放松,同時(shí)利用線性代數(shù)中基的概念,即O = a11?+ a22+….+ ann, Φi是基,ai是系數(shù),我們可以得到這樣一個(gè)優(yōu)化問題:

Min |I – O|,其中I表示輸入,O表示輸出。

???????通過求解這個(gè)最優(yōu)化式子,我們可以求得系數(shù)ai和基Φi,這些系數(shù)和基就是輸入的另外一種近似表達(dá)。

???????因此,它們可以用來表達(dá)輸入I,這個(gè)過程也是自動(dòng)學(xué)習(xí)得到的。如果我們?cè)谏鲜鍪阶由霞由螸1的Regularity限制,得到:

Min |I – O| + u*(|a1| + |a2| + … + |an?|)

??????? 這種方法被稱為Sparse Coding。通俗的說,就是將一個(gè)信號(hào)表示為一組基的線性組合,而且要求只需要較少的幾個(gè)基就可以將信號(hào)表示出來?!跋∈栊浴倍x為:只有很少的幾個(gè)非零元素或只有很少的幾個(gè)遠(yuǎn)大于零的元素。要求系數(shù) ai?是稀疏的意思就是說:對(duì)于一組輸入向量,我們只想有盡可能少的幾個(gè)系數(shù)遠(yuǎn)大于零。選擇使用具有稀疏性的分量來表示我們的輸入數(shù)據(jù)是有原因的,因?yàn)榻^大多數(shù)的感官數(shù)據(jù),比如自然圖像,可以被表示成少量基本元素的疊加,在圖像中這些基本元素可以是面或者線。同時(shí),比如與初級(jí)視覺皮層的類比過程也因此得到了提升(人腦有大量的神經(jīng)元,但對(duì)于某些圖像或者邊緣只有很少的神經(jīng)元興奮,其他都處于抑制狀態(tài))。

???????? 稀疏編碼算法是一種無監(jiān)督學(xué)習(xí)方法,它用來尋找一組“超完備”基向量來更高效地表示樣本數(shù)據(jù)。雖然形如主成分分析技術(shù)(PCA)能使我們方便地找到一組“完備”基向量,但是這里我們想要做的是找到一組“超完備”基向量來表示輸入向量(也就是說,基向量的個(gè)數(shù)比輸入向量的維數(shù)要大)。超完備基的好處是它們能更有效地找出隱含在輸入數(shù)據(jù)內(nèi)部的結(jié)構(gòu)與模式。然而,對(duì)于超完備基來說,系數(shù)ai不再由輸入向量唯一確定。因此,在稀疏編碼算法中,我們另加了一個(gè)評(píng)判標(biāo)準(zhǔn)“稀疏性”來解決因超完備而導(dǎo)致的退化(degeneracy)問題。(詳細(xì)過程請(qǐng)參考:UFLDL Tutorial稀疏編碼

???????比如在圖像的Feature Extraction的最底層要做Edge Detector的生成,那么這里的工作就是從Natural Images中randomly選取一些小patch,通過這些patch生成能夠描述他們的“基”,也就是右邊的8*8=64個(gè)basis組成的basis,然后給定一個(gè)test patch, 我們可以按照上面的式子通過basis的線性組合得到,而sparse matrix就是a,下圖中的a中有64個(gè)維度,其中非零項(xiàng)只有3個(gè),故稱“sparse”。

???????這里可能大家會(huì)有疑問,為什么把底層作為Edge Detector呢?上層又是什么呢?這里做個(gè)簡(jiǎn)單解釋大家就會(huì)明白,之所以是Edge Detector是因?yàn)椴煌较虻腅dge就能夠描述出整幅圖像,所以不同方向的Edge自然就是圖像的basis了……而上一層的basis組合的結(jié)果,上上層又是上一層的組合basis……(就是上面第四部分的時(shí)候咱們說的那樣)

???????Sparse coding分為兩個(gè)部分:

1)Training階段:給定一系列的樣本圖片[x1, x 2, …],我們需要學(xué)習(xí)得到一組基[Φ1, Φ2, …],也就是字典。

?????? 稀疏編碼是k-means算法的變體,其訓(xùn)練過程也差不多(EM算法的思想:如果要優(yōu)化的目標(biāo)函數(shù)包含兩個(gè)變量,如L(W, B),那么我們可以先固定W,調(diào)整B使得L最小,然后再固定B,調(diào)整W使L最小,這樣迭代交替,不斷將L推向最小值。EM算法可以見我的博客:“從最大似然到EM算法淺解”)。

?????? 訓(xùn)練過程就是一個(gè)重復(fù)迭代的過程,按上面所說,我們交替的更改a和Φ使得下面這個(gè)目標(biāo)函數(shù)最小。

??????每次迭代分兩步:

a)固定字典Φ[k],然后調(diào)整a[k],使得上式,即目標(biāo)函數(shù)最小(即解LASSO問題)。

b)然后固定住a [k],調(diào)整Φ [k],使得上式,即目標(biāo)函數(shù)最小(即解凸QP問題)。

????? 不斷迭代,直至收斂。這樣就可以得到一組可以良好表示這一系列x的基,也就是字典。

2)Coding階段:給定一個(gè)新的圖片x,由上面得到的字典,通過解一個(gè)LASSO問題得到稀疏向量a。這個(gè)稀疏向量就是這個(gè)輸入向量x的一個(gè)稀疏表達(dá)了。

例如:


Restricted Boltzmann Machine (RBM)限制波爾茲曼機(jī)

? ? ? ?假設(shè)有一個(gè)二部圖,每一層的節(jié)點(diǎn)之間沒有鏈接,一層是可視層,即輸入數(shù)據(jù)層(v),一層是隱藏層(h),如果假設(shè)所有的節(jié)點(diǎn)都是隨機(jī)二值變量節(jié)點(diǎn)(只能取0或者1值),同時(shí)假設(shè)全概率分布p(v,h)滿足Boltzmann 分布,我們稱這個(gè)模型是Restricted BoltzmannMachine (RBM)。

? ? ? ?下面我們來看看為什么它是Deep Learning方法。首先,這個(gè)模型因?yàn)槭嵌繄D,所以在已知v的情況下,所有的隱藏節(jié)點(diǎn)之間是條件獨(dú)立的(因?yàn)楣?jié)點(diǎn)之間不存在連接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隱藏層h的情況下,所有的可視節(jié)點(diǎn)都是條件獨(dú)立的。同時(shí)又由于所有的v和h滿足Boltzmann 分布,因此,當(dāng)輸入v的時(shí)候,通過p(h|v) 可以得到隱藏層h,而得到隱藏層h之后,通過p(v|h)又能得到可視層,通過調(diào)整參數(shù),我們就是要使得從隱藏層得到的可視層v1與原來的可視層v如果一樣,那么得到的隱藏層就是可視層另外一種表達(dá),因此隱藏層可以作為可視層輸入數(shù)據(jù)的特征,所以它就是一種Deep Learning方法。

? ? ? ?如何訓(xùn)練呢?也就是可視層節(jié)點(diǎn)和隱節(jié)點(diǎn)間的權(quán)值怎么確定呢?我們需要做一些數(shù)學(xué)分析。也就是模型了。

? ? ? ? 聯(lián)合組態(tài)(jointconfiguration)的能量可以表示為:

? ? ? ? 而某個(gè)組態(tài)的聯(lián)合概率分布可以通過Boltzmann 分布(和這個(gè)組態(tài)的能量)來確定:

? ? ? 因?yàn)殡[藏節(jié)點(diǎn)之間是條件獨(dú)立的(因?yàn)楣?jié)點(diǎn)之間不存在連接),即:

? ? ? 然后我們可以比較容易(對(duì)上式進(jìn)行因子分解Factorizes)得到在給定可視層v的基礎(chǔ)上,隱層第j個(gè)節(jié)點(diǎn)為1或者為0的概率:

? ? ? ?同理,在給定隱層h的基礎(chǔ)上,可視層第i個(gè)節(jié)點(diǎn)為1或者為0的概率也可以容易得到:

? ? ? ?給定一個(gè)滿足獨(dú)立同分布的樣本集:D={v(1),?v(2),…,?v(N)},我們需要學(xué)習(xí)參數(shù)θ={W,a,b}。

? ? ? ?我們最大化以下對(duì)數(shù)似然函數(shù)(最大似然估計(jì):對(duì)于某個(gè)概率模型,我們需要選擇一個(gè)參數(shù),讓我們當(dāng)前的觀測(cè)樣本的概率最大):

? ? ? ? 也就是對(duì)最大對(duì)數(shù)似然函數(shù)求導(dǎo),就可以得到L最大時(shí)對(duì)應(yīng)的參數(shù)W了。

?

? ? ? ?如果,我們把隱藏層的層數(shù)增加,我們可以得到Deep Boltzmann Machine(DBM);如果我們?cè)诳拷梢晫拥牟糠质褂秘惾~斯信念網(wǎng)絡(luò)(即有向圖模型,當(dāng)然這里依然限制層中節(jié)點(diǎn)之間沒有鏈接),而在最遠(yuǎn)離可視層的部分使用Restricted Boltzmann Machine,我們可以得到DeepBelief Net(DBN)。


?

Deep Belief Networks深信度網(wǎng)絡(luò)

? ? ? ? DBNs是一個(gè)概率生成模型,與傳統(tǒng)的判別模型的神經(jīng)網(wǎng)絡(luò)相對(duì),生成模型是建立一個(gè)觀察數(shù)據(jù)和標(biāo)簽之間的聯(lián)合分布,對(duì)P(Observation|Label)和 P(Label|Observation)都做了評(píng)估,而判別模型僅僅而已評(píng)估了后者,也就是P(Label|Observation)。對(duì)于在深度神經(jīng)網(wǎng)絡(luò)應(yīng)用傳統(tǒng)的BP算法的時(shí)候,DBNs遇到了以下問題:

(1)需要為訓(xùn)練提供一個(gè)有標(biāo)簽的樣本集;

(2)學(xué)習(xí)過程較慢;

(3)不適當(dāng)?shù)膮?shù)選擇會(huì)導(dǎo)致學(xué)習(xí)收斂于局部最優(yōu)解。

? ? ? ?DBNs由多個(gè)限制玻爾茲曼機(jī)(Restricted Boltzmann Machines)層組成,一個(gè)典型的神經(jīng)網(wǎng)絡(luò)類型如圖三所示。這些網(wǎng)絡(luò)被“限制”為一個(gè)可視層和一個(gè)隱層,層間存在連接,但層內(nèi)的單元間不存在連接。隱層單元被訓(xùn)練去捕捉在可視層表現(xiàn)出來的高階數(shù)據(jù)的相關(guān)性。

? ? ? ?首先,先不考慮最頂構(gòu)成一個(gè)聯(lián)想記憶(associative memory)的兩層,一個(gè)DBN的連接是通過自頂向下的生成權(quán)值來指導(dǎo)確定的,RBMs就像一個(gè)建筑塊一樣,相比傳統(tǒng)和深度分層的sigmoid信念網(wǎng)絡(luò),它能易于連接權(quán)值的學(xué)習(xí)。

? ? ? ?最開始的時(shí)候,通過一個(gè)非監(jiān)督貪婪逐層方法去預(yù)訓(xùn)練獲得生成模型的權(quán)值,非監(jiān)督貪婪逐層方法被Hinton證明是有效的,并被其稱為對(duì)比分歧(contrastive divergence)。

? ? ? ?在這個(gè)訓(xùn)練階段,在可視層會(huì)產(chǎn)生一個(gè)向量v,通過它將值傳遞到隱層。反過來,可視層的輸入會(huì)被隨機(jī)的選擇,以嘗試去重構(gòu)原始的輸入信號(hào)。最后,這些新的可視的神經(jīng)元激活單元將前向傳遞重構(gòu)隱層激活單元,獲得h(在訓(xùn)練過程中,首先將可視向量值映射給隱單元;然后可視單元由隱層單元重建;這些新可視單元再次映射給隱單元,這樣就獲取新的隱單元。執(zhí)行這種反復(fù)步驟叫做吉布斯采樣)。這些后退和前進(jìn)的步驟就是我們熟悉的Gibbs采樣,而隱層激活單元和可視層輸入之間的相關(guān)性差別就作為權(quán)值更新的主要依據(jù)。

? ? ? ?訓(xùn)練時(shí)間會(huì)顯著的減少,因?yàn)橹恍枰獑蝹€(gè)步驟就可以接近最大似然學(xué)習(xí)。增加進(jìn)網(wǎng)絡(luò)的每一層都會(huì)改進(jìn)訓(xùn)練數(shù)據(jù)的對(duì)數(shù)概率,我們可以理解為越來越接近能量的真實(shí)表達(dá)。這個(gè)有意義的拓展,和無標(biāo)簽數(shù)據(jù)的使用,是任何一個(gè)深度學(xué)習(xí)應(yīng)用的決定性的因素。

? ? ? ?在最高兩層,權(quán)值被連接到一起,這樣更低層的輸出將會(huì)提供一個(gè)參考的線索或者關(guān)聯(lián)給頂層,這樣頂層就會(huì)將其聯(lián)系到它的記憶內(nèi)容。而我們最關(guān)心的,最后想得到的就是判別性能,例如分類任務(wù)里面。

? ? ? ?在預(yù)訓(xùn)練后,DBN可以通過利用帶標(biāo)簽數(shù)據(jù)用BP算法去對(duì)判別性能做調(diào)整。在這里,一個(gè)標(biāo)簽集將被附加到頂層(推廣聯(lián)想記憶),通過一個(gè)自下向上的,學(xué)習(xí)到的識(shí)別權(quán)值獲得一個(gè)網(wǎng)絡(luò)的分類面。這個(gè)性能會(huì)比單純的BP算法訓(xùn)練的網(wǎng)絡(luò)好。這可以很直觀的解釋,DBNs的BP算法只需要對(duì)權(quán)值參數(shù)空間進(jìn)行一個(gè)局部的搜索,這相比前向神經(jīng)網(wǎng)絡(luò)來說,訓(xùn)練是要快的,而且收斂的時(shí)間也少。

? ? ? ?DBNs的靈活性使得它的拓展比較容易。一個(gè)拓展就是卷積DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs并沒有考慮到圖像的2維結(jié)構(gòu)信息,因?yàn)檩斎胧呛?jiǎn)單的從一個(gè)圖像矩陣一維向量化的。而CDBNs就是考慮到了這個(gè)問題,它利用鄰域像素的空域關(guān)系,通過一個(gè)稱為卷積RBMs的模型區(qū)達(dá)到生成模型的變換不變性,而且可以容易得變換到高維圖像。DBNs并沒有明確地處理對(duì)觀察變量的時(shí)間聯(lián)系的學(xué)習(xí)上,雖然目前已經(jīng)有這方面的研究,例如堆疊時(shí)間RBMs,以此為推廣,有序列學(xué)習(xí)的dubbed temporal convolutionmachines,這種序列學(xué)習(xí)的應(yīng)用,給語音信號(hào)處理問題帶來了一個(gè)讓人激動(dòng)的未來研究方向。

? ? ? ?目前,和DBNs有關(guān)的研究包括堆疊自動(dòng)編碼器,它是通過用堆疊自動(dòng)編碼器來替換傳統(tǒng)DBNs里面的RBMs。這就使得可以通過同樣的規(guī)則來訓(xùn)練產(chǎn)生深度多層神經(jīng)網(wǎng)絡(luò)架構(gòu),但它缺少層的參數(shù)化的嚴(yán)格要求。與DBNs不同,自動(dòng)編碼器使用判別模型,這樣這個(gè)結(jié)構(gòu)就很難采樣輸入采樣空間,這就使得網(wǎng)絡(luò)更難捕捉它的內(nèi)部表達(dá)。但是,降噪自動(dòng)編碼器卻能很好的避免這個(gè)問題,并且比傳統(tǒng)的DBNs更優(yōu)。它通過在訓(xùn)練過程添加隨機(jī)的污染并堆疊產(chǎn)生場(chǎng)泛化性能。訓(xùn)練單一的降噪自動(dòng)編碼器的過程和RBMs訓(xùn)練生成模型的過程一樣。

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的AutoEncoder、RBM、DBM、DBN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。