簡析深度學(xué)習(xí)、概率建模巡社、特征表示-灌水篇

深度學(xué)習(xí)(Deep Learning)膛堤,近幾年火的近乎家喻戶曉,曾經(jīng)的算法晌该、機(jī)器學(xué)習(xí)局部升了個(gè)級(jí)華麗轉(zhuǎn)身成為人工智能(AI)肥荔。但傳言深度學(xué)習(xí)的爆發(fā)可以從 Hinton 在 2006 年提出的Deep Belief Network (DBN) 的訓(xùn)練算法開始,才將數(shù)十年的多層神經(jīng)網(wǎng)絡(luò)效果差和落敗于統(tǒng)計(jì)學(xué)習(xí)的尷尬局面得以扭轉(zhuǎn)朝群,在與統(tǒng)計(jì)學(xué)習(xí)之爭中逐占上風(fēng)燕耿,之后一發(fā)不可收拾,各種網(wǎng)絡(luò)和模型也相繼在學(xué)術(shù)界和工業(yè)界被織出來姜胖,逐步顛覆和更新了語音識(shí)別誉帅、圖像識(shí)別、自然語言處理-文本等眾多領(lǐng)域右莱。再加上各大公眾媒體的宣傳蚜锨,此刻及未來數(shù)年(也許) 深度學(xué)習(xí)的聲量(泡泡)不言而喻。慢蜓。
所以亚再,湊個(gè)熱鬧,記錄下俺對(duì)深度學(xué)習(xí)/神經(jīng)網(wǎng)絡(luò)和許多現(xiàn)有的統(tǒng)計(jì)學(xué)胀瞪、特征表示之間關(guān)系的理解和觀點(diǎn)针余。

1. 三層架構(gòu)-框架抽象

從模型架構(gòu)的角度,我們似乎可以粗略地把絕大部分的建模架構(gòu)抽象為三個(gè)組件/三大層:輸入數(shù)據(jù)/特征層凄诞、特征表示/學(xué)習(xí)層和任務(wù)層圆雁。輸入層可以理解成原始的特征或簡單清洗后的特征,不同算法或框架的區(qū)別在第二大層和第三層上(這里的第二層是為了抽象的框架的概念帆谍,中間可以包含多層子層)伪朽,比如最簡單的是沒有中間層,直接把輸入層輸出給任務(wù)層做分類汛蝙;傳統(tǒng)的人工特征工程在第二大層表現(xiàn)為求sin烈涮、平方朴肺、開方等簡單的數(shù)學(xué)方法,產(chǎn)生新的特征坚洽,然后輸出給第三層做分類戈稿;SVM第二層通過Kernel Method將輸入層特征“升維”到高維空間張成新的特征向量,以便在第三層更容易分類讶舰;同理GBDT也是在第二層進(jìn)行樹形特征學(xué)習(xí)和表示鞍盗,然后經(jīng)過第三層的修正優(yōu)化得到漂亮的分類結(jié)果;而今天的主角深度學(xué)習(xí)(網(wǎng)絡(luò))則是在第二層通過多層子層進(jìn)行特征的學(xué)習(xí)和傳遞跳昼,同樣通過第三層進(jìn)行任務(wù)的修正優(yōu)化般甲,得到更優(yōu)的結(jié)果。再進(jìn)一步抽象鹅颊,第三層的表示大部分可以通過GLM(廣義線性模型)進(jìn)行表示敷存。特別地,深度學(xué)習(xí)網(wǎng)絡(luò)中間的每一子層也都可以看成上一層的輸入和權(quán)重的線性組合堪伍,并把結(jié)果封裝傳入一個(gè)簡單的非線性函數(shù)(GLM的連接函數(shù))锚烦,最后通過第三大層的進(jìn)行統(tǒng)一的優(yōu)化〉酃停可以發(fā)現(xiàn)隨著研究的進(jìn)步挽牢,總的框架其實(shí)沒有巨大變化,只是在中間特征學(xué)習(xí)的智能性或線性可分性的轉(zhuǎn)化上是在不斷的進(jìn)化摊求,本質(zhì)都在做特征的抽取和學(xué)習(xí)禽拔。
深度學(xué)習(xí)其實(shí)很關(guān)鍵的一點(diǎn)就是得到好的特征表示(representation),通過深度學(xué)習(xí)第二層學(xué)習(xí)的出來的網(wǎng)絡(luò)室叉,即使拋棄第三層的分類/回歸模型睹栖,直接把學(xué)習(xí)到的網(wǎng)絡(luò)(參數(shù))當(dāng)做新的特征,把這堆特征丟到普通的 LR之類的分類器里茧痕,往往也會(huì)得到分類性能提高野来。

1.1 一個(gè)簡單的例子

如圖,存在紅圈和黃十字兩個(gè)類別踪旷,原始特征分別為一維空間-2,-1,1,2四個(gè)點(diǎn)曼氛,基于該數(shù)據(jù),簡單的可以直接+第三層分類任務(wù)進(jìn)行建模令野,效果從圖中容易判斷舀患,準(zhǔn)確率最高可以達(dá)到75%,進(jìn)一步气破,我們發(fā)現(xiàn)可以在第一層和第三層之間加一個(gè)簡單的數(shù)學(xué)變換聊浅,即新生成一個(gè)特征Y=X的平方,然后用新的特征再進(jìn)行一層分類任務(wù)后建模發(fā)現(xiàn)準(zhǔn)確率可以達(dá)到100%旷痕。其實(shí)第二種方法可以簡單看做深度學(xué)習(xí)的特殊情況强重,即X平方的轉(zhuǎn)換可以看做是中間一個(gè)子層一個(gè)節(jié)點(diǎn)的普通網(wǎng)絡(luò)灸姊。


一維空間.png

二維空間.png

