神经网络的基本结构
在人工智能的浪潮中,深度学习无疑是其中最耀眼的明星,而构成深度学习核心的,正是神经网络。它模仿人脑神经元的工作方式,通过层层连接与计算,赋予了机器学习和认知的能力。
对于初学者而言,理解神经网络的基本结构,是打开深度学习大门的第一把钥匙。
本文将带你从零开始,一步步拆解神经网络的构成,并用生动的比喻和清晰的代码,让你彻底掌握其工作原理。
神经网络是什么?一个生动的比喻
想象一下,你正在教一个从未见过猫和狗的小朋友区分它们,你会怎么做?
你可能会先给他看很多猫和狗的图片。
你会指出特征:看,猫的耳朵通常是尖的,脸比较圆;狗的耳朵可能下垂,脸型更长。
小朋友的大脑(神经网络)会接收这些图片(输入数据)和你的指导(标签)。
他大脑中的神经元会开始工作,尝试找出区分猫和狗的关键模式(如耳朵形状、脸型)。
经过多次纠正和学习,他大脑中形成了一个判断模型。下次再看到新动物图片时,他就能自信地说出这是猫或这是狗。
神经网络就是这个小朋友的大脑的简化数学模型, 它是一个由大量人工神经元相互连接构成的网络系统,能够从输入数据中自动学习特征和模式,并用于预测或决策。
神经网络的基本组成单元:神经元
神经元是神经网络最基本的计算单元,它模拟了生物神经元接收信号-处理信号-传递信号的过程。
一个神经元的工作流程
一个典型的人工神经元主要做三件事:
实例
代码块
Python
# 这是一个神经元计算的伪代码逻辑,帮助你理解过程
def artificial_neuron(inputs, weights, bias):
"""
模拟一个人工神经元的计算过程。
参数:
inputs: 输入信号列表,例如 [x1, x2, x3]
weights: 对应每个输入的权重列表,例如 [w1, w2, w3]
bias: 偏置项,一个常数
返回:
output: 神经元的输出
"""
# 1. 加权求和:将每个输入乘以其对应的权重,然后加上偏置
weighted_sum = 0
for i in range(len(inputs)):
weighted_sum += inputs[i] * weights[i]
weighted_sum += bias
# 2. 激活函数处理:通过一个非线性函数,决定是否"激活"并输出信号
让我们用一张图和一个表格来更直观地理解:

神经元各部件功能详解:
#klZhIqtZelkd text { white-space: pre; }#klZhIqtZelkd .fb0 { stroke: var(--N900-FG, 0.15); }#klZhIqtZelkd .fb0 {stroke: rgba(31,35,41, 0.15)}#klZhIqtZelkd .fx0 { stroke-miterlimit: 10; }#klZhIqtZelkd .fx0 {stroke-miterlimit: 10}#klZhIqtZelkd .fa1 { fill: rgb(187, 191, 196); }#klZhIqtZelkd .fa1 {fill: rgb(187, 191, 196)}#klZhIqtZelkd .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx1 {font-style: normal}#klZhIqtZelkd .fx2 { text-anchor: middle; }#klZhIqtZelkd .fx2 {text-anchor: middle}#klZhIqtZelkd .fx3 { dominant-baseline: central; }#klZhIqtZelkd .fx3 {dominant-baseline: central}#klZhIqtZelkd .fx4 { stroke: none; }#klZhIqtZelkd .fx4 {stroke: none}#klZhIqtZelkd .fc0 { fill: var(--text-caption); }#klZhIqtZelkd .fc0 {fill: #646a73}#klZhIqtZelkd .fa2 { fill: var(--text-link-disabled); }#klZhIqtZelkd .fa2 {fill: rgb(187, 191, 196)}#klZhIqtZelkd .fa3 { fill: rgb(59, 58, 56); }#klZhIqtZelkd .fa3 {fill: rgb(59, 58, 56)}#klZhIqtZelkd .fx5 { font: 700 14px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx5 {font-style: normal}#klZhIqtZelkd .fx6 { text-anchor: start; }#klZhIqtZelkd .fx6 {text-anchor: start}#klZhIqtZelkd .fx7 { dominant-baseline: alphabetic; }#klZhIqtZelkd .fx7 {dominant-baseline: alphabetic}#klZhIqtZelkd .fc1 { fill: rgb(255, 255, 255); }#klZhIqtZelkd .fc1 {fill: rgb(255, 255, 255)}#klZhIqtZelkd .fc2 { fill: rgb(51, 51, 51); }#klZhIqtZelkd .fc2 {fill: rgb(51, 51, 51)}#klZhIqtZelkd .fx8 { font: 400 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx8 {font-style: normal}#klZhIqtZelkd .fx9 { font: italic 400 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx9 {font-style: italic}#klZhIqtZelkd .fx10 { font: 400 14px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx10 {font-style: normal}#klZhIqtZelkd .fx11 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx11 {font-style: normal}#klZhIqtZelkd .fx12 { font: 400 11px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx12 {font-style: normal}#klZhIqtZelkd .fx13 { font: italic 400 11px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#klZhIqtZelkd .fx13 {font-style: italic}#klZhIqtZelkd .fb1 { fill: var(--N900-FG, 0.15); }#klZhIqtZelkd .fb1 {fill: rgba(31,35,41, 0.15)}#klZhIqtZelkd .fb2 { fill: rgb(212, 212, 212); }#klZhIqtZelkd .fb2 {fill: rgb(212, 212, 212)}#klZhIqtZelkd .fb3 { fill: rgb(232, 234, 246); }#klZhIqtZelkd .fb3 {fill: rgb(232, 234, 246)}#klZhIqtZelkd .fa4 { fill: var(--bg-body); }#klZhIqtZelkd .fa4 {fill: #fff}ABCD123456部件类比数学表达作用输入 权重 偏置 加权和 激活函数 学习的过程就是不断调整这些权重的过程。非线性xwbzfx,x,...,x,,...,w,w,...,w,,...,bz=(xw+xw+...+xw)+b=(++...+)+a=f(z)=()xwbzfxxxwwwbzxwxwxwbafz来自其他神经元的信号信号的重要性神经元的激活阈值信号总强度开关与加工器接收外部信息或上一层神经元的输出。决定每个输入对神经元输出的影响程度。一个常数,用于调整神经元激活的难易程度。可以理解为让加权和整体上下移动。对所有输入信号进行综合。引入。如果没有它,多层网络将退化为单层网络,无法学习复杂模式。12n12n1122nn12121122nnnn
常见的激活函数
激活函数为神经网络带来了非线性能力。以下是三个最常用的:
Sigmoid
◦
公式:
ReLU (整流线性单元)
◦
公式:
◦
特点:计算简单,能有效缓解梯度消失问题,是目前最常用的隐藏层激活函数。
◦
图像:在原点处转折的折线,负数输出 0,正数原样输出。
Softmax
◦
公式:
神经网络的层级结构
单个神经元能力有限,就像单个脑细胞无法思考一样。当我们将大量神经元按层组织起来,就形成了强大的神经网络。一个典型的神经网络包含以下三层:
输入层
•
角色:网络的感官,负责接收原始数据。
•
特点:该层的神经元数量通常等于输入数据的特征数。例如,一张28x28像素的灰度图展平后就是784个特征,对应784个输入神经元。输入层不做任何计算,只是传递数据。
隐藏层
角色:网络的大脑,负责进行复杂的特征提取和转换。
特点:
•
介于输入层和输出层之间,可以有一层或多层(深度学习就源于此)。
•
每一层的神经元都接收前一层所有神经元的输出作为输入,并计算自己的输出传递给下一层(这称为全连接)。
•
隐藏层中的神经元使用如 ReLU 等激活函数,引入非线性。
输出层
•
回归(预测一个连续值):1个神经元(通常不用激活函数)。
角色:网络的决策者,输出最终的预测结果。
特点:神经元数量由任务决定。
•
二分类:1个神经元(用Sigmoid)或2个神经元(用Softmax)。
•
多分类(K类):K个神经元(用Softmax)。
实战:用 Python 构建一个神经网络
理论说得再多,不如动手实践。下面我们用 NumPy 库从零开始构建一个最简单的三层神经网络(1个隐藏层),并进行一次前向传播计算。
实例
代码块
Python
import numpy as np
# 定义激活函数
def sigmoid(x):
"""Sigmoid 激活函数"""
return 1 / (1 + np.exp(-x))
def relu(x):
代码解读与输出分析:
初始化:我们创建了一个 2-3-1 结构的网络。W1 是一个 3x2 的矩阵,表示2个输入到3个隐藏神经元的连接权重。
前向传播:
•
输入 [1.5, -0.5] 首先与 W1 相乘并加上 b1,得到隐藏层的加权和 Z1。
•
Z1 经过 ReLU 函数,得到隐藏层的激活值 A1。
•
A1 再与 W2 相乘并加上 b2,得到输出层的加权和 Z2。
•
Z2 最后经过 Sigmoid 函数,压缩到(0,1)之间,作为最终的预测概率 A2。
输出:由于权重是随机初始化的,这个未经训练的网络的预测输出 A2 也是一个随机值(接近0.5)。训练神经网络的目的,就是通过大量数据,反复调整 W1, b1, W2, b2,使得 A2 对于不同输入能产生有意义的预测。
核心概念总结与学习路径
通过本文,你已经掌握了神经网络的基石:
你的学习下一步:
损失函数:如何量化网络预测的好坏(如均方误差、交叉熵损失)?
反向传播与梯度下降:神经网络如何根据"坏"的程度,自动调整权重和偏置(这是学习的本质)?
使用框架实战:用 TensorFlow 或 PyTorch 等现代框架,可以轻松构建和训练更复杂的网络,无需从零开始写 NumPy 代码。
理解基本结构后,你将发现所有复杂的深度学习模型(如CNN用于图像,RNN用于语音)都是在这个基础结构上,通过改变神经元的连接方式和层级功能演变而来的。现在,你已经拥有了继续探索深度学习广阔世界的地图。