使用稀疏矩阵的PYMC / Theano内存使用

时间:2016-05-31 23:13:41

标签: python theano pymc3

我使用最新版本的PYMC3 / Theano来计算以下简单逻辑回归模型的MAP估计值:

w ~ N(0, 1)
y ~ Bin(σ(Xw))

我的功能是严格分类的,我使用单热编码将设计矩阵转换为0和1的稀疏(CSR)矩阵。稀疏矩阵占用大约15MB,但我看到内存峰值高达4GB 。顺便提一下,这是具有相同尺寸的密集矩阵的大小。

以下是我的代码的简化版本

from __future__ import division, print_function

import numpy as np
import pymc3 as pm
from scipy import sparse as sp
from scipy.optimize import fmin_l_bfgs_b
from scipy.special import expit
from theano import sparse as S
np.random.seed(0)

# properties of sparse design matrix (taken from the real data)
N = 100000  # number of samples
M = 5000    # number of dimensions
D = 0.002   # matrix density

# fake data
mu0, sd0 = 0.0, 1.0
w = np.random.normal(mu0, sd0, M)
X = sp.random(N, M, density=D, format='csr', data_rvs=np.ones)
y = np.random.binomial(1, expit(X.dot(w)), N)

# estimate memory usage
size = X.data.nbytes + X.indices.nbytes + X.indptr.nbytes + y.nbytes
print('{:.2f} MB of data'.format(size / 1024 ** 2))

# model definition
with pm.Model() as model:
    w = pm.Normal('w', mu0, sd=sd0, shape=M)

    p = pm.sigmoid(S.dot(X, w.reshape((-1, 1)))).flatten()
    pm.Bernoulli('y', p, observed=y)

    print(pm.find_MAP(vars=[w], fmin=fmin_l_bfgs_b))

生成以下内存配置文件:memory profile

即使L-BFGS优化器计算出完全密集的Hessian(它没有),也只需要190MB。我怀疑在某个地方,X会自动转换为Numpy数组来实现一些Theano操作。

有没有人成功使用PYMC3中的稀疏矩阵?究竟问题可能存在的任何想法?

0 个答案:

没有答案