2. 三層架構(gòu)-圖表示

最普通的建模方式是沒有第二層父晶,直接從第一層(數(shù)據(jù)輸入層)和第三層建立連接甲喝,另外糠溜,本圖表示的是參數(shù)w為非隨機(jī)變量,當(dāng)假設(shè)它也為隨機(jī)變量時(shí)红柱,即給其先驗(yàn)分布時(shí)嘉抒,估計(jì)過程變成貝葉斯估計(jì)(機(jī)器學(xué)習(xí)中叫做正則化,用于降低模型的復(fù)雜度)。


普通建模過程.png

正則后:


參數(shù)先驗(yàn)-MAP.png

深度學(xué)習(xí)圖表達(dá):


深度學(xué)習(xí)建模過程.png

接下來措嵌,逐層拆解看看:

3. 第三層:GLM

根據(jù)上面的分析躲叼,其實(shí)可以把深度學(xué)習(xí)后兩大層看做是一個(gè)遞歸的廣義線性模型(Recursive Generalised Linear Model)枫慷,即每一細(xì)分層都是一個(gè)可復(fù)制的GLM浪规,GLM作為概率建模的基石之一或听,在我們接觸到的應(yīng)用中無處不在笋婿,也很實(shí)用庇配。

3.1 同樣從簡單的例子說起

基本的線性回歸模型是一個(gè)從由自變量X組成的m維空間到一組因變量Y組成的空間的線性映射讨永,基本形式:

其中卿闹,Yi為獨(dú)立于關(guān)于X線性組合的隨機(jī)變量揭糕,高級(jí)統(tǒng)計(jì)理論和現(xiàn)代計(jì)算性能允許我們通過更一般的情況擴(kuò)展建立類似的其他線性模型:

  • 因變量不一定是正態(tài)分布,可能會(huì)是二項(xiàng)分布锻霎、多項(xiàng)分布著角、泊松分布等;
  • 因變量和自變量之間的關(guān)系不必要像上面表示的線性形式

滿足上面兩點(diǎn)性質(zhì)可以共享更多分布形式的有一個(gè)族類叫“指數(shù)分布族(exponential family of distributions)”旋恼,即可以通過一個(gè)叫連接函數(shù)(link function)g來擴(kuò)展[1]式:

3.2 指數(shù)分布族表示

考慮一維的因變量Y吏口,其概率分布只依賴一個(gè)參數(shù)\theta,則指數(shù)分布族可以表示為:![][2]
其中,
![][3]![][4]該式中我們感興趣的也是需要估計(jì)的參數(shù)是\theta产徊,其他均為“調(diào)節(jié)參數(shù)”昂勒,通常可認(rèn)為已知舟铜。

3.3 普通第三層建模-數(shù)學(xué)推導(dǎo)

