學習機器學習深度學習之後,還需要掌握傳統演算法和數據結構嗎?

本人數學專業本科,研究生讀的計算機,方向是深度學習相關的,在平時上課和自己自學,看論文都是深度學習和機器學習相關的。打算畢業之後從事機器學習相關工作,但是不知道學完Dl,ML的相關演算法之後,還需不需要學習傳統的數據結構,比如二叉樹,圖,隊列,棧什麼的,還有必要學習演算法導論里的演算法嗎?
如果都學的話,那感覺時間不夠,而且這些難度都挺大的。
有沒有前輩來指點一二呢?


是需要的。

很多其他答主都在談「教育」,談「自己的經歷」,這對想學習這個領域的人很難有直接幫助。事實上,機器學習和演算法、數據結構的關聯,這樣一個專業問題完全可以從專業角度來談談。

機器學習領域的學習者應當都知道,機器學習是從各種複雜的原理和技術出發,包含了很多完全不同的研究方法,比如神經網路、決策樹、SVM,而它們背後的思想常常來自於統計、概率、運籌等學科。當我們實現這些方法並將它們應用於研究時,設計良好的演算法和數據結構是非常重要的。

我舉兩個研究中的例子:

概率圖模型

以機器學習中最重要的模型之一概率圖模型來說,概率圖模型(Probabilistic Graphical Model)用到了數據結構中的來表達隨機變數之間的條件依賴,然後進行推斷或者學習。

在推斷(Inference)時用到的局部信息傳播演算法只能用於無環圖,如果圖是有環的,可以使用 Junction Tree 演算法可以把圖變成樹。當對演算法進行優化時,使用動態規劃演算法能夠通過減少重複計算來加快演算法效率。

因此我們可以看到在概率圖模型的相關研究中,包含大量所謂「傳統」演算法和數據結構中的知識:

  • 有向圖和無向圖的表達
  • 判斷圖中是否有環的演算法
  • 複雜的圖上操作:Junction Tree 演算法
  • 動態規劃演算法

空間的表達

基於度量空間中距離或相似度進行學習和決策的機器學習方法有很多,比如聚類,kNN,SVM 等等。這些方法的應用場景中往往會面對龐大的訓練集,時間複雜度空間複雜度都非常高。為了保證良好的演算法實現,「傳統」演算法和數據結構在其中佔據重要地位,比如:

  • 點的表達,樹的表達
  • 數據結構 K-d 樹的構建,及最鄰近搜索演算法
  • Ball 樹
  • 演算法時間複雜度的估算

說到這裡,傳統演算法和數據結構的重要性已經非常清晰了。

對於機器學習領域的研究者來說,不僅要了解演算法和數據結構的知識,更需要在使用它們時能夠得心應手。

而對於機器學習領域的工程師來說要想把機器學習方法應用在工作中,演算法和數據結構的意義不僅在於幫助你透徹理解這些方法:如果演算法實現得不好,或者使用的數據結構效率很低,雖然可能不影響演算法的結果,但是糟糕的實現會佔用大量計算資源,也就無法被使用在真實場景和線上環境中。


當然需要啊……

我倒是很好奇不懂基礎演算法和數據結構怎麼才能搞定各種聚類和樹型學習的演算法的……就算DL這一塊,怎麼跟進稍微新一點的Seq2Seq都是個謎……


近兩年深度學習十分火熱,對於計算機視覺領域的衝擊也很大。很多經典問題藉助深度學習的方法都有了很大的提升,深度學習的出現是否會對經典知識帶來影響?


今天,我們想借用中國科學院計算技術研究所研究員陳熙霖、北京航空航天大學計算機學院副院長王蘊紅、微軟亞洲研究院首席研究員曾文軍、北京大學信息科學技術學院教授林宙辰、美國中佛羅里達大學計算機系助理教授齊國君五位老師在最近在「微軟亞洲研究院創研論壇——CVPR 2017論文分享會」上,關於計算機視覺領域研究的觀點分享,回答這個問題。


————這裡是正式回答的分割線————

