close

Facebook動態消息算法揭秘:它比你還了解你自己

 

編者按:你登陸社交網站,以為新鮮事中都是自己訂閱的內容,但它還包括平台想讓你看到的,以及猜測你可能喜愛的內容。平台會猜測用戶的心思,用戶也往往淪為小白鼠。本文編譯自SLATE,揭露了Facebook動態消息的背後的技術原理。為了了解你,科技公司可是很努力的。

每次你打開 Facebook ,這個世界上最具影響力,最有爭議也是最被人誤解的一套算法機制就開始運行。它會收集關於你的一切狀態更新:你朋友每周發過的狀態,你關注的每一個人,你加入的每一個群組,以及你贊過的每一條消息。對於 Facebook 用戶來說,平均每周有一千五百次狀態更新。如果你有數百位好友,那這個數字可能會高達一萬以上。通過對這些數據細緻入微的觀察,工程師們對推薦算法進行不斷的優化,Facebook 的動態消息(news feed)才能做到出現你真正感興趣的內容。因為,大多數人並不會每天都把時間線完整看一遍,只會看最上面幾百個。

沒有人能夠猜透 Facebook 的算法究竟是如何生成的,而內部人員更不可能告訴你這些。這個自動化的算法對於人們的社交有着重大的影響,而且它決定了我們每天會看到什麼,要知道世界上有五分之一的人口——近 10 億的 Facebook 活躍用戶每天就在動態消息裡面閱讀新聞。病毒式擴散的算法機制完全顛覆了傳統的媒體,把新興的創業公司 BuzzFeed 和 Vox 市值推上了高位,而擁有一百年歷史的報紙們則被陸續帶進了墳墓。社交遊戲公司 Zynga 和團購網站  LivingSocial 憑藉 Facebook ,在短短一兩年的時間內就做到了數十億美金的估值,投資者們賺得盆滿缽滿。Facebook 的動態消息甚至能夠左右我們的喜怒哀樂,它推送給我們真正優質有趣的消息,並將僅僅是情緒性的表達篩選掉。

然而, 儘管它擁有如此的權力,它的動態消息卻一直難以讓人滿意,推送的內容十分隨意,變幻莫測,有時候甚至出奇的不雅。經常會推送一些無關緊要的東西,謠言,瑣事,充滿戾氣的話,或者是無趣的消息。Facebook 的內部人員很清楚這件事。在過去的幾個月內,這個社交網絡巨頭開始將重新設計過的動態消息推送算法在用戶內進行小範圍的測試,你猜結果如何?

用戶們普遍反饋「有時」,新的動態消息會擊中他們的興奮點。Facebook 對此表示欣慰,並強調會進行持續性的改進。

「有時」代表着你離完全的成功還有很長的路要走。

近年來,Facebook 和其他硅谷巨頭們越來越習慣於用機器學習軟件替我們做出選擇。硅谷明星埃隆馬斯克和著名科學家霍金都曾經提出警惕人工智能的觀點,而「算法」這個詞本身,就是為了大幅提高效率而生的。「算法」對於普通人來說,是「不明覺厲」的計算機名詞,神秘而充滿魔性,而 Facebook 等科技巨頭使用的算法更是令人好奇。

最近,我參觀了 Facebook 總部,與動態消息的算法團隊相處,了解這套機制背後的故事。他們是如何把臭名昭著的動態消息算法扭轉口碑的,為什麼要這麼做,如何做到,及背後的運行機理。此外,我們還能了解到很多關於算法局限性的問題,數據有時候也會撒謊,Facebook 為此專門請了外包團隊進行人肉反饋,以達到更準確的效果。

算法

Facebook 的算法,據我所知,有點小瑕疵並非系統的緣故。以現在的科技水平而言,算法想要達到科幻小說一般洞悉人性是不可能的。Facebook 算法的背後還是人。工程師們決定了數據的篩選,加工,及輸出。算法出錯,背鍋的當然是設計算法的工程師。算法的一步步進化,也是無數工程師們看了無數的數據,開了無數會議,反覆測試,最終的結果。然而,Facebook 算法的持續進步仍然使人感到好奇,他們是如何做到的?

Facebook動態消息算法揭秘:它比你還了解你自己

