求教0基础入门大模型的学习路线?

如题,本人本科java开发出身,数学基础良好,希望入局大模型算法,有无必要从cnn学起?transformer、bert是否必须要学?希望能在最短的时间掌握相关知识,并找到一份实习。
求高手指点学习路线
收藏者
0
被浏览
156

8 个回答

大模型是啥 LV

发表于 6 天前

想从 0 开始学习大模型?掌握以下几点,助你在 AI 赛道中如鱼得水!

一、夯实数学与编程基础

在正式学习大模型之前,打好基础至关重要,尤其是在数学和编程方面。虽然大模型表面上似乎与深奥的数学理论相距甚远,但实际上,线性代数、微积分和概率论构成了神经网络和大模型的核心基础。你可以花几周时间巩固线性代数中的关键概念,如矩阵运算、向量、特征值等,推荐学习 Gilbert Strang 的《线性代数及其应用》,并结合 3Blue1Brown 的动画视频来轻松理解这些抽象概念。微积分部分的重点是导数、梯度以及优化算法在模型训练中的应用,Khan Academy 提供了丰富的资源帮助你入门。概率论方面,掌握概率分布、期望和方差等基础知识,有助于你更好地理解模型评估和损失函数的作用。
与此同时,扎实的 Python 编程能力同样重要。学习变量、函数、数据结构等基础知识后,深入掌握 NumPy、Pandas 和 Matplotlib 等库,这些工具将大大提升你在数据处理和可视化方面的能力。通过动手做一些实际项目,比如处理股票数据,你不仅能迅速提高编程技能,还能积累实战经验,加深对这些工具的理解。
二、掌握机器学习核心概念

在掌握基础知识之后,深入学习机器学习是迈向大模型的关键一步。理解机器学习的核心概念将为你后续的深度学习和大模型训练打下坚实的基础。在这个阶段,你需要熟悉监督学习、无监督学习、分类和回归等基本知识。Andrew Ng 的 Coursera 机器学习课程是非常适合初学者的资源,内容清晰易懂且实用。
在实践过程中,重点掌握一些经典的机器学习算法,如线性回归、逻辑回归和决策树,并通过 Scikit-learn 库进行实现和应用。完成学习后,建议动手做一些简单的项目,如房价预测或垃圾邮件分类。通过这些项目,你不仅能巩固所学的理论知识,还能有效提升自己的动手能力。Kaggle 提供了大量的开源数据集,利用这些数据集进行实战练习,不仅能加深你对算法的理解,还能为你积累宝贵的项目经验。
三、深度学习的基础与实践

在掌握了机器学习基础后,深度学习将成为你的下一个重点。理解神经网络的基本结构是核心,包括神经元、层、激活函数(如 ReLU、Sigmoid)、前向传播和反向传播等关键概念。Ian Goodfellow 的《深度学习》是深入解析这些理论的经典书籍,值得一读。在此基础上,你还需要学习深度学习中的优化算法,如梯度下降法和 Adam 优化器,学会通过调整学习率、批次大小等超参数来进行模型调优,这将使你对模型训练过程有更深入的理解。
实践环节,建议使用 PyTorch 或 TensorFlow 这两大深度学习框架,搭建卷积神经网络(CNN)或循环神经网络(RNN)。例如,MNIST 手写数字识别项目是一个经典的入门项目,它不仅能够帮助你理解深度学习的工作原理,还能让你在实际操作中熟练掌握这些框架。通过这样的项目实践,你不仅能巩固所学的理论知识,还能积累宝贵的经验,为更复杂的深度学习任务奠定基础。
四、进入大模型学习阶段:Transformer 与预训练模型

在掌握了深度学习的基础知识后,下一步就是深入学习大模型。大模型的核心架构是 Transformer,它通过自注意力机制解决了传统神经网络在处理长序列时的瓶颈。《Attention is All You Need》这篇论文是理解 Transformer 工作原理的关键资源,推荐深入阅读。同时,Jay Alammar 的可视化解读对复杂概念进行了生动的展示,能帮助你更加直观地理解 Transformer 的结构和机制。
基于 Transformer 架构的代表性模型包括 BERT 和 GPT。BERT 是一种双向 Transformer 模型,广泛应用于自然语言理解任务,比如文本分类和情感分析;而 GPT 系列模型则擅长文本生成和对话系统,适用于生成式任务。你可以借助 Hugging Face 平台,轻松加载这些预训练模型,如 BERT 或 GPT,并根据具体任务需求进行微调。通过这些实际项目的操作,你不仅能够加深对大模型的理解,还能积累宝贵的实战经验,从而更好地应用大模型技术。
五、持续学习与实践提升

学习大模型是一个持续进阶的过程,特别是在这个技术日新月异的领域。为了保持领先,建议你时刻关注前沿动态,定期阅读 Arxiv 上的最新论文,跟踪 OpenAI 和 DeepMind 等顶尖机构的研究进展。此外,Kaggle 是一个极佳的实践平台,通过参与机器学习竞赛,不仅可以将所学知识应用于实际项目,还能与全球的开发者交流学习,获取宝贵的经验。加入 Hugging Face 或 OpenAI 等技术社区,积极与其他开发者分享项目经验和学习心得,有助于你在这个不断发展的领域保持竞争优势,持续提升自己的技能和视野。

