Tensorflow学习笔记day04+神经网络的**函数

一、定义

在现实世界中,绝大部分问题都是无法线性分割的, 因此在设计神经网络时,**函数必须是非线性函数

线性函数是一条笔直的直线,而非线形函数不是

线性函数之和是线性函数,线性函数的线性函数也是线性函数。因此,使用线性函数,不能表示复杂数据集中存在的非线性。

每个神经元都必须有**函数,即在它们的输出在加权和以及偏置的基础上还做了一个非线形变换(通过**函数)

二、分类

目前Tensorflow 提供7种不同的非线性**函数, tf.nn.relu、tf.sigmoid和tf.tanh是其中比较常用的几个

Tensorflow也支持使用自己定义的**函数

2.1 阈值**函数

这是最简单的**函数。

如果神经元的**值大于零,那么神经元就会被**;否则,它还是处于抑制状态。

这是不可微的, 在x = 0 时, 是不连续的.因此使用这个**函数来进行基于梯度下降或其变体的训练是不可能的

Tensorflow学习笔记day04+神经网络的**函数

2.2 Sigmoid **函数

怎么读? [sɪgˌmɔɪd]

神经元的输出由函数 **g(x)=1/(1+exp(-x))**确定

tf.sigmoid(),它提供了 Sigmoid **函数。这个函数的范围在 0 到 1之间:

它很受欢迎, 从曲线来看,它像一个连续版的阈值**函数。

但是受到梯度消失问题的困扰,即函数的梯度在两个边缘附近变为零。这使得训练和优化变得困难

Tensorflow学习笔记day04+神经网络的**函数

2.3 双曲正切**函数tanh

(1-exp(-2x)/(1+exp(-2x)))

在形状上,它类似于 Sigmoid 函数,但是它的中心位置是 0,其范围是从 -1 到 1

tf.tanh

中心处附近比sigmoid函数相比具有更陡峭的导数

与 Sigmoid 函数一样,它也受到梯度消失问题的影响

Tensorflow学习笔记day04+神经网络的**函数

2.4 整流线性单元(ReLU)**函数

对于负的输入值,神经元不会**(输出为零),对于正的输入值,神经元的输出与输入值相同

使用 ReLU 的主要优点之一是导致稀疏**。在任何时刻,所有神经元的负的输入值都不会**神经元。就计算量来说,这使得网络在计算方面更轻便。

ReLU 神经元存在死亡 ReLU 的问题,也就是说,那些没有**的神经元的梯度为零,因此将无法进行任何训练,并停留在死亡状态。尽管存在这个问题,但 ReLU 仍是隐藏层最常用的**函数之一

Tensorflow学习笔记day04+神经网络的**函数

2.5 Softmax **函数

是一个归一化的指数函数

一个神经元的输出不仅取决于其自身的输入值,还取决于该层中存在的所有其他神经元的输入的总和。这样做的一个优点是使得神经元的输出小,因此梯度不会过大。

tf.nn.softmax()

yi =exp(xi​)/Σjexp(xj)

Softmax **函数被广泛用作输出层的**函数,该函数的范围是 [0,1]。在多类分类问题中,它被用来表示一个类的概率。所有单位输出和总是 1。

Tensorflow学习笔记day04+神经网络的**函数

三、总结

神经网络已被用于各种任务。这些任务可以大致分为两类:函数逼近(回归)分类。根据手头的任务,一个**函数可能比另一个更好。一般来说,隐藏层最好使用 ReLU 神经元。对于分类任务,Softmax 通常是更好的选择;对于回归问题,最好使用 Sigmoid 函数或双曲正切函数。