0
雷鋒網(wǎng) AI 科技評論消息,今年年初,MXNet 作者李沐與 Alex Smola 在加州大學伯克利分校開設了一門深度學習課程。課程結(jié)束之際,李沐在知乎撰寫長文,描述了開設這門課程的動機,以及上完課程之后,在教育上的一些心得與體會,李沐表示,「我們嘗試的一些方法、走過的彎路、積累下來的材料也許對諸位感興趣的老師和同學有所幫助。所以特意在這里分享出來?!?/p>
雷鋒網(wǎng) AI 科技評論獲其授權(quán)轉(zhuǎn)載這篇文章。以下為正文,有刪減。
原文地址:https://zhuanlan.zhihu.com/p/66062438
2019 年春季我跟 Alex Smola 一起在加州大學伯克利分校(下面簡稱 Berkeley)教了一門針對本科生的實驗性質(zhì)的深度學習課程,旨在探索如何有效地教授深度學習。連同兩位助教(Rachel 和 Ryan)和一百來位學生一起度過了高強度的、痛并快樂的四個月。上周剛結(jié)束了課程項目的報告。二十個報告里有好幾我特別喜歡,其中一兩個將投到即將截稿的 NeurIPS。更欣慰的是幾個我一度覺得會失敗的項目也找到自己的出路。
教學是一種形式上的創(chuàng)作。創(chuàng)作有著藝術(shù)性和個人性。我們的經(jīng)驗不足支撐寫出一篇「如何高效的教深度學習」,但我們嘗試的一些方法、走過的彎路、積累下來的材料也許對諸位感興趣的老師和同學有所幫助。所以特意在這里分享出來。
動機
在過去三年中,我所在的亞馬遜云服務(AWS)人工智能部門(AI)急速的擴張了好幾十倍,側(cè)面反映了行業(yè)的火爆。但我觀察這個市場的擴張并沒有想象中的那樣發(fā)展迅猛。原因之一是 AI 的頭號玩家深度學習的入門門檻依然很高。雖然它比機器學習更實用,但比起其他學科來說仍然很復雜。例如如果 100 個人學數(shù)據(jù)庫(AWS 的重要收入來源),可能 50 個人能用學到的知識來解決實際問題。但同樣這些人來學深度學習,謹慎樂觀估計 10 個學完后可以上手就很好了。如果 AI 一波熱潮褪去,開發(fā)者學習熱情降低,市場擴張隨之變慢,那冬天就不遠了。
我跟多位部門同事合作對亞馬遜內(nèi)部員工和 AWS 客戶進行過培訓(工作的副業(yè)之一),17 年的時候跟 Aston 一起在國內(nèi)做過十九期直播。去年年底的時候萌發(fā)錄一個更加正式的質(zhì)量更高的 MOOC 的想法。但擔心線上課程不能實時得到反饋,所以難易度難以包括,所以想先面對面的教一遍積累些經(jīng)驗。
首選是去 Stanford,因為離家近(踩單車 15 分鐘)。但 Stanford 已經(jīng)有幾門深度學習課程同時在開。幸運的是 Berkeley 仍有空位,而且他們非常樂意我們?nèi)ソ?。?lián)系上 Berkeley 到 AWS 上層批準一周內(nèi)就搞定,即使是我們明確說明了將會在半年之內(nèi)每周兩天不在辦公室。這一點上我非常喜歡亞馬遜,它推崇做一些有長遠影響的項目,并鼓勵快速嘗試。
入職當天有兩個有意思的小插曲。一是被告知 Berkeley 是公立學校,職員算政府人員,需要宣誓戰(zhàn)爭發(fā)生時要為美國而戰(zhàn)。我說這我沒做好心理準備,要不不要發(fā)我工資,當我是個志愿者好了。這樣我也安心去實驗教學。
二是我去的伯克利統(tǒng)計系是世界上最好的統(tǒng)計系之一了吧(這里老師覺得就是世界第一,很像我讀過的 CMU 計算機系和我老婆讀過的 MIT 計算機和電子工程系,他們老師都覺得自己是世界第一?)。樓上辦公室坐著各大山頭,Michael Jordan,Peter Bartlett,Bin Yu,一堆如雷貫耳的名字。但統(tǒng)計系這棟樓是我去過的學校里面最破的,沒有之一。以至于約助教見面時他們委婉的建議去隔壁樓的公共空間,那里更敞亮更現(xiàn)代。
分配到的辦公室??催@地板、這凳子、這黑板,這墻、這窗。拍于中午十二點。
教學大綱
深度學習的興起不過短短 7、8 年,今天的學術(shù)界仍然熱火朝天,新模型新應用依舊層出不窮。如何在大量的、沒有經(jīng)過長時間檢驗的文獻中選取教學內(nèi)容頗費腦力。例如去年年末出現(xiàn)的 BERT 和 GPT 等模型使得我們意識到基于 self-attention 的 transformer 類模型可能未來跟卷積神經(jīng)網(wǎng)絡和循環(huán)神經(jīng)網(wǎng)絡一樣重要,于是教到一半的時候特意挪出了一節(jié)半課來介紹。學生后來反饋這對他們的課程項目很有幫助。
深度學習知識點可以簡單且粗暴的分成兩類:實用的和好玩的。實用類包括各類卷積和循環(huán)神經(jīng)網(wǎng)絡,以及它們在計算機視覺和自然語言處理中常見問題的應用。這類模型可以用來解決人類幾秒內(nèi)能判斷的事情,從而替代人來做重復性的工作,有著廣泛的應用場景。好玩的包括用生成對抗網(wǎng)絡來生成圖片,和用增強學習來打各種游戲。這類模型具有一定的創(chuàng)造力,可以做高大上的演示,大家喜聞樂見,但技術(shù)落地目前有些不明朗。
我們希望學生在學完這門課后能夠掌握和使用常見的模型。不管他們以后是去工業(yè)界找相關(guān)職位還是繼續(xù)讀研深造,都能打下堅實基礎。所以教學大綱是偏向?qū)嵱煤突A類技術(shù)。
但我們不能開一門純實用課程。僅僅教授神經(jīng)網(wǎng)絡的各種構(gòu)造大法可能在聰明的 Berkeley 學生眼里跟回字有四樣寫法一樣可笑。課里不僅要講 HOW,也要解釋 WHY。但深度學習里理論工作并不多,而且大有今天提出來一種解釋過不了幾天就被打臉的可能。所以課上只能把各方觀點都擺一擺,加上點自己的看法,然后提醒大家要有辨別精神,因為今天說的猜測可能都是錯的。此外,我們還補充了些相關(guān)的數(shù)學、統(tǒng)計學習和優(yōu)化的經(jīng)典知識和理論來增加深度。
在知識點外的另一個重要點是動手能力。一個我很喜歡的比喻是知識積累是內(nèi)存,手速就是 CPU。內(nèi)存決定能跑多大的程序(工作的深度),CPU 決定多快能跑完這個程序。對于初學者來說 CPU 比內(nèi)存重要,因為內(nèi)存可以從別人那里借。例如在課程項目中,Alex、助教和我充當了內(nèi)存的職責。但 CPU 是借不到的,不能動手不僅做不出課程項目,完成作業(yè)都可能懸。
在課程中我們基本對每個講到的算法都過了一遍代碼實現(xiàn),有些基礎的甚至是兩種不同的實現(xiàn),一種是從零開始方便理解的,一種是實際中使用的。我感覺整門課至少一半時間在講代碼。帶來的問題是覆蓋的知識點少了。但好處是每個講過的點都把細節(jié)說透了。一般先是公式和圖片,講模型設計思路和與其他類似模型的聯(lián)系和區(qū)別。然后是代碼,講細節(jié)的實現(xiàn),說明每個模塊的數(shù)據(jù)輸入和輸出,和現(xiàn)場演示實驗效果。這也是我個人信奉的一種學習方式,先一頭扎進去弄懂所有細節(jié),然后再抬頭思考它背后的思想。
每個課時的安排在下圖(或者點擊 http://courses.d2l.ai/berkeley-stat-157/syllabus.html)。Alex 覺得我們覆蓋了深度學習 20% 的內(nèi)容,我讀論文少,所以比較樂觀的覺得覆蓋了 60% 的話題,和每個話題里面重要的 50% 知識點,所以也有個 30% 的內(nèi)容。對于一門入門課來說,已經(jīng)是相當豐富了。
教材
早在兩年前我們就著手寫一本深度學習的教材。當時的情況是 Ian Goodfellow 的書是當時最好的入門書,新而且全面。但它只做了一般的模型描述而沒有描述如何實際使用它們以及效果怎么樣。而且?guī)啄隂]更新似乎有點趕不上時代了。同時網(wǎng)上有大量的關(guān)于模型實現(xiàn)類的文章,但過于零散而且每個人寫作風格迥異。我們想要一本既能講原理、又有實現(xiàn)和實際使用、不斷更新、而且容易讀的書。
在過去兩年的摸索中,這本教材在傳統(tǒng)意義的書上往前走了幾步:
書的每一章用文字、數(shù)學、圖示和代碼來多方面介紹一個知識點。它是一個 Jupyter 記事本,可以獨立運行。包含 20 個左右的文字和代碼塊,可以 15 分鐘左右讀完。
源文件是 Markdown,不保存執(zhí)行輸出,并開源在 Github 上。這樣方便更多人貢獻和改動審閱,同時可以很容易的不斷加新章節(jié)。
任何改動都會觸發(fā)持續(xù)集成服務重新執(zhí)行記事本來獲得執(zhí)行輸出,這樣保證代碼的正確性。一個記事本的執(zhí)行時間控制在不超過十分鐘。這對展示復雜模型的訓練頗為挑戰(zhàn)。
執(zhí)行無誤后直接用三種格式發(fā)布在網(wǎng)上:含有執(zhí)行輸出的 Jupyter 記事本,可以直接瀏覽的 HTML,和適合打印的 PDF。
可以像 LaTeX 那樣方便的索引圖、表、公式和文獻。
每一章都有可以討論的鏈接。
目前書的英文版發(fā)布在 http://d2l.ai/,中文版在 http://zh.d2l.ai/。
這本書代碼的實現(xiàn)很多是基于 MXNet(一開始的目標是為 MXNet 寫個好點文檔),我們也考慮過要不要提供一個 PyTorch 或者 Keras 的版本。后來發(fā)現(xiàn)這個擔心比較多余??蚣芫褪且粋€工具,工具之間的那些不同帶來的困難比起理解模型和調(diào)出結(jié)果來小很多。課上發(fā)現(xiàn)就算是沒有接觸過這些工具的學生,用 MXNet 做作業(yè),然后在基于不管用啥框架實現(xiàn)的現(xiàn)有算法再開發(fā)做項目并沒有多大困難?;蛘哒f困難都不來自工具本身,特別是算法實現(xiàn)都在課上講過一遍的情況下。
幻燈片
教材是給學生課前課后閱讀使用。上課中需要將教材變成幻燈片。雖然想過是不是可以讓教材直接自動生成幻燈片,但沒有找到特別好的辦法。原因是書和幻燈片的表現(xiàn)形式很不一樣。書中文字是書面的、詳細的、和嚴謹?shù)??;脽羝瑒t是口語的、簡單的、和生動的。
舉個例子,下圖是書中介紹物體檢測和邊界框的一節(jié)。
在幻燈片版本中,我首先用兩頁介紹物體識別,第一頁是突出跟前面一直講的圖片分類的區(qū)別,然后是一個實際中的應用(順便介紹下自動駕駛這個應用)。接著是過渡頁表示一個單元的開始,和簡略的介紹邊界框。跟書相比,幻燈片在表現(xiàn)上更加簡單,而且更強調(diào)生動性。
按照這個思路,書中每一節(jié)的文字被重新做成一個幻燈片單元。一般 5 頁左右,講課中每頁平均花時 2 分鐘。然后刪掉文字保存代碼,再使用 Jupyter 來做幻燈片演示。
通常一個代碼單元是 10 頁,一頁平均需要講一分鐘。
這樣書的每一節(jié)被做成了兩個幻燈片單元,一共講 20 分鐘。Berkeley 一節(jié)課 80 分鐘,一節(jié)課可以講 4 節(jié)。一共上了 26 節(jié)課,講了大約 100 節(jié),基本覆蓋了整本書的內(nèi)容。
課程錄像
機器學習類課程都喜歡錄像(可能是 Andrew Ng 開了一個好頭)。錄像有兩個場景,一個主體是幻燈片,講師在角落。另一個主體是黑板。
過去幾年里我們嘗試了各種 DIY 手段來通過便宜的器材來錄制準專業(yè)的視頻。下圖是這次使用的器材。
錄像用的是一個 4K 微單④,放在講臺前 4 米的三腳架上①,用 HDMI 線③和轉(zhuǎn)錄頭②跟筆記本相連。4K 主要是為場景二準備,但因為我們定到的教室的黑板不是很好,所以這個場景用得不多,而且經(jīng)常課堂中忘了切換。后來發(fā)現(xiàn)其實用手機就足夠了,例如 iPhone 加上 EpocCam 這個應用,然后用個小三腳架放在筆記本的后面。這樣極大減輕每次要攜帶的設備,而且降低了器材成本。但注意不要用筆記本自帶的前置攝像頭,那個效果不行。
聲音質(zhì)量很關(guān)鍵。千萬不要用筆記本自帶的麥克風,人稍微離遠點就聽不清。我們將一個無線麥克風掛在身上⑦,它跟 hub⑧相連,然后再接到筆記本上。后來發(fā)現(xiàn)如果走動不頻繁的話,用固定麥克風效果也很好⑤,而且容易連接(我們買的這個主要是為 MOOC 用,比較重,如果要攜帶的話可以買小點的)。
錄制軟件用的是 OBS,游戲主播常用。強大,但不是很穩(wěn)定,而且耗資源,特別是在連了很多設備的情況下。于是專門用了個新的高配 MacBook Pro⑨,保證除了上課外不會動它,而且有足夠的計算資源現(xiàn)場運行程序。OBS 出錯概率不小,建議每次開始時和中間都要查一下錄制是不是正常。否則重新錄視頻很痛苦,因為沒有學生在現(xiàn)場,氣氛很不一樣。
物理鍵盤⑥很方便,一個鍵配置成開始和停止錄制,另外兩個是切換場景。它的主要好處是 LED 背景顯示當前狀態(tài),可以時不時看下錄制是不是正常。因為每個單元錄一個視頻,一節(jié)課通常錄 7、8 個,前幾節(jié)課常忘了點開始。這個鍵盤可以時不時看下錄制是不是正常。不過我覺得一個更好的辦法是用一個 iPad 做一個擴展顯示器,將 OBS 放在上面,這樣可以真正看到錄制狀態(tài)。
通常我們會把課程視頻在一兩天內(nèi)上傳到 YouTube。但這樣直接導致來上課的學生銳減。堅持來上課的學生可能學習動機更大,每次互動的時候都感覺大家掌握不錯,進而導致一路向前講,基本把整本書講完了。這比原計劃多講了 20%。我覺得可能視頻在一周后上傳比較好,這樣學生需要來上課才能完成一周后要交的作業(yè),從而容易在課堂上把握節(jié)奏。
上機環(huán)境
深度學習里大部分模型訓練都需要 GPU 來加速,但學生通常都沒有自己的 GPU(當然他們不這么覺得,很多學生課后指著自己系統(tǒng)中顯示的 Intel 集成顯卡來跟我說,你看我是有 GPU 的)。一個方便的辦法是使用 Google 的 Colab(當時提供 K80,現(xiàn)在是 T4 了),但只能同時訓練一個任務,做作業(yè)還行,但課程項目不夠。我們提供的另一個途徑是使用 AWS 上的 GPU 實例,而且我們提供經(jīng)費。
教學生在云上用 GPU 實例比想象中要困難些。雖然課上手把手教過,但好長一段時間的答疑里都是問如何使用云。而且很多學生經(jīng)常開了實例忘關(guān),或者用了特別貴的 GPU 實例,導致月底會有很高的賬單(前些天一位同事苦著臉跟我抱怨說,資助的一個項目的一個學生為了趕一篇論文在 AWS 上燒了 30 萬美元,老師自然掏不起腰包,只好我們補。差點掏空了我們?nèi)甑馁Y助資金)。
這門課里我們大概發(fā)放了 3 萬美金的 AWS 兌換碼。主要麻煩的地方是都是學生問我要,然后我手動回,發(fā)了好幾百封郵件。還要答疑諸如為什么兌換不了。這一塊還在思考如何改進。
作業(yè)和考試
我們一共布置了 10 次作業(yè),一周一個。絕大部分是代碼實現(xiàn)題。一個作業(yè)預計耗時是半天。對于工作量較大的,我們讓每個課程項目團隊一起合作完成。這樣他們可以提前熟悉各個隊員。對于個人作業(yè)我們鼓勵討論,但需要每個人獨立將答案寫下來。
頗受歡迎的幾個作業(yè)是參加 Kaggle 競賽。我們提供一個基礎模型和幾個改進思路,然后學生去調(diào)參數(shù),并上傳預測結(jié)果報告得分。之后我們會排名出前三個隊,每個隊獎勵$500 的 AWS 兌換碼。
這十個作業(yè)里面有兩個設計得不是特別好。都是模型訓練題,但我們沒有事先實現(xiàn)并跑一遍,沒想到一個過于容易,一個太難。下次還是不能偷這個懶。
考試只有期中考試,這是為了期末大家有更多時間做項目??荚囬_卷,但不能帶電腦。其中一道題是一段 LeNet 的訓練代碼,特意改錯了 6 個地方,讓大家來指出問題。整體大家做得還不錯,這樣說明前半課程知識點掌握還不錯。如果允許的話,我還是建議要有期末考試,這樣促使學生去復習課程的后半段內(nèi)容。
課程項目
課程項目占比課程分數(shù)的一半,是我們很看中的部分。因為應用學到的知識去創(chuàng)造性的解決一個有意思的問題是我們能提供的最好學習體驗。但對于老師和學生都相當不容易。
在我們過去的經(jīng)驗中選擇單干的學生經(jīng)常最后做得不是很好,這次我們強制要求一個項目至少有四個成員。第一堂課中 Alex 讓每個人跟坐在邊上的人花三分鐘認識下,然后跟坐在后面的人花三分鐘認識下,這樣方便學生在課上沒有熟人的情況下組隊。如果最后實在落單了,我們就隨機在人數(shù)少的隊里加人。最后一共行成了二十個項目。
考慮到本科生可能缺乏項目經(jīng)驗,所以我們設置了多個中間環(huán)節(jié)。包括三周內(nèi)定好題目獲得 10% 分數(shù),課程 1/3 的時候需要做中期演講和寫中期報告(20% 分數(shù)),必須跟助教見一次面討論項目(10% 分數(shù))。
我們觀察到學生遇到的主要困難是低估項目的難度。首先深度學習極大的拓展了機器學習的應用場景,圖片、視頻、音頻、游戲、金融、醫(yī)療、社交網(wǎng)絡,基本都可以用神經(jīng)網(wǎng)絡來處理。但很多有意思的數(shù)據(jù)可能會帶來大量計算量(例如視頻)和工作量(例如對醫(yī)療數(shù)據(jù)的預處理),遠不是新手能駕馭。
其次,大家喜歡好玩的模型,諸如生成對抗模型和增強學習。但這兩類模型都比較難訓練,例如生成對抗模型中需要在生成器和辨別器之間取得納什平衡,訓練經(jīng)常不穩(wěn)定。但教學大綱專注實用類模型,導致沒講這兩大類模型。于是學生發(fā)現(xiàn)他們選的模型比作業(yè)和課上看到的要難很多。
最后是學生都很自信,演講水平很高。中期演講質(zhì)量很高。不僅好幾個項目的創(chuàng)意我特別喜歡,而且講得也特別好。例如每個項目是給三分鐘報告時間,很多組都是三個人輪流講,每人一分鐘,時間把握特別好。對比 5 年前我在 CMU 做機器學習課助教,我覺得這一屆特別優(yōu)秀。這本是優(yōu)點,但讓我和 Alex 都過于樂觀。
轉(zhuǎn)折點出現(xiàn)在期中考試后。我們開始督促學生將重心放到課程項目上,答疑時間(每周兩小時)里也主要是詢問他們進度怎么樣。一開始會跟他們說一些想法,例如這里有篇剛出來的論文,你們可以讀讀。基本是抱著做出來可以發(fā)個論文或者創(chuàng)個業(yè)的心態(tài)。畫完餅后雙方都很愉快。但任何事情不能拔苗助長。很快發(fā)現(xiàn)大多項目進度緩慢,經(jīng)常一兩周后查看進展時發(fā)現(xiàn)都困在找數(shù)據(jù)或者讀論文。
眼看課程不到一個月就要結(jié)束了,不論是我們還是學生都開始有些著急了。于是將每周的答疑時間增加到了 6 個小時(每節(jié)課前的 3 小時),而且承擔了(無良)項目經(jīng)理職責。進度不理想的團隊在每次聊完后都會很慎重其事的說,回去備好咖啡紅牛熬夜吧,過兩天我們再來看進展。
最后一周最讓人抓狂。一個小組在一個小時后就要做報告的時候,過來問從網(wǎng)上下的一個模型在他們抓的數(shù)據(jù)上做預測能不能過關(guān)。我說,不行,你得「訓練」下這個模型。還有學生什么活都沒干然后稱自己這樣那樣了,找來學校的特殊學生關(guān)心部門說能不能這樣那樣。
很欣慰的是好幾個我們特別擔心的項目最終找到了自己的出路。還有一兩個項目一開始很關(guān)注但中間有點失望,因為感覺他們一直在走彎路而且也不是很理會我們的建議,但最后拿出了驚喜的結(jié)果。最終結(jié)果比預想的要好。
同時,這里面還是有很多可以改進的地方:
需要根據(jù)學生課程項目的選題來調(diào)整教學大綱。例如,雖然我們針對性的將 BERT 從最后往前挪了兩周(有好幾個組獲益),但應該在內(nèi)容上加入生成對抗模型。
需要及早幫學生正確估計項目的復雜度,和正確的估計自己的能力。
跟助教更好的溝通,使得他們將時間多分配來幫助解決一些項目中的一些實際問題,曾在 CMU 看到過一門本科生的編程課里,每周學生坐在一起編程(也許是寫作業(yè)),然后 5、6 個助教現(xiàn)場答疑,感覺效果會很好。
一開始要強調(diào)最后最終項目報告需要列出每個成員的項目貢獻,然后我們再按比例給分。這樣也許能減少一些學生抱著渾水摸魚的僥幸心理。
時間成本
一開始我以為在教材已經(jīng)寫好了的情況下,開門課應該很輕松。但即使是在只要上一半課的的情況下,我每周仍然要花費一半的工作時間在上面。時間的大頭包括:
一節(jié)課的幻燈片需要花費十多個小時,通常是整個周末和兩個工作日晚上(因為帶娃要花更多時間)。不過我觀察到 Alex 只用花 2、3 個小時。
因為我英語口語很一般,而且不善于演講,一節(jié)課前我需要花 2、3 小時演練。即使是中文講課,提前花 30 分鐘想一想怎么講也是很有必要。同時我也觀察到 Alex 只需要上課前花十分鐘過一遍幻燈片就行。
答疑時間和跟助教溝通,前面每周 3 小時,之后增加到每周 7 小時。
回郵件,上傳視頻,更新網(wǎng)頁之類每周一小時。
這門課給我?guī)砹撕艽蟮呢摀_@里也特別感謝我的家庭、公司的老板們和小伙伴們支持這一個「不務正業(yè)」的實驗項目。
總結(jié)
上好一門課很難,需要付出大量時間和精力。一門經(jīng)典的課程通常是好幾個老師經(jīng)過數(shù)年的積累的結(jié)果。這對深度學習這一新的學科尤為挑戰(zhàn)。希望我們的經(jīng)驗和走過的彎路的能啟發(fā)之后的廣大師生。
此外,所有上課相關(guān)的材料都使用 CC BY-NC-SA 4.0 協(xié)議(非商業(yè)目的下自由使用)公布在網(wǎng)上:
課程主頁:http://courses.d2l.ai/berkeley-stat-157/
所有課件和習題:https://github.com/d2l-ai/berkeley-stat-157
教材的英文版:http://d2l.ai/ 和中文版:http://zh.d2l.ai/
最后,可能也是最重要的:
如果你打算使用這些材料來教類似的課程,可以向免費獲取 AWS 計算資源。這里特別感謝 AWS 中國團隊費老師、Shawn、Leo,Vivian、鍇哥、張薇和邢進的支持。具體信息請參考:申請用于本書學習或教學的免費計算資源(http://zh.d2l.ai/aws4learn.html)
教材中文紙質(zhì)版6月即將銷售。有全彩豪華版和黑白經(jīng)濟版兩個版本。因為我們不拿稿費,所以跟出版社協(xié)商到了很低的售價。感謝Aston和我們的編輯海玲付出的巨大努力。京東、當當和天貓上都有預售。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。