深度学习基础:从感知机到激活函数和简单算法解析(附代码实现)

103 阅读13分钟

深度学习基础:从感知机到激活函数和简单算法解析(附代码实现)

引言:

为什么需要深度学习? 传统机器学习(如决策树、SVM)需要人工设计特征(如手写数字识别中手动提取边缘、纹理特征),但面对图像、语音等复杂数据时,人工特征设计难度大、效果差。深度学习的核心价值在于:自动从数据中学习多层级的特征表示,无需人工干预——就像教孩子认识猫,不用告诉他“猫有尖耳朵、毛茸茸”,而是让他看1000张猫的图片,自然总结出猫的特征,所以神经网络成功取决于三大因素:大数据,计算能力和算法创新。 本文将从最基础的感知机出发,循序渐进讲解,配可运行代码,帮你夯实深度学习基础。

一、入门基石:感知机(神经网络的“砖块”)

1、感知机是什么?

感知机(Perceptron)通常指单层感知机,是一种简单的二元线性分类器,也是最早的前馈神经网络模型之一(由Frank Rosenblatt在1957年提出)。 它的核心作用是解决二分类问题(比如判断“是/否”“正/负”),属于监督学习算法。

2、单层感知机的结构

单层感知机的结构非常简单,只有输入层和输出层,没有隐藏层:

  • 输入层:接收原始数据(特征向量);
  • 输出层:输出分类结果(0或1)。

它的计算逻辑可以概括为:

  • 对输入特征做加权求和(结合权重和偏置)
  • 通过阈值/激活函数判断结果,输出分类标签。

3、感知机的数学模型

感知机的基本形式可以表示为: f(x) = sign(w*x +b)

其中:

  • x :输入向量(比如样本的特征)
  • w :权重向量(每个特征对应的重要程度);
  • b :偏置项(调整分类的“门槛”);
  • sign:符号函数(激活函数) 在这里插入图片描述

4、单层感知机的训练逻辑

单层感知机的权重更新过程,本质是最简单的梯度下降:

  • 当预测结果与真实标签不一致时,沿“减少误差”的方向调整权重 w 和偏置 b
  • 但它通常不被称为“反向传播”——因为反向传播是多层网络的误差传递方式,而单层感知机只有一层权重,无需逐层传播误差。

5、从“单层”到“多层”:感知机的进化

单层感知机只能解决线性可分问题(比如用直线分隔两类数据),但面对“异或(XOR)”这类线性不可分问题时会失效。 于是有了多层感知机(MLP):

  • 结构:包含输入层、隐藏层、输出层(至少3层);
  • 特点:每一层由多个感知机(神经元)组成,通过隐藏层对特征做“非线性转换”;
  • 作用:解决线性不可分问题,是现代神经网络的基础结构。

6、接下来让我们动手编写一个前馈网络(Feed-Forward Network,FFN)来进行二分类,由于模型没有被训练,所以答案是错误的:

import numpy as np
x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0,0,0,1])

w = np.random.randn(2)#权重
b = np.random.randn()#偏置

def activate(x):#激活函数和阈值
    return 1 if x >=0 else 0

#前馈传播
def forward_propagation(x,w,b):
    z = np.dot(x,w) + b
    a = activate(z)
    return a

#测试前馈传播
for i in range(len(x)):
    output = forward_propagation(x[i],w,b)
    print('输入:',x[i],'输出:',output)

输出1,1,0,1

7、权重更新

在深度学习中,权重更新是模型训练的核心环节——通过调整网络的权重(w)和偏置(b),让模型输出逐渐接近真实标签。

权重更新的目标:最小化损失函数

深度学习的训练过程可以看作优化问题:通过调整权重和偏置,最小化“损失函数”(模型预测值与真实值的差异)。

常用的损失函数是均方误差(适用于回归/分类问题): E=12(yo)2E = \frac{1}{2}(y - o)^2 其中:

  • y:真实标签(目标输出);
  • o:模型预测输出(o = wx + b)。

8、权重更新的方法:梯度下降

梯度下降是权重更新的核心算法——沿“损失函数的负梯度方向”调整参数,逐步接近损失最小值。

  1. 梯度的计算(链式法则)

要更新权重 w 和偏置 b,需先计算损失函数对它们的梯度(导数):

(1)损失对权重 w 的梯度

已知 o = wx + b,结合链式法则: Ew=Eoow\frac{\partial E}{\partial w} = \frac{\partial E}{\partial o} \cdot \frac{\partial o}{\partial w}

  • 第一步:Eo=(yo)\frac{\partial E}{\partial o} = -(y - o)(对均方误差求导);
  • 第二步:ow=x\frac{\partial o}{\partial w} = x(对 o = wx + b 求导);

最终梯度: Ew=(yo)x\frac{\partial E}{\partial w} = -(y - o) \cdot x

