想搞AI?沒那么容易。但也沒那么難

曾幾何時,我們讀著比爾蓋茨的傳記,感嘆他大學時就能徒手寫OS的天才同時,也不禁唏噓:現在寫一個OS又哪是幾個人幾臺電腦能搞的定的。喬布斯的車庫創業,雖然聽著比雞湯還暖心,可是那個時代畢竟已經過去了。留下的,只有無數掙扎著從C++/Delphi轉型的資深程序員。

互聯網崛起的時代,馬化騰帶著幾個人就開發出了OICQ,造就了如今偌大的騰訊帝國。智能手機爆發的時代,隨便山寨一個游戲就能賺得缽滿瓢滿,而現在,即使用心做了一個APP,想要推廣也至少是百萬級的推廣費用。互聯網(以及移動互聯網)的時代,也已經接近了尾聲。草根創業將變得無比艱難。代表著互聯網時代的JAVA程序員已經明顯日落西山,而代表著移動互聯網時代的Android/iOS程序員們,應該也感受到了就業形勢的日趨嚴峻吧。

每一波浪潮的到來,都意味一片無人占領的藍海,也意味著眾多新成長起來的巨頭,還意味著什么?大量的人員需求,供不應求的開發市場,以及從業者的高薪與眾多的機會。

我們最常做的事情是目送著上一次浪潮的余波遠去,感嘆自己生不逢時,卻沒有意識到,下一波浪潮已經到了我們腳下。

沒錯,我們說的就是AI。

吳恩達曾經說過,在他看來,機器學習對我們世界的改變,可以與電能的使用相媲美。而更多的人,已經開始用“第四次工業革命”來預言人工智能帶來的產業革新。前三次工業革命,讓人類擺脫了重體力勞動、精細體力勞動、簡單計算勞動。而機器學習,很可能讓人類不必在簡單思考判斷類勞動上消耗大量人力資源。

比如,目前僅在中國有出租車130萬輛,載貨車輛超過千萬,也就是說,每天以“駕駛”作為主要職業的人群就達到千萬量級,如果自動駕駛得以普及,至少在中國就有千萬人被“釋放”,也就是說,得重新學一門吃飯的手藝了。再比如安防領域,全國每天坐在各種監控屏幕前的人(沒錯,就是每部諜戰/犯罪類電影里都會被抹脖子的那個職業)也接近百萬。此外還有諸如視頻網站鑒黃師、專業翻譯,起點網文篩選編輯、快遞地址分揀員等等我們聽說過或者沒有聽說過的職業,默默地消耗著無數人的時間精力。而機器學習在砸掉這些人飯碗的同時,也逼迫著他們投入到其他的工作中,使我們的社會分工結構悄然轉型。

若是再想得長遠一些,這些技術對我們生活的改變,其實遠不僅僅是“以前用人的地方變成用機器”那么簡單。

比如說自動駕駛,這個很多巨頭公司投入了大量精力的領域。很多人覺得,以后可能買車以后開車就不用那么累了。

然而如果所有車輛都變成了自動駕駛,我們還真的需要買一輛車嗎?

我們購買車輛的時候,其實不是買的四個輪子加一個發動機,而是購買“隨時隨心快速出行的能力”,使我們不必受公交太擠、打車費勁、急事出門很麻煩、偏遠地區去了回不來等等這些困擾。

而在自動駕駛的情況下,司機交班,扎堆,偏遠地方打不到車,網上叫車沒人接單這些情況都將不復存在,那么我們何必再每個人買一輛車,忍受路上堵、停車難這些困擾呢?

也許到時候就會變成大量的無人車輛在各種巨型停車場靜靜地趴著,只要有人下單,幾分鐘后就會有一輛無人車輛來到你面前任你驅使。再想深一些,在這樣的情況下,汽車是否一定有必要設計成五座?也許根據實際運營數據的分析,單人車輛,二人車輛會成為無人車輛的主流,從而大大減輕交通流量壓力,緩解擁堵。而所有車輛的狀況都通過網絡匯總到管控機構的時候,擁堵也許也不再會成為一個問題,所有的車輛都會自動規劃路徑,將流量合理地分散到每一條道路上。如果再想想,當智能駕駛足夠可靠的時候,現在的交通路口紅綠燈機制是否還有必要?甚至說,現在的一切交通規則是否會有一個巨大的改變?

這僅僅是針對一項技術開出的腦洞,而其他的技術,將給我們帶來什么,恐怕是現在沒有人能說得清楚的。

