ans = {}; x = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}; t = {{0, 1, 0}, { 1, 1, 1}, {1, 1, 1}, {1, 0, 0}}; t = {{0}, {1}, {1}, {0}}; inD = Length[First[x]]; outD = Length[First[t]]; hSize = 2; spread = .2; v = .5 + RandomReal[{-spread, spread}, {inD + 1, hSize}]; w = .5 + RandomReal[{-spread, spread}, {hSize + 1, outD}]; slope = 1; tf[z_] := N[1/(1 + Exp[-4*slope*z])]; xb = Map[Append[#, -1] & , x]; ans = Reap[ Do[ (*1 based indexing of arrays. *) (* FORWARD *) h = xb . v; h = Map[tf, h, {2}]; hb = Map[Append[#, -1] & , h]; y = hb . w; y = Map[tf, y, {2}]; Sow[First[Transpose[y]]]; (* BACKWARD *) dy = (y - t) y (1 - y); dhb = hb (1 - hb) (dy . Transpose[w]); (* UPDATE *) eta = .2; (* now adjust w after using it *) w -= eta*(Transpose[hb] . dy); dh = Map[Drop[#, -1] &, dhb]; v -= eta*(Transpose[xb] . dh); , 2000]]; ans = first[second[ans]]; (* check final answer *) h = xb. v; h = Map[tf, h, {2}]; h = Map[Append[#, -1] & , h]; y = h . w; y = Map[tf, y, {2}] ListPlot[Transpose[ans], Frame -> True]