shaoheshaohe 发表于 2020-3-10 14:28:00

[深度学习]DL系统之网络训练

本帖最后由 shaoheshaohe 于 2020-4-10 11:18 编辑

https://mp.weixin.qq.com/s/GS3TvS9nZw-CSJds-Aw_ug
北大数学系毕业,UIUC 助理教授 60 页论文综述深度学习优化深度学习优化方法都有哪些?其理论依据是什么?最近,来自伊利诺伊大学香槟分校(UIUC)的研究者孙若愚就此主题写了一篇长达 60 页的综述论文。这篇文章首先讨论了梯度爆炸/消失问题以及更通用的谱控制问题,并讨论了一些实际解决方案,如初始化和归一化方法;其次,本文综述了神经网络训练过程中使用的一般优化方法,如 SGD、自适应梯度方法和分布式方法,还介绍了这些算法的现有理论结果。最后,本文综述了关于神经网络训练的全局问题的研究,包括糟糕的局部极小值上的结果、模式连接(mode connectivity)、彩票假设和无限宽度分析。






https://mp.weixin.qq.com/s/1hxAA6-Mpc2oTXjxondirw
【大型神经网络】显存不够,如何训练大型神经网络?
训100B的模型就先别想了(狗头),先把110M的BERT-base训好上线吧。本文主要介绍模型训练中速度和内存的优化策略,针对以下几种情况:
[*]我明天就要答辩了,今天必须把这十个实验跑完
[*]我的模型有些大,好不容易放到一张卡上,训完一亿样本之前我就可以领N+1了
[*]我想出了一个绝妙的T6模型,却加载不进12GB的卡里,又拿不到今年的best paper了
(以上纯属虚构,如有雷同请赶紧看下文)现实总是残酷的,其实限制大模型训练只有两个因素:时间和空间(=GPU=钱),根据不同情况可以使用的方案大致如下:

1. 梯度累加 Gradient Accumulation如果只有单卡,且可以加载模型,但batch受限的话可以使用梯度累加,进行N次前向后反向更新一次参数,相当于扩大了N倍的batch size。

2. 梯度检查点 Gradient Checkpointing如果只有一张卡,又想训大模型,可以尝试压缩模型所占显存。梯度检查点是一种以时间换空间的方法,通过减少保存的激活值压缩模型占用空间,但是在计算梯度时必须从新计算没有存储的激活值。

3. 混合精度训练 Mixed Precision Training混合精度训练在单卡和多卡情况下都可以使用,通过cuda计算中的half2类型提升运算效率。一个half2类型中会存储两个FP16的浮点数,在进行基本运算时可以同时进行,因此FP16的期望速度是FP32的两倍。举个Gelu的FP16优化栗子:


https://mp.weixin.qq.com/s/fHDL-137qIBOvmUTfyEG8Q
Keras过拟合相关解决办法这种过拟合的处理称为正则化。我们来学习一些最常用的正则化技术,并将其应用于实践中。
       1.缩小神经网络的规模防止过拟合最简单的方法是缩小模型的规模:模型中的可学习的参数数量(由层数和每层节点数决定)。在深度学习中,模型中参数的数量通常被称为模型的能力。直观地说,拥有更多参数的模型具有更强的记忆能力,甚至可以可以轻松地学习训练样本与其目标之间的类似字典的完美对应关系 –一种没有任何泛化能力的对应。但是这样的模型对于分类新的数字样本却没用,新的样本无法在这个“字典”找到它对应的类别。一定要记住这一点:深度学习模型倾向于适应训练数据,但真正的挑战是泛化,而不是只对训练集样本适用就 OK。另一方面,如果网络的记忆资源有限(即参数较少),就不能轻易学习这种映射;因此,为了最小化损失,它必须要压缩信息 – 保留最有用的信息。因此,请记住,模型应该有足够的参数。不幸的是,没有一个公式可以用来确定神经网络正确的层数和层数所含的正确的节点数。我们必须评估一系列不同的网络架构(当然,在我们的验证集上,而不是我们的测试集上),以便为我们的数据找到合适的模型。找到合适的模型大小的一般过程是从相对较少的隐藏层和节点开始,逐渐增加隐藏层的节点数或添加新的层,直到看到验证集损失下降。让我们在电影评论分类网络上试试这个。原来的网络是下面显示的:
让我们尝试用这个更小的网络
图 1.1 显示了原始网络和较小网络的验证损失的比较。点是较小网络的验证损失值,十字是原来较大的网络(记住,验证集损失越小表示模型越好)。
图 1.1 模型大小对验证集损失的影响:尝试一个更小的模型正如你所看到的,较小的网络在六个 epoch 而不是三个 epoch 之后才出现了过拟合。并且从过拟合开始,其性能变差得也更慢些。现在,为了对比,让我们使用一个规模更大的网络 – 远远超过了问题的需求:
图 1.2 模型大小对验证集损失的影响:尝试一个更大的模型图 1.2 显示了与原始网络相比更大的网络模型在验证集的表现。点是较大网络的验证集损失值,十字是原始网络。仅仅一个 epoch 后,更大的网络立即开始过拟合,其验证集损失值也是杂乱的。同时,图 1.3 显示了两个网络的训练集损失值随 epoch 的变化情况。正如你所看到的,更大的网络很快就会把训练集损失训练到接近零。网络越大,训练数据学习的速度就越快(使训练损失很快降低),但是也更容易过拟合(导致训练和验证损失之间的巨大差异)。
图 1.3 模型大小对训练集损失的影响:尝试一个更大的模型      2.权重正则化技术你可能熟悉奥卡姆剃刀原则:给出两个解释,最可能正确的解释是更简单的一个 – 假设较少的解释。这个原则也适用于神经网络的模型: 简单的模型比复杂的泛化能力好。在这种情况下,一个简单的模型指的是模型:参数值的分布具有较小的熵(或者参数较少)。因此,减少过拟合的一种常见方法是通过使权重只取小值来限制网络的复杂性,这使得权重值的分布更加规整。这就是所谓的权重正则化,这是改变网络的损失函数来实现的,在原来的损失函数基础上增加限制权重的成本。这个成本有两种:
[*]L1 正则化 – 所增加的成本与权重系数的绝对值成正比(权重的 L1 范数),权重稀疏化。
[*]L2 正则化 – 所增加的成本与权重系数(权重的 L2 范数)的平方成正比。L2 正则化在神经网络中也称为权重衰减。不要让不同的名字混淆你:权重衰减在数学上与 L2 正则化相同。
在 Keras 中,通过将选择的权重正则化作为关键字参数传递给网络层来增加正则成本。让我们在电影评论分类网络中添加 L2 权重正则化。
l2(0.001)意味着该层的权重矩阵中的每个系数将增加 0.001 * weight_coefficient_value 到网络的总损失。请注意,由于这种惩罚只是在训练时间增加的,这个网络的损失在训练时比在测试时间要高得多。图 2.1 显示了 L2 正则化惩罚的影响。正如你所看到的那样,即使两个模型具有相同数量的参数,具有 L2 正则化的模型(点)也比参考模型(十字)更能减少过拟合。
图 2.1 L2 权重正则化对验证集损失的影响除了 L2 正则化,你还可以使用以下 Keras 权重正则方法。
      3.DropoutDropout 是最有效和最常用的神经网络正则化技术之一。Dropout 在网络层训练期间随机失活(设置为零)该层的许多输出特征(节点)。假设输入样本经过一个隐藏层后输出一个向量。在该层应用了 Dropout 之后,这个向量将出现几个为 0 的特征值:例如。Dropout 的值表示节点被随机失活的概率,通常设置在0.2 到 0.5之间。在测试时间,则不再用 dropout 了,也就是说测试时所有的节点都要保留。这样就造成了测试与训练输出比例不匹配,测试时隐藏层活跃节点更多。因此,网络层的输出特征(节点)要乘上与 Dropout 率相等的因子来缩小,达到了类似 L2 正则化权重衰减的目的。因此 Dropout 在过程上与 L1 正则化相似,在最终结果上则与 L2 正则化相似。假设一个网络层的输出 layer_output 的 shape 为(layer_size,features)。在训练的时候,我们随机地将矩阵中的一小部分值置零:
在测试时,我们乘以随机失


神经网络结构优化:这篇论文让你无惧梯度消失或爆炸,轻松训练万层神经网络
https://mp.weixin.qq.com/s/XE0J20Uop5-GezvWvl1VDQ

深度学习在众多领域都取得了显著进展,但与此同时也存在一个问题:深层网络的训练常常面临梯度消失或梯度爆炸的阻碍。现在,加州大学圣迭戈分校的研究者提出了一种名为 ReZero 的神经网络结构改进方法,并使用 ReZero 训练了具有一万层的全连接网络,以及首次训练了超过 100 层的 Tansformer,效果惊艳,是一个可以迁移至深度学习的各个领域的idea。


深度总结 | Deep Learning 不可不知的27类常见问题+解析汇总
https://mp.weixin.qq.com/s/Ery4CORX7VFkV0EyIvwVJA

一、为什么深层神经网络难以训练?1、梯度消失。梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习会卡主,除非梯度变大。梯度消失的原因:学习率的大小,网络参数的初始化,激活函数的边缘效应等。在深层神经网络中,每一个神经元计算得到的梯度都会传递给前一层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果计算得到的梯度值非常小,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发生梯度消失。2、梯度爆炸。在深度网络或循环神经网络(Recurrent Neural Network, RNN)等网络结构中,梯度可在网络更新的过程中不断累积,变成非常大的梯度,导致网络权重值的大幅更新,使得网络不稳定;在极端情况下,权重值甚至会溢出,变为值,再也无法更新。3、权重矩阵的退化导致模型的有效自由度减少。参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络深度)的增加,矩阵的乘积变得越来越退化。在有硬饱和边界的非线性网络中(例如 ReLU 网络),随着深度增加,退化过程会变得越来越快。   二、深度学习和机器学习有什么不同?传统的机器学习需要定义一些手工特征,从而有目的的去提取目标信息, 非常依赖任务的特异性以及设计特征的专家经验。而深度学习可以从大数据中先学习简单的特征,并从其逐渐学习到更为复杂抽象的深层特征,不依赖人工的特征工程。   三、为什么需要非线性激活函数1、激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。2、假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。3、使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。

页: [1]
查看完整版本: [深度学习]DL系统之网络训练