Fe de erratas
Primera edición, segunda impresión, febrero de 2019 & Edición en dos volúmenes, marzo de 2019
TBD
Primera edición, primera impresión, noviembre de 2018
El algoritmo de propagación de errores
[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]);
Softmax
[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.