来源:网络
相关学习可查看文章:Transformer and Pretrain Language Models3-4
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正则化等众多准确性性能优化技术。
机器学习范式
有监督学习是一种机器学习范式,它涉及使用带标签的数据集来训练模型,以便能够根据输入数据产生正确的输出。具体来说:
综上所述,有监督学习是一种通过使用标记的训练数据来学习模型的方法,目的是实现对新数据的有效预测和分类。
注:通俗来说,有监督学习就是双语教学,一边说英文一边用中文表达这句英文的意思,让你能够一下就理解这句英文在讲什么,这个中文就是给的对应的一个标签,能立即明白。而无监督学习就是全英文教学,需要靠自己去理解,并没有给出对应的标签。
正则化是一种用于机器学习的技术,特别是在处理过拟合问题时非常有效。它的主要思想是通过在模型的损失函数中添加额外的正则化项(如L1范数或L2范数)来控制模型的复杂度,从而避免模型过度拟合训练数据。这种方法可以提高模型的泛化能力和稳定性,确保模型能够在未知的数据上进行良好的预测。
正则化可以通过不同的方式实现,例如通过增加模型的权重衰减(L1正则化),或者在训练过程中对输入数据执行标准化操作(L2正则化)。这些正则化方法有助于找到既能较好拟合训练数据又能较少过拟合的模型参数。此外,正则化还可以通过移除冗余特征来实现,即将那些对模型贡献较小的特征从模型中去除,以此来简化模型并提高其预测能力。
总结来说,正则化是一种重要的机器学习技巧,它通过对模型施加额外的限制来克服过拟合问题,同时保持或提高模型的预测性能。
ResNet是一种用于图像识别的深度残差网络,是卷积神经网络的一种重要模型,ResNet开创性地引入了残差连接,解决了深层网络在训练过程中梯度弥散的问题,使深层模型的训练更加简便,同时也验证了随着网络层次的加深模型能够获得更好的性能
ResNet有许多模型:如ResNet34, ResNet50,不过这些基本上都是根据层数来命名的,ResNet网络模型一般是开始有一层卷积层来提取图像特征,再经过池化,然后进入残差块中(ResNet的主要结构),最后再经过池化层与全连接层被输出出来,下图是一个ResNet34的模型示意图
在这里插入图片描述
下面是resnet的关键结构——残差块,它由两个卷积层和一个直连通路组成
在这里插入图片描述
右侧曲线被称为直连通路,直连通路有助于解决梯度消失的问题,因为此时当神经网络反向传播求权重时,因为这个多项式即使前一部分的梯度消失了,后一部分还能保证梯度的存在
以下是一个简化的 ResNet 模型中,有以下主要组件:
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等,这些架构都在图像分类和目标检测等领域展现了出色的性能。