总的来说,学习大模型并不需要一蹴而就,而是一个循序渐进的过程。从打好数学基础、掌握编程技能,到深入理解机器学习和深度学习,再到精通 Transformer 及预训练模型,每个阶段都是不可或缺的关键环节。通过不断的实践和项目积累,你不仅能够熟练掌握这些强大的工具,还能将它们灵活地应用于实际问题解决中。随着大模型技术的持续进步,保持学习的动力和实践的热情,将帮助你在这一快速发展的领域走得更远,最终成为一名真正的 AI 专家。

---------------------------------------------------------------------------------------------
以上,如果您看了觉得对您有所帮助,请给 @AI匠人 点个赞,分享给身边的朋友叭!
这样博主也有更新下去的动力,跪谢各位父老乡亲啦~
---------------------------------------------------------------------------------------------
一个专注于AI领域的博士。
关注博主获得更多有关 科研生活AI最新知识前沿论文解读实用工具分享 的精彩内容。
---------------------------------------------------------------------------------------------

透露小温馨 LV

发表于 6 天前

如果你曾尝试过搜索大模型入门教程,会发现大部分在教你如何用大模型,而不是如何制作大模型。
由于大模型本身的复杂度,以及训练所需的昂贵代价,网上系统介绍大模型底层原理的教程很少。仅有的一些文章和博客理论性较强,对初学者不甚友好。在我转型学习 大模型的过程中,这些困难让我决心编写这个教程,希望能帮助到更多人。
如果你也想知道:
    大模型是如何设计出来的?构成大模型的基本结构是什么?模型的训练到底是怎么一回事?什么是预训练(pretrain)、微调(finetune)、对齐(alignment)?怎么用最简单的方法自己训练一个大模型出来?
那么本篇回答将是你的最佳选择。
本篇回答面向广大初学者,只要具备一定数学和编程基础,阅读本文就不会有任何障碍。即便不懂编程、讨厌数学,你也仍然能从中获得极大收获。在整个过程中,我会以第一性原理为指导,用最通俗的语言引导读者从零开始一步步设计出大模型的所有模块。为了紧密结合理论和实践,我们将使用一个微缩版的大模型,它可以运行在任何一台电脑上。文中使用的案例专为中国读者设计,保证所有人一看就能明白我们在做什么。
本回答的配套源代码位于 GitHub 的 TutorialLLM​ 仓库,供读者免费取用:
源代码地址:https://github.com/jingedawang/TutorialLLM
制作一个写诗 AI

为了避免过于抽象的讲解,我们将会通过一个实际案例,一步步设计并完善大模型的方案。这个案例是我精挑细选出来的,个中原因我写在下面,算作本教程来龙去脉的一点补充。
学习一门知识或技术,纯靠理论讲解往往效果不佳。理论总是过于抽象,许多人会迷失在复杂概念和繁琐的公式里,以至失去兴趣,无法掌握得透彻。我深知个中滋味,大模型的经典论文不可不读,但我当时读过就如囫囵吞枣,难以消化,以致始终未能领悟真谛。
直到 2024 年夏天。彼时,我刚从微软离职,打算休养生息,做一些有趣的事情。大模型方兴未艾,我一直想要弄清其底层的基本原理。虽然并未打算投身大模型的研发工作,但了解原理总没有坏处。
可是,网络上介绍大模型原理的内容并不多。人们更乐意讲解如何使用大模型开发奇思妙想的应用,这些当然是最有用的东西,但不符合我的胃口。虽然有一些人在努力向大家介绍大模型的底层原理,但就像当初看论文一样,一上来就是公式和注意力机制,看得头晕眼花。
功底深厚的人自然乐于阅读精炼学术范的文章,但更多像我一样的普通人还是希望通俗易懂、循序渐进,花最小的努力把一件事情学会。
当时,我观看了 Andrej Karpathy 的「Let's build GPT: from scratch, in code, spelled out. 」视频。他在视频中现场演示了如何从零编程实现一个 GPT 模型。在两个小时的时间内,他如同变魔法一样,赤手空拳,一步步从处理数据、构建模型、训练模型,最终得到了一个可以像莎士比亚一样说话的 AI。
他的视频给了我很大启发,这正是我所期待的可以帮助更多人理解大模型原理的教程。不过,他的内容仍然有不小的门槛,我在看的时候需要反复拖动进度条,否则完全跟不上他的语速。从那时起,我开始有了本书的构想。我要为中国读者写一份更简单明了的教程。读者花的时间可以多些,但一定要容易理解,避免半途而废。
借鉴 Andrej 的做法,我也要提供一套可执行的代码,但其中的案例我希望更适合中国人。
事实上,之所以网上的资料只介绍大模型的理论基础,不提供实践环节,是因为我们不可能在自己电脑上训练大模型。一个 GPT4 级别的大模型,可能需要上万块 GPU 和大量电力消耗,总成本可能在上亿美金。想要自己在家训练一个大模型可谓是痴人说梦,就连开源的小尺寸大模型也不行。
为了解决这个问题,Andrej 选择用一个小模型,让它学习以莎士比亚的语气说话。可以想象,小模型肯定不如大模型讲话那么流畅,但由于是莎士比亚风格,人们其实看不太出来语言效果的好坏,只觉得有趣。
这启发我选择实现一个写中文诗的 AI。一方面,读者对诗的好坏应该不会过于敏感;另一方面,我可以方便地在这个小模型上讲解大模型训练的全流程,包括预训练、微调和与人类偏好对齐。每个训练阶段都属于主线任务写诗的一部分,读者可以很容易理解其中的道理。
虽然实际的大模型会更复杂,涉及更多技巧。但最底层的原理与本文案例别无二致,这些核心的部分,作为初学者应当首先掌握。
前情提要讲完,我们开始步入正题,看看写诗 AI 到底该怎么实现。
定义输入输出

