深度学习开端知识

深度学习概述

什么是深度学习

人工智能、机器学习和深度学习之间的关系:

机器学习是实现人工智能的一种途径,深度学习是机器学习的子集,区别如下:

传统机器学习算法依赖人工设计特征、提取特征,而深度学习依赖算法自动提取特征。深度学习模仿人类大脑的运行方式,从大量数据中学习特征,这也是深度学习被看做黑盒子、可解释性差的原因。

随着算力的提升,深度学习可以处理图像,文本,音频,视频等各种内容,主要应用领域有:

  • 图像处理:分类、目标检测、图像分割(语义分割)
  • 自然语言处理:LLM、NLP、Transformer
  • 语音识别:对话机器人、智能客服(语音+NLP)
  • 自动驾驶:语义分割(行人、车辆、实线等)
  • LLM:大Large语言Language模型Model
  • 机器人:非常火的行业

有了大模型的加持,AI+各行各业。

深度学习发展历史

可百度了解

深度学习的优势

神经网络

我们要学习的深度学习(Deep Learning)是神经网络的一个子领域,主要关注更深层次的神经网络结构,也就是深层神经网络(Deep Neural Networks,DNNs)。

感知神经网络

神经网络(Neural Networks)是一种模拟人脑神经元网络结构的计算模型,用于处理复杂的模式识别、分类和预测等任务。生物神经元如下图:

生物学:

1.人脑可以看做是一个生物神经网络,由众多的神经元连接而成

  • 树突:从其他神经元接收信息的分支
  • 细胞核:处理从树突接收到的信息
  • 轴突:被神经元用来传递信息的生物电缆
  • 突触:轴突和其他神经元树突之间的连接

2.人脑神经元处理信息的过程:

  • 多个信号到达树突,然后整合到细胞体的细胞核中
  • 当积累的信号超过某个阈值,细胞就会被激活
  • 产生一个输出信号,由轴突传递。

神经网络由多个互相连接的节点(即人工神经元)组成。

人工神经元

人工神经元(Artificial Neuron)是神经网络的基本构建单元,模仿了生物神经元的工作原理。其核心功能是接收输入信号,经过加权求和和非线性激活函数处理后,输出结果。

构建人工神经元

人工神经元接受多个输入信息,对它们进行加权求和,再经过激活函数处理,最后将这个结果输出。

组成部分

  • 输入(Inputs): 代表输入数据,通常用向量表示,每个输入值对应一个权重。
  • 权重(Weights): 每个输入数据都有一个权重,表示该输入对最终结果的重要性。
  • 偏置(Bias): 一个额外的可调参数,作用类似于线性方程中的截距,帮助调整模型的输出。
  • 加权求和: 神经元将输入乘以对应的权重后求和,再加上偏置。
  • 激活函数(Activation Function): 用于将加权求和后的结果转换为输出结果,引入非线性特性,使神经网络能够处理复杂的任务。常见的激活函数有Sigmoid、ReLU(Rectified Linear Unit)、Tanh等。

数学表示

如果有 n 个输入 $x_1, x_2, \ldots, x_n$,权重分别为 $w_1, w_2, \ldots, w_n$,偏置为 $b$,则神经元的输出 $y$ 表示为:

$xz=\sum_{i=1}^nw_i\cdot x_i+b $       $y=\sigma(z) $

其中,$\sigma(z)$ 是激活函数。

对比生物神经元

人工神经元和生物神经元对比如下表:

生物神经元 人工神经元
细胞核 节点 (加权求和 + 激活函数)
树突 输入
轴突 带权重的连接
突触 输出

深入神经网络

  • 神经网络是由大量人工神经元按层次结构连接而成的计算模型。每一层神经元的输出作为下一层的输入,最终得到网络的输出。

基本结构

神经网络有下面三个基础层(Layer)构建而成:

  • 输入层(Input): 神经网络的第一层,负责接收外部数据,不进行计算。
  • 隐藏层(Hidden): 位于输入层和输出层之间,进行特征提取和转换。隐藏层一般有多层,每一层有多个神经元。
  • 输出层(Output): 网络的最后一层,产生最终的预测结果或分类结果

网络构建

我们使用多个神经元来构建神经网络,相邻层之间的神经元相互连接,并给每一个连接分配一个权重,经典如下:

注意:同一层的各个神经元之间是没有连接的。

全连接神经网络

全连接(Fully Connected,FC)神经网络是前馈神经网络的一种,每一层的神经元与上一层的所有神经元全连接,常用于图像分类、文本分类等任务。

特点
  • 全连接层: 层与层之间的每个神经元都与前一层的所有神经元相连。
  • 权重数量: 由于全连接的特点,权重数量较大,容易导致计算量大、模型复杂度高。
  • 学习能力: 能够学习输入数据的全局特征,但对于高维数据却不擅长捕捉局部特征(如图像就需要CNN)。
计算步骤
  • 数据传递: 输入数据经过每一层的计算,逐层传递到输出层。
  • 激活函数: 每一层的输出通过激活函数处理。
  • 损失计算: 在输出层计算预测值与真实值之间的差距,即损失函数值。
  • 反向传播(Back Propagation): 通过反向传播算法计算损失函数对每个权重的梯度,并更新权重以最小化损失。

数据处理

数据和加载器

  • Ecxel表格的数据;
  • 图片是数据;
  • 文本信息是数据;
  • 官方数据集是数据;
  • make_regression模拟的也是数据;

参数初始化

  • 神经网络的参数初始化是训练深度学习模型的关键步骤之一。初始化参数(通常是权重和偏置)会对模型的训练速度、收敛性以及最终的性能产生重要影响。下面是关于神经网络参数初始化的一些常见方法及其相关知识点。
  • 官方文档参考:torch.nn.init — PyTorch 2.5 documentation

固定值初始化

  • 固定值初始化是指在神经网络训练开始时,将所有权重或偏置初始化为一个特定的常数值。这种初始化方法虽然简单,但在实际深度学习应用中通常并不推荐。

全零初始化

  • 将神经网络中的所有权重参数初始化为0。
  • 方法:将所有权重初始化为零。
  • 缺点:导致对称性破坏,每个神经元在每一层中都会执行相同的计算,模型无法学习。
  • 应用场景:通常不用来初始化权重,但可以用来初始化偏置。
import torch

def test01():
    model = torch.nn.Linear(5, 1)
    # 全零初始化
    # 将权重初始化为0,model.weight被初始化为0的参数
    torch.nn.init.zeros_(model.weight)
    print(model.weight)
    model.weight.data.fill_(1)
    print(model.weight)

if __name__ == '__main__':
    test01()
"""
Parameter containing:
tensor([[0., 0., 0., 0., 0.]], requires_grad=True)
Parameter containing:
tensor([[1., 1., 1., 1., 1.]], requires_grad=True)
"""

全1初始化

  • 全1初始化会导致网络中每个神经元接收到相同的输入信号,进而输出相同的值,这就无法进行学习和收敛。所以全1初始化只是一个理论上的初始化方法,但在实际神经网络的训练中并不适用。
import torch.nn as nn

def test02():
    # 全1参数初始化
    # 4不是输入的数据有4条,而是输入的数据的权重有4个,每条特征值有4个
    model = torch.nn.Linear(4, 1)
    torch.nn.init.ones_(model.weight)
    print(model.weight)

if __name__ == '__main__':
    test02()
"""
Parameter containing:
tensor([[1., 1., 1., 1.]], requires_grad=True)
"""

任意常数初始化

  • 将所有参数初始化为某个非零的常数(如 0.1,-1 等)。虽然不同于全0和全1,但这种方法依然不能避免对称性破坏的问题。
import torch.nn as nn

def test03():
    # 指定参数初始化
    # 4不是输入的数据有4条,而是输入的数据的权重有4个,每条特征值有4个
    model = torch.nn.Linear(4, 1)
    torch.nn.init.constant_(model.weight, 5)
    print(model.weight)

if __name__ == '__main__':
    test03()
"""
Parameter containing:
tensor([[5., 5., 5., 5.]], requires_grad=True)
"""

随机初始化

  • 方法:将权重初始化为随机的小值,通常从正态分布或均匀分布中采样。
  • 应用场景:这是最基本的初始化方法,通过随机初始化避免对称性破坏。
  • 随机分布之均匀初始化
import torch.nn as nn

def test04():
    # 随机参数初始化
    # 4不是输入的数据有4条,而是输入的数据的权重有4个,每条特征值有4个
    # 三套权重,每套权重有4个输入值,每条特征值有4个
    model = torch.nn.Linear(4, 3)
    torch.nn.init.uniform_(model.weight)
    print(model.weight)

if __name__ == '__main__':
    test04()
"""
Parameter containing:
tensor([[0.3642, 0.9121, 0.5020, 0.5839],
        [0.7654, 0.6401, 0.8633, 0.0704],
        [0.4772, 0.1756, 0.9870, 0.0416]], requires_grad=True)
"""
  • 正态分布初始化
import torch
import torch.nn as nn

# 正态分布初始化
def test05():
    model =  torch.nn.Linear(6, 8)
    torch.nn.init.normal_(model.weight, mean=1, std=2)
    print(model.weight)


if __name__ == '__main__':
    test05()
"""
Parameter containing:
tensor([[ 2.5076,  5.2577,  3.3463, -0.3659, -2.8118,  1.3285],
        [-0.1769, -1.6597,  1.4845,  0.7917,  1.2998, -0.3249],
        [-2.7227,  3.4356,  1.6258,  2.7487,  4.9062,  1.2346],
        [ 3.6401, -0.6951,  0.9113,  2.2389,  0.7237,  1.1446],
        [ 1.1042,  1.3029,  3.6920,  0.5030, -1.0741,  3.0714],
        [ 2.4586, -0.9933,  4.2211,  0.5617, -0.2933, -2.3886],
        [ 1.1387, -2.0781,  3.4274,  3.7742,  4.0110,  0.9324],
        [-0.1291, -1.2657,  2.2761, -2.6135,  1.3359, -0.4781]],
       requires_grad=True)
"""

Xavier 初始化

也叫做Glorot初始化。

方法:根据输入和输出神经元的数量来选择权重的初始值。权重从以下分布中采样:

$ W\sim\mathrm{U}\left(-\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}+n_\mathrm{out}}},\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}+n_\mathrm{out}}}\right) $

或者

$ W\sim\mathrm{N}\left(0,\frac{2}{n_\mathrm{in}+n_\mathrm{out}}\right) $

$ \mathcal{N}(0, \text{std}^2)\mathcal{N}(0, \text{std}^2) $

其中 x_{in} 是当前层的输入神经元数量,x_{out}是输出神经元数量。

优点:平衡了输入和输出的方差,适合$Sigmoid$ 和 $Tanh$ 激活函数。

应用场景:常用于浅层网络或使用$Sigmoid$ 、$Tanh$ 激活函数的网络。

import torch
import torch.nn as nn

# Xavier 初始化
def test06():
    model = nn.Linear(6, 2)
    torch.nn.init.xavier_uniform_(model.weight)
    print(model.weight)
    torch.nn.init.xavier_normal_(model.weight)
    print(model.weight)

if __name__ == '__main__':
    test06()
"""
Parameter containing:
tensor([[ 0.3246,  0.5916, -0.5449, -0.0188, -0.1047,  0.5020],
        [-0.4950, -0.6065, -0.6630,  0.4130,  0.0719,  0.3317]],
       requires_grad=True)
Parameter containing:
tensor([[-0.2404,  0.4160,  0.7544,  0.7362,  0.6896,  0.1267],
        [ 0.3274, -0.3232, -0.1033,  0.1438, -0.6681, -0.2525]],
       requires_grad=True)
"""

He初始化

也叫kaiming 初始化。

方法:专门为 ReLU 激活函数设计。权重从以下分布中采样:

$ W\sim\mathrm{N}\left(0,\frac{2}{n_\mathrm{in}}\right) $

其中 $n_{\text{in}}$ 是当前层的输入神经元数量。

优点:适用于$ReLU$ 和 $Leaky ReLU$ 激活函数。

应用场景:深度网络,尤其是使用 ReLU 激活函数时。

import torch
import torch.nn as nn

# He初始化
def test07():
    model = torch.nn.Linear(6, 8)
    torch.nn.init.kaiming_uniform_(model.weight)
    print(model.weight)
    model1 = torch.nn.Linear(6, 8)
    torch.nn.init.kaiming_normal_(model1.weight)    
    print(model1.weight)


if __name__ == '__main__':
    test07()
"""
Parameter containing:
tensor([[-0.6672, -0.2011, -0.2701,  0.8939,  0.4433, -0.3782],
        [-0.2380,  0.7126,  0.2886,  0.5757, -0.1072, -0.3268],
        [-0.2221,  0.0136,  0.0984,  0.6404,  0.2004, -0.2737],
        [-0.1816, -0.2019, -0.7821, -0.8135,  0.9801, -0.1041],
        [ 0.9661,  0.5574,  0.4388, -0.0619,  0.1639, -0.2632],
        [-0.5419,  0.4985,  0.8074, -0.7523,  0.9440, -0.9783],
        [-0.8417,  0.6788,  0.3290,  0.5034,  0.7955, -0.7616],
        [ 0.7639,  0.4722,  0.8272,  0.7239,  0.7598, -0.7180]],
       requires_grad=True)
Parameter containing:
tensor([[ 0.4509,  0.7777,  0.2351,  0.0130, -0.9703, -0.7420],
        [-0.1100, -0.4148, -0.0657,  0.1857, -0.5336, -0.4752],
        [ 0.5175, -0.6691,  0.8017,  1.4748, -0.2622, -0.7321],
        [-0.8864,  0.2444,  0.0927,  0.1975, -0.1230, -0.1230],
        [ 0.4144,  0.5364,  0.1676,  0.6524,  0.3700, -0.3855],
        [ 0.0819, -0.8229, -0.6674,  0.6379,  0.4000, -0.3821],
        [-0.0486, -0.0296, -0.0282,  0.5270,  0.1232, -0.2186],
        [ 0.1837, -0.9335,  0.2759,  0.0452, -0.0542, -0.9096]],
       requires_grad=True)
"""

