欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tensorflow学习笔记5-激励函数 (Activation Function)

程序员文章站 2022-07-06 11:19:47
...

激励函数

Tensorflow学习笔记5-激励函数 (Activation Function)
这里的 AF 就是指的激励函数. 激励函数拿出自己最擅长的”掰弯利器”, 套在了原函数上 用力一扭, 原来的 Wx 结果就被扭弯了.

其实这个 AF, 掰弯利器, 也不是什么触不可及的东西. 它其实就是另外一个非线性函数. 比如说relu, sigmoid, tanh.

将这些掰弯利器嵌套在原有的结果之上, 强行把原有的线性结果给扭曲了. 使得输出结果 y 也有了非线性的特征. 举个例子, 比如我使用了 relu 这个掰弯利器, 如果此时 Wx 的结果是1, y 还将是1, 不过 Wx 为-1的时候, y 不再是-1, 而会是0.

你甚至可以创造自己的激励函数来处理自己的问题, 不过要确保的是这些激励函数必须是可以微分的, 因为在 backpropagation 误差反向传递的时候, 只有这些可微分的激励函数才能把误差传递回去.

常用选择

Tensorflow学习笔记5-激励函数 (Activation Function)
想要恰当使用这些激励函数, 还是有窍门的.
比如当你的神经网络层只有两三层, 不是很多的时候, 对于隐藏层, 使用任意的激励函数, 随便掰弯是可以的, 不会有特别大的影响.

不过, 当你使用特别多层的神经网络, 在掰弯的时候, 玩玩不得随意选择利器. 因为这会涉及到梯度爆炸, 梯度消失的问题. 因为时间的关系, 我们可能会在以后来具体谈谈这个问题.

最后我们说说, 在具体的例子中, 我们默认首选的激励函数是哪些. 在少量层结构中, 我们可以尝试很多种不同的激励函数.

卷积神经网络 Convolutional neural networks CNN 的卷积层中, 推荐的激励函数是 relu.
循环神经网络中 recurrent neural networks RNN, 推荐的是 tanh 或者是 relu
(这个具体怎么选, 我会在以后 循环神经网络的介绍中在详细讲解).

Tensorflow常用**函数

tf.sigmoid()

优点:在于输出映射在(0,1)范围内,单调连续,适合用作输出层,求导容易

缺点:一旦输入落入饱和区,一阶导数接近0,就可能产生梯度消失的情况

def sigmoid(x):
    y = 1 / (1 + np.exp(-x))
    return y

tf.tanh()

优点:输出以0为中心,收敛速度比sigmoid函数要快

缺点:存在梯度消失问题

def tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x)+np.exp(-x))

tf.nn.relu()

优点:目前最受欢迎的**函数,在x<0时,硬饱和,在x>0时,导数为1,所以在x>0时保持梯度不衰减,从而可以缓解梯度消失的问题,能更快收敛,并提供神经网络的稀疏表达能力

缺点:随着训练的进行,部分输入或落入硬饱和区,导致无法更新权重,称为‘神经元死亡

def relu(x):
    return [max(xi,0) for xi in x]

tf.nn.softplus()

该函数对relu做了平滑处理,更接近脑神经元的**模型

def softplus(x):
    return np.log(1+np.exp(x))

tf.nn.softmax()

除了用于二分类还可以用于多分类,将各个神经元的输出映射到(0,1空间)

tf.nn.dropout()

tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)

一个神经元以概率keep_prob决定是否被抑制,如果被抑制,神经元的输出为0,如果不被抑制,该神经元将被放大到原来的1/keep_prob倍,默认情况下,每个神经元是否被抑制是相互独立的

tf.nn.elu()

def elu(x,a=1):
    y = []
    for xi in x:
        if xi >= 0:
            y.append(xi)
        else:
            y.append(a*(np.exp(xi)-1))
    return y

Tensorflow学习笔记5-激励函数 (Activation Function)

一般规则

当输入数据特征相差明显时,用tanh效果很好,当特征相差不明显时用sigmoid效果比较好,sigmoid和tanh作为**函数需要对输入进行规范化,否则**后的值进入平坦区,而relu不会出现这种情况,有时也不需要输入规范化,因此85%-90%的神经网络会使用relu函数