Filipe Rocha
2009-May-29 09:47 UTC
[R] Backpropagation to adjust weights in a neural net when receiving new training examples
I want to create a neural network, and then everytime it receives new data, instead of creating a new nnet, i want to use a backpropagation algorithm to adjust the weights in the already created nn. I'm using nnet package, I know that nn$wts gives the weights, but I cant find out which weights belong to which conections so I could implement the backpropagation algorithm myself. But if anyone knows some function to do this, it would be even better. In anycase, thank you! Filipe Rocha [[alternative HTML version deleted]]
jude.ryan at ubs.com
2009-May-29 14:24 UTC
[R] Backpropagation to adjust weights in a neural net when receiving new training examples
You can figure out which weights go with which connections with the function summary(nnet.object) and nnet.object$wts. Sample code from Venables and Ripley is below: # Neural Network model in Modern Applied Statistics with S, Venables and Ripley, pages 246 and 247> library(nnet)> attach(rock)> dim(rock)[1] 48 4> area1 <- area/10000; peri1 <- peri/10000> rock1 <- data.frame(perm, area = area1, peri = peri1, shape)> dim(rock1)[1] 48 4> head(rock1)perm area peri shape 1 6.3 0.4990 0.279190 0.0903296 2 6.3 0.7002 0.389260 0.1486220 3 6.3 0.7558 0.393066 0.1833120 4 6.3 0.7352 0.386932 0.1170630 5 17.1 0.7943 0.394854 0.1224170 6 17.1 0.7979 0.401015 0.1670450> rock.nn <- nnet(log(perm) ~ area + peri + shape, rock1, size=3,decay=1e-3, linout=T, skip=T, maxit=1000, Hess=T) # weights: 19 initial value 1196.787489 iter 10 value 32.400984 iter 20 value 31.664545 ... iter 280 value 14.230077 iter 290 value 14.229809 final value 14.229785 converged> summary(rock.nn)a 3-3-1 network with 19 weights options were - skip-layer connections linear output units decay=0.001 b->h1 i1->h1 i2->h1 i3->h1 -0.51 -9.33 14.59 3.85 b->h2 i1->h2 i2->h2 i3->h2 0.93 3.35 6.09 -5.86 b->h3 i1->h3 i2->h3 i3->h3 0.80 -10.93 -4.58 9.53 b->o h1->o h2->o h3->o i1->o i2->o i3->o 1.89 -14.62 7.35 8.77 -3.00 -4.25 4.44> sum((log(perm) - predict(rock.nn))^2)[1] 13.20451> rock.nn$wts[1] -0.5064848 -9.3288410 14.5859255 3.8521844 0.9266730 3.3524267 6.0900909 -5.8628448 0.8026366 -10.9345352 -4.5783516 9.5311123 [13] 1.8866734 -14.6181959 7.3466236 8.7655882 -2.9988287 -4.2508948 4.4397158>In the output from summary(rock.nn), b is the bias or intercept, h1 is the 1st hidden neuron, i1 is the first input (peri) and o is the (linear) output. So b->h1 is the bias or intercept to the first hidden neuron, i1->h1 is the 1st input (peri) to the first hidden neuron (there are 3 hidden neurons in this example), h1->o is the 1st hidden neuron to the first output, and i1->o is the first input to the output (since skip=T - this is a skip layer network). The weights are below (b->h1 ..) but are rounded. But rock.nn$wts gives you the un-rounded weights. If you compare the output from summary(rock.nn) and rock.nn$wts you will see that the first row of weights from summary() is listed first in rock.nn$wts, followed by the 2nd row of weights from summary() and so on. You can construct the neural network equations manually (this is not in the Venables Ripley book) and check the results against the predict() function to verify that the weights are listed in the order I described. The code to do this is: # manually calculate the neural network predictions based on the neural network equations rock1$h1 <- -0.5064848 -9.3288410 * rock1$area + 14.5859255 * rock1$peri + 3.8521844 * rock1$shape rock1$logistic_h1 <- exp(rock1$h1) / (1 + exp(rock1$h1)) rock1$h2 <- 0.9266730 + 3.3524267 * rock1$area + 6.0900909 * rock1$peri -5.8628448 * rock1$shape rock1$logistic_h2 <- exp(rock1$h2) / (1 + exp(rock1$h2)) rock1$h3 <- 0.8026366 - 10.9345352 * rock1$area - 4.5783516 * rock1$peri + 9.5311123 * rock1$shape rock1$logistic_h3 <- exp(rock1$h3) / (1 + exp(rock1$h3)) rock1$pred1 <- (1.8866734 - 14.6181959 * rock1$logistic_h1 + 7.3466236 * rock1$logistic_h2 + 8.7655882 * rock1$logistic_h3 - 2.9988287 * rock1$area - 4.2508948 * rock1$peri + 4.4397158 * rock1$shape) rock1$nn.pred <- predict(rock.nn) head(rock1) perm area peri shape h1 logistic_h1 h2 logistic_h2 h3 logistic_h3 pred1 nn.pred 1 6.3 0.4990 0.279190 0.0903296 -0.7413656 0.3227056 3.770238 0.9774726 -5.070985 0.0062370903 2.122910 2.122910 2 6.3 0.7002 0.389260 0.1486220 -0.7883026 0.3125333 4.773323 0.9916186 -7.219361 0.0007317343 1.514820 1.514820 3 6.3 0.7558 0.393066 0.1833120 -1.1178398 0.2464122 4.779515 0.9916699 -7.514112 0.0005450367 2.451231 2.451231 4 6.3 0.7352 0.386932 0.1170630 -1.2703391 0.2191992 5.061506 0.9937039 -7.892204 0.0003735057 2.656199 2.656199 5 17.1 0.7943 0.394854 0.1224170 -1.6854993 0.1563686 5.276490 0.9949156 -8.523675 0.0001986684 3.394902 3.394902 6 17.1 0.7979 0.401015 0.1670450 -1.4573040 0.1888800 5.064433 0.9937222 -8.165892 0.0002841023 3.072776 3.072776 The first 6 records show that the numbers from the manual equations and the predict() function are the same (the last 2 columns). As VR point out in their book, there are several solutions and a random starting point and if you run the same example your results may differ. Hope this helps. Jude Ryan Filipe Rocha wrote: I want to create a neural network, and then everytime it receives new data, instead of creating a new nnet, i want to use a backpropagation algorithm to adjust the weights in the already created nn. I'm using nnet package, I know that nn$wts gives the weights, but I cant find out which weights belong to which conections so I could implement the backpropagation algorithm myself. But if anyone knows some function to do this, it would be even better. In anycase, thank you! Filipe Rocha ___________________________________________ Jude Ryan Director, Client Analytical Services Strategy & Business Development UBS Financial Services Inc. 1200 Harbor Boulevard, 4th Floor Weehawken, NJ 07086-6791 Tel. 201-352-1935 Fax 201-272-2914 Email: jude.ryan at ubs.com -------------- next part -------------- Please do not transmit orders or instructions regarding a UBS account electronically, including but not limited to e-mail, fax, text or instant messaging. The information provided in this e-mail or any attachments is not an official transaction confirmation or account statement. For your protection, do not include account numbers, Social Security numbers, credit card numbers, passwords or other non-public information in your e-mail. Because the information contained in this message may be privileged, confidential, proprietary or otherwise protected from disclosure, please notify us immediately by replying to this message and deleting it from your computer if you have received this communication in error. Thank you. UBS Financial Services Inc. UBS International Inc. UBS Financial Services Incorporated of Puerto Rico UBS AG UBS reserves the right to retain all messages. Messages are protected and accessed only in legally justified cases.