UCSD 21 Winter 回顧

Shun
13 min readJun 8, 2021

--

這是轉學之後的第二個學期。

這學期仍舊籠罩在COVID的陰影下,所以生活上仍然處處受到限制,生活心態上已經習慣了學校的進度與作息,漸漸上軌道了,熬夜的次數也比上學期少很多,算是已經習慣Quarter System並且能夠好好規劃自己生活了。

這學期給自己的目標有兩個,一是增加一些Project經驗,至少在學期結束要能在LinkedIn上面多貼兩筆活動紀錄,第二個目標,就是在這所陌生的學校裡認識一到兩位教授。

課程

這學期總共修了五堂課,分別是:

Math 181A Mathematical Statistics

CSE 100 Advanced Data Structures

CSE 105 Theory of Computation

ENG 100D Engineering Design

LIGN 165Computer Linguistics

前三門是Major必修課,包含數學系的數理統計,CS必修的資料結構、以及Thoery of Computation,另外兩堂課算是選修,一堂是工程設計課,一堂語言學。下面會針對這些課有更詳細的介紹,並附上一些學習時對我有幫助、我覺得實用的資源。

課程介紹

CSE 100 Advanced Data Structures 進階資料結構

CSE 100 雖然叫進階資料結構,上的內容其實就是經典的資料結構,從Linear到Trees再到Hash & Graphs。這堂課幾個比較特別的主題,不知道是不是因為教授主修Bioinformatics的關係,有稍微提到一些String Processing Data Structure,並且常常拿DNA序列舉例,這是少數我在其他DS課沒看到的主題,但總而言之,這算是一堂中規中矩的Data Structure課,當然,只要寫過一點Code都知道資料結構的重要性,因此,CSE100非常適合想要刷題找工作的學生,絕對是CS必修課裡最重要的前三名。

我的老師是一位非常年輕的教授,他一路從我們學校拿到BS, MS, 再到PhD,可能因為太愛這間學校了,就順理成章地留下來教書。而他的教學主張就是在傳統MOOC的單向Lecture之外再加上許多互動式模組/Office Hour輔助學習,所以我們用的是他自己寫的課本,搭配教學影片,課堂時間則是翻轉教室的解惑區,他的教學方式也很適合遠距學習,因為大部分的內容都已經被放到網路上,可以自己排時間看。學校也安排了密密麻麻總共20位助教讓我們問問題,助教的時間幾乎Cover到美國時間白天8AM–4PM總共8小時,等於在學期間幾乎任何時間,點開Zoom,都有On Call助教可以問問題,我是到學期一半才第一次點開這功能,請助教幫我Debug Code,結果一試成癮,後半學期幾乎天天報到,小至看不懂的課文,大到整份代碼端過去問助教,總之既來之則安之,有這種服務就盡量用。

課程的內容本身其實沒有什麼特別的,資料結構在全世界任何學校教起來都一樣,但我們學校最近兩年主張回歸教學本質,著重在理論方面,所以資料結構這堂課經過兩三年的改版洗禮後,已經把許多複雜的作業、大型Project都刪掉了,教授上課時也會著重在一些證明上。好處是不需要花時間處理一些適應性的問題,壞處是比起像柏克萊CS61B裡滿滿天馬行空的大Project,我們作業就只是一些較單調的Data Structure實踐,但十週之內要完成8個作業,難度其實也很高,每份作業都要花上5–10小時左右才能完成。個人覺得這堂課設計上雖然沒什麼新意,但是滿踏實的,尤其是本校生一路從大一上來,這堂課是設計在完全沒有學過C++的狀況下用C++寫出所有的作業,我覺得還是有一定難度的。

另外非常推薦老師自己寫的課本,放在互動式平台Stepik上,用這本書搭配網上的作業基本上就能自學完這整堂課了。另外,UCSD在Coursera上還有另一個Data Structures Specialization上課的內容也跟這堂課一樣,也是一個可以參考的資料來源。

這堂課推薦的課內/課外資源:

(如果不是UCSD學生,以上兩個資源搭配起來就能自己完成這堂課了)

十小時的 C++ Tutorial,這個Playlist適合寫過程式,但對C++不熟或忘記的學生,我大概花了半天快速掃過這系列影片。這老師的口條不錯,也可以針對自己忘記的C++特性稍微看一下,一些小主題像是const keyword的特性、OOP設計等等都講得不錯,可以把這系列當成一個簡單的C++ Primer。

這系列比上面那堂更深入一些。Cherno是一個超強的遊戲工程師,他的影片會針對一些C++ 11、14之後的特性補充講解,CSE100需要大量使用的STL也能在這找到適當的補充,這系列影片適合針對某個小觀念搞不清楚時,又不想讀documentation的話可以看看。

另外有些Data Strucutre 搞不懂的時候,建議可以上YouTube直接搜尋那個Data Structure並看看其他人是怎麼解釋的。DS這個主題非常熱門,網路上有超~多~教學影片,有時候可能只是當下腦袋迴路卡住,聽不懂教授的解釋,但換個人解釋或看個圖,就能瞬間看懂了,所以非常推薦遇到不懂的觀念時,善用YouTube和Google。

