前言
目前深度學(xué)習(xí)搶得了足夠的眼球和關(guān)注度,從各大公司的布局、到如雨后春筍般出來(lái)的一波波的創(chuàng)業(yè)公司,再到各種普及入門(mén)、深度剖析相關(guān)的公眾號(hào),每天都有大量技術(shù)、論文解讀相關(guān)的文章、博客等,各種各樣的信息如洪水般涌入我們的視野,各種論文解析、各種深度剖析等等,在眾多的信息中,我們?nèi)绾稳未嬲?、吸收更多的有用的信息和知識(shí)點(diǎn)是一個(gè)要面對(duì)的新的問(wèn)題。
身邊也有越來(lái)越多的朋友、同學(xué)開(kāi)始向這方面尋求轉(zhuǎn)行,覺(jué)得自己所屬的開(kāi)發(fā)行業(yè)似乎已經(jīng)是過(guò)時(shí)的技術(shù),必須要擁抱深度學(xué)習(xí)這個(gè)技術(shù)風(fēng)口。擁抱變化、追求變化是好的,但如果過(guò)味的追求風(fēng)口、追求技術(shù)熱點(diǎn)、不辯證的去看最終反而會(huì)延誤自己的發(fā)展。
“算法工程師” 還是 “算法應(yīng)用工程師”
周圍有很多朋友都是從做服務(wù)端開(kāi)始的,平時(shí)解決的很多問(wèn)題都是工程相關(guān)的問(wèn)題。我所認(rèn)識(shí)的BAT以及在國(guó)外工作的同學(xué),雖然頂著“算法工程師”相關(guān)的頭銜,但絕大多數(shù)都是直接運(yùn)用公司或業(yè)界內(nèi)現(xiàn)有的計(jì)算平臺(tái),對(duì)已有算法進(jìn)行使用,甚至很少一部分才會(huì)對(duì)現(xiàn)有算法進(jìn)行較大的改造。所以大部分人其實(shí)是算法應(yīng)用工程師,更多的時(shí)間是在處理數(shù)據(jù)、調(diào)參等問(wèn)題。
話說(shuō)回來(lái),我為什么要強(qiáng)調(diào)一下這個(gè)問(wèn)題,真的是因?yàn)樵趯?shí)際工作環(huán)境中,能夠發(fā)論文、有些突破性改造的真的是很少,大部分是組合使用。比如將原來(lái)深度模型后面掛了一個(gè)邏輯回歸,將其改為使用SVM;原來(lái)是5層的神經(jīng)網(wǎng)絡(luò),改為L(zhǎng)STM等等,目的只有一個(gè)就是解決問(wèn)題、提升效果。
所以后面會(huì)寫(xiě)一些文章,來(lái)從程序員的角度來(lái)聊聊深度學(xué)習(xí)相關(guān)的知識(shí)內(nèi)容,當(dāng)然主要是借鑒git上已有的代碼來(lái)進(jìn)行解釋。其目的有三,第一是讓廣大的做服務(wù)端相關(guān)的同學(xué)認(rèn)識(shí)到“術(shù)”的相通之處,所謂的算法工程永遠(yuǎn)離不開(kāi)工程,在工程領(lǐng)域積累的寶貴經(jīng)驗(yàn)對(duì)學(xué)習(xí)和使用算法工具大有好處;第二是和更多的人交流,鍛煉問(wèn)題簡(jiǎn)化的能力,希望能將問(wèn)題通過(guò)代碼的形式表述清楚;第三就是積累一下文檔化的經(jīng)驗(yàn),寫(xiě)B(tài)log越來(lái)越少了,希望后面能抽出時(shí)間多寫(xiě)寫(xiě),讓文筆更順暢、邏輯更清晰些。
繞不開(kāi)的工程
記得在14年還在學(xué)校的時(shí)候,那個(gè)時(shí)候從公司實(shí)習(xí)回去,經(jīng)過(guò)了雙十一、以及兩次大促的洗禮,對(duì)很多中間件產(chǎn)品都很熟悉了,對(duì)如何處理高并發(fā)、如何提高程序可用性都有了一定的認(rèn)識(shí)和提高。所以在解決實(shí)際問(wèn)題的時(shí)候會(huì)多多少少的向這方面思考一下。當(dāng)時(shí)實(shí)驗(yàn)室在進(jìn)行并行深度學(xué)習(xí)平臺(tái)搭建,就是自己搭建分布式深度學(xué)習(xí)系統(tǒng),那個(gè)時(shí)候我們還在用caffee,而tensorflow剛出來(lái)但還沒(méi)有支持分布式。做法就是傳統(tǒng)的PS模式(Parameter Server 參數(shù)服務(wù)器模式),但實(shí)際搭建的過(guò)程中遇到很多工程性的問(wèn)題,比如最開(kāi)始學(xué)生們搭建的參數(shù)服務(wù)器是寫(xiě)死的,根本沒(méi)考慮參數(shù)服務(wù)器宕機(jī)的情況。在參數(shù)傳遞過(guò)程中數(shù)據(jù)量過(guò)大的壓縮問(wèn)題,數(shù)據(jù)量過(guò)大的序列化問(wèn)題等。以如下兩個(gè)問(wèn)題為例:
- 如何保證參數(shù)服務(wù)器的高可用:
如果不知道ZK(ZooKeeper),那么真不知道會(huì)用多么復(fù)雜的方法來(lái)解決這個(gè)問(wèn)題
2.壓縮和傳輸問(wèn)題
在worker和參數(shù)服務(wù)器交互過(guò)程中,涉及到大量參數(shù)信息的同步,即worker需要將batch更新后的數(shù)據(jù)同步給參數(shù)服務(wù)器,參數(shù)服務(wù)器也會(huì)將同步后的結(jié)果下發(fā)到worker。這里面就存在很多工程優(yōu)化點(diǎn),例如向上和向下的參數(shù)傳遞如果采用原值傳遞,那么數(shù)據(jù)量是巨大的,那么采用何種壓縮算法、或者采用何種數(shù)據(jù)結(jié)構(gòu)(可以考慮差值)都是要嘗試或者動(dòng)態(tài)決定的。緩存數(shù)據(jù)如何設(shè)計(jì)才能加速數(shù)據(jù)的獲取這都是工程上要解決的問(wèn)題。
同樣在處理自然語(yǔ)言相關(guān)的問(wèn)題上,很多工程化的手段都是必須的,甚至解決的問(wèn)題遠(yuǎn)比算法本身解決的問(wèn)題要多。無(wú)論是在學(xué)校還是工作中,這樣的工程手段都是解決問(wèn)題的首選,例如在學(xué)校的時(shí)候做的一些知識(shí)庫(kù)的問(wèn)答工作,就用到了很多的搜索技術(shù)來(lái)幫助解決問(wèn)題(如QP即查詢改寫(xiě),搜索提示),利用規(guī)則引擎去解決高頻問(wèn)題等。所以說(shuō)工程手段是必須的,這也正是廣大的服務(wù)端開(kāi)發(fā)的同學(xué)所擅長(zhǎng)的,千萬(wàn)不要拋棄自身的優(yōu)勢(shì)去完全擁抱其他的東西?!凹夹g(shù)”更關(guān)鍵的在于“術(shù)”,“技”只是熟練程度不同而已,而“術(shù)”確有相通之處。
涉及內(nèi)容
后面每天會(huì)抽出部分時(shí)間來(lái)對(duì)一些git上的深度學(xué)習(xí)相關(guān)的代碼、實(shí)例進(jìn)行講解,希望能夠?qū)側(cè)腴T(mén)這個(gè)方向的開(kāi)發(fā)同學(xué)有所幫助。同時(shí)也會(huì)對(duì)一些問(wèn)題進(jìn)行總結(jié),主要會(huì)涉及LSTM、CNN、AutoEncoder、Seq2Seq,以及Computer Vision相關(guān)的主要算法(AlexNet、ResNet、VGGNet等),一些Tensorflow的常用函數(shù),常用概念的總結(jié)(如卷積、池化、門(mén)、Dropout、全連接、激活函數(shù)等)
總結(jié)
也學(xué)大量的公式和深度學(xué)習(xí)相關(guān)的論文是復(fù)雜的,讓對(duì)其感興趣的開(kāi)發(fā)同學(xué)望而生畏,但代碼是簡(jiǎn)單的、純粹的,了解深度學(xué)習(xí)、掌握深度學(xué)習(xí)從代碼開(kāi)始不失為一種很好的方式。