唯一可以想象的是,我們在不需要學習外語,不需要考駕照的同時,會需要更多的機器學習專家和相關開發人員。

其實,上面這些事情,身在IT圈中的人,應該都有著直觀的認識。最近這兩年,談論機器學習,神經網絡的人越來越多,而各種“人工智能”相關的消息也是鋪天蓋地,大有“不入圈就淘汰”的洶洶勢頭。

但與此同時,各種不明覺厲的名詞也嚇退了很多非科班出身的開發者。什么叫卷積神經網絡?什么叫凸優化?是不是還要回去重讀高數,線代,概率?那么一大堆公式,感覺完全看不懂啊?聽說沒個名校博士出身都搞不了這個?

不光是普通程序猿這么說,文藝的程序猿和……額,高大上的程序猿也都這么說。

我說,呵呵。

在很久以前的一篇知乎回答中提過,作為開發人員,機器學習界在我看來會分成這么幾個層次

1.學術研究者

他們的工作是從理論上詮釋機器學習的各個方面,試圖找出“這樣設計模型/參數為什么效果更好”,并且為其他從業者提供更優秀的模型,甚至將理論研究向前推進一步。

能夠做到這一步的人,可以說鳳毛麟角,天賦是繞不過去的大山,機遇和努力也缺一不可。

對于這些人,其實也輪不到我們來建議,在長期的研究中他們都有自己喜好的工具和方法,甚至有一言不合就自己開發工具甚至開發語言的(比如LeCun……)。

2.算法改進者

他們也許無法回答出“我的方法為什么work”,也許沒有Hinton,LeCun那樣足以載入史冊的重大成果,但是卻能根據經驗和一些奇思妙想,將現有的模型玩出更好的效果,或者提出一些改進的模型。這些人通常都是各個機器學習巨頭公司的中堅力量或者成長中的獨角獸,使用什么模型對他們來講也不是問題,根據所處的環境,通常都有固定的幾個選擇。他們其實也并不怎么需要關心“我該用什么框架”,重要的是什么框架能夠快速地把想法實現出來。所以你會看到caffe和theano和mxnet和torch都一樣有大批的用戶,仍然在貢獻大量的新算法的實現。在這個層面,insight和idea才是重要的東西,各種工具的區別,影響真的沒那么大。可能會讓一個結果早得到或者晚得到幾天或者幾周,卻不可能影響“有沒有成果”。

3.工業實現者這些人基本上不會在算法領域涉入太深,也就是了解一下各個算法的實現,各個模型的結構。他們更多地是根據論文去復現優秀的成果,或者使用其他人復現出來的成果,并且試圖去在工業上應用它。

對于大部分IT人來說,做到第三類,也就是工業實現這個層面,已經足夠好了,至少,我們已經有了親身參與這個大時代的機會,僅就這一點來說,便已經擊敗了全國99%的人(斜眼笑的表情)。

那么想要成為一個機器學習開發人員,究竟需要做些什么準備?到底如何才能從一個C++/JAVA/Android/iOS程序猿成為一個機器學習開發人員呢?

答案只有一個:

Just Do IT(去搞IT吧,少年)

作為程序員,讀十遍書不如跑一遍程序,與其花費大量的時間去啃書本,不如親手完成自己的程序并運行它。我們在寫出代碼的同時,就會了解到自己還有哪些地方不夠清楚,從而針對性地學習。

基礎知識

當然,勿在浮沙筑高臺(對這句話眼熟的請舉手),有一些基礎的知識還是需要掌握的。例如在計算機視覺領域,根據我們團隊內部培訓的經驗,為了能夠獨立進行機器學習的開發工作,最好首先完成這么幾項課程:

入門,了解概念,算法基礎:

coursera機器學習課程-by吳恩達

Machine Learning | Coursera

進階,多層神經網絡,卷積和softmax回歸:

斯坦福機器學習課程UFLDL

http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

重點關注其中的softmax回歸,卷積和池化這幾個章節

進階,計算機視覺,卷積神經網絡的新進展,實現和應用:

斯坦福計算機視覺課程CS231n

斯坦福CS231n-深度學習與計算機視覺 - 網易云課堂

上面的課程大概會消耗你1到2個月的所有業余時間。但是相信我,這是值得的。網絡上的課程非常多,也有很多優秀的免費課程,但是作為入門,我沒有找到過比這三個更適合的。

