segunda-feira, 12 de março de 2007

Exercício utilizado rede monocamada - aprendizagemde Hebb

Encontrar os pesos e bias em rede neural monocamada capaz de classificar 0 e X conforme diagrama baixo :




Como o exercicio especifica uma única saída, concluo que de todo o universo de possibilidades, apenas estas duas (acima) devem ser válidas , ou seja saída da rede (y) igual a 1.



A partir disto estabeleci uma matriz, cujos elementos representa 2 ^ n, onde n é o nr. no array.








Temos então que 'X' é representado por 2^0 + 2^6 + 2^12 + 2^18 + 2^24 + 2^4 + 2^8 + 2^16 + 2^20, que em decimal é o vetor 18.157.905




'o' é representado por 2^1 + 2^2 + 2^3 + 2^5 + 2^10 + 2^15 + 2^9 + 2^14 + 2^19 +2^21 + 2^22 + 2^23, que em decimal é o vetor 15.255.086.




Ou seja de todos o vetores de teste, de 0 até 2^25 ( 33.554.432), apenas os dois acima devem ter como resultado na rede neural y =1, para os demais y =-1.




Rodando o programa abaixo (feito em python), obtemos a seguinte matriz de peso (w) e um bias (b) igual a -33.554.428








=======================================
#Variable definitionx = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
wold = wnew = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
bold = bnew = 0
byte_dec = 1.0
size = 25 #size of array (n *n)
#Hebb correction
def hebb_correction(x):
global wold
global wnew
global bnew
global bold for count in range(0,size):
wnew[count] = wold[count] + x[count] * y #correct weight
wold[count] = wnew[count] #
bnew = bold + y #correct bias
bold = bnew return
#Start
i = 0
while (i<2**size):>
byte =" i">> bit_pos
byte_dec = float(byte) if (byte_dec/2 -int(byte_dec/2)) > 0 : x[bit_pos] = 1
else: x[bit_pos] = -1
if i == 15255086 or i ==18157905: #test vectors which have y =1
y = 1 #assign y = 1
else : y = -1 #if not assign y = -1
hebb_correction(x) #call funtion to correct weight and bias
i = i+1
print bnew
print wnew



quarta-feira, 7 de março de 2007

Princípio de Hebb

Em 1949 Donald Hebb estudando redes neurais estabeleceu o seguinte princípio:

Se dois neurônios em conexão são ativado repetidas vezes simultaneamente, mudanças metabólicas ocorrem nas sinapses de sorte que a eficiência da conexão é melhorada.

Em redes neurais artificiais o princípio leva a que quando a rede apresenta um resultado correto os pesos são ajustados para cima.

Ou seja Wnovo = W velho + (alfa * x *y) onde W é o peso da conexão, alfa é a taxa de aprendizagem, x a entrada da rede e y a saída.
Para a rede aprender mais depressa, alfa deve ser aumentado.




Não necessariamente a rede converge !?!?!?


Ref:


http://www.dc.ufscar.br/~saito/download/topicos-pis/AULA02-RNA.ppt

segunda-feira, 5 de março de 2007

Exercício McCullough-Pitts

Exercício : dedo passando sobre uma vela.

Se estiver frio, saída frio, independente do tempo

Se estiver quente, num primeiro momento frio, se permanecer quente



Para o quente, a rede deve levar em conta o tempo anterior (t-1)




Assim quando x(t) for 0, frio, independente do estado anterior, a saída será zero, ou seja frio.
Quando x(t) for 1, quente, se estado anterior (t-1) for frio, zero, a saída será 0, ou seja frio.
Quando x(t) for 1, quente, e o estado t(1) for quente, 1, a saída será 1, ou seja quente.

-------------------------------------------
Uma outra solução para o problema leva em conta uma rede com duas entradas x1 e x2.
Para este caso temos :
x1_x2_ _y1_ y2
______ ______
0 _0 ___-___-
1 _0___ 1 __0___ frio
0 _1___ 0__1___ quente
1 _1___ 1__1___ morno

Explicitando apenas a equação :

y1 = x1(t) OR (x2(t) AND NOT x2(t-1))

y2 = x2(t) AND x2(t-1)

Material Introdutório

Textos de aula interessantes - Introduction to Neural Networks
http://www.cs.bham.ac.uk/~jxb/inn.html

Material do MIT
http://hebb.mit.edu/courses/9.641/lectures/

McCulloch-Pitts