【生成模型】浅析玻尔兹曼机的原理和实践

机器学习笔记之玻尔兹曼机(一)基本介绍 在受限玻尔兹曼机——模型表示(Representation)一节中以玻尔兹曼机为引,介绍了受限玻尔兹曼机。从本节开始,将正式介绍玻尔兹曼机。相比于它的表示和推断过程,我们更关注它在求解过程中出现的问题。 阅读详情

这一期将介绍另一种生成模型—玻尔兹曼机,虽然它现在已经较少被提及和使用,但其对概率密度函数的处理方式能加深我们对生成模型的理解。

                                          作者&编辑 | 小米粥

1 玻尔兹曼机

玻尔兹曼机属于另一种显式概率模型,它是一种基于能量的模型。训练玻尔兹曼机同样需要基于极大似然的思想,但在计算极大似然的梯度时,运用了一种不同于变分法的近似算法。玻尔兹曼机已经较少引起关注,故在此我们只简述。

在能量模型中,通常将样本的概率p(x)建模成如下形式:

其中,Z为配分函数。为了增强模型的表达能力,通常会在可见变量h的基础上增加隐变量v,以最简单的受限玻尔兹曼机RBM为例,RBM中的可见变量和隐变量均为二值离散随机变量(当然也可推广至实值)。它定义了一个无向概率图模型,并且为二分图,其中可见变量v组成一部分,隐藏变量h组成另一部分,可见变量之间不存在连接,隐藏变量之间也不存在连接(“受限”即来源于此),可见变量与隐藏变量之间实行全连接,结构如下图所示:

在RBM中,可见变量和隐藏变量的联合概率分布由能量函数给出,即

其中能量函数的表达式为

配分函数Z可写为

考虑到二分图的特殊结构,发现在隐藏变量已知时,可见变量之间彼此独立;当可见变量已知时,隐藏变量之间也彼此独立,即有

以及

进一步地,可得到离散概率的具体表达式:

为了使得RBM与能量模型有一致的表达式,定义可见变量v的自由能f(v)为

其中hi为第i个隐藏变量,此时可见变量的概率为

配分函数Z。使用极大似然法训练RBM模型时,需要计算似然函数的梯度,记模型的的参数为θ ,则

可以看出,RBM明确定义了可见变量的概率密度函数,但它并不易求解,因为计算配分函数  Z 需要对所有的可见变量v和隐藏变量h求积分,所以对数似然log p(v)也无法直接求解,故无法直接使用极大似然的思想训练模型。但是,若跳过对数似然函数的求解而直接求解对数似然函数的梯度,也可完成模型的训练。对于其中的权值、偏置参数有:

分析其梯度表达式,其中不易计算的部分在于对可见变量v的期望的计算。RBM通过采样的方法来对梯度进行近似,然后使用近似得到的梯度进行权值更新。为了采样得到可见变量v,可构建一个马尔科夫链并使其最终收敛到p(v),即马尔科夫链的平稳分布为p(v)。初始随机给定样本,迭代运行足够次数后达到平稳分布,这时可根据转移矩阵从模型分布p(v)连续采样得到样本。我们可使用吉布斯采样方法完成该过程,由于两部分变量的独立性,当固定可见变量(或隐藏变量)时,隐藏变量(可见变量)的分布分别为h(n+1) ~sigmoid(WTv(n)+c)和 v(n+1)~sigmoid(Wv(n+1)+b)  ,即先采样得到隐藏变量,再采样得到可见变量,这样,我们便可以使用“随机最大似然”完成生成模型的训练了。

玻尔兹曼机依赖马尔可夫链来训练模型或者使用模型生成样本,但是这种技术现在已经很少被使用了,很可能是因为马尔可夫链近似技术不能被适用于像ImageNet的生成问题。并且,即便是马尔可夫链方法可以很好的用于训练,但是使用一个基于马尔可夫链的模型生成样本是需要花费很大计算代价。

2 玻尔兹曼机代码

import numpy as np

import torch

import torch.utils.data

import torch.nn as nn

import torch.nn.functional as F

import torch.optim as optim

from torch.autograd import Variable

from torchvision import datasets, transforms

