论文笔记:Weight_Uncertainty_in_Neural_Networks
(2020-03-08 20:31:39)
标签:
杂谈 |
论文题目:Weight Uncertainty inNeural Networks
Arxiv:https://arxiv.org/pdf/1505.05424.pdf
源码:https://github.com/tensorflow/models/tree/master/research/deep_contextual_bandits
分类:深度学习 & 优化
这篇文章想法很新颖,并且理论足够深刻,贝叶斯神经网络的奠基之作之一,引用量接近800。
需要的基本知识:变分推断
来源:ICML2015
文章的亮点(得分函数的形式是本文亮点):
1. 网络参数服从高斯分布。
2.通过变分推断逼近网络参数在数据集上的后验概率。
3. 利用 Representation trick来训练网络参数的分布。
首先简单介绍一下变分推断(变分颇为高深,这里只是简单介绍一下基本概念,想了解更多详见:https://blog.csdn.net/weixin_40255337/article/details/83088786):
变分推断的目的是构造 q(w| θ) ,通过优化得到最优的 θ*,从而使得 q(w| θ) 逼近未知的后验分布 P(w |X)。
由贝叶斯公式可知:
P(X) = P(X,w)/P(w | X)
等式两边取对数:
log P(X) = logP(X, w) - log P(w |X)
等式右侧 +log q(w| θ) 再 - log q(w | θ):
log P(X) = logP(X, w) / q(w| θ) -log P(w | X) /q(w | θ)
等式两侧对w(服从分布q(w| θ))取期望,由于等式左侧与 q(w| θ) 无关,因此有:
log P(X) = E{log P(w | X)P(w) -log q(w| θ) } +E{ log q(w| θ) / P(w| X) }
等式左侧为定值,右侧第一项为定义为ELBO,第二项为KL{q(w| θ) || P(w| X)},即:
ELBO+ KL{q(w| θ) || P(X| w)} = C
因此argmin KL{q(w| θ) || P(w| X)} = argmax ELBO。
而对于一个深度学习问题,就是通过给定数据集D,构造神经网络 P(D | w),求得神经网络的参数w。
因此将上述推导中的 X 替换成 D就是贝叶斯神经网络所要解决的问题,即:
w*= argmin E{ log q(w| θ) - log P(D| w)P(w) }
其中E{·}是对 w(服从分布q(w| θ))取期望,这里将max问题等效为了min问题是为了直接使用梯度下降来做数值优化。
f(w, θ)= E{ log q(w| θ) - log P(D| w) - log P(w) }
这里P(w)取混合高斯分布模型:
P(w) = ∏_j πN(w_j | 0, (σ_1)^2) + (1 - π) N(w_j | 0,(σ_2)^2)
(∏表示累乘,懒得插入公式了,凑合着看吧)
P(D | w)是网络权重 w在数据D上的似然概率,即给定数据集输出标签值的概率。假设数据集中的样本(x_k, y_k)相互独立,则有
log P(D | w) = ∑_k log P(y_k | x_k, w)
其中 y_i 为 x_i对应的标签值。
利用蒙特卡洛方法可将对w 取期望转化为基于分布函数 q(w| θ)的采样平均,即Loss函数转化为如下形式:
Loss =∑_i log q(w^(i)| θ) - log P(D | w^(i)) - logP(w^(i))
到目前为止,模型所涉及的所有变量均已交代清楚了,下面给出训练的算法:
遍历每个epoch
1)对 w 进行采样,w ~q(w | θ),这里需要注意,为了使得Loss函数能够对μ和ρ求导,需要利用 representation trick,即采样ε ~ N(0, 1),w = μ + ε log(1 +e^ρ)。
2)计算网络参数 w在样本(x_i, y_i)上的似然概率:
log P(D | w)= log P(y_i | x_i,w)
3)计算优化目标:
f(w, θ)= log q(w| θ) - log P(y_i| x_i, w) -log P(w),其中 θ = (μ,ρ),log P(D | w^(i))的计算需要遍历数据集中的样本(x_k, y_k):
log P(D | w) = ∑_k log P(y_k | x_k, w^(i))
4)利用 Backpropagation 对 θ进行更新,其中 θ = (μ, ρ)。
梯度的计算如下:
_μ f(w, θ) =[_μ q(w| θ)]/q(w | θ) - [_μ P(D |w)]/P(D | w)
_ρ f(w, θ)= [_ρ q(w| θ)]/q(w | θ) - [_ρ P(D |w)]/P(D | w)
_μ q(w| θ)和 _ρ q(w| θ) 的计算如下:
对于任意神经元,有 x_out = g(w x_in)(这里w中包含偏执项,即在 x_in中追加一个维度常量1),其中g为激活函数, w 由1)给出。
假设 w 的各个维度 w_j建相互独立(即网络中不同神经元之间的权重相互独立),可计算出q(w | θ)= ∏_j N(w_j | μ_j,σ_j^2)。其中 σ_j = log(1 +e^ρ_j),μ_j和ρ_j分别是μ和ρ的每个维度值(w每个维度的均值和方差)。BNN对权重梯度的计算与标准的DNN有些微的差别:
_μ x_out= _t g(t) x_in
_ρ x_out= _t g(t) ε x_in e^ρ/(1 +e^ρ)
∂ x_out/∂ x_in= _t g(t) (μ+ ε log(1 + e^ρ))
其中t=(μ+ ε log(1 +e^ρ))x_in。g(t)如果是sigmod,则 _t g(t)= g(t)(1 - g(t));g(t)如果是relu,则 _t g(t) =sgm(t)。
有了梯度就可以利用 Backpropagation 更新μ 和 ρ:
μ ← μ -α _μ f(w, θ)
ρ ← ρ -α _μ f(w, θ)
其中 α 为神经网络更新步长。