lecture16 聯合模型、分層座標系、超參數優化及本課未來的探討——Hinton課程

轉載自https://www.cnblogs.com/shouhuxianjian/p/4529166.html

這是HInton的第16課,也是最後一課。

 

一、學習一個圖像和標題的聯合模型

在這部分,會介紹一些最近的在學習標題和描述圖片的特徵向量的聯合模型上面的工作。在之前的lecture中,介紹瞭如何從圖像中提取語義有意義的特徵。不過那是在沒有從標題中得到幫助的情況下做的。顯然在標題中的單詞應該有助於從圖片中提取合適的語義類型。類似的,圖片也應該有助於在區分標題中的單詞的意思是什麼。所以idea就是我們要在一個很大的網絡上,給他輸入然後計算圖像上提取的視覺特徵向量,然後學習標題的單詞表徵,然後學着將這兩個輸入表徵之間互相關聯。在這部分的最後,會有一段電影有關最終的網絡使用單詞來生成圖像的特徵向量,然後得到數據庫中最接近的圖片。同樣的使用圖像來生成單詞字節。

現在來介紹下一些由natish  Rivastiva(他是這個課程的一個助教)和Roslyn Salakutinov的工作,目標就是建立一個有關標題和從真實圖像中提取的標準計算機視覺的特徵向量的聯合密度模型。這需要比建立一個標籤和數字圖像(之前看到的手寫數字)的聯合密度模型更多的計算量。所以他們首先要做的就是單獨的訓練一個圖像的多層模型。這是一個從圖像中使用標準計算機視覺特徵提取的特徵的多層模型。然後分別訓練一個從標題中得到的單詞計數向量的多層模型。一旦他們訓練好了這兩個模型,他們有一個新的頂層,也就是將兩個模型的頂層連接在一起。之後,他們更進一步的對整個系統進行聯合訓練從而每個模態可以提升早期其他模態的層。

這裏不使用DBN,這也許是你期望的,他們使用DBM,在DBM的所有的層對中有着對稱的連接。更進一步的對整個DBM的聯合訓練就是允許每個模態改變其他模態的早期層中的特徵提取器。這就是他們使用DBM的原因。他們同樣可以使用DBN,然後用對比CD做生成式的微調。不過對DBM的微調算法也許可以更好的work。這留下了一個問題,如何對一個DBM進行預訓練他的隱藏層。因爲到目前爲止,我們在課程中看到的是如果你訓練一個堆疊RBM,你可以將它們結合起來到一個單一的模型中,不過你得到的是一個DBN而不是一個DBM。

所以現在來解釋在不管課中之前說過的那些,你實際上可以預訓練一個堆疊RBM到這樣一種方法,這樣你可以隨後結合他們成一個DBM。技巧就是這個堆疊RBM中頂層和底層的RBM需要在一個方向上兩倍大小於另一個方向上來預訓練權重,。所以(看上圖左邊的模型的底部那個模型),這個底部的玻爾茲曼機,觀察他的可是單元是用自底向上的權重兩倍於自頂向下的權重的,不過權重是對稱的,所以這裏稱之爲縮放對稱,不過自底向上的權重總是兩倍於自頂向下的權重的。這是有道理的,會在稍後介紹理由。堆疊中的下一個RBM(中間那個模型),是用對稱權重來訓練的。這裏都是2W,而不是W,可以保持用RBM來像這樣真正的對稱權重來訓練。不過在堆疊的頂部這個RBM被用自底向上的權重是自頂向下權重一半的方式來訓練的。所以再說明一次,這些是縮放對稱權重,不過現在,自頂向下的權重是兩倍於自底向上的權重。這就是與我們訓練第一個RBM相反的。在訓練好這三個RBM之後,我們就可以將它們結合起來生成一個綜合模型,而這個綜合模型就像上圖右邊那個。對於中間這個RBM,我們簡單的減半他的權重,這就是爲什麼開始的時候用2W2。對於底部這個,我們減半上行的權重,不過還是保留下行的權重不變。對於頂部這個,我們減半下行的權重,保持上行的權重不變。現在 問題是:外什麼我們要做這樣的減半權重的操作?解釋是相當複雜的,不過這裏粗略的介紹下:如果看到左邊那個堆疊的RBM的層h1部分,我們有兩個不同的方式來推論h1中的單元的狀態,我們可以推論h1 的狀態來自自底向上的v 或者我們推論h1的狀態來自於自頂向下的h2.當我們急哦按這些玻爾茲曼機結合起來的時候,我們要做的就是均化這兩種推論h1的方式。爲了得到一個幾何均化,我們要做的就是減半這些權重,所以我們使用一半自底向上的模型,也就是一半的2w1,然後我們使用一半自頂向下的模型,也就是一半的2w2.如果你看右邊這個DBM,這就是用來推論h1 的,換句話說,如果你在給定h2中的狀態的時候,然後給定v 中的狀態,這些權重就是你需要用來推論h1的狀態的。我們需要減半這些權重的原因是因爲我們無需進行兩次計算。你看,在右邊這個玻爾茲曼機中,h2的狀態是依賴於v的,至少在我們做了一些讓玻爾茲曼機穩定下來的工作之後是這樣。所以如果我們使用來自第一個RBM的自底向上的輸入,然後使用來自第二個RBM的自頂向下的輸入,我們就可以計算這個證據(evidence)兩次,因爲我們需要從v中推論h1,而且還需要從h2(而這個仍然還是由v決定的)中推論h1,爲了不要計算兩次證據,我們需要減半這些權重。這是一個高度抽象,也許不是那麼完全清楚解釋爲什麼需要減半權重的原因。如果想要知道數學上的詳細解釋,你可以讀讀論文。

