神经网络与深度学习速成

整体架构

神经网络和深度学习的整体架构包括了各种组件和层次,用于构建、训练和应用复杂的深度学习模型。下面是它们的一般架构

  1. 输入层(Input Layer)

    输入层接受原始数据,例如图像、文本、声音等,将其转换为神经网络可处理的格式。对于图像数据,可以是像素值;对于文本数据,可以是单词嵌入向量;对于声音数据,可以是声谱图等。输入层通常具有与输入数据的特征数量相对应的节点。

  2. 隐藏层(Hidden Layers)

    隐藏层是神经网络的核心组成部分,它包含多个神经元(或节点),并通过权重连接到前一层的神经元。深度学习中的深度来自于具有多个隐藏层。隐藏层的任务是学习数据的特征表示。常见的隐藏层类型包括全连接层、卷积层、循环层等。

  3. 激活函数层(Activation Function Layer)

    激活函数层用于引入非线性性质到神经网络中,允许网络学习复杂的函数。常见的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid、Tanh等。激活函数在每个神经元上应用,将线性加权和映射到非线性输出。

  4. 输出层(Output Layer)

    输出层产生模型的最终预测结果,其结构和激活函数取决于具体任务。例如,对于二元分类任务,输出层可能包括一个Sigmoid激活函数;对于多类分类任务,可能使用Softmax激活函数;对于回归任务,输出层通常是一个线性层。

  5. 损失函数(Loss Function)

    损失函数用于度量模型的性能,它比较模型的预测结果和实际标签,并计算损失值。训练过程的目标是最小化损失函数。不同的任务(分类、回归等)和网络架构可能需要不同的损失函数。

  6. 优化器(Optimizer)

    优化器是用于调整模型参数以减小损失的算法。常见的优化算法包括梯度下降(Gradient Descent)、Adam、RMSprop等。优化器在反向传播过程中更新模型的权重和偏差。

  7. 反向传播(Backpropagation)

    反向传播是训练神经网络的核心算法。它通过计算损失函数相对于模型参数的梯度,然后使用优化器来更新参数。这一过程通过前向传播(计算预测值)和反向传播(计算梯度和参数更新)迭代执行,直到损失最小化。

  8. 批处理(Batching)

    在训练中,通常不是一次处理整个数据集,而是将数据分为小批次进行处理。批处理有助于加速训练过程和提高计算效率。

  9. 正则化(Regularization)

    正则化技术,如L1和L2正则化,可用于减小模型的过拟合风险。正则化项通常添加到损失函数中。

  10. 超参数调整(Hyperparameter Tuning)

    超参数是在训练前需要设置的参数,如学习率、批处理大小、隐藏层节点数等。调整超参数是优化模型性能的重要步骤。

  11. 模型评估(Model Evaluation)

    训练完成后,需要使用验证集或测试集来评估模型的性能。评估指标根据具体任务选择,如准确度、损失值、F1分数等。

  12. 应用(Deployment)

    训练完成的模型可以部署到生产环境中,用于实际应用,如图像识别、自然语言处理、推荐系统等。

整体架构包括了从数据准备和模型构建到训练和部署的完整流程。不同的深度学习任务和模型类型会有不同的变体和组件,但上述架构提供了一般指导。

简单简介

  1. 数据准备通常是项目的起点,但可以在整个项目周期中多次迭代。你可能需要清理、标记、分割和标准化数据。
  2. 构建模型的顺序通常是定义输入和输出层,选择合适的隐藏层和激活函数,然后初始化模型权重。
  3. 训练模型的过程是迭代的,它包括前向传播、计算损失、反向传播、参数更新等步骤。训练通常会持续多个周期,其中模型参数逐渐收敛。
  4. 模型评估可以在任何时候进行,但通常在训练后进行,用于评估模型的性能。
  5. 超参数调整可能需要多次进行,以找到最佳的超参数设置。
  6. 部署模型通常是在模型训练和评估之后的最后步骤,将模型应用于实际场景。

学习+个人理解,不一定正确!

前向传播(完成计算损失)

得分函数

W为权重,x在下面例子中表示每个像素点的值,b表示微调,最终得到得分

Snipaste_2023-10-14_23-13-30

Snipaste_2023-10-14_23-34-13

损失函数

损失函数有许多,这个以一个举例

数据损失为通过得分函数得到得分值后计算损失,max中相减的两项第一项为判断图片不是正确类得分(如图片是猫,那么这一项就是判断为狗的得分),第二项为判断图片是正确类得分max运算完之后求和(如有三个分类,就有三个得分,那么两个错误类的得分分别与正确类得分做同样操作并相加),后面的正则化惩罚项权重参数带来的损失,正则化惩罚项的第一个参数表示容忍程度(防止过拟合)

Snipaste_2023-10-14_23-45-11

参数初始化

参数初始化设计到初始化神经网络的权重的偏重参数

通常使用随机策略来进行参数初始化

W = 0.01 * np.random.randn(D, H)

正则化(通常添加在损失函数中)

正则化的本质作用是防止过拟合、提高模型泛化能力,有助于简化模型。

常见的正则化技术包括L1正则化、L2正则化、Dropout、权重共享等。

如上面解释一样,惩罚力度是正则化项的系数,决定了正则化在模型训练中的强度,它是一个超参数(超参数(Hyperparameters)是一种特殊的参数,它们不是由模型自动学习而是由人为设置的。超参数控制了模型的训练和学习过程,包括模型的结构、学习率、迭代次数、批处理大小等。),较大的惩罚力度会增加正则化的影响,使模型更倾向于简单的参数设置,从而减小过拟合的风险,但可能损害模型的性能。较小的惩罚力度允许模型更复杂,但可能增加过拟合的风险。

