view sandbox/rbm/model.py @ 395:70019965f888

Basic, broken RBM implementation
author Joseph Turian <turian@gmail.com>
date Tue, 08 Jul 2008 20:14:21 -0400
parents sandbox/simple_autoassociator/model.py@36baeb7125a4
children e0c9357456e0
line wrap: on
line source

"""
The model for an autoassociator for sparse inputs, using Ronan Collobert + Jason
Weston's sampling trick (2008).
"""

import parameters

import globals
from globals import LR

import numpy
from numpy import dot
import random
random.seed(globals.SEED)

import pylearn.nnet_ops

def sigmoid(v):
#    if x < -30.0: return 0.0
#    if x > 30.0: return 1.0 
    return 1.0 / (1.0 + numpy.exp(-v))

def sample(v):
    assert len(v.shape) == 1
    x = numpy.zeros(v.shape)
    for i in range(v.shape[0]):
        assert v[i] >= 0 and v[i] <= 1
        if random.random() < v[i]: x[i] = 0
        else: x[i] = 1
    return x

class Model:
    def __init__(self):
        self.parameters = parameters.Parameters(randomly_initialize=True)

    def update(self, instance):
        """
        Update the L{Model} using one training instance.
        @param instance: A dict from feature index to (non-zero) value.
        @todo: Should assert that nonzero_indices and zero_indices
        are correct (i.e. are truly nonzero/zero).
        """
        v0 = numpy.zeros(globals.INPUT_DIMENSION)
        for idx in instance.keys():
            v0[idx] = instance[idx]

        q0 = sigmoid(self.parameters.b + dot(v0, self.parameters.w))
        h0 = sample(q0)
        p0 = sigmoid(self.parameters.c + dot(h0, self.parameters.w.T))
        v1 = sample(p0)
        q1 = sigmoid(self.parameters.b + dot(v1, self.parameters.w))
        print
        print "v[0]:", v0
        print "Q(h[0][i] = 1 | v[0]):", q0
        print "h[0]:", h0
        print "P(v[1][j] = 1 | h[0]):", p0
        print "v[1]:", v1
        print "Q(h[1][i] = 1 | v[1]):", q1

        print h0.shape
        print v0.T.shape
        print dot(h0, v0.T)
        print dot(q1, v1.T)
        self.parameters.w += LR * (dot(h0, v0.T) - dot(q1, v1.T))
        self.parameters.b += LR * (h0 - q1)
        self.parameters.c += LR * (v0 - v1)