【职场建议】开发转算法,我们应该如何准备(过来人的肺腑之言)
? ? ?隨著近幾年AI和算法崗位越來越熱門,很多開發(fā)者都選擇從開發(fā)崗向算法崗轉(zhuǎn)型,但是由于大家對算法崗并不是很熟悉,并且自身對算法崗所需要的技術(shù)技能也不是很了解,因此,在轉(zhuǎn)型過程中困難重重,我早在6年前也是一名Android開發(fā)工程師,那么今天我就來結(jié)合自身經(jīng)驗以及周邊同學(xué)的經(jīng)驗,來和大家聊聊如何從開發(fā)崗向算法崗轉(zhuǎn)型。
開發(fā)轉(zhuǎn)算法的優(yōu)勢
首先,我們先來說一說什么是開發(fā)崗,以及開發(fā)崗轉(zhuǎn)型算法崗的優(yōu)勢在哪里。其實,軟件開發(fā)工程師對于整個IT行業(yè)來講是一個不可或缺的崗位,也是一個相對比較綜合性的崗位。因為,對于現(xiàn)階段的軟件開發(fā)工程師來講,不僅要掌握各種編程語言,還要了解數(shù)據(jù)庫、大數(shù)據(jù)以及很多工程化的問題,甚至對于與AI相關(guān)的工程化問題在某些公司也要有所涉及,因此,在我看來,軟件開發(fā)工程師是一個相對比較綜合的崗位,實際上,這也正是開發(fā)崗轉(zhuǎn)行算法崗的優(yōu)勢所在。
很多人認為,算法崗就是搞模型、算法以及與AI相關(guān)的東西,首先我要說明的是,這個觀點是錯誤的,至少針對于大部分公司來講,這個觀點是有一定的偏差的。在企業(yè)中,任何算法都是以上線為導(dǎo)向的,而所有產(chǎn)品的上線,幾乎都跑不掉QPS這個指標,簡單來說就是每秒的并發(fā)量,就拿我們公司舉例,為了使項目能夠在線上正常的運轉(zhuǎn),一般QPS至少要求單機在2000以上,然后再橫向多級擴展,使得提升整體并發(fā)量。對于算法工程師來講,要想把并發(fā)量提高,所要解決的問題并不僅僅就是模型和算法的開發(fā)和優(yōu)化,往往,我們還需要給其他業(yè)務(wù)平臺提供相應(yīng)的組建和接口,至少,我們需要把我們的模型進行一定的打包,使外面的業(yè)務(wù)能夠調(diào)用。而這個打包的過程,一般會涉及到服務(wù)器的部署、接口的開發(fā)和調(diào)用、并發(fā)和工程化等一系列的問題,而這些往往就是開發(fā)工程師所擅長的,這也是開發(fā)轉(zhuǎn)型算法的最大優(yōu)勢。
除了上面這種純模型的算法崗之外,還有一種算法崗就是與業(yè)務(wù)強相關(guān)的,最直觀的就是就是推薦算法工程師和一些NLP工程師。我們就拿推薦算法工程師來舉例,大家都知道,任何推薦的業(yè)務(wù)都是作用于產(chǎn)品之上的,在目前互聯(lián)網(wǎng)技術(shù)中,這些產(chǎn)品一般都會被存入到大數(shù)據(jù)倉庫中,當(dāng)我們做推薦系統(tǒng)的時候,還需要考慮到數(shù)據(jù)的實時性,因此,對于一個合格的推薦算法工程師來講,不僅要對推薦算法本身有著足夠的了解,還必須對推薦算法所涉及到的周邊知識和技術(shù)比較熟悉才可以,例如,當(dāng)我們需要做實時推薦系統(tǒng)的時候,我們需要去了解kafka和flink等相關(guān)技術(shù),當(dāng)我們需要快速的存取時,可能還需要對redis等內(nèi)存數(shù)據(jù)庫做一定的了解,如果要是想要對redis進行數(shù)據(jù)落地,可能還需要了解一些pika等相關(guān)的知識。我們可以發(fā)現(xiàn),這些內(nèi)容都是推薦算法工程師要做的,但是卻和各種工程方面的內(nèi)容有著非常緊密的聯(lián)系,因此,對于這種以業(yè)務(wù)為導(dǎo)向的算法工程師來講,除了關(guān)注業(yè)務(wù)本身以外,還需要關(guān)注工程內(nèi)容,而這也是一名軟件開發(fā)工程師所擅長的。
上面的幾個例子,實際上都可以很好的說明,算法工程師與開發(fā)工程師實際上是有非常緊密的聯(lián)系的,因此,首先我們需要肯定的是,算法工程師轉(zhuǎn)型到AI工程師是可行的。但是具體要怎么做呢?
實際上,算法工程師與開發(fā)工程師的本質(zhì)差別還是在對算法的研究上,而這個算法的研究實際上是一個非常廣義的內(nèi)容,而我們這里所講的算法工程師,一般可以理解為與AI相關(guān)的算法工程師。一個AI算法工程師,主要需要包含以下三種能力,這也是開發(fā)在轉(zhuǎn)型算法工程師的時候的必修課。
框架的學(xué)習(xí)
目前AI領(lǐng)域的算法工程師一般都要求對深度學(xué)習(xí)和機器學(xué)習(xí)框架有著比較深入的理解,因此,學(xué)習(xí)相關(guān)框架是算法工程師必須要面對的一個坎。
在AI領(lǐng)域中,算法工程師常用的框架一般有TensorFlow、Pytorch和Keras。幾乎在所有算法工程師招聘的需求中,都要求具備以上者三個深度學(xué)習(xí)框架中的一個或多個的能力。實際上,很多人在轉(zhuǎn)型算法之初,看到很多深度學(xué)習(xí)的框架都喜歡打退堂鼓,但實際上,我們在學(xué)習(xí)任何一種框架的時候,基本上方法都是一樣的,深度學(xué)習(xí)也不例外。
在學(xué)習(xí)深度學(xué)習(xí)相關(guān)框架之前,建議先了解一些深度學(xué)習(xí)的相關(guān)概念和機器學(xué)習(xí)的相關(guān)概念,然后先把官網(wǎng)的一些教程拿過來練練手。對于一個有其他語言開發(fā)經(jīng)驗的同學(xué)來說,我建議大家邊練手邊看基礎(chǔ),而不是先把深度學(xué)習(xí)和機器學(xué)習(xí)的所有概念都看一遍然后再去系統(tǒng)的學(xué)框架,然后再練手,這樣的話首先時間會很長,其次,實際上到最后你會發(fā)現(xiàn)很多東西你都記不住。
在我看來,最好的學(xué)習(xí)方法是:
1、花2周的時間來看一下機器學(xué)習(xí)和深度學(xué)習(xí)的基本概念和模型,如果有配套的代碼就跟著敲;
2、去系統(tǒng)的學(xué)習(xí)TensorFlow或者pytorch框架中的一種,去一些wiki類網(wǎng)站上學(xué)習(xí),只需要了解怎么用,以及常用的函數(shù)即可;
3、去找一些簡單模型的實現(xiàn),比如TensorFlow版本的textcnn模型、pytorch版本的RNN模型和LSTM模型等的實現(xiàn),研究這些模型如何使用深度學(xué)習(xí)框架實現(xiàn);
4、去GitHub找?guī)讉€相對比較完整的且不是很大的項目,然后去看他是怎么實現(xiàn)的,在這里如果NLP的話,推薦文本分類、智能客服類的項目,如果是CV的話,建議看一些圖像分類的簡單項目;
5、然后重復(fù)第4步,一直保持良好的代碼能力,熟能生巧;
數(shù)學(xué)基礎(chǔ)
數(shù)學(xué)可以說是算法工程師的必修課,開發(fā)的功底決定你走的有多廣,而數(shù)學(xué)功底則決定你做的有多深。
在我們研讀論文的時候,經(jīng)常會遇到很多非常繁雜的數(shù)學(xué)公式,對于一些只是想了解這個模型,或者用這篇論文里面的模型的人來說,對數(shù)學(xué)的要求其實并不是很重要。但是當(dāng)你的需求從用變成改的話,那么數(shù)學(xué)則變得格外的重要了。
很多時候,我們通過論文里面的公式可以了解整體的推導(dǎo)過程,并對里面很多參數(shù)的定義有了更深入的理解。一般來講,對于那些需要出研究成果的同學(xué),就需要把這里面的每一個細節(jié)研究的非常細,需要去推導(dǎo)里面的各種邏輯關(guān)系和數(shù)學(xué)公式,甚至通過自己動手優(yōu)化,來提高模型的性能,而這些實際上都是需要數(shù)學(xué)基礎(chǔ)的。
在AI算法領(lǐng)域中,我們常用的數(shù)學(xué)主要是線性代數(shù)、概率論和高等數(shù)學(xué)。
AI算法中的大部分算法都是跟矩陣相關(guān),而線性代數(shù)實際上就是一門專門針對于矩陣進行研究的學(xué)科,因此,學(xué)好線性代數(shù)有助于后面在做深度學(xué)習(xí)關(guān)于矩陣和張量部分的內(nèi)容的深入研究;概率論對于深度學(xué)習(xí)來講,也是一個必不可少的內(nèi)容,在深度學(xué)習(xí)里,充斥著各種與概率論相關(guān)的算法,例如最常見的就是樸素貝葉斯算法;高等數(shù)學(xué)則一般運用于數(shù)學(xué)的推導(dǎo)中,各種積分推導(dǎo)都要用到高等數(shù)學(xué)的知識,最常見的就是BP算法。
另外,在這里我想跟大家安利一本書,就是《具體數(shù)學(xué)》這本書,這本書的話,實際上就是對計算機中常用的數(shù)學(xué)有了比較深入的總結(jié),當(dāng)然,看這本書的難度也是非常大的。
論文閱讀和代碼復(fù)現(xiàn)能力
可以說,閱讀論文是算法工程師的必修課,算法工程師與開發(fā)工程師最大的區(qū)別是,算法工程師需要通過對大量的論文進行復(fù)現(xiàn),從而確定最終的擬選用模型,然后再加以改進或直接使用,而對于論文的復(fù)現(xiàn),一般我們就需要能夠看得懂論文。
舉個例子來說,我們的時間前段時間在做圖像超分辨率這個領(lǐng)域的內(nèi)容,那么我們所做的第一步就是去找最近兩三年內(nèi)在頂會上的比較優(yōu)秀的超分辨率相關(guān)的論文,然后再去GitHub上找到論文所對應(yīng)的官方代碼來驗證我們的想法,但是有的時候,我們可能需要去指定特定的開發(fā)框架(例如TensorFlow),而開源的代碼中卻沒有這種框架的代碼,只有pytorch版本的代碼,這個時候我們就必須要自己使用TensorFlow進行手動實現(xiàn),這時,我們就需要把論文讀懂,才可以更好的復(fù)現(xiàn)代碼。
因此,論文閱讀能力是開發(fā)轉(zhuǎn)算法過程中必須要準備的點,在這里,英語是必不可少的環(huán)節(jié)。一般我們可以通過以下幾個步驟來準備:
1、找一篇相對簡單的論文(例如文本分類方向的),然后試著去讀懂它(主要是網(wǎng)絡(luò)結(jié)構(gòu)部分)
2、找到論文的相關(guān)復(fù)現(xiàn)代碼,并讀懂它;
3、試著自己用其他框架來復(fù)現(xiàn)它;
4、重復(fù)上述1~3步驟
算法式思維
開發(fā)和算法的同學(xué)其實在邏輯思維上會有比較大的不同。對于開發(fā)的同學(xué)來講,主要是以解決問題為出發(fā)點,而對于算法的同學(xué)來講,一般解決問題的方式會有很多,但是必須要選擇一條既快又好的路,這是算法工程師需要具備的能力,對于這一點其實也是在轉(zhuǎn)型過程中需要長期積累的過程。
算法的同學(xué)一般會碰到兩種問題,第一種就是已經(jīng)有了代碼,要去優(yōu)化它。例如,現(xiàn)在我們在做推薦系統(tǒng)時經(jīng)常會使用到一種算法叫協(xié)同過濾,如果說基于item的協(xié)同過濾,用正常的協(xié)同過濾算法當(dāng)數(shù)據(jù)量增大的時候,就會導(dǎo)致內(nèi)存爆掉,實際上我們可以通過優(yōu)化協(xié)同過濾中的對稱矩陣,來降低時間復(fù)雜度和空間復(fù)雜度,從而解決這一問題,而這種解決問題的能力,實際上就是算法工程師必須要具備的能力和思維,說白了,就是找到代碼中可以優(yōu)化的點,然后進行優(yōu)化,從而達到最終的目的。很多從開發(fā)轉(zhuǎn)型過來的同學(xué),在這個方面經(jīng)常會吃虧,因為很多時候,就是用傳統(tǒng)的開發(fā)的思路來解決問題,不會去注重里面的時間復(fù)雜度和空間復(fù)雜度,因此,這一點是要著重注意的。
第二種情況就是,我們還沒有代碼,但是有一個需求讓實現(xiàn)。例如我們在做圖像超分辨的時候,網(wǎng)上一般都是針對于三通道大圖像的超分辨率模型,但是如果業(yè)務(wù)中需要的是4通道的小分辨率的圖像進行超分,我們需要怎么去做,才能夠解決這個問題。作為開發(fā)的同學(xué),一般的做法就是找到一個類似的解決方案,然后套上去,不斷的嘗試,從而解決問題;但是到了算法崗,實際上就會有另外的一種思路,那就是,我先研究相關(guān)的論文,然后去把論文進行復(fù)現(xiàn),然后再看看哪些點的改進可以用在自己的需求上,然后再把自己的數(shù)據(jù)套進去,并做模型更改的嘗試,從而完成整個的需求。這種情況,實際上也是開發(fā)工程師在轉(zhuǎn)型算法工程師中經(jīng)常會遇到的問題。
因此,算法式的思維對于開發(fā)轉(zhuǎn)算法來講,是格外重要的。
?
開發(fā)轉(zhuǎn)算法,說容易也容易,說難也難。上面是我所總結(jié)的幾個點,希望通過我的總結(jié),能夠幫助大家,也歡迎大家在下面的留言區(qū)留言。
最后,祝大家轉(zhuǎn)型成功!
END往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯AI基礎(chǔ)下載(pdf更新到25集)機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085,加入微信群請掃碼喜歡文章,點個在看總結(jié)
以上是生活随笔為你收集整理的【职场建议】开发转算法,我们应该如何准备(过来人的肺腑之言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见算法的python实现(Github
- 下一篇: 【Python基础】Python3十大经