让我们将这些部分组合起来,展示一个基本的前馈神经网络。我们已经讨论了单个神经元、它们的参数(权重和偏置)、激活函数,以及它们如何组织成层。现在,设想我们想构建一个简单的网络,例如,基于两个输入特征来预测一个单一的输出值。考虑一个具有以下结构的网络:一个输入层,包含2个神经元,对应我们的两个输入特征($x_1, x_2$)。这一层不执行计算;它只是将输入值向前传递。一个隐藏层,包含3个神经元($h_1, h_2, h_3$)。每个隐藏神经元都接收来自输入层所有神经元的输入。一个输出层,包含1个神经元($o_1$)。这个神经元接收来自隐藏层所有神经元的输入,并产生最终预测值($\hat{y}$)。这被称为“前馈”网络,因为信息严格地沿一个方向流动:从输入层到隐藏层再到输出层,没有回环。信息传播方式如下:输入到隐藏层:每个输入特征($x_1, x_2$)都连接到每个隐藏神经元($h_1, h_2, h_3$)。对于第一个隐藏神经元($h_1$),输入信号与相应的权重相乘(例如,从 $x_1 \to h_1$ 的 $w_{11}$,从 $x_2 \to h_1$ 的 $w_{21}$)。计算加权和($z_{h1}$):$z_{h1} = (x_1 \times w_{11}) + (x_2 \times w_{21}) + b_{h1}$,其中 $b_{h1}$ 是神经元 $h_1$ 的偏置。将激活函数 $f$(如ReLU或Sigmoid)应用于此和,得到神经元的输出:$a_{h1} = f(z_{h1})$。类似的计算($z = \sum(weight \times input) + bias$,随后是 $a = f(z)$)独立地对其他隐藏神经元($h_2, h_3$)进行,每个都使用自己的一组权重和偏置。隐藏到输出层:隐藏层神经元的输出($a_{h1}, a_{h2}, a_{h3}$)成为输出层的输入。每个隐藏神经元输出都连接到输出神经元($o_1$)。对于输出神经元($o_1$),使用隐藏层激活值和一组新权重(例如,从 $a_{h1} \to o_1$ 的 $w_{h1, o1}$ 等)以及它自己的偏置($b_{o1}$)来计算加权和($z_{o1}$):$z_{o1} = (a_{h1} \times w_{h1, o1}) + (a_{h2} \times w_{h2, o1}) + (a_{h3} \times w_{h3, o1}) + b_{o1}$。将最终激活函数 $g$(可能与隐藏层的激活函数不同,取决于任务)应用于此和,以获得网络的预测值:$\hat{y} = a_{o1} = g(z_{o1})$。整个过程,从输入初始值 $x_1, x_2$ 到获得最终输出 $\hat{y}$,称为前向传播,我们将在后续内容中进行详细讲解。下面的图表呈现了这种简单的网络结构。digraph G { rankdir=LR; splines=line; node [shape=circle, style=filled, margin=0.1]; subgraph cluster_0 { label = "输入层"; bgcolor="#e9ecef"; node [fillcolor="#74c0fc"]; x1 [label="x₁"]; x2 [label="x₂"]; style=rounded; } subgraph cluster_1 { label = "隐藏层"; bgcolor="#e9ecef"; node [fillcolor="#96f2d7"]; h1 [label="h₁"]; h2 [label="h₂"]; h3 [label="h₃"]; style=rounded; } subgraph cluster_2 { label = "输出层"; bgcolor="#e9ecef"; node [fillcolor="#ffc9c9"]; o1 [label="o₁"]; style=rounded; } edge [color="#adb5bd"]; x1 -> h1; x1 -> h2; x1 -> h3; x2 -> h1; x2 -> h2; x2 -> h3; h1 -> o1; h2 -> o1; h3 -> o1; # 用于对齐的隐形节点 {rank=same; x1; x2;} {rank=same; h1; h2; h3;} {rank=same; o1;} }一个简单的前馈神经网络,包含2个输入神经元、1个由3个神经元组成的隐藏层和1个输出神经元。箭头表示前向传播过程中信息流的方向。每个连接代表一个权重,隐藏层和输出层中的每个神经元都有一个相关的偏置(未明确画出)。"本示例体现了基本架构。网络可以有更多的层(使其“更深”)和每层更多的神经元,但加权和、激活函数以及分层连接的基本原理保持不变。层的具体数量、神经元的数量以及激活函数的选择,都是解决问题时需要作出的设计考量。在后续章节中,我们将学习如何高效地执行这些计算,以及网络如何找到其权重和偏置的合适值。"