當我到達 Facebook 總部時,一名 37 歲的大男孩接待了我,他臉上掛着善意微笑,充沛的精力及旺盛的表達慾望是他最明顯的特徵。他就是 Tom Alison ,「動態消息」算法的工程主管,他管理着設計算法的工程師們。

Alison 帶着我穿過迷宮般的 Facebook 辦公區,穿過一個小廚房之後,我們進入了一件小型會議室里。Alison 向我承諾會把 Facebook 算法背後的原理講清楚,即使對於我這種外行來說。 到了以後,我想去一趟洗手間,我問了他應該怎麼走。他很抱歉的對我說,「還是我帶你去吧」。起初我以為他是怕我迷路,當我從洗手間出來時,發現他就站在門口等着我。我不禁認為,他被上級要求不能讓我在辦公室里單獨走動。

Facebook動態消息算法揭秘:它比你還了解你自己

Facebook 總部

同樣,Facebook 對於他們的商務信息守口如瓶,Alison 不能告訴我有關「動態消息」 算法的實際代碼。然而,他能告訴我大概的原理,以及為什麼它一直在改變。工程師們通常喜歡站在白板前講解,他也不例外。

剛開始學習計算機科學的時候,你第一個接觸到的算法必然是關於排序的。他在白板上快速的寫下這幾個數:4, 1, 3, 2, 5。

接着,他隨手寫下了一個簡單的任務:設計一套算法,使數組按從小到大排序。「人類可以很容易的做到,這僅僅是舉手之勞而已。」他對我說。

然而,對於計算機,你應該給出具體而明確的方法。這就需要算法的幫忙:算法就是用於計算機解決問題的一系列步驟。Alison 告訴我的算法叫「冒泡排序」 ,它的具體做法如下:

  • 1.對於每一個數組,從第一個數起,與后一個數比較大小,如果後者較大,則不變。

  • 2.如果前者較大,則兩者置換位置。

  • 3.重複前兩步,直到沒有任何一對數字需要比較。

冒泡排序的優點是簡單易懂。壞處也顯而易見,如果你的數據過大,計算量會很大,速度也隨之變慢。對於 Facebook 數十億用戶而言,當然不能用這種算法。Facebook 的算法要求你在打開 App 的瞬間就把所有的動態消息準確歸位,對速度的要求極其嚴苛。但這僅僅是算法里的子算法而已。最重要的是把所有的動態消息按照正確的方式排序,最重要的出現在最頂端。這就是 Facebook news feed 排序團隊的工作了,就是把所有用戶關注的信息按用戶的關聯度排序。

這是一項非常艱難的任務。因為你在 Facebook 上的朋友們發的消息,還有你關注的明星們發的消息,哪些「和你有關」,是很難量化的事情。為此,Alison 解釋,Facebook 使用了一套與眾不同的算法,稱為預測式算法。(Facebook 的 news feed 算法,和谷歌的搜索引擎算法,Netflix 的推薦算法都是分佈式的複雜算法,包涵很多小的算法)

讓我們猜猜下一場籃球賽,公牛對湖人,誰會贏? Alison 說。「公牛」,我不假思索的說出了口。Alison 笑了,但他隨後點頭表示同意  。如果把我的大腦類比為計算機,我剛剛輸入了他提的問題,輸出了 公牛這個回答,我大腦里的直覺反應就是算法。(人類心靈的算法遠比目前計算機使用的複雜的多,但穩定性也差的多) 

「當你不會感到壓力時,這種僅憑直覺的猜測往往正確率驚人。」Alison 說。「但如果剛剛的猜測有金錢上的掛鈎,數百萬每次,每天預測數百次。那我們就需要一個成體系的方法。你可能會看看歷史數據,每一個球隊的勝負紀錄,是否有傷員,誰正手感火熱。可能你還會考慮環境因素,誰是主場?客隊是背靠背比賽還是經過了一段時間的休息?你的算法可能會把這些因素全部考慮在內。如果你的算法足夠完美,你可能不僅僅預測到了勝負情況,你連比分都能猜個大概。」

同理,Facebook 的動態消息算法也是這樣的情況。(動態消息是 Faceboook 最大的現金牛,平均日入 2000 萬美金)我問 Alison 在 Facebook 算法的機器學習語言中,總共考慮了多少種條件,他回答道「數百種。」

Facebook動態消息算法揭秘:它比你還了解你自己

Adam Mosseri (站着)