該部分為純手工推導(dǎo)然后敲入戈盈,如有誤歡迎指正。該部分內(nèi)容可能比較枯燥谆刨,如果知曉GLM的作用和原理可忽略塘娶,或直接跳到下一部分。

  • 目標(biāo)函數(shù)表示
    為了更直觀了解指數(shù)分布族痊夭,我們通過普通的建模即GLM來理解刁岸,首先來看看指數(shù)分布族的期望和方差(后面模型參數(shù)推導(dǎo)需要),需要用個(gè)小技巧她我,指數(shù)分布族首先是一個(gè)分布虹曙,即滿足分布函數(shù)的性質(zhì):在定義域上的積分等于1,數(shù)學(xué)表達(dá)式為:![][5]
    對(duì)該積分表達(dá)式兩邊同時(shí)計(jì)算關(guān)于\theta的偏微分/偏導(dǎo)得到:![][6]
    整理得到:![][7]
    將分布表達(dá)式帶入求解可得:![][9]![][10]
    由期望基本表達(dá)式![][8]
    我們解得期望的表達(dá)式:![][11]![][12]
    對(duì)上述積分表達(dá)式對(duì)theta求二階偏導(dǎo)得到:![][var1]
    分布表達(dá)式代入得到:![][var2]
    將上面計(jì)算出的E(y)結(jié)果代入整理得:![][var3]
    最終得到y(tǒng)的方差為:![][var4]
    接下來我們看看指數(shù)分布族下的極大似然loss:![][13]
    進(jìn)一步log-loss:![][13.1]
    在實(shí)際建模時(shí)往往需要對(duì)模型的復(fù)雜度進(jìn)行正則鸦难,理論上變?yōu)榍笞畲蠛篁?yàn)loss(MAP,貝葉斯的方式员淫,極大似然可以看做其特殊情況)合蔽,即把模型的參數(shù)也看成隨機(jī)變量,也就是說參數(shù)也是有分布信息的介返,稱之為先驗(yàn)分布拴事,以Lasso為例,即假設(shè)模型參數(shù)為拉普拉斯分布圣蝎,可得到loss為:![][14]
    其log-loss:![][14.1]
    從這個(gè)角度解釋極大似然估計(jì)為最大后驗(yàn)估計(jì)得特殊情況:極大似然估計(jì)即可看作最大后驗(yàn)估計(jì)中模型參數(shù)的先驗(yàn)分布為均勻分布(先驗(yàn)項(xiàng)為常數(shù)刃宵,梯度優(yōu)化時(shí)可以忽略,即等同于極大似然估計(jì)):![][15]
  • 參數(shù)優(yōu)化通用化-法1
    以極大似然的log-loss優(yōu)化為例徘公,假設(shè)![][13.3]
    則極大似然log-loss更新為:![][13.4]
    對(duì)第j個(gè)w求梯度牲证,計(jì)算結(jié)果為:![][13.2]
    展開后:![][13.2.1]
    通過鏈?zhǔn)椒▌t計(jì)算得到如下結(jié)果:![][13.2.2]
    接下來,對(duì)因變量Y不同的數(shù)據(jù)分布关面,只需要定義相應(yīng)的連接函數(shù)坦袍,即可得到相應(yīng)的梯度更新方程:具體地,對(duì)于Logistic Regression等太,連接函數(shù):![][1.3]
    梯度更新方程為:![][1.5]
    整理得到::![][1.6]
    對(duì)于泊松回歸捂齐,連接函數(shù)為:![][1.7]
    對(duì)應(yīng)的梯度更新方程為:

    整理得到:


    [var1]: http://latex.codecogs.com/gif.latex?{????\int\frac{d2f(y;\theta)}{d\theta2}dy=0}
    [var2]: http://latex.codecogs.com/gif.latex?{????\int-\frac{g\prime\prime(\theta)}{a(\phi)}f(y;\theta)+(\frac{y-g\prime(\theta)}{a(\phi)})^2\cdot{f(y;\theta)}dy=0}
    [var3]: http://latex.codecogs.com/gif.latex?{????\int\f(y;\theta)[\frac{y2-2yE(y)+E(y)2}{a(\phi)^2}-\frac{g\prime\prime(\theta)}{a(\phi)}]dy=0}
    [var4]: http://latex.codecogs.com/gif.latex?{????var(y)=a(\phi)g\prime\prime(\theta)}
  • 參數(shù)優(yōu)化通用化-法2
    昨天發(fā)布以后有人反映上面的梯度求解晦澀難懂。為此缩抡,再下給出第二種通用解法奠宜,會(huì)用到關(guān)鍵方法:鏈?zhǔn)椒▌t(本文中多次出現(xiàn)該方法,所以可以適當(dāng)自行掌握),具體推導(dǎo)如下:
    假設(shè)隨機(jī)變量Y滿足GLM压真,即指數(shù)分布族分布娩嚼,我們需要估計(jì)參數(shù)w,該參數(shù)是建立Y和特征X之間關(guān)系的關(guān)鍵榴都,具體通過:

    這里的f()為連接函數(shù)待锈,也就是說Y和X之間是通過連接函數(shù)建立線性關(guān)系。對(duì)于任意Y嘴高,建立log-likelihood函數(shù)(指數(shù)分布族公式上文找)如下:

    以及:

    對(duì)于所有觀測到的Y竿音,log-likelihood函數(shù)為:

    再次利用鏈?zhǔn)椒▌t及極大似然估計(jì),計(jì)算參數(shù)wj(第j個(gè)特征的參數(shù)拴驮,似然函數(shù)中i是第i個(gè)樣本春瞬,注意這兩個(gè)下標(biāo)的含義)的梯度如下:

    接下來,對(duì)每一項(xiàng)分別求解(對(duì)ui的求導(dǎo)會(huì)用到上面計(jì)算過的y的方差):![][var4]
    ![][p10]![][p11]![][p12]
    通用算式已準(zhǔn)備完畢套啤,接下來以Logstic Regression為例宽气,Y的發(fā)生服從貝努力分布(N=1的二項(xiàng)分布),我們有![][p13]![][p14]對(duì)應(yīng)的分布函數(shù)可以表示為:![][p15]可以發(fā)現(xiàn)符合指數(shù)分布族的表達(dá)潜沦,容易得到:![][p16]![][p17]![][p18]以自然參數(shù)theta表達(dá)式作為連接函數(shù)時(shí)Y與theta的關(guān)系是線性的萄涯,符合我們線性轉(zhuǎn)換的條件今瀑,重新與指數(shù)分布族推導(dǎo)的通用表達(dá)式和參數(shù)梯度建立關(guān)系妆毕,有:
    所以連接函數(shù)f()重寫為:
    逆函數(shù)為:
    所以最終我們得到(與法1相同):

[p10]: http://latex.codecogs.com/gif.latex?{?????\frac{\partial{\theta_i}}{\partial{u_i}}=1/(\frac{\partial{u_i}}{\partial{\theta_i}})=1/(g\prime\prime(\theta_i))=1/(\frac{var(y_i)}{a(\phi)})}
[p11]: http://latex.codecogs.com/gif.latex?{?????\frac{\partial{u_i}}{\partial{w_j}}=\frac{\partial{u_i}}{\partial{\eta_i}}\cdot\frac{\partial{\eta_i}}{\partial{w_j}}=\frac{\partial{u_i}}{\partial{\eta_i}}x_i^j}
[p12]: http://latex.codecogs.com/gif.latex?{???\frac{\partial{L}}{\partial{w_j}}=\sum_{i=1}n[\frac{y_i-u_i}{var(y_i)}\cdot\frac{\partial{u_i}}{\partial{\eta_i}}]x_ij}
[p13]: http://latex.codecogs.com/gif.latex?{???p(y_i=1)=\pi_i}
[p14]: http://latex.codecogs.com/gif.latex?{???p(y_i=0)=1-\pi_i}
[p15]: http://latex.codecogs.com/gif.latex?{???p(y_i|\pi_i)=\pi_i{y_i}(1-\pi_i){1-y_i}=exp[y_i\log(\frac{\pi_i}{1-\pi_i})-\log(\frac{1}{1-\pi_i})]}
[p16]: http://latex.codecogs.com/gif.latex?{?\theta_i=\log(\frac{\pi_i}{1-\pi_i})}
[p17]: http://latex.codecogs.com/gif.latex?{???g(\theta_i)=\log(\frac{1}{1-\pi_i})}
[p18]: http://latex.codecogs.com/gif.latex?{???a(\phi)=1}
今天有人問,為啥做Logistic regression 參數(shù)估計(jì)時(shí)不用OLS了呢魄眉?問這個(gè)問題是說明其對(duì)ols那個(gè)“誤差平方和”怎么來的沒搞清楚争占,他認(rèn)為用Logistic regression的連接函數(shù)(log(p/1-p)-wx)^2就可以套用所謂的”O(jiān)LS“了燃逻,其實(shí)不然。首先臂痕,書本上OLS基本都是以線性模型為例去介紹伯襟,直接來一個(gè)誤差平方和然后求解,這其實(shí)是一個(gè)誤導(dǎo):對(duì)于線性模型握童,我們是假設(shè)響應(yīng)變量Y服從正態(tài)分布姆怪,為方便說明我們假設(shè)Y服從N(u,1)的正態(tài)分布(正態(tài)分布的方差與期望無關(guān)可以忽略,原因自己悟)澡绩,于是我們有:![][z1]
對(duì)應(yīng)指數(shù)分布族我們有:
連接函數(shù)![][z2]
套用指數(shù)分布族的參數(shù)梯度公式很容易得到:![][z3]