從左至右:陳熙霖、王蘊紅、曾文軍、林宙辰、齊國君


陳熙霖:如果用深度學習簡單地應對當前問題,或者是數據,也許是一個辦法。但計算機視覺其實是一個很寬泛的領域,很多問題是風馬牛不相及的,有些問題可能用深度學習確實很有效,但有些問題卻不一定會得到結論。比如,按現在經常用的識別率來度量,可能效果不錯,但事實上,運用深度學習時如果不能很好的考慮問題的背景的話,那麼很可能永遠都達不到最終的目的。


過去,因為沒有辦法做真正的視覺,我們把它分成了若干個碎片(細分),然後說這是計算機視覺。今天,在每一個碎片上,似乎深度學習取得了成功,但當我們把這些碎片拼回去時,試問深度學習是不是還能實際解決問題?我的觀點是,可能就不能了。所以這恰恰給了我們一個機會,去真正研究計算機視覺。


另外從教育來講,我們要讓學生掌握更多的知識,不能單純的用一個工具來代替一個領域。比如計算機視覺裡面,現在可能很多人都不太關注幾何、光學等知識,但其實很多重要的論文,仍然在做這方面的工作。因此,教育不可以偏廢。在過去這麼多年當中,我們看到一波又一波的浪潮,一個又一個的新工具,如果作為練習這沒有錯,但作為一個長期的研究者來講,我覺得還需要思考。


王蘊紅:作為研究者,我們應該具備很多素質。首先就是,研究問題的本質是什麼。比如計算機視覺到現在依然有很多問題還沒有克服。我們不能否認深度學習是一個好工具,在以識別率為度量標準的前提下,它取得了一些成功,但有很多問題依然沒有得到解決。


計算機視覺的傳統問題依然存在,機器學習只解決了一部分,但是有很多問題還依然沒有解決。在過去每一段時間計算機視覺都有一個發展,而每一段發展都有它非常有利的一面,但是到現在,我們需要探索的問題還有很多。機器學習所能夠做的,也是一個範圍之內的事情。


還有一點,用簡單工具來解決問題時,我們可能需要可以熟練使用軟體的技術人員。而研究人員在解決問題時,不應該把自己當成一個調參的工具,整個博士生涯中我們學到的是發現問題和解決問題的能力。在這個時候我們依然要關注到問題的本身是什麼,怎麼樣才能夠解決問題。所以任何一個工具都不是經久不衰的,但解決問題是經久不衰的,所以我們應該更多關注的是能力的培養


林宙辰:前幾年大家都非常關注深度學習,但近兩年我又看到了一個趨勢,那就是深度學習和傳統方法的結合。這個結合有兩個方面,一個是在小數據方面,深度學習並不具有非常強的優勢,但由於不是所有場合都有大量的數據,所以在很多問題上,我們還是要掌握傳統方法。

其次作為研究者來說,如果大家都會深度學習,那麼你要怎麼超過別人?當大家都處在一個起跑線的時候,你的專業知識(Domain Knowledge)就會起作用。所以我不太擔心深度學習會完全替代掉傳統方法,而將會以另外一種方式,比如,做更大的系統可以集成更多的東西。因為計算能力的增強,問題複雜性的增高,簡單的模型可能就做得不夠好,所以系統越來越複雜是未來必然的趨勢。

機器學習一般都不關心特徵是怎麼來的,但是計算機視覺裡面剛好有這麼一個部分是關於Feature是怎麼獲得的,很多這方面的問題並不是機器學習能夠解決的。


此外,有很多地方,計算機視覺會有它的獨特之處。像立體視覺就需要基於一定的物理模型,所以我們不是簡單地做一些端到端的東西就可以了。這兩個領域的融合是「自古以來」就有的,並不是新產生的現象。


曾文軍:剛才也說了,僅靠現有的深度學習,很多東西是解釋不了的。如果是更複雜的系統,用黑盒去解決它還是有很大難度的。因此,傳統的自上而下方法加上知識圖譜,再加上一些邏輯上的內容,這些都滿足了,可能才能真正解決實際的問題。


