在完成Z=X*W.T+b后,我们需要一个激活函数,把Z变成另外一个值,然后传到神经网络的下一层去
在神经网络的输出层,我们需要将最后的Z通过激活函数,转换成我们需要的答案
输出层需要激活函数很好理解,总不能把Z输出,搞得程序最后运行得出一个奇奇怪怪的东西吧
在隐藏层中,如果我们不需要激活函数,那我们先假设隐藏函数只有一层
x[1][1] = X[0]*W[1][1]+b[1][1]
x[1][2] = X[0]*W[1][2]+b[1][2]
x[1][3] = X[0]*W[1][3]+b[1][3]
Z= X[1]*W[2][1]+b[2][1]
化简得
Z = k1*x1+k2*x2+k3*x3+B
也就是说,过了一整个神经网络,我的训练效果差不多就是那一个节点的训练效果
emmmmmm
而如果有了激活函数
就可以把线性的东西变成非线性的,这到底有什么用呢?
现在我们来看看常用的激活函数
1. sigmoid(z)
f(z)=1/(1+e^(-z))
2. tanh(Z)
tanh(Z) = (e^x-e^(-x))/(e^x+e^(-x))
3. max(Z,0)
4. max(Z,0.01Z)
对于二元分类(最后输出结果为1 or 0的神经网络)
我们一般用的是前两种激活函数,其中用的最多的是第二种
可以看到,这两种神经网络的倒数都有一个特点,就是在x足够大,或者足够小的时候导数接近于0,而x接近于0的时候,导数较大
因为我们输出0 or 1嘛,然后最后的输出又是由sigmoid函数输出的
所以我们要尽量让x远离0,已得到一个确切的,正确的结果。
也就是说,在x已经远离0且是正确的情况下,我们的W,b参数基本上是不用动的
而在x接近0的情况下,我们要让x往正确的方向,偏离尽可能的远,所以这个时候导数要尽量大
至于最后的两个,在特定的情况下,也有他们的优缺点。
对于特定的问题,我们可以试着调整激活函数,看能不能提高精度。
其实直觉告诉我,最优解在,函数越多越好,越少越好,每一层用的种类越多越好,每一层都相同,然后各层的激活函数不同之中
下个星期可以试试