这篇文章的目的是回顾经过时间考验的,被广泛采用的想法。我将介绍一小部分技术,这些技术涵盖了解现代深度学习研究所必需的许多基本知识。如果你是该领域的新手,那么这是一个很好的起点。
深度学习是一个瞬息万变的领域,大量的研究论文和想法可能会令人不知所措。即使是经验丰富的研究人员,也很难告诉公司PR什么是真正的突破。这篇文章的目的是回顾经受住时间考验的想法,这也许是人们应该依靠的唯一参考标准。这些想法或对它们的改进已被反复使用。他们已经“家喻户晓”。
如果你今天要开始学习深度学习,那么理解和实现这些技术中的每一个都将为你了解最新研究和开展自己的项目奠定良好的基础。这就是我认为最好的入门方法。以历史顺序浏览论文也是了解当前技术的来历以及为什么会发明它们。换句话说,我会尽量呈现最小集的想法,最必要的基本知识,了解现代的深度学习研究核心发展历程。
免费pdf好书推荐:
2020最新版《神经网络与深度学习》中文版PDF免费开放下载
刘知远老师7月新书-《自然语言处理表示学习》免费书分享
关于深度学习的一个相当独特的事情是它的应用领域(视觉,自然语言,语音,RL等)共享大多数技术。例如,某人曾在计算机视觉深度学习领域工作过,整个职业很快就能在NLP研究中取得成果。特定的网络体系结构可能有所不同,但是概念,方法和代码基本相同。我将尝试介绍来自各个领域的想法,但此列表有一些警告:
1. 我的目标不是为这些技术提供深入的解释或代码示例。将长篇复杂的论文总结成一个段落是不容易的。相反,我将简要概述每种技术,其历史背景以及与论文和实现的链接。如果你想学习一些东西,我强烈建议你尝试在不使用现有代码库或高级库的情况下,从头开始在原始PyTorch中重现其中的某些纸本结果。
2. 该列表偏向于我自己的知识和我熟悉的领域。我没有很多激动人心的子领域。我会坚持大多数人认为的主流领域,包括视觉,自然语言,语音和强化学习/游戏。
3. 我将只讨论具有已知能很好运行的官方或半官方开源实现的研究。有些研究不容易重现,因为它涉及巨大的工程挑战,例如DeepMind的AlphaGo或OpenAI的Dota 2 AI,因此在这里我不会重点介绍。
4. 有些选择是任意的。通常,大约在同一时间发布相当相似的技术。这篇文章的目的不是要进行全面的回顾,而是要使刚接触该领域的新人了解涵盖很多领域的各种观点。例如,可能有数百种GAN变体,但是要了解GAN的一般概念,你学习哪一个都没关系。
2012年-使用AlexNet和Dropout解决ImageNet
Papers
ImageNet Classification with Deep Convolutional Neural Networks (2012)[1]
Improving neural networks by preventing co-adaptation of feature detectors (2012) [2]
One weird trick for parallelizing convolutional neural networks (2014) [14]
Implementations
AlexNet in PyTorch(https://pytorch.org/hub/pytorch_vision_alexnet)
AlexNet in TensorFlow(https://github.com/tensorflow/models/blob/master/research/slim/nets/alexnet.py)
资料来源:https : //papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks
AlexNet通常被认为是导致深度学习和人工智能研究近来蓬勃发展的算法。它是基于Yann LeCun开发的早期LeNet的深度卷积神经网络。AlexNet 通过结合GPU的强大功能和先进的算法,大大超越了以前对ImageNet数据集中的图像进行分类的方法。它证明了神经网络确实有效!AlexNet也是最早使用Dropout [2]的平台之一,此后它已成为提高各种深度学习模型的泛化能力的关键组成部分。
AlexNet使用的体系结构,一系列卷积层,ReLU非线性和最大池化,已成为将来的计算机视觉体系结构可以扩展和建立的公认标准。如今,诸如PyTorch之类的软件库是如此强大,并且与最新的体系结构相比,AlexNet非常简单,因此仅需几行代码即可实现。注意,AlexNet的许多实现(例如上面链接的实现)都使用一种怪异的技巧中 描述的网络的细微变化来并行化卷积神经网络[14]。(https://arxiv.org/abs/1404.5997)
2013年-通过深度强化学习玩Atari
Papers
Playing Atari with Deep Reinforcement Learning (2013)聽[7]
Implementations
DQN in PyTorch(https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html)
DQN in TensorFlow(https://www.tensorflow.org/agents/tutorials/1_dqn_tutorial)
资料来源:https : //deepmind.com/research/publications/human-level-control-through-deep-reinforcement-learning
在最近在图像识别和GPU方面取得突破的基础上,DeepMind的团队成功地训练了一个网络,可以通过原始像素输入来玩Atari游戏。而且,相同的神经网络体系结构学会了玩七种不同的游戏,而没有被告知任何特定于游戏的规则,这证明了这种方法的普遍性。
强化学习与“监督学习”(例如图像分类)的不同之处在于,Agent必须在多个时间步长(例如赢得比赛)中学习最大化的奖励总和,而不仅仅是预测标签。由于Agent直接与环境交互,并且每个动作都会影响环境,因此训练数据不是独立的且分布均匀(iid),这使得许多机器学习模型的训练非常不稳定。这是通过使用诸如经验重播等技术解决的[15]。
尽管没有明显的算法创新可以使这项工作奏效,但这项研究巧妙地结合了现有技术,在GPU上训练的卷积神经网络和体验重播,以及一些数据处理技巧,以实现大多数人无法预期的令人印象深刻的结果。这使人们有信心扩展“深度强化学习”技术,以解决更复杂的任务,例如Go,Dota 2,Starcraft 2等。
此后,Atari Games [21]已成为强化学习研究的标准基准。最初的方法仅解决了7场比赛(超过了人类的基准),但是在未来几年中,基于这些思想的进步将开始在越来越多的游戏上击败人类。蒙特祖玛的《复仇》是一款特别的游戏,因需要长期规划而闻名,被认为是最难解决的游戏之一。直到最近[23] [22],这些技术才在所有57款游戏中都超过了人类的水平。
2014年-带注意力(Attention)的编码器-解码器网络
Papers
Sequence to Sequence Learning with Neural Networks [4]
Neural machine Translation by Jointly Learning to Align and Translate [3]
Implementations
Seq2Seq with Attention in PyTorch(https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html#)
Seq2Seq with Attention in TensorFlow(https://www.tensorflow.org/addons/tutorials/networks_seq2seq_nmt)
来源:https : //ai.googleblog.com/2017/04/introducing-tf-seq2seq-open-source.html
深度学习最令人印象深刻的结果主要是与视觉相关的任务,并且是由卷积神经网络驱动的。尽管NLP社区在使用LSTM网络[16]和编码器-解码器体系结构[4]进行语言建模和翻译方面取得了成功,但直到注意力机制[3]的发明才开始取得令人瞩目的成就。
在处理语言时,每个token(可能是字符,单词或介于两者之间的某种事物)都会被馈送到循环网络(例如LSTM)中,该网络维护一种先前处理过的输入的memory。换句话说,一个句子与时间序列非常相似,每个token都是一个时间步。这些循环模型通常很难处理长期的依赖关系。当他们处理序列时,他们很容易“忘记”较早的输入,因为它们的梯度需要通过许多时间步长传播。使用梯度下降来优化这些模型非常困难。
新的注意力机制有助于缓解这一问题。它通过引入快捷方式连接为网络提供了一种在较早的时间步长自适应“回头看”的选项。这些连接使网络可以决定在生成特定输出时哪些输入很重要。典范的例子是翻译:生成输出词时,通常会映射到一个或多个特定的输入词。
免费pdf好书推荐:
2020最新版《神经网络与深度学习》中文版PDF免费开放下载
刘知远老师7月新书-《自然语言处理表示学习》免费书分享
2014-Adam优化器
Papers
Adam: A Method for Stochastic Optimization [12]
Implementations
Implementing Adam in Python(https://d2l.ai/chapter_optimization/adam.html)
PyTorch Adam implementation(https://pytorch.org/docs/master/_modules/torch/optim/adam.html)
TensorFlow Adam implementation(https://github.com/tensorflow/tensorflow/blob/v2.2.0/tensorflow/python/keras/optimizer_v2/adam.py#L32-L281)
资料来源:http : //arxiv.org/abs/1910.11758
通过使用优化器使损失函数(例如平均分类误差)最小化来训练神经网络。优化器负责弄清楚如何调整网络参数以使其了解目标。大多数优化器
基于随机梯度下降法(SGD)的变体。但是,许多这些优化器本身都包含可调参数,例如学习率。为特定问题找到正确的设置,不仅可以减少训练时间,而且由于可以找到更好的损失函数局部最小值,因此也可以得到更好的结果。
大型研究实验室经常运行昂贵的超参数搜索,这些搜索带有复杂的学习速率计划,以便从简单但对超参数敏感的优化器(例如SGD)中获得最大收益。当它们超过现有基准时,有时是由于花费大量资金来优化优化器的结果。这样的细节常常在已发表的研究论文中没有提到。没有相同预算来优化其优化器的研究人员陷入了更糟糕的结果。
Adam优化器建议使用梯度的第一和第二阶来自动调整学习率。结果证明是非常可靠的,并且对超参数选择不太敏感。换句话说,Adam经常可以正常工作,不需要像其他优化程序一样进行广泛的调整[24]。尽管调整得非常好的SGD仍然可以获得更好的结果,但是Adam使研究更容易进行,因为如果某些事情不起作用,你就知道这不太可能是调整不当的优化器的错。
2014/2015-生成对抗网络(GAN)
Papers
Generative Adversarial Networks [6]
Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks [17]
Implementations
DCGAN in PyTorch(https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html)
DCGAN in TensorFlow(https://www.tensorflow.org/tutorials/generative/dcgan)
来源:https://developers.google.com/machine-learning/gan/gan_structure
生成模型(例如变体自动编码器)的目标是创建看起来逼真的数据样本,例如你可能在某处看到的这些人脸图像。因为他们必须对整个数据分布进行建模(很多像素!),而不仅仅是将猫或狗分类为判别模型,所以此类模型通常很难训练。生成对抗网络(GAN)就是这样一种模型。
GAN的基本思想是串联训练两个网络-生成器和鉴别器。生成器的目标是生成使鉴别器蒙蔽的样本,该样本经过训练可以区分真实图像和生成的图像。随着时间的流逝,鉴别器将在识别假货方面变得更好,但生成器也将在欺骗鉴别器方面变得更好,从而生成看起来更逼真的样本。GAN的第一次迭代会产生模糊的低分辨率图像,并且训练起来非常不稳定。但是随着时间的推移,变化和改进,例如DCGAN [17],Wasserstein GAN [25],CycleGAN [26],StyleGAN(v2)[27],以及其他许多人都基于此想法来生成高分辨率的逼真的图像和视频。
2015年-残差网络(ResNet)
Papers
Deep Residual Learning for Image Recognition聽[13]
Implementations
ResNet in PyTorch(https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py)
ResNet in Tensorflow(https://github.com/tensorflow/tensorflow/blob/v2.2.0/tensorflow/python/keras/Applications/resnet.py)
研究人员一直在AlexNet突破的基础上发展了一段时间,发明了基于卷积神经网络的性能更好的架构,例如VGGNet [28],Inception [29]等。ResNet是这一系列快速发展中的下一个迭代。迄今为止,ResNet变体通常用作各种任务的基准模型架构,也用作更复杂的架构的基础。
除了在ILSVRC 2015分类挑战中获得第一名之外,ResNet 之所以与众不同,还在于其与其他网络体系结构相比的深度。本文中介绍的最深层网络具有1,000层,并且仍然表现良好,尽管在基准任务上比其101和152层对应的网络稍差。由于梯度消失了,训练这样的深度网络是一个具有挑战性的优化问题,它也出现在序列模型中。没有多少研究人员认为训练如此深的网络可以带来良好的稳定结果。
ResNet使用了身份快捷方式连接来帮助梯度流动。解释这些连接的一种方法是ResNet仅需要学习从一层到另一层的“增量”,这通常比学习完整的转换要容易。这种身份连接是公路网[30]中提出的连接的特例,而连接又受到LSTM使用的门控机制的启发。
2017-Transformer
Papers
Attention is All You Need聽[5]
Implementations
PyTorch: Sequence-to-Sequence Modeling with nn.Transformer and TorchText(https://pytorch.org/tutorials/beginner/transformer_tutorial.html)
Tensorflow: Transformer model for language understanding(https://www.tensorflow.org/tutorials/text/transformer)
HuggingFace Transformers Library(https://github.com/huggingface/transformers)
资料来源:https : //arxiv.org/abs/1706.03762
带注意力机制的序列到序列模型(在本文的前面已经介绍过)工作得很好,但是由于它们的递归特性需要顺序计算,因此它们有一些缺点。它们很难并行化,因为它们一次只处理一步。每个时间步取决于上一个。这也使得很难将它们缩放到非常长的序列。即使有了他们的注意力机制,他们仍然在建模复杂的远程依赖项方面仍在挣扎。大多数“工作”似乎都是在循环层中完成的。
Transformer解决了这些问题,方法是完全消除重复现象,并用多个前馈自我关注层代替它,并行处理所有输入,并在输入和输出之间产生相对较短的路径(使用梯度下降易于优化)。这使他们真正快速地训练,易于扩展并且能够处理更多数据。为了告诉网络有关输入的顺序(在递归模型中是隐式的),Transformers使用了位置编码[19]。要了解有关Transformer工作原理的更多信息(一开始可能会有些困惑),我建议你使用图示指南。
要说Transformer比几乎任何人都预期的要好,那是轻描淡写。在接下来的几年中,它们将成为绝大多数NLP和其他序列任务的标准体系结构,甚至进入计算机视觉体系结构。
2018年-BERT和经过微调的NLP模型
Papers
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding [9]
Implementations
Fine-Tuning BERT with HuggingFace(https://huggingface.co/transformers/training.html)
预训练是指训练模型以执行某些任务,然后将学习到的参数用作初始化以学习相关任务。这具有直觉的意义-已经学会将图像分类为猫或狗的模型应该已经了解了有关图像和毛茸茸的动物的一般知识。当对该模型进行微调以对狐狸进行分类时,我们希望它比必须从头学习的模型做得更好。类似地,已经学会预测句子中下一个单词的模型应该已经学会了有关人类语言模式的一般知识。我们希望它对于相关任务(如翻译或情感分析)是一个很好的初始化方法。
预训练和微调已在Computer Vision和NLP中成功使用,但是很长一段时间以来它一直是视觉标准,但使其在NLP中正常工作似乎更具挑战性。大多数最新结果仍来自完全受监督的模型。随着Transformer的出现,研究人员终于开始进行预培训工作,从而产生了诸如ELMo [34],ULMFiT [35]和OpenAI的GPT之类的方法。
BERT是此类开发的最新成果,许多人认为它已经开启了NLP研究的新纪元。像大多数其他模型一样,它没有经过预测其他单词的预训练,而是预测了句子中任何地方的被屏蔽(有意删除)的单词,以及两个句子是否可能彼此跟随。请注意,这些任务不需要标记的数据。它可以在任何文本上进行训练,而且很多!这个预先训练的模型可能已经学习了一些关于语言的一般属性,然后可以对其进行微调以解决监督任务,例如问题回答或情绪预测。BERT在各种各样的任务中都表现出色。HuggingFace等公司轻松下载和微调针对任何NLP任务的类似BERT的模型。从那时起,BERT就建立在诸如XLNet [31]和RoBERTa [32]和ALBERT [33]的发展之上。
2019/2020年及以后-BIG语言模型,自监督学习?
整个深度学习历史上最明显的趋势也许就是惨痛的教训。更好的并行化(=更多数据)和更多模型参数的算法进步一次又一次地赢得了“更智能的技术”。这种趋势似乎延续到2020,其中GPT-3 ,通过OpenAI一个巨大的175十亿参数语言模型,显示了出乎意料的良好的泛化能力,尽管它的简单训练目标和标准架构。
同样的趋势是诸如对比自监督学习(例如SimCLR)之类的方法,它们可以更好地利用未标记的数据。随着模型变得越来越大,训练起来越来越快,可以有效利用Web上大量未标记数据并学习可以转移到其他任务的通用知识的技术变得越来越有价值并被广泛采用。