Facebook動態消息算法揭秘:它比你還了解你自己

整個動態消息算法設計團隊

它不僅僅會根據你以往的點贊習慣預測你會不會點贊。它還會預測你點擊展開全文,評論,分享的可能性,甚至標記為垃圾的可能性。從而確定一個關聯分,這個分數決定了它是否會出現在你的動態消息列表中,以及所在的位置。所以,每次你打開 Facebook 動態消息上的第一條,是從數百條消息中脫穎而出的,最能刺激你點贊,評論,分享,及改變你情緒的消息。

點贊

然而,無論你怎樣精心構建一個算法,總是有很多的數據你是不得而知的:教練的比賽計劃,德里克羅斯(公牛隊球星)的膝蓋傷勢,甚至是籃球的氣壓。從微觀層面講,比賽也不是一個單純比數值的遊戲。這是人參與的遊戲,「人」的複雜程度遠非算法可以預測。

這套預測算法還面臨著其他的挑戰,這些挑戰是來自認識論的。關聯度的分預測公牛隊將會贏得比賽。顯然這個結果是可量化的:輸了或贏了,猜中了或猜不中。Facebook 嘗試着使用相似的思路解決問題,記錄你與這些動態消息的互動頻率。而這些互動也正好成為了 Facebook 收入的來源:點贊,點擊,分享,評論,使消息病毒式傳播,把每一個單獨的用戶串起來,精準地投放廣告。

但是這些交流對於真正的用戶來說,是非常粗糙且不準確的。他們點了贊,並不一定代表他們真的喜歡這條消息,故事看到一半就關閉,也不一定是不喜歡。如何優化這樣的情況?

Facebook動態消息算法揭秘:它比你還了解你自己

「點贊」

在 2013 年末,Facebook 已經是當時最炙手可熱的公司。用戶數量超過 10 億,估值達到 1000 億美金以上。當時它們已經花了數年的時間不斷優化移動端的應用體驗,在國際上,受歡迎程度已經超過谷歌搜索和谷歌地圖。Facebook 已經不僅僅是一個朋友間社交的工具,事實上,它還是 21 世紀全球化的新聞源:一個針對每一位用戶量身定製,瞬時更新的新聞,娛樂資訊,朋友動態聚合網站。

在公司之中,動態消息收入的增長讓他們感到震驚。但在用戶數量暴漲的同時,Facebook 員工們並不能確定用戶的滿意度究竟如何。人們在 Facebook 上點贊的數量前所未有的多,但他們討厭什麼?

為了搞清楚這件事,我們必須把鏡頭拉回到 2006 年。當時的 Facebook 與現在複雜的側欄及群組相比,還處於原始狀態。和競爭對手 Myspace 相似,「動態消息」僅僅是朋友間的狀態更新的聚合。

Facebook動態消息算法揭秘:它比你還了解你自己

2006 年的 Facebook 主頁

甚至,你朋友的更新你不一定能看得到。為了防止信息過多給用戶造成太大壓力,Facebook 用了一種簡單粗暴的算法過濾掉了一部分它認為用戶不感興趣的信息。而當時並沒有東西能夠能夠衡量用戶對於信息究竟是否感興趣——點贊功能距推出還有三年時間。工程師們靠直覺判斷消息的呈現與否。一開始的標準是,這條消息發佈了多久,以及你的朋友提及這條消息的次數。之後的一段時間裡,工程師們決定停止這種簡單粗暴的方式,而把用戶在消息上停留的時間總數作為消息重要性的依據。但這樣的機制難以分辨哪條消息令用戶感到愉悅,那條消息冒犯了用戶,那些是無聊的,那些是純碎的謠言。本質上,工程師們還是在碰運氣。

「點贊」功能並非一個新鮮的交流方式。而 Facebook 推出點贊功能最初的用意,是想了解用戶對消息的偏好。可能用戶沒有意識到,這是一個非常精妙的設計。如果用戶們明確知道「點贊」是為了方便 Facebook 進行偏好紀錄,那麼這個過程將顯得十分單調乏味。Facebook 的「動態」算法是世界上第一個在用戶沒有感受的情況下,了解用戶習慣及偏好的,並且影響了我們所有人。

