贝叶斯网络学习笔记

本文最后更新于:2022年5月17日 早上

贝叶斯网络学习笔记

1.贝叶斯网络的思想

在传统的点估计神经网络中一般是输入一个点得到一个点,它给出一个确定的结果或分类的概率。在使用神经网络进行预测时,也就是对一个偏离训练集的数据进行插值拟合,本质上它是对结果的曲线(高维曲面)向外进行了一个延伸。它预测的结果没有考虑已经偏离的数据其本身带来的不确定性,导致它对结果的预测处于一个过度自信的状态。也就是说它被骗了。

符合均匀分布的输入数据在复杂的神经网络的变换下其分布可能改变成任意的数据,比如某个物体的图片。这就是为什么很多情况下可以用对抗网络简单地添加一些噪声来大幅度干扰预测结果。

在传统的点估计神经网络中一般不考虑输入数据本身的影响,也就是默认输入数据符合均匀分布,它得到的结果就是对这个均匀分布进行一定函数变换后得到的新分布。而实际上输入数据很可能服从于某个分布而不是默认的均匀分布。贝叶斯理论认为概率是对可信度的衡量,它是一个根据输入分布发生变化的频谱——不同的确定的自变量分布经过同样的函数变换可以得到不同的新分布。本质上后者是对前者的一个推广,在贝叶斯网络中如果限制自变量符合均匀分布,那么它将得到传统的点估计神经网络得到结果的一个极大似然估计。

在贝叶斯网络计算时,虽然不知道所有输入数据符合的分布,但是可以实时记录已经输入的数据计算产生的结果,这个就是先验概率。每新输入一组数据进行训练,它都可以根据之前的数据给出一个推测,同时可以知道输入数据的实际分布。这个预测的分布可能和实际的分布有点偏差,贝叶斯网络就可以不断依据这种偏差修正对全部数据分布的估计。当估计相比实际分布偏右时,网络预测的结果也会偏右;当这种估计达到了无偏估计,贝叶斯网络的预测也将在实际分布的顶峰所在自变量处达到一个顶峰。

2.朴素贝叶斯

2.1.概念:

  • 先验概率 $P(Y)$

  • 条件概率 $P(X|Y)$

  • 后验概率 $P(Y|X)$

2.2.贝叶斯公式

由贝叶斯公式 $P(y|x)=\frac{P(x,y)}{P(x)}$,但是x和y的联合分布是不知道的,此时可以将公式变形为

其中$C_k$就是结果的各种可能性,x是待预测项目的已知条件,可以有很多个项目。

2.3.条件独立假设

在数据量比较小的时候可能符合x的所有$C_k$不是都存在,也就是在2.2的公式中其概率为0,这会导致很大的偏差。如果各个变量都是独立的话,可以依据条件独立假设将其拆开计算。

$P(X=x|Y=C_k)=P(X^{(1)}=x^{(1)},…X^{(n)}=x^{(n)}|Y=C_k)=\mathop{\Pi}\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=C_k)$

联立上面两个公式,得到

所有结果中,算出概率最大的那个,就是预测的标签。根据全概率公式,分子都是$P(X=x)$,因此计算时分子最大化即可。

3.基于Flow的贝叶斯网络模型

如果输入数据$z\sim p(z)$,其结果$x=g(z)$,那么$z=f(x)=g^{-1}(x)$,$p(x)=p(f(x))|det\frac{\partial f(x)}{\partial x}|$ (Jacob行列式)。也就是说如果变换函数g是一一映射而且是可逆的,那么可以通过其反函数和z的分布计算出x的分布。

构建模型时一个简单的想法是把x分成两份,令$\begin{cases}y_1=x_1\\ y_2=x_2+m(x_1)\end{cases}$,其Jacob行列式为1,且反函数很好算$\begin{cases}x_1=y_1\\ x_2=y_2-m(y_1)\end{cases}$。公式中的m函数是任意一个符合g标准的变换。

如果想构建复杂的网络,可以把多个像上面这样的函数组合在一起串成一串。输入的自变量每经过一个函数变换其分布都会变复杂一点,经过n个函数变换后其分布足以拟合真实数据的分布。

这种网络的瓶颈在于为了保持函数是一一映射,其输入输出的维度需要是一样的。

4.一些示例

4.1.ZhuSuan库

珠算平台目前在github开源,处于开发阶段,需要下载后使用pip install .来安装。其主要功能如下$^{[1]}$:

zhusuan主要功能

4.1.1.贝叶斯逻辑回归

1
2
3
4
5
6
7
8
9
10
import zhusuan as zs
import tensorflow as tf

@zs.meta_bayesian_net(scope="blr")
def build_blr(x, alpha, D):
bn = zs.BayesianNet()
w = bn.normal('w', mean=tf.zeros([D]), std=alpha, group_ndims=1)
y_logit = tf.reduce_sum(tf.expand_dims(w, 0)*x, axis=1)
bn.bernoulli('y', y_logit)
return bn

image-20220419213317032

4.1.2.变分自动编码器

1
2
3
4
5
6
7
8
9
10
# 生成网络
@zs.meta_bayesian_net(scope="vae", reuse_variables=True)
def build_vae(N, D):
bn = zs.BayesianNet()
z_mean = tf.zeros([N,D])
z = bn.normal('z', z_mean, std=1., group_ndims=1)
h = tf.layers.dense(z, 500, activation=tf.nn.relu)
x_logits = tf.layers.dense(h, 784)
bn.bernoulli('x', x_logits, group_ndims=1)
return bn
1
2
3
4
5
6
7
8
9
# 推断网络
@zs.reuse_variables("vae_q")
def build_q_net(h_dim, z_dim):
bn = zs.BayesianNet()
h = tf.layers.dense(x, h_dim, activation=tf.nn.relu)
z_mean = tf.layers.dense(h, z_dim)
z_logstd = tf.layers.dense(h, z_dim)
bn.normal('z', z_mean, logstd=z_logstd, group_ndims=1)
return bn

image-20220419214301959

4.2.论文


参考链接

  1. 贝叶斯深度学习前沿进展-朱军
  2. 神经网络(十三):贝叶斯神经网络
  3. 快速理解朴素贝叶斯法
  4. 珠算python库
  5. 珠算库在线文档

本博客所有文章除特别声明外均为原创,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!