unityloverz 发表于 2023-3-8 20:20

为什么神经网络难训练

1.优化(Optimization)目标与训练(Training)目标不一致

在训练神经网络时,我们是在优化一个损失函数(loss function),但我们训练神经网络最终关心的是在测试集上准确性(test accuracy)。 这2者的不一致,导致了经常会出现一些反常的结果,比如:

[*]test loss和test accuracy的不一致。



有时候test loss和test accuracy的变化不一致:有时候test loss增加了,但test accuracy也增加了


[*]过拟合
所以你即便在优化的时候做到了最好(loss很小),也没法确定模型是被训练好了(在测试集上的准确度高)。

1.1 训练结果有随机性,而且无法避免

训练结果的随机性是指每次训练结果都不一致(所以论文中的最终结果经常需要汇报平均值和并标准差)。
这就导致了我们很难比较2个优化算法的最终训练效果(因为随机性,有时候A好,有时候B好),所以很难说“选取某个优化算法,使得我们能训练好一个模型”,指不定还有其它某个优化算法,在某些情况下能训练得更好呢?
这个例子就可以很好说明训练的难点:

2.优化算法和超参数的选择

2.1 在训练神经网络时,经常需要从一大堆优化算法里面选

这几年学术界大概发明了有近百种优化算法。那么问题来了,用哪个优化算法,训练效果最好?


所以为了公平比较各优化算法的结果,需要在一个Benchmark上进行比较(比如MLCommons)。详见第3部分。
2.2 每个优化算法,都有超参数要调




Adma优化算法有4个超参数(有的人把最底下那个\epsilon也算成超参数了)

所以需要一个debugging tools去调,比如Cockpit。
3.Benchmarking Training Algorithms

为了对比一堆优化算法,需要一个Benchmark。
Benchmark is dedicated to answer: How would you decide whether training algorithm A is better than training algorithm B?3.1 难点


[*]我们试图比较2个优化算法的好坏,但其实很难定义什么是“更好”:test accuracy更高?训练速度更快?还是训练结果更鲁棒?
[*]训练结果有很强的随机性,所有难以确定对比结果是否显著:同一组超参数,有时算法A的准确率更高,有时算法B更高。我们可以进行多次训练,并对其进行平均。但是计算成本也会增加。
[*]我们希望算法的“好坏”更通用一些,而不只关心在某一个数据集上的结果。所以需要在多个数据集上比较。
[*]往往训练流程的不同部分之间存在一些相互作用(例如超参数、模型结构),而且很难完全分隔开。
[*]我们无法比较一类算法,只能比较具体的实例。比如SGD加Momentum是一类算法,但我们只能比较ρ = 0.9 and ρ = 0.0这2种实例的结果。
3.2 The Benchmarking Process

为了公平起见,需要从多个维度上比较优化结果,比如不同优化问题(数据集)、fine-tuning方法、learning rate scheduler下的结果。



以这4个维度为例

但有很多维度,而且每个维度下选择太多了,所以一般选择其中具有代表性的来比较。以上面4个为例:



不同优化器



不同数据集



fine-tuning的大小



不同learning rate scheduler

总共有1920种超参数配置(configuration),运行50000多次。最后的结果往往是某个优化算法在某个指标上比较好,但在其它指标上又不好。ADAM在所有指标里都比较靠前,但又不绝对。


所以暂时没有哪个优化算法是”最优“的。

目前没有人有100%的把握能训练好一个大模型,哪怕是谷歌OpenAI的人也不行。但可以肯定是,有钞能力,能探索的范围更多,结果会更好。不过也有一些常用的训练技巧,也有助于加快训练,比如设置learning rate scheduler等等。

4.Reference
页: [1]
查看完整版本: 为什么神经网络难训练