> 技术文档 > 通俗易懂神经网络:从基础到实现

通俗易懂神经网络:从基础到实现


引言

神经网络是人工智能和深度学习的核心,它模仿人脑的工作方式,通过数据学习复杂的模式。本文将以通俗易懂的方式讲解神经网络的基础知识,包括单层神经网络、多层神经网络,最后用Python代码实现一个简单的神经网络模型。


1. 神经网络模型基础

1.1 什么是神经网络?

神经网络是由神经元(Neurons)组成的计算系统,它接收输入数据,经过一系列计算后输出预测结果。其核心思想是模仿人脑神经元之间的连接方式

图表:人工神经元结构示意图

#mermaid-svg-WHPMoGqlWQ3aPl4X {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .error-icon{fill:#552222;}#mermaid-svg-WHPMoGqlWQ3aPl4X .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WHPMoGqlWQ3aPl4X .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .marker.cross{stroke:#333333;}#mermaid-svg-WHPMoGqlWQ3aPl4X svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .cluster-label text{fill:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .cluster-label span{color:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .label text,#mermaid-svg-WHPMoGqlWQ3aPl4X span{fill:#333;color:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .node rect,#mermaid-svg-WHPMoGqlWQ3aPl4X .node circle,#mermaid-svg-WHPMoGqlWQ3aPl4X .node ellipse,#mermaid-svg-WHPMoGqlWQ3aPl4X .node polygon,#mermaid-svg-WHPMoGqlWQ3aPl4X .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .node .label{text-align:center;}#mermaid-svg-WHPMoGqlWQ3aPl4X .node.clickable{cursor:pointer;}#mermaid-svg-WHPMoGqlWQ3aPl4X .arrowheadPath{fill:#333333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WHPMoGqlWQ3aPl4X .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WHPMoGqlWQ3aPl4X .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WHPMoGqlWQ3aPl4X .cluster text{fill:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X .cluster span{color:#333;}#mermaid-svg-WHPMoGqlWQ3aPl4X div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WHPMoGqlWQ3aPl4X :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}输入x1加权求和输入x2输入xn激活函数f输出y偏置b

扩展说明:
每个神经元会对输入加权求和,加上偏置后通过激活函数,输出结果。激活函数赋予网络非线性表达能力。

1.2 神经元的结构

一个神经元的基本计算方式如下:

输出=f(w1x1+w2x2+⋯+wnxn+b) \\text{输出} = f(w_1 x_1 + w_2 x_2 + \\dots + w_n x_n + b)\\,输出=f(w1x1+w2x2++wnxn+b)

其中:

  • (x1,x2,…,xnx_1, x_2, \\dots, x_nx1,x2,,xn) 是输入数据
  • (w1,w2,…,wnw_1, w_2, \\dots, w_nw1,w2,,wn) 是权重(决定输入的重要性)
  • (bbb) 是偏置(调整输出的偏移量)
  • (fff) 是激活函数(引入非线性)

1.3 常见的激活函数

函数名称 公式 特点 Sigmoid σ(x)=11+e−x \\sigma(x) = \\frac{1}{1 + e^{-x}} \\,σ(x)=1+ex1 输出0~1,适合二分类 ReLU ReLU(x)=max⁡(0,x) \\text{ReLU}(x) = \\max(0, x) \\,ReLU(x)=max(0,x) 计算快,缓解梯度消失 Tanh tanh⁡(x)=ex−e−xex+e−x  \\tanh(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}} \\,tanh(x)=ex+exexex 输出-1~1,适合回归

图表:常见激活函数对比思维导图
在这里插入图片描述

扩展说明:
激活函数的选择会影响神经网络的收敛速度和表达能力。ReLU因其高效和缓解梯度消失问题,在深度网络中应用最广。


2. 单层神经网络(感知机)

单层神经网络(Perceptron)是最简单的神经网络,仅包含输入层和输出层,没有隐藏层。

图表:单层感知机结构图

