神经网络常用激活函数包括sigmoid、tanh、Relu、LeakyRelu、Elu、PRelu和MaxOut。对每一种函数采用java进行实现。前面四种激活函数是固定形式,后面三种激活函数部分参数可以通过神经网络学习进行调整,这里只针对激活函数本身进行简单实现,不做过多讲解。
1、sigmoid函数
公式:1 / (1 + E^-x)
代码:
public double sigmoid(double x) {
return 1 / (1 + Math.pow(Math.E, -x));
}
sigmoid图形:
2、tanh函数
公式:公式:(E^x - E^-x)/(E^x + E^-x)
代码:
public double tanh(double x) {
return (Math.pow(Math.E, x) - Math.pow(Math.E, -x)) / (Math.pow(Math.E, x) + Math.pow(Math.E, -x));
}
Tanh图形:
3、relu函数
公式:max(0,x)
代码:
public double relu(double x) {
return Math.max(0, x);
}
Relu图形:
4、leakyrelu函数
公式:max(a*x,x),a为(0~1)之间取一个固定值
代码:
public double leakyRelu(double x) {
return Math.max(0.01 * x, x);
}
图形(a=0.5):
5、prelu函数
公式:max(ax,x),其中a不是固定值,可通过学习更改
代码:
public double pRelu(double x,double a) {
return Math.max(a * x, x);
}
6、elu函数
公式:当x>0,返回x;当x<=0,返回a*(E^x - 1),a不是固定值,同样可通过学习进行调整
代码:
public double elu(double x,double a) {
if (x > 0) {
return x;
}else {
return a * (Math.pow(Math.E, x) - 1);
}
}
7、maxout函数
公式:max(z[]),z[]为神经网络每一层计算结果的集合
神经网络层计算公式:z=wx+b,w为权重,b为偏置
也就是说,maxout函数的参数z[]会随着神经网络层的增加而递增
代码:
public class MaxOut {
List<Double> values = new ArrayList<>();
public double maxOut(double value) {
values.add(value);
Collections.sort(values);
return values.get(0);
}
}