CSE 105 Theory of Computation 計算原理

這堂課可以說是整個CS Degree裡最理論的課,翻了一些台灣的翻譯,有學校把這堂課稱為「正規語言與自動機」正好是這堂課介紹的兩大主題:Regular Language and Automata。一言以蔽之,CSE 105要解釋的就是「計算機到底是什麼,有什麼能力,要怎麼定義什麼叫計算機」並且透過介紹正規語言以及自動機去解釋計算機的極限。

這樣講或許很籠統,沒學過的人可能會想,語言跟電腦到底有什麼關係,很多人上課的時候會覺得CSE 105就是一堂充滿了證明與定義的課,我覺得要學好這門課,很重要的一點是要時時提醒自己整堂課的脈絡,舉例來說,我們用的課本是這個主題最熱門的一本課本,MIT教授Michael Sipser寫的Intro to Theory of Computation,我非常喜歡這本教材,並且強烈推薦想要學好這門課的所有學生讀讀看這本書。課本作者建立了很強烈的脈絡,從最基本的自動機Finite State Machine一路到運算能力更強、當今最完善的Turing Machine講解什麼是Turing Complete最後衍伸解釋Time And Space Complexity和計算機界的大哉問P/NP。書中建立了一條Storty Line解釋計算的原則,並且人類不滿足於當前的Computing Power並試圖定義/建立出一套更強大的「計算機」。基本上:「介紹某工具A > 工具A的限制 > 更強大的工具B用來補足A >再循環」如果掌握了這個脈絡,對於寫證明或是理解概念街皆非常有幫助。整堂課下來我非常享受CSE 105的內容。雖然這堂課對於要成為Software Engineer的大家幾乎可以說沒有直接幫助,甚至被我許多同學稱為超沒用的廢課,但我覺得這是一堂能讓你大開眼界的課。而且,這門課使用了很多(相對)嚴謹的數學語言,可以當成測試自己對於Theoretical Computer Science 和Math有沒有興趣的指標,如果對於這堂課的作業證明不排斥的話,之後可以考慮往這個領域多試試。

針對我上的CSE105而言,我的教授是個數學系來兼任授課,因此上課的內容非常著重於手寫證明,用很很多數學語言。根據往年這堂課的開課紀錄,大概有三四位教授輪流授課,其中Mia Minnes和Mile Jones兩位教授都有把自己的課程影片/網站留下,他們兩位教學品質都非常高,如果你修到不好的教授的話,非常建議到UCSD Podcast搜尋這兩個老師的版本,用來參照你的內容,網路上同樣主題的課程也很多,建議善用網路。

最後,如果對於CSE 105感到心灰意冷的話,也不要灰心喪志,因為Computation Theory雖然在很多學校是必修,但近幾年很多學校都改成選修了,畢竟多數CS學生其實都不太會想花時間在Theory上,我猜UCSD也許幾年後也會把這堂課改成選修吧。

Computers and Languages 電腦與語言

我會修這門課單純是想認識這個教授,結果不出所料,這堂課成為我在UCSD,甚至是整個大學生涯最喜歡的一堂課。

Computational Linguistics 是近幾年崛起的AI當中的一個分支,其中最熱門的領域包括語音識別、NLP等等,皆是處理語言跟電腦交織的學問。當然就算這樣說,這領域還是牽涉很廣。語音識別來自訊號處理,是由極複雜的數學背景支撐,而一個小小的Natural Language Task、因為牽扯到語調、語態以及種種語言學的Domain Knowledge,常常就是一個博士生一生的研究了,這堂課其實算是一個快速認識這領域的Intro課。 總共10週,前五週針對語音識別,後五週解釋NLP的能力與限制,最後Final Project則是沒有任何限制,但教授提出了一個結合了兩樣我們前面所學的東西:智慧音箱。簡單來說,前五週我們學習電腦如何處理聲音,後五週我們學習電腦如何處理文字,而智慧音箱正好是應用這兩項技術結合再一起的結晶:當你對Siri下一個指令,從待命 > 錄音 > 識別>理解 > 搜索 > 組織回應 > 機器念出回應,這幾個過程,每一個環節都充滿著Computational Linguistics的智慧。而Final Project也可以自己挑一個相關主題並寫一篇Research Paper來交作業,我選擇針對迷因(搞笑圖片Meme)的語法分析來寫這篇Research Paper,足足花了一個月的時間跟教授討論,學習怎麼使用NLTK以及數據分析,算是一次收穫豐富的經驗。(這裡有些專有名詞其實我不是很清楚中文的翻譯,僅大略翻譯)

整體而言我超愛這堂課,其中一個原因當然是因為這門課的教授William Styler是一個超級友好而且充滿熱忱的學者(RMP超過30則評價還 5/5的教授),他不僅上課內容有趣,對學生發問也不曾感到厭煩,每次Office Hours都擠滿跑去聊天的學生,可以說是少數我見到完全零負評的教授。

ENG 100D Design for Development 設計…不會翻