現在深度學習做的好的,都是比較細碎的東西。但真正往下做更高層次的東西,包括實際應用上的,可能更多的是視頻數據。我們感興趣的不僅僅是人,而是要知道這個人的行為,他的動作,發生了什麼事情,以及一些交互,從時序上其實是有很長延續性的東西。而這些東西現在深度學習還沒有做得很好,我們看到的也是比較局部的,一旦需要用到邏輯方面的東西,深度學習現在很難結合進來。


齊國君:機器學習在很多領域都有應用,但我覺得其中最成功、最有影響力的應用還是在計算機視覺,包括一系列的方法,比如深度學習中的卷積神經網路,這是一個純粹的視覺問題,後來才引申出一系列新的應用領域。

如果沒有具體問題,機器學習作為一個純粹的研究,可能就退化成統計問題了。但正因為有實際問題,提出了一些困難和需求,才促進了機器學習的研究。


————這裡是回答結束的分割線————


以上回答摘選自微軟研究院AI頭條,觀點 | 計算機視覺,路在何方。

感謝大家的閱讀。

本賬號為微軟亞洲研究院的官方知乎賬號。本賬號立足於計算機領域,特別是人工智慧相關的前沿研究,旨在為人工智慧的相關研究提供範例,從專業的角度促進公眾對人工智慧的理解,並為研究人員提供討論和參與的開放平台,從而共建計算機領域的未來。

微軟亞洲研究院的每一位專家都是我們的智囊團,你在這個賬號可以閱讀到來自計算機科學領域各個不同方向的專家們的見解。請大家不要吝惜手裡的「邀請」,讓我們在分享中共同進步。

也歡迎大家關注我們的微博和微信賬號,了解更多我們研究。

http://weixin.qq.com/r/PUliejrEzWeyrX4Z9xwv (二維碼自動識別)


2017/10/8,把更新放到回答的末尾處。

====以下是原回答====

不是前輩,但也來回答一波。

師兄,我覺得是很有必要的。目前大三,本科的專業是電子信息科學,準備保研到計算機。

1.找工作面試

我也學ML,自己也很喜歡,感興趣的同時也很認真學習。

我面試過一個面向深度學習圖像演算法的實習崗,首先筆試題(校招)很多常規演算法。過了筆試得到面試通知,技術面的時候面試官問了我一些基本的演算法:

面試官:「你講一講最小生成樹吧。」
我:「最小生成樹,常見的有兩種,分別是Prim"s和Kruskal"s的最小生成樹演算法,這兩種都是貪心演算法,過程是這樣的...」
面試官:「你知道最小生成樹有什麼應用嗎?」
我:「最小生成樹在電子方面的話,在布線方面有應用,有m個點都同時接通,最小生成樹能設計出最省材料的連接方法。」
我遲疑了一下,我知道面試官想聽的不是這個。我突然間想起了!!!
我:「最小生成樹的另外一個應用是聚類,利用Kruskal"s的思路,可以實現聚類。這個聚類方法叫Max-Spacing k-Clustering」
面試官:「你學過哪些聚類?講一講是怎麼實現的?」
我:「k-means...」
......

後來我的技術面通過了。

2.個人的學習

可能我是本科生,時間比較多吧。但是這兩年以來,我自己擠出了很多時間學習。

首先是專業本身的課程,我一個教授和我說的:「你們要有熱血,要恨得下心」。大三,每一門考試我都很認真對待,我的績點全系第一。

然後,為了保研,我參加了挺多比賽,也拿到了一些成績。

還有就是其他課程的學習。這一年裡,我在Coursera上完成了10門課,還有5門正在學習中。

機器學習的筆記:

常規演算法的筆記:

這兩年,幾乎所有課餘時間都在實驗室里度過了。

接下來的暑假,我還想學點前端,搭建個博客,自己寫寫學習筆記之類的!

3.關於常規演算法

推薦斯坦福的演算法課Algorithms | Coursera。老師講課講的好,分析十分到位!這門課沒有指定任何編程語言,編程作業很有趣。

