我是如何进入深度学习领域的

内容

我经营了一家教育公司,Dataquest,持续了8年。去年,我有了再次开始构建的冲动。深度学习一直让我感兴趣,但我对它了解甚少。于是,我着手解决这个问题。

自那时起,我已经训练了数十个模型(其中几个是开源领域的最先进技术),建立了2个库,拥有5000多个Github星标,并最近接受了来自answer.ai的工作邀约,这是由Jeremy Howard创办的研究实验室。

我说这句话是为了大致勾勒出我的学习之旅。在这篇文章中,我将更详细地介绍我如何学习深度学习。希望对你的学习之旅有所帮助。

我在学校里没学过这些东西。本科主修美国历史,挂了不少课程

2012年我从事了机器学习和Python工作,但我说服自己深度学习对我来说太复杂了。其中一个原因是因为我是通过参加Kaggle竞赛来学习的。Kaggle竞赛非常适合快速学习,但可能会让你在基础知识上留下空白,比如算法的数学原理。

当深度学习开始变得流行时,它非常数学密集,我觉得自己永远无法理解它。当然,这是错误的,十年后我证明了这一点,但你对事物的处理方式会产生很大的不同。第一次我从上到下地接触深度学习,通过将模型粘合在一起而不理解它们是如何工作的。最终我遇到了瓶颈,无法突破。

去年我学习深度学习时,我已经具备了一些有用的技能。首先是扎实的Python编程能力。尽管有人试图推动其他语言,但Python仍然是人工智能的通用语言。如果你想进入人工智能领域,首先要做到真正擅长编程。

无论我身处人工智能的哪个时代,数据清洗始终占据了我工作的70%以上。如果你在从事纯研究或解决玩具问题,可能可以避免处理数据,但除此之外,数据技能是至关重要的。

有一种稍微模糊的技能,我称之为务实。深度学习有很多兔子洞 - 从“什么是完美的基础模型?”到“如果我在这里去掉 Sigmoid 会怎样?”其中一些兔子洞是有用的,但大多数会耗费大量时间。能够识别何时深入,何时只需采用快速/简单的解决方案是很重要的。

这一次,我决定从底层开始学习,首先学习基础知识。我阅读了《深度学习书籍》。这本书已经出版几年了,但仍然是一本绝佳的资源。慢慢阅读。很多术语和数学内容可能会让你感到陌生 - 查阅相关资料。你可能需要勾画一些内容或编写代码来理解 - 给自己足够的时间。如果数学内容让你感到陌生,一个很好的补充资源是《机器学习数学》。虽然我还没有学习过它们,但 fast.aiKarpathy 视频 都是高质量的资源。

尽管像CNN或RNN这样的架构在一个向transformers全面转变的世界中似乎已经过时,CNN仍然被广泛使用,而一切旧事物再次焕发新生与RNN。

当你完成了书的前两部分(可以跳过第三部分),你应该能够用纯 numpy 编写任何主要神经网络架构的代码(前向和后向传播) 。

一个真正有助于你达到这一点的方法是在学习的同时教授这些技能。我在阅读深度学习书籍的同时开始制作一门课程,从零到GPT。教学是巩固概念的终极方式,我发现自己陷入了一个良好的学习循环,学习、查找/勾画不理解的内容,然后教授它。

这本书将带你了解到2015年的深度学习。读完这本书后,我阅读了一些2015-2022年间的基础深度学习论文,并在PyTorch中实现了它们。你可以免费/廉价地使用Google Colab来获得GPU,还可以使用Weights and Biases来跟踪你的训练过程。

一个非详尽列表如下:

完成后,您应该能够理解大多数关于深度学习模型架构的对话。

这些天训练模型最简单的入口是对基础模型进行微调。Huggingface transformers 很适合微调,因为它已经实现了许多模型,并且使用 PyTorch。

有一些 Discord 社区,比如Nous ResearchEleutherAI,人们在这里讨论最新的模型和论文。我建议加入它们,了解当前的最新技术,尝试一些微调。

