当前位置: 首页 > article >正文

神经网络入门:生动解读机器学习的“神经元”

神经网络作为机器学习中的核心算法之一,其灵感来源于生物神经系统。在本文中,我们将带领大家手把手学习神经网络的基本原理、结构和训练过程,并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者,这篇文章都将帮助你轻松入门!

你是否曾好奇,那些看似智能的AI是如何“思考”和“学习”的?比如,它们如何识别图片中的猫咪,如何听懂你说的话,又如何下出让你惊叹的棋局?在众多AI背后的“大脑”中,有一种非常重要且强大的算法——神经网络。

别听到“神经”两个字就觉得高深莫测!今天,我们就用最简单有趣的方式,一层层揭开神经网络的神秘面纱,让你也能轻松入门,甚至亲手搭建自己的第一个神经网络!


一、 什么是神经网络?

想象一下我们的大脑。里面布满了数以亿计的神经元,它们相互连接,传递着各种信息,让我们能够思考、学习和感知世界。神经网络的灵感正是来源于此。 

神经网络模拟人脑神经元之间的连接方式,由大量的人工神经元(也称节点或单元)按层次结构组成。每个神经元会接收输入,经过加权求和和激活函数的处理后,将信号传递到下一层。整个网络由输入层、隐藏层和输出层构成,每一层都有特定的功能:

  • 输入层:负责接收数据。

  • 隐藏层:执行大量的非线性变换,是模型表达能力的关键。

  • 输出层:输出最终预测结果。

这种层层传递、不断调整权重的过程就是神经网络“学习”的过程。

🌰 生活中的神经网络

  • 图像识别:帮你从相册中找出所有猫的照片
  • 语音助手:听懂你的 "豆包,今天天气如何?"
  • 自动驾驶:识别交通标志和行人

二、 神经网络的基本结构

2.1 神经元模型

让我们先来认识一下神经网络中最基本的单元——人工神经元。一个人工神经元通常包含以下几个部分:

  • 输入 (Inputs): 神经元接收到的信息。可以是一个或多个数值。想象一下,你正在判断一个水果是不是苹果,颜色、形状、大小、气味等都是输入的信息。

  • 权重 (Weights): 每个输入都带有一个权重,表示该输入对神经元输出的重要性。比如,颜色和形状可能比气味在判断苹果时更重要,所以它们的权重会更高。

  • 求和 (Summation): 神经元将所有输入与它们对应的权重相乘后求和。这个过程相当于对各种输入信息进行加权汇总。

  • 偏置 (Bias,可选): 一个额外的常数项,可以调整神经元的激活阈值。相当于给神经元一个“预启动”或者“延迟启动”的倾向。

  • 激活函数 (Activation Function): 求和后的结果会通过一个激活函数,决定神经元是否“激活”并输出。激活函数引入了非线性,这使得神经网络能够学习复杂的模式。常见的激活函数有Sigmoid、ReLU等,我们稍后会详细介绍。

  • 输出 (Output): 神经元处理后的结果,可以传递给下一个神经元。

你可以把一个神经元想象成一个小型的信息处理中心:接收信息(带权重的)、汇总信息、然后根据一定的规则(激活函数)决定是否发出信号。

2.2 神经网络的结构:层层递进的信息处理

多个相互连接的神经元就组成了神经网络。一个典型的神经网络通常由以下几层组成:

  • 输入层 (Input Layer): 接收原始数据的输入。每个输入特征通常对应一个输入神经元。例如,如果我们要识别一张28x28像素的手写数字图片,那么输入层就会有784个神经元(28 * 28)。

  • 隐藏层 (Hidden Layer): 位于输入层和输出层之间。可以有一个或多个隐藏层。隐藏层中的神经元会从上一层接收信息,进行处理,并将结果传递给下一层。隐藏层是神经网络学习复杂特征的关键。

  • 输出层 (Output Layer): 输出最终结果。输出层神经元的数量取决于要解决的问题。例如,如果我们要进行10个数字的分类,输出层通常会有10个神经元,每个神经元代表一个数字的概率。

 