這是授課老師對這門課的看法(部分截圖):

======分割線======

我的專業是電子信息,其實自身的專業課本來就有《演算法與數據結構》這門課,但是感覺自己學地很少,於是就一鼓作氣學完了整個專項課程。我很喜歡裡面的嚴謹的證明,各種數學分析,很重要的是這門課講挺注重演算法的思想,並不會局限於某個演算法。再一次明白了為什麼有人說:程序=演算法+數據結構。

還有,感謝大家的贊。現在的我正在踏踏實實打基礎,在這兩年間也做了一些項目。每天的生活大概是這樣的:起床,吃早餐去實驗室,吃午飯回實驗室,累了就趴一下,吃晚飯回實驗室,11點之前回宿舍洗澡。在實驗室主要做三件事:學習課本的知識,補充課外的知識,搞項目參加比賽。當然沒那麼枯燥,有時會跑跑步、打打球、去游泳。學習和運動佔了絕大部分。

附上前兩個月的簡歷,希望師弟師妹們不要浪費自己的大學時光!

===第一次更新2017/9/13===

第一次回答這個問題的時候,是3個多月前。很開心的是,在知乎上認識了一些師兄,他們給了我挺多建議。包括刷LeetCode、Kaggle,學習CS 231n等等。

上次回答這個問題的時候,我說要建個小站,我建好了、昨天備案好了,還有很多東西要補上去,只要有空我就會慢慢補上筆記,併當作是複習一遍,鏈接:演算法學習心得分享 - 做人沒有苦澀可以嗎

另外呢,暑假的時候,吳恩達開了新課,第一時間學習了3/5的課程(還有兩門10月初才開課)

當然整個暑假都是沒浪費的,還學習了一些文本處理、也學了一點點CS 231n的內容;專業課有數字圖像處理考了94分,最近在重新學習一遍;還參加了一個訪學項目;還有一些關於項目的...

===第二次更新2017/10/8===

已經保研了,也拿了國家獎學金。進了新的實驗室,認識了一些很不錯的師兄。


實際上是數學的落後,才造就深度學習這樣利用數據訓練做函數模擬。就像法拉第發現電磁感應,卻沒有數學知識,最後便宜了麥克斯韋。哪天《思維的數學原理》出版的時候,才能真正揭開智能的奧秘。


我不懂機器學習,只懂基本演算法和數據結構。我很好奇,如果沒有學明白基本演算法和數據結構,真的能夠理解機器學習嗎?


我認為是非常必要的!

拿深度學習來說,一套神經網路搭建好之後,對於你希望進行學習的標籤化特徵進行學習的結果可能完全出乎你的意料,本來預期能很簡單就學習出的規律完全沒有體現出來。這個時候有很多可能的錯誤來源。

例如:非線性函數的選擇;歸一化處理;神經網路的類型、層數、神經元個數;甚至是該種機器學習方法是否適合來處理這類問題。

當然你可以使用分離變數型枚舉調參等方法來對以上方面逐一檢測,但是這種檢測是帶有盲目性和低效的。

可致命的是,即便你使用枚舉調參的方法對於這個問題獲得了滿意的答案,如果你的數學與統計學基礎不夠紮實,你是無法理解為什麼把參數調整成這個形態後就得出了滿意的結果。這樣下次遇上其他問題的時候你都很難根據之前的經驗迅速設計出直接可用的模型,也就是說之前的寶貴的實踐經驗對於你來說基本是無用的。

用編程的語音來說,這樣你的「Debug時間」很可能會比一個數學與統計學基礎紮實的ML同事長出10倍,而在一些相當複雜的問題面前甚至會完全束手無策。

很不幸,真正對業界有重大價值的問題通常是複雜的,很可能涉及到很微妙的ML解決方案,在這種狀態上對於數學與統計學基礎的需求是很強的。