在 AI 里,我们通过规定输入输出的映射来规定 AI 的行为。因此,如何收集数据,如何设计合理的输入输出就是第一件要考虑的事情。
在配套代码仓库中,我已经事先准备好了中国的所有古诗,放在 GitHub 的 data.json 文件里,以 JSON 格式保存。整个 JSON 对象是一个数组,数组中的每个元素是一首诗。我把开头第一首诗的部分贴在下面。
[{"author": "太宗皇帝", "paragraphs": ["秦川雄帝宅,函谷壯皇居。", "綺殿千尋起,離宮百雉餘。", "連甍遙接漢,飛觀迥凌虛。", "雲日隱層闕,風煙出綺疎。"], "title": "帝京篇十首 一", "id": "3ad6d468-7ff1-4a7b-8b24-a27d70d00ed4"}, ...]可以看到,每首诗包含作者、段落、标题、ID 等字段。重新整理一下格式,就可以把这首诗写成我们日常所见的形式(本书后续的所有例子均不包含作者,因为生成的诗文不需要作者):

求教0基础入门大模型的学习路线?-1.jpg

按照之前的计划,我们要把这类数据转换为合适的输入输出,输入是一段话,输出是这段话的下一个字。不过,真正开始实现,我们就会发现一个之前没有考虑到的问题。
输出是输入文本的下一个字,这很好理解。但输入文本到底取多长呢?如果默认把整首诗当作输入,只留最后一个字作为输出:

求教0基础入门大模型的学习路线?-2.jpg

是不是有点莫名其妙?输入一大堆,结果让模型预测最后的句号?这样的话模型肯定什么也学不会。
所以我们不能只让模型预测最后面的字,而是每个字它都要学会预测。但每个字所处的位置不同,我们只能用前面的文本预测后面的字,而不能用后面的文本预测前面的字,毕竟我们不可能倒着说话。
这就意味着,我们应该把一首诗拆分成多条数据。每条预测一个不同位置的字。比如,从这首诗拆分出的第一条数据为:

求教0基础入门大模型的学习路线?-3.jpg

没错,输入只有一个字。因为我们希望预测第二个字「京」,而能够用来预测「京」的就只有「帝」这个字了。以此类推,拆分出的第二条数据为:

求教0基础入门大模型的学习路线?-4.jpg

有没有找到规律呢?假设这首诗总共 N 个字,按照这种拆分方法,我们最后会得到 N-1 条数据。除了不预测第一个字,其它所有字都要预测。
模型由此便可以学会从任何位置开始往后接话,而不是局限于补齐某个特定位置的字。因为我们最终的目标是让模型能够独立生成一首完整的诗,它必须有能力从开头开始输出。当它输出一个字后,这个字可以加入输入文本,继续生成下一个字,直到整首诗全部生成。
不过,此时,我们又会面临另一个问题。按照这样的输入输出规则,模型岂不是必须从头阅读一首诗?在我们生成的 N-1 条数据中,输入全部都从这首诗的标题开头,然后是正文。如果我想要直接给它输入一个上句,让它输出下句,估计它又会傻眼了。
为了解决这个问题,我们或许可以把起始点变一变。刚才,我们每次都从第 0 个字开头,现在,我们可以从 0 ~ N-1 里面任选一个位置开头。不过,这样处理起来会有些麻烦,因为不光开头要变,结尾也要跟着变,可选的组合会非常多。
一个更好的方案是,把所有诗从头到尾连起来组成一个超级长的文本。然后,随机取一个位置作为起始点,将输入的最大长度固定为 N。像刚才一样,分别取长度为 1, 2, ..., N-1 的文本作为输入,得到 N-1 条数据。这种方法生成的输入输出变化最多,起始位置、长度都不确定,模型因此可以学到更多样化的知识。
在我们的实现中,取 N=256,随机选取起始位置后得到一个长度为 256 的文本,比如下面这段:

求教0基础入门大模型的学习路线?-5.jpg

这里面包含了五首诗,其中第一首和最后一首不完整。按照前面的规则,从这 256 个字的文本可以进一步生成 255 条数据,每一条的输出对应于从第 2 个字开始的每个字。比如,第一条为:

求教0基础入门大模型的学习路线?-6.jpg

……最后一条为:

求教0基础入门大模型的学习路线?-7.jpg

