关于大模型学习中遇到的4

来源:网络

相关学习可查看文章:Transformer and Pretrain Language Models3-4​​​​​​​

什么是MLP?

MLP是多层感知器(Multilayer Perceptron)的缩写,

多层感知机(MLP)是一种人工神经网络(ANN)的一种,也称为多层前馈网络(MLFN)、深度前馈神经网络(DFNN)、回归神经网络(RNN),是机器学习中一种有监督学习算法。MLP由输入层、输出层和一个以上的隐藏层构成,每一层由一组神经元组成,隐藏层可有多个,当然也可以没有。

MLP的输入信号从输入层传入第一个隐藏层,神经元从输入层接收输入信号,通过局部激活函数(也称激励函数)来运算,激励函数可以保证每一层输出信号经过变换以后不管输入信号多大,样本空间映射都处于一个可控制的范围内,决定了输出信息的范围并维持其唯一性,从而保证模型的准确性和稳定性以及可学习性。

隐藏层和隐藏层之间采用权重变换,权重对模型的性能至关重要,应尽量使网络能得到良好的收敛效果。MLP模型的权重表征是一个非线性系统,因此利用梯度下降法来训练权重参数,求解一定的损失函数或者误差函数。训练过程中,不断更新权重(更新权重不需要手动设置,而是自动实现),使得网络的误差最小(即损失函数最小),让网络能够按照设定的目标达到预期的性能。

MLP在机器学习任务中有很强的适用性,将其用于分类任务的时候,使用的激励函数一般选择sigmoid函数等单位阶跃函数,sigmoid函数可以将输入信号压缩映射到(0,1),然后输出层使用概率输出,根据概率确定分类结果,也可以使用多个sigmoid函数,以及sigmoid函数组合实现多分类。另一个更简单的方法是单层神经网络(SLFN),可以通过修改激励函数的函数形式以及网络结构来实现不同的训练方法,使MLP能够处理非线性特征数据。

MLP由于其好用性、性能稳定,有几十年的历史,被广泛地应用在分类任务、回归任务、故障诊断任务(发电机状态监控)以及贝叶斯估计等方面。MLP具有计算复杂度高、训练耗时长,训练过程中模型过拟合,解决方案包括Dropout、L1正则化和L2正则化等众多准确性性能优化技术。


什么是有监督学习?

机器学习范式

有监督学习是一种机器学习范式,它涉及使用带标签的数据集来训练模型,以便能够根据输入数据产生正确的输出。具体来说:

  • 监督学习的目标是根据给定的输入数据,学习到一个模型,使得该模型能够在新的输入数据到来时,准确地预测出相应的输出。
  • 这种学习方式依赖于外部提供的“教师”或者已知正确输出结果的资源,通过对这些资源的运用,系统可以学习和调节自己的参数。
  • 监督学习的学习过程包括从标注数据中学习预测模型,这些标注数据代表了输入输出之间的关系。模型本身则是定义在特征空间上的,并且通常用于处理连续或离散的输入输出变量。3
  • 监督学习可以分为不同的类型,如回归问题和分类问题,这取决于输入输出变量的类型。此外,如果输入输出变量是序列,那么还可以考虑标注问题。
  • 在监督学习中,通常会假设输入与输出遵循某种联合概率分布,这是监督学习关于数据的基本假设之一。

综上所述,有监督学习是一种通过使用标记的训练数据来学习模型的方法,目的是实现对新数据的有效预测和分类。

注:通俗来说,有监督学习就是双语教学,一边说英文一边用中文表达这句英文的意思,让你能够一下就理解这句英文在讲什么,这个中文就是给的对应的一个标签,能立即明白。而无监督学习就是全英文教学,需要靠自己去理解,并没有给出对应的标签。


什么是正则化?

正则化是一种用于机器学习的技术,特别是在处理过拟合问题时非常有效。它的主要思想是通过在模型的损失函数中添加额外的正则化项(如L1范数或L2范数)来控制模型的复杂度,从而避免模型过度拟合训练数据。这种方法可以提高模型的泛化能力和稳定性,确保模型能够在未知的数据上进行良好的预测。

正则化可以通过不同的方式实现,例如通过增加模型的权重衰减(L1正则化),或者在训练过程中对输入数据执行标准化操作(L2正则化)。这些正则化方法有助于找到既能较好拟合训练数据又能较少过拟合的模型参数。此外,正则化还可以通过移除冗余特征来实现,即将那些对模型贡献较小的特征从模型中去除,以此来简化模型并提高其预测能力。

总结来说,正则化是一种重要的机器学习技巧,它通过对模型施加额外的限制来克服过拟合问题,同时保持或提高模型的预测性能。


什么是ResNet?

