Reconhecimento de padrão

Regra de Hebb

A regra de Hebb é um processo de aprendizagem para um neurônio ou redes de uma Camada.

Consideremos um conjunto de dados iniciais D com M exemplos de treinamento, sendo que cada exemplo é um par do tipo (xm, zm*), onde xm são as entradas que devem gerar as saídas zm*. Estas respostas serão 0 ou 1 (ou ainda –1 ou 1) conforme o vetor xj pertença a classe A ou B, que pretende-se separar. Portanto, o conjunto de treinamento D será

D={(xm, zm*)}m=1M

A rede é inicializada com parâmetros iniciais aleatórios (w,T), em seguida são apresentados os exemplos do conjunto de treinamento D na camada de entrada. O objetivo é fazer um ajuste dos parâmetros iniciais (w,T), de tal maneira que as respostas dadas pela rede sejam iguais as respostas desejadas, as atualizações dos parâmetros iniciais (w,T) são feitas dinamicamente da seguinte maneira:

Atualização dos pesos sinápticos:

winovo=wivelho+a(zm*-zm)xim

onde a é a taxa de aprendizagem, ela quem determina a velocidade de mudança dos pesos sinápticos. Observamos que a alteração do i-ésimo peso sináptico depende do produto do i-ésimo parâmetro de entrada pelo erro de saída que é dado pela expressão (zm*-zm)xim  sendo z a saída com os parâmetros velhos do discriminador, ou seja,

ym=w’xm

zm=f(ym-T)

Atualização dos limiares:

Tnovo=Tvelho+b(zm*-z)

Estas atualizações dos parâmetros iniciais são feitas até que a rede esteja treinada, i.e

zm*=zm

Como alternativa pode-se outro critério de parada.

Exemplo:

Usando os dados gerados no programa que faz a análise da componente principal da tabela periódica, para tal precisamos adicionar as linhas baixo no final do programa mostrado no post anterior, Análise da componente principal (PCA), de 31 de julho de 2020. 

z=zeros(38,1);
z(pos1)=1;
z(pos2)=0;
z(pos2)=0;
dadostab=[T(:,1) T(:,2) z];
save -ascii dadostab.txt dadostab

Agora irei treinar uma rede (1 neurônio de McCulloch-Pitts, com duas entradas e uma saída, para detalhes veja o post de 1 de agosto de 2020, Neurônio de McCulloch-Pitts) para reconhecimento do padrão metal/ametal usando a regra de Hebb. 

function hebb
load dadostab.txt dadostab
x1=dadostab(:,1); x2=dadostab(:,2); z=dadostab(:,3);

%aprendizado de hebb
x(1,:)=x1'; x(2,:)=x2'; zd=z;
n=length(z);

w=[0,0]; theta=0; eta=0.1;
for i=1:n,
y = sum(w*x(:,i))-theta;
z(i) = nnsgn(y);
end

while any(zd-z)==1,
for i=1:n,
y = sum(w*x(:,i))-theta;
z(i) = nnsgn(y);
for j=1:2,
deltaw(j)=(zd(i)-z(i))*eta*x(j,i);
w(j)=w(j)+deltaw(j);
end
theta=theta-eta*(zd(i)-z(i));
end
end

w, theta

%for i=1:n,
%y = sum(w*x(:,i))-theta;
%z(i) = nnsgn(y);
%end
%[zd z]

end

function z = nnsgn(x1)
z=1;
if x1<=0
z=0;
end
end