所以中間層可以使用那層的來自原始堆疊中兩個不同的RBM表示的兩個不同模型的幾何均化:下面是來自長達1分24秒的視頻的部分截圖:

上圖應該是從step 1開始計算,然後幾個模型的黑白點會不斷的變化

可以看到白點在不斷的變化,這是因爲給他的右下角的標題也變了

 

下面是另一個例子,上面的是圖片不變,標題在變,下面是標題不變,圖片在變:

二、分層座標系

在這部分,將會介紹如何通過使用介於部分之間的關係的對象識別和使用DNN的對象識別結合起來。在現在的計算機視覺中,廣泛的使用三種方法來識別對象。不論是使用深度CNN,雖然這個在當前是效果最好的;還是使用一個基於部分的方法,這個Hinton認爲長遠的看,這個是最好的;或者使用現有的特徵,也就是那些計算機視覺的人們知道如何從圖像中提取的特徵,然後用他們的直方圖,接着使用一些手工的方法來完成,這就是CNN最近打敗的方法。這部分的重點在於我們如何將一個基於部分的方法和使用CNN的早期階段結合起來。

即使CNN對於對象識別和圖像識別來說已經效果很好了。不過Hinton還是它丟失了一些東西。當我們池化來自一羣重複的特徵檢測器的激活值的時候,我們丟失了那些大多數激活的特徵檢測器的準確位置。意思就是我們沒法知道他們的位置在哪,這對於高度抽象的部分(parts)的來說是很致命的,例如鼻子、嘴巴。爲了識別這些人臉是誰的,你就需要在這些高度抽象的部分中使用準確的空間相關性,例如鼻子和嘴巴。如果你重疊這些池化就能讓每個特徵出現在不同池化中。你保留了更多關於他的位置的信息,這會讓事情work的更好,不過Hinton不認爲這個答案是正確的。一個相關的問題是CNN使用重複的特徵檢測器來達到平移的目的沒法推斷從幾何關係到像不同方向或者不同尺度這樣的根本的新viewpointd的理解。當然我們可以交叉於方向或者尺度上來重複,不過這樣我們就得到了巨多的重複的特徵檢測器。人類非常擅長推斷,在看到一個新的形狀後,他們能從一個非常不同的viewpoint上進行識別它。目前來看,我們處理CNN的方法是在轉換後的數據上訓練的。所以這會導致有個巨大的訓練集合,也就是通過不同的方向、尺度和光照以及其他東西來轉換數據使得網絡可以處理這些變化。不過這對於處理這些變化來說是一個非常笨拙的方法。

