Mercurial > pylearn
view sandbox/sparse_random_autoassociator/main.py @ 436:d7ed780364b3
image_tools
author | Olivier Breuleux <breuleuo@iro.umontreal.ca> |
---|---|
date | Wed, 06 Aug 2008 19:39:14 -0400 |
parents | 36baeb7125a4 |
children |
line wrap: on
line source
#!/usr/bin/python """ An autoassociator for sparse inputs, using Ronan Collobert + Jason Weston's sampling trick (2008). The learned model is:: h = sigmoid(dot(x, w1) + b1) y = sigmoid(dot(h, w2) + b2) We assume that most of the inputs are zero, and hence that we can separate x into xnonzero, x's nonzero components, and xzero, a sample of the zeros. We sample---randomly without replacement---ZERO_SAMPLE_SIZE zero columns from x. The desideratum is that every nonzero entry is separated from every zero entry by margin at least MARGIN. For each ynonzero, we want it to exceed max(yzero) by at least MARGIN. For each yzero, we want it to be exceed by min(ynonzero) by at least MARGIN. The loss is a hinge loss (linear). The loss is irrespective of the xnonzero magnitude (this may be a limitation). Hence, all nonzeroes are equally important to exceed the maximum yzero. (Alternately, there is a commented out binary xent loss.) LIMITATIONS: - Only does pure stochastic gradient (batchsize = 1). - Loss is irrespective of the xnonzero magnitude. - We will always use all nonzero entries, even if the training instance is very non-sparse. """ import numpy nonzero_instances = [] nonzero_instances.append({1: 0.1, 5: 0.5, 9: 1}) nonzero_instances.append({2: 0.3, 5: 0.5, 8: 0.8}) nonzero_instances.append({1: 0.2, 2: 0.3, 5: 0.5}) import model model = model.Model() for i in xrange(100000): # Select an instance instance = nonzero_instances[i % len(nonzero_instances)] # SGD update over instance model.update(instance)