14 深度学习与神经网络之神经元模型与激活函数
在深度学习与神经网络的基础上,我们需要进一步了解神经网络的基本构建块——神经元,以及如何通过激活函数引入非线性特性。这一部分将承接之前的内容,探讨神经元模型的组成及其重要性。
神经元模型
一个简单的神经元模型通常包含三个主要部分:输入、权重和偏置。神经元的工作可以通过以下步骤描述:
- 接收输入:神经元从上一层接收输入信号,通常用特征向量表示,比如 。
- 加权求和:每个输入对应一个权重,记作 。神经元的加权和可以表示为: 其中 是偏置,帮助神经元调整输出。
- 激活函数:计算出的加权和 会通过激活函数进行处理,从而生成神经元的输出。这个过程可以用公式表示为: 其中 是激活函数, 是神经元的输出。
示例
假设我们有三维输入向量 ,权重为 ,偏置为 。我们可以构造一个简单的神经元并计算其输出:
import numpy as np
# 输入
x = np.array([0.5, 0.3, 0.2])
# 权重
w = np.array([0.4, 0.6, 0.2])
# 偏置
b = 0.1
# 计算加权和
z = np.dot(w, x) + b
激活函数
激活函数的主要目的是引入非线性,使得神经网络能够学习复杂的模式。常见的激活函数有以下几种:
1. Sigmoid 函数
定义为:
特点:
- 输出范围在 (0, 1) 之间。
- 在大于 0 或小于 0 时梯度非常小,可能导致“梯度消失”。
2. Tanh 函数
定义为:
特点:
- 输出范围在 (-1, 1) 之间。
- 相比 Sigmoid 函数,Tanh 函数在原点附近更为平滑,通常表现更好。
3. ReLU 函数(修正线性单元)
定义为:
特点:
- 对于 输出 ,对于 输出 0。
- 可以有效缓解梯度消失问题。
- 可能出现 "Dying ReLU" 问题,即部分神经元永远不会被激活。
代码示例
下面的代码展示了如何计算不同激活函数的输出:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def tanh(z):
return np.tanh(z)
def relu(z):
return np.maximum(0, z)
# 计算激活函数输出
output_sigmoid = sigmoid(z)
output_tanh = tanh(z)
output_relu = relu(z)
print(f'Sigmoid output: {output_sigmoid}')
print(f'Tanh output: {output_tanh}')
print(f'ReLU output: {output_relu}')
小结
在这一部分,我们深入了解了神经元的基本模型,探索了其主要构件――输入、权重和偏置,以及激活函数在引入非线性方面的关键作用。正确选择激活函数对于提高神经网络的学习能力与性能至关重要,接下来我们将讨论 前向传播与反向传播 的过程,以进一步揭示神经网络的工作原理。
请继续关注下一篇文章,我们将探讨前向传播和反向传播的具体实现以及其在模型训练中的重要性。