信息在神经网络中是单向流动的,通常从输入层开始,经过一个或多个隐藏层,最终到达输出层。每一层都对输入信息进行某种形式的变换和提取。


三、神经网络是如何学习的?—— “反向传播”的魔法

神经网络之所以强大,在于它能够通过学习数据来自动优化自身的参数(主要是神经元之间的连接权重和偏置),从而完成特定的任务。那么,它是如何学习的呢?这就要提到神经网络的核心学习算法——反向传播 (Backpropagation)

3.1 前向传播:计算预测结果

首先,当一条数据输入到神经网络时,信息会从输入层开始,逐层向前传递,直到输出层,最终得到一个预测结果。这个过程被称为前向传播 (Forward Propagation)

在每一层中,每个神经元都会接收来自上一层神经元的输出,乘以各自的权重,加上偏置,然后通过激活函数计算出自己的输出,并传递给下一层。

3.2 损失函数:衡量预测的“好坏”

得到预测结果后,我们需要知道这个结果与真实的标签(我们期望的答案)之间的差距有多大。损失函数 (Loss Function) 就是用来衡量这个差距的。损失函数的输出值越小,表示神经网络的预测越准确。

常见的损失函数有均方误差 (Mean Squared Error, MSE) 和交叉熵损失 (Cross-Entropy Loss) 等,具体选择取决于我们要解决的问题类型。

3.3 反向传播:调整神经网络的“大脑”

关键的一步来了!如果我们的预测结果不够好(损失函数的值很大),神经网络就需要调整它的参数(权重和偏置)来减小这个误差。反向传播就是用来高效地计算出每个参数应该如何调整的

反向传播的原理基于微积分中的链式法则。它从输出层开始,计算损失函数对输出层每个神经元输出的梯度(即变化率),然后逐层向后传播这些梯度。通过梯度信息,我们可以知道稍微调整哪个权重或偏置,能够对减小损失函数的影响最大。

3.4 梯度下降:寻找最优参数

有了梯度信息,我们就可以使用梯度下降 (Gradient Descent) 等优化算法来更新神经网络的参数。梯度指向的是损失函数增长最快的方向,所以我们沿着梯度的相反方向调整参数,就能使损失函数的值逐渐减小,直到找到一个“谷底”,即损失函数最小的点,这时候神经网络的性能也达到了最优。

你可以把梯度下降想象成一个在山谷中寻找最低点的盲人。他会不断地沿着感觉上坡度最大的反方向走一步,直到走到一个四周都是上坡的地方。

这个不断进行前向传播计算预测、计算损失、反向传播计算梯度、梯度下降更新参数的过程,就是神经网络学习的核心循环。


四、激活函数:为神经网络注入非线性

前面我们提到了激活函数,它是神经网络中非常重要的组成部分,赋予了神经网络学习复杂模式的能力。如果没有激活函数,无论神经网络有多少层,它都只能进行线性变换,无法解决非线性问题。

常见的激活函数有:

  • Sigmoid 函数: 将输入值压缩到0和1之间。常用于二分类问题的输出层,可以表示概率。但容易出现梯度消失问题(在输入值非常大或非常小时,梯度接近于0,导致参数更新缓慢)。

  • Tanh 函数 (Hyperbolic Tangent): 将输入值压缩到-1和1之间。与Sigmoid类似,但也存在梯度消失问题。

  • ReLU 函数 (Rectified Linear Unit): 当输入大于0时,输出等于输入;当输入小于等于0时,输出为0。ReLU简单高效,是目前最常用的激活函数之一,能够有效缓解梯度消失问题。但也可能出现“死亡ReLU”问题(当神经元的输入总是负数时,输出始终为0,导致该神经元不再学习)。

  • Softmax 函数: 通常用于多分类问题的输出层。它将每个类别的原始输出转换为概率分布,所有类别的概率之和为1。

