30 #ifndef SHARK_UNSUPERVISED_RBM_GRADIENTAPPROXIMATIONS_EXACTGRADIENT_H 31 #define SHARK_UNSUPERVISED_RBM_GRADIENTAPPROXIMATIONS_EXACTGRADIENT_H 36 #include <boost/type_traits/is_same.hpp> 40 template<
class RBMType>
56 {
return "ExactGradient"; }
63 return mpe_rbm->parameterVector();
67 return mpe_rbm->numberOfParameters();
71 m_regularizer = regularizer;
72 m_regularizationStrength = factor;
76 mpe_rbm->setParameterVector(parameter);
80 negLogLikelihood += m_regularizationStrength * m_regularizer->
eval(parameter);
82 return negLogLikelihood;
86 mpe_rbm->setParameterVector(parameter);
92 Gibbs gibbsSampler(mpe_rbm);
95 double negLogLikelihood = 0;
96 BOOST_FOREACH(RealMatrix
const& batch,m_data.
batches()) {
97 std::size_t currentBatchSize = batch.size1();
101 gibbsSampler.
createSample(hiddenSamples,visibleSamples,batch);
102 empiricalExpectation.addVH(hiddenSamples, visibleSamples);
103 negLogLikelihood -=
sum(mpe_rbm->energy().logUnnormalizedProbabilityVisible(
104 batch,hiddenSamples.input,
blas::repeat(1,currentBatchSize)
109 if(mpe_rbm->numberOfVN() < mpe_rbm->numberOfHN()){
110 integrateOverVisible(modelExpectation);
113 integrateOverHidden(modelExpectation);
116 derivative.resize(mpe_rbm->numberOfParameters());
117 noalias(derivative) = modelExpectation.result() - empiricalExpectation.result();
119 m_logPartition = modelExpectation.logWeightSum();
121 negLogLikelihood += m_logPartition;
125 negLogLikelihood += m_regularizationStrength * m_regularizer->
evalDerivative(parameter,regularizerDerivative);
126 noalias(derivative) += m_regularizationStrength * regularizerDerivative;
129 return negLogLikelihood;
133 return m_logPartition;
140 double m_regularizationStrength;
143 template<
class GradientApproximator>
144 void integrateOverVisible(GradientApproximator & modelExpectation)
const{
146 Gibbs sampler(mpe_rbm);
148 typedef typename RBM::VisibleType::StateSpace VisibleStateSpace;
149 std::size_t values = VisibleStateSpace::numberOfStates(mpe_rbm->numberOfVN());
150 std::size_t batchSize =
std::min(values, std::size_t(256));
152 for (std::size_t x = 0; x < values; x+=batchSize) {
154 std::size_t currentBatchSize=
std::min(batchSize,values-x);
156 for(std::size_t elem = 0; elem != currentBatchSize;++elem){
158 VisibleStateSpace::state(
row(stateBatch,elem),x+elem);
164 sampler.
createSample(hiddenBatch,visibleBatch,stateBatch);
167 RealVector logP = mpe_rbm->energy().logUnnormalizedProbabilityVisible(
168 stateBatch,hiddenBatch.input,
blas::repeat(1,currentBatchSize)
170 modelExpectation.addVH(hiddenBatch, visibleBatch, logP);
175 template<
class GradientApproximator>
176 void integrateOverHidden(GradientApproximator & modelExpectation)
const{
178 Gibbs sampler(mpe_rbm);
180 typedef typename RBM::HiddenType::StateSpace HiddenStateSpace;
181 std::size_t values = HiddenStateSpace::numberOfStates(mpe_rbm->numberOfHN());
182 std::size_t batchSize =
std::min(values, std::size_t(256) );
184 for (std::size_t x = 0; x < values; x+=batchSize) {
186 std::size_t currentBatchSize=
std::min(batchSize,values-x);
188 for(std::size_t elem = 0; elem != currentBatchSize;++elem){
190 HiddenStateSpace::state(
row(stateBatch,elem),x+elem);
196 hiddenBatch.state=stateBatch;
200 RealVector logP = mpe_rbm->energy().logUnnormalizedProbabilityHidden(
201 stateBatch,visibleBatch.input,
blas::repeat(1,currentBatchSize)
203 modelExpectation.addHV(hiddenBatch, visibleBatch, logP);
209 mutable double m_logPartition;