总结

  • 在使用Torch构建网络模型时,每个网络层的参数都有默认的初始化方法,同时还可以通过以上方法来对网络参数进行初始化。

激活函数

  • 激活函数的作用是在隐藏层引入非线性,使得神经网络能够学习和表示复杂的函数关系,使网络具备非线性能力,增强其表达能力。

基础概念

  • 通过认识线性和非线性的基础概念,深刻理解激活函数存在的价值。

非线性理解

如果在隐藏层不使用激活函数,那么整个神经网络会表现为一个线性模型。

假设:

  • 神经网络有L层,每层的输出为$\mathbf{a}^{(l)}$
  • 每层的权重矩阵为$\mathbf{W}^{(l)} $,偏置向量为$\mathbf{b}^{(l)}$
  • 输入数据为$\mathbf{x}$,输出为$\mathbf{a}^{(L)}$

一层网络的情况

  • 对于单层网络(输入层到输出层),如果没有激活函数,输出$\mathbf{a}^{(1)}$ 可以表示为: $\mathbf{a}^{(1)} = \mathbf{W}^{(1)} \mathbf{x} + \mathbf{b}^{(1)}$

两层网络的情况

假设我们有两层网络,且每层都没有激活函数,则:

  • 第一层的输出:\mathbf{a}^{(1)} = \mathbf{W}^{(1)} \mathbf{x} + \mathbf{b}^{(1)}
  • 第二层的输出:$\mathbf{a}^{(2)} = \mathbf{W}^{(2)} \mathbf{a}^{(1)} + \mathbf{b}^{(2)}$

$\mathbf{a}^{(1)}$代入到$\mathbf{a}^{(2)}$中,可以得到:

$\mathbf{a}^{(2)} = \mathbf{W}^{(2)} (\mathbf{W}^{(1)} \mathbf{x} + \mathbf{b}^{(1)}) + \mathbf{b}^{(2)}$

$\mathbf{a}^{(2)} = \mathbf{W}^{(2)} \mathbf{W}^{(1)} \mathbf{x} + \mathbf{W}^{(2)} \mathbf{b}^{(1)} + \mathbf{b}^{(2)}$

我们可以看到,输出$\mathbf{a}^{(2)}$是输入$\mathbf{x}$的线性变换,因为:$\mathbf{a}^{(2)} = \mathbf{W}' \mathbf{x} + \mathbf{b}'$其中$\mathbf{W}' = \mathbf{W}^{(2)} \mathbf{W}^{(1)}$$\mathbf{b}' = \mathbf{W}^{(2)} \mathbf{b}^{(1)} + \mathbf{b}^{(2)}$

多层网络的情况

如果有$L$层,每层都没有激活函数,则第$l$层的输出为:$\mathbf{a}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}$

通过递归代入,可以得到:

$ \mathbf{a}^{(L)} = \mathbf{W}^{(L)} \mathbf{W}^{(L-1)} \cdots \mathbf{W}^{(1)} \mathbf{x} + \mathbf{W}^{(L)} \mathbf{W}^{(L-1)} \cdots \mathbf{W}^{(2)} \mathbf{b}^{(1)} + \mathbf{W}^{(L)} \mathbf{W}^{(L-1)} \cdots \mathbf{W}^{(3)} \mathbf{b}^{(2)} + \cdots + \mathbf{b}^{(L)} $

表达式可简化为:

$ \mathbf{a}^{(L)} = \mathbf{W}'' \mathbf{x} + \mathbf{b}'' $

其中,$\mathbf{W}''$ 是所有权重矩阵的乘积,$\mathbf{b}''$是所有偏置项的线性组合。

如此可以看得出来,无论网络多少层,意味着:

  • 整个网络就是线性模型,无法捕捉数据中的非线性关系。
  • 激活函数是引入非线性特性、使神经网络能够处理复杂问题的关键。

非线性可视化

我们可以通过可视化的方式去理解非线性的拟合能力:A Neural Network Playground

常见激活函数

激活函数通过引入非线性来增强神经网络的表达能力,对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数,因此激活函数必须是可微(可导)

sigmoid

Sigmoid激活函数是一种常见的非线性激活函数,特别是在早期神经网络中应用广泛。它将输入映射到0到1之间的值,因此非常适合处理概率问题。

公式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值