TBD
[Página 298] Al ir desgranando paso a paso el algoritmo de propagación de errores, donde aparece el siguiente fragmento de código:
for k=layers-1:1 for j=1:layer[k].outputs() error[k][j] = dot( layer[k+1].w[j], delta[k+1][j] ); delta[k][j] = error[k][j] * activation.diff(layer[k].z[j]);debería aparecer lo siguiente, al ser delta[k+1] un vector y dot(u,v) una operación vectorial:
for k=layers-1:1 for j=1:layer[k].outputs() error[k][j] = dot( layer[k+1].w[j], delta[k+1] ); delta[k][j] = error[k][j] * activation.diff(layer[k].z[j]);[Página 588] En la implementación de una capa softmax, donde aparece el siguiente fragmento de código para calcular la entrada neta de las neuronas de la capa:
function y = forward(x) for j=1:m z = b[j]; for i=1:n z += w[j][i]*x[i]; m = max(z); y = exp(z-m); s = sum(y); y = y/s;debería aparecer lo siguiente en el cálculo de los elementos individuales del vector z:
function y = forward(x) for j=1:m z[j] = b[j]; for i=1:n z[j] += w[j][i]*x[i]; m = max(z); y = exp(z-m); s = sum(y); y = y/s;O, mejor aún, utilizando notación vectorial:
function y = forward(x) for j=1:m z[j] = b[j] + dot(w[j],x); mx = max(z); y = exp(z-mx); s = sum(y); y = y/s;Es más, si, como se hace en otras partes del libro, asumimos que el sesgo de las neuronas viene dado por el peso asociado a una entrada adicional fija (x[0]=1) o, directamente, no se utiliza en la capa softmax, el código anterior se podría simplificar de la siguiente manera:
function y = forward(x) for j=1:m z[j] = dot(w[j],x); mx = max(z); y = exp(z-mx); s = sum(y); y = y/s;PD: Gracias a María del Mar Alguacil por identificar la presencia de esas erratas en la primera impresión del libro.