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

深度学习之第一课深度学习的入门

简介

        作为人工智能领域的核心技术,深度学习正以惊人的速度改变着我们的生活 —— 从精准的图像识别到流畅的自然语言对话,从智能推荐系统到自动驾驶,其应用无处不在。如果你是刚踏入 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 个节点(每个节点对应一类的概率)。

    1. 接收输入:一个神经元会接收多个 “输入信号”,这些信号对应数据的特征(比如判断 “是否是猫” 的图像中,输入可能是 “像素亮度 x1”“边缘特征 x2” 等)。
    2. 加权求和:给每个输入信号分配一个 “权重(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。
    3. 激活函数处理:求和结果 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),感知器只能线性划分数据。

    公式是线性代数方程组,因此可以用矩阵乘法来表达这两个公式

    \boldsymbol{W} \boldsymbol{x} = \begin{bmatrix} w_{1,1}x_1 + w_{1,2}x_2 + w_{1,3}x_3 \\ w_{2,1}x_1 + w_{2,2}x_2 + w_{2,3}x_3 \end{bmatrix}

            输出的结果与训练集标签进行损失函数计算,与逻辑回归基本一致。

            神经网络的本质:通过参数与激活函数来拟合特征与目标之间的真实函数关系。但在一个神经网络的程序中,不需要神经元和线,本质上是矩阵的运算,实现一个神经网络最需要的是线性代数库。

    3.多层感知器

    增加了一个中间层。即隐含层

            神经网络可以做非线性分类的关键--隐藏层。假设我们的预测目标是一个向量,那么与前面类似,只需要在“输出层”再增加节点即可。

            在神经网络中需要默认增加偏置神经元(节点),这些节点是默认存在的。 它本质上是一个只含有存储功能,且存储值永远为1的单元。 在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。

            偏置节点没有输入(前一层中没有箭头指向它)。 一般情况下,我们都不会明确画出偏置节点。

    4.神经网络构造

    需要记忆:

    1、设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;

    2、神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;

    3、结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。

    1. 输入层节点数:固定,等于数据特征的维度(比如用 “身高、体重、年龄” 预测健康度,输入层 3 个节点)。
    2. 输出层节点数:固定,等于目标的维度(比如预测 “10 个类别的水果”,输出层 10 个节点)。
    3. 隐藏层节点数:无固定规则,靠经验和实验调整。
      常用方法:先设定几个候选值(比如 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]。

    交叉熵损失的计算步骤:

    1. 归一化:确保预测值在 0~1 之间(通常用 Softmax 函数处理,让所有输出节点的概率和为 1)。
    2. 取负对数:对每个预测概率取 - log(因为当概率接近 1 时,-log (p) 接近 0;概率接近 0 时,-log (p) 接近无穷大 —— 这样 “预测对的类” 损失小,“预测错的类” 损失大)。
    3. 加权求和:用真实标签(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 好。均方误差(含正则项)损失函数公式:

    $\text{loss} = \frac{1}{N} \sum_{i=1}^{N} (yp - y)^2 + \lambda R(W)$

    正则化惩罚的功能:主要用于惩罚权重参数w,一般有L1和L2正则化。

    L1: \sum \vert w \vert

    L2: \sum \vert w \vert^2

    至此,整个神经网络从前往后数据计算方法已经全部完成,但还没有实现w的更新方法

    7.梯度下降

    1. 偏导数 我们知道一个多变量函数的偏导数,就是它关于其中一个变量的导数而保持其他变量恒定。该函数的整个求导: 例如:计算像 f(w0,w1)=w0x1²* w1x2 这样的多变量函数的过程可以分解如下:

    \boldsymbol{\dfrac{\partial f}{\partial w_0}}的计算

    \frac{\partial f}{\partial w_0} = \frac{\partial}{\partial w_0} w_0 x_1^2 \cdot w_1 x_2^2 = x_1^2 w_1 x_2^2

    \boldsymbol{\dfrac{\partial f}{\partial w_1}}的计算

    \frac{\partial f}{\partial w_1} = \frac{\partial}{\partial w_1} w_0 x_1^2 \cdot w_1 x_2^2 = w_0 x_1^2 x_2^2

    2. 梯度 梯度可以定义为一个函数的全部偏导数构成的向量,梯度向量的方向即为函数值增长最快的方向。

    3、梯度下降法(Gradient descent ) 是一个一阶最优化算法,通常也称为最陡下降法 ,要使用梯度下降法找到一个函数的局部极小值。

    步长(学习率):梯度可以确定移动的方向。学习率将决定我们采取步长的大小。不易过小和过大

    梯度下降的执行步骤:

    1. 初始化参数:给 w 和 b 赋随机值(比如从 0~0.1 的均匀分布中采样)。
    2. 计算梯度:对当前的 w 和 b,计算损失函数的梯度(即损失对每个 w、每个 b 的偏导数)。
    3. 更新参数:沿着梯度的反方向调整参数,公式为:
      w_new = w_old - α * (∂Loss/∂w)
      b_new = b_old - α * (∂Loss/∂b)
      其中 α 是 “学习率(步长)”——α 太大容易 “跳过最小值”(误差震荡),α 太小会 “收敛太慢”(训练很久都达不到最优),通常需要调参(比如从 0.001、0.01 开始试)。
    4. 循环迭代:重复步骤 2~3,直到损失函数的值小于预设阈值(比如 0.001),或迭代次数达到上限(比如 1000 轮)。

    小技巧:如何避免陷入 “局部最小值”?

    梯度下降可能会卡在 “局部最小值”(不是整个函数的最小点),PPT 中提到的解决方法是:多组随机初始化参数—— 从不同的初始点开

    http://www.xdnf.cn/news/1360693.html

    相关文章:

  1. VirtualBox安装openEuler24.03
  2. daily notes[5]
  3. 前端 vs 后端请求:核心差异与实战对比
  4. 05 线性代数【动手学深度学习v2】
  5. 中介者模式与几个C++应用实例
  6. imx6ull-驱动开发篇39——Linux INPUT 子系统实验
  7. 【基础算法】初识搜索:递归型枚举与回溯剪枝
  8. 【ElasticSearch】springboot整合es案例
  9. Smooze Pro for mac 鼠标手势增强软件
  10. 【C语言练习】青蛙跳台阶
  11. Vue状态管理工具pinia的使用以及Vue组件通讯
  12. 强光干扰下检出率↑93%!陌讯多模态融合算法在充电桩车位占用检测的实战解析
  13. 力扣【1277. 统计全为1的正方形子矩阵】——从暴力到最优的思考过程
  14. 【网络运维】Shell脚本编程:函数
  15. 深度学习之第二课PyTorch与CUDA的安装
  16. AOSP构建指南:从零开始的Android源码之旅
  17. Docker 容器(一)
  18. 【Docker基础】Docker-compose常用命令实践(三):镜像与配置管理
  19. 【零代码】OpenCV C# 快速开发框架演示
  20. 电路学习(四)二极管
  21. 【计算机视觉】CaFormer
  22. Java:LinkedList的使用
  23. 【Protues仿真】基于AT89C52单片机的温湿度测量
  24. 【文献阅读】生态恢复项目对生态系统稳定性的影响
  25. 在JavaScript中,比较两个数组是否有相同元素(交集)的常用方法
  26. 解决编译osgEarth中winsocket2.h找不到头文件问题
  27. Node.js自研ORM框架深度解析与实践
  28. C++11新特性全面解析(万字详解)
  29. Starlink第三代终端和第二代终端的差异性有哪些?
  30. Flink SQL执行SQL错误排查