Vik Paruchuri 写了自己是如何从一个学历史的普通工程师,用了一年的时间学习AI并且训练出相当优秀的OCR PDF模型的历程。

里面给了一下他自己的学习路径和学习渠道,感觉想要入门的都可以看看。

我曾经经营一家名为 Dataquest 的教育公司长达8年。去年,我重新产生了创造的欲望。深度学习一直引起我的兴趣,但对此我所知甚少,因此我决定改变这一现状。

从那以后,我训练了数十个模型(其中几个达到了开源领域的最新技术水平),建立了两个GitHub星标超过5000的库,并最近接受了 answer.ai 的邀请,这是一个由 Jeremy Howard 创立的研究实验室。

我这样介绍是为了勾勒出我学习的大概轮廓。在这篇文章中,我会更详细地分享我如何学习深度学习的过程,希望对你有所帮助。

我的学习背景

我在学校并未学习相关课程。我本科主修的是美国历史,并且挂科不少。

我在2012年曾从事机器学习和Python编程,但我曾自认为深度学习对我而言太复杂了。其中一个原因是我通过参加 Kaggle 竞赛来学习。Kaggle 竞赛是快速学习的好方式,但它可能使你在算法的数学原理等基础知识上有所缺失。

当深度学习逐渐流行起来,其高度的数学性让我认为我永远也学不会。当然,这是错误的观念,我在十年后证明了自己可以做到,不同的学习方法带来不同的结果。我第一次学习深度学习是采用自上而下的方法,简单地拼接模型,而没有理解它们的工作原理。这种方法最终让我遇到了障碍,无法继续进步。

实用技能

当我去年开始学习深度学习时,我已经掌握了一些有用的技能。最重要的是扎实的Python编程能力。尽管有些人试图改变,但Python仍是AI领域的通用语言。如果你想进入AI领域,精通编程是首要任务。

在我从事AI的整个职业生涯中,数据清理始终占据了70%以上的工作量。如果你只从事纯理论研究或处理简单问题,可能不需要处理数据,但在大多数情况下,掌握数据处理技能是必不可少的。

还有一个我称之为“实用主义”的技能也很重要。深度学习中有很多可能让人迷失方向的细节,如寻找“最佳基础模型”或考虑“去掉这里的sigmoid函数会怎样”。虽然其中一些探索是有价值的,但大多数只会消耗大量时间。能够辨别何时深入研究,何时采取快速简单的方案,是非常重要的技能。

系统学习

这一次,我选择了从基础做起,自下而上的学习方式。我认真阅读了《深度学习》(The Deep Learning Book)。这本书虽然已经出版几年,但依然是极好的学习资源。不要急于翻页。书中很多术语和数学公式可能会让你感到陌生,需要你去查询和实践理解。如果你对数学感到陌生,那么《机器学习的数学》会是一个很好的补充读物。虽然我没有亲自参加,但 fast.aiKarpathy 的视频课程都是高质量的教学资源。

尽管在一个越来越多使用Transformer的世界里,CNN或RNN可能看起来有些过时,但CNN仍被广泛使用,而RNN在某种意义上又重新流行起来。

当你完成这本书的前两部分后(可以跳过第三部分),你应该能够使用纯numpy实现任何主流神经网络架构的前向和后向传播。

通过教学来巩固学习是非常有效的方法。在我阅读深度学习书的过程中,我开始创建了一个名为“从零到GPT”的课程。教学不仅能帮助你巩固已学的知识,还能促进你在学习、查找和教学中形成一个良性循环。

论文

这本书将引导你了解到2015年的深度学习技术。读完后,我研读了2015至2022年间的重要深度学习论文,并在PyTorch平台上进行了实践。你可以利用Google Colab免费或低成本使用GPU,并通过Weights and Biases来跟踪你的训练进程。

这里有一个不完全列表:

了解这些后,你应能跟上大多数关于深度学习模型架构的讨论。

微调与Discord社区

现在,训练模型最直接的方法是微调一个基础模型。Huggingface的transformers库非常适合进行微调,它已实现了众多模型,并基于PyTorch。

在Discord平台上,如Nous ResearchEleutherAI等社区,人们讨论最新模型和论文。建议你加入这些社区,了解当前的前沿技术,并尝试进行一些微调。

微调的简易方法是选择一个参数少于70亿的小型模型,使用LoRA进行试验。你可以使用Google Colab,或者如需更多VRAM或多GPU支持,可选择Lambda Labs

为了改进编程模型的训练,我整理了StackOverflow等平台的数据集,并对几种基础模型进行了微调,这极大地帮助我理解了模型架构、数据、计算力和结果输出之间的联系。然而,微调领域竞争激烈,随着技术日新月异,要在这一领域取得显著成就颇具挑战。

问题探索

在微调过程中,我发现一些最优质的数据被锁在PDF格式的教科书中。我尝试通过生成合成数据来解决这一问题。

还有一种方法是从PDF中提取数据,并将其转换为有效的训练数据(Markdown格式)。一种名为nougat的方法虽在多数情况下效果良好,但运行缓慢且成本高昂。我决定尝试一种新方法,通过直接利用PDF中已有的数据(避免使用OCR技术),仅在必要时调用模型,我将几种不同的模型与启发式方法结合使用。这种名为marker的新方法比nougat快10倍,适用于所有语言,且通常更为准确。

在开发marker的过程中,我还开发了其他几个模型,包括方程转换为LaTeX格式的模型,文本检测模型,以及能与Google Cloud竞争的OCR模型和布局模型。例如,在OCR模型中,我基于Donut架构,增加了GQA和MoE层,实现了UTF-16解码(每个字符1-2个token),并调整了一些模型结构。

由于OCR模型通常较小(少于300M参数),我能够在4x A6000的GPU上完成这些模型的训练。如果更加注重效率,可能使用2x A6000就足够了。

这段经历向你展示了三个重点:

  1. 理解基础知识对于训练高效模型至关重要。
  2. 寻找并解决有趣的问题是提升你所构建系统影响力的最佳途径。
  3. 实际上,并不需要很多GPU资源。

即使作为一个行业新手,你也可以在AI的许多细分领域产生重大影响。

开源的力量

正如你所见,我将我所有的AI项目开源。相对于其潜在影响,AI数据管理是一个资金投入不足的领域。我坚信,将高质量训练数据广泛分发可以降低少数几个组织垄断优秀模型的风险。

开源还有助于增加曝光率,这也是我故事的一个重要部分。

获得研究职位

我本打算围绕我开源的工具构建一家公司。但当Jeremy就answer.ai项目联系我时,我认为这是一个不容错过的机会。与才华横溢的人一起工作、产生积极的影响并学习新知识,是难以拒绝的诱惑。

我的开源工作不仅因为增加了曝光而直接帮助我获得了这份工作,还因为它在很大程度上提升了我的技能。希望在你的学习过程中,你也能开源你的作品。

下一步

我预计在answer.ai的工作将与我之前的开源活动大体相似。我会继续培训模型,优化数据架构,并持续进行公开发布。

如果你正在尝试深入深度学习领域,希望这篇分享对你有所帮助。如果不是,至少希望你觉得这篇文章有趣(既然你读到了这里,应该是觉得有趣的吧?)。

至于我,我要回去继续训练一些模型了(此刻,我正监控着两个模型的收敛过程)。

来源:https://www.vikas.sh/post/how-i-got-into-deep-learning