Hinton想出了一個更好的方法通過使用具有層次關係的座標系然後使用一組神經元來表示一個特徵形狀的關聯,它的姿勢是相對於視網膜來說的。所以當這些神經元是激活的,它會告訴你那種特徵是哪種,例如一個鼻子。這些神經元的準確的激活值或者相對的激活值會告訴你鼻子的姿勢。如果你思考有關表示某些東西的姿勢時,這就是介於座標系之間的關係。所以這是介於基於東西的座標系和照相機或者視網膜的座標系之間的關係。所以爲了表示東西的姿勢,我們需要嵌入一個座標系到它裏面去。一旦完成之後,我們就有相對於計算者來說對象想法的姿勢的表示,這很容易使用路徑到識別更大對象之間的關係來完成。所以我們使用部分的姿勢的一致性來作爲識別更大形狀的線索。

如果你看上圖右下角的圖的豎線左邊,有鼻子和嘴巴,然後有着相互正確的空間關係。一種對這種情況的思考的方法是,如果通過嘴巴去預測整個人臉的姿勢,或者通過鼻子來預測整個人臉的姿勢,他們會得到相似的預測結果。如果看上圖右下角的右邊的圖,有着一樣的鼻子和嘴巴,不過現在他們在錯誤的空間關係上,這就意味這如果他們分別進行預測關於人臉的姿勢,他們的預測結果就完全不一樣了。

這裏是在層級部分中的兩層,其中更大的部分可以通過更小的部分的一致性預測來進行識別。讓我們假設我們在找一張臉(上圖上面一行三個小圓加橢圓),在中間部分上那個有着Tj的橢圓是一個神經元的集合,用來作爲識別人臉的姿勢。隔壁小圓中的Pj是一個單一的邏輯神經元,用來作爲表示是否那是一張人臉。(這時候下面的三個對應部分也有了)在上圖下面的部分中我們有一個相似的表示,這裏有用嘴巴和鼻子表示的姿勢。我們可以通過注意這兩個表徵是否得到一致性的預測來進行識別人臉。所以需要用於表示嘴巴姿勢的激活向量,然後用矩陣Tij進行相乘,這個矩陣表示嘴巴和人臉的空間關係,然後得到一個預測,關於人臉姿勢的結果Ti×Tij;接着在鼻子上也這樣做,用表示鼻子姿勢的激活向量,然後用矩陣Th進行相乘,這個矩陣表示鼻子和人臉的空間關係,然後得到一個預測,關於人臉姿勢的結果。如果兩個預測結果一樣,那麼就判斷那裏有個人臉,因爲鼻子和嘴巴都在正確的空間關係上。

這裏做的就是逆向計算機圖形學。在計算機圖形學中,如果你知道人臉的姿勢,你就可以通過Tij的逆運算計算鼻子和嘴巴的相似性。所以在計算機圖像學中,是從更大的東西的姿勢到他們更小的東西的姿勢上的。在計算機視覺中,你需要從小的東西的姿勢到更大東西的姿勢上,你需要檢查一致性。

現在,如果我們可以得到一個NN來表示這些姿勢向量(也就是神經元激活的向量),然後得到一個非常好的特性。空間關係可以建模成線性操作。這使得學習層級可視實體變得非常容易,同樣的他也讓生成交叉的viewpoints的時候變得很容易。所以這就是當我們在viewpoint中有着很小的變化的時候得到的就是姿勢向量,這些神經元激活值的向量都會變化。

不變的是權重,那些表示來自整體的部分之間關係的權重,就想上一個ppt中的Tij,這些不是依賴viewpoint的,所以我們想要在權重中得到不變的形狀的特性,而且想要激活值中的姿勢向量。因爲當我們改變viewpoint的時候,所有的這些姿勢向量都會變化。所以不是得到那些對於viewpoint是不變的神經元的激活值,這就是在CNN的池化中做的(個人:也就是池化的缺點,把這些信息丟失了)。我們目標在於得到哪些與viewpoint的同變性的激活值,使得對象的姿勢隨着神經元的激活值的變化而變化。這就意味着對象的知覺(percept)不是他的標籤,而是它看起來像什麼,是隨着viewpoint的改變而改變的。

這裏介紹給出一些證據(evidence)關於在可視系統上加入座標系來表示形狀。這在很長一段時間以前就被一個偉大的心理學家Irvin Rock指出。如果你看到這個形狀(上圖左邊那個形狀),然後告訴你這是一個國家,大多數人不知道這是哪個國家,他們認爲這有點像澳大利亞,不過他完全不是。如果告訴你他的上方是什麼地理位置(紅線箭頭),他們立馬就能識別出這是非洲,如果他們知道加入的座標系,他立馬就變成一個相似的形狀。

