Home » Uncategorized

Retropropagation with SAS

A code of mine that works well with different data types.

I like comments by programmers who like me are writing a feed forward neural network
with two hidden layers (arch: X-S-H-Y) using SAS.

%macro CalculateLayer;
/* Calculate S Layer */
%do i=1 %to &SLayer.; /* S Layer */
    A=0;
    %do j=1 %to &XLayer.; /* X Layer */
        A + (ws&i.x&j. * x&j.);
    %end;
    A + ws&i.x&j.;
    s&i. = 1.0 / (1.0 + exp(-A)); /* this is logit */
%end;

/* Calculate H Layer */
%do i=1 %to &HLayer.; /* H Layer */
    A=0;
    %do j=1 %to &SLayer.; /* S Layer */
        A + (wh&i.s&j. * s&j.);
    %end;
    A + wh&i.s&j.;
    h&i. = 1.0 / (1.0 + exp(-A));
%end;

/* Calculate Y Layer */
%do i=1 %to &YLayer.; /* Y Layer */
    A=0;
    %do j=1 %to &HLayer.; /* H Layer */
        A + (wy&i.h&j. * h&j.);
    %end;
    A + wy&i.h&j.;
    y&i. = 1.0 / (1.0 + exp(-A));
%end;
%mend;

%macro CalculateLayerError;
/* Calculate Y Layer Error */
%do i=1 %to &YLayer.; /* Y Layer */
    Err=D&i. – y&i.;
    DeltaY&i.=Err * y&i. * (1-y&i.);
%end;

/* Calculate H Layer Error */
%do i=1 %to &HLayer.; /* H Layer */
    Err=0;
    %do j=1 %to &YLayer.; /* Y Layer */
        Err + (DeltaY&j. * wy&j.h&i.);
    %end;
    DeltaH&i.=Err * h&i. * (1-h&i.);
%end;

/* Calculate S Layer Error */
%do i=1 %to &SLayer.; /* S Layer */
    Err=0;
    %do j=1 %to &HLayer.; /* H Layer */
        Err + (DeltaH&j. * wh&j.s&i.);
    %end;
    DeltaS&i.=Err * s&i. * (1-s&i.);
%end;
%mend;

%macro BackPropagation;
/* Modify Y Layer weights */
%do i=1 %to &YLayer.; /* Y Layer */
    %do j=1 %to &HLayer.; /* H Layer */
        wy&i.h&j. + (&Eps. * DeltaY&i. * H&j.);
    %end;
    wy&i.h&j. + (&Eps. * DeltaY&i.);
%end;

/* Modify H Layer weights */
%do i=1 %to &HLayer.; /* H Layer */
    %do j=1 %to &SLayer.; /* S Layer */
        wh&i.s&j. + (&Eps. * DeltaH&i. * s&j.);
    %end;
    wh&i.s&j. + (&Eps. * DeltaH&i.);
%end;

/* Modify S Layer weights */
%do i=1 %to &SLayer.; /* S Layer */
    %do j=1 %to &XLayer.; /* X Layer */
        ws&i.x&j. + (&Eps. * DeltaS&i. * x&j.);
    %end;
    ws&i.x&j. + (&Eps. * DeltaS&i.);
%end;
%mend;