前馈神经网络是一种基本的神经网络结构,其特点是信息仅在一个方向上流动,即从输入层到输出层,不涉及反馈回路。这种网络结构是深度学习领域中的基础,因其简单性和高效性而被广泛应用于各种机器学习任务中。本文将详细介绍前馈神经网络的工作原理、架构以及在Python中的实现方法。
神经网络是一种强大的函数映射工具,理论上能够估计任何复杂度的函数。在监督学习中,神经网络通过学习给定的X到指定的Y的映射函数,进而能够确定新X的适当Y。与传统的机器学习方法不同,神经网络引入了“归纳偏好”这一心理现象,即对X和Y之间关系的一些假设。例如,线性回归的归纳偏好是X和Y之间的线性关系,因此它将数据拟合到一条直线或超平面上。
当X和Y之间的关系是非线性且复杂的,线性回归方法可能难以预测Y。在这种情况下,可能需要一个曲线或多维曲线来近似这种关系。然而,根据函数的复杂性,可能需要手动设置每层神经元的数量和网络中的总层数,这通常通过试错方法和经验来完成。因此,这些参数被称为超参数。
在深入了解神经网络如何工作之前,重要的是要理解神经网络的基本组成单元——神经元。在人工神经元中,每个输入都会被分配一个权重。首先,输入会乘以其权重,然后加上一个偏置。之后,加权和会通过一个激活函数,这是一个非线性函数。
第一层是输入层,它看起来有六个神经元,但实际上只是输入到神经网络的数据。输出层是最后一层,其神经元的数量由数据集和挑战类型决定。隐藏层的神经元数量和隐藏层的数量则通过试错来确定。
前一层的所有输入都会连接到第一个隐藏层的第一个神经元。第一个隐藏层的第二个神经元会连接到前一层的所有输入,依此类推,直到第一个隐藏层的所有神经元。前一个隐藏层的输出被视为第二隐藏层神经元的输入,这些神经元都与前一层的所有神经元相连。
在其最基本的形式中,前馈神经网络是一个单层感知器。在这个模型中,一系列输入进入层,并与该层的权重相乘。加权输入值随后被汇总形成一个总数。如果值的总和超过一个预定的阈值(通常设置为零),输出值通常是1;如果总和小于阈值,输出值通常是-1。单层感知器是一个流行的前馈神经网络模型,经常用于分类。单层感知器也可以包含机器学习特征。
神经网络可以通过一个称为delta规则的特性,将其节点的输出与期望值进行比较,允许网络通过训练改变其权重以产生更准确的输出值。这种训练和学习过程导致梯度下降。在多层感知器中更新权重的技术几乎相同,但这个过程被称为反向传播。在这种情况下,最终层提供的输出值被用来改变网络中的每个隐藏层。
以下是使用Python实现前馈神经网络的示例代码。首先,创建应用于输入层、第一隐藏层和第二隐藏层的相应样本权重。
import numpy as np
from sklearn import datasets
# 生成数据集并绘制
np.random.seed(0)
X, y = datasets.make_moons(200, noise=0.20)
# 神经网络架构
# 输入层节点数 = 4
# 输出层节点数 = 3
# 隐藏层节点数 = 6
input_dim = 4 # 输入层维度
output_dim = 3 # 输出层维度
hidden_dim = 6 # 隐藏层维度
# 第一层的权重和偏置元素
W1 = np.random.randn(input_dim, hidden_dim)
b1 = np.zeros((1, hidden_dim))
# 第二层的权重和偏置元素
W2 = np.random.randn(hidden_dim, hidden_dim)
b2 = np.zeros((1, hidden_dim))
# 第三层的权重和偏置元素
W3 = np.random.randn(hidden_dim, output_dim)
b3 = np.zeros((1, output_dim))
# 前向传播输入信号到第一隐藏层的6个神经元
z1 = X.dot(W1) + b1
a1 = np.tanh(z1)
# 从第一隐藏层到第二隐藏层的激活信号的前向传播
z2 = a1.dot(W2) + b2
a2 = np.tanh(z2)
# 从第二隐藏层到输出层的激活信号的前向传播
z3 = a2.dot(W3) + b3
probs = np.exp(z3) / np.sum(np.exp(z3), axis=1, keepdims=True)
正如所看到的,网络中每个神经元的功能类似于线性回归。神经元在末端也有一个激活函数,并且每个神经元都有自己的权重向量。理论上,神经网络能够估计任何复杂或非线性的连续函数。
当两个或更多的线性对象(如线、平面或超平面)组合时,结果也是一个线性对象:线、平面或超平面。无论添加多少这些线性对象,最终结果仍然是一个线性对象。然而,当添加非线性对象时,情况并非如此。当两个独立的曲线组合时,结果可能是一个更复杂的曲线。
在每一层都引入了非线性,除了添加非线性对象或超曲线(如超平面)之外,还在使用这些激活函数。换句话说,正在对一个已经是非线性的对象应用非线性函数。
如果神经网络中没有使用激活函数会怎样?如果神经网络没有激活函数,它们将只是一个巨大的线性单元,可以被一个单一的线性回归模型轻易替代。