相似的,如果給你一個形狀像上圖右邊那個,你可以感知到這是一個方形,或者是一個鑽石。這是兩個完全不同的概念,你所知道關於這個形狀的信息是取決於你對他的感知。例如,如果你感知他是一個斜平方,你可以敏感的知道這個角是否是直角。如果你感知到她是一個直立的鑽石,你就完全不會對他敏感了,當這個角度有5度的偏差的時候,你就完全不會注意到了,不過你會敏感到其他東西。如果你感知它作爲一個直立的鑽石,那麼就會敏感於這個左角和右角是否有着一樣的高度。現在你可能會注意到在這個圖中,他們有些輕微不同的高度差。這種現象就是證據,用來表示我們會在形狀上面加上座標系,因爲不論將它作爲一個方形還是鑽石,這是你同時會做的事情(個人:就是加座標系),不過這個感知的不同完全在於你加入的座標系的不同。

三、神經網絡超參數的貝葉斯優化

在這部分中,會介紹一些最近令人興奮的工作,Hinton認爲這會在回答關於如何在神經網絡中解決超參數的問題上前進一大步的。近來的工作使用一個不同類項的機器方法來幫助我們決定對超參數使用什麼值。換句話說,他使用機器學習來代替那些用所有的這些不同的超參數配置來找到如何讓系統最好工作的研究生們。它依賴於對對平滑函數的建模方法,叫做高斯過程,之前Hinton總認爲相比較於語音和視覺來說是微不足道的,不過當你在那些沒有許多先驗知識的領域,而你唯一能做的事情就是你期望相似的輸入有相似的輸出,然後高斯過程是完美的。這個領域是當Hinton他們在鼓搗超參數的向量並希望找到一個最好的超參數向量使得可以很好的work的時候接觸的。所以例如隱藏單元的數量、層的數量、權重的懲罰項、是否需要使用dropout。這下都是超參數,而且不同的超參數組合可以work的很好,所以這對於手動尋找來說是一個非常困難的空間。當手動探索的時候,這些就會非常容易被忽視掉。高斯過程(Gaussian Processes)很擅長注意數據中的傾向性而且當你有足夠的計算機的時候,會提供一個非常好的方式去尋找好的超參數集合。

最常見的一個人們不使用NN的原因是因爲他需要大量的技巧來調整超參數,這事實上是一個非常好的原因。如果你沒有任何經驗的話,它很容易陷入使用一個完全錯誤的超參數值,然後沒有任何效果。你需要設置的有層數,每一層的單元數,單元的類型,權重懲罰項,學習率,動量等等。如果你使用的學習率100倍太大,或者100倍太小,你的網絡當然也就沒法work。

一個解決這種方法就是做一個樸素網格搜索。也就是對任何超參數,你需要一個可替代值的列表,然後將所有的可能的組合值用來訓練,你可以想象這工作量,如果你有許多超參數的話,你最後會發現你會有比你可能要用的組合多得多。結果顯示有一些東西明顯會好於樸素網格搜索(naive grid search)。我們只需要隨機採樣組合,也就是說對於每個超參數來說,我們先列一個可代替值的表,然後隨機挑一個組合。這樣更好的原因是因爲許多超參數沒有任何效果,其他會非常有用。我們不想要重複超參數的配置,特別是那些幾乎沒有效果的配置組合。我們對這種方法瞭解不多。在一個網格搜索中,你需要沿着每個軸設置好幾個點,對於所有的其他參數來說,它們都是一樣的。所以如果沿着那個網格軸移動沒有任何意義,你會總是在多次重複一樣的實驗,而且沒有學到任何有關其他參數的東西。