如果實在連一兩個月的業余時間都拿不出來,好吧,我來偷偷告訴你最最最基本的一個要求,滿足了這個要求,你就能夠算是機器學習入門了:

會算矩陣乘法

別笑,說正經的,在這個框架高度封裝的年代,梯度不需要自己算,損失不需要自己求,反向傳導更是被處理得妥妥的,在不求甚解的情況下,你甚至只需要知道這么幾個概念就可以開始著手寫第一個程序了:

它就是通過一系列矩陣運算(或者類似的一些其他運算)將輸入空間映射到輸出空間而已。參與運算的矩陣的值稱為權重,是需要通過不斷迭代來尋找到最優值。

當前的權重值離最優值還差多遠,用一個數值來表示,這個值就叫損失,計算這個值的函數叫損失函數

當前的權重值應該調大還是調小,這個值通過對損失函數求導來判斷,這個求導得到的函數叫做梯度。

通過損失和梯度來更新權重的方法叫做反向傳導。

迭代的方法稱為梯度下降。

雖然這么寫出來的程序一定是不知其所以然,但是其實20年前我第一次用C++寫Hello world的時候也是一臉懵逼的,我相信,每個能夠投身機器學習開發工作的程序猿,都是有大毅力大勇氣的,自然不會欠缺繼續學習的動力和決心。

選擇框架

好吧,接下來你需要找一個框架來作為第一個程序的開發環境。

目前機器學習的框架非常的多,從面向的使用者這個維度去劃分,大體上分成這么兩個陣營:

學術友好型:

Theano,Torch,Caffe

學術研究時,弄出來一個新模型,新算法,新函數是常有的事,做出新的突破也是學術研究的最基本要求。所以,這些框架通常都可以方便地定制模型,也可以深入修改內部實現。很多新成果都會在發表論文的同時,提供這些框架上的實現代碼供參考。性能方面也是比較出色。

而代價就是,要么使用了困難(Caffe:C++)或者小眾(Torch:Lua)的開發語言界面,要么具有一些古怪的缺點(Theano:編譯超級慢)。

而且,這些框架似乎都沒怎么考慮過“怎么提供服務”的問題。想要部署到服務器上?Caffe已經是最簡單的了,然而仍然要經歷漫長而痛苦的摸索歷程。

工業友好型:

Tensorflow,MXnet,Caffe

工業上往往更注重“把一個東西做出來,并且讓它運行得良好”。所以這些框架首先就需要支持并行訓練。其中Tensorflow和MXnet支持多機多卡、單機多卡,多機單卡并行,Caffe支持單機多卡。雖然性能并不是特別理想。在我們的測試中,Tensorflow的雙卡并行只能達到單卡的1.5倍左右性能,卡越多,這個比例越低。Caffe要好一些,但是參數同步和梯度計算無論如何也都需要時間,所以沒有哪個框架能沒有性能損失地實現擴展。而多機的情況下,性能損失更大,很多時候都讓人感到無法接受(這方面的優化只能以后有機會再提,如果有這方面的同好,歡迎討論)。

相對來說,Tensorflow提供了比較好的部署機制(Serving),并且有直接部署到移動端的方案。而MXnet和Caffe則是直接編譯的方式,雖然也可以實現,但是說實話,還是很麻煩。

至于缺點,就是除了Caffe之外,其他兩種框架對于學術界的動態跟蹤的都不太緊,Tensorflow到現在都沒有pRelu的官方實現,在前陣子也才剛剛推出了一系列檢測(Detection)的模型。MXnet這一點要積極些,可是受限于較小的開發者社區,很多成果都只能等待大神們的contribution或者自行實現。

這樣看來,難道最好的框架是Caffe?兼顧學術和實現,靈活性和性能兼備……

我得說,我的確是這么認為的。當然有一個前提,得懂C++……【捂臉】

如果不是C++開發人員出身,這門語言也不比機器學習容易多少了。

對于大多數有志于投身于機器學習開發(而不是研究)的同學們來說,我推薦首選Tensorflow作為你的第一個開發框架。

除了上述的優點之外,最主要的因素是,它人氣高。在遇到任何問題的時候,你都會找到一群志同道合的伙伴們去咨詢或者一起研究。這對于初學者而言,重要程度不言而喻。

好吧,選擇就是這么的簡單粗暴。

此外,還有一個良心建議,不論你選擇哪個框架,千萬不要試圖在windows上運行它。哪怕是號稱支持windows的MXnet或者新版Tensorflow,不要問我怎么知道……還是去裝個Linux系統吧。建議使用ubuntu14.04或16.04。