选择合适的激活函数对于神经网络的性能至关重要,需要根据具体的问题和网络结构进行考虑。

五、简单神经网络结构图

图中左侧为输入层(三个节点分别代表输入变量 x1、x2 和 x3),中间为隐藏层(四个节点 h1~h4),右侧为输出层(单个节点 y)。

节点间用灰色线条连接,表示神经元之间的全连接关系。 


六、Python 实战案例:构建一个简单的神经网络

接下来,我们通过一个简单案例来手把手构建一个具有单隐藏层的神经网络,用于解决二分类问题。为了便于理解,我们使用 NumPy 实现前向传播与反向传播的基本算法。

6.1 案例目标

假设我们有一个简单的数据集,每个样本有两个特征,通过神经网络学习后预测输出(0 或 1)。

6.2 Python 代码详解

下面代码包括以下部分:

  • 数据生成:生成一些随机样本数据。

  • 网络结构定义:初始化权重和偏置。

  • 前向传播:计算隐藏层和输出层的激活值。

  • 损失计算:使用均方误差(MSE)。

  • 反向传播:根据误差调整权重。

  • 训练循环:多次迭代更新参数。

import numpy as np# 设置随机种子,保证结果可重复
np.random.seed(42)# 1. 生成数据:简单的二分类数据
# 输入数据:100个样本,每个样本2个特征
X = np.random.randn(100, 2)
# 目标:根据简单规则生成标签(例如:如果两个特征之和大于0,则为1,否则为0)
y = (np.sum(X, axis=1) > 0).astype(np.float32).reshape(-1, 1)# 2. 定义网络参数
input_dim = 2   # 输入特征数
hidden_dim = 4  # 隐藏层神经元个数
output_dim = 1  # 输出层(1个节点)# 初始化权重和偏置
W1 = np.random.randn(input_dim, hidden_dim)  # 输入到隐藏层权重
b1 = np.zeros((1, hidden_dim))
W2 = np.random.randn(hidden_dim, output_dim)  # 隐藏层到输出层权重
b2 = np.zeros((1, output_dim))# 定义激活函数:ReLU 和 Sigmoid
def relu(x):return np.maximum(0, x)def relu_derivative(x):return (x > 0).astype(np.float32)def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):s = sigmoid(x)return s * (1 - s)# 学习率
learning_rate = 0.01# 训练次数
epochs = 10000# 训练循环
for epoch in range(epochs):# 前向传播z1 = np.dot(X, W1) + b1        # 隐藏层加权和a1 = relu(z1)                  # 隐藏层激活z2 = np.dot(a1, W2) + b2       # 输出层加权和a2 = sigmoid(z2)               # 输出层激活(预测值)# 计算损失(均方误差)loss = np.mean((a2 - y) ** 2)# 反向传播# 输出层梯度d_loss_a2 = 2 * (a2 - y) / y.size  # 均方误差对输出的导数d_a2_z2 = sigmoid_derivative(z2)dz2 = d_loss_a2 * d_a2_z2          # 输出层加权和的梯度# 隐藏层梯度dW2 = np.dot(a1.T, dz2)db2 = np.sum(dz2, axis=0, keepdims=True)da1 = np.dot(dz2, W2.T)dz1 = da1 * relu_derivative(z1)dW1 = np.dot(X.T, dz1)db1 = np.sum(dz1, axis=0, keepdims=True)# 更新权重和偏置W2 -= learning_rate * dW2b2 -= learning_rate * db2W1 -= learning_rate * dW1b1 -= learning_rate * db1# 每1000次输出一次损失if epoch % 1000 == 0:print(f"Epoch {epoch}, Loss: {loss:.4f}")# 训练完成后对训练数据进行预测
predictions = (a2 > 0.5).astype(np.int32)
accuracy = np.mean(predictions == y)
print(f"Training Accuracy: {accuracy * 100:.2f}%")

 

