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

【学习笔记】深度学习网络-深度前馈网络(MLP)

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。

在之前的文章中介绍了深度学习中用到的数学基础和强化学习的概念,本文将开始介绍现代深度学习中用于解决实际应用的实践。

【一文读懂】深度学习技术谱系:探索生成式AI的核心模型(一) 基础技术图谱

【生成式AI】理解深度学习和机器学习的数学基础:线性代数

【万字长文】理解深度学习和机器学习的数学基础:概率论和信息论

【学习笔记】理解深度学习和机器学习的数学基础:数值计算

【学习笔记】理解深度学习和机器学习的关系

深度前馈网络(Deep Feedforward Networks):简介与核心概念

深度前馈网络(Deep Feedforward Networks),也称为前馈神经网络(Feedforward Neural Networks)或多层感知机(Multilayer Perceptrons, MLPs),是深度学习中最基础且最重要的模型之一。它们被广泛应用于图像识别、自然语言处理、语音识别等领域。本文将基于《深度学习》(Deep Learning)一书中的相关内容,介绍深度前馈网络的基本概念、结构和工作原理。


1. 什么是深度前馈网络?

深度前馈网络是一种人工神经网络,其核心特点是信息单向流动:从输入层经过若干隐藏层,最终到达输出层。与循环神经网络(RNN)不同,前馈网络没有反馈回路,数据不会在网络中循环流动。它的“深度”体现在网络包含多个隐藏层,这些隐藏层使得网络能够学习到数据中的多层次抽象特征。

  • 前馈(Feedforward):信息从输入层流向输出层,没有反馈或循环。

  • 深度(Deep):网络包含多个隐藏层,能够学习复杂的非线性映射。


2. 深度前馈网络的结构

深度前馈网络通常由以下几部分组成:

(1)输入层(Input Layer)

输入层接收原始数据(如图像像素、文本向量等),并将其传递给第一个隐藏层。输入层的神经元数量通常由数据的维度决定。

(2)隐藏层(Hidden Layers)

隐藏层是网络的核心部分,负责从输入数据中提取特征。每个隐藏层包含若干神经元,神经元之间通过权重连接。隐藏层的数量和每层的神经元数量是超参数,需要根据任务和数据的特点进行调整。

  • 深度:隐藏层的数量决定了网络的深度。深度网络可以学习到更复杂的特征,但也更难训练。

  • 宽度:每层神经元的数量决定了网络的宽度。宽度网络可以捕捉更多的特征,但计算复杂度较高。

(3)输出层(Output Layer)

输出层生成最终的预测结果。输出层的神经元数量通常由任务的类型决定:

  • 二分类问题:1个神经元(使用Sigmoid激活函数)。

  • 多分类问题:多个神经元(使用Softmax激活函数)。

  • 回归问题:1个或多个神经元(通常不使用激活函数)。


3. 深度前馈网络的工作原理

深度前馈网络的工作原理可以分为以下几个步骤:

(1)前向传播(Forward Propagation)

输入数据通过网络逐层传递,直到输出层生成预测结果。每一层的计算包括线性变换和激活函数:

z=Wx+b

a=f(z)

其中,W是权重矩阵,x 是输入向量,b是偏置向量,z 是线性变换的结果,f是激活函数,a是激活后的输出。

(2)损失计算(Loss Calculation)

使用损失函数衡量预测结果与真实标签之间的差距。常见的损失函数包括:

  • 均方误差(MSE):用于回归任务。

  • 交叉熵(Cross-Entropy):用于分类任务。

(3)反向传播(Backpropagation)

反向传播算法通过链式法则计算损失函数对每个权重的梯度,并利用梯度下降法更新权重,逐步减少预测误差。

(4)参数更新(Parameter Update)

使用优化算法(如梯度下降、Adam)更新网络参数:

W\leftarrow W-\eta \frac{\partial L}{\partial W}

b\leftarrow b-\eta \frac{\partial L}{\partial b}

其中,\eta 是学习率,\frac{\partial L}{\partial W} 和 \frac{\partial L}{\partial b}分别是损失函数对权重和偏置的梯度。

实例:使用深度前馈网络学习XOR函数

XOR(异或)问题是一个经典的例子,用于展示单层感知机(Perceptron)的局限性以及多层感知机(MLP)的强大能力。XOR问题简单但具有代表性,能够很好地说明为什么我们需要深度前馈网络。


1. 什么是XOR问题?

XOR(异或)是一个逻辑运算,其真值表如下:

输入 A输入 B输出 A XOR B
000
011
101
110

XOR问题的目标是训练一个模型,使其能够根据输入A和B正确预测A XOR B的结果。


2. 单层感知机的局限性

单层感知机(没有隐藏层)只能解决线性可分的问题。然而,XOR问题是非线性可分的,这意味着无法用一条直线将输出为0和1的样本分开。

  • 尝试用单层感知机解决XOR
    单层感知机的形式为:

y=f(w_{1}x_{1}+w_{2}x_{2}+b)

其中,f是激活函数(如阶跃函数),w_{1},w_{2}​ 是权重,b是偏置。