接下來為了和OLS的誤差平方和相對(duì)應(yīng)片效,我們直接通過極大似然估計(jì)得到OLS的“誤差平方和”如下(log-likelihood):![][z4]
式中后面一項(xiàng)為常數(shù)項(xiàng),求最大最小可省去英古,所以要估計(jì)參數(shù)只要使得該似然函數(shù)最大時(shí)的參數(shù)即可淀衣,于是有:![][z5]
對(duì)該式求偏導(dǎo)數(shù)得到和指數(shù)分布族同樣的結(jié)果,剩下的自行求解與比較召调。
[z1]: http://latex.codecogs.com/gif.latex?{???f(y;u)=\frac{1}{\sqrt{2\pi}}exp[-\frac{1}{2}(y-u)2]=exp[uy-u2/2-(y^2/2+1/2\cdot{log(2\pi)})]}
[z2]: http://latex.codecogs.com/gif.latex?{???f(u_i)=u_i=x_i^Tw=\eta_i}
[z3]: http://latex.codecogs.com/gif.latex?{??\frac{\partial{L}}{\partial{w_j}}=\sum?[\frac{y_i-x_iTw}{1}\cdot{1}]x_ij=\sum[y-x_iTw]x_ij}
[z4]: http://latex.codecogs.com/gif.latex?{???L=\sum{L_i}=\sum[-({y_i-u_i})2+\log(\frac{1}{\sqrt{2\pi}})n]}
[z5]: http://latex.codecogs.com/gif.latex?{???argmax(L)=argmax(\sum-({y_i-u_i})2)=argmin(\sum({y_i-u_i})2)=argmin(\sum({y_i-x_iTw})2)}

  • 基于Tensorflow實(shí)現(xiàn)
import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt
import tensorflow as tf
class Config:
    # Gradient descent parameters (I picked these by hand)
    epsilon = 0.01  # learning rate for gradient descent
    reg_lambda = 0.01  # regularization strength
    x_dim=2
def generate_data():
    np.random.seed(0)
    X, y = datasets.make_moons(200, noise=0.20)
    return X, y
def visualize(X, y):
    # plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)
    # plt.show()
    #plot_decision_boundary(lambda x:predict(model,x), X, y)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
    plt.title("Logistic Regression")
    plt.show()
_X,_y=generate_data()
visualize(_X,_y)
#begin LR model
io_tf = lambda dim: tf.placeholder(tf.float32, dim)
var_tf = lambda init: tf.Variable(init)
def tf_logistic(_X):  
    return 1/(1 + tf.exp(-_X))
x_dim=Config.x_dim
#定義likelihood-function
with tf.device('/cpu:0'):
    x = io_tf([None, x_dim])
    y = io_tf([None, 1])
    W = var_tf(tf.zeros([x_dim, 1]))
    b = var_tf(tf.zeros([1]))
    y_ = tf_logistic(tf.matmul(x, W) + b)
    loglikelihood = tf.reduce_sum(tf.log((1-y_)*(1-y) + y*y_))
lr = Config.epsilon  # Learning rate
with tf.device('/cpu:0'):
    dydW = tf.gradients(loglikelihood, W)[0]
    dydb = tf.gradients(loglikelihood, b)[0]
    gradient_ascend = tf.group(
        W.assign_add(lr*dydW),
        b.assign_add(lr*dydb))
err_min = 0.01
max_iter = 1000
data_X=_X
trY=_y
temp = trY.shape
data_y = _y.reshape(temp[0],1)
#print _y.reshape(200,1)
#print data_X
#梯度更新
with tf.Session() as sess:
    #tf.global_variables_initializer().run()
    tf.global_variables_initializer().run()
    
    def classifier(_X):
        _y = sess.run(y_, feed_dict={x: _X})
        _Y = np.column_stack((_y, 1 - _y))
        return _Y
    #lll_old = sess.run(loglikelihood, feed_dict={x:data_X, y:data_y})
    for i in range(max_iter):
        #for (x, y) in zip(data_X, data_y):
        lll_old = sess.run(loglikelihood, feed_dict={x:data_X, y:data_y})
        sess.run(gradient_ascend, feed_dict={x:data_X, y:data_y})
        lll = sess.run(loglikelihood, {x:data_X, y:data_y})
        if abs(lll - lll_old) < err_min:
            break
        print("Epoch = %d,Error== %.2f")%(i,abs(lll - lll_old))
            
    print("Optimization finished in ", i, " iterations.")
Label數(shù)據(jù)類型 分布類型 連接函數(shù) 逆連接函數(shù) 激活函數(shù)名稱
Binary Binomial ![][f1] ![][f2] Sigmoid
Binary Probit ![][f3] ![][f4] Probit
Categorical Multinomial ![][f5] Softmax
Counts Poisson ![][f6] ![][f7]
Sparse Tobit ![][f8] ReLU