深度學習的知識和數學,統計學還有你所說的數據結構是密不可分的,我個人的建議是:如果希望成為ML領域的專家,對於相對年輕的朋友來說,可以先不急著直接學習ML,而是把概率論、數理統計、線性代數、微積分等學科先學透。這樣進入ML領域後你的價值和對於團隊所產生貢獻可能是不可同日而語的。


當然需要。

傳統的演算法是基礎呀,而且一般面試的時候都會被問到的。


演算法和數據結構 == Computational Discrete Mathematics,數學系出身這些都是毛毛雨啦

學演算法倒也不是說一定要去啃演算法導論,我就不覺得回答問題的人中有幾個人熟練掌握了斐波那契堆的_(:з」∠)_…遇事必言算導真是太喪心病狂了…但我覺得研究這些傳統演算法對於開腦洞真的是太有用了,也契合了這幾年DL發展的趨勢。舉些例子,TreeLSTM里就利用了數據結構中常用的n-ary tree嘛,RBM其實就是個二分圖嘛,DBM也就是奇偶層分別組成二分圖嘛,至於其他的圖模型裡面用到的類似數據結構的東西,就更多了。但我個人並不覺得這算是傳統演算法和機器學習演算法的什麼交叉,不如說是一些傳統演算法中的數據結構為機器學習演算法定義問題時提供了靈感啦,要說RBM中的CD-k演算法和二分圖匹配的匈牙利演算法有什麼聯繫,那真是半毛錢關係都沒有…

最後,沒人發現各種back-propagation, belief-propagation都是動態規劃的一種么...


謝邀。數據結構演算法之類的買一本最薄的書,大概半天就翻完了。各種知識最好都大概了解一下,等到用的時候再翻出來仔細看看。

另外,理論應付各種面試也足夠了。不足的是要多寫寫code,刷些演算法題。


很好奇你搞機器學習深度學習竟然覺得數據結構難度很大?

你能具體說說你是怎麼定義"我是搞深度學習"? 用tensorflow跑個mnist嘛?


這些難道不是你計算機學位的必修內容嗎?


題主所說的數據結構都非常基礎啊,對於本科數學系的來說,最多一個星期就秒了吧。。。至於演算法,隨便找個網課一個月也就學會了


一定是需要掌握的哦,因為:

1.傳統機器學習,在使用python,R,或MATLAB開發時,若調用現成庫,數據結構用到的不多,若需要對庫做二次開發,做各種優化,那麼為了運算效率,數據結構就大有用武之地。

2. 在深度學習技術做應用時,大多直接調用現成的演算法包,比如梯度下降演算法中各種optimizer,只需了解optimizer的基本原理,並不需特別太關注optimizer的具體實現,研究人員應該把時間精力多用在論文學習,關注模型本身即可。而在這些optimizer演算法具體實現中,為了計算效率,往往對數據結構有較高的要求,當研究人員做最基礎演算法包開發,這些數據結構的知識也是必不可少的。

3. 傳統數據結構有用在:哈弗曼樹在自然語言處理領域中hierarchical softmax模型有應用。一些聚類問題中也會用到最小生成樹這種數據結構,等等。而這些一般都封裝在演算法包中,供人調用。


我個人覺得這是必須的。曾經回答過類似的問題:2018 年應屆碩士畢業生如何拿到知名互聯網公司深度學習 offer?

直接轉貼過來吧。希望對你有用。也歡迎大家掃描我的頭像二維碼關注公眾號,獲取更多關於深度學習的知識、教材和視頻教程。

1、較強的編碼能力:這個是最重要也是最容易忽略的兩個原因:

1是,在學校做的很多事情都比較偏研究,工程實踐的能力會比較弱;

2是,很 多人覺得深度學習的大多是演算法崗,對於編碼能力不會過多的要求。答案絕對不是,工作之後是以 產出為導向,時間很寶貴,做演算法就需要實現模型,看paper,實現各種新的trick,特別是深度學習技術更新特別快,紮實代碼基礎是必須的。

可以每天規定一兩個小時刷刷題,途徑:基本的數據結構知識,C++,java,面向對象知識 -&> 劍指offer -&> leetcode or ACM的題。多聯繫可以鍛煉編碼的思維,而寫代碼在以後的工作中是非常重要的。