无论怎么调整权重和偏置,单层感知机都无法正确分类XOR问题。这是因为XOR问题的输出在二维平面上形成了一个非线性分布(四个点分布在正方形的对角线上)。


3. 使用多层感知机(MLP)解决XOR问题

通过引入一个隐藏层,多层感知机可以解决XOR问题。以下是一个简单的MLP结构:

  • 输入层:2个神经元(对应输入A和B)。

  • 隐藏层:2个神经元(使用非线性激活函数,如ReLU或Sigmoid)。

  • 输出层:1个神经元(使用Sigmoid激活函数,输出0或1)。


4. 具体实现步骤

以下是一个简单的Python实现,使用NumPy库构建一个两层的MLP来解决XOR问题:

import numpy as np# 定义激活函数(Sigmoid)
def sigmoid(x):return 1 / (1 + np.exp(-x))# 定义激活函数的导数
def sigmoid_derivative(x):return x * (1 - x)# 输入数据(XOR问题的输入和输出)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])# 初始化权重和偏置
np.random.seed(1)
weights0 = 2 * np.random.random((2, 2)) - 1  # 输入层到隐藏层的权重
weights1 = 2 * np.random.random((2, 1)) - 1  # 隐藏层到输出层的权重
bias0 = np.zeros((1, 2))  # 隐藏层的偏置
bias1 = np.zeros((1, 1))  # 输出层的偏置# 训练参数
learning_rate = 0.1
epochs = 10000# 训练过程
for epoch in range(epochs):# 前向传播hidden_input = np.dot(X, weights0) + bias0hidden_output = sigmoid(hidden_input)output_input = np.dot(hidden_output, weights1) + bias1output = sigmoid(output_input)# 计算误差error = y - output# 反向传播d_output = error * sigmoid_derivative(output)error_hidden = d_output.dot(weights1.T)d_hidden = error_hidden * sigmoid_derivative(hidden_output)# 更新权重和偏置weights1 += hidden_output.T.dot(d_output) * learning_rateweights0 += X.T.dot(d_hidden) * learning_ratebias1 += np.sum(d_output, axis=0, keepdims=True) * learning_ratebias0 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate# 测试模型
hidden_input = np.dot(X, weights0) + bias0
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights1) + bias1
output = sigmoid(output_input)print("Predicted Output:")
print(output)
5. 代码解释
  • 前向传播
    输入数据通过隐藏层和输出层,生成预测结果。每一层的计算包括线性变换和激活函数。

  • 误差计算
    使用均方误差衡量预测结果与真实标签之间的差距。

  • 反向传播
    通过链式法则计算损失函数对每个权重的梯度,并使用梯度下降法更新权重和偏置。

  • 训练结果
    经过训练后,模型能够正确预测XOR问题的输出。


6. 运行结果

运行上述代码后,输出结果应该接近XOR问题的真实值:

Predicted Output:
[[0.01][0.99][0.99][0.01]]

这表明模型已经学会了XOR问题的规律。

通过XOR问题,我们可以看到单层感知机的局限性以及多层感知机的强大能力。深度前馈网络通过引入隐藏层和非线性激活函数,能够解决复杂的非线性问题。XOR问题虽然简单,但它很好地展示了深度学习的基本原理和训练过程。

基于梯度的学习:深度学习的核心优化方法

基于梯度的学习是深度学习的核心优化方法,它通过计算损失函数对模型参数的梯度,并利用梯度下降法逐步更新参数,从而使模型能够从数据中学习。


1. 什么是基于梯度的学习?

基于梯度的学习是一种优化方法,其目标是通过最小化损失函数来调整模型参数。损失函数衡量模型预测值与真实值之间的差距,而梯度则指示了损失函数在参数空间中的变化方向。

  • 损失函数(Loss Function)
    损失函数用于量化模型的预测误差。常见的损失函数包括:

    • 均方误差(MSE):用于回归任务。

    • 交叉熵(Cross-Entropy):用于分类任务。

  • 梯度(Gradient)
    梯度是损失函数对模型参数的偏导数向量。它指示了损失函数在参数空间中的变化方向,即损失函数增加最快的方向。

  • 梯度下降法(Gradient Descent)
    梯度下降法通过沿着梯度的反方向更新参数,逐步减少损失函数的值。更新公式为:

    \theta \leftarrow \theta -\eta \nabla_{\theta }L(\theta )

    其中,\theta是模型参数,\eta 是学习率,\nabla_{\theta }L(\theta ) 是损失函数对参数的梯度。


2. 梯度下降法的变体

梯度下降法有多种变体,适用于不同的场景和需求。以下是几种常见的变体:

  • 批量梯度下降(Batch Gradient Descent)
    使用整个训练集计算梯度,更新参数。优点是梯度计算准确,缺点是计算量大,不适合大规模数据集。

  • 随机梯度下降(Stochastic Gradient Descent, SGD)
    每次随机选择一个样本计算梯度,更新参数。优点是计算速度快,缺点是梯度波动大,收敛不稳定。

  • 小批量梯度下降(Mini-batch Gradient Descent)
    每次使用一个小批量样本计算梯度,更新参数。这是深度学习中常用的方法,兼顾了计算效率和梯度稳定性。


