Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Normalizing Flow 理解与实现

Normalizing Flow 理解与实现

作者头像
为为为什么
发布于 2023-05-24 06:25:52
发布于 2023-05-24 06:25:52
61400
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:0
代码可运行

前文介绍了 标准化流 ,本文做简单尝试加深理解。

标准化流

Flow 通过多层可逆映射的精巧变换实现分布之间的转换,通过这种方式拟合复杂的分布;

有些和多层的卷积拟合复杂函数相似的感觉,只是处理的是分布转换。

标准化是因为转换过程必须万分小心,每一步 Flow 的输入输出均为分布,即需要满足和为1 的约束,体积不变,我是这么理解的。

实现流程

原始项目:https://github.com/abdulfatir/normalizing-flows

从中摘出了一个简单示例。

引入 normflows 包

安装包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install normflowsv

引入包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import numpy as np
import normflows as nf

初始分布

用生成器表示,采样得到点位置和该点概率密度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
q0 = nf.distributions.DiagGaussian(2)

展示

由于是生成器,只能随机生成点,因此生成很多很多点,统计直方图作为初始分布示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Plot initial flow distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()

目标分布

目标分布为评估器,给定点,输出该点的概率密度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target = nf.distributions.TwoModes(2, 0.1)

展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Plot target distribution
grid_size = 200
xx, yy = torch.meshgrid(torch.linspace(-3, 3, grid_size), torch.linspace(-3, 3, grid_size))
z = torch.cat([xx.unsqueeze(2), yy.unsqueeze(2)], 2).view(-1, 2)
log_prob = target.log_prob(z.to(device)).to('cpu').view(*xx.shape)
prob = torch.exp(log_prob)

plt.figure(figsize=(10, 10))
plt.pcolormesh(xx, yy, prob)
plt.show()

Flows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
K = 16
flows = []
for i in range(K):
    flows += [nf.flows.Planar((2,))]

创建最简单的 Planar 流,

模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nfm = nf.NormalizingFlow(q0=q0, flows=flows, p=target)

训练
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Train model
max_iter = 20000
num_samples = 2 * 20
anneal_iter = 10000
annealing = True
show_iter = 200


loss_hist = np.array([])

optimizer = torch.optim.Adam(nfm.parameters(), lr=1e-3, weight_decay=1e-4)
for it in tqdm(range(max_iter)):
    optimizer.zero_grad()
    if annealing:
        loss = nfm.reverse_kld(num_samples, beta=np.min([1., 0.01 + it / anneal_iter]))
    else:
        loss = nfm.reverse_kld(num_samples)
    loss.backward()
    optimizer.step()
    
    loss_hist = np.append(loss_hist, loss.to('cpu').data.numpy())
    

整体代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import required packages
import torch
import numpy as np
import normflows as nf
import mtutils as mt
from matplotlib import pyplot as plt
from tqdm import tqdm


K = 16
#torch.manual_seed(0)

# Move model on GPU if available
enable_cuda = True
device = torch.device('cuda' if torch.cuda.is_available() and enable_cuda else 'cpu')

flows = []
for i in range(K):
    flows += [nf.flows.Planar((2,))]
target = nf.distributions.TwoModes(2, 0.1)

## 初始分布
q0 = nf.distributions.DiagGaussian(2)
nfm = nf.NormalizingFlow(q0=q0, flows=flows, p=target)
nfm.to(device)



# Plot target distribution
grid_size = 200
xx, yy = torch.meshgrid(torch.linspace(-3, 3, grid_size), torch.linspace(-3, 3, grid_size))
z = torch.cat([xx.unsqueeze(2), yy.unsqueeze(2)], 2).view(-1, 2)
log_prob = target.log_prob(z.to(device)).to('cpu').view(*xx.shape)
prob = torch.exp(log_prob)

plt.figure(figsize=(10, 10))
plt.pcolormesh(xx, yy, prob)
plt.show()

# Plot initial flow distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()



# Train model
max_iter = 20000
num_samples = 2 * 20
anneal_iter = 10000
annealing = True
show_iter = 200


loss_hist = np.array([])

optimizer = torch.optim.Adam(nfm.parameters(), lr=1e-3, weight_decay=1e-4)
for it in tqdm(range(max_iter)):
    optimizer.zero_grad()
    if annealing:
        loss = nfm.reverse_kld(num_samples, beta=np.min([1., 0.01 + it / anneal_iter]))
    else:
        loss = nfm.reverse_kld(num_samples)
    loss.backward()
    optimizer.step()
    
    loss_hist = np.append(loss_hist, loss.to('cpu').data.numpy())
    
    # Plot learned distribution
    if (it + 1) % show_iter == 0:
        torch.cuda.manual_seed(0)
        z, _ = nfm.sample(num_samples=2 ** 20)
        z_np = z.to('cpu').data.numpy()
        
        plt.figure(1, figsize=(10, 10))
        plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
        # plt.pause(0.1)
        image = mt.convert_plt_to_rgb_image(plt)
        mt.cv_rgb_imwrite(image, f"res/{it}.jpg")