代码讲解

  1. 数据生成:我们随机生成 100 个样本,每个样本有 2 个特征,并通过简单规则(两个特征和大于 0 则标记为 1)生成标签。

  2. 网络初始化:设置输入层、隐藏层、输出层的维度,随机初始化权重,偏置初始化为 0。

  3. 激活函数:使用 ReLU 作为隐藏层激活函数,Sigmoid 作为输出层激活函数。

  4. 前向传播:计算每一层的加权和与激活值,得到预测输出。

  5. 反向传播:计算输出与实际标签之间的误差,再通过链式法则求出各层梯度,更新权重和偏置。

  6. 训练循环:重复迭代更新参数,每隔一段时间输出一次当前的损失。最终,根据预测结果计算训练准确率。

 


七、 总结

本文详细介绍了神经网络的基本原理和结构,从神经元模型、激活函数、前向传播到反向传播的全过程,并通过 SVG 图展示了网络的层级结构。最后,我们使用 Python 和 NumPy 从零实现了一个简单的神经网络案例,带你一步步体验了模型训练的过程。

通过本文的学习,相信你对神经网络有了更深入的理解。接下来,可以尝试扩展网络结构、改进激活函数或使用其他优化算法,进一步探索深度学习的无限可能!

 

相关文章:

神经网络入门:生动解读机器学习的“神经元”

神经网络作为机器学习中的核心算法之一,其灵感来源于生物神经系统。在本文中,我们将带领大家手把手学习神经网络的基本原理、结构和训练过程,并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者&#xf…...

web漏洞靶场学习分享