过拟合

过拟合是神经网络非常头疼的一个大问题

前面提到了可以通过正则化解决,就是加一个正则化惩罚项,这里还有一个解决方法,就是DROP-OUT(传说中的七伤拳)

Dropout是一种随机丢弃部分神经元的方法,可以降低神经网络的复杂性,减轻过拟合。(在训练过程中迭代的过程中随机丢弃一部分神经元)

整体流程

回归任务:得分值计算损失

分类任务:概率值计算损失

Snipaste_2023-10-15_00-06-46

反向传播(更新W权重)

Snipaste_2023-10-15_23-39-28

Snipaste_2023-10-15_23-42-42

Snipaste_2023-10-15_23-45-19

Snipaste_2023-10-15_23-47-13

Snipaste_2023-10-15_23-47-39

输入层、输出层、隐藏层

神经网络架构

这里的input layer其实就是数据,也就是得分函数中的x,这里可以理解为3个特征(粉色框中3个圆圈),经过一系列的变化,就是乘以W(权重)就可以得到hidden layer1(隐层1),这里变化得到hidden layer1是为了让计算机能更好的理解数据特征,但是这个为什么要这么变化是很难解释的,但是反向传播得出的结果就是这样能够更好地让计算机理解这个特征(计算得到),hidden layer2就是hidden layer1得到的特征再加工、再利用、再转换

全连接:其实就是图片中展示的一样每个点和下一层的每个点都有连接,当然这是展示出来的,真实就是经过某种变化罢了,不会存在实体的这个线(也就是权重参数矩阵就相当于连接)

非线性:就是在得到每层后都需要使用非线性函数去映射一个值,如max()就是一个非线性变换,然后再进行运算得到下一个隐层

神经元:神经元通常位于神经网络的隐藏层,在图中的表示其实就是每个层的圆圈,输入层的神经元数量等于数据的特征数量(正常情况神经元个数越多越好,但是需要考虑过拟合的问题, 神经元个数会导致过拟合问题,过拟合会使效果不好)

Snipaste_2023-10-15_23-52-51

Softmax分类器

Softmax函数(归一化)常用于多类别分类问题,常用于多层感知器和深度神经网络的输出层,(上一层的输出层就是下一层的输入层)

这里的归一化是根据得分计算得到一个概率值,这个概率值就是根据这个权重值计算得到当前图片是某个分类的概率,后面是根据计算值计算损失值(应该理解为另一种计算损失值的函数),这里log取对数,传入的值是0到1的(因为归一化得到的值是0到1),加负号把负值转为正值

基本都是用对数去做损失函数(用工具包也需要手写损失函数)

Snipaste_2023-10-14_23-48-34

Snipaste_2023-10-14_23-58-36

激活函数

激活函数(Activation Function)是神经网络中的一个关键组成部分,它用来确定神经元的输出是否应该被激活(激活值为1)还是不激活(激活值为0),以及在一定程度上控制神经元的输出范围。激活函数的作用是引入非线性性,使神经网络能够学习和表示更加复杂的函数。(就是前面提到的每层得到的结果进行非线性变换)

激活函数通常应用于神经元的输入(加权和)上,然后将结果传递给下一层神经元或输出层。不同的激活函数具有不同的数学形式和性质,以下是一些常见的激活函数:

  1. 阶跃函数(Step Function):阶跃函数是一种最简单的激活函数,当输入大于某个阈值时激活,否则不激活。它将输入分为两个类别(0和1),通常用于二元分类问题。然而,阶跃函数在神经网络中的应用有限,因为它不是连续可导的。
  2. Sigmoid函数:Sigmoid函数是一种常用的激活函数,将实数输入映射到 (0, 1) 之间。它具有S形曲线,用于二元分类和输出概率估计。Sigmoid函数是连续可导的,但在深度神经网络中可能存在梯度消失问题。(可以从它的函数图像看出,当x的负值过小或者正值过大,图像基本就是平的了,计算为0那么在反向传播过程中继续往后传也为0,这个就是梯度消失)
  3. Tanh函数:Tanh函数是双曲正切函数,将实数输入映射到 (-1, 1) 之间。与Sigmoid函数相似,Tanh函数具有S形曲线,但它的输出范围在 -1 到 1 之间,使其可以处理正负权重的输入。
  4. ReLU函数(Rectified Linear Unit):ReLU函数是一种非常常见的激活函数,将负数输入置为零,而对正数输入则保持不变。它具有线性关系(具有线性关系但是整体是非线性的),使得训练神经网络更加高效,并减轻了梯度消失问题。(当前主体)
  5. Leaky ReLU函数:Leaky ReLU是ReLU的变种,它在负数输入时不是完全置为零,而是乘以一个小正数。这有助于解决ReLU可能导致的神经元“死亡”问题。
  6. Softmax函数:Softmax函数常用于多类别分类问题,将多个输入映射到一个概率分布上,确保所有输出的和为1。它通常用于神经网络的输出层,用于将原始得分转化为类

数据预处理

Snipaste_2023-10-16_21-50-39

标准化操作(图中例子)

第一步(中心化):实际坐标值减去均值,得到原点为中心对称的效果

第二步(各个维度的放缩或者扩充):实际坐标值除以标准差