史丹佛自然語言處理習題課1——緒論

最老程式設計師閆濤發表於2018-11-06

對於技術人員來說,如果要問當前最熱門的技術是什麼?我想大家一定會回答是人工智慧技術。而在人工智慧技術中,哪個技術方向最火呢?大家肯定會回答是深度學習技術。如果我們要問在深度學習技術中,哪些應用方向最火呢?我想大家可能會不約而同地說是機器視覺和自然語言處理了。機器視覺自然就不必說了,比如說像商湯、曠視、Face++等獨角獸級企業,是史上成長最快的獨角獸級企業了,融資規模在幾十億以上,同時機器視覺工程師的平均年薪已經達到50萬起,由此可見這個領域有多火爆。但是我們覺得,機器視覺已經發展接近頂峰了,未來幾年很難再現像前幾年的飛速發展期了,未來的發展的會比較平穩。但是自然語言處理領域則不同,目前處於剛剛開始起飛階段,未來三到五年,將迎來進噴式發展,發展速度甚至比機器視覺還要快,因為自然語言處理應用領域比機器視覺更廣泛。因為未來的人工智慧要求更自然的人機互動、人機協同和人機融合,這就要求機器具有聽、說、讀、寫能力,而這正是自然語言處理的研究領域。

綜上所述,目前是學習自然語言處理技術的黃金時期,一方面是目前自然語言處理技術工程師的年薪已經接近甚至超過機器視覺工程師的年薪,另一方面,我們認為未來2、3年或者3至5年將是自然語言處理飛速發展期,會對自然語言處理方面的人才產生巨大的需求,現在開始學習,才能夠抓這一趨勢,成為市場上搶手的人才。

那麼我們怎樣來學習自然語言處理技術呢?我想大部分人可能會選擇學習網路上可以公開獲取到的史丹佛大學自然語言處理課程cs224n了。這門課出生名門,不僅講述基礎原論而且講述業界最新進展,同時還沿襲了史丹佛大學理論聯絡實際的傳統,這點從課程作業的選題中可以看出來。所以說這門課絕對是學習自然語言處理技術不可多得的資料,但是我們從公開渠道只能看到老師上課的視訊、課程講義PPT和作業資料,而這門課中更加重要的,由史丹佛大學這門課助教講解作業實現技術的習題課,我們就看不到了。而對於初學者來說,這些助教講的習題課才是這門課的乾貨,雖然老師講的理論和最新進展也很重要,但是我們只有通過動手實踐才能真正掌握和理解這些內容,但是非常遺憾,習題課是不公開的。

基於這種情況,我們在網易雲課堂上開設了《史丹佛自然語言處理習題課》這樣一門課程,我們在這門課中,將像史丹佛的助教一樣,向大家詳細講解作業的實現技術,使大家真正做到理論聯絡實際。講到這裡,可能有同學會問,對於CS224n這門課的作業,網上也有很多作業實現和部落格文章來講解實現細節,我們直接學習這些內容不就可以了嗎?還用學習這門課嗎?當然,直接看這些是可以的,但是由於同學們是初學者,對於網路上的這些資料,到底質量怎麼樣很難區分。另外,這些資料通常都是由在校生完成並分享出來的,而在校生由於沒有大型工程專案的經驗和教訓,他們的實現容易陷入就事論事的狀態。