微调的最简单方法是选择一个小模型(7B或更少参数),并尝试使用LoRA进行微调。您可以使用Google Colab,或者类似Lambda Labs这样的服务,如果您需要更多的VRAM或多个GPU。

我想训练模型以编写更好的代码,因此我整理了数据集,并在来自StackOverflow和其他地方的数据上微调了几个不同的基础模型。这确实帮助我理解模型架构、数据、计算和输出之间的联系。然而,微调是一个非常拥挤的领域,当技术水平每天都在变化时,要产生影响是很困难的。

在我进行微调工作时,我意识到一些最高质量的数据以教科书形式存在,并且被锁在pdf文件中。我尝试解决这个问题的一种方法是生成合成数据

另一种方法是从pdf中提取数据并将其转换为良好的训练数据(markdown)。有一种名为nougat的方法在许多情况下表现良好,但运行速度慢且成本高昂。我决定看看是否可以通过利用pdf中已有的数据(避免OCR)并在需要时仅使用模型来构建更好的东西。我将几种不同的模型以及中间的启发式方法链接在一起。这种方法,marker,比nougat快10倍,适用于任何语言,通常更准确。

在标记工作中,我想解决更多问题,我还训练了一个将方程转换为 LaTeX 的模型,一个文本检测模型,一个与谷歌云相竞争的 OCR 模型,以及一个布局模型。

对于所有这些模型,我采用了现有的架构,改变了层、损失和其他元素,然后生成/找到了合适的数据集。例如,对于OCR模型,我从Donut architecture开始,添加了GQA,一个MoE层,UTF-16解码(任何字符1-2个令牌),并改变了一些模型形状。

由于OCR模型通常较小(参数少于300M),我能够在4个A6000上训练所有这些模型。如果我更高效一些,可能只需要2个A6000就足够了。

希望这为您说明了3件事情:

  • 理解基础知识对训练良好模型至关重要
  • 找到有趣的问题并解决它们是发挥所建模型影响力的最佳方式
  • 你不需要很多GPU

在人工智能领域有许多细分领域,即使作为一个相对外行者,你也可以产生重大影响。

正如你可能已经注意到的,我会开源我所有的人工智能项目。与影响相比,数据堆栈是人工智能领域中一个投资不足的领域。我坚信,你能够广泛分发高质量的训练数据,就越能降低某1-2个组织垄断优质模型的风险。

开源还有一个副作用,那就是获得曝光的好方法。这也引出了我故事的最后一部分。

我在考虑围绕我的开源工具建立一家企业。根本没有考虑在某个地方工作。但当杰里米联系我谈论 answer.ai 时,我觉得这是一个我必须抓住的机会。与才华横溢的人一起工作,产生积极影响并学到很多东西的机会实在难以放弃。

我的开源工作直接导致了这份工作机会,不仅在显而易见的方面(让我曝光),也在更微妙的方面(显著提高了我的技能)。希望你在学习过程中也会开源一些东西。

我怀疑我在 answer.ai 的工作会与我在开源项目上的工作非常相似。我将继续训练模型,改进数据堆栈,并进行公开发布。

如果你正在尝试深入学习,希望这篇文章对你有所帮助。如果不是,希望它能带给你一些乐趣(你看到了结尾,所以可能是有趣的,对吧?)。

至于我,我要回去训练一些模型(现在正在观察其中的两个收敛)。

总结
文章总结:作者在过去8年经营了一家教育公司Dataquest,最近转向深度学习领域。他通过阅读深度学习书籍、实现论文中的模型、参与社区讨论等方式学习深度学习。作者强调了学习深度学习的重要技能包括扎实的Python编程能力、数据清洗技能和实用主义。他还分享了通过开源项目获得工作机会的经历,以及在解决有趣问题时提高技能的重要性。最后,作者表示将继续在answer.ai工作,继续训练模型、改进数据堆栈并进行公开发布。