激活函数
在神经网络中,激活函数是一种非线性函数,对输入信号进行转换并生成输出。常见的激活函数包括:
-
Sigmoid函数:将实数映射到(0,1)之间的函数,可用于二分类问题,但在深度神经网络中容易出现梯度消失的问题。
-
Tanh函数:将实数映射到(-1,1)之间的函数,也可用于二分类问题,但仍会出现梯度消失的问题。
-
ReLU函数:修正线性单元函数,即$f(x)=\max(0,x)$。在深度神经网络中广泛使用,具有快速计算和不会出现梯度消失的优点。
-
LeakyReLU函数:修正线性单元函数的改进版,即$f(x)=\max(\alpha x,x)$,其中$\alpha$是一个小的正数,通常取0.01。与ReLU相比,LeakyReLU能在一定程度上解决ReLU的神经元死亡问题。
-
ELU函数:指数线性单元函数,即$f(x)=\begin{cases}\alpha(e^x-1)&\text{ if }x<0\x&\text{ if }x\geq0\end{cases}$,其中$\alpha$是一个小的正数,通常取1。ELU可以在较小的计算代价下更好地预测负输入值的输出。
-
Softmax函数:将向量映射到概率分布上,用于多分类问题,将输入向量转换为概率向量。
神经网络中常用的激活函数包括sigmoid、tanh、ReLU、Leaky ReLU、ELU和softmax等。以下是每种激活函数的介绍和绘制代码:
1. Sigmoid函数:
sigmoid函数将输入的实数压缩到0和1之间,其方程为:f(x)=1/(1+exp(-x))。在深度学习中,sigmoid函数通常用于二分类问题。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
plt.plot(x, y)
plt.title('Sigmoid Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
2. Tanh函数:
tanh函数是一种非线性函数,可将输入值映射到-1和1之间,其方程为:f(x)=tanh(x)= (exp(x)-exp(-x))/(exp(x)+exp(-x))。在深度学习中,tanh函数通常用于解决回归问题和分类问题。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def tanh(x):
return np.tanh(x)
x = np.linspace(-10, 10, 100)
y = tanh(x)
plt.plot(x, y)
plt.title('Tanh Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
3. ReLU函数:
ReLU函数是一种非线性函数,其输入值小于0时输出0,大于0时输出本身,其方程为:f(x)=max(0,x)。在深度学习中,ReLU函数通常用于处理图像、文本和语音信号数据。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def relu(x):
return np.maximum(0, x)
x = np.linspace(-10, 10, 100)
y = relu(x)
plt.plot(x, y)
plt.title('ReLU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
4. Leaky ReLU函数:
Leaky ReLU函数是ReLU函数的一种变体,其输入值小于0时输出一个小的斜率而不是0,以避免ReLU函数出现的神经元"死亡"问题。其方程为:f(x)=max(0.01x, x)。在深度学习中,Leaky ReLU函数通常用于处理图像、文本和语音信号数据。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def leaky_relu(x):
return np.maximum(0.01 * x, x)
x = np.linspace(-10, 10, 100)
y = leaky_relu(x)
plt.plot(x, y)
plt.title('Leaky ReLU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
5. ELU函数:
ELU函数是一种具有更平滑曲线的激活函数,可以避免ReLU函数出现的神经元"死亡"问题。其方程为:f(x)=x if x>0; f(x)=alpha * (exp(x)-1) if x<=0。其中alpha是一个小的常数,通常取1。在深度学习中,ELU函数通常用于处理图像、文本和语音信号数据。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def elu(x, alpha=1):
return np.where(x > 0, x, alpha * (np.exp(x) - 1))
x = np.linspace(-10, 10, 100)
y = elu(x)
plt.plot(x, y)
plt.title('ELU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
6. Softmax函数:
Softmax函数是一种常用的多分类激活函数,可以将输入值映射到一个概率分布上,其方程为:f(x_i)=exp(x_i)/sum(exp(x_j))。其中i代表输出层的神经元数,j代表输入层的神经元数。在深度学习中,Softmax函数通常用于分类问题。
绘图代码:
```
import matplotlib.pyplot as plt
import numpy as np
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x)
x = [1, 2, 3, 4, 5]
y = softmax(x)
plt.bar(x, y)
plt.title('Softmax Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.show()
```
优化器
神经网络中的优化器是用来在训练过程中更新模型权重以最小化损失函数的算法。以下是常用的几种优化器:
1. SGD(随机梯度下降):是最常用的优化器之一,它适用于训练数据集较大的情况。每次迭代从训练集中随机选取一部分数据进行训练。
2. Adam(自适应矩估计):是一种结合了随机梯度下降和动量方法的优化器。它能够自适应地调整学习率,同时保留了动量方法的优点。
3. Adagrad(自适应梯度算法):是一种适用于稀疏数据集的优化器。它根据每个参数在过去的梯度中出现的频率自适应地调整学习率。
4. RMSprop(均方根传播):是一种优化器,可以在训练期间自适应地调整学习率。它通过保留过去梯度的平均值来调整学习率。
5. Adadelta:是一种自适应方法,用于根据过去的梯度和权重变化来更新学习率和参数值。
6. Nadam:是一种结合了Nesterov动量和Adam优化器的方法,它能够自适应地调整学习率同时保持动量法的优点。
这些优化器在不同的数据集和模型上表现不同,需要根据具体情况选择最适合的优化器。