Activation.softmax constructor
Activation.softmax()
Softmax activation function
softmax(x) = {e^x_i/sum(e^x) | i = 1,n}
Softmax calculate 'probabilities' from input vector x
Softmax is a vector to vector function, that's why it`s derivative is a Jacobi matrix
Example:
final softmax = Activation.softmax();
final x = Matrix.row([-1, 0, 1]);
final y = softmax.function(x);
print(y); // output: matrix 1тип3 [[0.09003057317038045, 0.2447284710547976, 0.6652409557748218]]
Implementation
Activation.softmax() {
function = (Matrix m, [dynamic param]) {
Matrix resultMatrix = Matrix.zero(n: 0, m: 0);
for (int i = 0; i < m.m; i += 1) {
Matrix exps = m.getColumn(i);
exps = exps.addedScalar(max(exps)).apply(math.exp);
if (i == 0) {
resultMatrix = exps.scaled(1 /
exps.flattenList().reduce((value, element) => value + element));
} else {
resultMatrix = MatrixOperation.columnBind(
resultMatrix,
exps.scaled(1 /
exps
.flattenList()
.reduce((value, element) => value + element)));
}
}
return resultMatrix;
};
dfunction = (Matrix m, [dynamic param]) {
final softMatrix = function(m);
// Jacobian for each (mini)batch sample
return List<Matrix>.generate(
m.m,
(index) =>
Matrix.diag(diag: softMatrix.getColumn(index).flattenList()) -
softMatrix.getColumn(index) * softMatrix.getColumn(index).T);
};
name = 'softmax';
}