1.神经网络最后一层 要有激活函数么?
不一定要有激活函数。见过代码,对mnist进行多分类的。直接wx+b,然后后面又接了一个soft max,使用交叉熵做loss function,学习率是0.01,虽然准确率不怎么样大概0.917(学习1000个batch,batch size是100),,但是证明 最后一层并不一定需要激活函数(也可以认为soft max也是一种激活函数)。
2.relu在0点处的导数?
ReLU(x) = max(0, x)
First, you can just arbitrarily assign a value for the derivative of y = ReLU(x) when x = 0. Common arbitrary values are 0, 0.5, and 1.A second alternative is, instead of using the actual y = ReLU(x) function, use an approximation to ReLU which is differentiable for all values of x. One such approximation is called softplus which is defined y = ln(1.0 + e^x) which has derivative of y’ = 1.0 / (1.0 + e^-x) which is, remarkably, the logistic sigmoid function. Neat!
3.神经网络能不能使用多种激活函数?
我想是可以的。并没有相关论文说一个神经网络不能使用多种激活函数。
4.什么样的函数 能成为激活函数?
激活函数一种映射h:R->R。且几乎处处可导 。激活函数一般具有以下性质:
-非线性
-几乎处处可导
-计算简单
-单调性
-输出值范围有限
5.什么时候选择a函数,什么时候选择b函数
a.2-3层不是很多层,任意可以尝试。
b.很多层的时候,不可以随意选择。会有梯度爆炸、梯度消失的问题。卷积推荐relu,recurrent推荐relu和tanh,
c.当你知道你想逼近的函数的某些特征时候,你可以选择可以更快近似这个函数的激活函数。比如sigmoid对于分类器很有效。因为要近似一个分类器,sigmoid的combine要比relu更容易,可以更快训练过程和收敛。
d.如果你不知道你想要逼近的函数的性质,你可以从relu开始,再尝试其他的激活函数。relu通常还不错,作为一个通用
的近似器。
e.如果想让结果在(0,1)之间,使用Sigmoid(如LSTM的各种Gates)
f.如果想网络训练的很深,不要用S型的激活函数;
g.-如果使用ReLU,要注意初始化和learning rates的设置
h.如果使用ReLU,出现很多神经元死亡问题,且无法解决,可以尝试L-ReLU、P-ReLU等ReLU的变体;
6.为啥要有激活函数?
a.神经网络中的激活函数能够引入非线性因素,提高模型的表达能力
b.一些激活函数能够起到特征组合的作用。
比如对于sigmoid函数σ(x)=1/(1+e^-x)。对e^x进行泰勒展开
平方项体现了特征的两两组合:
7.不同的激活函数各自有哪些性质?
a.step function
y=wx+b
y>thres y=1,否则为0。
那么当对多分类问题进行预测的时候,你的ouput很容易出现多个1的情况,你很难决定到底该选择哪个类别。
在训练的时候,你需要只有那个正确类别的位置为1,其他都是0,这很难train和收敛。
所以这种太过生硬的要么激活,要么不激活的激活函数 可能不太ok。我们想要一个可以给出'中间值'的激活函数,而这个中间值可以表示为概率或者置信度。
b.线性激活函数
如果A=cy(y这里是wx+b)是否可以呢。这是一个线性激活函数,其问题是,A对y的导数完全是常数,并不依赖于y的改变。
注意在这里思考,为什么我们想让A对y的导数依赖于y。
Not possible to use backpropagation
此外最大的问题是,如果是这种线性激活函数,一层层stack起来,最终的结果 还是一种线性,产生不了任何非线性。
c.sigmoid
非线性,sigmoid的combine仍然是非线性,它有比较平滑的导数。激活值有范围(0,1),而不是像线性函数一样
没有范围。此外它不像阶跃函数,非0即1,而是给出中间值,这个中间值可以表示为概率。
此外这个函数在x=±2的时候,梯度较大,会倾向于将激活值带到曲线的两侧。
问题:在曲线两侧,梯度很小,有梯度消失问题。NN在这个时候会拒绝学习或者学习速度非常慢。
有一些办法来处理这样的情况,所以应用的还挺广泛,尤其分类任务中。
输出不以0为中心,可能导致训练缓慢;(为什么不以0为中心,就慢了!!参考这篇文章https://liam.page/2018/04/17/zero-centered-active-function/)
指数计算,计算复杂度高;
d.tanh
tanh(x)=2*sigmoid(2x)-1,是一种经过scaled的sigmoid函数。所以具有sigmoid函数的所有特性。
激活值是有界的(-1,1)。它与sigmoid的最大不同是梯度更陡峭(某种程度上可以让收敛速度更快)。所以在使用的时候需要注意你对梯度的要求。此外tanh输出是以0为中心的。
tanh也存在梯度消失的问题。tanh使用得很广泛。
e.relu
A(x) = max(0,x)
首先relu看着好像有点像线性激活函数,但是实际上它是非线性的。relu的combine仍然是非线性的(任意函数都可以使用relu的combine来进行近似),所以我们可以stack layers。relu的激活数值范围是[0,inf]。
relu的激活具备稀疏性。tanh和sigmoid在激活的的时候是dense的,所以很costly,而relu只有一部分被激活,所以其是稀疏的和高效的,提供了神经网络的稀疏表达能力,更轻量级。relu的输出不是以0为中心的。
relu也有缺陷。relu图像左边是直线,所以那块的梯度是0。这会导致对错误和输入的变化停止反应,因为梯度是0。这叫做relu死亡问题。这会导致神经元死亡,网络的一大部分死掉。
有一些补救方法,其方法是将左边的水平线,变为y=ax,以让左边的梯度不再为0。
Leaky ReLU:α固定为x比较小的值,如0.01、0.05;
Parametric ReLU: α作为参数,自适应地从数据中学习得到;
Randomized ReLU:随机生成一个α,再进行修正;
与tanh和sigmoid相比,relu在计算上更高效,因为使用的是更简单的数学运算。在设计nn的时候,需要注意。
f.ELU
8.为啥要用bias?
答案很简单,我们考虑最简单的情况y=wx,x是一维向量,不加 bias 你的分割线就必须过原点,这显然是不灵活的。有了bias我们就可以上下左右移动我们的线了。神经网络是一样的道理。