single layer perceptron

勾配法と確率的最適化による学習例:

# 2変数からなる16種類のロジック
x=matrix(c(1,1,1,1,1,0,1,0,1,1,0,0),ncol=4);
y=matrix(c(0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,0,1,0,
  1,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1),byrow=T,ncol=4)

> x # input matrix
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1   # X0
[2,]    1    1    0    0   # X1
[3,]    1    0    1    0   # X2
> y
      [,1] [,2] [,3] [,4]
 [1,]    0    0    0    0  # none
 [2,]    0    0    0    1  # notX1 & notX2
 [3,]    0    0    1    0  # notX1 & X2
 [4,]    0    1    0    0  # X1 & notX2
 [5,]    1    0    0    0  # X1 & X2
 [6,]    0    0    1    1  # notX1
 [7,]    0    1    0    1  # notX2
 [8,]    1    0    0    1  # {X1 & X2} or {notX1 & notX2}
 [9,]    0    1    1    0  # {X1 & notX2} or {notX1 & X2}
[10,]    1    0    1    0  # X2
[11,]    1    1    0    0  # X1
[12,]    1    1    1    0  # X1 or X2
[13,]    1    1    0    1  # X1 or notX2
[14,]    1    0    1    1  # notX1 or X2
[15,]    0    1    1    1  # notX1 or notX2
[16,]    1    1    1    1  # all

# 勾配法
stepSize=0.1;gamma=5;logicID=2;
w=matrix(rnorm(3),nrow=1);
for (i_tr in 1:2000) {
  for (i_inst in 1:4){
    a=w%*%x[,i_inst,drop=F]
    s=1/(1+exp(-gamma*a))
    w=w+stepSize*(y[logicID,i_inst]-s)*s*(1-s)*gamma*x[,i_inst]
  }
}
for (i_inst in 1:4){
  a=w%*%x[,i_inst,drop=F]
  print(1/(1+exp(-gamma*a)))
}

# 確率的最適化法(焼きなまし法)
gamma=2;logicID=2;
w=matrix(rnorm(3),nrow=1);
err=4;width=1;sTemp=matrix(0,nrow=1,ncol=3);C=0.25
for (i_tr in 1:5000) {
  wTemp=w+rnorm(3,mean=0,sd=width)
  for (i_inst in 1:4) {
    a=wTemp%*%x[,i_inst,drop=F]
    sTemp[i_inst]=1/(1+exp(-gamma*a))
  }
  errTemp=sum((sTemp-y[logicID,])^2)
  delta=errTemp-err;
  prob=1/(1+exp(delta/(C*width)))
  if (runif(1) <  prob) {
    w=wTemp
    err=errTemp
  }
  width=width*0.99
}
for (i_inst in 1:4) {
  a=w%*%x[,i_inst,drop=F]
  print(1/(1+exp(-gamma*a)))
}