3. 梯度下降法的优化技巧

为了提高梯度下降法的性能,研究者提出了许多优化技巧:

  • 动量(Momentum)
    动量方法通过引入动量项加速梯度下降,减少震荡。更新公式为:

    \mu \leftarrow \gamma \theta +\eta \nabla_{\theta }L(\theta )

\theta \leftarrow \theta -\mu

其中,\gamma 是动量系数,\mu是动量项。

  • 自适应学习率方法
    自适应学习率方法根据参数的梯度动态调整学习率。常见的方法包括:

    • AdaGrad:根据历史梯度调整学习率。

    • RMSProp:使用指数加权平均调整学习率。

    • Adam:结合动量和自适应学习率,是目前最常用的优化方法。


4. 基于梯度的学习在深度学习中的应用

基于梯度的学习是深度学习的核心优化方法,广泛应用于各种任务和模型。以下是一些典型应用:

  • 图像分类
    使用卷积神经网络(CNN)和交叉熵损失函数,通过梯度下降法训练模型,实现图像分类。

  • 自然语言处理
    使用循环神经网络(RNN)或Transformer模型,通过梯度下降法训练模型,实现机器翻译、文本生成等任务。

  • 强化学习
    使用策略梯度方法,通过梯度下降法优化策略网络,实现智能体在环境中的学习。


5. 基于梯度的学习的挑战

尽管基于梯度的学习在深度学习中取得了巨大成功,但仍面临一些挑战:

  • 局部最优
    损失函数可能存在多个局部最优,梯度下降法可能陷入局部最优而无法找到全局最优。

  • 梯度消失和梯度爆炸
    在深层网络中,梯度可能在反向传播过程中逐渐消失或爆炸,导致训练困难。

  • 超参数调优
    学习率、动量系数等超参数的选择对模型性能有重要影响,但调优过程耗时且复杂。

深度前馈网络中的隐藏单元:关键设计与选择

在深度前馈网络(Multilayer Perceptrons, MLPs)中,隐藏单元(Hidden Units)是网络的核心组成部分。隐藏单元的设计和选择直接影响模型的表达能力、训练效率和最终性能。


1. 隐藏单元的作用

隐藏单元是隐藏层中的神经元,负责接收输入数据并生成输出。它们通过非线性激活函数引入非线性变换,使得网络能够学习复杂的函数映射。隐藏单元的设计决定了网络的表达能力、训练难度和泛化性能。


2. 常见的隐藏单元类型

以下是几种常见的隐藏单元类型及其特点:

(1)ReLU(Rectified Linear Unit)

ReLU是目前最常用的隐藏单元类型,其定义为:

f(z)=max(0,z)

  • 优点

    • 计算简单,梯度计算高效。

    • 在正区间梯度恒定,缓解了梯度消失问题。

    • 在实践中表现良好,广泛应用于各种任务。

  • 缺点

    • 在负区间梯度为零,可能导致“神经元死亡”问题。

(2)Sigmoid

Sigmoid函数将输入映射到0到1之间,其定义为:

f(x)=\frac{1}{1+e^{-z}}

  • 优点

    • 输出范围有限,适合作为概率输出。

  • 缺点

    • 梯度在两端接近于零,容易导致梯度消失问题。

    • 计算复杂度较高。

(3)Tanh

Tanh函数将输入映射到-1到1之间,其定义为:

f(z)=tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}

  • 优点

    • 输出以零为中心,有助于加速训练。

  • 缺点

    • 梯度在两端接近于零,容易导致梯度消失问题。

(4)Leaky ReLU

Leaky ReLU是对ReLU的改进,定义为:

f(z)=max(\alpha z,z)

其中,\alpha 是一个小的正数(如0.01)。

  • 优点

    • 在负区间也有梯度,缓解了“神经元死亡”问题。

  • 缺点

    • 需要手动设置\alpha 的值。

(5)ELU(Exponential Linear Unit)

ELU是对ReLU的另一种改进,定义为:

