2019-10-29 10:29:09

第十七章 受限波尔兹曼机

76 / 0 / 0 / 0

受限波尔兹曼机(Restricted Boltzmann Machine-RBM)

受限波尔兹曼机是在波尔兹曼机的基础上发展起来的,这是深度信念网络的基础,RBM包含两个层,可见层(visible layer)和隐藏层(hidden layer)。神经元之间的连接具有如下特点:层内无连接,层间全连接,显然RBM对应的图是一个二分图。一般来说,可见层单元用来描述观察数据的一个方面或一个特征,而隐藏层单元的意义一般来说并不明确,可以看作特征提取层。

RBM和BM的不同之处在于,BM允许层内神经元之间有连接,而RBM则要求层内神经元之间没有连接,因此RBM的性质:当给定可见层神经元的状态时,各隐藏层神经元的激活条件独立;反之当给定隐藏层神经元的状态是,可见层神经元的激活也条件独立。

如图给出了一个RBM网络结构示意图。其中: $n_v,n_h$分别标示可见层和隐藏层中包含神经元的数目。下标v,h代表visible和hidden. $v=(v_1,v<>2,...,v{n_v})^T$:可见层的状态向量,$v_i$表示可见层中第i个神经元的状态。 $h=(h_1,h<>2,...,h{n_h})^T$:隐藏层的状态向量,$h_j$表示隐藏层中第j个神经元的状态 $a=(a_1,a<>2,...,a{n_v})^T \in R^{n_v} $:可见层的偏置向量,$a_i$表示可见层中第i个神经元的偏置。 $b=(b_1,b<>2,...,b{n_v})^T \in R^{n_v} $:隐藏层的偏置向量,$b<>i$表示隐藏层中第j个神经元的偏置。 $W \in (w{i,j}) R^{n<>v} $:隐藏层和可见层之间的权值矩阵,$w{ij}$表示隐藏层中第i个神经元与可见层中第j个神经元之间的连接权重。

受限波尔兹曼机跟Hopfield一样可以恢复失真的信号,跟所有的Hopfield一样,通过已有的数据构建网络的各个参数,$w,a,b$,求出了各个参数后,相当于创建了这一网络,在通过网络恢复失真的信号。把失真的信号输入后,先计算得出h,再通过反向回来得到最后的信号。

$$h=sigmoid(wv+a)$$ $$out=sigmoid(w^Th+b)$$

计算得出out后,就是对原有信号的还原。

虽然受限波尔兹曼机是波尔兹曼机的进一步优化,但是它构建网络参数也就是求解连接参数的方法是不一样的。

受限波尔兹曼机的求解过程使用的是神经网络的方法:梯度算法。

受限波尔兹曼机的能量和概率分布来之于:Boltzmann distribution

能源函数如下:

$$E<>{\theta}(v,h)=-\sum{i=1}^{n_v}a_iv<>i-\sum{j=1}^{n_h}b_jh<>j-\sum{i=1}^{n<>v}\sum{j=1}{n_h}h<>jw{j,i}v_i$$

状态(v,h)的联合分布为:

$$P<>\theta(v,h)=\frac{1}{Z\theta}e^{-E_\theta(v,h)}$$

其中

$$Z<>\theta=\sum{v,h}e^{-E_\theta(v,h)}$$

通过边缘分布可以得出V的分布:

$$P_\theta(v)=\sum<>hP\theta(v,h)=\frac{1}{Z_\theta}\sum<>he^{-E\theta(v,h)}$$

同样的有h的分布:

$$P_\theta(h)=\sum<>vP\theta(v,h)=\frac{1}{Z_\theta}\sum<>ve^{-E\theta(v,h)}$$

可以这样进行简单的理解,在波尔兹曼机引入了概率以后,每一个节点的输出符合某一概率分布。

有了概率分布以后,我们训练的模型使得观察到的数据最大概率的出现,可以使用极大似然来求解这一过程。

假设训练样本集合为:

$$S={ {V^1,V^2,...,V^{n_s}} }$$

似然函数可以如下表示:

$$lnL<>{\theta,S}=ln\prod P(v^i)=\sum{i=1}^{n_s}lnP(v^i)$$

根据梯度公式,可以得出各个公式的计算过程:

$$W<>{i,j}=W{i,j}+\frac{\partial P(v)}{\partial w<>{i,j}}$$ $$a{i,j}=a<>{i}+\frac{\partial P(v)}{\partial a{i}}$$ $$b<>{i}=b{i}+\frac{\partial P(v)}{\partial b_{i}}$$

省去具体的推倒过程,最后各个参数的更新过程如下:

$$W\leftarrow W+\epsilon (P(h_1=1|v_1)v_1^T-P(h_2=1|v_2)v_2^T)$$

$$a\leftarrow a+\epsilon (v_1-v_2)$$

$$b\leftarrow b+\epsilon (P(h_1=1|v_1)v_1^T-P(h_2=1|v_2)$$

其中$\epsilon$表示学习速率,$P(h_1=1|v_1)$采用对比cd,也就是采样两种sample_h_given_v和sample_v_given_h,采用的过程如下:

def sample_h_given_v(self, v0_sample):
    h1_mean = self.propup(v0_sample)
    h1_sample = self.numpy_rng.binomial(size=h1_mean.shape, n=1, p=h1_mean)
    return [h1_mean, h1_sample]

def sample_v_given_h(self, h0_sample):
    v1_mean = self.propdown(h0_sample)
    v1_sample = self.numpy_rng.binomial(size=v1_mean.shape, n=1, p=v1_mean)
    return [v1_mean, v1_sample]

其中propup和propdown是预测v,h的过程,如下:

def propup(self, vis):
    pre_sigmoid_activation = numpy.dot(vis, self.W) + self.hbias
    return sigmoid(pre_sigmoid_activation)

def propdown(self, hid):
    pre_sigmoid_activation = numpy.dot(hid, self.W.T) + self.vbias
    return sigmoid(pre_sigmoid_activation)

计算过程如下:

def get_cost_updates(self, lr=0.1, persistent=None, k=1):
    ph_mean, ph_sample = self.sample_h_given_v(self.input)

    if persistent is None:
      chain_start = ph_sample
    else:
      chain_start = persistent

    for step in xrange(k):
      if step == 0:
        nv_means, nv_samples,\
        nh_means, nh_samples = self.gibbs_hvh(chain_start)
      else:
        nv_means, nv_samples,\
        nh_means, nh_samples = self.gibbs_hvh(nh_samples)

    self.W += lr * (numpy.dot(self.input.T, ph_mean)
                    - numpy.dot(nv_samples.T, nh_means))
    self.vbias += lr * numpy.mean(self.input - nv_samples, axis=0)
    self.hbias += lr * numpy.mean(ph_mean - nh_means, axis=0)

    monitoring_cost = numpy.mean(numpy.square(self.input - nv_means))

    return monitoring_cost

通过进行迭代,最后确定了,也就确定了网络,输入失真信号通过网络计算得出的结果即为最靠近的真实信号:

def reconstruct(self, v):
        h = sigmoid(numpy.dot(v, self.W) + self.hbias)
        reconstructed_v = sigmoid(numpy.dot(h, self.W.T) + self.vbias)
        return reconstructed_v

受限波尔兹曼机在修正信号的过程相当于两个过程,一个是编码过程,也就是通过数据训练参数的过程,一个是解码过程,失真信号通过网络参数计算得出另一个信号的过程。

但是在真实环境中,什么样的情况能用这种失真信号来代表呢?

在推荐系统中,有这样的一种场景,比如电影推荐,一种方式是自己已经看了一定量的电影,也对某些电影打过了分数,系统能不能估计他还没有打过分数的电影的分数,通过分数的高低来进行推荐?这里把所有的电影分数当成一个输入,n部电影即为n维向量,这个用户里由于电影并未打分,可以看出一种失真的n维信号,如果我们能够用已有的数据训练一个受限波尔兹曼机,就能修复这种失真的信号,也就是为未打分的电影进行了评分。

受限波尔兹曼机的应用还非常的多,而且也非常的有效,具体的例子可以参看相关的文献。

PS: 如本文对您有疑惑,可加QQ:1752338621 进行讨论。

0 条评论

0
0
官方
微信
官方微信
Q Q
咨询
意见
反馈
返回
顶部