# plt.figure(figsize=(10, 10))
# plt.plot(loss_hist, label='loss')
# plt.legend()
# plt.show()

# Plot learned distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()

实现效果

200 iter / frame

参考资料

文章链接: https://cloud.tencent.com/developer/article/2291036

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年5月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
支持向量机(SVM)之Mercer定理与损失函数----5
任何时代,大部分人的研究所得都不过是基于前人的研究成果,前人所做的是开创性工作,而这往往是最艰难最有价值的,他们被称为真正的先驱。牛顿也曾说过,他不过是站在巨人的肩上。你,我,更是如此。 本次文章的大纲: 1----线性学习器之感知机 2----非线性学习器之Mercer定理 3----常用损失函数分析 1----线性学习器 1-1----感知机 这个感知机算法是1956 年提出的,年代久远,依然影响着当今,当然,可以肯定的是,此算法亦非最优,后续会有更详尽阐述。不过,有一点,你必须清楚,这个算法是为了干嘛
昱良
2018/04/04
3.7K0
支持向量机(SVM)之Mercer定理与损失函数----5
机器学习开篇
总第76篇 声明: 1、接下来的关于机器学习的专题内容都会借鉴李航老师的《统计学习方法》。 2、李航老师的书籍中把机器学习称为统计机器学习,我们在文章中简称为统计学习。 01|统计学习概览: 1、统计学习的概念 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 2、统计学习的对象 统计学习的对象是数据,它从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,然后对数据进行分析与预测。 作为统计学习的对象,数据的形式是多样的,包括存在于计算机中的各种数字、
张俊红
2018/04/11
6240
机器学习开篇
机器学习基础之模型评估(四)
标题: 损失函数与风险 正则化 这次,我们来介绍一下机器学习模型中常用到的一种对付模型过拟合问题的方法,也是许多模型常用的优化模型的一个方法:正则化。 正则化是一个典型的用于选择模型的方法。它是结构风险最小化策略的实现,是在经验风险上加一个正则化项或罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。 要了解正则化具体是做啥的,我们还得从讨论结构风险最小化开始。下面,我们就来讲讲损失函数与风险。 损失函数与风险 什么是结构风险?我们可以将它看作为是对经验风险的一个优化。经验风险又是啥呢
企鹅号小编
2018/01/16
9640
机器学习基础之模型评估(四)
统计学习的三个招式:模型、策略和算法 | 山人聊算法 | 2nd
可以说模型、策略和算法是统计学习的三个重要因素,确定了三个要素也就确定了整个方法。也就是说建模的基本框架就定下来了。
用户7623498
2020/08/04
1.1K0
统计学习的三个招式:模型、策略和算法 | 山人聊算法 | 2nd
《统计学习方法》笔记-统计学习方法概论-1
统计学习(statistical learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。
iOSDevLog
2019/05/31
5440
机器学习学习笔记(1) -- 简析入门
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科;机器学习是一种偏向于技术的方法,研究目的包括模式识别、神经网络和深度学习;机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法,机器学习算法是一类从数据中自动分析获取规律并利用找到的规律对未知数据进行预测的算法。
挽风
2021/04/13
3460
《统计学习方法》读书笔记
【第1章】 统计学习方法概论 【第2章】 感知机 【第3章】 k 近邻法 【第4章】 朴素贝叶斯法 【第5章】 决策树 【第6章】 逻辑斯谛回归与最大熵模型 【第7章】 支持向量机 【第8章】 提升方法 【第9章】 EM算法及其推广 【第10章】 隐马尔科夫模型 【第11章】 条件随机场 【第12章】 统计学习方法总结
echobingo
2018/09/26
1.6K0
统计学习方法法导论_1
统计学习的对象是数据data。统计学中的数据通常是以变量或者变量组来表示数据。数据分为连续型和离散型,书中主要讨论的是离散型数据。
皮大大
2021/03/02
7210
《统计学习方法》笔记一 统计学习方法概论
  输入与输出所有可能取值的集合成为输入空间与输出空间。每个具体的输入是一个实例,通常由特征向量表示,所有特征向量存在的空间成为特征空间。
闪电gogogo
2018/10/11
7030
《统计学习方法》笔记一 统计学习方法概论
统计学习方法(一)——统计学习方法概论
统计学习(statistical learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测和分析的一门学科。统计学习也称为统计机器学习(statistical machine learning)。现在人们提到的机器学习往往是指统计机器学习。
Tyan
2019/05/25
9210
StatisticLearning
1.泛化误差/期望损失(风险函数):是理论模型f(X)关于联合分布P(X,Y)的平均意义下的损失.
DuncanZhou
2018/09/04
5640
读书笔记:第二章机器学习
机器学习(Machine Learning,ML)就是让计算机从数据中进行自动学习,得到某种知识(或规律)。
小胡胡说
2020/08/10
8040
统计学习方法 一到四章笔记
做一些常见算法的分类: 非概率模型:感知机、支持向量机、k近邻、adaboost、k-means、潜在语义分析、神经网络 概率模型:决策树、朴素贝叶斯、隐马尔科夫模型、条件随机场、概率潜在语义分析、潜在迪利克雷分配、高斯混合模型 而logistic回归两类都属于。
Sarlren
2023/03/16
4160
统计学习方法 一到四章笔记
机器学习入门概览
作者简介:申泽邦(Adam Shan),兰州大学在读硕士研究生,主攻无人驾驶,深度学习。 ▌基本概念 我们从一个实例来了解机器学习的基本概念。假设我们现在面临这样一个任务(Task) ,任务的内容是识别手写体的数字。对于计算机而言,这些手写数字是一张张图片,如下所示: 对人来说,识别这些手写数字是非常简单的,但是对于计算机而言,这种任务很难通过固定的编程来完成,即使我们把我们已经知道的所有手写数字都存储到数据库中,一旦出现一个全新的手写数字(从未出现在数据库中),固定的程序就很难识别出这个数字来。所以,在这
用户1737318
2018/07/20
2760
机器学习(八)经验风险与结构风险
模型f(x)关于训练数据集的平均损失称之为经验风险(emprical risk)或经验损失(empirical loss),记作R(emp)
Maynor
2023/11/08
4440
机器学习(八)经验风险与结构风险
言简意赅了解十大常见AI算法
二分类的线性分类模型,也是判别模型。 目的是求出把训练数据进行线性划分的分离超平面。 感知机是神经网络和支持向量机的基础。 学习策略:极小化损失函数。损失函数对应于误分类点到分离超平面的总距离。 基于随机梯度下降法对损失函数的最优化算法,有原始形式和对偶形式。
zenRRan
2019/11/20
1K0
模型之母:简单线性回归&最小二乘法
关于作者:Japson。某人工智能公司AI平台研发工程师,专注于AI工程化及场景落地。持续学习中,期望与大家多多交流技术以及职业规划。
木东居士
2019/10/24
3.1K0
统计机器学习理论
模型选择的方法,正则化可以理解成一种对学习策略的改进(防止模型过拟合),在常规的风险函数或者损失函数的基础上加上一个正则化项或者叫罚项,一般具有以下形式:
爱编程的小明
2022/09/06
4650
统计机器学习理论
统计学习方法之概论1.基础概念2.统计学习三要素3.模型评估与模型选择、正则化和交叉验证4.分类问题、标注问题、回归问题5.学习小结
1.基础概念 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,也称统计机器学习。统计学习是数据驱动的学科,是一门概率论、统计学、信息论、计算理论、最优化理论及计算机科学等多个领域的交叉学科。 统计学习的对象是数据,它从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,又回到对数据的分析与预测中去。统计学习关于数据的基本假设是同类数据具有一定的统计规律性,这是统计学习的前提。 统计学习的目的就是考虑学习什么样的模型和如何学习模型。 统计学习方法包括模型的假
JasonhavenDai
2018/04/11
1.1K0
统计学习方法之概论1.基础概念2.统计学习三要素3.模型评估与模型选择、正则化和交叉验证4.分类问题、标注问题、回归问题5.学习小结
机器学习中的目标函数总结
几乎所有的机器学习算法最后都归结为求解最优化问题,以达到我们想让算法达到的目标。为了完成某一目标,需要构造出一个“目标函数”来,然后让该函数取极大值或极小值,从而得到机器学习算法的模型参数。如何构造出一个合理的目标函数,是建立机器学习算法的关键,一旦目标函数确定,接下来就是求解最优化问题,这在数学上一般有现成的方案。如果你对最优化算法感兴趣,可以阅读SIGAI之前的公众号文章“理解梯度下降法”,“理解牛顿法”,“理解凸优化”,“机器学习中的最优化算法总结”。本文的侧重点是对目标函数的构造进行总结。
SIGAI学习与实践平台
2018/09/17
2.9K0
机器学习中的目标函数总结
推荐阅读
相关推荐
支持向量机(SVM)之Mercer定理与损失函数----5
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验