學習用機配置

OK,接下來我們就需要一臺機器去把框架搭建起來,并且去寫我們的helloAI。然而我在很多地方都看到小伙伴們在問:

我需要什么樣的配置能學機器學習?

我需要買塊GTX1080/Titan/Tesla嗎?

我應該裝幾塊顯卡?一塊?兩塊?還是四塊?

答案也傾向于:“必須得有GPU啊,至少1080,沒有四路titan你都不好意思和人打招呼”

其實,并不完全是這樣。如果僅是入門和學習的話,CPU或者GPU完全不影響對代碼和框架的學習。運行起類似Mnist或者Cifar之類的玩具數據集,其實差距也并不大。比如在我的機器上,運行自帶的Cifar demo,i7 CPU和GTX 1080 Ti的速度大概 770 pics/s VS. 2200 pics/s。GPU大概是不到三倍的性能優勢。

瞧,差距也沒那么大。

不過這里有一個小竅門,如果想用CPU版本的Tensorflow,最好不要使用pip下載的方式,而是用自行編譯的方法。因為在開發機上編譯時它會自動打開所有支持的加速指令集(SSE4.1/SSE4.2/AVX/AVX2/FMA),從而使CPU的運算大大加快。根據我們的測試,在打開全部加速指令集的情況下,訓練速度大概會有30%的提升,而預測的速度大概會提升一倍。

當然,如果真的想要使用一個復雜模型去處理實際的生產問題,模型的復雜度和數據量都不是Cifar這樣的玩具數據集可以相比的。如果用我們的一個模型同樣去運行Cifar數據集,其他參數和條件完全相同,它在i5/i7/960/GTX1080/GTX1080Ti的速度分別是(單位還是pics/s,越大越好):

19/25/140/460/620

這個時候大概就能看出差距了,1080Ti大概是i7 CPU的25倍。而在模型上線使用(inference)時,GPU也會有10-20倍的性能優勢。模型越復雜,GPU的優勢越明顯。

綜合這些來看,如果僅僅是入門時期的學習,我建議先不用專門購買帶GPU的機器,先用你現有的機器,使用CPU版本,去學習框架和一些基礎。等到你對基礎已經掌握得比較扎實,那么自然就會有跑一些更復雜的模型和更“真實”的數據的想法,這個時候,可以考慮買一塊GPU,來縮短訓練的時間。

在選擇GPU時,我聽過一些朋友們推薦GTX1070 x 2這種選擇。從理論上講,1070的性能大概能達到1080的75%,而價格只是1080的一半,從各個方面來看,似乎都是雙1070更有優勢。然而不要忘記,雙卡的性能是不可能達到單卡的2倍的,在目前的Tensorflow上,大概只能達到1.5倍上下,算下來其實和1080單卡差不多。而雙顯卡的主板和電源以及機箱散熱都需要更多的考慮,從性價比上來看未必真的劃算。

不過,如果顯卡預算剛好卡在5000-6000這個檔位,雙1070也有它的優勢。比如可以學習使用多顯卡并行計算的用法,在不著急的時候可以同時用兩塊顯卡跑兩個不同的任務,合并起來就相當于有了16G的顯存等等??紤]到這些因素,雙1070的確是最適合入門學習的選擇——如果買不起雙1080/雙TITAN的話(笑)。

如果你打算用筆記本來作為主力學習用機的話,我的建議是:最好不要,除非你使用Linux經驗很豐富或者不打算用GPU加速。很多筆記本在安裝Liunx之后出現驅動方面的問題,而且使用GPU加速時的高熱量也會非常影響系統的穩定性。如果沒有很豐富的經驗,經常會在一個問題上卡掉幾個小時寶貴的學習時間。

安裝Tensorflow時的那些坑

一般來說,嚴格按照官網說明,在干凈的系統上通過PIP安裝CPU版,都不會遇到什么問題。

新手常犯的錯誤是忘記了執行

sudo pip install --upgrade pip

導致在安裝tensorflow時找不到。

而GPU版本最常見的坑是:

忘記關閉lightdm就去裝驅動

這個不要緊,執行

sudo stop lightdm

就好了。ubuntu 16.04用

sudo systemctl stop lightdm

安裝CUDA時的第二個詢問

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 xxx.xx?

這里輸入yes是錯的!

記住輸入no!一定不要安裝CUDA自帶驅動。這一點格外重要,裝上去以后往往就卡在GUI輸入密碼界面死循環了。

