DNN常见激活函数与其求导公式及来源

Sigmoid 函数

f1(x)=11+ex
   f1(x) 的导函数为:
ddxf1(x)=f1(x)(1f1(x))

tanh函数

sinh(x)=exex2

cosh(x)=ex+ex2

tanh(x)=sinh(x)cosh(x)=exexex+ex

  通过上下同乘 ex 可得 f2(x)=tanh(x)=2f1(2x)1 【转化为Sigmoid函数的形式】
  因此,tanh的导函数为:
ddxf2(x)=2f1(2x)2(1f1(2x))=1f22(x)

  函数模型如下:

tanh函数

  相关论文:(该论文证明了tanh激活函数比Sigmoid好,因为Sigmoid的平均值不为0)
  Eigenvalues of covariance matrices: Application to neural-network learning.

ReLu 函数

f3(x)=max(0,x)

  即当x>0时,函数表现为 y=x;当 x<0 时,函数表现为 y=0
  表现为分段函数的形式:
f3(x)={x,0,x>0x0

  则 ReLu函数的导函数为:
ddxf3(x)={1,0,x>0x0

提出背景:
  2001年,神经科学家Dayan、Abott从生物学角度,模拟出了脑神经元接受信号更精确的激活模型,模型如下:

这里写图片描述

  这个模型对比Sigmoid系(Sigmoid和tanh)主要变化有三点:①单侧抑制相对宽阔的兴奋边界稀疏激活性(重点,可以看到红框里前端状态完全没有激活)

  该函数模型和Softplus函数一起被整理后,由论文发表。模型如下:

这里写图片描述

  相关论文为:
   Deep Sparse Rectifier Neural Networks

Leaky ReLu 函数

f4(x)={x,αx,x>0x0

其中,α是一个接近0的常数

  则 Leaky ReLu函数的导函数为:
ddxf4(x)={1,α,x>0x0

  函数模型如下:
Leaky ReLu 函数

  提出论文:
   Rectifier nonlinearities improve neural network acoustic models

ELU 函数

f5(x)={x,α(ex1),x>0x0

  则 ELU函数的导函数为:
ddxf5(x)={1,αex,x>0x0={1,f5(x)+α,x>0x0

  ELU函数模型如下:

ELU函数模型

  该函数模型有如下特性:
  右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。

  提出论文:
  Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)

**Maxout函数**

f5(x)=max((wi)Tx+bi)

  该函数有如下特性:
  maxout的拟合能力是非常强的,它可以拟合任意的的凸函数(当然包括ReLu和 Leaky ReLu)。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合。
  Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。

  提出论文:
  Maxout Networks

要用深度神经网络来拟合积分函数,可以考虑使用 PyTorch 框架。以下是一个简单的代码示例: ```python import torch import torch.nn as nn import torch.optim as optim # 定义积分函数 def integral_function(x): return torch.sin(x) # 生成训练数据 x_train = torch.linspace(0, 2 * torch.pi, 100) y_train = torch.zeros(100) for i in range(1, len(x_train)): y_train[i] = y_train[i-1] + (integral_function(x_train[i-1]) + integral_function(x_train[i])) / 2 * (x_train[i] - x_train[i-1]) # 定义神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(1, 10) self.fc2 = nn.Linear(10, 1) def forward(self, x): x = torch.sin(self.fc1(x)) x = self.fc2(x) return x # 训练神经网络 net = Net() criterion = nn.MSELoss() optimizer = optim.Adam(net.parameters(), lr=0.01) for epoch in range(1000): optimizer.zero_grad() outputs = net(x_train.view(-1, 1)) loss = criterion(outputs, y_train.view(-1, 1)) loss.backward() optimizer.step() # 测试神经网络 x_test = torch.linspace(0, 2 * torch.pi, 1000) y_test = torch.zeros(1000) for i in range(1, len(x_test)): y_test[i] = y_test[i-1] + (integral_function(x_test[i-1]) + integral_function(x_test[i])) / 2 * (x_test[i] - x_test[i-1]) net.eval() with torch.no_grad(): outputs = net(x_test.view(-1, 1)) test_loss = criterion(outputs, y_test.view(-1, 1)) print('Test loss: {:.6f}'.format(test_loss.item())) ``` 这个例子中,我们首先定义了一个积分函数 `integral_function`,然后生成了训练数据,其中 x_train 是等间距的自变量,y_train 是积分函数的输出值。接下来定义了一个简单的神经网络,包含一个输入层、一个隐层和一个输出层,隐层使用了 sin 函数来增加非线性。然后使用均方误差作为损失函数,使用 Adam 优化器来更新模型参数。最后使用测试数据来测试模型的预测性能。 需要注意的是,该示例中的积分函数只是一个简单的正弦函数,实际上深度神经网络在拟合一般的积分函数时可能会遇到较大的困难,需要根据具体问题进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值