中间的数据以此类推。
唯一仍可能让人感到疑惑的是那些不完整的诗句。的确,由于设定的最大长度,我们截断了一些诗句。但这是一种合理的妥协。
在后续内容中,我们会一步步了解到模型训练的三个阶段——预训练、微调和对齐。第一步预训练阶段,我们只需要让模型尽量多地掌握语言的底层逻辑,而不需要关心其输出的长度或格式。事实上,预训练模型的目的是让模型根据给定的输入输出下一个字,并且反复输出下去,直到规定的最大长度。此时的模型并没有完整的段落概念,它并不能用来对话(Chat),而只能用来补全(Completion)。
因此,你会看到在我们这段文本中,一首诗结束了又接着下一首。我们希望模型能一首接一首地写诗,直到字数限制。
从文本到数字

如果你对计算机有所了解,你或许知道计算机只认得二进制数,其它的一概不懂。只有人能看得懂文字,任何信息在传入计算机前都要转变为数字。
最简单的转换是给每个字编一个序号,字和序号一一对应。这类似于一个字典,只要字典里面包含了所有可能出现的字,那么任何一句话就可以顺利地转译为一串数字。
在我们的案例中,并不需要一个包含所有汉字的字典。为了节约存储空间,我们可以用一个更小的字典,里面只包含训练数据中出现过的字。毕竟,历史上的所有古诗基本上涵盖了大部分写诗所需的字,用这些就够了。经过统计,我们的训练数据中共出现了 8548 个不同的字,把他们按照出现的频率列出来大概长这样:

求教0基础入门大模型的学习路线?-8.jpg

最热门的 10 个字大家都认识,但最冷门的 10 个字恐怕少有人能念得出来。
于是,我们可以直接根据这个字典,按照顺序给每个字赋予唯一的编号,从 0 直到 8547。字的排序其实并不重要,无论是按频率排序还是随机排都没有关系,因为这一步只是给它们一个代号,并不会影响它们在后续环节的发挥。在我们的代码中,字是随机排序的。
把这个字典应用到上节的数据上,我们就拥有了一个用数字表示的输入输出的集合。举个例子,假设其中有两条数据长这样:

求教0基础入门大模型的学习路线?-9.jpg

按照字典编码后就变成了:

求教0基础入门大模型的学习路线?-10.jpg

值得注意的是,标点符号和换行也要考虑在内,因为模型需要学习如何使用它们。你可以试着将每个字符与编码后的数字一一对应起来。你会发现,8347 代表逗号,20 代表句号,2 代表换行。
现在,训练数据终于就绪了。是时候有请我们的大杀器——神经网络闪亮登场,看它如何从数据中学会写诗。
用神经网络解决一个简单的现实问题

本来,我们应当闲言少叙,直接尝试用神经网络解决 AI 写诗的问题。但不得不承认,文本处理对 AI 来说是一个相当复杂的任务,硬着头皮啃下去容易消化不良。本教程是写给初学者的,我们有必要先来聊清楚神经网络到底是怎么回事,再回归主线也不迟。
先来看一个简单但很现实的问题:
读研究生的同学可能有过这种感觉,就是不知道什么时候会得到导师的表扬,也搞不清楚什么情况下会挨骂。小王同学为此吃了不少苦头,他决定找出其中的缘由。但导师的脾气阴晴不定,他发现并没有哪种因素可以决定导师的心情,似乎是各种原因交织在一起产生的结果。他相信导师不会无缘无故批评别人,这里面一定暗藏玄机。
小王向我请教,我告诉他,你老师的心情肯定是
使用 App 查看完整内容目前,该付费内容的完整版仅支持在 App 中查看
🔗App 内查看

卓松年 LV

发表于 6 天前

0基础入门大模型,transformer、bert这些是要学的,但是你的第一口不一定从这里咬下去。
真的没有必要一上来就把时间精力全部投入到复杂的理论、各种晦涩的数学公式还有编程语言上,这样不仅容易让你气馁,而且特别容易磨光热情。
当我们认识复杂新事物时,最舒适的路径应当是:感性认识现象->理解本质和原理->将所学知识用于解释新现象并指导实践。
所以我给出的这条路径是:先学会如何使用大模型,然后了解其背后的原理,最后探索如何将其应用于实际问题。
Prompt工程:作为一个普通人,把大模型用起来

如果说大模型像一个矿藏,那么prompt就像是一把铲子,从哪个角度挖,如何挖,决定了你能开采出什么内容。

求教0基础入门大模型的学习路线?-1.jpg

一个清晰有效的prompt包含角色、任务目标、上下文、输出要求、限定条件、理想示例等一系列内容,只有把prompt设计好了,大模型才有可能发挥出理想的效果。
AI编程:作为一个程序员,把大模型用起来


求教0基础入门大模型的学习路线?-2.jpg

学会使用Copilot、通义灵码之类的AI编程工具来提升编码效率。现阶段AI辅助编程在代码补全以及注释生成方面表现还不错,因此需要你来把架子搭好、把模块分好。这样无形中还能提高你的架构能力。
API调用:作为一个大模型套壳程序员,玩一下

掌握如何调用市面上常见的大模型API,结合自己的想法实现具体的小任务,这对初学者来说是一个实际操作的好机会。

求教0基础入门大模型的学习路线?-3.jpg

这时候你就获得了实践经验和对AI的直观认识。接下来就可以进入更深一层的大模型应用技术了。
大模型应用开发:作为一个大模型应用开发程序员,把大模型用起来