入門數據集選擇

mnist?cifar?ImageNet?COCO?這些都是啥?

MNIST

不論選擇哪本教材,哪個框架,在剛剛接觸機器學習的時候,一定會接觸到Mnist(讀作M- nist)這個名字。

這是個由Yann LeCun(讀成楊樂坤,不是嚴樂村)建立的手寫數字庫,每條數據是固定的784個字節,由28x28個灰度像素組成,大概長這樣:

目標是對輸入進行10-分類,從而輸出每個手寫數字所表達的真實數字。因為它體積小(10M左右),數據多(6萬張訓練圖片),適用范圍廣(NN/CNN/SVM/KNN都可以拿來跑跑)而天下聞名,其地位相當于機器學習界的Hello World。在LeCun的Mnist官方網站上(MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges),貼有各種模型跑這個數據集的最好成績,當前的最好得分是CNN的大概99.7%。

因為這個數據集實在非常的小,所以即使在CPU上,也可以用幾秒鐘時間跑完NN的訓練,或者幾分鐘跑完一個簡單的CNN的模型。

CIFAR

而對于打算從圖像方面入手的同學,Cifar(讀做see far)數據庫(官網:CIFAR-10 and CIFAR-100 datasets)則是更好的入門選項。

這個數據庫分為2個版本,CIFAR-10和CIFAR-100,顧名思義,CIFAR-10有10個分類,每個分類有5000張訓練圖片和1000張測試圖片,每張圖片是32x32像素的3通道位圖。大概長這樣:

而CIFAR-100有100個分類,每個分類變成了500張訓練圖片+100張測試圖片,而圖片的大小并沒什么變化。

之所以說它比Mnist更適合作為圖片處理的入門,是因為它雖然分辨率低了些,但是卻是三通道,真實拍攝的照片。其中有些圖片的背景還略微復雜,更貼近我們真實的圖片處理場景。相對而言,Mnist的灰度輸入和干凈背景就顯得有些過于簡單,而且99.7%的準確率也確實很難有提升的空間。

Tensorflow給出了Cifar的例程:

https://www.tensorflow.org/tutorials/deep_cnn

并附有代碼:

tensorflow/models

ImageNet和MS COCO