幾年前台大開了一門課,名叫「臺大解決問題理論與實務」,號稱當年最熱門的一門課,學生擠破頭想搶著旁聽,主打實務結合學習,讓學生分組跟公司行號、新創團隊合作開發產品,解決問題,並在學期末時有一項能放上履歷表上的實務經驗。

ENG 100D跟臺大那堂課正好一模一樣,不過ENG 100D早了幾年,更是一系列的課程,我修的這堂課是系列的第一堂,著重在教團隊合作、Design Process以及Project Management,在課堂期間跟一個團隊合作進行小項目。在完成100D之後還有Lab能讓你繼續跟合作的團隊工作,進到Lab之後就沒有上課了,而是單純跟指導教授Meeting,並且每週與合作團隊匯報進度。

這堂課人數不多,大概在30人左右,並把你分配成小組,每個小組會和本地的NGO匹配,並在10週的過程當中讓你們合作解決一個專案。每週的上課會教一些Project Mangament和Human Center Design的技巧,內容其實不算特別新穎,包含Agile、Waterfall、介紹Prototype Methods跟,但上課只是其中一小部分,這堂課的Crème de la crème在於團隊合作解決問題的部分,每個團隊在學期初,教授會給我們一個名單裡面是Target Groups,並讓我們寫出自己的志願序,最後根據這個名單搭配選出我們合作的對象。我們這個學期當中合作的組別分別有:某市政府的職訓局、聖地牙哥某動物收容機構、位在巴基斯坦的非政府組織,還有在墨西哥推廣Meditation的新創公司。我們的工作就是和他們聯繫,並幫忙解決問題(也許是寫一個網頁、SEO、投擲廣告、Database建立之類的,端看那組組員的能力值以及野心決定)。

但我覺得這堂課存在一個很大的問題,其實這些合作的公司/團體都知道我們只是學生,很多也是基於社會服務之類的而和我們合作。我有遇到一個團隊,專門為了一個社會團體寫了一個排班系統,結果在團隊離開之後這個軟體就停止使用了。不過我覺得這是學校的學制關係(一學期只有十週)導致Project Scope 沒辦法太大,基本上第二週之後我們就進入Interview + Ideation,第四到第六週Prototype,第七第八週Feedback + Improve,最後兩週的時間剛好讓我們準備Pitch Deck以及Product Deliver,並且這當中每週都要跟教授1:1 Group Update趕進度,因此我覺得這堂課其實還是學得到東西的,只是很趕。對於非常純粹的工學院學生,又不想上管院的Project Management,這堂課應該是個不錯的選擇。

MATH 181A Mathematical Statistics 數理統計

這堂課是進階版的統計,算是UCSD 大學部統計相關課程裡最難的一門課(據說啦…我自己覺得Time Series難多了)。

UCSD另外有開一門Math 183,是比較簡單的統計課,而這堂「數理統計」是數學範疇裡比較正式的名稱,指「用數學手段去分析統計手法」的統計學,講白話文就是一堆積分在那裡證明檢定假設之類的啦。

(下半部是就我對Mathematical Statistics的理解而寫的,不保證完全對,建議讀者Take my words with a grain of salt)

「數理統計」之餘「統計學」,就像「分析」之餘「微積分」,就是真的去分析統計公式背後的原理,為什麼算術平均的公式是加起來除下去,變異數的公式是怎麼推導出來的,這一切其實要先從機率論開始講起。其實我們修過機率論會發現,機率裡面很多假設是建立在非常完美的狀態下,「每小時固定五個客人的星巴克(泊松分布)」、「生男生女各一半」等等,這些題目裡的Distribution都是在有Parameter的完美狀態下,去假設下一個數值是根據這個Parameter所建立的。然而現實世界不是如此,仔細想想,「全國平均身高」難道真的把全國每一個人抓來量嗎?肯定沒有,往往我們只能根據收集到的數據去做Inference,那就是Inferential Statistics在做的事情,而統計學的最終目標就是要由收集到的小數據去推出整體,甚至進而預判未來的趨勢,這正好就是機率論的相反,我們假設「整體」是有一個「規則」的,機率課裡面的題目開宗明義就跟你說「規則」是什麼,數理統計則是反過來假設存在規則,要你去推出規律是什麼,並且用(比較)嚴謹的數學證明去解釋統計學公式,而這其實就是所有統計公式的由來的由來,而當然這個取樣就算再怎麼具有代表性,還是會存在著誤差,因此就有了其他工具。

這堂課要求你要先修過180A的機率論,並且有足夠的數學成熟度(mathematical maturity)面對一些統計學上的證明,老實說第一次看到一堆Sigma疊再一起真的會很怕,相較之下修過實分析的學生就會覺得這堂課容易多了。

我自己印象比較深刻的幾個主題包含:Maximum Likelihood、Naive Bayes這幾個是在AI Algorithms裡很常被拿出來用的主題。至於學期中段講到的Hypothesis Testing,可能是我慧根不足,其實不是很能解到其中的深意,可能還要等下學期修過181B之後才能再把這部分補足。

--

--

Shun
Shun

No responses yet