標籤:

吳恩達機器學習第五周課後感

目錄

一、主要內容

二、個人感受

三、實際應用

正文

一、主要內容

1. Neural Networks: Learning

《Cost Function and Backpropagation》

Cost Function

Logistic regression:

J(	heta)=-frac{1}{m}left[sum^{m}_{i=1}y^{(i)}log h_	heta(x^{(i)})+(1-y^{(i)})log(1-h_	heta(x^{(i)}))
ight]+frac{lambda}{2m}sum^n_{j=1}	heta^2_j

Neural network:

J(Theta)=-frac{1}{m}left[sum^m_{i=1}sum^K_{k=1}y^{(i)}_klog(h_	heta(x^{(i)}))_k+(1-y^{(i)}_k)log(1-(h_	heta(x^{(i)}))_k)
ight]+frac{lambda}{2m}sum^{L-1}_{l=1}sum^{s_l}_{i=1}sum^{s_{l+1}}_{j=1}(Theta^{(l)}_{ji})^2

對於神經網路的損失函數的分析,可以從兩種不同的情況來分析:二分類和多項分類。雖然神經網路的公式看起來非常複雜,但是實際上整個邏輯和邏輯回歸比較下沒有任何實際的區別,只是將很多層通過矩陣表示出來。

Backpropagation Algorithm

優化代價函數是非常必要的,通過這種方法我們可以將整個方程優化到最理想的狀態。梯度下降法是我們最常用的方法,因此我們需要計算代價函數的各個參數的偏導數。在前向傳播的過程中,各層我們都有設置激勵值。反向傳播的過程中,我們需要計算 delta 值,通過對這個值的累加計算,我們可以將參數優化到最佳值。

《Backpropagation in Practice》

Implementation Note: Unrolling Parameters

在神經網路中,參數都是通過矩陣來表示的,所以把矩陣展開成向量才能更加方便地放入到代價函數中,以及高級優化的方法當中。通過編程語言,這個步驟會非常簡單。即使是將被展開的向量重新組合成矩陣,也可以通過Octave中的一行函數做到,在python中通過numpy來操作也非常簡單。

Gradient Checking

Gradient Checking:梯度檢測,用來檢測優化過程中的誤差。

由於反向傳播是一種非常複雜的演算法,配合上梯度下降的時候可能會出現的誤差。一個很簡單的例子就是取一隨機值 	heta ,然後取它的導數。之後在算出它兩側小範圍函數的斜率。將二者進行比較,就可以看出區別。

Random Initialization

我們啟動神經網路的時候,權重是必須要輸入的。在我們使用邏輯回歸的時候,會習慣性用0作為初始變數。但是在神經網路初始變數卻不能用零,因為在變換過程中,相對應的變數會按照同等比例增長,導致最後的輸出沒有任何改變。正因如此,其實變數最好使用隨機的數字。

Putting It Together

使用神經網路的第一步,我們要選擇一個合適的架構。輸入層的輸入單元數量由特徵數量決定。輸出層的輸出單元數量由分類器的數量決定。隱藏層的層數絕大多數情況下為一層,不過如今是深度學習時代,隱藏層的層數已經深不見底。

第二步是訓練,這裡又分為6個小步驟:

  1. 隨機賦予不同數值的權重
  2. 使用前向傳播演算法,從而得到輸出值
  3. 計算出來代價函數
  4. 使用反向傳播演算法,從而得到代價函數的偏微分
  5. 利用梯度檢測,了解在整個過程中是否存在誤差
  6. 最後通過梯度下降,或者其他的高級優化方法求出最小的代價函數

《Application of Neural Networks》

Autonomous Driving

即使沒有深度學習,神經網路在自動駕駛的試驗中也展現出了非常強的表現。人開車的行為可以被汽車實時學習到,只要一條路被開過,汽車的神經網路參數就會被學會,自動駕駛也得到了實現。其中最重要的數值是自信度,汽車的行駛過程由自信度負責引導。

二、個人感受

這周的課程主要是在講如何通過反向傳播來優化整個演算法,在《深度學習》這門課程中,反向傳播也會被一而再,再而三地被提及。這是一個非常有用的演算法,當然他的發明者Geoffrey Hinton如今發明出來了新的演算法,至於有效性,我們還是需要歷史來給予我們答案。通過整個教學過程,我們可以非常清晰地看出來反向傳播的易用性,如今主流的機器學習框架和庫都已經將其打包好了,所以需要費神的事情也變得更加簡單。

我一直都認為自己是一個多面手,應該干所有的事情,但是這是不可能的。有一技之長才是真正安身立命的本錢。最近的思考,讓我真正想清楚了自己應該幹什麼。首先我想明白了什麼是「駭客」,就是利用自動化工具解決問題的人。古時候利用水裡磨磨的是「駭客」,今天利用電子計算機解決問題的人也是「駭客」,當然在國內更多人用「極客」這個詞。我如今的動手能力還是不行,很多問題寧肯手動操作,也懶的寫個腳本去解決。之後我要好好強迫自己,凡是要干第三遍的事情,都要想辦法用腳本解決,即使這更加麻煩。比如,去健身房,我要舉十次壓力,那我就應該寫一個腳本舉十次,當然這是開玩笑。其次我想明白了程序員,其實就是在利用計算機為人們解決問題,所以越了解計算機,才能越高效地去解決問題。不能因為自己是在做數據挖掘或者機器學習就不去深究演算法、數據結構和計算機組成,其實這些最底層的計算機原理,才能讓我們調動計算機性能的時候達到效率最大化。

即使沒有這麼低層,寫出易讀、易優化、易於添加的架構,簡直是整個部門的福音。

三、實際應用

最後一個視頻已經將實際應用講了出來,就是可以學習到複雜的事件。機器學習之所以叫做學習,是因為發明它就是為了可以減少人力的支出。在大數據、超級計算機普及的時代,神經網路真正的力量爆發了出來。場景識別、自然語言處理、計算機視覺、語音識別這些功能進步速度非常快。最可怕的是,深度學習沒有上限,數據越多,準確率只會越來越高。相信有一天,神經網路可以幫助人類了解人類本身。


推薦閱讀:

機器學習不僅僅是模型
經驗風險最小化
kaggle比賽實例:房價預測之xgboost調參
被眼睛欺騙?這正是你比機器高明的地方!深度學習如何處理認知錯覺
交叉驗證、模型評估

TAG:機器學習 |