不過還是有一些方法可以比隨機組合要好。基本上等於說,讓我們使用機器學習來模擬碩士生來決定超參數應該是什麼。所以不採用隨機組合的方法,我們看看目前爲止得到的結果,然後試着預測什麼樣的組合可以更好的工作。也就是我們需要預測超參數空間的區域,我們期望得到好結果的區域。不過只說我們期望如何做還是不夠的,我們同樣需要有一個關於不確定性的idea。例如我們也許需要一個區域,在這個區域中我們期望做一些和我們當前做的差不多的,不過也許可以做的更好。在這種情況下,就值得來搜索這個區域了。甚至在我們認爲做的更差的區域上也值得探索,因爲我們有可能做的更好。現在我們假設評估一個超參數配置的計算量特別的大。他涉及到在一個巨大數據集上訓練一個大NN,而且他有可能會在一個大計算機上花費好幾天的時間。與這些工作相關的,建立一個模型在給定所有我們實驗過的less work的配置來預測一個超參數集合有多好,所以會需要比運行單次實驗更少的計算量來用這個預測模型來擬合到目前爲止的實驗的結果。所以什麼類型的模型可以用來預測未來實驗的結果?

結果顯示有一種模型,這是在之前都沒說過的,叫做高斯過程模型。基本上,所有的這些模型都是假設相似的輸入得到相似的輸出,它們沒有任何更復雜的先驗,不過他們非常擅長以一種高效的形式來使用這個先驗。所以如果你不知道太多有關你期望超參數做的,一個像這樣的弱先驗也許是你最能做到的。高斯過程可以對每個輸入維度進行學習,在這個維度上合適的縮放可以用來測量相似性。所以例如,如果隱藏單元是200或者200,問題就是這些是相似的數量還是非常不同的數量?我們期望我們用200得到的結果於用300得到的結果非常相似,還是期望它們非常不同?如果不知道任何有關NN,開始我們就沒有任何想法,不過我們可以看看到目前爲止的實驗的結果。如果在考慮到其他實驗之間的不同的時候(也就是單一變量原則)用200的實驗和300的實驗傾向得到非常相似的答案,那麼300就可能是相似於300.所以我們對這個維度設置一個縮放因子,這樣你需要更多的實驗的差異性來得到非常不同的結果。

現在,重要的是使用GP(gaussian processes)模型可以做不僅僅是預測特定實驗的預期結果。也就是我們訓練的NN在一個驗證集上會有多好。除了預測一個有關他們期望這個NN做的多好的平均值,它們還會預測分佈,他們預測方差。他們稱這個爲GP是因爲他們的預測結果是高斯的。當他們對新的超參數配置(這些配置都很接近我們已經運行過的幾個一致的配置)進行預測的時候,我們知道結果。這個預測結果將會傾向於相當尖銳,也就是它有一個低方差(想想高斯圖形就知道),不過當他們是用非常不同於之前實驗過的超參數的配置的話,由GP得到的預測結果就會有非常高的方差。

所以這裏是一個相當好的策略,通過使用GP來決定下一個該試什麼。記得,我們有一種學習模型,它是一個非常大的NN,他需要很長的時間來訓練,我們可以指出下一個要使用的超參數配置。我們有一種不同的機器學習方法,叫做GP,它會 通過觀察到目前爲止實驗的結果,然後對一些提出的新的超參數集合來預測NN的結果有多好和預測結果有多少程度的不確定性。所以我們可以追蹤到目前爲止work的最好的超參數的足跡。這是對於所有的超參數配置來說是單一的配置,可以給我們到目前爲止NN最好的效果。

現在當我們運行下一個實驗的時候,我們目前最好的配置也許會被新的實驗代替,因爲他會在NN中給出更好的結果或者還是老樣子。所以當我們打算替換性實驗的結果(是目前爲止最好的結果),我們目前爲止最好的配置還是可以提升的。所以這是一個有關下一個可以使用的超參數配置的好策略。我們挑選一個超參數配置,使得在我們最佳配置中的期望的提升是很大的。我們不關心我們也許會使得實驗得到一個壞結果的事實,因爲如果得到了一個壞結果,我們就不會在新實驗上替換我們目前最好的配置了。這是一個對衝基金經理人知道的現象,他們經常告訴客戶如果基金上升的話,就會需要你利益的3%,如果基金下降的話,你就輸了。現在這對於客戶來說,這種協議很瘋狂,因爲這會讓對衝經理人冒着巨大的風險情況下有着巨大的激勵,因爲他沒有明顯的答案。不過對於尋找那些work的超參數,這是一個明智的策略。所以考慮這三個預測結果(上圖右邊三個)A,B,C。我們假設A,B,C是沒有試過的超參數的不同的配置,這些綠色的高斯都是我們GP模型的預測結果,關於這些配置的結果。對於配置A,均值是非常低於我們目前爲止最好的結果的,而且是溫和的方差。對於配置B,均值非常接近目前爲止最好的結果,不過因爲沒有太多的方差,所以也沒太多的上漲空間。對於配置C,均值事實上低於配置B,不過因爲他的高方差,所以它有很大的上漲空間。我們會採用高斯C的區域中在紅線上面的部分,然後採用基於紅線上面的區域的時刻(moment),這就是我們尋找的匹配邊界,你可以發現C有着一個比B和A更大的moment。他也許和B在紅線上部分一樣的區域面積,不過這個區域是針對紅線來說跨度更大。所以我們在使用配置C的時候也許會得到一個非常大的飛躍。所以這是我們的策略關於挑選的位置的。A是最壞的部分,B是適中的,C是最好的。

