深度学习4大激活函数

2023-08-25 11:54:26 浏览数 (1)

深度学习4大激活函数

如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出实际上都是上层输入的线性函数。

这样就使得无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,模型的表达力仍然不够。

我们决定引入非线性函数作为激励函数,这样深层神经网络才有意义(不再是输入的线性组合)。

本文将介绍深度学习中的4个常见的激活函数,从原函数公式、导数函数及二者的可视化来进行对比:

  • Sigmoid函数
  • Tanh函数
  • ReLu函数
  • Leaky ReLu函数

激活函数特征

  1. 非线性:激活函数满足非线性时,才不会被单层网络替代,神经网络才有了意义
  2. 可微性:优化器大多数是用梯度下降来更新梯度;如果不可微的话,就不能求导,也就不能更新参数
  3. 单调性:激活函数是单调的,能够保证网络的损失函数是凸函数,更容易收敛

Sigmoid函数

表示形式为tf.nn.sigmoid(x)

f(x)=frac{1}{1 e^{-x}}

原函数

In [1]:

代码语言:javascript复制
# import tensorflow as

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline


def sigmoid(x):
    """
    返回sigmoid函数
    """
    return 1 / (1   np.exp(-x))


def plot_sigmoid():
    # param:起点,终点,间距
    x = np.arange(-10, 10, 0.2)
    y = sigmoid(x)
    plt.plot(x, y)
    plt.grid()
    plt.show()


if __name__ == '__main__':
    plot_sigmoid()

导数函数

该函数的导数为:

$$begin{aligned} f^{prime}(z) &=left(frac{1}{1 e{-z}}right){prime} &=frac{e{-z}}{left(1 e{-z}right)^2} &=frac{1 e{-z}-1}{left(1 e{-z}right)^2} &=frac{1}{left(1 e{-z}right)}left(1-frac{1}{left(1 e{-z}right)}right) &=f(z)(1-f(z)) end{aligned} $$

另一种求解方法:

步骤1:

$$begin{aligned} frac{mathrm{d} y}{mathrm{~d} x} &=-left(1 e{-x}right){-2} cdotleft(1 e{-x}right){prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e{-x}right){prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e^{-x}right) cdot(-x)^{prime} &=-left(1 e{-x}right){-2} cdot 1 cdotleft(e^{-x}right) cdot(-1) &=left(1 e{-x}right){-2} cdotleft(e^{-x}right) &=frac{e{-x}}{left(1 e{-x}right)^2} end{aligned}$$

步骤2:

1-y=1-frac{1}{1 e{-x}}=frac{1 e{-x}-1}{1 e{-x}}=frac{e{-x}}{1 e^{-x}}

步骤3:

frac {dy}{dx}=frac{e{-x}}{(1 e{-x})} * frac{1}{(1 e^{-x})}=y(1-y)
代码语言:javascript复制
# import tensorflow as

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline


def der_sigmoid(x):
    """
    返回sigmoid函数
    """
    sig = 1 / (1   np.exp(-x))  # sigmoid函数

    return sig * (1 - sig)  # 输出为导数函数


def plot_der_sigmoid():
    # param:起点,终点,间距
    x = np.arange(-10, 10, 0.2)
    y = der_sigmoid(x)  # 导数函数
    plt.plot(x, y)
    plt.grid()
    plt.show()


if __name__ == '__main__':
    plot_der_sigmoid()

特点

Sigmoid函数是二分类算法,尤其是逻辑回归中算法中的常用激活函数;也可以作为较少层数的神经网络的激活函数。

它主要是有下面几个特点:

  1. 能够将自变量

    0 人点赞