这次的任务是:实现一个基于深度学习的Deepfake检测模型。
Part1 深度学习简介
深度学习使用神经网络来模拟人脑的学习方式。神经元模型类似生物学的神经元,包含输入(树突)、输出(轴突)与计算功能(细胞核)的模型。
通常来说,深度学习依赖于多层神经网络,每一层的神经元接受前一层的输出,通过权重、激发函数来计算输出值,传递到下一层神经元。一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
激活函数
Activation Functions | Cheatsheet | Complete Overview with Code | Kagglehttps://www.kaggle.com/discussions/getting-started/429326Activation Functions — ML Glossary documentationhttps://ml-cheatsheet.readthedocs.io/en/latest/activation_functions.html
激活函数通过计算加权并可能添加偏差来决定神经元是否被激活。激活函数的目的是将非线性引入神经元的输出中,最重要的是激活函数将非线性引入网络。
y = α(∑(权重∗输入) + 偏置) 其中 α 是激活函数
一些典型的激活函数有Sigmoid Function、Threshold、Hard sigmoid、Sigmoid-Weighted Linear Units、dSiLU、Tanh、Softmax、RELU等,详见上面两个链接,第一个较为详细地讲述了这些激活函数的样式和完整代码描述,后一个主要包含不同激活函数的优缺点分析。
深度学习
深度学习是由神经元模型层层堆叠起来的网络模型,最底层接受数据,每一层处理下层的数据,提取更高级别的特征,最后在顶层输出结果。这种多层次的网络结构,被称为神经网络。
现在已经有各种优化技术和算法方法,在教程中列举出的有:
激活函数改进
使用更有效的激活函数,或者调整一些参数。比如说:
ReLU相比之前的 Sigmoid/tanh 的优点有:
1)不会发生梯度消失问题。Sigmoid函数在 x>0 会发生梯度消失问题,造成信息损失,从而无法完成深度网络的训练。而 ReLU 函数当 x>0 为线性结构,有固定的梯度,不会消失。
2)ReLU激活函数在 x<0 时会输出为0(失活),这可以造成网络的稀疏性。这样可以很好的模拟人脑神经元工作的原理,且可以减少参数间的相互依赖,缓解了过拟合问题的发生。
3)Sigmoid函数复杂,计算量大(前向传播+反向传播求导),速度慢;而ReLU函数简单,计算量小,速度快。
权重初始化方法
正则化技术
机器学习中的一个普遍问题是调整给定模型的参数,使其对训练数据和新的数据能够有更好的鲁棒性。旨在减少不属于训练集的数据上的误差的算法的集合被称为正则化技术。
梯度下降的变种Gradient Gescent Optimization Algoritms
梯度下降法(Gradient Descent)是一种常用的优化算法,主要用于最小化一个函数的值。它通过在函数梯度(导数)指向下降的方向上进行迭代,逐步接近函数的最小值。在机器学习和深度学习领域,梯度下降法是一种常用的优化方法,用于最小化损失函数。梯度下降法的变种,包括梯度下降法、随机梯度下降法(Stochastic Gradient Descent, SGD)、小批量梯度下降法(Mini-batch Gradient Descent, MGD)以及动态梯度下降法(Adagrad)等。可参考这篇博客,有较为详细的论述
梯度下降法的变种:从基础到高级-CSDN博客https://blog.csdn.net/universsky2015/article/details/135800291
新的网络结构
如卷积神经网络、循环神经网络、图神经网络等,可以从这篇博客中获取更详细的介绍
神经网络架构:最新进展和未来挑战_神经网络最新进展-CSDN博客https://blog.csdn.net/qq_43546721/article/details/132496428
机器学习与深度学习
区别
机器学习通常使用相对简单的算法来处理数据,如线性回归、决策树、随机森林等,通过数据进行训练,提取出规律,在此基础上能进行预测或决策。数据量的增加、算法的优化能够改进其性能。
而深度学习有通过神经网络自动学习的特征,能够处理更复杂的问题,比如图像识别、自然语言处理等。
传统的机器学习算法需要人工设计特征,较为麻烦,深度学习能够自动从原始数据中学习到有用的特征,并可以实现端到端学习(从原始数据到最后总输出)无需中间插足。
教程直播老师推荐的深度学习框架是PyTorch,是在Torch基础上用 python语言进行封装和重构打造而成的。PyTorch优点是上手快:掌握Numpy和基本深度学习概念即可上手,比较适合初学者。
Part2 深度学习的训练
一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
神经网络的训练过程通常包括以下几个步骤:
数据的预处理-定义损失函数-反向传播算法-优化算法-验证集和测试集。
比较经典的优化算法有梯度下降算法、Adam、Adagrad等。
梯度下降算法
梯度下降优化算法综述_梯度下降算法-CSDN博客https://blog.csdn.net/google19890102/article/details/69942970梯度下降法是最著名的优化算法之一,也是迄今优化神经网络时最常用的方法。它的原理是:损失函数的梯度指向函数增长最快的方向。所以我们只要沿着梯度的反方向调整模型参数,可以减少损失函数的值。(梯度是损失函数关于模型参数的导数,它指示了参数的调整方向,以减少损失函数的值。)
这里有个技巧:当数据集非常大时,一次性处理可能会导致内存不足或计算缓慢,此时可以将数据分成小批量,然后更频繁地更新模型参数,这使训练过程更加高效。
Adam优化器
Adam优化器(理论、公式、代码)-CSDN博客https://blog.csdn.net/m0_48923489/article/details/136863726#:~:text=Adam%EF%BC%88Adaptive%20Moment%20Estimation%EF%BC%89%E6%98%AF%E4%B8%80%E7%A7%8D%E5%B9%BF%E6%B3%9B%E4%BD%BF%E7%94%A8%E7%9A%84%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95%EF%BC%8C%E7%94%B1%20Diederik%20P.%20Kingma%20%E5%92%8C,Jimmy%20Ba%20%E5%9C%A8%202014%20%E5%B9%B4%E6%8F%90%E5%87%BA%E3%80%82%20%E5%AE%83%E7%BB%93%E5%90%88%E4%BA%86%E5%8A%A8%E9%87%8F%E6%B3%95%EF%BC%88Momentum%EF%BC%89%E5%92%8C%20RMSProp%20%E7%9A%84%E6%80%9D%E6%83%B3%EF%BC%8C%E6%97%A8%E5%9C%A8%E9%80%9A%E8%BF%87%E8%AE%A1%E7%AE%97%E6%A2%AF%E5%BA%A6%E7%9A%84%E4%B8%80%E9%98%B6%E7%9F%A9%E4%BC%B0%E8%AE%A1%E5%92%8C%E4%BA%8C%E9%98%B6%E7%9F%A9%E4%BC%B0%E8%AE%A1%E6%9D%A5%E8%B0%83%E6%95%B4%E6%AF%8F%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84%E5%AD%A6%E4%B9%A0%E7%8E%87%EF%BC%8C%E4%BB%8E%E8%80%8C%E5%AE%9E%E7%8E%B0%E6%9B%B4%E9%AB%98%E6%95%88%E7%9A%84%E7%BD%91%E7%BB%9C%E8%AE%AD%E7%BB%83%E3%80%82Adam(Adaptive Moment Estimation)是一种广泛使用的深度学习优化算法,它结合了动量法(Momentum)和 RMSProp 的思想,旨在通过计算梯度的一阶矩估计和二阶矩估计来调整每个参数的学习率,从而实现更高效的网络训练。
AdaGrad优化器
AdaGrad优化器(理论、公式、代码实现)-CSDN博客https://blog.csdn.net/m0_48923489/article/details/136854257
AdaGrad(Adaptive Gradient Algorithm)是一种自适应学习率的梯度下降算法。这个算法主要是为了解决标准的梯度下降算法中学习率一成不变的问题。在标准的梯度下降算法中,如果学习率过大,可能会导致算法在最小值附近震荡而不收敛;如果学习率过小,又会导致收敛速度过慢。AdaGrad算法通过自适应调整每个参数的学习率,尝试解决这个问题。
Part3 深度学习与迁移学习
这篇博客基于李宏毅机器学习,较为详细地有比较地介绍了迁移学习。
就像学会骑自行车,就比较容易学摩托车,学会C语言,就比从0开始更容易学习其他语言,迁移学习就相当于机器的举一反三。
迁移学习是指将已经在一个任务上学习到的知识或模型应用到另一个任务中的过程。其基本原理是通过利用源领域(source domain)上学习到的知识,来帮助目标领域(target domain)上的学习任务。迁移学习可以分为以下几种类型:
特征提取:将源领域上训练好的模型的中间层输出作为特征提取器,然后在目标领域上训练新的分类器。
微调(Fine-tuning):将源领域上训练好的模型的参数作为初始参数,在目标领域上继续训练模型。
共享参数:将源领域和目标领域的数据同时输入模型,共享部分参数进行训练。
迁移学习的实现方法
教程中介绍的微调,是深度学习中一种有效的迁移学习策略,它允许我们利用预训练模型对特定任务进行优化。其基本原理是将源领域上训练好的模型的参数作为初始参数,在目标领域上继续训练模型。
微调通常开始于一个预训练的模型,这个预训练模型已经学习了丰富的特征表示,且特征在广泛的领域内通用
这里教程推荐了ImageNet数据集。ImageNet 包含超过1400万张注释过的图像,这些图像分布在超过2.2万个类别中。它的规模之大使得它成为深度学习模型训练和评估的理想数据集。ImageNet 数据集中的图像包含了各种场景、物体、背景和遮挡情况,这为算法提供了极大的挑战。这种多样性使得在 ImageNet 上训练的模型能够学习到鲁棒的特征,从而在现实世界应用中表现良好。
ImageNethttps://www.image-net.org/
接着用三个步骤将此模型适配到新的任务目标上:
- 替换模型的输出层,以匹配目标任务的类别数量和类型
-
【可做可不做】我们冻结预训练模型中的大部分层,这样可以防止在微调过程中这些层学到的通用特征被破坏
-
使用目标任务的数据集对模型进行训练,在这个过程中,我们会用梯度下降等优化算法更新模型的权重,从而使模型能够更好地适应新的任务。
举个例子就是
import timm
model = timm.create_model('resnet18', pretrained=True, num_classes=2)
model = model.cuda()
timm.create_model('resnet18', pretrained=True, num_classes=2)
这行代码就是加载了一个预训练的ResNet-18模型,其中pretrained=True
表示使用在ImageNet数据集上预训练的权重,num_classes=2
表示模型的输出层被修改为有2个类别的输出,以适应二分类任务(例如区分真实和Deepfake图像)。通过model = model.cuda()
将模型移动到GPU上进行加速。
Part4 常见的图像分类网络
随着深度学习的发展,已经设计出许多不同的卷积神经网络(CNN)架构来提高图像分类的准确率。在此提供一些内容详实,角度比较全面的博客。
AlexNet
真正打破机器学习和传统特征提取方法限制的深度神经网络
- 提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)
- 使用Batch Normalization加速训练(丢弃dropout)
对于ImageNet历史上的各种网络而言,可以说EfficientNet在效果上实现了碾压.
EfficientNet网络详解-CSDN博客https://blog.csdn.net/qq_37541097/article/details/114434046EfficientNet的复合缩放方法的直觉在于,如果输入图像更大,网络就需要更多的层来增加感受野,以及更多的通道来捕捉更细粒度的模式。EfficientNet的架构本质上并不复杂。基本的EfficientNet-B0网络作为后续缩放的基础。作者指出,他们使用NAS来构建基本网络,利用了多目标搜索来同时优化网络的准确性和计算效率。