sigmoid函数和tanh函数和relu函数和leaky_relu函数

博客介绍了sigmoid、tanh、relu和leaky_relu函数的原理与实现,这些激活函数在机器学习中具有重要作用,能为模型引入非线性因素,提升模型的表达能力。

  sigmoid函数,tanh函数,relu函数,leaky_relu函数原理与实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def sigmoid(x):
    return np.exp(x)/sum(np.exp(x))
def tanh(x):
    return (np.exp(x) - np.exp(-x))/(np.exp(x) + np.exp(-x))
def relu(x):
    res = []
    for i in x:
        if i > 0:
            res.append(i)
        else:
            res.append(0)
    
    return res
def leaky_relu(x):
    res = []
    for i in x:
        if i > 0:
            res.append(i)
        else:
            res.append(0.01*i)
    
    return res
plt.figure(figsize= [30,30],dpi=50)

x = np.arange(-5,5,0.01)
y_sigmoid = sigmoid(x)

y_tanh = tanh(x)

y_relu = relu(x)

y_leaky_relu = leaky_relu(x)

plt.subplot(2,2,1)

plt.plot(x,y_sigmoid)
plt.title('sigmoid ficture',fontsize = 30)


plt.subplot(2,2,2)
plt.plot(x,y_tanh)
plt.title('tanh ficture',fontsize = 30)

plt.subplot(2,2,3)
plt.plot(x,y_relu)
plt.title('relu ficture',fontsize = 30)

plt.subplot(2,2,4)
plt.plot(x,y_leaky_relu)
plt.title('leaky_relu ficture',fontsize = 30)


Text(0.5, 1.0, 'leaky_relu ficture')
### ReLULeakyReLUSigmoid Tanh 激活函数的特性及应用场景 #### 1. Sigmoid 激活函数 Sigmoid 函数是一种经典的激活函数,其输出范围在 0 到 1 之间,非常适合用于生成概率值或表示二分类问题中的置信度。它具有平滑的梯度特性,便于求导,从而避免了训练过程中可能出现的突变梯度[^1]。然而,Sigmoid 函数在输入较大或较小时容易出现梯度消失问题,即梯度接近于零,导致模型难以继续学习。 **适用场景**: - 二分类问题中作为输出层激活函数。 - 需要将输出限制在 [0, 1] 范围内的任务。 ```python import torch.nn as nn sigmoid = nn.Sigmoid() ``` #### 2. Tanh 激活函数 Tanh(双曲正切)函数Sigmoid 的一种变体,其输出范围为 [-1, 1]。与 Sigmoid 类似,Tanh 也存在梯度消失的问题,但在某些情况下,由于其对称性,能够提供更好的收敛性能。 **适用场景**: - 需要对输入进行非线性变换并保持对称性的任务。 - RNN 或 LSTM 等循环神经网络中的隐藏层激活函数。 ```python tanh = nn.Tanh() ``` #### 3. ReLU 激活函数 ReLU(Rectified Linear Unit)函数定义为 \( f(x) = \max(0, x) \),它通过简单地将所有负值设为零来实现非线性变换。ReLU 的主要优点是计算效率高且能有效缓解梯度消失问题,因为对于正值输入,其梯度恒为 1。然而,ReLU 存在一个“死亡神经元”问题,即当输入始终为负时,该神经元将不再更新。 **适用场景**: - 大多数深度卷积神经网络(CNN)全连接网络中的隐藏层激活函数。 - 需要快速训练且对梯度消失不敏感的任务。 ```python relu = nn.ReLU() ``` #### 4. LeakyReLU 激活函数 LeakyReLUReLU 的一种改进版本,允许少量的负值通过,以解决 ReLU 的“死亡神经元”问题。其定义为 \( f(x) = \max(\alpha x, x) \),其中 \(\alpha\) 是一个小的正数,通常设置为 0.01。这种设计使得即使输入为负值,也能保留一定的梯度,从而避免神经元完全失效[^1]。 **适用场景**: - 需要避免 ReLU 的“死亡神经元”问题的任务。 - 对梯度消失较为敏感的深层网络。 ```python leaky_relu = nn.LeakyReLU(negative_slope=0.01) ``` ### 比较总结 | 特性/函数 | 输出范围 | 梯度消失问题 | 死亡神经元问题 | 计算复杂度 | |-----------|----------|---------------|-----------------|------------| | Sigmoid | (0, 1) | 易出现 | 无 | 中等 | | Tanh | (-1, 1) | 易出现 | 无 | 中等 | | ReLU | [0, ∞) | 不易出现 | 存在 | 低 | | LeakyReLU | (-∞, ∞) | 不易出现 | 缓解 | 低 | ### 示例代码 以下是一个简单的 PyTorch 示例,展示如何使用不同的激活函数: ```python import torch import torch.nn as nn # 定义输入张量 x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0]) # 使用不同的激活函数 sigmoid_output = nn.Sigmoid()(x) tanh_output = nn.Tanh()(x) relu_output = nn.ReLU()(x) leaky_relu_output = nn.LeakyReLU(negative_slope=0.01)(x) print("Sigmoid Output:", sigmoid_output) print("Tanh Output:", tanh_output) print("ReLU Output:", relu_output) print("LeakyReLU Output:", leaky_relu_output) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值