另外膨桥,附上各種連接函數(shù)(神經(jīng)網(wǎng)絡(luò)的激活函數(shù)):
[f1]: http://latex.codecogs.com/gif.latex?{?????log(\frac\theta{1-\theta})}
[f2]: http://latex.codecogs.com/gif.latex?{?????\frac1{1+exp(-u)}}
[f3]: http://latex.codecogs.com/gif.latex?{?????\Phi^{-1}(\theta)}
[f4]: http://latex.codecogs.com/gif.latex?{?????\Phi(u)}
[f5]: http://latex.codecogs.com/gif.latex?{?????\frac{exp(u)}{\sum_jexp(u_j)}}
[f6]: http://latex.codecogs.com/gif.latex?{?????log(\theta)}
[f7]: http://latex.codecogs.com/gif.latex?{?????exp(u)}
[f8]: http://latex.codecogs.com/gif.latex?{?????max(0,u)}

Label數(shù)據(jù)類型 分布類型 連接函數(shù) 逆連接函數(shù) 激活函數(shù)名稱
Binary Binomial ![][f1] ![][f2] Sigmoid
Binary Probit ![][f3] ![][f4] Probit
Categorical Multinomial ![][f5] Softmax
Counts Poisson ![][f6] ![][f7]
Sparse Tobit ![][f8] ReLU

4. 第二層:特征學(xué)習(xí)/表示-正談

接下來蛮浑,我們來拆解第二層,即真正的網(wǎng)絡(luò)層只嚣,從前面的介紹以及圖表示環(huán)節(jié)沮稚,大概需要理解兩個(gè)關(guān)鍵環(huán)節(jié):頂層(第三層)Loss function的構(gòu)建、優(yōu)化(即第三層與中間第二層以及第一層之間參數(shù)如何傳遞和共享)册舞。對(duì)于Loss function的構(gòu)建需要觀測到的數(shù)據(jù)(人工標(biāo)注的label或target蕴掏,或自產(chǎn)生的label-典型如RNN),前面我們分析過调鲸,中間層其實(shí)也是一個(gè)個(gè)GLM的小模塊盛杰,由前一層的輸出作為輸入的線性組合與連接函數(shù)(激活函數(shù))組成:在優(yōu)化環(huán)節(jié)如何把標(biāo)注的信息通過參數(shù)或梯度傳遞給前面隱層達(dá)到整體效果優(yōu)化的目的呢,這里有一個(gè)核心方法叫“后向傳播”(Back Propagation)藐石,為了方便理解即供,后面的解析結(jié)合圖形以及以單節(jié)點(diǎn)的多層網(wǎng)絡(luò)為例,首先我們看一個(gè)2層(針對(duì)中間層定義)單節(jié)點(diǎn)網(wǎng)絡(luò):

單節(jié)點(diǎn)網(wǎng)絡(luò).png

從圖中可以看出于微,每個(gè)神經(jīng)元節(jié)點(diǎn)都是連接上一層的函數(shù)逗嫡,從兩外一角度來看,當(dāng)我們改變w1的數(shù)值株依,神經(jīng)元節(jié)點(diǎn)的結(jié)果“h1”和“h2”層的結(jié)果都會(huì)發(fā)生變化驱证,最終將變化傳導(dǎo)給output Y,即頂層恋腕,由上面的解析抹锄,我們最終是通過設(shè)計(jì)頂層的Loss function來進(jìn)行參數(shù)的優(yōu)化和傳導(dǎo),用數(shù)學(xué)公式將頂層的output表達(dá)為一個(gè)混合函數(shù)如下:

所以最終output的表達(dá)式為:![][4.4]
也就是說整個(gè)中間層輸出給頂層的output是一個(gè)由各層參數(shù)吗坚、輸入層數(shù)據(jù)/特征以及activation function(s)的混合函數(shù)祈远。接下來如果想對(duì)每個(gè)參數(shù)求梯度(以w1為例)呆万,采用鏈?zhǔn)椒ǎ?a target="_blank" rel="nofollow">chain rule)則逐個(gè)求解即可:![][4.5]

[4.4]: http://latex.codecogs.com/gif.latex?{Y=g3(w3\cdot{g2(w2\cdot{g1(w1\cdot{X})})})}
[4.5]: http://latex.codecogs.com/gif.latex?{\frac{\partial}{\partial{w1}}Y=\frac{\partial}{\partial{h2}}Y\cdot\frac{\partial}{\partial{h1}}{h2}\cdot\frac{\partial}{\partial{w1}}h1}
接下來商源,我們使用上一節(jié)推導(dǎo)的Loss function以及觀測到的Target Y將第二層的輸出和第三層進(jìn)行連接,如圖:

網(wǎng)絡(luò)-loss.png

由上一節(jié)推導(dǎo)谋减,我們得到頂層的Loss function通用方程為:![][4.6]
將第二層輸出的output綜合表達(dá)函數(shù)帶入得到:![][4.7]
注意牡彻!這里的g1、g2出爹、g3為中間層的連接函數(shù)庄吼,g為頂層的連接函數(shù)。此時(shí)严就,我們已經(jīng)通過Loss function和連接函數(shù)把整個(gè)三層建立聯(lián)系总寻,接下來可以最終對(duì)每個(gè)層的每個(gè)參數(shù)進(jìn)行梯度求解和更新,依然以w1為例:![][4.8]
接下來使用觀測到的數(shù)據(jù)運(yùn)用后向傳播和梯度更新梢为,逐步迭代直至得到整個(gè)網(wǎng)絡(luò)所有參數(shù)的值渐行,用圖示表達(dá)為:
后向傳播路徑.png

基于Tensorflow實(shí)現(xiàn):

#以多層線性回歸為例
import tensorflow as tf

n_units_l = (1, 10, 10, 10, 10, 10, 10, 10, 1)