至于ImageNet(ImageNet)和COCO(http://mscoco.org/),則是兩個工業級別的圖像數據集。通常我們提到他們時,ImageNet指的是ILSVRC2012的訓練集,而COCO則是COCO-2014訓練集。

ImageNet具有大量的圖片(一百多萬張,分成1000個分類)和標注,大部分都是這樣的:

COCO雖然圖片數量少一些(8萬多張,80個分類),但是每張圖片都有輪廓標記,并且附帶分類標注和5句描述話語(英文的)。大概是這樣的:

所以當我們進入實際的工作時,可以根據具體的需要從中選擇適合自己的數據集作為benchmark或者pretrain數據集。

運行一個CIFAR demo與顯卡、顯存的分配

在Tenforflow 安裝完成后,我們可以用這種方式最快地跑起來第一個Cifar demo:

git clone https://github.com/tensorflow/models.git my_models

cd my_models/tutorials/image/cifar10/

python cifar10_train.py

OK,只需幾分鐘下載數據,我們就可以看到我們的第一個“圖像識別模型”正在訓練了。

訓練過程中我們可以看到log中在不斷地輸出loss信息,但是我們除了想要跟蹤loss之外,還希望能夠看到當前訓練的模型到底識別的準確率如何,這個就不是cifar10_train.py這個腳本能提供的了。我們還需要執行

python cifar10_eval.py

這個腳本會不斷地驗證最近的檢查點的識別準確率。

如果使用GPU的話,會發現在運行起來訓練腳本之后,所有的顯存都已經被這個進程占滿,再啟動驗證腳本的話會報錯一大堆的內存不足(OOM),這是Tensorflow的機制決定的,它會默認占據所有顯卡的所有顯存,而不管自己是否真的用到那么多。

解決這個問題的辦法也很簡單。

首先,我們可以指定Tensorflow使用哪幾塊顯卡進行訓練。要做到這一點,可以在執行較本前,用命令行指定環境變量:

export CUDA_VISIBLE_DEVICES="0,2"

其中的“0,2”就是希望使用的GPU編號,從0開始,用逗號分隔開。

或者在代碼中創建一個GPUOption,設置visible_device_list=‘0,2',也能起到同樣的效果。

然后,我們可以限制Tensorflow使用的顯存,使其動態增長而不是啟動就占滿。方法和上面的類似,代碼中創建一個GPUOption,并設置allow_growth=True即可。

官方的Cifar例程大概能達到86%的準確率,這個成績在現在可以說算是比較差的了,最新的模型通常都有97%左右的準確率,即使是不仔細調參隨便訓訓,也能輕松達到93%左右,大家可以嘗試著修改cifar10.py中定義的模型,得到更好的效果。

我跑完了,然后呢?

那么,在運行完這個例子之后,其實你已經可以算是機器學習工程師中的一員了。接下來就可以收集一些自己的數據,并且訓練一些自己的識別引擎;或者嘗試著優化這個模型,感受一下所謂調參黨的痛苦;又或者直接嘗試實現ResNet、Inception這些更為先進的網絡來刷刷Cifar;再不然可以嘗試著向NLP或者強化學習方向去學習一下??傊?,這些事情遠沒有看起來那么難。

當然,不論那條路,學習,進步和自我鞭策都是逃避不掉的必修課。一個新生的領域,勃勃的生機必然也意味著新成果的層出不窮。完成我上面提到的三門課程只能讓一個人從門外漢變成圈里人,有了進入這個領域,趕上這波浪潮的基本資格,至于到底是成為弄潮兒還是直接被大浪吞沒,還是那句話,不勞苦必然無所得。努力學習不一定能修成正果,而不去努力學習,則注定是一無所獲。

對于堅強地完成了所有課程的同學們,我得說聲恭喜,我們掌握的數據來看,只有10%左右的現役程序員決定向AI轉身,并付諸了行動;而能夠完成基礎課程的人,只占了其中的30%不到。也就是說,當你完成CS231n的最后一個作業開始,你就已經站在了開發者的Top 5%之列。

在這個層面上,通常就會面臨兩件更加困難的任務:追論文和補數學。

現在的機器學習界,“ArXiv醒”已經成了癥候群,幾乎每周都會有更先進的內容冒出來,隔一兩個月就會發現很多公認的知識被刷新了,隔一兩年?簡直無法想象。所以跟蹤學術界的動態就成了從業者的必修課。哪怕作為工業實現者,如果不能第一時間掌握學術界的動態,就一定會面臨對手突然實力碾壓自己的窘境。

好在機器學習界的風氣和傳統領域的學術界有一個很大的區別,得益于鋼鐵俠Elon Musk的OpenAI組織,學術界形成了ArXiv上預印論文和開源的風氣。只是要想看懂這些論文和代碼,前面提到的那些知識,卻遠遠不夠??吹竭@種論文([1706.02515] Self-Normalizing Neural Networks)的時候,你才會真正理解什么叫“沒個博士學位都搞不了這東西”:

無論如何,感謝這開源的學術環境,讓所有從業者都站在了同一起跑線上:最新的成果不再是大公司壟斷,小公司也一樣可以彎道超車,用最先進的產品占領某個細分領域市場。

同時,這也讓所有人都變得壓力倍增:也許辛辛苦苦積累的經驗技巧模型和數據,在一個顛覆性的成果面前突然變得一文不值,隨時隨地都要面對后來者的降維打擊。

這是個讓人辛勞痛苦的領域

這是個讓人振奮鼓舞的領域

這是個讓人欲罷不能的領域

這是個讓人充滿期待的領域。

這是天堂。

這是地獄。

我們已經在這里等你,來嗎,少年?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 機器學習(Machine Learning)&深度學習(Deep Learning)資料(Chapter 1) 注...
    Albert陳凱閱讀 22,345評論 9 476
  • 陜西榆林的一名產婦,在生孩子的過程中跳樓自殺了。在看到這條新聞刷屏時,我腦海里浮現的是1月6日湘潭一母子抱...
    橋妹閱讀 315評論 0 0
  • 愛問情:緣何你我受人追? 情默不作答。 愛又問情:為何你我總相連? 情默不作答。 愛再問情:是否你我永不棄? 情默...
    葛莉芙閱讀 240評論 0 0
  • 前言 在實際項目開發中,除了Web應用、SOA服務外,還有一類不可缺少的,那就是定時任務調度。定時任務的場景可以說...
    張豐哲閱讀 29,931評論 15 57
  • “媽媽,我想要這個棒棒糖!”“媽媽,我想買這條藍色的裙子!”“媽媽,我想......” 小...
    古雅沁閱讀 550評論 0 0