前馈神经网络详解

前馈神经网络是一种基本的神经网络结构,其特点是信息仅在一个方向上流动,即从输入层到输出层,不涉及反馈回路。这种网络结构是深度学习领域中的基础,因其简单性和高效性而被广泛应用于各种机器学习任务中。本文将详细介绍前馈神经网络的工作原理、架构以及在Python中的实现方法。

为什么使用神经网络

神经网络是一种强大的函数映射工具,理论上能够估计任何复杂度的函数。在监督学习中,神经网络通过学习给定的X到指定的Y的映射函数,进而能够确定新X的适当Y。与传统的机器学习方法不同,神经网络引入了“归纳偏好”这一心理现象,即对X和Y之间关系的一些假设。例如,线性回归的归纳偏好是X和Y之间的线性关系,因此它将数据拟合到一条直线或超平面上。

当X和Y之间的关系是非线性且复杂的,线性回归方法可能难以预测Y。在这种情况下,可能需要一个曲线或多维曲线来近似这种关系。然而,根据函数的复杂性,可能需要手动设置每层神经元的数量和网络中的总层数,这通常通过试错方法和经验来完成。因此,这些参数被称为超参数。

神经网络架构与操作

在深入了解神经网络如何工作之前,重要的是要理解神经网络的基本组成单元——神经元。在人工神经元中,每个输入都会被分配一个权重。首先,输入会乘以其权重,然后加上一个偏置。之后,加权和会通过一个激活函数,这是一个非线性函数。

第一层是输入层,它看起来有六个神经元,但实际上只是输入到神经网络的数据。输出层是最后一层,其神经元的数量由数据集和挑战类型决定。隐藏层的神经元数量和隐藏层的数量则通过试错来确定。

前一层的所有输入都会连接到第一个隐藏层的第一个神经元。第一个隐藏层的第二个神经元会连接到前一层的所有输入,依此类推,直到第一个隐藏层的所有神经元。前一个隐藏层的输出被视为第二隐藏层神经元的输入,这些神经元都与前一层的所有神经元相连。

前馈神经网络及其工作原理

在其最基本的形式中,前馈神经网络是一个单层感知器。在这个模型中,一系列输入进入层,并与该层的权重相乘。加权输入值随后被汇总形成一个总数。如果值的总和超过一个预定的阈值(通常设置为零),输出值通常是1;如果总和小于阈值,输出值通常是-1。单层感知器是一个流行的前馈神经网络模型,经常用于分类。单层感知器也可以包含机器学习特征。

神经网络可以通过一个称为delta规则的特性,将其节点的输出与期望值进行比较,允许网络通过训练改变其权重以产生更准确的输出值。这种训练和学习过程导致梯度下降。在多层感知器中更新权重的技术几乎相同,但这个过程被称为反向传播。在这种情况下,最终层提供的输出值被用来改变网络中的每个隐藏层。

Python实现

以下是使用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)

为什么这种策略有效

正如所看到的,网络中每个神经元的功能类似于线性回归。神经元在末端也有一个激活函数,并且每个神经元都有自己的权重向量。理论上,神经网络能够估计任何复杂或非线性的连续函数。

非线性的重要性

当两个或更多的线性对象(如线、平面或超平面)组合时,结果也是一个线性对象:线、平面或超平面。无论添加多少这些线性对象,最终结果仍然是一个线性对象。然而,当添加非线性对象时,情况并非如此。当两个独立的曲线组合时,结果可能是一个更复杂的曲线。

在每一层都引入了非线性,除了添加非线性对象或超曲线(如超平面)之外,还在使用这些激活函数。换句话说,正在对一个已经是非线性的对象应用非线性函数。

如果神经网络中没有使用激活函数会怎样?如果神经网络没有激活函数,它们将只是一个巨大的线性单元,可以被一个单一的线性回归模型轻易替代。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485