#mermaid-svg-9Ocqk28UfB8ZWpWJ {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .error-icon{fill:#552222;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .marker.cross{stroke:#333333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .cluster-label text{fill:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .cluster-label span{color:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .label text,#mermaid-svg-9Ocqk28UfB8ZWpWJ span{fill:#333;color:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .node rect,#mermaid-svg-9Ocqk28UfB8ZWpWJ .node circle,#mermaid-svg-9Ocqk28UfB8ZWpWJ .node ellipse,#mermaid-svg-9Ocqk28UfB8ZWpWJ .node polygon,#mermaid-svg-9Ocqk28UfB8ZWpWJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .node .label{text-align:center;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .node.clickable{cursor:pointer;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .arrowheadPath{fill:#333333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .cluster text{fill:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ .cluster span{color:#333;}#mermaid-svg-9Ocqk28UfB8ZWpWJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9Ocqk28UfB8ZWpWJ :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}输入x1Σ输入x2输入xn激活函数输出y

2.1 数学表示

y=f(wTx+b)y = f(\\mathbf{w}^T \\mathbf{x} + b)y=f(wTx+b)

  • (x \\mathbf{x}\\,x) 是输入向量
  • (w \\mathbf{w}\\,w) 是权重向量
  • (bbb) 是偏置
  • (fff) 是激活函数(如Sigmoid)

2.2 应用场景

  • 线性分类(如逻辑回归)
  • 简单二分类问题

扩展说明:
单层感知机只能解决线性可分问题,无法拟合复杂的非线性关系。


3. 多层神经网络(深度神经网络)

多层神经网络(MLP, Multi-Layer Perceptron)包含输入层、隐藏层、输出层,能够学习更复杂的非线性关系。

图表:多层神经网络结构图

#mermaid-svg-2NUfCxvZs963lxDx {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2NUfCxvZs963lxDx .error-icon{fill:#552222;}#mermaid-svg-2NUfCxvZs963lxDx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2NUfCxvZs963lxDx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2NUfCxvZs963lxDx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2NUfCxvZs963lxDx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2NUfCxvZs963lxDx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2NUfCxvZs963lxDx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2NUfCxvZs963lxDx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2NUfCxvZs963lxDx .marker.cross{stroke:#333333;}#mermaid-svg-2NUfCxvZs963lxDx svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2NUfCxvZs963lxDx .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2NUfCxvZs963lxDx .cluster-label text{fill:#333;}#mermaid-svg-2NUfCxvZs963lxDx .cluster-label span{color:#333;}#mermaid-svg-2NUfCxvZs963lxDx .label text,#mermaid-svg-2NUfCxvZs963lxDx span{fill:#333;color:#333;}#mermaid-svg-2NUfCxvZs963lxDx .node rect,#mermaid-svg-2NUfCxvZs963lxDx .node circle,#mermaid-svg-2NUfCxvZs963lxDx .node ellipse,#mermaid-svg-2NUfCxvZs963lxDx .node polygon,#mermaid-svg-2NUfCxvZs963lxDx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2NUfCxvZs963lxDx .node .label{text-align:center;}#mermaid-svg-2NUfCxvZs963lxDx .node.clickable{cursor:pointer;}#mermaid-svg-2NUfCxvZs963lxDx .arrowheadPath{fill:#333333;}#mermaid-svg-2NUfCxvZs963lxDx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2NUfCxvZs963lxDx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2NUfCxvZs963lxDx .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-2NUfCxvZs963lxDx .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-2NUfCxvZs963lxDx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2NUfCxvZs963lxDx .cluster text{fill:#333;}#mermaid-svg-2NUfCxvZs963lxDx .cluster span{color:#333;}#mermaid-svg-2NUfCxvZs963lxDx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2NUfCxvZs963lxDx :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}输入x1隐藏层神经元1隐藏层神经元2输入x2输出y

3.1 结构

  • 输入层:接收原始数据(如像素、文本)
  • 隐藏层:多个非线性变换层(常用ReLU)
  • 输出层:最终预测(如分类概率)

