浅析贝叶斯神经网络(Based on Variational Bayesian)
https://blog.csdn.net/qq_20195745/article/details/82453589
贝叶斯神经网络简介
对于一个神经网络来说,最为核心的是如何根据训练集的数据,得到各层的模型参数,使得Loss最小,因其强大的非线性拟合能力而在各个领域有着重要应用。而其问题是在数据量较少的情况下存在严重的过拟合现象,对于获得数据代价昂贵的一些课题比如车辆控制等领域,应用存在局限性。
贝叶斯神经网络的优点是可以根据较少的数据得到较为solid的模型,而且得到的是各层参数的分布(一般假设各层参数 服从高斯分布,根据训练集数据计算得出 的均值和方差),从而得到 , 可以有效的解决过拟合的问题,不仅可以对结果进行预测,还可以对结果的误差进行有效预测。的核心思想是
我们先来直观的看一下,贝叶斯神经网络的作用和效果,如下图所示,红色的点为训练集的数据,然后针对每一个x,对f(x)采样1000个点,之所以输出多个y值是为了体现出模型对于y的方差的预测能力。
贝叶斯公式与KL散度
我们从最基本的贝叶斯公式出发,来理解一下贝叶斯神经网络的迭代过程:
贝叶斯公式:
其中,(X,Y)为训练集的数据,由于训练集是给定的所以 为常数,即我们的目标 ,为W的先验概率,为在给定参数W和X的情况下,网络输出Y的概率。
由于 的概率分布复杂,难以求得均值方差等,因此贝叶斯神经网络通过建立一个 函数来逼近 函数,利用一个较为简单的分布,如高斯分布等(参数为, ),来逼近 ,参数 , 即为神经网络需要更新调整的参数,这是整个算法的核心思想。
那么如何判断 函数逼近 函数的效果呢?判断依据一般选取为两种分布的KL散度,KL散度又称为两种分布的相对熵,在一定程度上,熵可以度量两个随机变量的距离。KL散度是两个概率分布P和Q差别的非对称性的度量,用来度量使用基于 的编码来编码来自 的样本平均所需的额外的位元数。 典型情况下,P表示数据的真实分布,Q表示数据的模型分布,即P的近似分布。 其数学定义如下。
进一步分析,我们得到:
这里面比较重要的一点是KL散度是 关于 的期望,这一点很特殊,是一个函数,我们对这个函数进行优化使得KL散度最小,这样的对于函数的操作称之为“变分”,本文主要基于变分贝叶斯推理的方法来进行贝叶斯神经网路的实现。
贝叶斯神经网络的核心思想
对于普通的神经网络来讲,需要设计好损失函数,通过SDG、Adam等优化器进行优化求得最优参数,使得Loss最小,而对于贝叶斯神经网络,需要最小化的便是KL散度,我们需要将KL散度拆分成方便计算求解的项。
其中 是常数,稍作整理可得:
由此,我们就得到了需要 minimize的目标函数:
至此,我们还是最后一个环节,也就是 ,这三项的具体计算方法, 这一项很好计算 是先验概率,一般我们指定为均值为0方差为的高斯分布即可;在上文中提到, 因此对 累加求和取平均值即可求出; 的计算十分关键,这一项是表示在给定参数和自变量的情况下,输出 为数据集中所对应的的概率,采用如下公式来计算: , 其中 为Y 的先验参数(的先验方差一般与的先验方差相同)。
核心代码
class VariationalDense:
def __init__(self, n_in, n_out):
self.W_mu = tf.Variable(tf.truncated_normal([n_in, n_out], stddev=stddev_var))
self.W_logsigma = tf.Variable(tf.truncated_normal([n_in, n_out], mean = 0., stddev=stddev_var))
self.b_mu = tf.Variable(tf.zeros([n_out]))
self.b_logsigma = tf.Variable(tf.zeros([n_out]))
self.epsilon_w = self.get_random([n_in,n_out],mu=0., std_dev=epsilon_prior)
self.epsilon_b = self.get_random([n_out], mu=0., std_dev =epsilon_prior)
self.W = self.W_mu + tf.multiply(tf.log(1. + tf.exp(self.W_logsigma)), self.epsilon_w)
self.b = self.b_mu + tf.multiply(tf.log(1. + tf.exp(self.b_logsigma)), self.epsilon_b)
def __call__(self, x, activation=tf.identity):
output = activation(tf.matmul(x,self.W) + self.b)
output = tf.squeeze(output)
return output
def log_gaussian(self, x, mu, sigma):
return -0.5*tf.log(2*np.pi)-tf.log(sigma)-(x-mu)**2/(2*sigma**2)
def get_random(self, shape, mu, std_dev):
return tf.random_normal(shape, mean=mu, stddev=std_dev)
def regularization(self):
sample_log_pw, sample_log_qw= 0. , 0.
sample_log_pw += tf.reduce_sum(self.log_gaussian(self.W, 0., sigma_prior))
sample_log_pw += tf.reduce_sum(self.log_gaussian(self.b, 0., sigma_prior))
sample_log_qw += tf.reduce_sum(self.log_gaussian(self.W, self.W_mu, tf.log(1. + tf.exp(self.W_logsigma))))
sample_log_qw += tf.reduce_sum(self.log_gaussian(self.b, self.b_mu, tf.log(1. + tf.exp(self.b_logsigma))))
regulizer = tf.reduce_sum((sample_log_qw-sample_log_pw))
return regulizer
# Create the Model
n_sample = 20
X = np.random.normal(size=(n_sample,1))
y = np.random.normal(np.cos(5.*X) / (np.abs(X) + 1.), 0.1).ravel()
X_pred = np.atleast_2d(np.linspace(-3.,3.,num=100)).T
feature_size = X.shape[1]
n_hidden = 100
# Place holder of Network inputs and outputs
model_x = tf.placeholder(tf.float32, shape=[None, feature_size])
model_y = tf.placeholder(tf.float32, shape=[None])
#Define neural network
net_Layer_input = VariationalDense(feature_size, n_hidden)
net_Layer_hidden = VariationalDense(n_hidden, n_hidden)
net_Layer_output = VariationalDense(n_hidden, 1)
Input_Layer_output = net_Layer_input(model_x, tf.nn.relu)
Hidden_Layer_output = net_Layer_hidden(Input_Layer_output, tf.nn.relu)
net_pred = net_Layer_output(Hidden_Layer_output)
# Define ELBO
sample_log_Likelihood = tf.reduce_sum(net_Layer_output.log_gaussian(model_y, net_pred, sigma_prior))
regularization_term = net_Layer_input.regularization() + net_Layer_hidden.regularization() + net_Layer_output.regularization()
elbo = -sample_log_Likelihood + regularization_term / n_hidden
train_step = tf.train.AdamOptimizer(lr).minimize(elbo)
# Mean Square Error (Network Performance)
model_mse = tf.reduce_sum(tf.square(model_y - net_pred))/n_sample
实验结果分析
我们依次取10个数据点、50个数据点、100个数据点,可以看到训练集大小的不同,对于整体拟合效果的影响结果如下:
10个数据点
50个数据点
100个数据点
下面我们来可视化的看一下贝叶斯神经网络随着迭代次数的增加,拟合效果的变化,分别取eposide=2500,3000,3500,4000,观察训练效果的变化:
2500次
3000次
3500次
4000次
浅析贝叶斯神经网络(Based on Variational Bayesian)的更多相关文章
- 3.贝叶斯网络表示(The Bayesian Network Representation)
对于一个n随机变量的联合分布,一般需要2**n-1个参数来表示这个分布.但是,我们可以通过随机变量之间的独立性,减少参数的个数. naive Beyes model: Bayesian Network ...
- 变分贝叶斯学习(variational bayesian learning)及重参数技巧(reparameterization trick)
摘要:常规的神经网络权重是一个确定的值,贝叶斯神经网络(BNN)中,将权重视为一个概率分布.BNN的优化常常依赖于重参数技巧(reparameterization trick),本文对该优化方法进行概 ...
- 贝叶斯深度学习(bayesian deep learning)
本文简单介绍什么是贝叶斯深度学习(bayesian deep learning),贝叶斯深度学习如何用来预测,贝叶斯深度学习和深度学习有什么区别.对于贝叶斯深度学习如何训练,本文只能大致给个介绍. ...
- PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)
主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...
- darktrace 亮点是使用的无监督学习(贝叶斯网络、聚类、递归贝叶斯估计)发现未知威胁——使用无人监督 机器学习反而允许系统发现罕见的和以前看不见的威胁,这些威胁本身并不依赖 不完善的训练数据集。 学习正常数据,发现异常!
先说说他们的产品:企业免疫系统(基于异常发现来识别威胁) 可以看到是面向企业内部安全的! 优点整个网络拓扑的三维可视化企业威胁级别的实时全局概述智能地聚类异常泛频谱观测 - 高阶网络拓扑;特定群集,子 ...
- 神经网络中的BP神经网络和贝叶斯
1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...
- 贝叶斯优化(Bayesian Optimization)深入理解
目前在研究Automated Machine Learning,其中有一个子领域是实现网络超参数自动化搜索,而常见的搜索方法有Grid Search.Random Search以及贝叶斯优化搜索.前两 ...
- Bayesian generalized linear model (GLM) | 贝叶斯广义线性回归实例
一些问题: 1. 什么时候我的问题可以用GLM,什么时候我的问题不能用GLM? 2. GLM到底能给我们带来什么好处? 3. 如何评价GLM模型的好坏? 广义线性回归啊,虐了我快几个月了,还是没有彻底 ...
- Bayesian Statistics for Genetics | 贝叶斯与遗传学
Common sense reduced to computation - Pierre-Simon, marquis de Laplace (1749–1827) Inventor of Bayes ...
随机推荐
- IPV6配置
云友“学渣王 ”在帖子里提到需要为阿里云ECS配置IP6地址,根据网上的一些信息,写此例. 如果要求是FQDN地址,请登录到您的域名控制面板,设置一条AAAA记录到新设置的IPv6隧道地址. 在阿 ...
- NIOS_UART
1.Fifoed avalon UART带缓冲区,使用非常方便,google下载,google上有的技术资料,百度上找不到,以为没有这个事情: 2.两种UART如果想用操作寄存器的方式操作,需要在al ...
- css学习_css布局案例
1.中间栏先加载 !!!(若不是这个条件的话 ,那可以用 calc 或者flex布局来实现 中间栏自适应,左右栏定宽) 2.中间栏自适应 width:100% 3.左右栏固定宽 左中右 ...
- 弄懂JDK、JRE和JVM到底是什么
首先是JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bi ...
- idea右键没有svn选项
然后apply,当然也可以只是某些指定的文件夹.project就是当前项目,包括所有的module.
- VUE-002-前端分页(el-pagination)展示数据
在web开发过程中,通常使用表格展示数据,在数据较多时采用分页的方式展示给用户. 分页方式有前端假分页和后端分页两种实现方式,此文仅记录前端假分页实现方式. 第一步:添加分页组件(el-paginat ...
- Asp.net 使用线程池实例
实际开发经常会使用线程,如果每次使用都是创建线程.启动线程,然后销毁线程,从性能上来讲,非常占用系统开销,当线程达到一定量的时候会影响程序的运行和处理效率. 使用线程池:好处:线程池是一种多线程处理形 ...
- unity开发多语言版本
1.文字部分 ①.文字提取参考 http://www.xuanyusong.com/archives/2987: ②.把提取出来的文字放到excel总转换成繁体等版本: ③.把excel转换成txt文 ...
- vue中使用vue-quill-editor及上传图片到自己服务器
第一步,下载依赖 cnpm install vue-quill-editor --save 第二步,再main.js里引入组件(我这里是全局注册) // 富文本编辑器 import VueQuillE ...
- linux----------VMware如何链接局域网其它电脑上的虚拟机,选择桥接模式即可。仔细阅读虚拟机的三个连接方式
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. ...