(2)损失对偏置 b 的梯度

同理: Eb=Eoob=(yo)1=(yo)\frac{\partial E}{\partial b} = \frac{\partial E}{\partial o} \cdot \frac{\partial o}{\partial b} = -(y - o) \cdot 1 = -(y - o)

  1. 权重更新公式

沿负梯度方向更新参数(η 为学习率,控制更新幅度):

  • 权重更新:w=wηEw=w+η(yo)xw = w - \eta \cdot \frac{\partial E}{\partial w} = w + \eta \cdot (y - o) \cdot x
  • 偏置更新:b=bηEb=b+η(yo)b = b - \eta \cdot \frac{\partial E}{\partial b} = b + \eta \cdot (y - o)

9、多层网络的权重更新:反向传播(BP)

单层感知机的权重更新逻辑简单,但多层神经网络(如MLP)需要用反向传播(Back Propagation) 计算各层梯度: 反向传播的核心逻辑

通过链式法则+动态规划,从输出层向输入层逐层传递误差,计算每一层的梯度:

  1. 先计算输出层的误差;
  2. 利用“后一层的梯度”和“当前层的导数”,推导当前层的梯度;
  3. 逐层更新各层的权重和偏置。

反向传播的代码实现(以单层感知机为例)

learning_rate = 0.1  # 学习率

def backward_propagation(x, w, b, y, output):
    # 1. 计算误差:真实值 - 预测值
    error = y - output
    # 2. 计算权重更新量
    delta_w = learning_rate * error * x
    # 3. 计算偏置更新量
    delta_b = learning_rate * error
    # 4. 更新权重和偏置
    new_b = b + learning_rate * error
    w +=delta_w
    return new_b
#b为浮点数,为不可变

完整训练流程(含前向+反向传播)

import numpy as np
x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0,0,0,1])

w = np.random.randn(2)#权重
b = np.random.randn()#偏置

threshold = 3

def activate(x):
    return 1 if x >=0 else 0

#前馈传播
def forward_propagation(x,w,b):
    z = np.dot(x,w) + b
    a = activate(z)
    return a

#反向传播


learning_rate = 0.3
#propagation:传播,宣传,培养
def backward_propagation(x,w,b,y,output):
    error = y - output
    deltaw = learning_rate * error * x
    new_b = b + learning_rate * error
    w +=deltaw
    return new_b
#b为浮点数,为不可变

epochs = 100
#epoch:迭代次数

for i in range(epochs):
    for j in range(len(x)):
        output = forward_propagation(x[j],w,b)
        b = backward_propagation(x[j],w,b,y[j],output)

#测试训练后的
for i in range(len(x)):
    output = forward_propagation(x[i],w,b)
    print('input:',x[i],'ouput:',output)



二、激活函数全解析

激活函数是人工神经网络的“灵魂”——它为网络引入非线性,让模型能拟合复杂数据模式。没有激活函数,多层网络会退化为线性模型,失去深度的价值。

1、激活函数的核心作用

  • 引入非线性:突破线性运算的限制,让网络学习复杂映射关系;
  • 控制信息流动:决定神经元是否“激活”,筛选并传递有效信息;
  • 辅助梯度传播:合理的激活函数能避免梯度消失/爆炸,加速模型训练。

2、经典激活函数

  1. Sigmoid函数(Logistic函数)
  • 功能:将输入映射到 [0,1] 区间,常用于二分类任务的输出层(表示概率);
  • 公式: f(x)=11+exp(x)f(x) = \frac{1}{1 + \exp(-x)}

在这里插入图片描述

  • 优点:输出可解释为概率,平滑连续;
  • 缺点:存在“梯度消失”(输入绝对值过大时导数接近0),输出非零均值。
  1. 双曲正切函数(tanh函数)
  • 功能:将输入映射到 [-1,1] 区间,常用于隐藏层;

  • 公式: f(x)=exp(x)exp(x)exp(x)+exp(x)f(x) = \frac{\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)} 在这里插入图片描述

  • 优点:输出均值为0,梯度消失问题比Sigmoid轻;

  • 缺点:仍存在梯度消失问题。

  1. ReLU函数
  • 功能:对正值输入直接输出,负值输入输出0,是当前隐藏层的主流激活函数;
  • 公式: f(x)=max(0,x)f(x) = \max(0, x)

在这里插入图片描述

  • 优点:计算简单,缓解梯度消失,训练速度快;
  • 缺点:存在“神经元死亡”(负值输入时梯度为0,永久不更新)。
  1. Leaky ReLU函数
  • 功能:解决ReLU的“神经元死亡”问题,负值输入时保留小梯度;
  • 公式: f(x)=max(0.01x,x)f(x) = \max(0.01x, x)

在这里插入图片描述

  • 优点:避免神经元死亡,保留ReLU的训练效率;
  • 缺点:小斜率(如0.01)是固定值,缺乏适应性。
  1. Parametric ReLU函数(PReLU)
  • 功能:在Leaky ReLU基础上,将负值输入的斜率设为可学习参数;
  • 公式: f(x)=max(ax,x)(a为可学习参数)f(x) = \max(a \cdot x, x) \quad (a为可学习参数)
  • 特点:适应性强,能根据数据自动调整斜率。
  1. Softmax函数
  • 功能:将输入向量归一化为概率分布(总和为1),常用于多分类任务的输出层;
  • 公式: f(xi)=exp(xi)jexp(xj)(xi为输入向量的第i个元素)f(x_i) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} \quad (x_i为输入向量的第i个元素)

3、新型激活函数

  1. Swish函数
  • 提出:Google团队2017年提出;
  • 公式: f(x)=xSigmoid(βx)(β为可调节超参数)f(x) = x \cdot \text{Sigmoid}(\beta \cdot x) \quad (\beta为可调节超参数)
  • 平滑性:连续可导,利于梯度传播;
  • 非线性:引入可学习的非线性趋势,增强网络表达能力;
  • 自适应性:形状可通过学习调整,适配不同数据。
  1. GLU(门控线性单元)
  • 提出:Google Brain团队,广泛用于Transformer等模型;
  • 核心思想:通过门控机制控制信息流动——将输入分为“门”和“激活向量”,门控决定哪些信息被保留;
  • 功能:
  • 增强信息表达:选择性传递有效信息;
  • 缓解梯度消失:保留非线性变换的梯度;
  • 提升建模能力:擅长处理自然语言等序列数据。
  1. SwiGLU
  • 提出:2020年Google团队提出,结合GLU和Swish的特性;
  • 门控控制:用Sigmoid调节信息流;
  • 非线性:引入Swish的非线性特性;
  • 上下文建模:适合处理序列数据。
  1. GeGLU
  • 提出:GLU的改进版,引入高斯误差项;
  • 增强特征交互:每个输入维度可与其他维度交互;
  • 降噪能力:提升模型在自然语言任务中的鲁棒性。

4、激活函数的选择建议

场景激活函数
二分类输出层Sigmoid
多分类输出层Softmax
隐藏层(通用)ReLU/Leaky ReLU/PReLU
序列数据(如NLP)GLU/SwiGLU/GeGLU
追求适应性Swish/PReLU

三、优化算法(函数)解析

优化算法是深度学习训练的“引擎”——通过调整模型参数(权重、偏置),最小化损失函数,让模型拟合数据规律。以下是主流优化算法的核心逻辑与对比。

1、优化算法的核心目标

通过迭代调整模型参数,最小化损失函数(模型预测与真实标签的差异),实现:

  1. 让模型输出更接近真实值;
  2. 避免局部最优,找到全局较优解;
  3. 加速训练收敛,提升模型泛化能力。

2、经典优化算法

  1. 梯度下降(Gradient Descent)

梯度下降是所有优化算法的基础,核心是沿损失函数的负梯度方向更新参数。

常见变体:

类型 核心逻辑 特点 批量梯度下降(BGD) 用全量数据计算梯度,更新参数 稳定但训练慢(数据量大时) 随机梯度下降(SGD) 用单个样本计算梯度,更新参数 训练快但震荡大 小批量梯度下降(MBGD) 用一小批样本计算梯度,更新参数 平衡训练速度与稳定性

  1. 动量优化(Momentum)

模拟物理“动量”,积累历史梯度的方向,减少震荡,加速收敛。

  • 核心公式: v=βv+ηgv = \beta \cdot v + \eta \cdot g动量更新 θ=θ+v\theta = \theta + v参数更新 (v 为动量,β为动量系数,g 为当前梯度,η为学习率)
  • 优点:缓解SGD的震荡,加速梯度下降;
  • 缺点:动量系数固定,缺乏自适应性。
  1. AdaGrad

自适应学习率优化算法,对稀疏特征更友好(学习率随参数梯度的历史平方和调整)。

  • 核心逻辑: 对每个参数,学习率与“梯度历史平方和的平方根”成反比,梯度大的参数学习率小,梯度小的参数学习率大。
  • 优点:自动适配不同参数的学习率;
  • 缺点:学习率单调递减,后期可能训练停滞。
  1. RMSProp

对AdaGrad的改进,引入指数移动平均,缓解学习率过早衰减的问题。

  • 核心公式: v=βv+(1β)g2v = \beta \cdot v + (1-\beta) \cdot g^2 θ=θηv+ϵg\theta = \theta - \frac{\eta}{\sqrt{v+\epsilon}} \cdot g (v 为梯度平方的移动平均,\epsilon 防止除零)
  • 优点:避免学习率过快衰减,训练更稳定;
  • 缺点:仅适配学习率,未结合动量。
  1. Adam

