神经网络中的**函数
**函数是神经网络的重要的组成部分,但是什么是**函数呢,有什么作用呢?
**函数的来源
线性函数是很简单的函数,也正是因为它的简单,它不能很好的概括一些复杂的问题,如何才能把线性的函数变成非线性的呢?这时候**函数出场了,说“我来掰弯你”,复杂问题解决了。
**函数
**函数套在原来的函数上,用力一扭,原来的线性函数被扭弯了。
这个AF(activation function)也不是什么触不可及的东西,它本质就是另外一个非线性函数。比如说relu,sigmoid,tanh等。将这些掰弯利器嵌套在原有的结果之上,活生生把原有的线性结果给扭曲了。是的输出结果y也有了非线性的特征。举个例子,比如使用了relu这个掰弯利器,如果此时线性函数的结果是1,y还是1,不过线性函数为-1的时候,y不再是-1,而会是0。
你甚至可以创造自己的**函数来处理自己的问题,不过要确保的是这些**函数必须是可以微分的,因为在backpropagation误差反向传递的时候,只有这些可微分的**函数才能把误差传递回去。
常用选择
要恰当使用这些**函数,还是有窍门的。比如当你的神经网络层只有2-3层,不是很多的时候,对于隐藏层,使用任意的**函数,随便掰弯是可以的,不会有特别大的影响。不过当你使用特别多层的神经网络,在掰弯的时候,万万不能随意选择利器。因为这会涉及到梯度爆炸,梯度消失的问题。
在具体的例子中,我们默认首选的**函数是什么。在少量层的结构中,我们可以尝试很多不同的**函数。在cnn的卷积层中,推荐的**函数是relu。在rnn中,推荐的是tanh或者是relu。