在工具方面,需要学习如LangChain这样的开发库,以及如LlamaIndex这样的数据索引和检索工具。

求教0基础入门大模型的学习路线?-4.jpg

方向方面:
RAG(Retrieval-Augmented Generation检索增强生成):

RAG 是 LLM 落地最早的一个方向之一。简单来说就是搭建一个私有的知识库,将你的私有知识数据存储在向量数据库里,然后对话的过程中按照某些策略去检索这些知识,然后提供给大模型进行参考。
逻辑流程:数据提取->embedding(向量化)->索引创建->检索->排序->LLM生成。


求教0基础入门大模型的学习路线?-5.jpg

这部分内容技术细节很多,也非常有趣,很有搞头。
Agent

大模型应用的风口方向,非常香!简单来说就是给大模型大脑制定一个策略,让它可以自主地去感知环境并且进行任务执行。
典型的AI agent分为Memory(记忆)、Tools(外部工具) 、Planning(计划) 和Action(行动)四个模块。


求教0基础入门大模型的学习路线?-6.jpg

Agent相关的开源项目以及产品非常多,可以边研究边学边做。
至此,应用方面的板块内容就介绍完了。注意这个路径虽然更适合0基础入门,但是并不代表轻松简单。出来混,总要还的,因为我们前期跳过了很多基础知识,所以意味着越往后学,越需要回填大量前置内容,比如:

  • 掌握 Python 语言
  • 掌握向量数据库
  • 熟悉常用的库和工具,如 NumPy、Pandas、TensorFlow、PyTorch 等
  • 具备 NLP 相关的基础知识,包括文本预处理、分词、词性标注、命名实体识别、词向量表示等
  • Transformer 模型的结构和原理、基于注意力机制的自然语言处理技术等
  • BERT、BART、T5等经典的模型
  • 数学基础知识
说真的,补理论知识、搭项目环境,这个过程自己摸索和踩坑的话还是非常痛苦的。很有可能学着学着就放弃了。
对于这种学习,我的经验是跟着视频学习是最轻松高效的,所以强烈推荐你去听听这节「AI大模型公开课」,由几位业内大佬主讲,主要面向的就是想系统性学习AI大模型的同学。讲解大模型相关的技术,从理论实践到深度讲解,带你全程体验微调过程。一定要仔细听,有老师带着,效率远高于单打独斗。而且现在课程免费,点开还能领的一定要先占个位置↓
我自己听过之后的感受是有老师带着,效率会很高,能很快地了解到大模型这块的知识版图,不至于像无头苍蝇一样东搜一点西搜一点,凑不出知识的全貌。因为有一定的编程基础,后续工具和项目的上手也会比较容易。
深水区:模型训练和微调

在这一阶段,重点学习各种常见的预训练模型、模型结构及其主要的预训练任务。
Fine-tuning


  • 通过Prompt-Tuning、Prefix-Tuning和P-Tuning等技术更精细地控制模型在特定场景下的表现
    通过LoRA和QLoRA等技术,在保持模型大小不变的前提下,通过局部调整网络参数来提高模型的灵活性和效率
  • 掌握强化学习基础;
  • 使用Tokenizer工具来优化文本数据的预处理过程
多模态

大模型的重要的发展方向,探索如何处理和整合多种类型的数据(文本、图像、声音等),学习构建多模态模型。
产品和交付

大模型时代的产品,无论从用户需求、产品逻辑还是产品形态、商业模式等方面,大家都还处于摸索状态,因此在学习大模型领域知识时一定要一直看到产品和商业化这一层。
看清楚了哪个赛道拥挤、哪个领域是风口,就能够更好地把握职业机会,更有效地将大模型技术转化为求职市场的竞争力。
我们把这个路径捋一下,就得到了这张AI大模型全栈知识地图:

求教0基础入门大模型的学习路线?-7.jpg

从下往上看,就是我所说的“从实践到理论再到实践”的学习路径了。这样看起来是不是既清晰又舒适呢?
最后,要想拿到好的大模型相关岗位offer,还需要大量积累论文学习经历以及项目经验。比如可以参加一些竞赛,像国外的Kaggle和阿里云天池都是获取项目经验的好途径。

ggm LV

发表于 6 天前

