同為工程師,搞算法的憑什么工資比你高?
AI 前線(xiàn)導(dǎo)讀:算法工程師到底有什么特別之處?這個(gè)崗位真的比普通工程師高一等嗎?同為工程師,算法工程師為啥工資高幾倍?從普通工程師轉(zhuǎn)為算法工程師,會(huì)有多困難?算法真的那么難搞嗎?
不知道各位程序員朋友平時(shí)有沒(méi)有想過(guò)這些問(wèn)題,不知道各位是怎么看待這些問(wèn)題的,如果你心里對(duì)算法工程師也有著各種疑惑,你一定不能錯(cuò)過(guò)今天的文章,本文的作者從兩個(gè)角度來(lái)解答了這些疑問(wèn)。
在他看來(lái):算法工程師首先要是個(gè)工程師,但是,算法工程師又不只是工程師。
是不是聽(tīng)上去有些繞,但是又仿佛很有道理?先別忙著下結(jié)論,看完內(nèi)容再評(píng)論。
上篇:論算法工程師首先是個(gè)工程師
引子
最近校招面試到吐,算法崗位有點(diǎn)太熱了,簡(jiǎn)直心力憔悴。我們的面試分兩個(gè)部分,先是做一兩道編碼題,然后才是考察機(jī)器學(xué)習(xí)的知識(shí)。很多同學(xué)不理解,在網(wǎng)上 diss 我們,說(shuō)什么機(jī)器學(xué)習(xí)基本沒(méi)有問(wèn)。這種情況,一般是代碼做的太爛了,面試官都沒(méi)有興趣去了解機(jī)器學(xué)習(xí)部分。
機(jī)器學(xué)習(xí)算法崗位,很容易讓大家有個(gè)誤解,認(rèn)為平時(shí)工作就是推推公式,調(diào)調(diào)參數(shù)。鑒于此,本文借用下我們團(tuán)隊(duì)最近的一個(gè)重要項(xiàng)目:深度學(xué)習(xí)在搜索、推薦中的應(yīng)用,來(lái)描述下平時(shí)我們是怎么干活的,看完之后,大家應(yīng)該很容易理解為何我們要求有編碼能力。
其實(shí),我們的編碼題真的很簡(jiǎn)單,不用刷題也能做出來(lái),看看其他公司出的題,已經(jīng)有點(diǎn)類(lèi)似面試造原子彈,進(jìn)來(lái)賣(mài)茶葉蛋的蜜汁感覺(jué)。當(dāng)然,他們有資本,可以通過(guò)這種方式選到很聰明的候選人。
回到正題,我們從去年年底開(kāi)始探索深度學(xué)習(xí)在搜索、推薦中的應(yīng)用,包括排序和召回。以前我們常常用和工程同學(xué)合作,對(duì)系統(tǒng)的理解,比如推薦引擎、搜索引擎來(lái)表達(dá)編碼能力的重要性,可能對(duì)于應(yīng)屆生來(lái)講,有點(diǎn)模糊。這次的項(xiàng)目經(jīng)歷可能更好一些。
先總結(jié)下指導(dǎo)思想
這大半年,我們踩了很多坑,特別是癡迷論文中的各種 fancy 結(jié)構(gòu),寄希望于換換模型拿到收益。最終都紛紛被打臉,反而是回歸到開(kāi)始,從使用更多的樣本數(shù)據(jù),改善樣本清洗、構(gòu)造的邏輯,謹(jǐn)慎選擇經(jīng)典的模型結(jié)構(gòu),對(duì)優(yōu)化算法保持敬畏等等,拿到了不錯(cuò)的收益。先來(lái)幾點(diǎn)務(wù)虛的雞湯,大概有以下幾點(diǎn):
- 對(duì)比傳統(tǒng)模型,深度學(xué)習(xí)更需要大量的數(shù)據(jù)去學(xué)習(xí),樣本數(shù)據(jù)的增加能明顯的改善模型的結(jié)果。
- 在初期,請(qǐng)忘記 paper 里面各式各樣的奇技淫巧。
- 一套有效的方案,其效果是多和少的問(wèn)題,不是有和無(wú)的問(wèn)題。
- 好好調(diào)參,比亂試各種論文 idea 有效。
- 深度學(xué)習(xí)真的可以自稱(chēng)調(diào)參煉丹師,所以比別人試的更快,是煉丹師的核心競(jìng)爭(zhēng)力。
- Embedding 太神奇,請(qǐng)把主要精力花在這里,深度模型對(duì) id 的理解可以震驚到你。
- 關(guān)心你的模型的計(jì)算效率,最終還是要上線(xiàn)的,繞不過(guò)去的性能問(wèn)題。
訓(xùn)練中的工程能力篇,就是各種踩坑各種填坑
樣本規(guī)模的問(wèn)題
一開(kāi)始,我們把現(xiàn)有基線(xiàn)的特征數(shù)據(jù)喂到了深度模型中,試過(guò) dnn、dfm、lstm 等等,發(fā)現(xiàn)效果比 lr 還差。當(dāng)時(shí)為了快速?lài)L試,將所有的數(shù)據(jù) load 到了內(nèi)存,限制了數(shù)據(jù)規(guī)模,而且有部分?jǐn)?shù)據(jù)預(yù)處理的工作也是在 python 中處理,導(dǎo)致計(jì)算在 cpu 和 gpu 之間頻繁切換,gpu 利用率抖動(dòng)很厲害。基于 tf 提供的性能工具,做了點(diǎn)分析后,判斷是特征預(yù)處理這部分移太耗時(shí)了。另外,模型的參數(shù)很大,但是樣本數(shù)不夠,急需增加樣本量。我們用 spark 將樣本數(shù)據(jù)構(gòu)造成 tfrecord 的格式,整個(gè)構(gòu)建過(guò)程對(duì)比原來(lái)基于 hive sql,再?gòu)?hdfs 拉到本地,快了近 10 倍,而且能用的樣本數(shù)據(jù)量大了很多,發(fā)現(xiàn)模型效果好了很多。
embedding id 量級(jí)過(guò)大的問(wèn)題
深度學(xué)習(xí)是在圖像、語(yǔ)音等場(chǎng)景起家,經(jīng)常在 nlp 的論文中,將幾十萬(wàn)的 word 做 embedding 稱(chēng)為大規(guī)模。工業(yè)界做 user 和 item embedding 的同學(xué)應(yīng)該笑了。userid 和 itemid 非常容易過(guò)百萬(wàn)、千萬(wàn)的量級(jí),導(dǎo)致生成 embedding lookup oom。可以參考我上篇文章:https://zhuanlan.zhihu.com/p/39774203。
有些公司會(huì)選擇對(duì) id 進(jìn)行 hash,再做 embedding,比如 tf 的官網(wǎng)就建議這樣:https://www.tensorflow.org/guide/feature_columns#hashed_column。也有些會(huì)選擇 simhash 來(lái)替換直接 hash。我們目前能做百萬(wàn)級(jí)別的原始 id,后續(xù)如果需要加大量級(jí),更傾向于只對(duì)樣本特別稀疏的 id 做 hash 或根據(jù) id 的 metadata 做重編碼來(lái)做。
Wide 模型帶來(lái)的稀疏模型訓(xùn)練問(wèn)題
大部分的 wide & deep 代碼實(shí)現(xiàn),其實(shí)用的 tensor 都是 dense 的。tf 基于 PS 做的模型訓(xùn)練,當(dāng)你的特征規(guī)模在億級(jí)別時(shí),網(wǎng)絡(luò)通信是個(gè)災(zāi)難,加上 grpc 的垃圾性能,網(wǎng)卡利用率上不去,訓(xùn)練的時(shí)間大部分都耗在通信上了。
但如果花點(diǎn)心思看看 tf 的源碼,解決方法其實(shí)很簡(jiǎn)單,采用一些 sparse 的 op 就行。比如用 sparse_gather,就能解決網(wǎng)絡(luò)傳輸?shù)膯?wèn)題。但這個(gè)不是徹底的解決方案,tf 在計(jì)算的時(shí)候又會(huì)把 sparse 的 tensor 轉(zhuǎn)成 dense 做。繼續(xù)看看源碼,會(huì)發(fā)現(xiàn) tf 自身實(shí)現(xiàn)的 embedding_lookup_sparse。換個(gè)角度來(lái)理解,天然就能支持 sparse 的 wide 模型訓(xùn)練。把 sparse 的 wide 模型理解成 embedding size 為 1 的情況,上層接個(gè) pooling 做 sum,就是我們要的 wide 的 output 結(jié)果,方案很優(yōu)雅。
分布式下訓(xùn)練速度不能隨著 batch size 增加變快
這個(gè)問(wèn)題,單純看性能分析還不好發(fā)現(xiàn)。還是去看下 TF 的代碼實(shí)現(xiàn),其實(shí)是 TF 默認(rèn)有個(gè) dimension 壓縮的優(yōu)化帶來(lái)的。TF 為了節(jié)省存儲(chǔ),會(huì)對(duì)一個(gè) batch 內(nèi)的相同的 feature 做 hash 壓縮,這里會(huì)有個(gè) distinct 的操作,在 batch size 大的時(shí)候,性能損耗很明顯。改下參數(shù),就可以取消該操作,不好的地方是浪費(fèi)點(diǎn)內(nèi)存。
還有兩個(gè)核心問(wèn)題:TF 不支持 sparse 模型和分布式下 work 的 checkpoint 問(wèn)題,這里不展開(kāi)了。
線(xiàn)上性能篇
真實(shí)線(xiàn)上場(chǎng)景與 batch size 的訓(xùn)練的差異
真實(shí)排序的時(shí)候,一個(gè)用戶(hù)過(guò)來(lái),需要精排的候選集可能有幾千。而我們?cè)谟?xùn)練的時(shí)候,基于 batchsize 方式組織的 predict 代碼。會(huì)將用戶(hù)側(cè)的 feature 復(fù)制幾千次,變成一個(gè)矩陣輸入到模型中。如果給 tf 自己做,這里就會(huì)有幾千次的 embedding lookup,非常的耗時(shí)。如果我們選擇在請(qǐng)求的一開(kāi)始,就把用戶(hù)側(cè)的 lookup 做掉,然后去做點(diǎn)內(nèi)存復(fù)制,就能大大減少 rt。
另外一個(gè)耗時(shí)大頭是 attention,這個(gè)解決方案也很多,比如用查表近似就可以。還有一些是模型實(shí)現(xiàn)的細(xì)節(jié)不好導(dǎo)致性能很差,比如 DCN 的 cross 實(shí)現(xiàn),一個(gè)簡(jiǎn)單的交換律能帶來(lái)巨大的性能提升,參考:https://zhuanlan.zhihu.com/p/43364598
扯淡開(kāi)始
上面很多工作,都是算法工程師和工程同學(xué)一起深入到代碼細(xì)節(jié)中去扣出來(lái)的,特別是算法工程師要給出可能的問(wèn)題點(diǎn)。做性能 profile,工程的同學(xué)比我們?cè)谛校悄P椭锌赡艿男阅軉?wèn)題,我們比他們了解的多。當(dāng)然也有很多同學(xué) diss,上面這些都是工程沒(méi)有做好啊,工程好了不需要關(guān)心。但是,真正的突破必然是打破現(xiàn)有的體系,需要你沖鋒陷陣的時(shí)候自己不能上,別人憑什么聽(tīng)你的,跟你干。大概率就是在后面維護(hù)點(diǎn)邊緣業(yè)務(wù)了。
難道機(jī)器學(xué)習(xí)理論不重要嗎
當(dāng)然不是,這篇已經(jīng)寫(xiě)得太長(zhǎng)了,只講兩個(gè)點(diǎn)。
信念的來(lái)源:這個(gè)其實(shí)是很重要的,一個(gè)項(xiàng)目,搞個(gè)一年半載的,中間沒(méi)有什么明確的產(chǎn)出,老板要 kpi,旁邊的同事刷刷的出效果,靠什么支持你去堅(jiān)持繼續(xù)填坑,只有對(duì)理論認(rèn)知的信念。假設(shè)總是很美好,現(xiàn)實(shí)數(shù)據(jù)很殘酷,左臉打完打右臉,啪啪啪的響。怎么一步步的接近真實(shí),解決問(wèn)題,靠的還是對(duì)理論的理解,特別是結(jié)合業(yè)務(wù)的理論理解。
工程和理論的關(guān)系就有點(diǎn)像,理論起到是指路者的作用,而工程是你前進(jìn)道路上披荊斬棘的利刃。沒(méi)有理論就沒(méi)有方向,沒(méi)有編碼能力,就只能當(dāng)個(gè)吃瓜群眾,二者缺一不可。
最后,總結(jié)下:算法工程師首先是個(gè)工程師。
PS:Don’t panic!Make your hands dirty!編碼沒(méi)有那么難。
算法工程師首先要是個(gè)工程師,不知道看過(guò)作者的這篇文章,讀者有沒(méi)有對(duì)這句話(huà)有更深刻的理解?希望你沒(méi)有被繞暈,因?yàn)榻酉聛?lái),作者又要談到他的下一個(gè)觀點(diǎn)了。
下篇:算法工程師又不只是工程師
繼上篇文章著重描述了工程能力的重要性,對(duì)于理論部分提的很少,但不代表它不重要。
談的是提升理論素養(yǎng)
理論深似海,那是人類(lèi)頂級(jí)的頭腦的戰(zhàn)場(chǎng)。
大多數(shù)算法工程師,當(dāng)講和理論相關(guān)時(shí),大多是看了點(diǎn)論文、讀點(diǎn)經(jīng)典教科書(shū),能水下 paper 已經(jīng)是很高端了。不能稱(chēng)這些是做理論,對(duì)那些真正從事理論工作的同學(xué)太不尊重了,稱(chēng)為提升理論素養(yǎng)更合適。
理論素養(yǎng)不直接等價(jià)于業(yè)績(jī)產(chǎn)出
很少人會(huì)覺(jué)得理論素養(yǎng)不重要,但提升理論素養(yǎng)的投入和產(chǎn)出之間不是線(xiàn)性關(guān)系。導(dǎo)致在工業(yè)界,經(jīng)常爭(zhēng)論對(duì)理論素養(yǎng)需求程度。比如知乎上的這個(gè)問(wèn)題:有沒(méi)有必要把機(jī)器學(xué)習(xí)算法自己實(shí)現(xiàn)一遍?(地址:https://www.zhihu.com/question/36768514)有 5k+ 的關(guān)注,100 多個(gè)回答,可見(jiàn)熱度。
雙方觀點(diǎn)其實(shí)都挺有道理,但大家特別容易 手里拿個(gè)錘子,看什么都是釘子。
現(xiàn)實(shí)中不存在一頭扎在理論學(xué)習(xí)或者工程實(shí)現(xiàn),就萬(wàn)事大吉。在二者中來(lái)來(lái)回回穿梭,試探邊界在何處才是常態(tài)。
就像生活的常態(tài)是 chaos,就像熵一樣一直增長(zhǎng),是自然規(guī)律。維持有序的狀態(tài)需要付出了額外的成本。就像 IBM 大型電腦之父佛瑞德·布魯克斯說(shuō)的:
No Silver Bullet
我們的 CEO 也說(shuō)過(guò),他是一個(gè)現(xiàn)實(shí)的理想主義,美好的理想就像有序的狀態(tài)一樣需要消耗巨大的資源,而我們的資源永遠(yuǎn)是有限的,要學(xué)著帶著鐐銬跳舞。
爭(zhēng)論的背后:ROI
我們所有人,都太追求效率了,俗話(huà)說(shuō):
一分錢(qián)一分貨,十分錢(qián)兩分貨
邊際效用無(wú)處不在,當(dāng)投入過(guò)了一個(gè)坎,ROI 就會(huì)劇烈下滑,線(xiàn)性增長(zhǎng)的 ROI 就像泡沫一樣美麗。
工業(yè)界的同學(xué),ROI 的思維已經(jīng)是生存的本能,但面對(duì)理論時(shí),有時(shí)成也 ROI,敗也 ROI,正如李沐在一篇帖子中說(shuō):
在工業(yè)界呆過(guò)再去讀 phd 可以少走很多彎路,也會(huì)發(fā)現(xiàn)很多學(xué)術(shù)界的 idea 就是個(gè)笑話(huà)。但同樣的問(wèn)題是,習(xí)慣了很 solid 的工作,反而有時(shí)候思路打不開(kāi),不敢嘗試思路新奇的點(diǎn)子。我 phd 期間比較后悔的是好幾個(gè)地方隱約有點(diǎn)想法,但太專(zhuān)注一些跟工業(yè)界經(jīng)歷很像的想法,結(jié)果后面看到別人在這些地方做出了世界級(jí)的工作。
我們和大神的距離太遙遠(yuǎn),也很少能接觸世界級(jí)的工作。更恰當(dāng)?shù)睦邮枪镜亩唐?KPI 和長(zhǎng)期 KPI 的矛盾。短期的 KPI 雖然回報(bào)高,但就像下游低端產(chǎn)業(yè),由于門(mén)檻低,很容易會(huì)變成紅海,要發(fā)展就需要升級(jí)產(chǎn)業(yè),向上游、高端的方向去,獲得更大的利益分配權(quán)。
再退一步講,浪費(fèi)一些時(shí)間、精力在不能明顯看到 ROI 的事情,其實(shí)也沒(méi)什么,反正它也會(huì)被浪費(fèi)在別的地方。意大利物理學(xué)家卡洛•羅韋利在《七堂極簡(jiǎn)物理課》中提到:
少年時(shí)代的愛(ài)因斯坦曾度過(guò)一年無(wú)所事事的時(shí)光。很可惜,現(xiàn)在很多青少年的父母經(jīng)常會(huì)忘記這樣一個(gè)道理:一個(gè)沒(méi)有"浪費(fèi)"過(guò)時(shí)間的人終將一事無(wú)成。
務(wù)實(shí)一點(diǎn),提高理論素養(yǎng)的好處還是很多的
除了以前常說(shuō)的理論是指路明燈外,還有很多其他好處。
有助于系統(tǒng)化知識(shí)點(diǎn)
工作期間,見(jiàn)過(guò)不少干的好但是說(shuō)不清楚的,在晉升上吃虧。有些同學(xué)性格內(nèi)向,不善表達(dá)。改善表達(dá)可能比較難,但可以揚(yáng)長(zhǎng)避短,從寫(xiě)東西入手,寫(xiě)東西的前提是心里有貨。好的理論素養(yǎng),能高屋建瓴將工作經(jīng)驗(yàn)、知識(shí)點(diǎn)系統(tǒng)化,更利于他人理解。
比如這篇《從 FM 推演各深度 CTR 預(yù)估模型》:
https://yq.aliyun.com/articles/614262?spm=a2c4e.11163080.searchblog.119.48912ec1Avric7
這篇文章清晰的指出:在 wide&deep 的基本框架下,上述論文都是在嘗試不同的策略去把輸入向量用一個(gè) Embedding 層接入到 Dense 網(wǎng)絡(luò)中。里面的每一篇論文我都看過(guò),捫心自問(wèn),能不能寫(xiě)出類(lèi)似的文章,遺憾的是不行。
解放思想,見(jiàn)識(shí)是阻礙我們發(fā)展的最大障礙
我司的圖像做了有一段時(shí)間,一直是單機(jī)跑模型,有時(shí)候一跑要一兩周,不少公司和我們類(lèi)似。一直也沒(méi)有覺(jué)得有什么問(wèn)題,很少去想是不是要搞分布式 GPU 計(jì)算平臺(tái)。以前的業(yè)務(wù),上分布式大部分是因?yàn)閿?shù)據(jù)規(guī)模很大。工程組也很猶豫要不要做,我們自己心里也沒(méi)有個(gè)定論,拖了一兩年。直到看了這篇文章:
https://arxiv.org/pdf/1706.02677.pdf
這才開(kāi)拓了視野,馬上就下了決心動(dòng)手干。
他山之石可以攻玉
Scott Berkun 在《Myths of innovation》提出:一個(gè)新的 idea 背后,能找到多個(gè)已經(jīng)存在的 idea。
最近把 Jared Diamond 的書(shū)重看了一遍,從《第三種黑猩猩》到《槍炮、病菌與鋼鐵》到《大崩壞 -- 人類(lèi)社會(huì)的明天》,作者兼具演化生物學(xué)、生理學(xué)、生物地理學(xué)等學(xué)科,取眾家之長(zhǎng),融會(huì)貫通,形成獨(dú)特的觀點(diǎn),寫(xiě)成如此優(yōu)秀的作品。
深度學(xué)習(xí)在圖像和 NLP 領(lǐng)域大放異彩,涌現(xiàn)出很多建設(shè)性的工作,又有多少能應(yīng)用在工作中呢?
取上者得中,這一場(chǎng) idea 的盛宴,不容錯(cuò)過(guò)。
滿(mǎn)足好奇心
深度學(xué)習(xí)的理論發(fā)展遠(yuǎn)跟不上應(yīng)用的發(fā)展,但一個(gè)個(gè)漂亮的結(jié)果背后,總是忍不住好奇它背后是為什么。
比如圖像中的 milestone 模型 resnet,沒(méi)有細(xì)看論文,一直認(rèn)為是解決了 gradient vanishing/exploding 問(wèn)題,而作者在原論文中:
https://arxiv.org/pdf/1512.03385.pdf
明確指出這個(gè)問(wèn)題已經(jīng)被 BN 和良好的 initialization 解決,resnet 解決了網(wǎng)絡(luò)層數(shù)增加后 degradation 的問(wèn)題,具體是什么問(wèn)題,作者并沒(méi)有深入。
后續(xù)這篇論文:
https://arxiv.org/pdf/1702.08591v2.pdf
更詳細(xì)的描述了這個(gè)問(wèn)題,并指出可以用 LL,不需要 residual 的結(jié)構(gòu),也能訓(xùn)練 deep 模型。
更上一層樓
現(xiàn)實(shí)世界中,很多問(wèn)題需要都不需要太懂理論就能解決的不錯(cuò)。
這個(gè)背后的力量是抽象帶來(lái)的,抽象做的好了,能讓你不用懂其原理,也能發(fā)揮它的功效。就像我們每天用的手機(jī),里面有量子力學(xué)的原理在發(fā)揮作用,但沒(méi)有幾個(gè)人懂量子力學(xué)。
隨著各種工具越做越好,越來(lái)越多的細(xì)節(jié)被屏蔽,這個(gè)情況會(huì)越來(lái)越普遍,但隨之帶來(lái)是更多的應(yīng)用可能性。就像今天的碼農(nóng)大多不懂編譯器,也不會(huì)匯編,但 IT 業(yè)卻前所未有的繁榮。
這幾年在公司,還是做出了點(diǎn)業(yè)績(jī),但水平如何,如人飲水冷暖自知。比如 58 同城上麻利電工不一定懂電路原理,懂了電路原理也不能增加每小時(shí)的薪水,和我們何其相像。居安思危,認(rèn)清自身所處的產(chǎn)業(yè)環(huán)節(jié),盡力向上游發(fā)展,而理論素養(yǎng)是其中一把鑰匙。
提升理論素養(yǎng),悟性低就多動(dòng)手
深度學(xué)習(xí)大多數(shù)論文偏應(yīng)用,對(duì)理論背景和數(shù)學(xué)知識(shí)要求不高,但就如此,理解他們也不是一帆風(fēng)順,可見(jiàn)純理論工作之難。
最近被 BERT 刷爆朋友圈,發(fā)現(xiàn)對(duì) transformer 的理解還不夠。重新回去看下這篇文章:
https://arxiv.org/pdf/1706.03762.pdf
用 pytorch 動(dòng)手實(shí)現(xiàn)了一把,發(fā)現(xiàn)了幾個(gè)以前沒(méi)有注意的問(wèn)題:
論文里自稱(chēng)可以并行,但 decoder 部分怎么并行呢,下一步的 output 總要依賴(lài)上一步吧?然而作者是直接把 ground-truth 放入。self-attention 的理解是錯(cuò)的 KQV 讓代碼都簡(jiǎn)潔了。果然資質(zhì)平庸,還是需要?jiǎng)右槐槭植拍芾斫飧啵瑖@悟性之差。過(guò)程中,花了不少時(shí)間在處理 Tensor 的 shape 變換上了,算是一種浪費(fèi)吧。
再一次,沒(méi)有銀彈
并不是把每個(gè)算法都自己實(shí)現(xiàn)一遍,就能做出更好的成績(jī)的,也不存在把公式推一邊,能找到解決問(wèn)題的靈丹妙藥。
大多數(shù)我們并不是沒(méi)有時(shí)間,反而是覺(jué)得自己在浪費(fèi)時(shí)間,而不肯投入。然而浪費(fèi)是常態(tài),據(jù)說(shuō)碳基生物的能量利用率不到 20%。再比如,公司里失敗的項(xiàng)目遠(yuǎn)大于成功的。最難的部分是不知道怎么準(zhǔn)確定義問(wèn)題。一百分的努力中,若有一二十分最終有收益,算很了不起了,沒(méi)有銀彈,只能先把量堆起來(lái),量變引起質(zhì)變。
道理易懂,行動(dòng)不易
PRML 還停留在第 5 章,ESL 買(mǎi)了后在書(shū)架上積灰,電腦下面還墊著 MLAPP(頸椎是好了一點(diǎn))。看論文的速度慢,數(shù)量也不多。但其間看了好多雜書(shū),其中還有幾本網(wǎng)文,比如大圣傳,美其名曰幫弟弟考察行情。
頭頂?shù)陌l(fā)際線(xiàn)在告訴我,韶關(guān)易逝。現(xiàn)在我常想,20 歲的我在干嘛,估計(jì)以后還是會(huì)常想 30 歲的我在干嘛呢。
如果覺(jué)得自己明天起來(lái)就能變成意志力超人,那這 30 年算是白活了。雖然很多事情不及預(yù)期,但也收獲了不少,就是這樣,不完美、掙扎、痛苦,構(gòu)成了生命的組成。只希望未來(lái)的時(shí)光,能牢記初心,切勿自甘墮落。
送一句話(huà)給自己:切勿做井底之蛙,坐井觀天,固步自封。