3.2 前向传播

数据从输入层逐层计算到输出层:
h1=f(W1x+b1)h2=f(W2h1+b2)…y=f(Wnhn−1+bn)\\mathbf{h}_1 = f(\\mathbf{W}_1 \\mathbf{x} + \\mathbf{b}_1) \\\\\\mathbf{h}_2 = f(\\mathbf{W}_2 \\mathbf{h}_1 + \\mathbf{b}_2) \\\\\\dots \\\\\\mathbf{y} = f(\\mathbf{W}_n \\mathbf{h}_{n-1} + \\mathbf{b}_n)h1=f(W1x+b1)h2=f(W2h1+b2)y=f(Wnhn1+bn)

图表:前向传播流程图

#mermaid-svg-jjhESFAVJuKqWdxC {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .error-icon{fill:#552222;}#mermaid-svg-jjhESFAVJuKqWdxC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jjhESFAVJuKqWdxC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jjhESFAVJuKqWdxC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jjhESFAVJuKqWdxC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jjhESFAVJuKqWdxC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jjhESFAVJuKqWdxC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jjhESFAVJuKqWdxC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jjhESFAVJuKqWdxC .marker.cross{stroke:#333333;}#mermaid-svg-jjhESFAVJuKqWdxC svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jjhESFAVJuKqWdxC .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .cluster-label text{fill:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .cluster-label span{color:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .label text,#mermaid-svg-jjhESFAVJuKqWdxC span{fill:#333;color:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .node rect,#mermaid-svg-jjhESFAVJuKqWdxC .node circle,#mermaid-svg-jjhESFAVJuKqWdxC .node ellipse,#mermaid-svg-jjhESFAVJuKqWdxC .node polygon,#mermaid-svg-jjhESFAVJuKqWdxC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jjhESFAVJuKqWdxC .node .label{text-align:center;}#mermaid-svg-jjhESFAVJuKqWdxC .node.clickable{cursor:pointer;}#mermaid-svg-jjhESFAVJuKqWdxC .arrowheadPath{fill:#333333;}#mermaid-svg-jjhESFAVJuKqWdxC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jjhESFAVJuKqWdxC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jjhESFAVJuKqWdxC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jjhESFAVJuKqWdxC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jjhESFAVJuKqWdxC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jjhESFAVJuKqWdxC .cluster text{fill:#333;}#mermaid-svg-jjhESFAVJuKqWdxC .cluster span{color:#333;}#mermaid-svg-jjhESFAVJuKqWdxC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jjhESFAVJuKqWdxC :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}输入层隐藏层1隐藏层2输出层

3.3 反向传播(Backpropagation)

通过计算损失函数的梯度,调整权重和偏置:
w←w−η∂L∂w\\mathbf{w} \\leftarrow \\mathbf{w} - \\eta \\frac{\\partial L}{\\partial \\mathbf{w}}wwηwL
其中:

  • (LLL) 是损失函数(如交叉熵、MSE)
  • (η \\eta\\,η) 是学习率

图表:反向传播流程图