io_tf = lambda dim: tf.placeholder(tf.float32, dim)
trX=np.linspace(-1, 1, 200)
trX=trX.reshape(200,1)
trY=2 * trX + np.random.randn(*trX.shape) * 0.33
trY=trY.reshape(200,1)
def tf_logistic(_X):  
    return 1/(1 + tf.exp(-_X))

def tf_leaky_relu(_X, leak=0.1):  
    return tf.maximum(_X, leak*_X)

x = io_tf([None, 1])
y = io_tf([None, 1])

def hidden_layer(_input, n_units):
    n_in = int(_input.get_shape()[1])
    W = tf.Variable(tf.random_uniform([n_in, n_units], minval=-1, maxval=1))
    b = tf.Variable(tf.random_uniform([n_units], minval=-1, maxval=1))
    return tf.nn.relu(tf.matmul(_input, W) + b), W, b
    # return tf_leaky_relu(tf.matmul(_input, W) + b), W, b

layer = []
Ws = []
bs = []
_l, _W, _b = hidden_layer(x, n_units_l[1])
Ws.append(_W)
bs.append(_b)
layer.append(_l)
for n_l in n_units_l[2:-1]:
    _l, _W, _b = hidden_layer(_l, n_l)
    Ws.append(_W)
    bs.append(_b)
    layer.append(_l)
    
W_out = tf.Variable(tf.random_uniform([n_l, 1]))
b_out = tf.Variable(tf.random_uniform([1])) 
net = tf.matmul(layer[-1], W_out) + b_out



MSE = tf.reduce_mean(tf.squared_difference(net, y))

import numpy as np
import matplotlib.pyplot as plt
# train_step = tf.train.AdadeltaOptimizer(0.01).minimize(MSE)
train_step = tf.train.RMSPropOptimizer(0.01).minimize(MSE)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

def regressor1D(x_mesh):
    X = x_mesh.reshape(-1,1)
    return np.ravel(sess.run(net, feed_dict={x: X}))
n_batches = 5
n_samples=200
batch_size = n_samples//n_batches
print(trX.shape)
for i in range(10000):
    for j in range(n_batches):
        sess.run(train_step, feed_dict={x: trX[batch_size*j:batch_size*(j+1)-1,], y: trY[batch_size*j:batch_size*(j+1)-1]})
        if not i % 2000 and j == 1:
            print(sess.run(MSE, feed_dict={x: trX, y: trY}))


    
    

[4.6]: http://latex.codecogs.com/gif.latex?{????L(\theta|D)=\sum_{i=1}n[\frac{f(wTX){y_i}-g(f(w^TX))}{a(\phi)}+\Phi(y;\phi)]?}
[4.7]: http://latex.codecogs.com/gif.latex?{????L(\theta|D)=\sum_{i=1}^n[\frac{g3(w3\cdot{g2(w2\cdot{g1(w1\cdot{x_i})})}){y_i}-g(g3(w3\cdot{g2(w2\cdot{g1(w1\cdot{X})})})))}{a(\phi)}+\Phi(y;\phi)]?}
[4.8]: http://latex.codecogs.com/gif.latex?{\frac{\partial}{\partial{w1}}L=\frac{\partial}{\partial{Y}}L\cdot\frac{\partial}{\partial{h2}}Y\cdot\frac{\partial}{\partial{h1}}{h2}\cdot\frac{\partial}{\partial{w1}}h1}

5. 第二層:特征學(xué)習(xí)/表示-雜談

我們?cè)诮5臅r(shí)候轰坊,非常重要且往往決定結(jié)果好壞的環(huán)節(jié)是特征的提取,也就是我們談的第二層的內(nèi)容祟印,而特征的提取無非就人工和機(jī)器自動(dòng)提取兩種肴沫,有一個(gè)有意思的觀點(diǎn)認(rèn)為無論是深度學(xué)習(xí)還是人工特征淺層學(xué)習(xí),目的都是有目的的進(jìn)行“信息丟失”的過程蕴忆,其實(shí)這個(gè)可以從數(shù)學(xué)上嚴(yán)格證明(參見:Data Processing Inequality)颤芬,因?yàn)樵诓惶砑有聰?shù)據(jù)的條件下,原始數(shù)據(jù)包含的信息量是最大的套鹅,之后對(duì)其進(jìn)行處理和特征工程站蝠,信息就是在逐步損失掉,那么有人可能要疑問了:既然只要做特征芋哭,信息就減少沉衣,豈不是效果會(huì)變差嗎?其實(shí)减牺,并不矛盾豌习,我們?nèi)菀紫氲剑瑹o論建立何種模型拔疚、進(jìn)行何種特征學(xué)習(xí)都是為了完成某個(gè)領(lǐng)域的任務(wù)肥隆,那么進(jìn)一步可以想到原始數(shù)據(jù)中一定包含該任務(wù)下不需要的信息,所以理論上稚失,我們做建模和特征工程理想情況是努力把為完成某項(xiàng)任務(wù)不需要的信息損失掉栋艳,從而使得模型效果反而提高,其實(shí)對(duì)應(yīng)人腦信息損失的過程也可以理解為“抽象”的過程句各。例如吸占,我們大腦儲(chǔ)存了大量的信息和記憶,如果給定一個(gè)任務(wù)去判斷某動(dòng)物是不是狗凿宾,那么人通常會(huì)是從腦中記憶的大量信息中丟棄與狗無關(guān)的信息矾屯,并把狗想關(guān)的多種扁平特征抽象到一個(gè)高維“立體”空間來進(jìn)行判斷,最終得到該動(dòng)物是否為狗的識(shí)別初厚。
“抽象”在數(shù)學(xué)概念里(與我們今天討論話題相關(guān)的概念)可以用一個(gè)詞叫“線性可分性”來約等于件蚕,很面熟的一個(gè)概念,很多人對(duì)這個(gè)概念的了解可能會(huì)出自于流行多年的SVM产禾,大概的過程是判斷原始特征是否“線性可分”排作,如果不可分,則采用核方法將原始特征“升維”以獲得更豐富的數(shù)據(jù)表達(dá)亚情,以實(shí)現(xiàn)在新的空間里“線性可分”妄痪,核方法是非參數(shù)的思想,基本思路是通過一個(gè)正定核楞件,得到一個(gè)線性映射將數(shù)據(jù)映射到一個(gè)RKHS( Reproducing Kernel Hilbert Space)中衫生,然后使用RKHS中的線性模型來處理數(shù)據(jù)僧著,可能有人要疑問了,為啥一定要“線性可分”而不是直接找一個(gè)非線性的表達(dá)來做障簿。道理很簡單盹愚,線性函數(shù)非常容易表達(dá)和估計(jì),我們無法找到一個(gè)具體的非線性表達(dá)來對(duì)原始數(shù)據(jù)進(jìn)行抽象站故,所以不論是SVM也好還是神經(jīng)網(wǎng)絡(luò)皆怕,本質(zhì)都是通過可以抽象出來的通用變換來產(chǎn)生新的空間,并使得輸入層可以在新的空間找到線性表達(dá)完成模型任務(wù)西篓。

