深度学习之第一课深度学习的入门
简介
作为人工智能领域的核心技术,深度学习正以惊人的速度改变着我们的生活 —— 从精准的图像识别到流畅的自然语言对话,从智能推荐系统到自动驾驶,其应用无处不在。如果你是刚踏入 AI 领域的新手,面对复杂的神经网络、晦涩的数学公式是否感到无从下手?别担心!本系列博客将以通俗的语言、清晰的逻辑,带你从零开始走进深度学习的世界,从基础概念拆解到神经网络实战细节,手把手帮你搭建深度学习知识框架。
一、深度学习的介绍
要学深度学习,首先得搞懂它和 “人工智能(AI)”“机器学习(ML)” 的关系 —— 它们不是并列的,而是层层包含的 “大家庭”:
- 人工智能(AI):最顶层的目标,指让机器具备模拟人类智能的能力(比如判断、推理、学习)。
- 机器学习(ML):实现 AI 的核心手段之一,它让机器通过 “数据训练” 自动学习规律,而不是靠人类手动编写规则(比如传统的 if-else 代码)。
- 深度学习(DL):机器学习的一个 “进阶分支”,核心是用 “深层神经网络” 模拟人类大脑的神经元连接结构,能处理更复杂的数据(比如高清图像、长文本)。
简单说:AI 包含 ML,ML 包含 DL。深度学习之所以能在近年爆发,正是因为它解决了传统机器学习 “处理复杂数据时效果差、依赖人工特征工程” 的痛点。
1.神经网络
深度学习的 “灵魂” 是神经网络,而理解神经网络,要从最基础的 “神经元” 和 “网络结构” 说起。
神经网络的最小单元:模拟人类神经元的 “计算节点”
人类大脑的神经元通过 “突触” 接收信号、处理后传递给下一个神经元;神经网络中的 “人工神经元” 也做类似的事,它的核心是 3 步计算:
从 “单个神经元” 到 “神经网络”:分层结构是关键
单个神经元只能处理简单的线性问题(比如 “根据身高体重判断是否超重”),要解决复杂问题,必须把大量神经元 “分层连接”,形成神经网络。典型的神经网络分为 3 层:
- 输入层(Input Layer):接收原始数据的 “入口”,节点数 = 数据特征的维度。
比如处理 “32x32 像素的彩色图像”,每个像素有 RGB3 个通道,总特征数 = 32323=3072,所以输入层节点数 = 3072。 - 隐藏层(Hidden Layer):神经网络的 “核心计算层”,负责学习数据的深层特征。
隐藏层可以有 1 层或多层(超过 1 层就是 “深度” 神经网络的由来),比如 “输入层→隐藏层 1→隐藏层 2→输出层” 就是一个深度结构。 - 输出层(Output Layer):输出模型预测结果的 “出口”,节点数 = 目标的维度。
比如 “二分类(猫 / 非猫)”,输出层 1 个节点(0 = 非猫,1 = 猫);“三分类(猫 / 狗 / 鸟)”,输出层 3 个节点(每个节点对应一类的概率)。
- 接收输入:一个神经元会接收多个 “输入信号”,这些信号对应数据的特征(比如判断 “是否是猫” 的图像中,输入可能是 “像素亮度 x1”“边缘特征 x2” 等)。
- 加权求和:给每个输入信号分配一个 “权重(w)”(权重代表这个输入对输出的重要性),再加上一个 “偏置项(b)”,计算总和:
z = w1*x1 + w2*x2 + ... + wn*xn + b
举个例子:如果输入是 x1(像素)、x2(边缘),权重 w1=0.8(像素很重要)、w2=0.2(边缘次要),偏置 b=0.1,那总和 z=0.8x1 + 0.2x2 + 0.1。 - 激活函数处理:求和结果 z 是线性的,而现实世界的问题(比如 “图像分类”“语音识别”)大多是非线性的 —— 这时候需要 “激活函数” 把线性结果转换成非线性输出,让神经元能学习复杂规律。
PPT 中重点提到了sigmoid 函数,它的作用是把 z 值压缩到 0~1 之间(可以理解为 “概率”),公式和图像如下:g(z) = 1 / (1 + e^(-z))
比如 z=0 时,g (z)=0.5;z 越大,g (z) 越接近 1;z 越小,g (z) 越接近 0。
2.感知器
由两层神经元组成的神经网络--“感知器”(Perceptron),感知器只能线性划分数据。
公式是线性代数方程组,因此可以用矩阵乘法来表达这两个公式
输出的结果与训练集标签进行损失函数计算,与逻辑回归基本一致。
神经网络的本质:通过参数与激活函数来拟合特征与目标之间的真实函数关系。但在一个神经网络的程序中,不需要神经元和线,本质上是矩阵的运算,实现一个神经网络最需要的是线性代数库。
3.多层感知器
增加了一个中间层。即隐含层
神经网络可以做非线性分类的关键--隐藏层。假设我们的预测目标是一个向量,那么与前面类似,只需要在“输出层”再增加节点即可。
在神经网络中需要默认增加偏置神经元(节点),这些节点是默认存在的。 它本质上是一个只含有存储功能,且存储值永远为1的单元。 在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。
偏置节点没有输入(前一层中没有箭头指向它)。 一般情况下,我们都不会明确画出偏置节点。
4.神经网络构造
需要记忆:
1、设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
2、神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
3、结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
- 输入层节点数:固定,等于数据特征的维度(比如用 “身高、体重、年龄” 预测健康度,输入层 3 个节点)。
- 输出层节点数:固定,等于目标的维度(比如预测 “10 个类别的水果”,输出层 10 个节点)。
- 隐藏层节点数:无固定规则,靠经验和实验调整。
常用方法:先设定几个候选值(比如 32、64、128),分别训练模型,选择 “测试集效果最好” 的节点数(避免过多导致过拟合,过少导致欠拟合)。
5.损失函数
模型训练的目的:使得参数尽可能的与真实的模型逼近。
具体做法:
1、首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。
2、计算预测值为yi,真实值为y。那么,定义一个损失值loss,损失值用于判断预测的结果和真实值的误差,误差越小越好。
常用的损失函数:
损失函数 | 适用场景 | 核心逻辑 | ||
---|---|---|---|---|
0-1 损失函数 | 分类问题(简单判断) | 预测对了(y_pred=y_true)损失为 0,错了为 1(缺点:不连续,难优化) | ||
均方差损失(MSE) | 回归问题(预测连续值) | 计算预测值与真实值差的平方的平均值:MSE = (1/n)Σ(y_pred - y_true)² | ||
交叉熵损失 | 分类问题(概率输出) | 衡量 “预测概率分布” 与 “真实概率分布” 的差距,值越小越接近(多分类必用) | ||
平均绝对差损失 | 回归问题(抗异常值) | 计算预测值与真实值绝对差的平均值:`MAE = (1/n)Σ |
多分类的情况下,如何计算损失值呢?
现在有一个三分类的任务,我们需要对下面三种动物进行分类。
比如 “猫 / 狗 / 鸟” 三分类,真实标签是 “猫”(用 one-hot 编码表示为 [1,0,0]),模型预测概率是 [0.52, 0.47, 0.01]。
交叉熵损失的计算步骤:
- 归一化:确保预测值在 0~1 之间(通常用 Softmax 函数处理,让所有输出节点的概率和为 1)。
- 取负对数:对每个预测概率取 - log(因为当概率接近 1 时,-log (p) 接近 0;概率接近 0 时,-log (p) 接近无穷大 —— 这样 “预测对的类” 损失小,“预测错的类” 损失大)。
- 加权求和:用真实标签(1 或 0)加权求和,只计算 “真实类别” 对应的损失(因为其他类的标签是 0,贡献为 0)。
比如上面的例子,损失 = -(1log(0.52) + 0log (0.47) + 0*log (0.01))≈ 0.65(损失越小,预测越准)。
6.正则化惩罚
输入为:x = [1,1,1,1],现有2种不同的权重值,
w1 = [1,0,0,0]
w2 = [0.25,0.25,0.25,0.25]
w1和w2与输入的乘积都为1,但w2 与每一个输入数据进行计算后都有数据,使得w2会学习到每一个特征信息。而w1只和第1个输入信息有关系,容易出现过拟合现象,因此w2的效果会比w1 好。均方误差(含正则项)损失函数公式:
正则化惩罚的功能:主要用于惩罚权重参数w,一般有L1和L2正则化。
至此,整个神经网络从前往后数据计算方法已经全部完成,但还没有实现w的更新方法
7.梯度下降
1. 偏导数 我们知道一个多变量函数的偏导数,就是它关于其中一个变量的导数而保持其他变量恒定。该函数的整个求导: 例如:计算像 f(w0,w1)=w0x1²* w1x2 这样的多变量函数的过程可以分解如下:
的计算
的计算
2. 梯度 梯度可以定义为一个函数的全部偏导数构成的向量,梯度向量的方向即为函数值增长最快的方向。
3、梯度下降法(Gradient descent ) 是一个一阶最优化算法,通常也称为最陡下降法 ,要使用梯度下降法找到一个函数的局部极小值。
步长(学习率):梯度可以确定移动的方向。学习率将决定我们采取步长的大小。不易过小和过大
梯度下降的执行步骤:
- 初始化参数:给 w 和 b 赋随机值(比如从 0~0.1 的均匀分布中采样)。
- 计算梯度:对当前的 w 和 b,计算损失函数的梯度(即损失对每个 w、每个 b 的偏导数)。
- 更新参数:沿着梯度的反方向调整参数,公式为:
w_new = w_old - α * (∂Loss/∂w)
b_new = b_old - α * (∂Loss/∂b)
其中 α 是 “学习率(步长)”——α 太大容易 “跳过最小值”(误差震荡),α 太小会 “收敛太慢”(训练很久都达不到最优),通常需要调参(比如从 0.001、0.01 开始试)。 - 循环迭代:重复步骤 2~3,直到损失函数的值小于预设阈值(比如 0.001),或迭代次数达到上限(比如 1000 轮)。
小技巧:如何避免陷入 “局部最小值”?
梯度下降可能会卡在 “局部最小值”(不是整个函数的最小点),PPT 中提到的解决方法是:多组随机初始化参数—— 从不同的初始点开