#mermaid-svg-GQ9J8IVmL5myUxpB {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .error-icon{fill:#552222;}#mermaid-svg-GQ9J8IVmL5myUxpB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GQ9J8IVmL5myUxpB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GQ9J8IVmL5myUxpB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GQ9J8IVmL5myUxpB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GQ9J8IVmL5myUxpB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GQ9J8IVmL5myUxpB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GQ9J8IVmL5myUxpB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GQ9J8IVmL5myUxpB .marker.cross{stroke:#333333;}#mermaid-svg-GQ9J8IVmL5myUxpB svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GQ9J8IVmL5myUxpB .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .cluster-label text{fill:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .cluster-label span{color:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .label text,#mermaid-svg-GQ9J8IVmL5myUxpB span{fill:#333;color:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .node rect,#mermaid-svg-GQ9J8IVmL5myUxpB .node circle,#mermaid-svg-GQ9J8IVmL5myUxpB .node ellipse,#mermaid-svg-GQ9J8IVmL5myUxpB .node polygon,#mermaid-svg-GQ9J8IVmL5myUxpB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GQ9J8IVmL5myUxpB .node .label{text-align:center;}#mermaid-svg-GQ9J8IVmL5myUxpB .node.clickable{cursor:pointer;}#mermaid-svg-GQ9J8IVmL5myUxpB .arrowheadPath{fill:#333333;}#mermaid-svg-GQ9J8IVmL5myUxpB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GQ9J8IVmL5myUxpB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GQ9J8IVmL5myUxpB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GQ9J8IVmL5myUxpB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GQ9J8IVmL5myUxpB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GQ9J8IVmL5myUxpB .cluster text{fill:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB .cluster span{color:#333;}#mermaid-svg-GQ9J8IVmL5myUxpB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GQ9J8IVmL5myUxpB :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}计算损失计算梯度计算梯度计算梯度输出层隐藏层2隐藏层1输入层损失函数

扩展说明:
前向传播负责计算输出,反向传播则根据损失调整参数,是神经网络学习的核心机制。


4. 神经网络代码简单实现(Python)

使用 numpysklearn 实现一个简单的多层神经网络(MLP)进行二分类。

4.1 数据准备

import numpy as npfrom sklearn.datasets import make_moonsfrom sklearn.model_selection import train_test_split# 生成非线性数据集X, y = make_moons(n_samples=1000, noise=0.2, random_state=42)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

4.2 定义神经网络

class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): # 初始化权重 self.W1 = np.random.randn(input_size, hidden_size) * 0.01 self.b1 = np.zeros(hidden_size) self.W2 = np.random.randn(hidden_size, output_size) * 0.01 self.b2 = np.zeros(output_size) def relu(self, x): return np.maximum(0, x) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def forward(self, X): # 前向传播 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.relu(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_pred = self.sigmoid(self.z2) return self.y_pred def backward(self, X, y, lr=0.01): # 反向传播 m = X.shape[0] # 计算梯度 d_z2 = self.y_pred - y.reshape(-1, 1) d_W2 = np.dot(self.a1.T, d_z2) / m d_b2 = np.sum(d_z2, axis=0) / m d_a1 = np.dot(d_z2, self.W2.T) d_z1 = d_a1 * (self.a1 > 0) # ReLU的导数 d_W1 = np.dot(X.T, d_z1) / m d_b1 = np.sum(d_z1, axis=0) / m # 更新权重 self.W1 -= lr * d_W1 self.b1 -= lr * d_b1 self.W2 -= lr * d_W2 self.b2 -= lr * d_b2 def train(self, X, y, epochs=1000, lr=0.01): for epoch in range(epochs): y_pred = self.forward(X) loss = -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred)) self.backward(X, y, lr) if epoch % 100 == 0: print(f\"Epoch {epoch}, Loss: {loss:.4f}\")

4.3 训练与测试

# 初始化网络nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)# 训练nn.train(X_train, y_train, epochs=1000, lr=0.1)# 测试y_pred = (nn.forward(X_test) > 0.5).astype(int)accuracy = np.mean(y_pred.flatten() == y_test)print(f\"Test Accuracy: {accuracy * 100:.2f}%\")

输出示例

Epoch 0, Loss: 0.6931Epoch 100, Loss: 0.3521Epoch 200, Loss: 0.2104...Test Accuracy: 93.33%

5. 神经网络的应用场景

图表:神经网络应用场景思维导图

在这里插入图片描述

扩展说明:
神经网络广泛应用于图像、语音、文本等多种领域,是现代人工智能的基石。


总结

  • 单层神经网络:适合简单线性问题(如逻辑回归)。
  • 多层神经网络(MLP):能学习复杂非线性关系,是深度学习的基础。
  • 代码实现:使用 numpy 手动实现前向传播、反向传播,训练一个简单的分类模型。

希望这篇博客能帮助你理解神经网络的基本原理!🚀 如果有问题,欢迎留言讨论!