所以它們的效果如何呢?如果你得到了資源來做許多實驗,這會比一個人來尋找好的超參數組合更好。這裏目前爲止的策略是一個嚴格的順序策略,需要假設它能看到目前爲止運行的所有實驗,不過沒有理由關於爲什麼不讓它更復雜一點,然後以並行的方式運行一大堆的實驗。使用一個GP模型來預測一個具體的超參數配置有多好的效果是明智的,因爲這不是我們擅長的任務。這不像視覺或者語音,而且也不清楚數據中可以有哪些複雜的結構。也許唯一真實的結構就是事物是平滑的,而且它們有許多尺度(scale)。所以一個人類沒法記住50個不同實驗的結果,然後來進行預測。如果你都是靠手動的,你也許會沒注意到所有你的好的結果有着非常小的學習率,所有你的真正壞的結果有着非常大的學習率。,因爲你參與了許多其他的操作。一個高斯模型不會丟失那樣的趨勢。一個最終的原因關於爲什麼GP是超參數配置的好方法是因爲它們不太可能像人一樣作弊。通常來說,當我們做研究的時候,我們想要將一個新的方法與舊的方法做比較,你也許會想到會需要更努力的對新的方法找到好的超參數。這就是爲什麼當你對比方法的時候,你應該通過不同的組來對比結果,對於每個方法,結果是由相信那個方法的組產生的。如果我們使用GP來搜索好的超參數配置,他們要做的就像是研究我們相信的模型類型那樣研究我們不相信的模型類型。

四、前行的迷霧

在這個最終的部分上,會介紹Hinton關於NN研究上的預測(記得這個視頻是12年的,所以所謂的預測,其實現在就可以看看是否實現了)。會先介紹爲什麼Hinton認爲做許多研究在長時預測是極端愚蠢的。

先介紹爲什麼我們沒法通過使用一個類比(analogy)來預測長時的未來。想象下你在晚上開一輛車,然後你在看着前面車的車尾燈。你從前車的車尾燈接收到的光子(photons)數量會隨着1/d^2而下降,這裏d 就是你與前車的距離,這是假設空氣是很透明的,不過現在假設在霧天。在經過很短的範圍後,你從前車的車尾燈收到的光子的數量仍然按照1/d^2而下降。因爲在一個很短的範圍內,霧幾乎不會影響任何燈光。不過在一段長距離來說,他下降的是按照e(-d) 的,因爲霧是一個指數級的影響。霧會在每個單位距離上吸收一定部分的光子。所以對於短距離來說,霧看上去是透明的,不過對於長遠距離來說,它看上去非常的不透明。所以在前面的車在我們之前認爲非常可見的短距離模型中變成了完全不可見的。這使得人們會將後面的車也開進霧中,這會導致交通事故。

不過技術的發展同樣是指數級的。所以在短時上,事情看上去變得會非常緩慢,所以也很容易預測。例如我們所有的人可以很容易的猜測到Iphone 6是什麼樣子的。不過在長時上,我們對未來的感知就像撞到了牆,就像是霧一樣。所以對於機器學習和NN的長時未來真的是一個謎。我們沒法知道在今後的30年時間中會變得怎樣。也就是沒法基於現在知道的基礎上來預測,因爲我們處在指數級的發展中。然而在短期內,例如3年或者10年,我們可以很好的預測。在今後的5年內你會驚訝大的DNN所做的事情。Hinton這裏祝賀那些堅持看到現在的人們,希望你們能夠enjoy這門課,然後在最後的期末考試中得到好成績(個人:當然和咱沒關係:))。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章