深度學(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ò)灸姊。
2. 三層架構(gòu)-圖表示
最普通的建模方式是沒有第二層父晶,直接從第一層(數(shù)據(jù)輸入層)和第三層建立連接甲喝,另外糠溜,本圖表示的是參數(shù)w為非隨機(jī)變量,當(dāng)假設(shè)它也為隨機(jī)變量時(shí)红柱,即給其先驗(yàn)分布時(shí)嘉抒,估計(jì)過程變成貝葉斯估計(jì)(機(jī)器學(xué)習(xí)中叫做正則化,用于降低模型的復(fù)雜度)。
正則后:
深度學(xué)習(xí)圖表達(dá):
接下來措嵌,逐層拆解看看:
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]
通用算式已準(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)系妆毕,有:
[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ò):
從圖中可以看出于微,每個(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)行連接,如圖:
由上一節(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á)為:
基于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}
??
??