沒有一點點防備,這套算法就在不知不覺中有了辨認實時熱點的能力,然後讓它們病毒式傳播。以前熱點是一個人鏈式的傳播,現在一個人點贊以後,他的好友都能看到這一則消息,傳播效率堪比滾雪球。這樣的效應不僅僅讓 Facebook 的員工們看見了,廣告商,出版商,造謠者,甚至普通用戶都看到了其中巨大的威力——輕點一贊,即可把消息傳播給自己所有的好友,關注者甚至陌生人。很多人開始絞盡腦汁思考如何製造「引爆點」。甚至這催生了一項新職業——專門教人髮狀態的社交網絡顧問,他們精於研究文字,發消息的時間,及照片對於傳播度的影響。「求點贊」成為常態,甚至他們已經忘記了他們髮狀態的初衷。許多人的發的狀態變得同質化:庸俗,矯情,自憐,只為獲得更多的「贊」。「大拇指」成了社交網絡的中心。

人肉反饋

就這樣,網站的交互度有了長足的提升,但這應該是動態消息所追求的嗎?這個問題一直困擾着 Chris Cox ,他是 Facebook 的元老了,也是動態算法的工程師。「觀察用戶的點贊,點擊,分享,評論等行為,是為了更好的弄清楚用戶的心理。」Cox 在郵件中這麼對我講。(他是 Facebook 的首席產品官)「但我們很清楚這不是一個完美的解決方案。例如,當你看到一則悲傷的新聞,你肯定不會點贊,但這並不能代表你沒有受到觸動。幾年過去了,我們需要知道比點贊和點擊更細節的用戶行為。」

一個算法可以儘可能的算出最優解,但是不是最優解,還得由人來評判。Cox 等人為動態消息機制設立的終極目標就是,把所有人們真正關係的消息按重要程度排序,把無關的全部隱去。他們知道,這意味着犧牲一些短期的廣告收入及用戶體驗。Facebook 目前持有着大把現金,而 CEO 扎克伯格有着長遠的目標,這給了他們寶貴的試錯機會。但如何把握機會,還是要靠他們自己。

長久以來,媒體機構對於判斷受眾們對什麼內容感興趣都源於主觀判斷。這樣的判斷影響編輯們講故事的方法,價值觀的取向,新聞價值的判斷及題材的選取。但這樣的主觀判斷是 Cox 和其他 Facebook 同事們極力避免的。他們與 Facebook 想要的效果是:用戶在動態里看到的都是他們感興趣的內容,而不是 Facebook 強推的內容。「最完美的解決方案是給用戶選擇權,讓他們挑出自己愛看的,但這明顯不實際。」Cox 對我說。所以次好的解決方案就是用算法猜測用戶喜愛什麼,然後花錢雇傭一批人看效果如何。事實上這個外包團隊已經達到上千人之多,之前他們統一在 Knoxville 的辦公室工作,現在他們在自己家裡。

Facebook動態消息算法揭秘:它比你還了解你自己

Adam Mosseri 是現 32 歲的動態消息產品主管,與 Alison 處於同一層級,但前者更關注戰略而後者更關注技術細節。他找到問題,Alison 負責解決問題。他負責從哲學層面思考動態消息問題。

動態消息從人性化方面的改善始於 Mosseri 的前任主管,Will Cathcart。Cathcart 的工作從採集更多細節信息開展,不僅僅是用戶點擊了什麼,還有用戶在每一個頁面上的停留時間,不僅僅是用戶點贊的內容及傾向,還有他是在看前點贊,還是看了之後再點贊。對於看前就點贊的消息,Facebook 傾向於認為你並不是那麼喜歡。

自 2013 年主政以後,Mosseri 又有了一個大舉動,在 2014 年夏季創立了「動態消息質量評測小組」,該小組包含數百名成員,在諾克斯維爾市的辦公室,每天負責不斷體驗自己的 Facebook 動態消息時間線,並把細節及滿意程度反饋給 Facebook 的工程師。(他們其實是 Facebook 一個秘密的外包團隊。)Mosseri 和工程師們不止於此,他們還會問體驗者為什麼點贊,為什麼不點贊,他們對自己點贊的標準,還有他們的點贊傾向。「事實上,他們幾乎每天都要寫調查報告」, Greg Marra 是評測小組的主管,他這麼對我講。