from torchvision.utils import make_grid, save_image

import matplotlib.pyplot as plt

 batch_size = 64

train_loader = torch.utils.data.DataLoader(

    datasets.MNIST('../data', train=True, download=True, transform=transforms.Compose([      transforms.ToTensor()])),batch_size=batch_size)

 test_loader = torch.utils.data.DataLoader(    datasets.MNIST('../data', train=False, transform=transforms.Compose([                       transforms.ToTensor()])),batch_size=batch_size)

 class RBM(nn.Module):

    def __init__(self, n_vis=784, n_hin=500, k=5):

        super(RBM, self).__init__()

        self.W = nn.Parameter(torch.randn(n_hin, n_vis) * 1e-2)

        self.v_bias = nn.Parameter(torch.zeros(n_vis))

        self.h_bias = nn.Parameter(torch.zeros(n_hin))

        self.k = k

    def sample_from_p(self, p):

        return F.relu(torch.sign(p - Variable(torch.rand(p.size()))))

    def v_to_h(self, v):

        p_h = F.sigmoid(F.linear(v, self.W, self.h_bias))

        sample_h = self.sample_from_p(p_h)

        return p_h, sample_h

    def h_to_v(self, h):

        p_v = F.sigmoid(F.linear(h, self.W.t(), self.v_bias))

        sample_v = self.sample_from_p(p_v)

        return p_v, sample_v

    def forward(self, v):

        pre_h1, h1 = self.v_to_h(v)

        h_ = h1

        for _ in range(self.k):

            pre_v_, v_ = self.h_to_v(h_)

            pre_h_, h_ = self.v_to_h(v_)

        return v, v_

    def free_energy(self, v):

        vbias_term = v.mv(self.v_bias)

        wx_b = F.linear(v, self.W, self.h_bias)

        hidden_term = wx_b.exp().add(1).log().sum(1)

        return (-hidden_term - vbias_term).mean()

 rbm = RBM(k=1)

 train_op = optim.SGD(rbm.parameters(),0.1)

 for epoch in range(10):

    loss_ = []

    for _, (data, target) in enumerate(train_loader):

        data = Variable(data.view(-1, 784))

        sample_data = data.bernoulli()

        print(sample_data[0])

        v, v1 = rbm(sample_data)

        loss = rbm.free_energy(v) - rbm.free_energy(v1)

        #loss_.append(loss.data[0])

        train_op.zero_grad() 

        loss.backward()

        train_op.step()

    print np.mean(loss_)

 show_adn_save("real",make_grid(v.view(32,1,28,28).data))

 show_adn_save("generate",make_grid(v1.view(32,1,28,28).data))

 def show_adn_save(file_name,img):

    npimg = np.transpose(img.numpy(),(1,2,0))

    f = "./%s.png" % file_name

    plt.imshow(npimg)

    plt.imsave(f, npimg)

[1] 伊恩·古德费洛, 约书亚·本吉奥, 亚伦·库维尔. 深度学习

[2]李航. 统计机器学习

总结

本期带大家学习了玻尔兹曼机,至此几种显式生成模型都介绍完了,除了显式模型就是大家非常熟悉的隐式生成模型了,其主要的代表是GAN,我们生态已经介绍过许多内容,大家可以去学习。

个人知乎,欢迎关注

GAN群

有三AI建立了一个GAN群,便于有志者相互交流。感兴趣的同学也可以微信搜索xiaozhouguo94,备注“加入有三-GAN群”。

更多GAN的学习

知识星球是有三AI的付费内容社区,里面包超过100种经典GAN模型的解读,了解详细请阅读以下文章:

【杂谈】有三AI知识星球指导手册出炉!和公众号相比又有哪些内容?

有三AI秋季划GAN学习小组,可长期跟随有三学习GAN相关的内容,并获得及时指导,了解详细请阅读以下文章:

【杂谈】如何让2020年秋招CV项目能力更加硬核,可深入学习有三秋季划4大领域32个方向

转载文章请后台联系

侵权必究

往期精选

机器学习笔记之深度玻尔兹曼机(一)玻尔兹曼机系列整体介绍 从本节开始,将介绍玻尔兹曼机系列的最后一个模型——深度玻尔兹曼机(Deep Boltzmann Machine,DBM) 阅读详情