靶场:pikachu靶场 pikachu漏洞靶场漏洞类型: Burt Force(暴力破解漏洞)XSS(跨站脚本漏洞)CSRF(跨站请求伪造)SQL-Inject(SQL注入漏洞)RCE(远程命令/代码执行)Files Inclusion(文件包含漏洞)Unsafe file downloads(不安全的文件下载)Unsafe file uploads(不安全的文…...

vue watch和 watchEffect

在 Vue 3 中,watch 和 watchEffect 是两个用于响应式地监听数据变化并执行副作用的 API。它们在功能上有一些相似之处,但用途和行为有所不同。以下是对 watch 和 watchEffect 的详细对比和解释: 1. watch watch 是一个更通用的 API&#xf…...

函数和模式化——python

一、模块和包 将一段代码保存为应该扩展名为.py 的文件,该文件就是模块。Python中的模块分为三种,分别为:内置模块、第三方模块和自定义模块。 内置模块和第三方模块又称为库内置模块,有 python 解释器自带,不用单独安…...

Python解决“数字插入”问题

Python解决“数字插入”问题 问题描述测试样例解题思路代码 问题描述 小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。 你…...

Go语言的嵌入式网络

Go语言的嵌入式网络 引言 在当今快速发展的互联网时代,嵌入式系统和网络技术的结合变得越来越普遍。嵌入式系统是指嵌入到设备中以实现特定功能的计算机系统,它们通常具有资源有限的特点。随着物联网(IoT)的兴起,嵌入…...

Dart 语法

1. 级联操作符 … var paint Paint()..color Colors.black..strokeCap StrokeCap.round..strokeWidth 5.0;2. firstWhereOrNull 3. 隐藏或导入部分组件 // Import only foo. import package:lib1/lib1.dart show foo;// Import all names EXCEPT foo. import package:lib…...

MCP over MQTT:EMQX 开启物联网 Agentic 时代

前言 随着 DeepSeek 等大语言模型(LLM)的广泛应用,如何找到合适的场景,并基于这些大模型构建服务于各行各业的智能体成为关键课题。在社区中,支持智能体开发的基础设施和工具层出不穷,其中,Ant…...

ACM代码模式笔记

系列博客目录 文章目录 系列博客目录1.换行符 1.换行符 nextInt()、nextDouble() 等不会消耗换行符: 当使用 nextInt() 或 nextDouble() 读取数字时,它只读取数字部分,不会消耗掉输入后的换行符。 nextLine() 会读取并消耗换行符&#xff1a…...

相干光信号处理的一些基础知识

1. 逆琼斯矩阵问题 逆琼斯矩阵方法常用于逆向补偿由光学系统或传输信道(如光纤)引入的偏振态(SOP, State of Polarization)畸变。 1.1 琼斯向量 任意偏振光可用二维复数向量表示: E [ E x E y ] [ ∣ E x ∣ e i…...

WiFi加密协议

目录 1. 认证(Authentication)‌ ‌1.1 开放系统认证(Open System Authentication)‌ 1.2 共享密钥认证(Shared Key Authentication)‌ ‌1.3 802.1X/EAP认证(企业级认证)‌ ‌2. 关联(Association)‌ ‌3. 加密协议(Security Handshake)‌ ‌整体流程总结‌…...

程序化广告行业(61/89):DSP系统活动设置深度剖析

程序化广告行业(61/89):DSP系统活动设置深度剖析 大家好!在程序化广告的学习道路上,我们已经探索了不少重要内容。今天依旧本着和大家一起学习进步的想法,深入解析DSP系统中活动设置的相关知识。这部分内容…...

[王阳明代数讲义]具身智能才气等级分评价排位系统领域投射模型讲义

具身智能才气等级分评价排位系统领域投射模型讲义 具身智能胆识曲线调查琴语言的行为主义特性与模式匹配琴语言的"气质邻域 "与气度,云藏山鹰符号约定 琴语言的"气质邻域 "与气度,一尚韬竹符号约定 琴语言的"气质邻域 "与…...

【Block总结】PlainUSR的局部注意力,即插即用|ACCV2024

论文信息 标题: PlainUSR: Chasing Faster ConvNet for Efficient Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguang Liu发表时间: 2024年会议/期刊: 亚洲计算机视觉会议(ACCV 2024)研究背景: 超分辨率(Super-Resolution, S…...

Kubernetes集群管理详解:从入门到精通

1. 引言 Kubernetes(简称k8s)作为当今最流行的容器编排平台,已成为云原生应用部署和管理的事实标准。本文将深入探讨k8s集群管理的各个方面,为运维工程师和开发人员提供一个全面的指南。 2. Kubernetes架构概览 在深入具体的管理任务之前,让我们先回顾一下Kubernetes的基本架…...

Git 换行符警告(LF replaced by CRLF)的解决方案

根据你的日志和知识库中的信息,以下是针对 Git 换行符警告(LF replaced by CRLF) 的解决方案: 一、问题分析 警告原因 你当前在 Windows 系统 上工作,但某些文件(如 .gitignore, README.md, package.json 等…...

【C++】从零实现Json-Rpc框架(2)

目录 JsonCpp库 1.1- Json数据格式 1.2 - JsonCpp介绍 • 序列化接口 • 反序列化接口 1.3 - Json序列化实践 JsonCpp使用 Muduo库 2.1 - Muduo库是什么 2.2 - Muduo库常见接口介绍 TcpServer类基础介绍 EventLoop类基础介绍 TcpConnection类基础介绍 TcpClient…...

蓝桥云客--回文数组

0回文数组 - 蓝桥云课 问题描述 小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai​,他觉得随机生成的数组不太美观,想把它变成回文数组,也就是对于任意 i∈[1,n] 满足 ai​an−i1​。小蓝一次操作可以指…...

FastAPI依赖注入:链式调用与多级参数传递

title: FastAPI依赖注入:链式调用与多级参数传递 date: 2025/04/05 18:43:12 updated: 2025/04/05 18:43:12 author: cmdragon excerpt: FastAPI的依赖注入系统通过链式调用和多级参数传递实现组件间的解耦和复用。核心特性包括解耦性、可复用性、可测试性和声明式依赖解析…...

【STM32单片机】#5 定时中断

主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...

OrbStack 作为 Mac 用户的 Docker 替代方案

推荐使用 OrbStack 作为 Mac 用户的 Docker 替代方案 在现代开发环境中,容器化技术已经成为了软件开发的重要组成部分。对于 Mac 用户来说,Docker Desktop 是一个广泛使用的工具,但它并不是唯一的选择。本文将推荐 OrbStack 作为 Docker Desktop 的替代方案,并探讨其优势。…...

运行小程序报错

[ app.json 文件内容错误] app.json: ["tabBar"]["list"] 不能超过 5 项(env: Windows,mp,1.06.2206090; lib: 3.7.12) 他的意思大概是,微信小程序 app.json 文件中的 tabBar.list 配置项超过了 5 项。这是微信小程序的限制,tabBar…...

Nature Electronics|一种透气、可拉伸的液态金属基3D电子皮肤系统(健康监测/可穿戴电子/透汗透气性电子/电子皮肤/柔性电子/集成电路)

一、 摘要 穿戴式和皮肤电子设备的发展要求高密度可伸展电子系统能够与软组织共形,持续运行并提供长期的生物相容性。大多数可拉伸电子系统的集成密度低,并且与外部印刷电路板连接,这限制了功能,降低了用户体验并阻碍了长期可用性。在此,作者提出了一种可渗透的三维集成电…...

深入剖析丝杆升降机工作原理,解锁工业传动奥秘

丝杆升降机,在工业设备的大舞台上扮演着不可或缺的角色,被广泛应用于机械制造、自动化生产线、建筑施工等众多领域。它能够精准实现重物的升降、定位等操作,为各类工业生产提供了稳定可靠的支持。想要深入了解丝杆升降机,就必须探…...

【51单片机】2-3【I/O口】震动传感器控制LED灯

1.硬件 51最小系统LED灯模块震动传感器模块 2.软件 #include "reg52.h"sbit led1 P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口 sbit vibrate P3^3;//震动传感器DO接P3.3口void Delay2000ms() //11.0592MHz {…...

TortoiseSVN设置忽略清单

1.TortoiseSVN > Properties(如果安装了 TortoiseSVN)。 2. 在弹出的属性窗口中,点击 New > Other。 4. 在 Property name 中输入 svn:ignore 。 5. 在 Property value 中输入要忽略的文件夹或文件名称,例如: #…...

大模型持续学习方案解析:灾难性遗忘的工业级解决方案

引言 随着大型语言模型(LLMs)如 GPT 系列、BERT 等在自然语言处理领域取得突破性进展,它们强大的理解和生成能力已经渗透到各行各业。然而,这些模型通常是在海量静态数据集上进行一次性预训练的。现实世界是动态变化的&#xff0…...

《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析

《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析 一、套接字选项核心原理 1.1 选项层级体系 套接字选项按协议层级划分(图1): SOL_SOCKET:通用套接字层选项IPPROTO_IP:IPv4协议层…...

Debian编译安装mysql8.0.41源码包 笔记250401

Debian编译安装mysql8.0.41源码包 以下是在Debian系统上通过编译源码安装MySQL 8.0.41的完整步骤,包含依赖管理、编译参数优化和常见问题处理: 准备工作 1. 安装编译依赖 sudo apt update sudo apt install -y \cmake gcc g make libssl-dev …...

医疗思维图与数智云融合:从私有云到思维图的AI架构迭代(代码版)

医疗思维图作为AI架构演进的重要方向,其发展路径从传统云计算向融合时空智能、大模型及生态开放的“思维图”架构迭代,体现了技术与场景深度融合的趋势。 以下是其架构迭代的核心路径与关键特征分析: 一、从“智慧云”到“思维图”的架构演进逻辑 以下是针对医疗信息化领域…...