比如我們來看一個例子:
在這裡插入圖片描述
在這裡插入圖片描述
這個還是一個比較著名的實現,實現的質量還是蠻高的。但是就是這樣一個實現,也是有很大的問題的。先來說一下這個實現好的地方,在這個實現裡面使用了lambda表示式、numpy apply_along_axis這樣的高階函式。但是這個實現有一個小的問題,大家看老師給的作業要求裡面,對於X的說明裡,寫了這樣一句:You are allowed to modify x in place.這句話只是一個建議,所以很多同學都把這句給忽略了。絕大多數同學在實現時都採用x = np.exp(x)的形式,但是這樣寫的會複製一個x的陣列並返回,這樣既浪費了記憶體空間同時會浪費執行時間,雖然softmax一般只用於輸出層,一般對MNIST手寫數字識別只有10個類別,李飛飛開發的ImageNet競賽也不過是1000類,計算量並不大,但是在訓練階段訓練樣本集通常有數百萬的訓練樣本,而且會學習多輪,這樣就浪費太大了。所以老師才會提醒你,你可以在x陣列裡進行修改,不必返回一個全新的陣列,但是可惜被同學們忽略掉了。當然,可能也有同學嘗試過老師提的in place方式,但是在老師給的程式碼情況下,直接使用是通不過的,需要進行一些小的修改,這點在我們課程中間會詳細講解。這就讓我們想起了西遊記裡孫悟空學藝,菩提老祖在孫悟空頭上敲三下,孫悟空就能悟到是老師讓他三更去找老師,而其他弟子就悟不到了。所以在這門課裡,我們會代領大家掌握自然語言處理技術的精髓,達到業界標準甚至更高的水平。

所以說我們這門課的價值不僅僅告訴你怎麼把CS224n這門課裡面的作業做出來,而是要給大家展示業界的最佳實踐,使同學們真正達到業界自然語言處理工程師的水平。

這裡面還有一點,就是即使像史丹佛自然語言處理CS224n這樣的精品課程,也存在由於錄課時間較久遠,課上所用技術存在過時的情況。例如,在CS224n的作業中,還是基於python2的程式碼,而我們知道Python2已經停止更新了,業界已經基本完成從python2到python3的轉化了,大家到實際工作中,基本都是使用python3了。這不得不說是一個遺憾。所以在這門課裡面,我們將帶領大家一起,把課程作業中的程式碼移植到python3。還有例如在作業1裡面,老師給我們的神經元啟用函式還是sigmoid,而我們知道,自從06年深度學習崛起之後,神經元特別是隱藏層神經元的預設啟用函式已經變為ReLU了,如果是近一兩年,還會看到很多采用SeLU啟用函式的,這一點也比較遺憾。關於這一點,我們在課程中也會向大家作一個簡單的介紹,使同學們能夠掌握最新的技術。還有一點,也是在作業1裡面,在講解隨機梯度下降演算法的時候,還採用的是傳統的BP演算法的方式,而我們知道,當前流行的深度學習框架,如TensorFlow、PyTorch和Theano等,都是基於計算圖的實現方式了,這些內容也略微有些過時,我們在課程中也會以TensorFlow普遍採用的計算圖方式,向大家講解遞度下降演算法。當然了,這門課畢竟是CS224n配套的習題課,不可能向大家系統的講解計算圖模型,如果同學們對這方面內容感舉趣,可以關注我們即將推出的《自己動手寫TensorFlow》課程,在這門課中,我們將帶領大家,模仿TensorFlow框架,使用C語言來實現深度學習的核心演算法,使用Python語言來進行資料視覺化、模型視覺化和訓練過程視覺化工作。

回到我們這門課程,我們會帶領大家使用python+numpy的方式來實現所有的核心演算法,雖然實際工作中,大家可能會使用TensorFlow、PyTorch這樣的深度學習框架來實現演算法,甚至很多人用更高層的Keras來寫演算法,但是這些框架和庫會給我們遮蔽了底層的細節,雖然使我們更容易入門,可是也使我們很難搞懂底層的數學原理和程式碼實現技術,而我們通過python+numpy的方式,自己動手完全從頭來實現這些核心演算法,恰恰可以彌補大家在這方面的知識缺陷。

如果大家對自然語言處理技術感興趣,想掌握這些演算法的底層實現原理,請關注我們的課程:史丹佛自然語言處理習題課https://study.163.com/course/introduction/1006361019.htm?share=2&shareId=400000000383016),課程目前處於連載狀態,早學的同學有優惠呦!

相關文章