可以跟着我的《初学者笔记本电脑玩转大模型系列》来实战,当然最好边学边补充深度学习、机器学习的知识(如下链接的一些内容可以多学习)。
如何评价沐神他们写的《动手学深度学习》这本书? - 知乎 (zhihu.com)
之前分享了三篇《初学者笔记本电脑玩转大模型系列》,感兴趣可以访问如下文章:
求索:初学者笔记本电脑玩转大模型系列一:利用ollama跑大模型
求索:初学者笔记本电脑玩转大模型系列二:微调谷歌Gemma模型
求索:初学者笔记本电脑玩转大模型系列三:基于Huggingface微调谷歌Gemma模型
这次我们来挑战一下最近一篇论文的微调方法,这篇论文是《ORPO: Monolithic Preference Optimization without Reference Model》(《ORPO:无需参考模型的单体偏好优化》。该论文提出了一种称为ORPO的方法(Odds Ratio Preference Optimization,赔率比偏好优化),这种方法针对不受欢迎的生成内容施与小小惩罚就足以实现偏好对齐的 SFT通过将 SFT 和对齐结合到一个新的目标(损失函数)中来训练基础大语言模型,从而免去了耗时耗力的SFT阶段。根据论文架构图显示(如下图),ORPO不需要监督微调、奖励模型和参考模型。

求教0基础入门大模型的学习路线?-1.jpg

如果对论文详细内容感兴趣,可以访问如下文章:
求索:ORPO:大模型无需微调,直接偏好优化,性能也杠杠的!

话不多说,接下来我们利用这篇论文的ORPO方法优化Gemma 2B。
直接阅读代码,可以访问Github库:
keyonzeng/llm_tuning: large language model tuning examples (github.com)
笔记本电脑配置及环境

笔记本电脑配置:i9-13900HX/32GB,GPU 4090/16GB
主要使用的编程环境:Microsoft PyCharm/VSCode、Jupyter Notebook
操作系统:Windows 11
优化总体思路

基本思路是:我们针对Gemma 2B模型进行ORPO优化,使用的数据集是argilla/dpo-mix-7k,利用Huggingface的Transformers、Transformer Reinforcement Learning(TRL)、Parameter-Efficient Fine-Tuning框架、QLora以及TRL的ORPOTrainer对模型进行优化,性能指标监控使用wandb。
优化具体思路


  • 前置条件:CUDA 12.3、PyTorch 2.2.1、PyCharm/VS Code、Jupyter Notebook,安装和使用请参考如下文章:Windows如何安装和运行不同版本CUDA?
  • 设置环境变量,由于项目使用wandb来监控性能,因此需要在wandb网站申请key,把这些key信息存放在.env,同时把模型上传到Hugging Face,同样也需要在Hugging Face申请key,如下所示:
wandb="xxxx"
huggingface="xxxxxx"

  • 安装相应的一些依赖包,具体包括python-dotenv,bitsandbytes,peft, trl(需要基于源文件安装,最新版才有ORPOTrainer), accelerate,datasets, transfromers。bitsandbytes由于官方没有提供Windows版本,可以使用github上的wheel安装包。
#install the required dependencies
!pip3 install -q -U python-dotenv
!pip3 install -q -U https://github.com/jakaline-dev/bitsandbytes_win/releases/download/0.42.0/bitsandbytes-0.42.0-cp311-cp311-win_amd64.whl
!pip3 install -q -U peft==0.8.2
!pip3 install -q -U git+https://github.com/huggingface/trl.git  
!pip3 install -q -U accelerate==0.27.2
!pip3 install -q -U datasets==2.17.0
!pip3 install -q -U transformers==4.40.0.dev0

  • 由于模型文件比较大,可以提前从huggingface的网站下载gemma-2b的模型文件到本地(中国访问不稳定,需要科学家上网),文件链接为google/gemma-2b at main (huggingface.co),下载文件列表如下:

求教0基础入门大模型的学习路线?-2.jpg


  • 确定你的CUDA是否可用以及CUDA的版本
import torch

torch.cuda.is_available(), torch.version.cuda
求教0基础入门大模型的学习路线?-3.jpg


  • 载入argilla/dpo-mix-7k数据集
# load argilla/dpo-mix-7k dataset

from datasets import load_dataset


#dataset = load_dataset("argilla/distilabel-capybara-dpo-7k-binarized",split="train")
#dataset2 = load_dataset("allenai/ultrafeedback_binarized_cleaned",split="train")

dataset = load_dataset("argilla/dpo-mix-7k",split="train")


dataset[0]["chosen"][0]["content"]

#dataset.to_csv("a.csv")

  • 进行数据集的格式转化
#format dataset format

from datasets import load_dataset
from transformers import AutoTokenizer

def chatml_format(example):
    message = {"role": "user", "content": example['chosen'][0]['content']}
    # Format instruction
    prompt = tokenizer.apply_chat_template([message], tokenize=False, add_generation_prompt=True)
    # Format chosen answer
    chosen = example['chosen'][1]['content']+tokenizer.eos_token
    # Format rejected answer
    rejected = example['rejected'][1]['content']+tokenizer.eos_token

    return {
        "prompt": prompt,
        "chosen": chosen,
        "rejected": rejected,
    }

# Load dataset
dataset = load_dataset("argilla/dpo-mix-7k",split="train")
#dataset = load_dataset("argilla/distilabel-intel-orca-dpo-pairs", split="train")
#dataset = dataset.filter(
#   lambda r:
#       r["status"] != "tie" and
#       r["chosen_score"] >= 5
#       and not r["in_gsm8k_train"]
#)
# Save columns
original_columns = dataset.column_names


# Tokenizer
model_name = "c:/ai/models/gemma"
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left"


# Format dataset
dataset = dataset.map(
    chatml_format,
    remove_columns=original_columns
)

# Print sample
dataset[1]
求教0基础入门大模型的学习路线?-4.jpg


  • 使用ORPOTrainer和QLora对模型进行优化,由于Gemma 2B的模型文件较大,占用VRAM比较多,我只做了一个epoch,因此几个重要参数你可以根据你的硬件条件进行调整:per_device_train_batch_size=1, gradient_accumulation_steps=16, learning_rate=5e-5,num_train_epochs=1,optim="adamw_bnb_8bit",max_prompt_length=256,
    max_length=1024。这些参数可以在tuning过程做一些实际的调整。
#Using ORPOTrainer and QLora to tune Gemma 2B
import os
import gc
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, PeftModel
import wandb
from dotenv import load_dotenv, find_dotenv
from trl import ORPOTrainer
from trl import ORPOConfig

#init env
env =load_dotenv(find_dotenv())
hf_token = os.getenv("huggingface")
wb_token = os.getenv('wandb')
wandb.login(key=wb_token)

#local model path
local_model_path ="c:/ai/models/gemma"
# LoRA configuration
peft_config = LoraConfig(
    r=16,
    lora_alpha=16,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=['k_proj', 'gate_proj', 'v_proj', 'up_proj', 'q_proj', 'o_proj', 'down_proj']
)

# Model to fine-tune
model = AutoModelForCausalLM.from_pretrained(
    local_model_path,
    torch_dtype=torch.bfloat16,
    #torch_dtype="auto",
    trust_remote_code=True,
    quantization_config= BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_compute_dtype=torch.bfloat16,
        bnb_4bit_use_double_quant=True,
        bnb_4bit_quant_type='nf4',
    )
)
model.config.use_cache = False