「問題是,我們可能錯過了什麼?」Mosseri 說,「有哪一方面的事實是我們的盲點?」 例如,他補充道,「我們知道有些消息是你感興趣的,但你並不會參與討論交流。如果沒有關注到這種情況,算法會誤以為你對這些消息並不感興趣,因為你即沒有點贊,也沒有評論。所以什麼東西能把這些消息和普通消息區分開來?」

Mosseri 任命了產品經理 Max Eulenstein 還有用戶體驗研究員 Lauren Scissors 管理着評測小組的日常運營,對問題的諮詢也是他們負責。例如,Eulenstein 讓小組成員們看一篇故事,測試他們在喜歡或不喜歡這條消息時,分別在網頁上停留的時間。一般認為,你在網頁上停留的時間越長,你對它越感興趣,即使你並沒有為它「點贊」。「但沒那麼簡單,不僅僅是『 5 秒表示喜歡,2 秒表示不喜歡』」,Eulenstein 對我解釋,「每一位用戶的閱讀速度也大有差異,這個時間值應該和用戶平均閱讀時間結合起來看。」關於這個問題的研究成果在六月的算法改進中得以體現,Facebook 會盡量把用戶停留時間長的消息排名靠前。

花費了數月的時間,Mosseri 和他的團隊終於建起了一個可以信賴的測評小組,這是一個國際化的團隊,根據 Facebook 在全球的用戶數量分配團隊中成員的國籍,並且允許他們在家辦公。在 2015年末,Facebook 遣散了之前在諾克斯維爾市的辦公室,並擴張了海外測試團隊。Mosseri 的直覺是對的:動態消息算法推薦上存在盲點,但這件事工程師們自己發現不了。這需要另一種數據的支持——人肉反饋。

 

Facebook動態消息算法揭秘:它比你還了解你自己

 

評測小組對於動態消息算法的成熟起到了至關重要的作用,擺脫了對「大數據」的迷信之後,團隊迅速成長。 取而代之的是一個具有完善的反饋及平衡機制的系統,每一次算法的改動都必須經歷不同類型,不同國籍的用戶的反饋,經過多維度的標準測試正確率。

這一個包含排序工程師,產品經理,數據分析師的小團隊最主要的任務就是平衡算法的準確性。Sami Tas 是其中的一位軟件工程師,他的工作是把動態消息排序小組寫出的目標(即偽代碼)翻譯成電腦可以理解的語言。這個下午,我盯着他看,他從我旁邊經過,被一個看似微不足道的問題困擾了。這真的是一個微不足道的問題啊,然而,Facebook 的員工們卻錙銖必較。

5% 的用戶

大多數時候,人們看到一則不感興趣的消息,會直接跳過去。但有些消息使他們感到惱怒,他們會特地點開下拉欄,找到「隱藏」按鍵。Facebook 算法將「隱藏」視為強烈的不滿信號,並盡量減少相似的消息出現。

Facebook動態消息算法揭秘:它比你還了解你自己

「隱藏」功能藏在下拉欄的二級菜單里

顯然,每個用戶的習慣都是不同的,有趣的是,Facebook 的數據分析師們發現,5% 的用戶使用「隱藏」功能佔了總數的 85 %。他們更深入的了解,這一小部分人幾乎把自己看過的所有消息都隱藏了——即使是他們點過贊的或評論過的消息。對於這些「『隱藏』強迫症患者」,顯然,「隱藏」不代表他們不喜歡這條消息,他們想要表達的是「已閱」標記,就像 Gmail 里的「歸檔」。

然而他們的行為將使賴以排序的數據造成偏差。對於這麼複雜的情況,算法並不能分辨出這樣的行為。它只會傻傻地認為點贊即代表滿意,隱藏代表強烈的不滿意。所以,對於這樣的「『隱藏』強迫症患者」,工程師們決定為他們做專門的優化。Tas 為此專門寫了代碼辨別出這群人,並減低他們「隱藏」的負面權重。

這看似一個小問題呢。但這套算法對於 Facebook 是如此重要,以至於這樣小小的改動都應該經過嚴密的測試才能真正投入使用。首先是離線測試,在 Facebook 內部小組內小範圍測試,然後推出到一小部分用戶上,最後才是全面使用。每一步,數據分析師們都要收集對於用戶的網站交互度,廣告投放收入和加載速度影響。如果有哪一項出現大幅度的波動,則會出現警報並自動通知到工程師們。

