首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续RBM:仅对负值输入数据表现不佳?

连续RBM:仅对负值输入数据表现不佳?
EN

Stack Overflow用户
提问于 2013-07-01 07:23:01
回答 2查看 2.3K关注 0票数 3

我尝试将这个连续RBM的python实现移植到Matlab:http://imonad.com/rbm/restricted-boltzmann-machine/

我生成了一个(有噪声的)圆圈形状的二维训练数据,并训练了具有2个可见和8个隐藏层的rbm。为了测试实现,我向RBM提供了均匀分布的随机数据,并绘制了重建的数据(与上面链接中使用的过程相同)。

现在令人困惑的部分:当训练数据在(0,1)x(0,1)的范围内时,我得到了非常令人满意的结果,但是当训练数据在(-0.5,-0.5)x(-0.5,-0.5)或(-1,0)x(-1,0)的范围内时,RBM仅在圆圈的最右上角重建数据。我不明白是什么导致了这种情况,是不是我的实现中有一个我看不到的bug?

一些图,蓝点是训练数据,红点是重建数据。

以下是我实现的RBM: Training:

代码语言:javascript
复制
maxepoch = 300;
ksteps = 10;
sigma = 0.2;        % cd standard deviation
learnW = 0.5;       % learning rate W
learnA  = 0.5;      % learning rate A
nVis = 2;           % number of visible units
nHid = 8;           % number of hidden units
nDat = size(dat, 1);% number of training data points
cost = 0.00001;     % cost
moment = 0.9;      % momentum
W = randn(nVis+1, nHid+1) / 10; % weights
dW = randn(nVis+1, nHid+1) / 1000; % change of weights
sVis = zeros(1, nVis+1);    % state of visible neurons
sVis(1, end) = 1.0;         % bias
sVis0 = zeros(1, nVis+1);   % initial state of visible neurons
sVis0(1, end) = 1.0;        % bias
sHid = zeros(1, nHid+1);    % state of hidden neurons
sHid(1, end) = 1.0;         % bias
aVis  = 0.1*ones(1, nVis+1);% A visible
aHid  = ones(1, nHid+1);    % A hidden
err = zeros(1, maxepoch);
e = zeros(1, maxepoch);
for epoch = 1:maxepoch
    wPos = zeros(nVis+1, nHid+1);
    wNeg = zeros(nVis+1, nHid+1);
    aPos = zeros(1, nHid+1);
    aNeg = zeros(1, nHid+1);
    for point = 1:nDat
        sVis(1:nVis) = dat(point, :);
        sVis0(1:nVis) = sVis(1:nVis); % initial sVis
        % positive phase
        activHid;
        wPos = wPos + sVis' * sHid;
        aPos = aPos + sHid .* sHid;
        % negative phase
        activVis;
        activHid;
        for k = 1:ksteps
            activVis;
            activHid;
        end
        tmp = sVis' * sHid;
        wNeg = wNeg + tmp;
        aNeg = aNeg + sHid .* sHid;
        delta = sVis0(1:nVis) - sVis(1:nVis);
        err(epoch) = err(epoch) + sum(delta .* delta);
        e(epoch) = e(epoch) - sum(sum(W' * tmp));
    end
    dW = dW*moment + learnW * ((wPos - wNeg) / numel(dat)) - cost * W;
    W = W + dW;
    aHid = aHid + learnA * (aPos - aNeg) / (numel(dat) * (aHid .* aHid));
    % error
    err(epoch) = err(epoch) / (nVis * numel(dat));
    e(epoch) = e(epoch) / numel(dat);
    disp(['epoch: ' num2str(epoch) ' err: ' num2str(err(epoch)) ...
    ' ksteps: ' num2str(ksteps)]);
end
save(['rbm_' filename '.mat'], 'W', 'err', 'aVis', 'aHid');

activHid.m:

代码语言:javascript
复制
sHid = (sVis * W) + randn(1, nHid+1);
sHid = sigFun(aHid .* sHid, datRange);
sHid(end) = 1.; % bias

activVis.m:

代码语言:javascript
复制
sVis = (W * sHid')' + randn(1, nVis+1);
sVis = sigFun(aVis .* sVis, datRange);
sVis(end) = 1.; % bias

sigFun.m:

代码语言:javascript
复制
function [sig] = sigFun(X, datRange)
    a = ones(size(X)) * datRange(1);
    b = ones(size(X)) * (datRange(2) - datRange(1));
    c = ones(size(X)) + exp(-X);
    sig = a + (b ./ c);
end

重建:

代码语言:javascript
复制
nSamples = 2000;
ksteps = 10;
nVis = 2;
nHid = 8;
sVis = zeros(1, nVis+1);    % state of visible neurons
sVis(1, end) = 1.0;         % bias
sHid = zeros(1, nHid+1);    % state of hidden neurons
sHid(1, end) = 1.0;         % bias
input = rand(nSamples, 2);
output = zeros(nSamples, 2);
for sample = 1:nSamples
    sVis(1:nVis) = input(sample, :);
    for k = 1:ksteps
        activHid;
        activVis;
    end
    output(sample, :) = sVis(1:nVis);
end
EN

回答 2

Stack Overflow用户

发布于 2014-02-07 14:32:14

RBM最初被设计为只处理二进制数据。但也可以处理0到1之间的数据。这是算法的一部分。Further reading

票数 2
EN

Stack Overflow用户

发布于 2015-10-02 16:58:11

因为x和y的输入都在0-1的范围内,这就是为什么它们会留在那个区域。将输入更改为input = (rand(nSamples, 2)*2) -1;将导致从-1 1范围内采样的输入,因此红点将在圆周围更加分散。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17395751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档