6. 結(jié)論

絕大部分的建模過程都可以粗略的抽象為輸入愈腾、特征學(xué)習(xí)、任務(wù)三層岂津,目的是通過任務(wù)層虱黄,對(duì)特征學(xué)習(xí)層進(jìn)行抽象,得到線性可分的特征空間吮成,反過來提高任務(wù)層的性能橱乱。

[1.3]: http://latex.codecogs.com/gif.latex?{g(f(wTX))=-\log[\frac{1}{1+exp(\sum_{j=1}mw_jx^j)}]}
[1.4]: http://latex.codecogs.com/gif.latex?{g(f(wTX))=-\log[\frac{1}{1+exp(\sum_{j=1}mw_jx^j)}]}
[1.5]: http://latex.codecogs.com/gif.latex?{\frac{\partial{L}}{\partial{w_j}}=\sum_{i=1}n[y_ix_ij+\frac{1+exp(\sum_{j=1}m-w_jx_ij)}{exp(\sum_{j=1}m-w_jx_ij)}\cdot\frac{-1\cdot{exp(\sum_{j=1}m-w_jx_ij)}}{(1+exp(\sum_{j=1}m-w_jx_ij))2}\cdot{x_ij}]}
[1.6]: http://latex.codecogs.com/gif.latex?{\frac{\partial{L}}{\partial{w_j}}=\sum_{i=1}n[y_i-\frac{1}{1+exp(\sum_{j=1}m-w_jx_ij)}]\cdot{x_ij}}

[1.7]: http://latex.codecogs.com/gif.latex?{g(f(wTX))=exp(\sum_{j=1}mw_jx^j)}

附錄:各個(gè)公式
指數(shù)分布族分布表達(dá)式
![][2]
[2]: http://latex.codecogs.com/gif.latex?{f(y;\theta)=t(y;\phi)s(\theta;\phi)e^{\frac{\theta\y}{a(\phi)}}\=exp[\frac{\theta\y-g(\theta)}{a(\phi)}+\Phi(y;\phi)]}
其中,
![][3]
[3]: http://latex.codecogs.com/gif.latex?{??t(y;\phi)=exp[\Phi(y;\phi)]?}
![][4]
[4]: http://latex.codecogs.com/gif.latex?{????s(\theta;\phi)=exp[\frac{-g(\theta)}{a(\phi)}]?}
分布函數(shù)在定義域內(nèi)積分等于1
![][5]
[5]: http://latex.codecogs.com/gif.latex?{?????\int\f(y;\theta)\space\dy=1}
兩邊同時(shí)取對(duì)theta求偏導(dǎo)數(shù)
![][6]
[6]: http://latex.codecogs.com/gif.latex?{?????\frac8phgyts{d\theta}\int\f(y;\theta)dy=\fraces67bb3{d\theta}\cdot1=0}
![][7]
[7]: http://latex.codecogs.com/gif.latex?{?????\int\frac{df(y;\theta)}{d\theta}dy=0?}
期望的積分表達(dá)式
![][8]
[8]: http://latex.codecogs.com/gif.latex?{?????E(x)=\int\x\cdot\f(x)dx}
進(jìn)一步推導(dǎo)
![][9]
[9]: http://latex.codecogs.com/gif.latex?{?????\frac{df(y;\theta)}{d\theta}=[\frac{y}{a(\phi)}-\frac{g^\prime(\theta)}{a(\phi)}]f(y;\theta)}