ResNet是一种用于​​​​​​​图像识别的深度残差网络,是卷积神经网络的一种重要模型,ResNet开创性地引入了残差连接,解决了深层网络在训练过程中梯度弥散的问题,使深层模型的训练更加简便,同时也验证了随着网络层次的加深模型能够获得更好的性能

模型结构

整体架构

ResNet有许多模型:如ResNet34, ResNet50,不过这些基本上都是根据层数来命名的,ResNet网络模型一般是开始有一层卷积层来提取图像特征,再经过池化,然后进入残差块中(ResNet的主要结构),最后再经过池化层与全连接层被输出出来,下图是一个ResNet34的模型示意图

关于大模型学习中遇到的4_第1张图片

在这里插入图片描述

残差块

下面是resnet的关键结构——残差块,它由两个卷积层和一个直连通路组成

关于大模型学习中遇到的4_第2张图片

在这里插入图片描述

右侧曲线被称为直连通路,直连通路有助于解决梯度消失的问题,因为此时当神经网络反向传播求权重时,因为这个多项式即使前一部分的梯度消失了,后一部分还能保证梯度的存在

模型特性

  • 直连通路的存在使得模型可以保留原始数据信息,同时可以解决梯度弥散的问题(梯度消失)
  • 可以通过堆叠增加网络层数,不过当模型过于深时,性能可能下降,经原作者试验,在1000层左右的范围内,模型性能随层数增加而增加
  • 直连通路的结果与卷积层结果直接相加,使得模型在训练过程中只需要拟合不同层网络输出值与输入值的残差值,而无需直接拟合网络输出值,大大降低了模型学习的难度,有助于模型的收敛

示例代码

以下是一个简化的 ResNet 模型中,有以下主要组件:

  • 卷积层(Conv2D):模型开始的卷积层,用于提取图像特征。
  • 最大池化层(MaxPool):提取图像中显著的特征
  • 4 个残差块(residual_block):每个残差块包括两个卷积层。
  • 全局平均池化层(GlobalAveragePooling2D):用于将每个通道的特征平均化,产生一个固定大小的输出。
  • 全连接层(Dense):输出层,根据任务的不同可能有不同的神经元数量。
import tensorflow as tf
from tensorflow.keras import layers, Model

def residual_block(x, filters, kernel_size=3, stride=1, conv_shortcut=False):
    shortcut = x

    if conv_shortcut:
        shortcut = layers.Conv2D(filters, kernel_size=1, strides=stride, padding='same')(shortcut)
        shortcut = layers.BatchNormalization()(shortcut)

    x = layers.Conv2D(filters, kernel_size, strides=stride, padding='same')(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)

    x = layers.Conv2D(filters, kernel_size, padding='same')(x)
    x = layers.BatchNormalization()(x)

    x = layers.add([x, shortcut])
    x = layers.Activation('relu')(x)

    return x

def resnet(input_shape, num_classes=10):
    inputs = tf.keras.Input(shape=input_shape)

    x = layers.Conv2D(64, 7, strides=2, padding='same')(inputs)
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    x = layers.MaxPooling2D(3, strides=2, padding='same')(x)

    x = residual_block(x, 64)
    x = residual_block(x, 64)
    x = residual_block(x, 128, stride=2)
    x = residual_block(x, 128)
    x = residual_block(x, 256, stride=2)
    x = residual_block(x, 256)
    x = residual_block(x, 512, stride=2)
    x = residual_block(x, 512)

    x = layers.GlobalAveragePooling2D()(x)
    x = layers.Dense(num_classes, activation='softmax')(x)

    model = Model(inputs, x)

    return model

# 创建ResNet模型
model = resnet(input_shape=(224, 224, 3), num_classes=1000)

# 打印模型概要
model.summary()

什么是残差连接?

残差连接(Residual Connection)是深度神经网络中的一个重要概念,它最初被应用于Deep Residual Learning中,并显著提升了神经网络的性能。这种连接方式也被称为跳跃连接或直连,其核心思想是在神经网络结构中加入一种跨层的连接机制,即将前一层输出作为后续各层的输入的一部分。这样的设计有助于保留信息,避免在信息传递过程中出现梯度消失或梯度爆炸的问题,进而加速模型的收敛。

具体的实现方式是将当前层的输出与前一层输出的叠加相加,形成新的输出,然后将其传入下一层进行计算。数学上,残差连接可以表示为:$y = f(x) + x$,其中$x$代表当前层的输入,$f(x)$代表当前层的输出,而$y$则是包含残差的输出。在向前传播时,整个结构的输出会被直接送入下一层;在反向传播时,由于包含了残差项,梯度的回传能够更有效地更新各个层,进一步优化网络的参数。

残差连接的应用非常广泛,它在许多现代深度神经网络架构中都有所体现,如ResNet和DenseNet等,这些架构都在图像分类和目标检测等领域展现了出色的性能。

你可能感兴趣的:(记录,学习)