微软研究院2015的一篇论文。
1.概要:
PRelu其实是Relu的增强版,PRelu使得模型在ImageNet2012上的结果提高到4.94%,超过普通人的正确率;PRelu需要像更新权重weights一样使用BP更新一个额外的参数,但是相较于weights的数量来说,PRelu需要更新的参数总数可以忽略不计,所以不会加重overfitting的影响。
如果PRelu的参数为0,那其实就是Relu;如果PRelu的参数为一个很小的常数constant,比如0.01,那其实就是Leaky Relu(LRelu)。
Relu与PRelu的比较:
PRelu的表达式:
2.idea:
1): 每一个feature map(CNN)对应的PRelu的系数都可以是不同的,也可以是相同层的PRelu的系数都一样,层间不同。
2): 作者在实验的时候都是将系数初始化为0.25
3): 优化的时候不会对PRelu的系数进行regularization,否则会让系数趋近于0,基本相当于LRelu或者Relu了。
3.流程:
PRelu的系数也是在BP的时候进行优化的,与weights的方式一样
目标函数对PRelu的系数求偏导:
优化:
4.代码(keras):
def __init__(self, input_shape, init='zero', weights=None):
super(PReLU, self).__init__()
self.init = initializations.get(init)
self.alphas = self.init(input_shape)
self.params = [self.alphas]
self.input_shape = input_shape
if weights is not None:
self.set_weights(weights)
def get_output(self, train):
X = self.get_input(train)
pos = ((X + abs(X)) / 2.0)
neg = self.alphas * ((X - abs(X)) / 2.0)
return pos + neg
def get_config(self):
return {"name": self.__class__.__name__,
"input_shape": self.input_shape,
"init": self.init.__name__}
本文系作者原创,转载请先联系作者: 18254275587@163.com