void SigmoidModel::eval(BatchInputType const&patterns, BatchOutputType& outputs)const{ SIZE_CHECK( patterns.size2() == 1 ); outputs.resize(patterns.size1(),1); //note that because of the way the intermediate result is passed to the sigmoid member function // (facilitating derivatives and sub-classes), we here have to substract the bias parameter. noalias(column(outputs,0)) = column(patterns,0)*m_parameters(0) - blas::repeat(m_parameters(1),patterns.size1()); for(std::size_t i = 0; i != patterns.size1(); ++i) outputs(i,0) = sigmoid(outputs(i,0)); }
void SigmoidModel::weightedInputDerivative( BatchInputType const& patterns, BatchOutputType const& coefficients, State const& state, BatchInputType& derivatives )const{ SIZE_CHECK( patterns.size2() == 1 ); SIZE_CHECK( coefficients.size2() == 1 ); SIZE_CHECK( coefficients.size1() == patterns.size1() ); InternalState const& s = state.toState<InternalState>(); std::size_t numPatterns= patterns.size1(); derivatives.resize( numPatterns,1); //calculate derivative for(std::size_t i = 0; i != numPatterns; ++i){ double der = sigmoidDerivative( s.result(i) ); derivatives(i,0) = coefficients(i,0) * der * m_parameters(0); } }
void Softmax::weightedParameterDerivative( BatchInputType const& patterns, BatchOutputType const& coefficients, State const& state, RealVector& gradient )const{ SIZE_CHECK(patterns.size2() == inputSize()); SIZE_CHECK(coefficients.size2()==outputSize()); SIZE_CHECK(coefficients.size1()==patterns.size1()); gradient.resize(0); }
void Softmax::eval(BatchInputType const& patterns,BatchOutputType& outputs)const{ SIZE_CHECK(patterns.size2() == inputSize()); if(inputSize() == 1){ outputs.resize(patterns.size1(),2); for(std::size_t i = 0; i != patterns.size1();++i){ outputs(i,0) = exp(patterns(i,0)); outputs(i,1) = 1/outputs(i,0); } }else{ outputs.resize(patterns.size1(),inputSize()); noalias(outputs) = exp(patterns); } for(size_t i = 0; i != patterns.size1(); ++i){ row(outputs,i) /= sum(row(outputs,i)); } }
void SigmoidModel::weightedParameterDerivative( BatchInputType const& patterns, BatchOutputType const& coefficients, State const& state, RealVector& gradient )const{ SIZE_CHECK( patterns.size2() == 1 ); SIZE_CHECK( coefficients.size2() == 1 ); SIZE_CHECK( coefficients.size1() == patterns.size1() ); InternalState const& s = state.toState<InternalState>(); gradient.resize(2); gradient(0)=0; gradient(1)=0; //calculate derivative for(std::size_t i = 0; i != patterns.size1(); ++i){ double derivative = sigmoidDerivative( s.result(i) ); double slope= coefficients(i,0)*derivative*patterns(i,0); //w.r.t. slope if ( m_transformForUnconstrained ) slope *= m_parameters(0); gradient(0)+=slope; if ( m_useOffset ) { gradient(1) -= coefficients(i,0)*derivative; //w.r.t. bias parameter } } }
void Softmax::weightedInputDerivative( BatchInputType const& patterns, BatchOutputType const& coefficients, State const& state, BatchOutputType& gradient )const{ SIZE_CHECK(patterns.size2() == inputSize()); SIZE_CHECK(coefficients.size2()==patterns.size2()); SIZE_CHECK(coefficients.size1()==patterns.size1()); InternalState const& s = state.toState<InternalState>(); gradient.resize(patterns.size1(),inputSize()); gradient.clear(); if(inputSize() ==1){ for(size_t i = 0; i != patterns.size1(); ++i){ double sdx= s.results(i,0)*(1-s.results(i,0)); gradient(i,0) = coefficients(i,1)+(coefficients(i,0)-coefficients(i,1))*sdx; } } else{ for(size_t i = 0; i != patterns.size1(); ++i){ double mass=inner_prod(row(coefficients,i),row(s.results,i)); //(c_k-m)*f_k noalias(row(gradient,i)) = (row(coefficients,i) - mass) *row(s.results,i); } } }
void SigmoidModel::eval(BatchInputType const&patterns, BatchOutputType& outputs, State& state)const{ eval(patterns,outputs); InternalState& s = state.toState<InternalState>(); s.resize(patterns.size1()); noalias(s.result) = column(outputs,0); }
void Softmax::eval(BatchInputType const& patterns,BatchOutputType& outputs, State& state)const{ eval(patterns,outputs); InternalState& s = state.toState<InternalState>(); s.resize(patterns.size1(),outputSize()); noalias(s.results) = outputs; }