30 #ifndef SHARK_UNSUPERVISED_RBM_NEURONLAYERS_BINARYLAYER_H 31 #define SHARK_UNSUPERVISED_RBM_NEURONLAYERS_BINARYLAYER_H 51 RealVector m_baseRate;
62 const RealVector&
bias()
const{
92 m_bias.resize(newSize);
93 m_baseRate.resize(newSize);
108 template<
class Input,
class BetaVector>
112 SIZE_CHECK(input.size1() == statistics.size1());
114 for(std::size_t i = 0; i != input.size1(); ++i){
131 template<
class Matrix,
class Rng>
132 void sample(StatisticsBatch
const& statistics, Matrix& state,
double alpha, Rng& rng)
const{
134 SIZE_CHECK(statistics.size1() == state.size1());
135 SIZE_CHECK(statistics.size2() == state.size2());
140 for(std::size_t s = 0; s != state.size1();++s){
141 for(std::size_t i = 0; i != state.size2();++i){
142 state(s,i) =
coinToss(statistics(s,i));
147 for(
size_t s = 0; s != state.size1(); ++s){
148 for (
size_t i = 0; i != state.size2(); i++) {
149 double prob = statistics(s,i);
150 if (state(s,i) == 0) {
152 prob = (1. - alpha) * prob + alpha * prob / (1. - prob);
154 prob = (1. - alpha) * prob + alpha;
158 prob = (1. - alpha) * prob + alpha * (1. - (1. - prob) / prob);
160 prob = (1. - alpha) * prob;
176 template<
class Matrix>
177 RealVector
logProbability(StatisticsBatch
const& statistics, Matrix
const& state)
const{
179 SIZE_CHECK(statistics.size1() == state.size1());
180 SIZE_CHECK(statistics.size2() == state.size2());
182 RealVector logProbabilities(state.size1(),1.0);
183 for(std::size_t s = 0; s != state.size1();++s){
184 for(std::size_t i = 0; i != state.size2();++i){
185 logProbabilities(s) += (state(s,i) > 0.0)? std::log(statistics(s,i)) : std::log(1-statistics(s,i));
188 return logProbabilities;
197 template<
class Matrix>
198 Matrix
const&
phi(Matrix
const& state)
const{
215 RealMatrix
const&
mean(StatisticsBatch
const& statistics)
const{
225 template<
class Matrix,
class BetaVector>
231 RealVector energies =
prod(state,m_bias);
232 RealVector baseRateEnergies =
prod(state,m_baseRate);
233 noalias(energies) = beta*energies +(1-
beta)*baseRateEnergies;
251 template<
class Input>
254 long double logFactorization = 0;
255 for(std::size_t i = 0; i != inputs.size(); ++i){
256 double arg = (inputs(i)+m_bias(i))*beta+(1-beta)*m_baseRate(i);
260 return logFactorization;
270 template<
class Vector,
class SampleBatch>
273 sum_rows(samples.statistics,derivative);
283 template<
class Vector,
class SampleBatch,
class WeightVector>
286 noalias(derivative) +=
prod(weights,samples.statistics);
295 template<
class Vector,
class SampleBatch>
307 template<
class Vector,
class SampleBatch,
class WeightVector>
308 void parameterDerivative(Vector& derivative, SampleBatch
const& samples, WeightVector
const& weights)
const{
310 noalias(derivative) +=
prod(weights,samples.state);
320 m_bias = newParameters;
333 m_baseRate = RealVector(m_bias.size(),0);