Tensorflow学习笔记day04+神经网络的**函数
一、定义
在现实世界中,绝大部分问题都是无法线性分割的, 因此在设计神经网络时,**函数必须是非线性函数
线性函数是一条笔直的直线,而非线形函数不是
线性函数之和是线性函数,线性函数的线性函数也是线性函数。因此,使用线性函数,不能表示复杂数据集中存在的非线性。
每个神经元都必须有**函数,即在它们的输出在加权和以及偏置的基础上还做了一个非线形变换(通过**函数)
二、分类
目前Tensorflow 提供7种不同的非线性**函数, tf.nn.relu、tf.sigmoid和tf.tanh是其中比较常用的几个
Tensorflow也支持使用自己定义的**函数
2.1 阈值**函数
这是最简单的**函数。
如果神经元的**值大于零,那么神经元就会被**;否则,它还是处于抑制状态。
这是不可微的, 在x = 0 时, 是不连续的.因此使用这个**函数来进行基于梯度下降或其变体的训练是不可能的
2.2 Sigmoid **函数
怎么读? [sɪgˌmɔɪd]
神经元的输出由函数 **g(x)=1/(1+exp(-x))**确定
tf.sigmoid(),它提供了 Sigmoid **函数。这个函数的范围在 0 到 1之间:
它很受欢迎, 从曲线来看,它像一个连续版的阈值**函数。
但是受到梯度消失问题的困扰,即函数的梯度在两个边缘附近变为零。这使得训练和优化变得困难
2.3 双曲正切**函数tanh
(1-exp(-2x)/(1+exp(-2x)))
在形状上,它类似于 Sigmoid 函数,但是它的中心位置是 0,其范围是从 -1 到 1。
tf.tanh
中心处附近比sigmoid函数相比具有更陡峭的导数
与 Sigmoid 函数一样,它也受到梯度消失问题的影响
2.4 整流线性单元(ReLU)**函数
对于负的输入值,神经元不会**(输出为零),对于正的输入值,神经元的输出与输入值相同
使用 ReLU 的主要优点之一是导致稀疏**。在任何时刻,所有神经元的负的输入值都不会**神经元。就计算量来说,这使得网络在计算方面更轻便。
ReLU 神经元存在死亡 ReLU 的问题,也就是说,那些没有**的神经元的梯度为零,因此将无法进行任何训练,并停留在死亡状态。尽管存在这个问题,但 ReLU 仍是隐藏层最常用的**函数之一。
2.5 Softmax **函数
是一个归一化的指数函数
一个神经元的输出不仅取决于其自身的输入值,还取决于该层中存在的所有其他神经元的输入的总和。这样做的一个优点是使得神经元的输出小,因此梯度不会过大。
tf.nn.softmax()
yi =exp(xi)/Σjexp(xj)
Softmax **函数被广泛用作输出层的**函数,该函数的范围是 [0,1]。在多类分类问题中,它被用来表示一个类的概率。所有单位输出和总是 1。
三、总结
神经网络已被用于各种任务。这些任务可以大致分为两类:函数逼近(回归)和分类。根据手头的任务,一个**函数可能比另一个更好。一般来说,隐藏层最好使用 ReLU 神经元。对于分类任务,Softmax 通常是更好的选择;对于回归问题,最好使用 Sigmoid 函数或双曲正切函数。