2、紮實的演算法基礎:

(1)最好是先機器學習、數據挖掘、NLP等類似的基礎,這樣入門比較容易,同時需要一定的概率統計的基礎,因為深度學習基礎 只是涉及挺多的。

(2)系統學習下深度學習的相關知識,最好是找些視頻教程來看:這裡推薦Yoshua Bengio和Ian Goodfellow合著的《Deep Learning》教程

(3)選擇一個細分方向,成為某個領域內比較懂行的人:深度學習在NLP、圖像、語音等很多方向都有很多應用,很多模型:CNN、RNN、DRL 、GAN等,可以選擇自己感興趣的方向或模型深入鑽研一下。

(4)多看一些前沿的論文,吸收和借鑒別人的想法和經驗,能走在技術的前沿。

3、有機會最好找個對口的崗位實習,建議實習一定要堅持半年以上,時間越長越好,抱著學習的心態,只有時間保證才能學到真的東西。切忌浮躁。 最後,加油,相信自己一定可以的。 可以看看我個人專欄「深度學習與NLP」,https://www.zhihu.com/people/lqfarmer/activities提供很多視頻教程,經典論文和教材免費下載


對於這個問題,多數已經從事機器學習(深度學習)工作的專家都會表示:當然需要!

其實學科交叉、傳統理論與新知識之間如何選擇等問題,一直都是機器學習(深度學習)領域的重要話題,上次我們講到了數據分析和統計學在人工智慧學習中的應用:

1. 想學數據分析(人工智慧)需要學哪些課程? - 知乎

2. 如果概率統計水平不高,有哪些適合的概率統計書來學習機器學習? - 知乎

以下是我們走訪了幾位 竹間智能 機器學習和深度學習專家 後,總結的部分建議,希望能對大家有所幫助。


事實上,機器學習和演算法導論差別很大。機器學習本身比較偏向概率、統計以及優化,目的是將問題透過數學的方法去描述,然後求得最佳解。不過之後的發展就滿地開花了,這個暫且不議。 而演算法導論強調的是計算的複雜度以及數據結構,比如各種排序方法的時間複雜度和空間複雜度,還有棧與隊列等。

既然兩者差這麼多,身為機器學習專家的很多人,為何還是希望熟悉演算法導論呢?

以下列舉兩點事實供參考:

1. 工作中需要

如果你是一個機器學習演算法研究員,你所從事的部分工作內容其實都會牽扯到傳統演算法,如Graphic Model,Bayesian Network等概率圖模型。這種依賴node/edge架構的, 會跟數據結構中的「圖論」息息相關。當你想要研究如何優化速度/準確率時,這些基礎的圖論知識就會很大程度上幫助到你。

如果你是一個機器學習架構工程師,那麼你的責任可能是盡己所能地讓學習更快速。尤其在深度學習上,當整體流程需要花更長的時間時,你就面臨著基礎程序的優化、數據的儲存,以及做個怎樣的排序來實現加速等。否則等到產品要上線時,你會發現即使準確率再高,速度慢的話,也是會被用戶抱怨的。另外,目前深度學習有很多框架,像 torch,
caffe, tensorflow等這些框架的底層,也用到了很多演算法導論里的基礎知識。

2. 面試時會被問到

只要是面試軟體公司或人工智慧公司,不管你應聘的是研究員或工程師,總會有一關是考你演算法導論里的東西,如排序演算法, 二叉樹等。當然如果你天資聰穎,也是可以現場花個15~20分鐘來想出一種解法的,但相較於學習過演算法導論的求職者,還是會高下立判,畢竟演算法導論是多少大牛累積了幾世的經驗啊。或許你覺得機器學習的相關工作中不會經常用到演算法導論,面試時提到這個不是沒有意義的嗎?這點上面已經提到了,還是會用到。另外,如果你會演算法,再加上機器學習的專業知識,相信也會更能勝任一些工作。

光是這些,相信大家已經有了自己的判斷。另外,還有兩點建議。

