深度網絡的一些常用激活函數,并通過matplot繪制出來:
import matplotlib.pyplot as plt
import numpy as npdef relu(x):return np.maximum(0, x)def leaky_relu(x, alpha=0.01):return np.where(x > 0, x, alpha * x)def gelu(x):return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x ** 3)))def swish(x):return x / (1 + np.exp(-x))def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_diff(x):return np.exp(-x) / ((1 + np.exp(-x)) ** 2)def plot_func():x = np.linspace(-10, 10, 500)plt.figure(figsize=(6, 4))plt.plot(x, gelu(x), label='gelu')plt.plot(x, relu(x), label='relu')plt.plot(x, leaky_relu(x), label='leaky_relu', linestyle='--')plt.plot(x, sigmoid(x), label='sigmoid')plt.plot(x, swish(x), label='swish')plt.plot(x, sigmoid_diff(x), label='sigmoid_diff')plt.plot(x, np.tanh(x), label='tanh', linestyle='--')plt.axhline(0, color='k', linewidth=0.5)plt.axvline(0, color='k', linewidth=0.5)plt.title('all trigger functions')plt.xlabel('x')plt.ylabel('y')plt.grid(True)plt.legend()plt.show()plot_func()
sigmoid和tanh的缺點是梯度飽和(梯度易消失)。relu則改進了這一點(正半區梯度為1),且很容易計算。leaky_relu和gelu則解決了relu負半區梯度消失的問題,它倆在負半區仍有微小梯度,確保訓練可進行下去。gelu還解決了relu函數在原點處的硬轉折,使得梯度更平滑,避免震蕩,訓練更穩定。