即便如此,Facebook 也不能確定對於長期來看是否有負面影響。為了防止意外,還留有一部分「保留小組」,即一小部分的用戶會在幾個月內保持原樣。

動態消息排序算法不僅僅有一套,這是廣泛的誤解。事實上,這不是一套有幾百個小算法組成的算法。由於總共有很多個測試小組,「保留小組」,這個世界上同時運行着很多個版本的排序算法。我猜,有一部分「『隱藏』強迫症患者」已經可以愉快地刷動態消息了,但還有一部分的用戶仍受到不準確算法的困擾。

Facebook動態消息算法揭秘:它比你還了解你自己

質量評測小組的出線另動態消息算法團隊的數據更立體,這是大數據不能給予的。至此,Tas 和其餘的排序團隊成員對於機器算法的盲點有了深刻的認識。但是,Facebook 還有一個小組,對於這套算法的成熟也起到了至關重要的作用,那就是包括你我在內的普通用戶。

在過去的六個月中,Facebook 一直在普通用戶中做着隨機的調查,設置左右兩列動態消息,讓普通用戶選擇更感興趣的那一列,這是全民參與的「動態消息評測小組」。但是,不僅如此,Facebook 在最近兩年一直給予用戶更多定製自己動態消息的權力。

你不僅可以「取關」某人,還可以把你的好朋友列入優先列表中,把某個類型的消息屏蔽掉。當然,這些功能對於粗心的用戶來說很難發現,並不會增加輕度用戶的上手成本——它藏在右上角的灰色小箭頭裡。大部分用戶甚至永遠都不會發現這些功能。當你打開導航及幫助頁面時,Facebook 會對這些功能進行詳細的說明。

你了解自己嗎?

這些轉變有部分原因是為了起到防禦作用。近年來,Facebook 在社交網絡的統治地位屢遭威脅,正如當年 MySpace 的地位遭到 Facebook 的挑戰一樣。而新興的創業公司完全避開了數據驅動的模式,以 Instagram 為例,他們直接把你關注的所有人的狀態消息以反時間順序的時間線列出,Facebook 不得不買下 Instagram 以維持老大哥地位。Sanpchat 則以獨特的閱后即焚模式侵蝕着 Facebook 的青少年市場。

Facebook 並不是近年來唯一數據驅動優化推薦算法的公司。Neflix 的最佳影片推薦,同樣更具海量的用戶數據,給用戶分成無數小類,分類推薦。為了平衡亞馬遜的自動 A/B 測試,首席執行官貝索斯一直設立一個單獨的反饋郵箱供用戶提出意見。現在將數據的處理完全交給機器學習還為時尚早,但機器學習的時代正在加速到來。Facebook 主管 Mosseri 在開會時並不喜歡使用時髦的「數據驅動」,他說的是「數據輔助」。

Facebook動態消息算法揭秘:它比你還了解你自己

Facebook 動態消息排序小組相信他們的努力終將得到回報。「如果我們繼續根據反饋提升動態消息推送,我們呈現的消息就回越來越接近人們心中所想。」負責與動態消息反饋小組對接的用戶體驗分析師 Scissors 說。

這裡有一個潛在的負面影響:給用戶控制的權利,可是他們真的知道自己究竟想要什麼嗎?還是數據驅動的 Facebook 比我們更懂自己?可能做出比用戶自己想要的更吸引人的動態消息嗎?

Mosseri 告訴我他並不會過度擔心這些。他解釋道,這些數據目前為止,都暗示應該多做調查,給予用戶更多的選擇權,這樣可以增加用戶的參與度及在網站上停留的時間,這兩項看似都是短期最主要的目標。

動態消息推送算法的改進是一個非常長期的過程。如果它恰好每次都擊中你的痛點,那也僅僅是一個令人愉快的巧合。在長達十年的動態消息運營過程中,數據從來就沒有盡善盡美過。而算法的改進就是一個否定之否定的過程,今天辛苦寫成的代碼也許明天就會被無情刪除。日復一日,工程師們在 Facebook 門洛帕克市的總部里的研究體驗報告,開會,進行一系列測試,然後一次又一次修正算法。

via slate

arrow
arrow
    文章標籤
    Facebook 瘋臉書
    全站熱搜
    創作者介紹
    創作者 olddanny 的頭像
    olddanny

    爍石流金_痞客邦分站

    olddanny 發表在 痞客邦 留言(0) 人氣()