1. 如果你真心想往機器學習/深度學習方向的研究邁進,並且終身不悔的話,可以選擇不要學習傳統演算法和數據結構,去研讀工程統計學、機率、優化理論、線性代數/微分方程等基礎課程。雖然機器學習跟傳統演算法在某些地方有關聯,但不是必要關係。把這些相對重要的基礎打好,會讓你在機器學習/深度學習的道路上更順利。

2. 如果你對寫代碼感興趣,以後也有可能當個「攻城獅」,那還是去讀一下傳統演算法和數據結構吧,這對編程能力的提高確實很有幫助。畢竟這些大牛的經驗,很有可能讓你在思考怎麼優化機器學習的過程中得到一些重要的靈感。


最後,號稱竹間最強王者(王者榮耀)的機器學習專家表示:我在大學時代也曾經面臨這個選擇,當時主要研究機器學習,所以放掉了演算法導論相關課程。然後在第一年的工作中就遭遇了種種問題,直到後來捨棄了一段寶貴的遊戲時間才終於彌補上這一短板。那時我就在想,如果有月光寶盒讓我重回大學的話,就算是暑假上課補這一塊,我都願意!

以上,希望對大家有所幫助。


有了宇宙飛船了,人們也沒丟掉走路 的能力


太天真了太天真了,一聽就是一個實習都沒開始的孩子問的問題。
滿肚子若只有各種演算法數學公式,當你真需要開展項目的時候你會發現無法入手,簡單的數據處理的問題就能搞死你,別說複雜演算法的實現了,再跟著是效率,一大堆問題。
你工作了,就沒有了你上課時那樣的便利了,不是調個包跑個R就行了,大多數需要開發的東西是需要硬code的。
沒有軟體工程師的基本加點,在機器學習應用上寸步難行。除非你單純搞演算法,phd大神,那當我沒說過。


我也是數學專業畢業的。

這些傳統數據結構和演算法,會不會寫確實沒什麼,但是了解原理還是有必要的。會用即可,沒必要非得手擼代碼。

其實工作上,多讀讀論文,照著論文能把演算法做出來就可以。

科學計算常用的演算法,多數人估計寫不出來,但是不影響工作,比如:
1. 快速傅里葉變換(fft)
2. 矩陣分解(svd)
3. 並行排序(雙調排序)
4.讀寫dicom格式數據
5.隨機數發生器(正態分布,二項分布等等)

因為這些已經是基礎庫了,沒必要發明輪子從新實現,否則的話,要是sqrt,sin,cos也去自己實現,那有什麼用??

牛頓迭代,模擬退火,最小二乘,梯度下降,這些都是演算法模型,都可以用數學公式表達出來的,記住公式就可以了。

更多的時候,是針對具體問題,找到適合的方法,之後去實現。

然而沒有前人實現好的代碼,或者有GPU加速需求,免不了自己寫代碼的時候,如果了解原理的話,自己寫也不麻煩。

工作上,
一半時間在做架構,比如如何設計數據結構?如何設計通訊協議?用什麼樣的並發模型?如何保證程序穩定健壯?錯誤處理機制是什麼樣的?

另一半時間做演算法,考慮需要多少個流程?每個流程採用什麼樣的演算法?這些演算法有沒有開源實現?需要參考哪些論文?每種演算法的優缺點是什麼,?如何加速?能否並行? 適合多核還是GPU?瓶頸是計算還是io?

但是基本不會出現手擼fft,手擼三角函數泰勒展開,手擼紅黑樹這種事情。


公元前二三百年左右吧,歐幾里德搞明白了幾何學,寫了本暢銷書,the elements。一時間,學習幾何學成了很時尚的事。

一位國王也很嚮往,但覺得幾何太難了。他問歐幾里德,有沒有什麼容易的方法學會幾何。

歐幾里德於是說了那句經典名言。

There is no royal road to geometry.


推薦閱讀:

TAG:求職 | 演算法 | 機器學習 | 演算法與數據結構 | 深度學習(Deep Learning) |