f(z)=\left\{\begin{matrix} z & &if(z>0)\\ \alpha (e^{z}-1)& &if(z\leq 0) \end{matrix}\right.

  • 优点

    • 在负区间有非零梯度,且输出接近零均值,有助于加速训练。

  • 缺点

    • 计算复杂度较高。

(6)Softplus

Softplus函数是ReLU的平滑版本,定义为:

f(z)=log(1+e^{z})

  • 优点

    • 处处可导,适合理论研究。

  • 缺点

    • 计算复杂度较高,实践中较少使用。


3. 隐藏单元的选择

隐藏单元的选择取决于任务的特点和数据的分布。以下是一些选择隐藏单元的指导原则:

  • ReLU:大多数情况下,ReLU是默认选择,因其计算高效且表现良好。

  • Leaky ReLU/ELU:如果担心“神经元死亡”问题,可以尝试Leaky ReLU或ELU。

  • Sigmoid/Tanh:在需要输出范围有限的情况下(如概率输出),可以考虑Sigmoid或Tanh,但需注意梯度消失问题。

  • Softplus:适合理论研究,但在实践中较少使用。


4. 隐藏单元的设计技巧

为了提高隐藏单元的性能,研究者提出了许多设计技巧:

  • 批量归一化(Batch Normalization)
    通过对每一层的输入进行归一化,加速训练过程并提高模型的稳定性。

  • Dropout
    在训练过程中随机丢弃一部分神经元,防止网络过度依赖某些神经元,提高泛化能力。

  • 权重初始化
    合适的权重初始化方法(如Xavier初始化、He初始化)可以加速训练并提高模型性能。

深度前馈网络的架构设计:关键原则与实践

在深度前馈网络(Multilayer Perceptrons, MLPs)中,架构设计是决定模型性能的重要因素。合理的架构设计可以提高模型的表达能力、训练效率和泛化能力。


1. 架构设计的基本原则

深度前馈网络的架构设计需要考虑以下几个基本原则:

  • 表达能力
    网络的深度和宽度决定了其表达能力。深度网络可以学习到更复杂的函数映射,而宽度网络可以捕捉更多的特征。

  • 计算效率
    网络的层数和每层的神经元数量直接影响计算复杂度。需要在表达能力和计算效率之间找到平衡。

  • 泛化能力
    网络的复杂度应与任务的复杂度相匹配。过于复杂的网络可能导致过拟合,而过于简单的网络可能导致欠拟合。

  • 训练稳定性
    网络的架构设计应有利于梯度传播,避免梯度消失或梯度爆炸问题。


2. 常见的架构设计

以下是几种常见的深度前馈网络架构设计:

(1)全连接网络(Fully Connected Network)

全连接网络是最基本的深度前馈网络架构,每一层的神经元与下一层的所有神经元相连。

  • 优点

    • 结构简单,易于实现。

    • 适合处理结构化数据(如表格数据)。

  • 缺点

    • 参数量大,计算复杂度高。

    • 对高维数据(如图像、文本)处理效率低。

(2)卷积神经网络(Convolutional Neural Network, CNN)

卷积神经网络通过卷积层和池化层提取局部特征,适合处理图像数据。

  • 优点

    • 参数共享,计算效率高。

    • 能够捕捉局部特征,适合处理高维数据。

  • 缺点

    • 对非图像数据的处理效果有限。

(3)循环神经网络(Recurrent Neural Network, RNN)

循环神经网络通过时间步展开处理序列数据,适合处理文本、语音等序列数据。

  • 优点

    • 能够捕捉时间依赖关系。

    • 适合处理变长序列数据。

  • 缺点

    • 训练过程中容易出现梯度消失或梯度爆炸问题。

(4)Transformer

Transformer通过自注意力机制处理序列数据,适合处理长序列数据。

  • 优点

    • 能够捕捉长距离依赖关系。

    • 并行计算效率高。

  • 缺点

    • 参数量大,计算复杂度高。


3. 架构设计的实践技巧

为了提高深度前馈网络的性能,研究者提出了许多实践技巧:

  • 深度与宽度的平衡
    深度网络可以学习到更复杂的函数映射,但训练难度较大;宽度网络可以捕捉更多的特征,但计算复杂度较高。需要在深度与宽度之间找到平衡。

  • 残差连接(Residual Connection)
    残差连接通过跨层连接缓解梯度消失问题,加速训练过程。其定义为:

    y=f(x)+x

    其中,f(x)是网络层的输出,x 是输入。

  • 批量归一化(Batch Normalization)
    批量归一化通过对每一层的输入进行归一化,加速训练过程并提高模型的稳定性。

  • Dropout
    Dropout在训练过程中随机丢弃一部分神经元,防止网络过度依赖某些神经元,提高泛化能力。

  • 权重初始化
    合适的权重初始化方法(如Xavier初始化、He初始化)可以加速训练并提高模型性能。


反向传播算法:深度学习的核心优化方法

反向传播(Backpropagation)是深度学习中最重要的算法之一,用于训练深度前馈网络(Multilayer Perceptrons, MLPs)。它通过计算损失函数对模型参数的梯度,并利用梯度下降法逐步更新参数,从而使模型能够从数据中学习。


1. 反向传播的基本原理

反向传播的核心思想是利用链式法则(Chain Rule)计算损失函数对模型参数的梯度。具体来说,反向传播包括以下两个阶段:

  • 前向传播(Forward Propagation)
    输入数据通过网络逐层传递,直到输出层生成预测结果。每一层的计算包括线性变换和激活函数。

  • 反向传播(Backward Propagation)
    从输出层开始,逐层计算损失函数对每一层参数的梯度,并利用梯度下降法更新参数。


2. 反向传播的详细步骤

以下是反向传播的详细步骤:

(1)前向传播

在前向传播阶段,输入数据通过网络逐层传递,生成预测结果。具体步骤如下:

  1. 输入数据通过输入层传递到第一个隐藏层。

  2. 每一层的输出通过线性变换和激活函数生成下一层的输入。

  3. 最终输出层的输出即为模型的预测结果。

(2)损失计算

使用损失函数衡量预测结果与真实标签之间的差距。常见的损失函数包括:

  • 均方误差(MSE):用于回归任务。

  • 交叉熵(Cross-Entropy):用于分类任务。

(3)反向传播

在反向传播阶段,从输出层开始,逐层计算损失函数对每一层参数的梯度。具体步骤如下:

  1. 计算输出层的误差:

    \delta ^{(L)}=\frac{\partial L}{\partial a^{(L)}}\bigodot f^{'}(z^{(L)})

    其中,\delta ^{(L)} 是输出层的误差,L 是损失函数,a^{(L)} 是输出层的激活值,z^{(L)} 是输出层的线性变换结果,f^{'}是激活函数的导数,\bigodot 表示逐元素相乘。

  2. 逐层反向传播误差:

    \delta ^{(l)}=((W^{(l+1)})^{T}\delta ^{(l+1)})\bigodot f^{'}(z^{(l)})

    其中,\delta ^{(l)}是第l层的误差,W^{(l+1)}是第l+1层的权重矩阵,z^{(l)}是第l层的线性变换结果。

  3. 计算每一层参数的梯度:

    \frac{\partial L}{\partial W^{(l)}}=\delta ^{(l)}(a^{(l-1)})^{T}

          \frac{\partial L}{\partial b^{(l)}}=\delta ^{(l)}

其中,W^{(l)} 和 b^{(l)} 分别是第l层的权重矩阵和偏置向量,a^{(l-1)} 是第l-1层的激活值。

(4)参数更新

使用梯度下降法更新每一层的参数:

W^{(l)}\leftarrow W^{(l)}-\eta \frac{\partial L}{\partial W^{(l)}}

b^{(l)}\leftarrow b^{(l)}-\eta \frac{\partial L}{\partial b^{(l)}}

其中,\eta 是学习率。


深度前馈网络的发展历史

深度前馈网络(Multilayer Perceptrons, MLPs)是深度学习的核心组成部分,其发展历史与神经网络和人工智能的演进密不可分。从早期的理论探索到现代深度学习的繁荣,深度前馈网络经历了多次起伏和突破。以下是深度前馈网络发展历史的关键节点和重要里程碑。


1. 早期探索:神经网络的萌芽(1940s-1960s)

深度前馈网络的起源可以追溯到20世纪40年代,当时的研究者开始尝试用数学模型模拟生物神经元的行为。

  • 1943年:McCulloch-Pitts神经元模型
    Warren McCulloch和Walter Pitts提出了第一个神经元的数学模型,称为McCulloch-Pitts神经元。这一模型展示了如何用简单的计算单元模拟逻辑运算,为神经网络的理论奠定了基础。

  • 1958年:感知机的提出
    Frank Rosenblatt提出了感知机(Perceptron),这是第一个可以学习的神经网络模型。感知机通过调整权重来分类输入数据,但其只能解决线性可分的问题。感知机的提出引发了神经网络研究的第一次热潮。


2. 低谷期:感知机的局限性(1970s-1980s)

尽管感知机在早期取得了一些成功,但其局限性很快显现出来。1969年,Marvin Minsky和Seymour Papert在《Perceptrons》一书中指出,感知机无法解决非线性问题(如XOR问题)。这一批评导致神经网络研究进入了低谷期。

  • 1974年:反向传播的初步提出
    Paul Werbos在他的博士论文中首次提出了反向传播算法(Backpropagation),但当时这一方法并未引起广泛关注。

  • 1980年代:Hopfield网络和Boltzmann机
    John Hopfield提出了Hopfield网络,这是一种基于能量的模型,能够存储和检索信息。此外,Geoffrey Hinton和Terry Sejnowski提出了Boltzmann机,这是一种基于概率的神经网络模型。这些工作为神经网络的复兴奠定了基础。


3. 复兴期:反向传播的普及(1980s-1990s)

1980年代,反向传播算法被重新发现并广泛应用于神经网络的训练,推动了神经网络研究的复兴。

  • 1986年:反向传播的普及
    David Rumelhart、Geoffrey Hinton和Ronald Williams在《Parallel Distributed Processing》一书中详细描述了反向传播算法,并将其应用于多层感知机的训练。这一工作使得反向传播成为神经网络训练的标准方法。

  • 1989年:万能近似定理
    George Cybenko和Kurt Hornik等人证明了万能近似定理(Universal Approximation Theorem),指出具有单隐藏层的神经网络可以近似任何连续函数。这一理论为神经网络的表达能力提供了数学基础。


4. 深度学习的崛起:深层网络的突破(2000s-2010s)

尽管神经网络在1980年代和1990年代取得了一些进展,但由于计算资源的限制和数据集的不足,其应用仍然有限。直到2000年代,随着计算能力的提升和大规模数据集的出现,深度学习开始崛起。

  • 2006年:深度信念网络的提出
    Geoffrey Hinton提出了深度信念网络(Deep Belief Networks, DBNs),通过无监督预训练和有监督微调的方法,成功训练了深层神经网络。这一工作被认为是深度学习复兴的标志。

  • 2012年:AlexNet的突破
    Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton提出了AlexNet,在ImageNet图像分类竞赛中取得了显著优势。AlexNet的成功标志着深度学习在计算机视觉领域的突破,并引发了深度学习的热潮。


5. 繁荣期:深度学习的广泛应用(2010s至今)

自2012年以来,深度学习在学术界和工业界取得了巨大成功,广泛应用于图像识别、自然语言处理、语音识别等领域。

  • 2014年:生成对抗网络(GANs)
    Ian Goodfellow提出了生成对抗网络(Generative Adversarial Networks, GANs),这是一种能够生成高质量数据的神经网络模型。

  • 2017年:Transformer模型
    Vaswani等人提出了Transformer模型,通过自注意力机制处理序列数据,成为自然语言处理领域的主流模型。

相关文章:

【学习笔记】深度学习网络-深度前馈网络(MLP)

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...

C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示

上一篇: C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合https://blog.csdn.net/beijinghorn/article/details/123533838https://blog.csdn.net/beijinghorn/article/details/123533838 新来的徒弟们交上来的C#代码&#…...

每日进步一点点(网安)

1.1 level5 查看源码关键部分 $str strtolower($_GET["keyword"]); $str2str_replace("<script","<scr_ipt",$str); $str3str_replace("on","o_n",$str2);<input namekeyword value".$str3.">关键…...

代理模式 - 代理模式的应用

引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用&#xff0c;从而可以在不改变目标对象的情况下&#xff0c;增加额外的功能或控…...

机器学习-线性回归(对于f(x;w)=w^Tx+b理解)

一、&#x1d453;(&#x1d499;;&#x1d498;) &#x1d498;T&#x1d499;的推导 学习线性回归&#xff0c;我们那先要对于线性回归的表达公示&#xff0c;有所认识。 我们先假设空间是一组参数化的线性函数&#xff1a; 其中权重向量&#x1d498; ∈ R&#x1d437; …...

【Salesforce】审批流程,代理登录 tips

审批流程权限 审批流程权限问题解决方案代理登录代理登录后Logout 审批流程权限 前几天&#xff0c;使用审批流程&#xff0c;但是是两个sandbox&#xff0c;同样的配置&#xff0c;我有管理员权限。但是profile不是管理员&#xff0c;只是通过具备管理员权限的permission set…...

第20篇:Python 开发进阶:使用Django进行Web开发详解

第20篇&#xff1a;使用Django进行Web开发 内容简介 在上一篇文章中&#xff0c;我们深入探讨了Flask框架的高级功能&#xff0c;并通过构建一个博客系统展示了其实际应用。本篇文章将转向Django&#xff0c;另一个功能强大且广泛使用的Python Web框架。我们将介绍Django的核…...

Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性

作者&#xff1a;来 Elastic Valerio Arvizzigno, Geetha Anne 及 Jeremy Hogan 介绍 Elastic Agent 的新功能&#xff1a;原生输出到 Kafka。借助这一最新功能&#xff0c;Elastic 用户现在可以轻松地将数据路由到 Kafka 集群&#xff0c;从而实现数据流和处理中无与伦比的可扩…...

IPoIB(IP over InfiniBand)数据接收与发送机制详解

IPoIB&#xff08;IP over InfiniBand&#xff09;是一种在InfiniBand网络上实现IP协议的技术&#xff0c;它允许在InfiniBand网络上传输IP数据包。IPoIB通过将IP数据包封装在InfiniBand的数据包中&#xff0c;实现了在InfiniBand网络上的高效通信。本文将详细分析IPoIB如何接收…...

快速更改WampServer根目录php脚本

快速更改WampServer根目录php脚本 <?php // 配置文件地址 $apacheConfPath C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\httpd.conf; $apacheConfPath2 C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\extra\httpd-vhosts.conf; // 新根目录…...

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…...

【自定义函数】编码-查询-匹配

目录 自定义编码匹配编码匹配改进 sheet来源汇总来源汇总改进 END 自定义编码匹配 在wps vb环境写一个新的excel函数名为编码匹配&#xff0c;第一个参数指定待匹配文本所在单元格&#xff08;相对引用&#xff09;&#xff0c;第二个参数指定关键词区域&#xff08;绝对引用&…...

docker-制作镜像gcc添加jdk运行java程序

最近的项目需要使用java调用c的链接库&#xff0c;.OS文件&#xff0c;一开始准备在jdk的镜像下去安装c的环境&#xff0c;不过安装的内容很多&#xff0c;比较复杂也容易缺很多的包&#xff0c;经过实验&#xff0c;我们决定使用gcc的镜像安装jdk来正确的运行java程序。 基础镜…...

工业相机 SDK 二次开发-Sherlock插件

本文介绍了 sherlock 连接相机时的插件使用。通过本套插件可连接海康的工业相机。 一&#xff0e;环境配置 1. 拷贝动态库 在用户安装 MVS 目录下按照如下路径 Development\ThirdPartyPlatformAdapter 找到目 录为 DalsaSherlock 的文件夹&#xff0c;根据 Sherlock 版本找到…...

智慧消防营区一体化安全管控 2024 年度深度剖析与展望

在 2024 年&#xff0c;智慧消防营区一体化安全管控领域取得了令人瞩目的进展&#xff0c;成为保障营区安全稳定运行的关键力量。这一年&#xff0c;行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势&#xff0c;同时也面临着一系列亟待解决…...

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…...

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler&#xff0c;将根目录设置为脚本所在目录 class MyHTT…...

Redis高阶5-布隆过滤器

Redis布隆过滤器 ​ 由一个初始值都为零的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素 目的减少内存占用方式不保存数据信息&#xff0c;只是在内存中做一个是否存在的标记flag 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff0…...

Hive关于数据库的语法,warehouse,metastore

关于数据库的语法 在default数据库下,查看其他数据库的表 in 打开控制台 字体大小的设置 Hive默认的库: default, 1/4说明一共有4个库,现在只展示了1个,单击>>所有架构 数据库的删除 方法一: 语法 删除有表的数据库,加cascade 方法二 当前连接的数据库 切换当前数据库…...

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器&#xff0c;来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能&#xff0c;因为它们的插入和…...

ubuntu系统docker环境搭建

ubuntu系统docker环境搭建 docker引擎安装 高版本docker引擎安装时已经自带有docker compose 安装参考docker官网Install Docker Engine on Ubuntu 方式一&#xff1a; 在线安装 参考apt方式安装 1、Set up Docker’s apt repository. # Add Dockers official GPG key: …...

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化&#xff0c;企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本&#xff0c;并确保信息的透明度&#xff0c;成为了各大行业亟待解决的问题。而增强现实&#xff08;AR&#xff09;技术&#xff0c;特别…...

[ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025

文章目录 IntroduceProject StructureDeclare Plugins and ModulesApply Plugins and Add DependenciesSender PropertiesSender ApplicationSender ControllerReceiver PropertiesReceiver ApplicationReceiver Message HandlerCongratulationsAutomatically Send Message By …...

再述 Dijkstra

再述 Dijkstra 学 Dijkstra 好久了&#xff0c;今天再学了一遍&#xff0c;感觉推翻了好多自己的知识…… 定义 一种用于求非负权值的图的单源最短路径的算法。 方法 已知&#xff1a;如果要求从起始点 s 到某一个点 x 的最短路径&#xff0c;显然只能从某一个已确认为最短…...

大语言模型之prompt工程

前言 随着人工智能的快速发展&#xff0c;我们正慢慢进入AIGC的新时代&#xff0c;其中对自然语言的处理成为了智能化的关键一环&#xff0c;在这个大背景下&#xff0c;“Prompt工程”由此产生&#xff0c;并且正逐渐成为有力的工具... LLM &#xff08;Large Language Mode…...

JavaScript系列(43)--依赖注入系统实现详解

JavaScript依赖注入系统实现详解 &#x1f489; 今天&#xff0c;让我们深入探讨JavaScript的依赖注入系统实现。依赖注入是一种设计模式&#xff0c;它通过将依赖关系的创建和管理从代码中分离出来&#xff0c;提高了代码的可维护性和可测试性。 依赖注入基础概念 &#x1f…...

Mono里运行C#脚本36—加载C#类定义的成员变量和方法的数量

前面分析了加载类和基类的基本过程, 接着来分析一下加载成员变量和方法的数量。 因为我们知道C#语言定义一个类,主要就是定义成员变量,以及那些对此成员变量进行操作的方法, 所以需要使用一种方法来描述C#语言定义类的能力。 一般情况下,主要有两种类型: 普通的类,比如前…...

SWPU 2022 新生赛--web题

奇妙的MD5 进入靶场 然我们输入一个特殊的字符串&#xff0c;然后我到处翻了翻&#xff0c;发现有提示 在MD5中有两个特殊的字符串 0e215962017 //MD5加密后弱比较等于自身 ffifdyop //MD5加密后变成万能密码 这里明显就是万能密码了 输入之后就来到了这个页…...

Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS

在渗透测试中&#xff0c;Windows 靶机通常会运行多种服务&#xff0c;每种服务都有其默认端口和常见的枚举工具及方法。以下是 Windows 靶机常见的服务、端口、枚举工具和方法的详细说明&#xff1a; 1. SMB&#xff08;Server Message Block&#xff09; 端口 445/TCP&…...

记一次Linux共享内存段排除Bug:key值为0x0000000的共享内存段删除不了

本文目录 一、问题情况二、解决方法2.1 通过kill命令删除2.2 通过程序删除 一、问题情况 今天查看共享内存段发现好多共享内存段&#xff0c;而且命令ipcrm -m <shmid>删除不了。 回想了一下&#xff0c;应该是有一些程序跑while循环&#xff0c;或者死循环&#xff0c…...

RV1126画面质量四:GOP改善画质

一&#xff0e; 什么是 GOP GOP 实际上就是两个 I 帧的间隔&#xff0c;比方说分辨率是 1920 * 1080 50 帧&#xff0c;假设 GOP 为 5&#xff0c;那就是大概 2s 插入一个 I 帧。我们再 回顾下&#xff0c;H264/H265 的帧结构。H264/H265 分别分为三种帧类型&#xff1a;I 帧、…...

手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题

手机app如何跳过无障碍权限实现弹框自动点击 --ADB连接专题 一、前言 我们在前期的时候&#xff0c;在双SIM卡进行协同外呼和SIM卡切换时&#xff0c;对如何在手机中“执行批处理脚本做自动点击”的内容进行预研&#xff0c;力图使用事件触发和坐标点击等方式来实现手机安装…...

kafka-保姆级配置说明(consumer)

bootstrap.servers #deserializer应该与producer保持对应 #key.deserializer #value.deserializer ##fetch请求返回时&#xff0c;至少获取的字节数&#xff0c;默认值为1 ##当数据量不足时&#xff0c;客户端请求将会阻塞 ##此值越大&#xff0c;客户端请求阻塞的时间越长&…...

c语言中的数组(上)

数组的概念 数组是⼀组相同类型元素的集合&#xff1b; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…...

(回溯法 子集)leetcode78

#include<iostream> #include<string> #include<vector> //只有子集需要在每个结点收集结果&#xff0c;其余在叶子结点收集结果 using namespace std; vector<vector<int>>ans; vector<int>combine; void backtracking(int index,vector&…...

Pyecharts之图表组合与布局优化

在数据可视化中&#xff0c;我们经常需要将多个图表组合在一起&#xff0c;以展示不同维度的数据或者进行对比分析。同时&#xff0c;合理的布局能够提升图表的可读性和用户体验。Pyecharts 提供了强大的组件和方法&#xff0c;让我们可以轻松实现图表的组合和布局优化。本篇将…...

代码随想录训练营第五十六天| 108.冗余连接 109.冗余连接II

108.冗余连接 题目链接&#xff1a;卡码网题目链接&#xff08;ACM模式&#xff09; (opens new window) 讲解链接&#xff1a;代码随想录 并查集可以解决什么问题&#xff1a;两个节点是否在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 引自代码随想录&#xff…...

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件...

二叉搜索树中的搜索(力扣700)

首先介绍一下什么是二叉搜索树。 二叉搜索树是一个有序树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉…...

社区养老服务平台的设计与实现(代码+数据库+LW)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…...

高速光模块中的并行光学和WDM波分光学技术

随着AI大模型训练和推理对计算能力的需求呈指数级增长&#xff0c;AI数据中心的网络带宽需求大幅提升&#xff0c;推动了高速光模块的发展。光模块作为数据中心和高性能计算系统中的关键器件&#xff0c;主要用于提供高速和大容量的数据传输服务。 光模块提升带宽的方法有两种…...

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…...

浅谈在AI时代GIS的发展方向和建议

在AI时代&#xff0c;GIS&#xff08;地理信息系统&#xff09;的发展正经历着深刻的变革&#xff0c;随着人工智能技术的进步&#xff0c;GIS不再仅仅是传统的地图和空间数据处理工具&#xff0c;而是向更加智能化、自动化、精准化的方向发展。作为一名GIS开发工程师&#xff…...

【25考研】中科院软件考研复试难度分析!

中科院软件复试不需要上机&#xff01;且对专业综合能力要求较高&#xff01;提醒同学一定要认真复习&#xff01; 一、复试内容 二、参考书目 官方并未明确给出&#xff0c;建议同学参考初试书目&#xff1a; 1&#xff09;《数据结构&#xff08;C语言版&#xff09;》严蔚…...

【2024年华为OD机试】 (A卷,200分)- 计算网络信号、信号强度(JavaScriptJava PythonC/C++)

一、问题描述 题目解析 问题描述 我们有一个 m x n 的二维网格地图,每个格子可能是以下几种情况之一: 0:表示该位置是空旷的。x(正整数):表示该位置是信号源,信号强度为 x。-1:表示该位置是阻隔物,信号无法直接穿透。信号源只有一个,阻隔物可能有多个。信号在传播…...

SpringBoot整合Swagger UI 用于提供接口可视化界面

目录 一、引入相关依赖 二、添加配置文件 三、测试 四、Swagger 相关注解 一、引入相关依赖 图像化依赖 Swagger UI 用于提供可视化界面&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactI…...

C语言:数据的存储

本文重点&#xff1a; 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 数据类型结构的介绍&#xff1a; 类型的基本归类&#xff1a; 整型家族 浮点家族 构造类型&#xff1a; 指针类型&…...

OpenFGA

1.什么是OpenFGA Fine-Grained Authorization 细粒度关系型授权 2.什么是细粒度授权 细粒度授权 (FGA) 意味着能够授予特定用户在特定资源中执行特定操作的权限。 精心设计的 FGA 系统允许您管理数百万个对象和用户的权限。随着系统不断添加对象并更新用户的访问权限&#…...

Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比

前言 在现代微服务架构和分布式系统中&#xff0c;消息队列作为解耦组件&#xff0c;承担着重要的职责。它不仅提供了异步处理的能力&#xff0c;还能确保系统的高可用性、容错性和扩展性。常见的消息队列包括 Kafka、RabbitMQ 和 RocketMQ&#xff0c;其中 Kafka 因其高吞吐量…...