regularisation.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Robot Group Leipzig                             *
00003  *    martius@informatik.uni-leipzig.de                                    *
00004  *    fhesse@informatik.uni-leipzig.de                                     *
00005  *    der@informatik.uni-leipzig.de                                        *
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  ***************************************************************************
00022  *                                                                         *
00023  *  DESCRIPTION                                                            *
00024  *                                                                         *
00025  *  This file contains activation function and there derivatives in        *
00026  *  different regularised versions                                         *
00027  *                                                                         *
00028  *                                                                         *
00029  *   $Log: regularisation.h,v $
00030  *   Revision 1.8  2008/05/02 17:20:04  martius
00031  *   *** empty log message ***
00032  *
00033  *   Revision 1.7  2008/02/05 10:08:47  der
00034  *   new function g_derivative
00035  *
00036  *   Revision 1.6  2008/01/29 09:38:02  der
00037  *   function g_s changed
00038  *
00039  *   Revision 1.5  2007/04/03 16:37:57  der
00040  *   *** empty log message ***
00041  *
00042  *   Revision 1.4  2007/02/23 09:25:52  der
00043  *   regularisation with taylor expansion
00044  *
00045  *   Revision 1.3  2006/11/29 16:22:43  martius
00046  *   name is a variable of configurable and is used as such
00047  *
00048  *   Revision 1.2  2006/10/23 10:47:59  martius
00049  *   g and derivatives and inverses
00050  *
00051  *   Revision 1.1  2006/10/20 15:22:15  martius
00052  *   regularisation terms for g
00053  *
00054  *   Revision 1.2  2006/07/14 12:23:56  martius
00055  *   selforg becomes HEAD
00056  *
00057  *   Revision 1.1.2.1  2005/12/06 17:38:21  martius
00058  *   *** empty log message ***
00059  *
00060  *                                                                 *
00061  ***************************************************************************/
00062 #ifndef __REGULARISATION_H
00063 #define __REGULARISATION_H
00064 
00065 double inline sqr(double x) { 
00066   return x*x; 
00067 }
00068 
00069 /// neuron transfer function
00070 double inline g(double z)
00071 {
00072   return tanh(z);
00073 };
00074 
00075 /// first dervative
00076 double inline g_s(double z)
00077 {
00078   //double k=tanh(z); 
00079   // return 1.025 - k*k; 
00080    return 1/((1+0.5 * z*z)*(1+0.5 * z*z));    // softer
00081   //return 1/(1+log(1+z*z)); // even softer
00082 };
00083 
00084 
00085 /// first dervative with smoothing for large z
00086 double inline g_derivative(double z)
00087 {
00088   
00089    return 1/((1+0.5 * z*z)*(1+0.5 * z*z));  
00090 };
00091 
00092 /// inverse of the first derivative
00093 double inline g_s_inv(double z)
00094 {
00095   double k=tanh(z);
00096    return 1/(1.025 - k*k);
00097   // return 1+z*z; // softer
00098   //return 1+log(1+z*z); // even softer
00099 };
00100 
00101 /** \f[ g'(z+xsi) = 1-(tanh(z+xsi))^2 \f] with additional clipping */
00102 double inline g_s(double z, double xsi) {
00103   double Z = clip(z, -3.0, 3.0) + clip(xsi, -1.0, 1.0);  
00104   // double k=tanh(Z);  // approximation with Mittelwertsatz 
00105   // return 1 - k*k;
00106   return 1/(1 + Z*Z);//TEST
00107 };
00108 
00109 
00110 /// an exact formula for g''/g', with clipped Z = z+xsi
00111 double inline g_ss_div_s(double z, double xsi) { 
00112   // for consistency reasons we use the same clipped z as for g'.
00113   double Z = clip(z, -3.0, 3.0) + clip(xsi, -1.0, 1.0);  
00114   // approximation with Mittelwertsatz (z is clipped)
00115   //  return -2*g(Z);
00116   return -2*Z;//TEST
00117 };
00118 
00119 /** with \f[ g'(z) = 1-(g(z+\xi))^2 \f] we get 
00120     \f[\frac{\partial}{\partial z} \frac{1}{g'(Z)} = \frac{g''}{g'^2} \f] 
00121     again with clipped Z
00122  */
00123 double inline derive_g_s_inv_exact_clip(double z, double xsi){
00124   double Z = clip(z, -3.0, 3.0) + clip(xsi, -1.0, 1.0);  
00125   double k=tanh(Z);  // approximation with Mittelwertsatz 
00126   return -2*k/(1-k*k);
00127 }
00128 
00129 /** \f[ g'(z) = 1-(z+\xi)^2 \f] which is the series expansion to the second order
00130 */ 
00131 double inline g_s_expand2(double z, double xsi){
00132   double Z = z + clip(xsi, -fabs(z), fabs(z));  
00133   return 1/(1+sqr(Z));
00134 }
00135 
00136 /** \f[ \frac{1}{g'(z)} \approx 1+(z+\xi)^2 \f] with geometric series approximation
00137 */ 
00138 double inline g_s_inv_expand2(double z, double xsi){
00139   double Z = z + clip(xsi, -fabs(z)/2.0, fabs(z)/2.0);  
00140   return 1+sqr(Z);
00141 }
00142 
00143 /** \f[ \frac{g''(z)}{g'(z)} \approx 2(z+\xi)(1+(z+\xi)^2) \f] with geometric series approximation
00144 */ 
00145 double inline g_ss_div_s_expand2(double z, double xsi){
00146   double Z = z + clip(xsi, -fabs(z)/2.0, fabs(z)/2.0);  
00147   //  double Z = z + clip(xsi, -fabs(z), fabs(z));  
00148   return -2*tanh(Z); 
00149 }
00150 
00151 
00152   /// squashing function (-0.1 to 0.1), to protect against to large weight updates
00153 double inline squash(double z)
00154   {
00155     return clip(z, -0.1, 0.1);
00156     //return 0.1 * tanh(10.0 * z);
00157   };
00158  
00159   /// squashing function with adjustable clipping size, to protect against too large weight updates
00160 double inline squash(void* d, double z) {
00161     double size = *((double*)d);
00162     return clip(z, -size, size);
00163   };
00164 
00165 
00166 
00167 #endif
00168 

Generated on Tue Sep 16 22:00:22 2008 for Robotsystem of the Robot Group Leipzig by  doxygen 1.4.7