相关推荐

机器学习笔记之深度玻尔兹曼机——玻尔兹曼机系列整体介绍

因此,叠加RBM结构是基于训练出更优秀的P ( h ),从而产生更优秀的P ( v ) 的一种思想。块吉布斯采样的优势在于,由于隐变量、观测变量内部随机变量之间条件独立,因此关于随机变量的采样均可同步进行,而不需要使用基于‘坐标上升法’的吉布斯采样方式。但这种表示仅是通过梯度上升法对模型参数更新时,P ( h ) 仅是被联代着被更新,可能并没有达到当前迭代步骤关于P ( h ) 的最优解。玻尔兹曼机本质上是一个马尔可夫随机场(无向图模型),概率图中的随机变量结点均是服从伯努利分布的离散型随机变量。

QBoson的博客 1981

玻尔兹曼机与神经网络的对比:相似与不同

1.背景介绍 玻尔兹曼机(Boltzmann Machine)和神经网络(Neural Network)都是人工智能领域中的重要算法,它们在处理各种机器学习任务时都具有广泛的应用。玻尔兹曼机是一种随机布尔网络,它模拟了物理中的热力学过程,用于解决二分类问题。神经网络则是一种模仿生物大脑结构和工作原理的计算模型,用于处理各种复杂的计算和模式识别任务。在本文中,我们将对比分析玻尔兹曼机和神经网络的相...

AI天才研究院 2670

人工智能算法_人工智能算法模型库浅析

一、引言人工智能在近几年出现了突飞猛进的发展,尤其是深度学习的提出以及在多个领域的成功应用,使人工智能成为当前学术界和产业界的研究热点之一。如果把人工智能比作一辆轰鸣的战车,那么算法和模型则扮演着“发动机”的角色。“发动机”的质量在一定程度上直接影响、甚至决定了“战车”最终的效力。从学术角度来看,算法和模型一直以来都是人工智能研究的重点,涌现的大量成果直接推动了人工智能技术的迭代发展。从...

weixin_39611863的博客 2914

【深度学习】波尔次曼机,受限波尔兹曼机,DBN详解

神经网络自20世纪50年代发展起来后,因其良好的非线性能力、泛化能力而备受关注。然而,传统的神经网络仍存在一些局限,在上个世纪90年代陷入衰落,主要有以下几个原因: 1、传统的神经网络一般都是单隐层,最多两个隐层,因为一旦神经元个数太多、隐层太多,模型的参数数量迅速增长,模型训练的时间非常之久; 2、传统的神经网络,随着层数的增加,采用随机梯度下降的话一般很难找到最优解,容易陷入局部最优解。在反向传播过程中也容易出现梯度弥散或梯度饱和的情况,导致模型结果不理想; 3、随着神经网络层数的增加,深度神经网...

Mr_zhang66的博客 2215

深度生成模型 - 玻尔兹曼机(BM)篇

玻尔兹曼机(Boltzmann Machine, BM)作为计算机科学技术领域的一个重要概念,自2018年被全国科学技术名词审定委员会公布以来,便因其独特的网络结构和训练方式而受到广泛关注。作为一种由二值随机神经元构成的两层对称连接神经网络,玻尔兹曼机不仅借鉴了模拟退火的思想,还在学习(训练)阶段和运行(预测)阶段展现了与其他神经网络截然不同的特性。

绎岚科技的博客 1939

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种基于能量模型的人工神经网络。它只有一个隐层,将输入层和隐层中的每个神经元互相连接,但不同层的神经元之间没有连接。RBM是一种无向的概率图模型,可以用于特征提取、数据降维、协同过滤等任务。它是深度学习中的重要组成部分,可以用于训练多层神经网络如深度信念网络(DBN)和深度自编码器(DAE)。

gongdiwudu的专栏 1万+

受限玻尔兹曼机matlab代码_【生成模型】浅析玻尔兹曼机的原理和实践