new_model = "lion-gemma-2b"

torch.cuda.empty_cache()


# Training arguments
training_args = ORPOConfig (
    per_device_train_batch_size=1,
    gradient_accumulation_steps=16,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={'use_reentrant':True},
    remove_unused_columns=False,
    learning_rate=5e-5,
    lr_scheduler_type="cosine",
    #max_steps=400,
    num_train_epochs=1,
    save_strategy="no",
    logging_steps=1,
    output_dir=new_model,
    optim="adamw_bnb_8bit",
    warmup_steps=80,
    bf16=True,
    max_prompt_length=256,
    max_length=1024,
    report_to="wandb",
)

# Create DPO trainer
orpo_trainer = ORPOTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
    tokenizer=tokenizer,
    peft_config=peft_config
)

# Fine-tune model with ORPO
orpo_trainer.train()运行了3个多小时,结果如下:
TrainOutput(global_step=421, training_loss=1.4132320338643363, metrics={'train_runtime': 11275.7226, 'train_samples_per_second': 0.599, 'train_steps_per_second': 0.037, 'total_flos': 0.0, 'train_loss': 1.4132320338643363, 'epoch': 1.0})
wandb性能监控如下:

求教0基础入门大模型的学习路线?-5.jpg


求教0基础入门大模型的学习路线?-6.jpg


求教0基础入门大模型的学习路线?-7.jpg


求教0基础入门大模型的学习路线?-8.jpg


  • 保存tuning后checkpoint
# save tuning checkpoint

final_checkpoint = "gemma_final_checkpoint"
orpo_trainer.model.save_pretrained(final_checkpoint)
tokenizer.save_pretrained(final_checkpoint)

求教0基础入门大模型的学习路线?-9.jpg


  • 合并优化后的checkpoint
# merge checkpoint with original llm
env =load_dotenv(find_dotenv(),override=True)
hf_token = os.getenv("huggingface")

#Flush memory
del orpo_trainer, model
gc.collect()
torch.cuda.empty_cache()

# Reload model in FP16 (instead of NF4)
base_model = AutoModelForCausalLM.from_pretrained(
    local_model_path,
    return_dict=True,
    torch_dtype=torch.float16,
)
tokenizer = AutoTokenizer.from_pretrained(local_model_path)

# Merge base model with the adapter
model = PeftModel.from_pretrained(base_model, final_checkpoint)
model = model.merge_and_unload()

# Save model and tokenizer
model.save_pretrained(new_model)
tokenizer.save_pretrained(new_model)

求教0基础入门大模型的学习路线?-10.jpg


  • 把模型上传到Hugging Face上(根据你网络情况是否科学家上网)
# Push them to the HF Hub
#os.environ["HTTPS_PROXY"] ="http://127.0.0.1:7890"
model.push_to_hub(new_model, use_temp_dir=False, token=hf_token)
tokenizer.push_to_hub(new_model, use_temp_dir=False, token=hf_token)

  • 当然你也可以测试一下你tuning后的本地新模型
# Test the new llm
from transformers import AutoModelForCausalLM, AutoTokenizer,BitsAndBytesConfig
import torch

new_model = "lion-gemma-2b"
tokenizer = AutoTokenizer.from_pretrained(new_model,torch_dtype=torch.bfloat16, device_map="cuda")
model = AutoModelForCausalLM.from_pretrained(
    new_model,
    torch_dtype=torch.bfloat16,
    device_map="cuda",
    quantization_config= BitsAndBytesConfig
        (
        load_in_4bit=True,
        bnb_4bit_compute_dtype=torch.bfloat16,
        bnb_4bit_use_double_quant=True,
        bnb_4bit_quant_type='nf4',
    ))  # You may want to use bfloat16 and/or move to GPU here

messages = [
   {"role": "user", "content": "Hello, how are you?"},
    {
        "role": "assistant",
        "content": "how can i help you?",
    },
    {"role": "user", "content": "what is large language model?"},
]
tokenized_chat = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")