![][10]
[10]: http://latex.codecogs.com/gif.latex?{?????\int\frac{df(y;\theta)}{d\theta}=\int[\frac{y}{a(\phi)}-\frac{g^\prime(\theta)}{a(\phi)}]f(y;\theta)dy=0}
![][11]
[11]: http://latex.codecogs.com/gif.latex?{????[\frac{E(y)}{a(\phi)}-\frac{g^\prime(\theta)}{a(\phi)}]=0}
最終得到指數(shù)分布族的期望通用解:
![][12]
[12]: http://latex.codecogs.com/gif.latex?{????E(y)=g^\prime(\theta)}
似然-loss
![][13]
[13]: http://latex.codecogs.com/gif.latex?{????l(\theta|D)=\prod_{i=1}^nexp[\frac{\theta{y_i}-g(\theta)}{a(\phi)}+\Phi(y;\phi)]?}
似然-log-loss
![][13.1]
[13.1]: http://latex.codecogs.com/gif.latex?{????L(\theta|D)=\sum_{i=1}^n[\frac{\theta{y_i}-g(\theta)}{a(\phi)}+\Phi(y;\phi)]?}
對(duì)參數(shù)求偏導(dǎo)數(shù)
![][13.2]
[13.2]: http://latex.codecogs.com/gif.latex?{????\frac{\partial\L}{w_j}=\frac{\partial\sum_{i=1}n[\frac{f(wTX)y_i-g(f(w^TX))}{a(\phi)}]}{\partial{w_j}}}
![][13.2.1]
[13.2.1]: http://latex.codecogs.com/gif.latex?{????\frac{\partial{L}}{w_j}=\frac{\partial\sum_{i=1}n[\frac{f(\sum_{j=1}{m}w_jx_ij)y_i-g(f(\sum_{j=1}{m}w_jx_i^j))}{a(\phi)}]}{\partial{w_j}}}
鏈?zhǔn)椒▌t
![][13.2.2]
[13.2.2]: http://latex.codecogs.com/gif.latex?{?????\frac{\partial\L}{w_j}=\sum_{i=1}n[\frac{y_i}{a(\phi)}\cdot\frac{\partial{f(\sum_{j=1}mw_jx_ij)}}{\partial\sum_{j=1}mw_jx_ij}\cdot\frac{\partial\sum_{j=1}mw_jx_ij}{w_j}-\frac{1}{a(\phi)}\cdot\frac{g(f(\sum_{j=1}mw_jx_ij))}{\partial{f(\sum_{j=1}mw_jx_ij)}}\cdot\frac{\partial{f(\sum_{j=1}mw_jx_ij)}}{\partial\sum_{j=1}mw_jx_ij}\cdot\frac{\partial\sum_{j=1}mw_jx_i^j}{\partial{w_j}}]}
給theta賦予自變量的表達(dá)
![][13.3]
[13.3]: http://latex.codecogs.com/gif.latex?{????\theta=f(w^TX)}

![][13.4]
[13.4]: http://latex.codecogs.com/gif.latex?{????L(\theta|D)=\sum_{i=1}n[\frac{f(wTX){y_i}-g(f(w^TX))}{a(\phi)}+\Phi(y;\phi)]?}
Lasso
![][14]
[14]: http://latex.codecogs.com/gif.latex?{?????l(\theta|D)=\prod_{i=1}nexp[\frac{\theta{y_i}-g(\theta)}{a(\phi)}+\Phi(y;\phi)]\cdot\prod_{j=1}d\frac{1}{2b}exp^{-\frac{|w_j|}粱甫}}

![][14.1]
[14.1]: http://latex.codecogs.com/gif.latex?{?????L(\theta|D)=\sum_{i=1}n[\frac{\theta{y_i}-g(\theta)}{a(\phi)}+\Phi(y;\phi)]+\sum_{j=1}d{\frac{\log(2b)}泳叠\cdot{|w_j|}}}
普通似然loss的后驗(yàn)估計(jì)表示
![][15]
[15]: http://latex.codecogs.com/gif.latex?{?????l(\theta|D)=\prod_{i=1}nexp[\frac{\theta{y_i}-g(\theta)}{a(\phi)}+\Phi(y;\phi)]\cdot(\frac{1}{b-a})d}

??

??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茶宵,隨后出現(xiàn)的幾起案子危纫,更是在濱河造成了極大的恐慌,老刑警劉巖乌庶,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件种蝶,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞒大,警方通過查閱死者的電腦和手機(jī)螃征,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠赦,“玉大人会傲,你說我怎么就攤上這事锅棕∽驹螅” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵裸燎,是天一觀的道長顾瞻。 經(jīng)常有香客問我,道長德绿,這世上最難降的妖魔是什么荷荤? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任退渗,我火速辦了婚禮,結(jié)果婚禮上蕴纳,老公的妹妹穿的比我還像新娘会油。我一直安慰自己,他們只是感情好古毛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布翻翩。 她就那樣靜靜地躺著,像睡著了一般稻薇。 火紅的嫁衣襯著肌膚如雪嫂冻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天塞椎,我揣著相機(jī)與錄音桨仿,去河邊找鬼。 笑死案狠,一個(gè)胖子當(dāng)著我的面吹牛服傍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骂铁,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伴嗡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了从铲?” 一聲冷哼從身側(cè)響起瘪校,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎名段,沒想到半個(gè)月后阱扬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伸辟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年麻惶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信夫。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窃蹋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出静稻,到底是詐尸還是另有隱情警没,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布振湾,位于F島的核電站杀迹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏押搪。R本人自食惡果不足惜树酪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一浅碾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧续语,春花似錦垂谢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娃豹,卻和暖如春焚虱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懂版。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工鹃栽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躯畴。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓民鼓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蓬抄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰嘉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 上一節(jié)灌水了深度學(xué)習(xí)阅爽、概率建模和特征表示的理論抽象路幸,為了更好的理解理論,接下來本文給出上節(jié)中各個(gè)部分的實(shí)現(xiàn)付翁,首先使...
    leepand閱讀 993評(píng)論 1 6
  • 簡單線性回歸 import tensorflow as tf import numpy # 創(chuàng)造數(shù)據(jù) x_dat...
    CAICAI0閱讀 3,547評(píng)論 0 49
  • 縱策馬仰疆简肴,抵不過青蔥年少時(shí)光。
    指尖上的滄桑閱讀 241評(píng)論 0 1
  • 感謝哲學(xué)百侧,讓我學(xué)會(huì)了思考砰识,感謝文學(xué),陶冶了我的情操佣渴。感謝歷史辫狼,豐富了我的視野,感謝寫作观话,讓我的思維能力得到...
    言行合一閱讀 337評(píng)論 2 3