这一期将介绍另一种生成模型—玻尔兹曼机,虽然它现在已经较少被提及和使用,但其对概率密度函数的处理方式能加深我们对生成模型的理解。 作者&编辑 | 小米粥 1 玻尔兹曼机玻尔兹曼机属于另一种显式概率模型,它是一种基于能量的模型。训练玻尔兹曼机同样需要基于极大似然的思想,但在计算极大似然的梯度时,运用...

weixin_39973009的博客 475

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 268

【通知】《生成对抗网络GAN原理与实践》代码开源,勘误汇总!

有三上个月出版了新书《生成对抗网络GAN:原理与实践》,Generative Adversarial Networks(中文名生成对抗网络,简称GAN)自从被提出来后,其发展就非常迅猛,几乎已经被应用于所有CNN可以使用的领域,应用涉及图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸与人体图像编辑,图像质量提升。学好GAN算法,对于计算机视觉领域从业,完全是有必要的。我们公众号输出过...

hacker_long的专栏 1223

价值投资/指标选股(akshare)

利用akshare的数据源,可以获取所有的股票数据以及公开的财务数据,可以进行条件筛选,获取满足条件的股票。 这套模板可以用于价值投资,指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak ## A 股上市公司的实时行情数据 stock_zh_a_spot_df = ak.stock_zh_a_spot() #print(stock_zh_a_spot_df) ##取前300测试 ##取前300测试 df_stock =...

qq_26742269的博客 1万+

手把手教你:基于STM32H7自制飞控,如何从零开始移植PX4固件(附避坑指南)

本文详细介绍了如何基于STM32H7自制飞控板并移植PX4固件的完整流程,包括硬件设计、开发环境搭建、关键配置文件移植、驱动开发与适配等关键步骤。特别针对PX4-AutoPilot的移植过程提供了实用技巧和避坑指南,帮助开发者高效完成飞控系统开发。

weixin_30271335的博客 144

浅析SAE与DBM(Deep Learning)

笔者实力有限,诸多错误之处还望指出。 SAE与DBN两个都可以用于提取输入集特征的算法。 SAE是由多个Spase AutoEncoder堆叠而成,单个Spase AutoEncoder的结构如下: 在堆叠成SAE时的结构如下: 以上SAE的结构可以化分为两个sparse autoencoder和一个 softmax(这里不讨论softmax).其中的两个sparse autoenc

meanme的专栏 7579

新手必看|HDevelop核心算子快速上手,为C#移植打基础

在上一篇文章中,我们完成了C#+HALCON的开发环境搭建。但在实际工业开发中,绝不会直接在C#中编写视觉算法HDevelop可视化调试算法 → 验证效果 → 导出C#代码 → 集成到上位机。HDevelop是HALCON专属的算法调试工具,支持实时预览图像、参数动态调节、零编译运行,是新手入门和工业算法调试的核心工具。本文聚焦工业场景高频使用的核心算子,从基础操作到实战案例,手把手教你使用HDevelop;同时重点讲解算法导出C#的规范,让你调试完成的算法,能无缝移植到WinForm上位机中。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 786

POWER(十一)charge pump原理

电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。

zhlwsh的博客 2829

mpv 源码深度解析:从 MPlayer 遗产到现代媒体播放器架构

做减法优于做加法:不值得维护的功能就移除(DVD 菜单、流缓存等)单线程事件驱动:核心逻辑在单线程中运行,通过 dispatch 队列处理并发分离关注点:demuxer 线程、VO 线程、脚本线程各司其职质量优先:使用 GPU 着色器而非固定功能硬件,默认软件解码(更可靠)可嵌入性:libmpv API 让 mpv 可以作为库嵌入其他应用mpv 是一个用纯 C 实现的、工程质量极高的媒体播放器。它的代码库展示了一个事实:C 语言完全可以通过良好的架构设计来实现复杂的多媒体系统。

世界那么大,我想去看看~【随心更新,看世界去了😄】 93

【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 739

40.8K星爆火!Crawl4AI实战突破Cloudflare 5秒盾:AI反爬新范式,爬虫再也不被封

Crawl4AI的爆火(40.8K星)不是偶然——它解决了爬虫工程师最头疼的反爬问题,让爬虫从“体力活”变成“脑力活”,不用再花费大量时间配置指纹、编写行为脚本。但要注意:爬虫必须遵守目标网站的robots.txt协议,不得用于非法爬取数据(比如用户隐私、商业机密)。合理使用技术,才能长久落地。如果你在使用Crawl4AI时遇到具体问题(比如绕过更严格的反爬、批量爬取配置),欢迎在评论区交流,我会第一时间分享解决方案!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1604

【总结】从视频到图文,代码实战,有三AI-GAN学习资料汇总!

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 934

LED灯闪烁实验:实验介绍

每个章节都会单独进行验证工作,例如Simulink开发的应用层软件,会在Simulink-TestHarness中进行仿真,通过Scope示波器模块输出0-1交替的结果。CubeIDE集成双方的代码后,会烧写到开发板中验证是否按照定义的时间进行闪烁。ST-LINK V2是STM32开发生态系统中常用的硬件调试接口,能够连接微控制器与开发环境,实现程序的下载、调试和分析。STM32F103C8T6最小系统板是基于STM32F103C8T6微控制器的开发板,本实验会涉及使用板载的连接PC13引脚的LED灯。

u013288925的博客 460

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)

GAN的研究和应用在这几年发展可以说是非常迅猛,无疑是这几年深度学习计算机视觉领域里落地性最酷的技术之一,包括图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸与人体图像编辑,图像质量提升等。GAN最早期也是最经典的任务,就是高质量图像生成,当前已经可以生成1024分辨率以上的高清逼真图像,如下图生成了一些假明星脸。图像翻译与风格化则是另外一个应用极其广泛的领域,因为从图像到图像的任务...

hacker_long的专栏 1040

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【总结】超100期经典GAN模型的解读,从结构设计到应用,你不动心吗?

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 1959

人工智能基础

初学者往往对人工智能的认识不够广泛,往往就集中于深度学习这一块,在学习一段时间后再回头重新学习导论,用高屋建瓴的视角俯瞰自己曾经学习的领域,对以后的研究方向有很大的好处。

亦梦亦醒乐逍遥的博客 4007

深度玻尔兹曼机与传统神经网络的对比分析

1.背景介绍 深度玻尔兹曼机(Deep Boltzmann Machine, DBM)是一种深度学习模型,它是一种生成模型,可以用于解决无监督学习和有监督学习问题。传统神经网络(Traditional Neural Networks, TNN)则是一种广泛应用于计算机视觉、自然语言处理等领域的前馈神经网络。在本文中,我们将对比分析这两种模型的核心概念、算法原理和具体操作步骤,以及它们在实际应用中...

AI天才研究院 2261

深度学习 --- 随机神经网络详解(玻尔兹曼机详解)

       前两节我们详细讨论了退火算法和玻尔兹曼分布,本节将使用这两个算法和Hopfield神经网络结合构成新的神经网络即随机神经网络又叫玻尔兹曼机,这个神经网络是模拟能量的特性,从能量角度出发,构造和能量过程类似的神经网络,之所以这样构建和Hopfield神经网络有很大的关系,稍后我们会看到和Hopfield神经网络的异同点。另外这个神经网络不具有实用性,因为计算量太大了,但是我们为什么还要...

进击的菜鸟 2万+

玻尔兹曼机

我将尝试介绍有关受限玻尔兹曼机器的直觉及其工作方式。 什么是玻尔兹曼机? 玻尔兹曼机器是能够学习内部表示的随机生成的神经网络,能够表示和(给定足够的时间)解决困难的组合问题。 玻尔兹曼机器如何工作? 玻尔兹曼机器如下所示: Boltzmann机器是仅有两种类型的节点(隐藏节点和可见节点)的非确定性(或随机)生成型深度学习模型。 没有输出节点!这似乎很奇怪,但这就是赋予他们这种不确定性的原因。它们没有典型的1或0类型输出,可使用随机梯度下降来学习和优化模式以进行输出。他们没有这种能力学习模式,这就是他们如此

None_Pan的博客 3315
上一篇: 【直播回放】60分钟了解各类图像和视频生成GAN结构
下一篇: 【CV秋季划】人脸算法那么多,如何循序渐进地学习好?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值