深度贝叶斯神经网络
深度貝葉斯神經(jīng)網(wǎng)絡(luò)
翻譯自:博客
傳統(tǒng)的神經(jīng)網(wǎng)設(shè)計得不好,無法建模他們所做的預(yù)測相關(guān)的不確定性。為此,有一種方法是完全的貝葉斯
這里是我對下列三種方法的看法:
但是首先,我們先做什么呢?
深度學(xué)習(xí)網(wǎng)絡(luò)都有很多參數(shù),通常權(quán)重用w1,w2,...w_1, w_2,...w1?,w2?,...表示,偏置用b1,b2,...b_1,b_2,...b1?,b2?,...表示。傳統(tǒng)的(非貝葉斯)方法僅僅通過最大似然估計來學(xué)習(xí)參數(shù)的最優(yōu)值。這些值是標(biāo)量,比如w1=0.8,b1=3.1w_1=0.8, b_1=3.1w1?=0.8,b1?=3.1
另一個方面,貝葉斯方法關(guān)注每個參數(shù)的分布。例如,在貝葉斯神經(jīng)網(wǎng)絡(luò)訓(xùn)練收斂之后,上面兩個參數(shù)可以被這兩個高斯曲線描述。
貝葉斯網(wǎng)絡(luò)訓(xùn)練完成之后,w1,b1w_1, b_1w1?,b1?就可以表示為高斯曲線,如果是傳統(tǒng)的網(wǎng)絡(luò),表示為兩條線。
表示為一個分布而不是一個單一的值,這是很重要的事情。一方面,它使得從分布中多次取樣成為可能,還可以看到隨之帶來的模型預(yù)測的變化。如果它給出連續(xù)的預(yù)測,一遍遍采樣后,網(wǎng)絡(luò)會對它的預(yù)測更有“信心”。
難點
估計分布當(dāng)然是最難的部分,通過使用貝葉斯法則,我們可以轉(zhuǎn)化為計算后驗概率密度。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳
貝葉斯法則,x和y分別輸入和輸出,分母的積分需要對所有的www可能的取值計算邊緣分布,這是最難的部分。
問題在于分母——也被叫做模型的證據(jù),這需要對參數(shù)全部可能的值進(jìn)行積分(也就是說全部非權(quán)重和偏置取值空間),實踐中這不太可行。
因此,我們采用偽數(shù)值的方法來估計積分。
使用MCMC估計積分
由于使用貝葉斯法則計算精確的積分比較困難,MCMC(Markov Chain Monte Carlo)被用于做估計。MCMC背后的想法是非常優(yōu)美的,我建議閱讀這個帖子,里面給出了代碼和一些方法的理解。在所有的三個方法里面,除了數(shù)學(xué),這個方法是最慢的而且最不sexy的。
優(yōu)點:理論上MCMC追得到最好的結(jié)果,就是說最精確的估計。
缺點:很長時間才能收斂
使用黑箱變分推斷(例如edward)
變分推斷是一種估計密度函數(shù)的方法,它首先選擇一個我們已知的分布(例如高斯分布),然后漸進(jìn)式地改變它的參數(shù),直到它看起來像我們想要計算的分布,也就是后驗分布。改變參數(shù)不再需要令人苦惱的積分運算,這是一個優(yōu)化過程,微分比積分通常更容易估計。我們優(yōu)化的這種“編造”出來的分布,成為變分分布
有一些優(yōu)雅的數(shù)學(xué)展示了挑選最優(yōu)參數(shù)為什么等價于最大化下確界的,在某些時候得要檢查一下。但是如果你想要直到這種方法具體怎么實現(xiàn),按時離開理論分析,我準(zhǔn)備了一個簡短的入門教程,這是一個使用edward的8分類的任務(wù)。
我們選擇高斯來設(shè)置變分分布,然后我們挑選基于KL散度的推斷方法。實際上KL的估計是通過“黑箱”變分方法估計ELBO實現(xiàn)的。(如果你對此感興趣,可以閱讀這里)
qw = Normal(loc=tf.Variable(tf.random_normal([D, K])),scale=tf.nn.softplus(tf.Variable(tf.random_normal([D, K])))) qb = Normal(loc=tf.Variable(tf.random_normal([K])),scale=tf.nn.softplus(tf.Variable(tf.random_normal([K]))))inference = ed.KLqp({w: qw, b: qb}, data={y: y_ph})inference.initialize(n_iter=STEPS, n_print=100, scale={y: N_TRAIN / BATCH_SIZE})在定義模型之后,我們現(xiàn)在可以開啟tf的session進(jìn)行訓(xùn)練了。
sess = tf.InteractiveSession() tf.global_variables_initializer().run()train_data_generator = generator(train_data, BATCH_SIZE) train_labs_generator = generator(train_labels, BATCH_SIZE) for _ in range(inference.n_iter):X_batch = next(train_data_generator)Y_batch = next(train_labs_generator)info_dict = inference.update(feed_dict={x: X_batch, y_ph: Y_batch})inference.print_progress(info_dict)我們可以采樣這些分布(qwqwqw表示權(quán)重,qbqbqb表示偏置),可以看到預(yù)測出的是一個分布,這表示了模型的不確定性。
你可以嘗試一下porb_lst和samples的用法。
總結(jié)如下,優(yōu)點:它比樸素的MCMC更快,像edward這樣的庫幫助實現(xiàn)貝葉斯網(wǎng)絡(luò),在幾分鐘之內(nèi)就可以運行。
缺點:深度貝葉斯網(wǎng)絡(luò)可能會很慢,而且性能并不能保證始終達(dá)到最優(yōu)。
使用MC dropout
MC dropout 是一項最新的理論發(fā)現(xiàn),它提供了被稱為“dropout”的正則化技術(shù)的解釋,下面再做詳細(xì)說明。變分推斷是一種貝葉斯方法,用于使用任意分布(先前提到的“變分分布”)來估計后驗分布;droupout,恰恰相反,它是一種神經(jīng)網(wǎng)絡(luò)的正則化方法,訓(xùn)練過程中神經(jīng)元隨機(jī)開啟或關(guān)閉,以免使得網(wǎng)絡(luò)依賴某個特定的神經(jīng)元。這是MC dropout的核心思想:dropout能夠用于執(zhí)行變分推斷,這里變分分布就是一種伯努利分布(狀態(tài)為“開”和“關(guān)”)。“MC”表示dropout用一種類似于蒙特卡羅的方式采樣。在實踐中,通過MC dropout 使用將傳統(tǒng)的網(wǎng)絡(luò)轉(zhuǎn)變成貝葉斯網(wǎng)絡(luò),使得訓(xùn)練問題變得跟在每層使用ddropout一樣簡單。這個等價于從伯努利分布中采樣,提供一種模型不確定性的度量(多次采樣的做的預(yù)測的連續(xù)性。)當(dāng)然我們也可以使用其他的變分分布來實現(xiàn)。
優(yōu)點:容易將一有的深度網(wǎng)絡(luò)轉(zhuǎn)變成貝葉斯網(wǎng)絡(luò),它比其他方法更快,不需要推斷框架。
缺點:測試階段的采樣對實時應(yīng)用來說計算太昂貴了。
那到底貝葉斯神經(jīng)網(wǎng)絡(luò)有什么用呢?
許多研究者還是不相信應(yīng)該這么費力的去使用貝葉斯方法,讓我再多說兩句,我在自動駕駛部門工作,所有下面這些的例子非常貼切。假想一個人正在駕駛者一輛最新的,最強(qiáng)大的自動駕駛的汽車,當(dāng)未識別的物體突然出現(xiàn)在駕駛員面前時,比如是一輛飛行汽車,從未在飛行汽車這個類別上受過訓(xùn)練的計算機(jī)視覺算法,會把它看作是飛機(jī),認(rèn)為它在很遠(yuǎn)的距離上。
那么會發(fā)生什么呢?
傳統(tǒng)的網(wǎng)絡(luò)可能會過分自信的誤判飛行器的位置,而貝葉斯網(wǎng)絡(luò)則可以利用其不確定性做出建議放慢速度的決策。
下面舉一個最簡單的基于Dropout的貝葉斯神經(jīng)網(wǎng)絡(luò)的例子:
Input-FC-Relu-Dropout-FC-Relu-Dropout-FC-Logit-Softmax
在這樣一個包含兩個隱藏層的FC分類網(wǎng)絡(luò)中,我們接入了dropout層,dropout層的每個神經(jīng)元以
的概率取0(隨機(jī)失活)。我們?yōu)榱说玫揭粋€貝葉斯神經(jīng)網(wǎng)絡(luò),按如下進(jìn)行訓(xùn)練和測試:
- 訓(xùn)練時,打開dropout層,前向推理計算分類損失,基于反向梯度傳播算法更新模型參數(shù),迭代若干個epochs
- 測試時,仍然打開dropout層,進(jìn)行n次前向推理,得到每次的分類概率 pi∈RCp_i \in R^Cpi?∈RC, 其中C是類別數(shù)量,最終的分類概率為 p^=1n∑pi\hat{p} = \frac{1}{n}\sum p_ip^?=n1?∑pi?, 分類的不確定度(請大家想想這是哪種不確定度呢?)為var(p)=1n∑(pi?p^)2var(p) = \frac{1}{n}\sum(p_i-\hat{p})^2var(p)=n1?∑(pi??p^?)2
總結(jié)
- 上一篇: 【预测模型】基于贝叶斯优化的LSTM模型
- 下一篇: kettle Windows下载