社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

复现深度学习模型,性能低了怎么办?

e论文 • 昨天 • 10 次点击  

作者

姜明 

中国科学技术大学管理科学与工程专业在职博士生,就职于中国邮政储蓄银行总行软件研发中心,主要研究方向是大数据技术及其应用。

一、模型复现重要性

模型复现涉及到科学研究的可靠性、可复用性和可推广性。模型复现的好处有以下几点:

1. 模型复现可以帮助我们检验和验证已有的研究成果,发现其中的问题和不足,提高研究的质量和水平。

2. 模型复现可以帮助我们学习和掌握前沿的方法和技术,提高自己的理论和实践能力,拓展自己的知识面和视野。

3. 模型复现可以帮助我们利用已有的资源和成果,进行创新和改进,提出新的问题和解决方案,推动研究的进步和发展。

模型复现的挑战和建议也有很多,比如:

1. 模型复现的难度和复杂度取决于模型的类型、规模、结构、参数等因素,不同的模型可能需要不同的数据、环境、工具、技能等条件,我们需要根据具体的情况选择合适的模型和复现方法。

2. 模型复现的可复现性受到很多因素的影响,比如随机种子、数据增强、多线程计算、超参数设置等。要尽可能保证模型的可复现性,需要对这些因素进行控制或固定,以减少随机性的影响。

3. 模型复现的结果和评价也需要注意,不同的模型可能有不同的目的和应用,不同的数据集和评价指标可能反映不同的方面。我们需要根据自己的研究问题和背景,选择合适的模型和评价方法,或者对模型进行错误分析,找出模型的优劣和改进的方向。


二、模型复现,受哪些因素的影响?

1. 模型的可复现性受到很多因素的影响,比如随机种子,数据增强,多线程计算,超参数设置等。要尽可能保证模型的可复现性,需要对这些因素进行控制或固定,以减少随机性的影响。

2. 模型的性能也取决于数据集的质量和数量,以及模型的结构和复杂度。如果数据集不足或者噪声太多,模型可能会出现欠拟合或过拟合的问题。如果模型太简单或者太复杂,也可能无法很好地拟合数据。你可以尝试增加数据集的规模和多样性,或者使用数据增强的技术来提高数据的质量。你也可以调整模型的结构和参数,或者选择另一种性能更好的模型架构。

3. 模型的性能也和评价指标有关,不同的指标可能反映不同的方面。如果你的模型在某些指标上表现很差,但是在其他指标上表现很好,那么可能说明你的模型对某些任务或场景更适合,或者你的模型有一些特定的优势或劣势。你可以根据你的模型的目的和应用,选择合适的指标来评价你的模型,或者对你的模型进行错误分析,找出模型的不足和改进的方向。


三、模型复现,性能还是低了怎么办?


有一种解释:

对于 AI 模型,用不同的显卡跑,结果很大可能不一样。求偏导的结果可能是不准确的,比如有有限循环小数,然后由于每个显卡精度不一样,导致反向传播和梯度下降的精度不一样。试想一下深度学习中常见的两种问题:梯度爆炸和梯度消失。它们都与神经网络的梯度更新有关。梯度是指损失函数对于网络参数的偏导数,它反映了参数变化对于损失函数的影响。梯度下降是一种优化算法,它根据梯度的方向和大小,不断地调整参数,使得损失函数达到最小值。

梯度爆炸是指在反向传播过程中,梯度的值变得非常大,超过了一个阈值,导致参数的更新不稳定,甚至出现NaN或者溢出的情况。梯度爆炸的原因可能有以下几点:

1.网络层数过深,导致梯度在链式法则中不断累乘,如果梯度的绝对值大于1,那么梯度会呈指数级增长。

2.权重初始化的值过大,导致梯度的放大效应,如果权重的绝对值大于1,那么梯度会随着权重的增加而增加。

3.损失函数的值过大,导致梯度的放大效应,如果损失函数的值远大于1,那么梯度会随着损失函数的增加而增加。

梯度消失是指在反向传播过程中,梯度的值变得非常小,接近于0,导致参数的更新缓慢或者停滞,甚至无法收敛。梯度消失的原因可能有以下几点:

1.网络层数过深,导致梯度在链式法则中不断累乘,如果梯度的绝对值小于1,那么梯度会呈指数级衰减。

2.激活函数的选择不合适,导致梯度的衰减效应,如果激活函数的导数的绝对值小于1,那么梯度会随着激活函数的变化而减小。比如,sigmoid函数和tanh函数在饱和区的导数接近于0,因此容易导致梯度消失。

3.权重初始化的值过小,导致梯度的衰减效应,如果权重的绝对值小于1,那么梯度会随着权重的减小而减小。

模型复现的难点在于,原作者要知道怎么保证模型的确定性,并且公开这部分他的操作。模型复现者要知道怎么保证确定性,并且完全参照这部分操作。

随机种子,数据集处理,数据集的shuffle的确定性,参数初始化的一致性。这些都是基本操作,就是做研究写代码的基本素养。

余下就是容易被人忽略的deterministic和分布式训练时的顺序冲突问题。而这部分框架的文档里都有。我一直使用的都是TensorFlow2,其中单机的确定性,多机分布式的确定性,随机发生器在单机多机的时候的规则都有操作指南。

有了这些操作,就是可以让硬件产生一样的结果的。

一个不一样,微乎其微,但是 1000 多万个参数,都有一点区别,一点点小小的变化会导致最后发生一个很大的变化。


四、解决方案


用复现的结果,一定要记住,保存证据,保存你跑出来的模型文件,然后写论文的时候记住,标明一下。

比如:原论文评价指标结果是:score=91,复现后score= 89(它的模型,他论文标明的参数,最好是相同的显卡)。

那我们的模型只要达到score= 90 就行了。这个 90 不需要你和他的参数一致,通过调参来找到自己模型的最优值跟他对比,比如它的 lr =0.05,我们可以是lr=0.005。


关于e论文

“e论文”微信公众号由国内外在职教师组成,是交流科研和论文写作经验的一线平台,已推出250+篇原创推文每周持续更新,举(协)办了4个在线讲座。非常骄傲我们原创的科研日历被9万+教师和研究生所关注。如果喜欢,请点赞、关注和分享。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/181598
 
10 次点击