tokenized_chat =tokenized_chat.to('cuda')
outputs = model.generate(tokenized_chat, max_new_tokens=128)
print(tokenizer.decode(outputs[0]))本次利用ORPO来优化Gemma 2B大功告成,你也可以在自己的笔记本电脑或者个人电脑上实施。
代码库:keyonzeng/llm_tuning: large language model tuning examples (github.com)

漏网之鱼 LV

发表于 6 天前

大模型和Java开发的技术栈差别还是蛮大的。不知道你这个0基础是指深度学习零基础还是大模型0基础呢?
如果是大模型0基础的话,推荐你看看华为的大模型技术公开课,课程还在持续更新中,覆盖了从Transformer、BERT到GPT\ChatGLM\LLaMA系列的大模型,还包括大模型的一系列训练和微调技术RLHF、Instruct Tuning、Prompt Tuning等基础知识,课程中间还穿插了大模型的发展历史等等,对于大模型的初步理解还是有一定帮助的。课程也提供代码和课件。
如果是深度学习0基础,经典深度学习入门教程《动手学深度学习》,台湾大学李宏毅老师的机器学习课程打基础,李宏毅老师的课程内容一直在更新,跟很多大学常规课堂相比,比较贴合前沿。
大模型技术基本都是Transformer架构的,随着深度学习的发展,很多模型实际上已经落后淘汰了,对于一些模型稍作了解即可。
既然是找工作,动手实践必不可少,比如LLaMA2已经开源了code和预训练模型,大模型相关的其他开源项目也很多。

华为大模型公开课课程集合链接:
https://space.bilibili.com/526894060/channel/seriesdetail?sid=3293489
这门课程还是推荐有一些深度学习基础之后再去学习。

近期课题刚接触大模型,欢迎大家交流讨论,批评指正!

aylue LV

发表于 6 天前

你好,针对零基础入门大模型的学习路线,建议如下:<br><br>1. 了解机器学习基础知识,包括常见的算法和模型,如线性回归、决策树等。<br>2. 学习深度学习基础知识,掌握神经网络的基本原理和构建方式。<br>3. 掌握Python编程语言及常用库,如NumPy、Pandas等。<br>4. 学习卷积神经网络(CNN)和循环神经网络(RNN)等常见网络结构,了解其在图像和自然语言处理中的应用。<br>5. 学习Transformer模型和BERT预训练模型,了解其在自然语言处理任务中的优势和应用。<br>6. 掌握深度学习框架,如TensorFlow或PyTorch,进行实践练习。<br>7. 学习大模型训练和优化技巧,了解大规模数据处理和分布式计算等相关知识。<br><br>对于你本科有Java开发背景且数学基础良好的情况,可以从深度学习基础开始学起,逐渐深入了解CNN、RNN、Transformer等模型。对于BERT等预训练模型,也是必须学习的内容。建议通过实践结合的方式,快速掌握相关知识,并寻找相关实习机会。祝学习顺利!

ziken LV

发表于 6 天前

针对零基础入门大模型的学习路线,建议如下:<br><br>1. 了解机器学习基础知识,包括常见的算法和模型,如线性回归、决策树、逻辑回归等。<br><br>2. 学习深度学习基础知识,掌握神经网络的基本原理和常见结构,了解前向传播和反向传播算法。<br><br>3. 掌握Python编程语言及相关的科学计算库,如NumPy和Pandas等。<br><br>4. 学习卷积神经网络(CNN)和循环神经网络(RNN)等常见深度学习模型,了解它们在图像和自然语言处理中的应用。<br><br>5. 学习Transformer模型和BERT等预训练模型,了解自然语言处理中的自注意力机制。<br><br>建议不必从CNN开始学起,可以在掌握深度学习基础知识后,根据自己的兴趣和需要进行选择。掌握Python和机器学习基础后,可以逐渐深入学习大模型相关的知识和技术。同时,建议多参加相关实习和项目,实践是掌握知识的最好方式。祝学习顺利!

夕遥 LV

发表于 6 天前

针对零基础入门大模型的学习路线,建议如下:<br><br>1. 了解机器学习基础知识,包括常见的算法和模型,建议从线性回归、逻辑回归、决策树等入门。<br>2. 掌握深度学习基础知识,了解神经网络的基本原理和构造,学习前馈神经网络、反向传播等。<br>3. 学习卷积神经网络(CNN)和Transformer模型,了解其在图像和自然语言处理中的应用。BERT模型是NLP领域的热门模型,学习它会对你的大模型学习有很大帮助。<br>4. 深入理解大模型的核心技术,如自然语言处理、计算机视觉等领域的前沿技术。<br>5. 实践项目,通过实际项目加深理论学习,并不断积累经验。<br><br>鉴于您已有Java开发背景且数学基础良好,可从深度学习开始,逐步深入到大模型相关技术。关于是否必须从CNN学起,视个人情况而定,但CNN是计算机视觉领域的基础,对大局观建立有帮助。至于实习,建议在掌握基本理论知识后,积极寻找相关实习机会,实践中不断进步。

您需要登录后才可以回帖 登录 | 立即注册