Mai mulți neuroni în stratul ascuns decât caracteristicile predictive din rețelele neuronale

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Săptămâna aceasta, am vorbit pentru prima dată despre rețele neuronale și spuneam că, în multe ilustrații ale rețelelor neuronale, a existat un strat cu mai puțini neuroni decât variabile predictive,

dar uneori, ar putea avea sens să existe mai mulți neuroni în strat decât variabile predictive,

Pentru a ilustra, luați în considerare un exemplu simplu cu o singură variabilă (x) și un rezultat binar (yin{0,1})

set.seed(12345)

n = 100

x = c(runif(n),1+runif(n),2+runif(n))

y = rep(c(0,1,0),each=n)

Ar trebui să ne asigurăm că observațiile sunt în intervalul ((0,1)),

minmax = function(z) (z-min(z))/(max(z)-min(z))

xm = minmax(x)

df = data.frame(x=xm,y=y)

exact ca ceea ce putem vizualiza mai jos

plot(df$x,rep(0,3*n),col=1+df$y)

Aici, punctele albastre și roșii (când (y) este fie 0, fie 1) nu sunt separabile liniar. Funcția standard de activare în rețelele neuronale este sigmoidul

sigmoid = function(x) 1 / (1 + exp(-x))

Să calculăm o rețea neuronală

library(nnet)

set.seed(1234)

model_nnet = nnet(y~x,size=2,data=df)

Apoi putem obține greutățile și putem vizualiza cei doi neuroni

w = neuralweights(model_nnet)

x1 = cbind(1,df$x)%*%w$wts$"hidden 1 1"

x2 = cbind(1,df$x)%*%w$wts$"hidden 1 2"

b = w$wts$`out 1`

plot(sigmoid(x1),sigmoid(x2),col=1+df$y)

Acum, punctele albastre și roșii (când (y) este fie 0, fie 1) sunt de fapt separabile liniar.

abline(a=-b(1)/b(3),b=-b(2)/b(3))

Dacă nu specificăm sămânța generatorului aleator, putem obține un rezultat diferit deoarece, evident, acest model nu este identificabil

sau

Dacă avem acum

set.seed(12345)

n=100

x=c(runif(n),1+runif(n),2+runif(n),3+runif(n))

y=rep(c(0,1,0,1),each=n)

xm = minmax(x)

df = data.frame(x=xm,y=y)

plot(df$x,rep(0,4*n),col=1+df$y)

Acum avem nevoie de mai mulți neuroni

set.seed(321)

model_nnet = nnet(y~x,size=3,data=df)

w = neuralweights(model_nnet)

x1 = cbind(1,df$x)%*%w$wts$"hidden 1 1"

x2 = cbind(1,df$x)%*%w$wts$"hidden 1 2"

x3 = cbind(1,df$x)%*%w$wts$"hidden 1 3"

b = w$wts$`out 1`

library(scatterplot3d)

s3d = scatterplot3d(x=sigmoid(x1),

y=sigmoid(x2), z=sigmoid(x3),color=1+df$y)

dar încă o dată, am reușit să separăm (liniar) punctele albastre și cele roșii

În cele din urmă, luați în considerare

set.seed(123)

n=500

x1=runif(n)*3-1.5

x2=runif(n)*3-1.5

y = (x1^2+x2^2)<=1

x1m = minmax(x1)

x2m = minmax(x2)

df = data.frame(x1=x1m,x2=x2m,y=y)

plot(df$x1,df$x2,col=1+df$y)

și din nou, noi trei neuroni (pentru două variabile explicative) putem, din nou, liniar, separa punctele albastre și roșu

set.seed(1234)

model_nnet = nnet(y~x1+x2,size=3,data=df)

w = neuralweights(model_nnet)

x1 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 1"

x2 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 2"

x3 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 3"

b = w$wts$`out 1`

library(scatterplot3d)

s3d <- scatterplot3d(x=sigmoid(x1), y=sigmoid(x2), z=sigmoid(x3),

color=1+df$y)

Aici, rețelele neuronale joacă regula trucului nucleului, așa cum a fost inventat KoutroumbasK. & Theodoridis, S. (2008). Recunoașterea modelelor. Presa Academică

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.