PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // PLearn (A C++ Machine Learning Library) 00004 // Copyright (C) 1998 Pascal Vincent 00005 // Copyright (C) 1999-2002 Pascal Vincent, Yoshua Bengio, Rejean Ducharme and University of Montreal 00006 // Copyright (C) 2001-2002 Nicolas Chapados, Ichiro Takeuchi, Jean-Sebastien Senecal 00007 // Copyright (C) 2002 Xiangdong Wang, Christian Dorion 00008 00009 // Redistribution and use in source and binary forms, with or without 00010 // modification, are permitted provided that the following conditions are met: 00011 // 00012 // 1. Redistributions of source code must retain the above copyright 00013 // notice, this list of conditions and the following disclaimer. 00014 // 00015 // 2. Redistributions in binary form must reproduce the above copyright 00016 // notice, this list of conditions and the following disclaimer in the 00017 // documentation and/or other materials provided with the distribution. 00018 // 00019 // 3. The name of the authors may not be used to endorse or promote 00020 // products derived from this software without specific prior written 00021 // permission. 00022 // 00023 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00024 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00025 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00026 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00027 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00028 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00029 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00030 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00031 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00032 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 // 00034 // This file is part of the PLearn library. For more information on the PLearn 00035 // library, go to the PLearn Web site at www.plearn.org 00036 00037 00038 /* ******************************************************* 00039 * $Id: ThresholdBpropVariable.cc 3994 2005-08-25 13:35:03Z chapados $ 00040 * This file is part of the PLearn library. 00041 ******************************************************* */ 00042 00043 #include "ThresholdBpropVariable.h" 00044 00045 00046 namespace PLearn { 00047 using namespace std; 00048 00049 00050 00053 PLEARN_IMPLEMENT_OBJECT(ThresholdBpropVariable, 00054 "Variable that copies its input but imposes\n" 00055 "a threshold on the gradient flow.", 00056 "In its fprop it simply copies its unique input variable.\n" 00057 "In for bprop, it multiplies the fprop value by the\n" 00058 "gradient_threshold_factor option to obtain the threshold,\n" 00059 "beyond which the gradient is fixed.\n"); 00060 00061 ThresholdBpropVariable::ThresholdBpropVariable(Variable* input, real the_gradient_threshold_factor) 00062 : inherited(input, input->length(), input->width()), 00063 gradient_threshold_factor(the_gradient_threshold_factor) 00064 { 00065 build_(); 00066 } 00067 00068 void 00069 ThresholdBpropVariable::build() 00070 { 00071 inherited::build(); 00072 build_(); 00073 } 00074 00075 void 00076 ThresholdBpropVariable::build_() 00077 { 00078 } 00079 00080 void 00081 ThresholdBpropVariable::declareOptions(OptionList &ol) 00082 { 00083 declareOption(ol, "gradient_threshold_factor", &ThresholdBpropVariable::gradient_threshold_factor, 00084 OptionBase::buildoption, "Factor by which the value of the variable is multiplied to obtain the absolute threshold\n" 00085 "on the gradient."); 00086 inherited::declareOptions(ol); 00087 } 00088 00089 void ThresholdBpropVariable::recomputeSize(int& l, int& w) const 00090 { 00091 if (input) { 00092 l = input->length(); 00093 w = input->width(); 00094 } else 00095 l = w = 0; 00096 } 00097 00098 void ThresholdBpropVariable::fprop() 00099 { 00100 for(int k=0; k<input->nelems(); k++) 00101 valuedata[k] = input->valuedata[k]; 00102 } 00103 00104 00105 void ThresholdBpropVariable::bprop() 00106 { 00107 if(gradient_threshold_factor!=0) 00108 { 00109 for(int k=0; k<input->nelems(); k++) 00110 if(abs(gradientdata[k]) > abs(gradient_threshold_factor * input->valuedata[k])) 00111 input->gradientdata[k] += abs(gradient_threshold_factor * input->valuedata[k]) * (gradientdata[k]>0 ? 1 : -1); 00112 else 00113 input->gradientdata[k] += gradientdata[k]; 00114 } 00115 } 00116 00117 } // end of namespace PLearn 00118 00119 00120 /* 00121 Local Variables: 00122 mode:c++ 00123 c-basic-offset:4 00124 c-file-style:"stroustrup" 00125 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00126 indent-tabs-mode:nil 00127 fill-column:79 00128 End: 00129 */ 00130 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :