【发布时间】:2019-12-29 02:04:54
【问题描述】:
所以我是 ML 新手,并尝试制作一个简单的“库”,以便了解更多关于神经网络的信息。
我的问题: 根据我的理解,我必须根据它们的激活函数对每一层进行导数,这样我就可以计算它们的增量并调整它们的权重等......
对于 ReLU、sigmoid、tanh,用 Java(这是我使用的语言 BTW)实现它们非常简单
但是要从输出到输入,我必须(显然)从具有 softmax 激活函数的输出开始。
那么我是否也必须采用输出层的导数,还是只适用于所有其他层?
如果我必须得到派生,我如何在 Java 中实现派生? 谢谢。
我已经阅读了很多关于 softmax 算法导数的解释的页面,但它们对我来说真的很复杂,正如我所说,我刚开始学习 ML,我不想使用现成的库所以我来了。
这是我存储激活函数的类。
public class ActivationFunction {
public static double tanh(double val) {
return Math.tanh(val);
}
public static double sigmoid(double val) {
return 1 / 1 + Math.exp(-val);
}
public static double relu(double val) {
return Math.max(val, 0);
}
public static double leaky_relu(double val) {
double result = 0;
if (val > 0) result = val;
else result = val * 0.01;
return result;
}
public static double[] softmax(double[] array) {
double max = max(array);
for (int i = 0; i < array.length; i++) {
array[i] = array[i] - max;
}
double sum = 0;
double[] result = new double[array.length];
for (int i = 0; i < array.length; i++) {
sum += Math.exp(array[i]);
}
for (int i = 0; i < result.length; i++) {
result[i] = Math.exp(array[i]) / sum;
}
return result;
}
public static double dTanh(double x) {
double tan = Math.tanh(x);
return (1 / tan) - tan;
}
public static double dSigmoid(double x) {
return x * (1 - x);
}
public static double dRelu(double x) {
double result;
if (x > 0) result = 1;
else result = 0;
return result;
}
public static double dLeaky_Relu(double x) {
double result;
if (x > 0) result = 1;
else if (x < 0) result = 0.01;
else result = 0;
return result;
}
private static double max(double[] array) {
double result = Double.MIN_VALUE;
for (int i = 0; i < array.length; i++) {
if (array[i] > result) result = array[i];
}
return result;
}
}
我期待得到这个问题的答案:我是否需要 softmax 的导数? 如果可以,我该如何实现?
【问题讨论】:
标签: java machine-learning backpropagation derivative softmax