有一定編程基礎,請問下一步該如何進階?
我快大四了,已經修完所有課。大學期間主要參加ACM,拿過銀,自己也做過幾個項目,但是僅僅是完成任務而已。GPA不低,但是基礎知識忘得差不多了,比如操作系統的用戶態和核心態。
自己興趣在科研,不在工程,Coursera上學過Ng的機器學習,現在正在讀Bishop那本書,感覺跨度太大。嘗試投過百度演算法工程師實習,因缺乏實踐經驗被拒。現在比較迷茫,感覺大學學的東西只能幫我找到一份偏工程的實習,有點尷尬。但是為了找研發實習再去炒冷飯也覺得很厭煩。如果完全投入機器學習,感覺以前三年都浪費了,因為機器學習需要的編程基礎似乎並不強。周圍沒有跟我情況相似的人。搞前端的去學Node.js了;搞後端的github,各種框架玩得不亦樂乎;搞ACM的去找實習,成為offer收割機;GPA超高的學霸在做research,讀paper。我呢?打個不恰當的比方:網遊里已經點了一些技能,比較均勻,發現別的玩家都是往一個方向點技能,自己就不知道怎麼點了,可惜地球OL沒有攻略。有沒有過來人分享一下經歷呢?順便求建議。
先聲明,我不是搞機器學習的。但一路走來,周圍同學各種情況都見了不少,隨便胡說一些,下手比較重,題主不要噴我……
首先要噴題主兩點。
第一,感覺題主編程和演算法基礎是有了(其實應該很好,就題主的ACM經歷來說),但計算機學科還不一定學透徹了。為什麼呢?題主快大四了,說「GPA不低,但是基礎知識忘得差不多了,比如操作系統的用戶態和核心態」。沒記錯的話,大三才應該剛剛把專業課學完吧。剛學完就忘得差不多了,不太好吧。當然,題主可能是謙虛了。這裡多扯一點,我個人的一個判斷有沒有學好一門課的標準是,關上書能不能默寫出書的目錄。先寫一級標題(例如任何一本OS的書一級標題里肯定有進程管理,內存管理,IO等等),然後再寫二級標題(例如內存管理裡面一定會涉及實存和虛存,分段、分頁、段頁等等),然後可以再想想每個小標題下的知識點(例如缺頁的時候的調度演算法,LRU、LFU等等)。整個計算機領域就是一個森林,每棵樹就是一個學科,學科教材的一級目錄就是主幹,二級目錄是枝幹,然後樹葉就是具體知識。對一個學CS的人來說,心中的每棵樹都枝繁葉茂,才是合格的。先把每棵樹都種活,再想把某棵樹培養成參天大樹吧。
第二,「如果完全投入機器學習,感覺以前三年都浪費了,因為機器學習需要的編程基礎似乎並不強」。這個認識也是錯誤的。不知道題主所在學校課程設置如何,但一般來說:大一學數學基礎和編程基礎,大二學專業基礎課,大三學高級專業課。不把前三年學完,根本就不算合格的CS學生,只會編程的那是專科、技校學生 (其實人家都不止學這些)。機器學習是CS的分支,一個人如果連較為完整的CS基礎都沒有,很難想像其能做好機器學習。舉個很簡單的例子,你學過演算法,所以在設計演算法的時候你會時刻想著不要把複雜度搞到指數級別;你學過OS,所以在設計演算法的時候會想著能並行的演算法比只能串列的演算法要好。數學系的在線代、概率方面強過你,但沒學過CS的他們會考慮上面的因素嗎?再說一個更加工程細節的例子,數學系的就算學了編程、演算法,但他們學過組成原理、體系結構嗎?沒學的情況下,他們在選擇演算法的時候會考慮緩存的本地性嗎(cache locality)?quick sort和merge sort平均時間複雜度一樣,最壞情況下quick sort比merge sort要差,為什麼人們還是喜歡quick sort?(這是一個常見的面試題)
說以上兩點的目的就是,不論題主將來想往哪個方向發展,如果想發展的好,一定要打好基礎,成為一個高質量的CS專業學生。不要急功近利,不要看別人開始點技能心裡就著急。人家是點技能了,但練不練的出來是兩說的。如果自己的專長(CS)拼不過別人,弱項(像數學)又不如別人,怎麼辦?
下面回答題主問題。
題主如果基礎打好了(不只是編程哦),想往高處發展,首先要想清楚自己將來究竟想幹什麼。題主說「自己興趣在科研」,但又感覺最終是想找一個企業的研發崗位。這其實是矛盾的。真正的科研對應的是博士,研發崗位很多時候碩士就夠了。而且碩士畢業在研發崗位,很多時候也是做工程性、事務性的工作(不信可以去問問你們的學長學姐)。真正做創新、發明的,應該都是博士級別的。
這就觸及到了一個非常重要的問題,題主究竟是想要科研(對應博士),還是想要研發崗位(對應碩士)。
如果是前者,我建議樓主要仔細、認真,再仔細、再認真,再再仔細、再再認真的思考自己是不是真的要走那條路!不是說這條路不好,而是很多地方和想像的不一樣,要仔細了解、權衡之後再決定。幾句忠告:女生慎重讀博士,不要在中國大陸讀博士,讀博士老闆不要找中國人。
如果是後者,就簡單很多。有無數前人成功的經驗可以參考。很多時候自己悶頭看書什麼的是沒有用的,沒有情境(context),不一定有興趣,看了也容易忘。建議趕緊找好的實驗室,好的老闆,儘快上手。在過程中遇到不懂的、不會的,再去看。在過程中,還是那句話,要紮實,要沉得下心,不要急功近利。沒有沒用的知識,只有書到用時方恨少。
題主好像已經保研了,恭喜!如果覺得學校理想的話,趕緊開始找心儀的實驗室和老闆吧。找實驗室和老闆是個技術活。「好」並不一定對應著老闆要名聲大、文章多;同樣,名聲大、文章多的老闆也並不一定就「好」。研究生怎麼找「好老闆」,是另一個問題,知乎上應該有不少回答。題主可以參考,有興趣也可以再討論。
再說實習,題主看起來不像是想本科畢業直接工作的,所以,實習現在並不著急,先修鍊吧。(反面來說,如果本科畢業直接工作,大三結束才找實習似乎已經晚了,印象中大四開始就是招聘季了吧。)
最後,如果題主現在實在想看東西但又不知道該看什麼的話,從「性價比」來說,推薦看數學基礎書籍和配套的開放課程。前面有答主提到的,線性代數、概率論,或者更高級的隨機過程,都很好。功利角度來說,對機器學習有用。廣義來說,math is the queen of all science,學好數學有百利而無一害(尤其對CS專業)。
以上,一個痴人的瘋言亂語,自己也不敢保證說的有多少道理,題主自己選擇性接收吧(或者全盤否決也沒關係)。還是那句話,我不是搞機器學習的,隨便胡說一些,下手比較重,題主不要噴我……不過分的說題主還是有些過於心急 做過ACM了解一些基本的機器學習(文中目測 勿噴) 並不能讓你有多大的優勢 何況題主想向機器學習方向發展, 機器學習入門這麼短時間 就想著去一個高的平台發展 這是不現實的....下面大白話來聊聊拙見題主提到的 向機器學習方向發展會「浪費自己三年的時間」這個說法。 ML雖說有大量的理論知識來支撐 同時其核心是數學。但是不可否認的是ML的優勢以及價值在於實際中系統的構建以及設置合理的框架去解決問題,也就是說對ML演算法理解僅僅只是第一步(很困難的第一步)(題主對機器學習可能也就看到了這裡),更加主要的是構建一個ML系統去解決問題,然後在具體解決問題的過程中對ML更多演算法的原理 核心 構造 應用角度 以及 各個演算法之間應用場合有更深的理解 ---&> 試問 要實際去操作ML演算法 並 以其為核心構建系統 需要不需要大量的編程以及系統知識? 而其中非常重要的一點就是系統各個模塊的合理編程 -- 所謂合理就是模塊之間的運作 協調 以及模塊本身的OK -- 為了讓模塊本身OK 以前確定演算法只用了幾個周 然後選擇合適的數據結構 研究怎麼搭建合理的框架耗時數月 -- 然後實際代碼碼完測試 綜合精確度 消耗等 又糾結演算法 優化代碼..以我做的一個項目為例: 圖像搜索 基礎的演算法就是深度學習-CNN 但是實際實現這個系統 需要前端做很多工作 在LINUX伺服器上用python配置以及編寫各種介面 同時還要實現系統的核心模塊 也就是演算法分析 然後研究前後端的交互 以及 整體性能 ----- &> 以上種種 需要的就是強大的編程能力....編程所用語言有 C++ python OC Java等等 (當然是多個人在做)所以 題主不必憂心 ML本來就是工程性極強的方向 編程以及演算法的優勢有很大的體現平台
看了題主的目標和你的心態 --- 建議不要糾結工作 直接讀研 讓自己靜下來 然後繼續鑽研,到了一定程度 再來審視機器學習 --- 我說的程度是 公開課上完(題目 考試等全部通過)ML書籍讀了兩本以上 有一定項目經驗(自己 或者 別人的都行)但一定要系統的做過....
機器學習完全是道士煉丹 望共勉....在知乎上關注你很久啦。。。先近距離膜拜一下_(:з」∠)_
背景:大二,ACM鐵牌渣,ML初學者
這學期被基友帶著入坑ML,目前正在看Ng的公開課和Deep Learning Tutorials 。基友比我早入坑了半年,這半學期自己看了不少paper,現在正在跟老師做NLP,經常用各種看不懂的東西虐我::&>_&<::
其實ML這東西感覺還蠻偏工程應用的樣子(畢竟也屬於Applied Computer Science嘛),不知道你說的偏向科研是什麼概念呢?
「如果完全投入機器學習,感覺以前三年都浪費了,因為機器學習需要的編程基礎似乎並不強。」
說實話我和基友都沒有這種感覺。雖說ACM裡面的許多演算法在ML中並沒有什麼卵用,但是不得不承認ACM確實是能訓練思維,而且很鍛煉代碼能力。這樣再來看ML中的演算法和公式就沒有那麼多陌生感了,學起來也快。畢竟天下沒有白費的功夫,有些地方非科班出身的人學起來還是會吃力一些。另外,個人感覺ML對數學(概率統計、微積分、線性代數)的要求還挺高的,必要的時候還需要回頭補補課。
如果你研究生確定選擇機器學習方向,我感覺不妨趁現在的時間先深入學習一下。跟著公開課看、自己擼幾個小project都挺好的。至於實習什麼的並不用著急。等經驗攢足了再去申請也不遲。
個人一點愚見,還請大神們指教~
從科研的哲學上講:一切知識均有價值。所以在任何時候,你學的任何知識、任何技能都不是無意義的,因此沒有什麼浪費一說。喜歡這個方向就去學好啦,缺數學和統計學就看書看論文補,不用想那麼多,跟別人沒關係。當然這一切的前提是你得有時間去積累一段
Prml其實還好,矩陣運算可能是個難點,不妨下一本matrix cookbook對著找然後把公式都推一遍。其他的我印象中不少難點在mathoverflow和北美高校的作業答案里都能找著對應的部分,google搜就能找著
好的編程基礎可以讓你的機器學習之路輕鬆很多,你只需把重心放在理論學習上,實現過程的技術問題你都能輕易解決,多美好的科研之路呢~~只要是付出時間專研過的東西都不會是白費的。
大二升大三,ACM去年拿過金牌;幾乎沒有什麼項目經驗,但是玩過一些東西(做網頁、APP什麼的)。GPA總體不算高。興趣在科研,和題主比較像,我大一的時候看過Ng的公開課。
已找到導師,現在一邊打比賽一邊跟著導師做點東西。我倒覺得之前打比賽並不是浪費時間,在比賽的過程中鍛煉的編程能力也是很有用的。我看的一些論文,作者需要實現自己和別人的演算法進行對比,這些都是需要一定工程能力的。也有前輩因為程序一開始寫錯了,跑了半個月之後才發現問題然後從頭再來,耽誤了很多時間。(所以我導師也很在意學生的編程能力)
題主的糾結之處好像在於現在要找實習,然後又不想找偏工程類的實習,於是感到很迷茫。實習的話,題主可以再試試百度鳳巢、IDL 或者微軟亞洲研究院(MSRA)。
如果真的很喜歡科研並且準備往這個方向發展,建議可以找幾位學校裡面做這一方面研究的老師聊一聊,可能會得到一些不錯的建議。其實會編程對剛開始進入科研領域的人來說幫助很大,因為你可以輕鬆地將你的想法付諸實踐。
在我看來,題主一開始就讀PRML可能會不太適應,畢竟它比較偏理論而且是大部頭。我建議不妨先看點簡單一點的書。個人推薦剛剛入門的人讀讀這本: learning from data :Learning From Data (豆瓣)。 這本書把機器學習的 VC bound 和 VC dimension理論講的很好,適合初學者。另外,如果偏數據挖掘方向,韓家煒的 data mining concepts and techniques : 數據挖掘 (豆瓣),也是經典教材。這本書這本書看後面介紹數據挖掘演算法的幾章就好,而且一定要看英文版。。。
機器學習確實需要一定的數學能力。題主有餘力可以學一些數學課,比如最優化方法,矩陣理論,隨機過程什麼的。沒時間就把以前學的概率統計和線性代數好好複習一下,再稍稍看一點最優化,大多數paper中的數學理論應該還是可以看懂。
題主竟然要做科研,不妨趕緊找個老師進他的教研室。多讀paper。一段時間之後再讀PRML應該就會輕鬆不少 ~
和題主同年級,我也不能給題主提出什麼非常強的建設性建議,就看題主的興趣以及題目描述里的想法,我推薦一本書《統計學習方法》,認真的去讀完,然後去看一些博客吧,關於一些書的博客,接著注意留意一下數據挖掘演算法比賽,去參加這些比賽,對於你提高實踐能力是極好的,有的時候做的比較投入,會學到很多東西,因為題主編程的基本功肯定沒問題了,對原理掌握了,去試試手是非常棒的選擇,我覺得以題主的編程基礎,以及去看看這些東西,找一份BAT這種的演算法工程師實習還是挺容易的吧。Bishop那本書最好是和別人一起讀,可以讀完以後各自給對方講一下,做個分享,或者,就先看統計學習方法吧,我覺得你找工作,把這本書吃透,參加點數據挖掘比賽,是可以找到實習的。 題主加油!共勉。我也正在做機器學習相關的工作。
果斷讀研
說一下愚見,首先你快大四了,如果要搞科研,那當然是讀研啦。看著那些偏工程的同學收割offer 有什麼意思呢,你刷了這麼久的ACM,抄抄冷飯也可以隨便找,只不過這樣就偏離了自己的意願了。anyway,自己喜歡的才是最好的。還有一句,@小王子的答案不適合你,就事論事哈
學姐您好,我是一名大二CS本科生。現在跟你有類似的想法,希望能跟你交流一下~已經給你私信啦~謝謝!
學姐,我現在是一名大二的,從剛進大一的時候就知道你了,一直都很崇拜你,我現在很想搞ACM,可是不知道怎麼開始,也很迷茫,我想像你一樣,好好的學好自己的專業,可是有時我卻不知道要從何開始,我的目標是能夠保送讀研,我希望學姐能夠給我一些學習上的建議,不勝感激!
哈哈,來我們group做演算法吧(^○^)
你都會什麼編程技術呢?感覺你說的都是只會一點,自己都不能完整開發。
你還是先多學幾門編程技術吧,桌面、網頁、移動應用都會開發了,再學其它的就簡單了。
推薦閱讀:
※如何計算有多個起終點的最小費用流問題?
※如何理解benders decomposition在混合整數規劃中的應用?
※動態規劃和貪心的本質區別是什麼?