大概幾個月前就知道吳恩達大神在網(wǎng)易云課堂開課了,一直沒有時間(拖延癥晚期患者)系統(tǒng)的學習,這次趁著開博熱潮尚未褪去,系統(tǒng)的學習一遍Ng大神的講座實乃不二選擇。
深度學習大概是在近三四年逐漸炙手可熱的一種算法模型设联,本質上深度學習就是神經(jīng)網(wǎng)絡構成的善已,從上世紀五六十年代開始,神經(jīng)網(wǎng)絡一直是學者研究的內容离例,但相比于傳統(tǒng)計算模型换团,神經(jīng)網(wǎng)絡的參數(shù)繁多,嚴重受阻于計算機硬件處理能力導致算法效率低下宫蛆,同時存在著一系列算法本身問題例如過擬合艘包,梯度消失等等。近些年耀盗,隨著半導體硬件(老本行)的發(fā)展想虎,計算速度指數(shù)級提升,參數(shù)訓練慢的問題已經(jīng)得到解決叛拷。同時舌厨,在AI前景的誘導下,各種新型的結構的提出也使得深度學習蓬勃發(fā)展忿薇。
Logistic回歸是基于線性回歸的一種常用分類方法(詳細原理在這兒)裙椭,它最大的優(yōu)勢在與模型簡單,可解釋性高署浩,輸出分類結果的同時還能輸出分類的概率值揉燃。當然缺點也很多,簡單即意味著效果嘛有點差(當然也分場景)瑰抵。Logistic回歸雖然簡單你雌,但是卻是機器學習以及深度學習中算法的雛形器联,最經(jīng)典的神經(jīng)網(wǎng)絡中每個節(jié)點的計算其實就是Logistic回歸二汛。所以從神經(jīng)網(wǎng)絡的角度再次理解logistic回歸就有一種從哪里來到哪里去的感覺。
神經(jīng)網(wǎng)絡的最基本單元如下圖所示拨拓。
這個標準三層神經(jīng)網(wǎng)絡主要結構包含三層肴颊,輸入層L1,隱含層L2,輸出層L3渣磷。中間的連線是各層之間的依賴關系婿着,每一個圓圈成為一個neuron(神經(jīng)元) ,構成這個神經(jīng)元的最經(jīng)典的計算就是logistic回歸醋界。所以說logistic回歸可以看做是不包括輸入層和隱含層的神經(jīng)網(wǎng)絡竟宋。
神經(jīng)網(wǎng)絡的主要計算過程其實還是最優(yōu)化原理的那一套,即給定一個目標函數(shù)(cost function)形纺,使用梯度下降(或者其他方法)對參數(shù)進行迭代計算丘侠,使得最終的輸出值不斷逼近真實值,從而訓練出適合訓練數(shù)據(jù)的神經(jīng)網(wǎng)絡逐样。在神經(jīng)網(wǎng)絡的梯度下降過程中蜗字,每一輪參數(shù)的迭代都可以歸納為兩個過程:
- 向前計算損失函數(shù)值
- 向后計算參數(shù)的梯度(即求導數(shù))
向前和向后這兩個過程真是太妙了打肝,把原本數(shù)值參數(shù)的變化用圖的方式動態(tài)推演了出來,十分形象挪捕。向前過程就是順著神經(jīng)網(wǎng)絡搭建的過程粗梭,一個個逐步計算,最終得到當前的模型輸出值级零,從而能夠計算出神經(jīng)網(wǎng)絡的損失函數(shù)断医。向后過程其實是求導法則中的鏈式法則:
這個很簡單,它最大的作用是把計算導數(shù)的過程分成了層級奏纪,從外向里每一層遞進就是神經(jīng)網(wǎng)絡從輸出端向輸出端遞進求導的過程孩锡。
用上面的向前向后過程來看logistic回歸的訓練過程就非常簡單了。
以輸入數(shù)據(jù)維度2為例亥贸,我們把logistic回歸的過程拆分成如下所示
對于這個圖躬窜,我們就使用上面所說的前向后向計算法進行參數(shù)的迭代。
因為梯度下降的迭代(這里特指批量梯度下降)是嵌套兩層的炕置,先是對每一條樣本數(shù)據(jù)進行學習荣挨,對梯度的下降和損失函數(shù)的減少進行累積,這是內循環(huán)朴摊。外循環(huán)是對參數(shù)和損失函數(shù)進行更新默垄,會乘以一個學習率。我們從兩個層次進行前向后向過程的計算甚纲。
內循環(huán)過程
內循環(huán)中口锭,每一條數(shù)據(jù)分別經(jīng)過一次前向和一次后向,最終得到結果
dz = a - y
外循環(huán)過程
外循環(huán)是在內循環(huán)執(zhí)行完之后的后處理過程介杆,做一個增量除以樣本個數(shù)的操作鹃操,并且把前一個外循環(huán)的參數(shù)值減去這一堆內循環(huán)計算的增量與學習率的乘積,最終實現(xiàn)了參數(shù)的更新春哨。
完整過程如下圖所示荆隘。
J = 0, d??1 = 0, d??2 = 0, db = 0
for i = 1 to m:
??(??) = ??????(??) + ??
??(??) = ??(??(??))
?? += ? ??(??)log ??(??) + (1 ? ??(??)) log(1 ? ??(??))
d??(??) = ??(??) ???(??)
d??1 += ??1(??)d??(??)
d??2 += ??2(??)d??(??)
db += d??(??)
J = J/m, d??1 = d??1/m, d??2 = d??2/m
db = db/m
??1 =??1 -?d??1
??2 =??2 -?d??2
當然在這個版塊的后半段,Andrew Ng不忘告訴我們赴背,如果你傻傻的按照for循環(huán)來實現(xiàn)這個代碼椰拒,機器會崩潰的。所以為了提升效率凰荚,我們按照python里的numpy計算方式對上述過程進行向量化改進燃观,把for循環(huán)濃縮成向量的乘積形式,如果再利用GPU的并行計算能力便瑟,那簡直6的飛起了缆毁。
總而言之,logistic回歸還是一種非常重要的基礎分類算法胳徽,利用深度學習過程重新理解logistic回歸积锅,不僅過目難忘爽彤,而且對于理解更復雜算法十分有益。
終于寫完了第一篇正式博客缚陷,過程有點累适篙,干擾有點多,但是完成的一瞬間非常開心箫爷。下一次希望能寫的更好嚷节,更多的呈現(xiàn)一些不了解的內容。