这篇论文讲解基础知识点还是蛮全的。 篇幅很长,过第一遍记录,看的也不是很仔细。
推荐论文:https://arxiv.org/abs/1802.09941
- 为了最小化的目的,一个样本损失函数ℓ应该是连续和可微的。
- 在回归问题中,可以使用直接的损失函数,如平方差。
- 在分类问题中,损失的简单定义如:ℓ(w, z) = 0 if fw(z)=h(z) else 1 (也称为二进制或0-1损失),不符合连续性和可微性准则。为了解决这一问题,突出的多类分类问题将Y定义为推断出的class类型的概率分布,而不是单个标签,模型输出通常使用softmax函数()来归一化为某种分布。损失函数然后计算预测与真实标签“分布”的差异,例如,使用交叉熵。
- 交叉熵损失可以看作是逻辑回归的一种推广,为多类分类引出了一个连续的损失函数。
- 机器学习中的优化主要是通过梯度下降进行的。然而,由于从未观察到完整的概率分布D,因此有必要获得梯度的无偏估计。可以在每次迭代中使用随机采样的数据进行下降,应用随机梯度下降(SGD)。
- SGD算法的权重初始化可能反映结果的最终质量。初始权值的选择可以来自随机值、知情决策(如Xavier初始化),或来自迁移学习方法中预先训练的权值。初始化不当可能会随着网络深度的增加而对泛化产生不利影响。
- 权值更新规则:
- Momentum,使用当前和过去权重的差值来避免局部极小值和 natural motion的冗余步骤。
- RMSProp和Adam,使用梯度的第一和第二矩来适应每权重的学习率,比其他方法增强稀疏更新。
- 为了获得最佳结果,超参数必须进行调优,这可以通过value sweeps或meta-optimization来执行。
- 在实践中,minibatch采样是通过对数据集S进行shuffling实现的,并通过从中获得大小为B的连续片段来处理这种排列。
- 对数据集的整个遍历称为epoch,一个完整的训练过程通常由几十到数百个epoch组成
- 无监督学习:数据集S没有标记,训练通常会产生不同的目标函数,旨在从未标记的数据推断结构。有两种有用的实现:自动编码器和生成对抗网络(GANs):
- Auto-encoders:可以被构造成一个接收样本x作为输入,并输出一个尽可能接近x的值的神经网络。
- GANs:利用深度神经网络通过同时训练两个网络来生成真实的数据(通常是图像)。训练第一个(discriminator)网络来区分"真实"数据集样本和"虚假"生成的样本,而训练第二个(generator)网络来生成尽可能与真实数据集相似的样本。
- 强化学习:在给定的时间点观察环境的任务,训练优化动作策略函数,使观察者的奖励最大化。训练算法有Deep Q learning和A3C。
- 并行计算体系结构:
- 单机(通常是共享内存)系统
- 多机(通常是分布式内存)系统
- 加速的主要技术是利用学习工作负载中的固有并行性。
- 互连网络最重要的指标是延迟、带宽和消息速率。
- 在使用分布式内存的多台机器上,可以使用简单的通信机制,如TCP/IP或远程直接内存访问(RDMA)。在分布式内存机器上,还可以使用更方便的库,如消息传递接口(MPI)或Apache Spark。MPI是一个专注于提供可移植性能的低级库,而Spark是一个更专注于程序员生产力的高级框架。
- 深度学习具有与大规模HPC应用非常相似的特征。因此,从2016年开始,建立的MPI接口成为分布式深度学习中事实上的便携通信标准。
- 计算机上的每一次计算都可以建模为有向无环图(DAG)。DAG的顶点是计算,而边是数据依赖(或数据流)。这种图的计算并行性可以用两个主要参数来表征:
- 图的工作量W:对应于顶点的总数。
- 图的深度D:是DAG中任意最长路径上的顶点数量。
在单个处理器上处理图所需的时间是T_1 = W,在无限多个进程上处理图所需的时间是。计算中的平均并行度是,在个处理器上的执行时间受限于:
- 在深度学习中的大多数操作都可以建模为对张量的操作(通常张量作为并行编程模型)。这样的操作是高度数据并行的,只有求和才会引入依赖关系。
- 探索不同的底层通信、消息调度和拓扑映射策略,这些在HPC领域广为人知,可以显著加快分布式深度学习中的通信速度。
- 神经元的稀疏连接和权值共享有利于减少参数的数量。
- RNN包含自连接,因此不能单独用反向传播进行训练。解决这个问题最流行的方法是应用时间反向传播(backpropagation through time, BPTT),它将循环层展开到一定的序列长度,对每个时间点使用相同的权值。这就创造了一个更大的前馈网络,可以用通常的方法进行训练。
- 全连通层可以表示为权值和神经元值的矩阵-矩阵乘法(每小批量样本列)并建模。为此,可以使用高效的线性代数库,如CUBLAS和MKL。
- 计算卷积的第二种方法是利用傅里叶域,在傅里叶域中,卷积被定义为逐元素的乘法。在该方法中,数据和核都使用FFT进行变换,相乘,然后对结果进行逆FFT。卷积核越大,FFT效果越好。
- 网络结构的并行化。神经网络的高平均并行度(W/D)不仅可以有效地计算单个算子,而且可以针对不同的维度并发地评估整个网络:
- 混合并行:多种并行方案的组合可以克服每种方案的缺点。一个成功的混合方案的例子将数据并行性应用于卷积层,模型并行性应用于全连接部分。使用这种混合方法,可以在一个8个以上的gpu上实现高达6.25×的加速,精度损失小于1%(由于小批量大小的增加)。DistBelief分布式深度学习系统结合了三种并行策略。在实现中,对多个模型副本同时进行训练,其中每个副本对不同的样本进行训练(数据并行性)。在每个副本, DNN既按同一层神经元分布(模型并行性),又按不同层分布(流水线)。Project Adam扩展了DistBelief的思想,并展示了相同类型的并行性。然而,在Project Adam中,流水线被限制在同一个节点的不同CPU核上。
- 训练的并行化。在分布式环境中,可能有多个独立运行的SGD实例(训练代理),因此必须对整个算法进行调整。深度学习的分布方案可以分为:模型一致性、参数分布和训练分布:
- 参数和梯度压缩:在分布式深度学习中,通常有两种节省通信带宽的方法:一种是通过有效的数据表示方式来压缩参数,另一种是避免发送不必要的信息,从而导致稀疏数据结构的通信。前一类中的方法与网络基础设施正交,后一类中应用的方法在使用集中(PS)和分散拓扑实现时不同。
- 量化。梯度(或参数)压缩的一个重要数据表示是量化,即将连续的信息映射到表示值集(通常是范围)的buckets中。研究表明,参数和梯度值的分布分散得很窄(图22a),因此这些方法可以有效地表示工作范围,减少每个参数的比特数。量化通常是通过减少浮点动态范围来实现的。量化训练对于有损压缩(如降低精度)并不能“开箱即用”。相反,它依赖于以一种保持参数期望值(E)的方式舍入参数。局部梯度积累是有损量化SGD算法收敛的关键。特别是在分布式环境中,更新是不一致的,重要的是将量化误差带到下一个梯度,积累误差以避免漂移。
- 模型整合:
- 集成学习与知识蒸馏。一种广泛使用的训练后巩固技术是集成学习。在集合中,w的多个实例在同一个数据集上分别训练,整体预测是集合成员预测的平均值。在深度学习时代之前,集成学习作为一种增强的形式在机器学习中得到了广泛的应用,通常可以提高单一模型的整体精度。TreeNets(章节6.2)等研究将集成学习与自定义(集成感知)损失函数相结合,以促进集成成员之间的多样性。考虑到集成消耗m倍的内存和计算能力,另一种训练后模型整合技术是使用知识蒸馏减少DNN的大小。在该方案中,训练分为两步进行:第一步,正常训练一个大型网络或集合;第二步训练单个神经网络来模拟大集合的输出。结果表明,第二个网络在集成上比在标记数据集上更容易训练,其错误率与10个dnn的集成相同。
- 模型平均。另一种整合模型的技术是模型平均。这些方法可以在不同的机器上单独运行m个SGD实例,只聚合一次(训练后)或每隔几次迭代。为了克服由于不频繁平均而导致的精度下降,更复杂的固结方法包括弹性平均SGD(EASGD)和自然梯度下降。
- 优化算法与体系结构搜索: 由于深度学习中的训练是一个非线性优化问题,其他表现出并发性的算法可以替代SGD。此外,它可能使用多余的计算能力来执行元优化,搜索更好的超参数和DNN架构。
- 参数搜索。监督学习既可以被视为一次使用一个或一小批样本的随机优化过程,也可以被表示为一个批优化问题,其中整个数据集需要获得梯度下降。由于高维性,批处理方法在内存、通信和计算方面的二次增长是不可取的。为了克服这些问题,L-BFGS的随机变量被提出,它估计逆Hessian矩阵,并被证明在强凸、lipschitz -连续环境中以线性速度收敛。应用于深度学习的其他优化算法试图:(a)减少随机抽样产生的SGD方差,(b)使用乘子交替方向法(ADMM)来完全跳过反向传播,(c)使用Neumann系列展开来近似Hessian矩阵,缩放到大的小批量大小(32k),没有精度损失或大量的计算开销。无梯度进化算法也被用于深度学习,其中包括遗传算法,神经进化,粒子群优化。除了重组/进化步骤,训练行为类似于集成学习,因此这些算法比传统的梯度下降更适合并行性。这种算法的梯度无关性质使它们能够用于超参数和DNN架构的元优化。
- 超参数搜索。SGD中大量的超参数及其对结果精度的不利影响阻碍了对机器学习新技术的研究。直到最近,超参数搜索的主要方法是执行参数扫描(即在可行范围内的网格搜索)。研究表明,在分布式环境中,在训练过程中控制同步SGD节点组的大小可以提高精度和性能。元启发式优化算法可以将超参数调整与训练相结合,因此被用于dnn。这些方法包括基于粒子群优化的深度学;以及CoDeepNEAT,它是对NEAT算法的修改,可以同时搜索超参数和架构配置。由于有大量的独立计算,这种方法几乎是线性扩展的。基于种群的训练(population based Training, PBT)使用一种强化学习方法来“探索”和“利用”超参数空间。
- 体系结构的搜索。手工制作DNN架构自然会受到人类智力和创造力的限制。这一限制促进了最近自动神经结构搜索研究的兴起。体系结构搜索可以分为三种方法:基于顺序模型的优化(SMBO)、强化学习(RL)和进化算法(EA)。
- 并行和分布式深度学习未来的潜在研究方向:
- 随着研究的进展,DNN架构正变得越来越深入,在连续和非连续层之间(“跳过连接”)更加互联。除了准确性,大量的工作致力于减少内存占用和操作数量,以便成功地在移动设备上运行推断。这也意味着训练后的DNN压缩可能会得到进一步的研究,训练可压缩网络将是可取的。由于移动硬件的内存容量有限,且必须具有能源效率,因此经常有人提出专门的DNN计算硬件。我们在NVIDIA张量核心、张量处理单元、其他专用集成电路和fpga,甚至神经形态计算中看到了这一趋势。
- 处理DNN稀疏性(例如,压缩后)是一些专用集成电路的一个重点,而循环网络和注意力学习方面的进展表明,训练和推理硬件也需要在可变长度输入下有效工作。
- 目前,计算单个算子是高度优化的,因此目前的研究方向是层间和整个dnn优化。TensorFlow XLA, Tensor comprehension, Latte和TM一次性编译整个神经网络图,执行各种转换(如融合)来优化执行时间,比手动调优的单个操作实现了4倍的加速。我们希望在这个方向上继续研究,直到DNN的评估在操作和共享内存优化方面接近最优。
- 应用于分布式深度学习的技术正在趋同到可以设计标准编程接口(或框架)的地步。在未来,生态系统如Ease。Ml可以使训练方案的定义(例如,关于集中化和梯度一致性)更容易,隐藏了大多数底层基础设施设置。结合对云系统和弹性训练的日益增长的支持(节点可以随意旋转和移除)与进化算法的最新发展,我们可能会看到自适应和财务上可行的优化方法崛起。
- 最后,深度学习被用于解决越来越复杂的问题,如路由算法和分层任务组合。人工通用智能的研究目前集中在多用途网络,这为模型并行和不同的训练算法创造了新的、未探索的机会。寻找充分的多用途网络可能超出了人类团队的创造力,随着元优化(特别是架构搜索)和渐进式训练的可用性和质量的增加,参数扫描和手动DNN架构工程将会过时。支持这一说法的事实是,目前最先进的计算机视觉CNN(CIFAR-10和ImageNet数据集)是自动架构搜索的结果。利用并行性是实现这些突破和其他突破的必要条件,这将与深度学习领域的进步携手并进。