结合动量与自适应学习率的算法,是当前深度学习的主流优化器。

  • 核心逻辑: 同时维护梯度的一阶矩(动量)和二阶矩(梯度平方的移动平均),自适应调整每个参数的学习率。
  • 核心公式: m=β1m+(1β1)gm = \beta_1 \cdot m + (1-\beta_1) \cdot g v=β2v+(1β2)g2v = \beta_2 \cdot v + (1-\beta_2) \cdot g^2 m^=m1β1t,v^=v1β2t\hat{m} = \frac{m}{1-\beta_1^t}, \hat{v} = \frac{v}{1-\beta_2^t} θ=θηm^v^+ϵ\theta = \theta - \eta \cdot \frac{\hat{m}}{\sqrt{\hat{v}}+\epsilon} (t 为迭代次数,β1=0.9, β2=0.999 为默认超参数)
  • 特点:
  • 优点:收敛快、稳定性强,适配大多数任务;
  • 缺点:对学习率敏感,需调参。
  1. AdamW

Adam的变体,将权重衰减与梯度更新分离,解决Adam中权重衰减与学习率混淆的问题。

  • 优点:优化过程更稳定,泛化能力更强;
  • 适用场景:大模型训练(如Transformer)。

3、优化算法的继承关系

各优化算法的演进逻辑:

动量 + 梯度优化 → Momentum AdaGrad + 衰减系统 → RMSProp Momentum + RMSProp → Adam Adam + 权重衰减分离 → AdamW

4、优化算法选择建议

场景模型
小数据集、简单模型SGD/MBGD
稀疏特征任务AdaGrad/RMSProp
通用深度学习任务Adam
大模型、高泛化需求AdamW

四、权值初始化,归一化

归一化是深度学习中稳定训练、加速收敛的关键技术——通过对数据分布进行调整,避免梯度消失/爆炸,让模型更高效地学习特征。以下是主流归一化方法的核心逻辑与对比。 在这里插入图片描述

1、归一化的核心目标

  1. 稳定数据分布:让每一层的输入分布保持相对稳定,缓解“内部协变量偏移”;
  2. 加速训练收敛:使激活函数处于梯度较陡的区域,避免梯度消失;
  3. 提升泛化能力:降低模型对参数初始化和学习率的敏感性。

2、主流归一化方法

  1. 批归一化(Batch Normalization, BN)

2015年提出的经典归一化方法,在“批维度”上对数据进行归一化(适用于CNN等批量训练场景)。

核心逻辑:

对每个batch的特征,分别计算均值和方差,将其归一化为“零均值、单位方差”的分布,再通过可学习参数(γ, β)恢复数据表达能力。

公式:

μB=1mi=1mxiσB2=1mi=1m(xiμB)2\mu_B = \frac{1}{m}\sum_{i=1}^m x_i \quad \sigma_B^2 = \frac{1}{m}\sum_{i=1}^m (x_i-\mu_B)^2 x^i=xiμBσB2+ϵyi=γx^i+β\hat{x}_i = \frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} \quad y_i = \gamma \hat{x}_i + \beta

特点:

  • 优点:加速收敛、缓解梯度消失,适配大多数CNN任务;
  • 缺点:依赖batch大小(小batch效果差)、不适用于RNN等序列任务。
  1. 层归一化(Layer Normalization, LN)

在“层维度”上对数据进行归一化(不依赖batch,适用于RNN、Transformer等序列模型)。

核心逻辑:

对单个样本的所有特征计算均值和方差,进行归一化(与batch无关)。

特点:

  • 优点:不依赖batch大小、适配序列任务;
  • 缺点:对不同输入分布的适应性较弱。
  1. RMSNorm(Root Mean Square Layer Normalization)

LN的简化版,仅计算特征的均方根(不减去均值),减少计算量的同时保持稳定性。

核心逻辑:

RMS(x)=1ni=1nxi2x^i=xiRMS(x)+ϵyi=γx^i+β\text{RMS}(x) = \sqrt{\frac{1}{n}\sum_{i=1}^n x_i^2} \quad \hat{x}_i = \frac{x_i}{\text{RMS}(x)+\epsilon} \quad y_i = \gamma \hat{x}_i + \beta

  • 优点:计算更快、适配长序列任务;
  • 缺点:仅进行方差归一化,未处理均值偏移。

3、归一化方法的选择建议

场景推荐方法
CNN、大batch任务批归一化(BN)
RNN、Transformer等序列任务层归一化(LN)/ RMSNorm
小batch、资源受限场景RMSNorm

本次知识分享先到这里哈,如有勘误欢迎指正交流,我先去睡觉了喵,下次讲神经网络并提供源码