一口气读懂“大模型的预训练”是怎么回事

写在开头

写这篇文章的原因是大概在两周前,我看完了卡帕西三个半小时在油管上课程。他用简单的语言,讲明白了大模型从无到有的建立。其中他还罗列了非常多好用的网站工具,例如可视化的动画工具理解Transformer架构。

图片

如果从英语为母语的人的角度去看这个课程肯定是非常非常简单,但是作为一个非母语,而且英语又没有那么好的人,看看这个视频还是有点费劲的。我看完这个视频后,又花了几天时间,点开了他课程里所有的链接、看了链接里面的论文,才弄明白他说的所有东西。

所以我决定一共写三篇文章,把卡帕西德课程转换成我们国人也能听懂的语言和大家分享。我是一个非技术背景出身的人,我都能懂,我相信很多也和我一样的非计算机专业的人一样也能看懂。

补充一下卡帕西的背景:斯坦福大学博士,师从李飞飞,OpenAI 的创始成员(2015 年),后任特斯拉人工智能高级总监(2017-2022 年),现为尤里卡实验室(Eureka Labs)创始人,该实验室正在建设一所人工智能原生学校。

首先我们先梳理一下整个框架,卡帕西把大模型的训练分为了预训练、后训练-监督微调、后训练-强化学习三个环节,并分别得到基础模型、监督微调模型和强化学习模型

图片

第一篇文章来聊聊预训练(Pre-training)是怎么回事儿

第一步:下载和预处理互联网

(download and reprocess internet)

这里卡帕西推荐了一个由HuggingFace公司收集、创建和管理的数据集FineWeb。FineWeb这篇文章详细的讲述了数据抓取和清洗过程。

图片

1、URL网址过滤(URL Filtering):用Blocklist名单,过滤不健康的网站,如成人网站

2、文本提取(Text Extraction):WARC和WET两种格式。

3、语言过滤(Language Filtering):利用FastText Language Classifier过滤英文文本中得分大于0.65的文本

4、质量和重复过滤(Gopher Filtering):利用Massivetext这种质量和重复过滤器

5、消除重复(Minhash Dedup):消除重复 dedupilication

6、数据清洗和筛选(C4 Filters):数据清洗和筛选

7、自定义过滤(Custom Filters)

8、去除个人身份信息(PII (personally identifiable information)removal)

这些词儿看着挺专业,其实可以用简单的话把上面这8个环节归纳成5个步骤。

第一步:网址“黑名单” (URL网址过滤)

好比我们买菜前会有一份“问题店铺名单”,告诉我们哪些地方的菜可能不干净或者不正规,比如卖假货的、卖过期食品的等等。

Fineweb 也有类似的“黑名单”,里面记录了一些不希望抓取数据的网站,比如那些传播恶意软件、发送垃圾邮件、充斥广告、宣扬种族歧视、包含成人内容等等的网站。在抓取网页之前,Fineweb 会先检查一下这个网站是否在“黑名单”上,如果在,就直接跳过,不去下载它的内容,避免把“坏东西”带回来。

第二步:只留“菜肉”,去掉“包装” (文本提取)

我们从网上下载的网页,就像一份份包装精美的商品,里面不仅有我们想要的“菜肉”——文字内容,还有各种各样的“包装”——比如网页的HTML代码、导航栏、广告、各种格式信息等等。

Fineweb 的这一步就是要把这些“包装”去掉,只留下网页里真正有用的文字内容2 。这就像我们买回蔬菜水果,要把塑料袋、泡沫盒这些包装扔掉,只留下可以吃的本体。

第三步:“语言警察” (语言过滤)

互联网上的语言是五花八门的,Fineweb 在这一步就像一个“语言警察”,判断每个网页主要使用的是哪种语言。

比如,Fineweb 可能会设置一个标准,只保留那些主要使用英语的网页(例如,英语内容超过 65%)。这样做的好处是可以让训练出来的模型在特定语言上表现更好。当然,不同的机构可以根据自己的需求,决定保留哪些语言以及保留多少比例。如果把所有西班牙语的网页都过滤掉了,那模型肯定就学不好西班牙语了。

第四步:去除“双胞胎”和“复制品” (数据去重)

互联网上经常有很多内容是重复的,就像菜市场里可能有很多摊位卖的是一模一样的土豆。

Fineweb 会进行去重操作,把那些内容非常相似甚至完全一样的网页找出来,只保留一份。这样可以避免模型学习到太多重复的信息,提高学习效率。

在这一步中包括了 质量和重复过滤(Gopher Filtering)、消除重复(Minhash Dedup)、数据清洗和筛选(C4 Filters)、自定义过滤(Custom Filters)这四个环节。目的是去重以保证数据的质量。

第五步:保护“个人隐私” (个人信息去除)

有些网页上可能会包含用户的个人身份信息 (Personally Identifiable Information, PII),比如地址、社会保障号码等等。

第二步:AI的语言-token(tokenization)

为什么AI不像我们人一样,一个字一个字的理解,需要把字转换成Token呢?

咱们平时说话写字,用的是一个字一个词。但是AI(就像 ChatGPT )跟我们理解的方式不太一样。它们不直接看我们写的那些字母,而是先把这些字母变成一种叫做“token”的小单位。这么做有很多好处:

1、更快更省事:如果 AI 一个字母一个字母地看,那得多慢,一句话就变成了一长串的字母。但是,如果把常用的字或者词变成一个“token”,比如说“你好”变成一个 token(4356),“世界”变成一个 token(58679),那一句话就短了很多。这样一来,AI 处理起来就快得多,也省下了很多力气。就好比你要搬一堆砖头,直接抱起几块一起搬肯定比一块一块搬快多了。

2、更能理解意思:一个 token 有时候代表一个完整的意思。比如,“苹果”这个词可以是一个 token,AI 直接就知道 “苹果” 是什么东西,可以吃。但如果一个字母一个字母地看,它还得先拼出来 “苹果” 这两个字,再慢慢理解是什么意思,就慢了。而且,AI 还能通过 token 学习到词语之间的关系,比如“吃”和“苹果”经常一起出现,AI 就知道它们之间有联系。

3、生僻字也能懂:有些词比较少见,如果每个词都变成一个 token,那 AI 要记住的 token 就太多了。所以,有时候会把一个词切成更小的部分,比如“苹”和“果”可能各自是一个 token。这样,即使遇到没见过的词,AI 也能通过认识它的组成部分来猜测它的意思。这就像我们看到一个不认识的人,但如果认识他的家人朋友,也能猜到他的一些特点。

4、更容易学规律:AI 的工作就是学习文字出现的规律,比如什么词后面经常跟着什么词。如果用 token,AI 就能更容易地发现这些规律,因为它看到的是一个个有意义的单位。如果用字母,那规律就藏在长长的字母序列里,很难找。

5、处理长短句子都一样:不管你写一句话还是写一段话,变成 token 之后都是一串 token。AI 可以用统一的方法来处理这些 token 序列。而且 AI 的“脑子”(我们叫它“上下文窗口”)是有限的,它一次能记住的 token 数量是有限的(比如 Gopher 模型训练时能记住 2048 个 token)。用 token 而不是字母,就能在有限的“脑子”里装下更多的信息。

6、各种语言都能处理:Token 的方法可以设计得很灵活,能处理不同的语言和各种符号。这样,一个 AI 模型就能理解不同国家的人说的话。

总而言之,把人类的语言变成 token,就像给 AI 穿上了一层更有效率、更容易理解的“外衣”。这样它才能更快、更好地学习和处理我们的语言,变得更聪明。就像视频里说的,把文本变成 token 的过程叫做 tokenization。实际用的时候,一个模型大概会用到几万到十几万个不同的 token 。比如,厉害的 GPT-4 就用了 100,277 个 token 。

图片

这里词汇量的意思是指,有多少种排列组合。

这里卡帕西举了个例子。把人类世界的5000个文本换算成bits、bytes、tokens计数,看看分别为多少。

当使用bit作为单位的时候,表达5000个文本需要40000个bits

当使用bytes作为单位的时候,表达5000个文本需要5000个bytes

当使用GPT-4 tokens做单位时,仅需要1300个tokens就可以表达意思了。

所以当AI只需要处理1300个tokens就可以等同于处理了5000个文本,这样计算起来就快多了,也节省了算力。

因为我是非计算机背景,我还特地查了一下bit是什么?

bit就是二进制里的0/1,0属于1个bit,1属于1个bit,在bit的世界里,词汇只有2个。1个文本需要用一串8个bits表示。所以5000个文本需要用40000个bits来表示。

如果是byte的话,1个文本=1个byte,1个byte是8位数的bit来表示,而8个0/1的组合有2⁸=256种表达方式,也就是词汇量是256个。

卡帕西给了一个网址:https://tiktokenizer.vercel.app/

你可以通过这个网址,感受文本是如何转换成token的

图片

第三步:神经网络训练

(neutral network training)

你还记得咱们前面说了

第一步是收集一大堆文本数据,就像给AI准备了一大桌子的“饭”。

第二步是把这些文本变成AI能看懂的“token”,就像把饭菜切成一小块一小块方便AI吃。

第三步的神经网络训练,就好比AI开始真正地“吃饭”和“消化”这些“token”。

图片

简单来说,AI 有一个“大脑”,这个“大脑”其实就是一个巨大的神经网络。里面有很多很多的“旋钮”,我们叫它们“参数”或者“权重”。

一开始,这些“旋钮”的数值都是随机设置的,所以AI还什么都不懂,你给它一个 token,它也不知道下一个 token 应该是什么,预测完全是乱来的。

神经网络训练这个过程,就是不断地调整这些“旋钮”的数值。我们把变成 token 的文本一点点地“喂”给AI,让它预测下一个 token 应该是什么。

比如,我们给AI看“今天天气”,AI可能会随机猜一个字,比如“热”或者“冷”。

然后,我们会告诉AI正确的答案,比如下一个字是“真”。

AI 发现自己猜错了,就会根据错误的大小,稍微调整一下自己“大脑”里的那些“旋钮”的数值。如果它下次再看到“今天天气”,猜对“真”的可能性就稍微大了一点。

这个过程会重复无数次,AI会一遍又一遍地看大量的文本,不断地预测,不断地被告知正确答案,然后不断地调整自己“大脑”里的“小开关”。

每“吃”进去一小部分文本,AI 就会努力地让自己的预测越来越接近正确的答案。

我们会用一个叫做 “损失 (loss)” 的数字来衡量AI猜得准不准。损失越小,说明AI猜得越准,“学习”得越好。训练的目标就是不断地降低这个损失。

你可以把这个想象成你学习一门新的语言。一开始你说得很烂,经常说错。但是你不断地听别人说,不断地自己练习说,别人不断地纠正你,慢慢地,你就说得越来越流利了越来越正确了。

AI 的神经网络训练也是类似的,它通过不断地犯错和被纠正,逐渐地学会了文本中的各种规律,比如哪些词经常一起出现,一句话的语法结构是什么样的,等等。

这个训练的过程非常消耗计算资源和时间,需要用到大量的电力和算力。就像你要学好一门外语,也需要花费大量的时间和精力一样。

等到AI看了足够多的文本,并且“大脑”里的“旋钮”的数值调整得差不多了,它的预测能力就会变得很强。这时候,预训练就完成了,我们得到了一个“预训练好的模型”。这个模型已经初步理解了语言的很多基本知识,为下一步的任务(比如像 ChatGPT 那样跟你聊天)打下了坚实的基础。

总而言之,神经网络训练就是让AI通过不断地阅读大量文本,预测下一个 token,并根据预测结果调整自己的“大脑”,从而学习语言的规律的过程。

有人问,神经网络的内部长什么样?

其实就是把你输入的token和几亿和参数权重,经过一个巨大的数学方程式,算出100277个结果中哪个结果的概率大,大的那个是正确答案的可能性高。

图片

第四步:推理(inference)

推理,就好比是 AI 学成之后,真正开始“用”它学到的知识来“说话”或者“回答问题”了。

简单来说,在预训练的推理阶段,我们已经有了一个训练好的“聪明脑袋”(预训练好的模型),现在我们要看看这个“聪明脑袋”到底有多聪明,能不能根据我们给它的一些“提示”,生成有意义的文本。

这个过程是这样的:

你给 AI 一个“开头”或者“问题”:这个“开头”或者“问题”也会先被变成 token,就像我们之前说的那样 [1]。比如说,你给 AI 看“今天天气怎么样?”这句话,它会被变成一串 token。

AI 的“聪明脑袋”开始“思考”:AI 接收到这串 token 后,它“大脑”里的那个巨大的数学公式(神经网络)就开始运作了 。它会根据之前在海量文本中学到的规律,预测下一个最有可能出现的 token 是什么 。就像我们之前说的,它会计算出 100277 个数字,每个数字代表一个可能的下一个 token 的“可能性” 。

AI “选择”下一个 token:AI 会根据这些“可能性”来选择一个 token 作为它预测的下一个词或符号 。通常情况下,它会选择“可能性”最高的那个 token,但有时候为了让生成的文本更有意思或者更多样化,它也会稍微随机地选择 [2, 3]。这就像你平时说话,虽然心里想说某个词,但有时候也会选择一个意思相近的词。

AI 把“选择”的 token 加到“回答”里:AI 选出了下一个 token 后,就把这个 token加到它已经生成的“回答”的末尾 。

重复这个过程:然后,AI 会把当前的“开头”加上它刚刚生成的这个 token,再次作为输入,让它的“聪明脑袋”预测下一个 token 。这个过程会一直重复下去,直到 AI 生成了足够多的 token,或者遇到了一个表示“结束”的特殊 token,或者达到了我们设定的生成长度限制 。

图片

所以,推理的过程就是 AI 拿到一个输入(变成 token),然后一个 token 一个 token 地预测和生成后续的文本 [2]。在这个过程中,AI 的“大脑”(神经网络的参数)是固定不变的,它只是在“运用”之前“学习”到的知识 [5]。这就像你学会了一道数学题的解法后,每次遇到类似的题目,你都会用同样的方法去解答,而不会再去重新学习。

推理是 AI 最终“展示”它预训练成果的阶段。通过推理,我们可以看到 AI 是否学会了理解语言、生成连贯的文本、甚至回答一些简单的问题。预训练的质量好不好,很大程度上就体现在推理阶段 AI 的表现上。

简单来说,推理就是预训练好的 AI 模型,根据你给的“提示”,一个字一个字(更准确地说是 token 一个 token 地)“接龙”生成文本的过程。这个过程就像你在玩一个“你说上句,我说下句”的游戏,只不过 AI 的“下句”是根据它之前读过的无数“句子”来“思考”和“选择”的。

经过以上步骤,训练出来的模型叫“Base”模型,卡帕西拿“GPT2”举例说明了什么是Base模型。

Demo:GPT2

卡帕西提到,GPT-2 的关键参数是:

15 亿个“旋钮数值”(参数)。你还记得我们说过模型通过调整这些“旋钮数值”来学习吗?15 亿个已经是非常多了。

1024 个 token 的最大上下文长度。这意味着 GPT-2 在预测下一个词的时候,最多只能“记住”前面 1024 个token的内容。和现在的模型相比,这个长度是很小的。

大约用 1000 亿个 token 的数据进行训练。这相当于让 GPT-2 “读”了 1000 亿个token的文本。虽然听起来很多,但和现在的一些超大规模数据集比起来,也算少的了。

他提到,在 2019 年,训练一个 GPT-2 这样的模型,估计要花费大约 4 万美元。但是,他自己复现的时候,只花了一天时间和大约 600 美元,而且他觉得如果更努力优化一下,成本甚至可以降到 100 美元左右。

为什么成本会下降这么多呢?卡帕西解释了两个主要原因:

数据变得更好了:现在我们收集、过滤和准备训练数据的方法更加成熟,能得到更高质量的数据。

计算机变得更快了:无论是硬件(比如更强大的 GPU)还是软件(更高效的模型运行和加速库),都有了巨大的进步,这使得训练大模型的速度大大提升。

图片

模型的心理学

(The “psychology” of a base model)

卡帕西在这里用 “心理学” 这个词,并不是说基础模型真的有像人类一样的思维和情感。他用这个词更像是一种比喻,指的是基础模型在经过大规模的预训练后,自然而然展现出来的一些行为模式、特点和“认知”方式。这些“心理”特点并不是我们明确地教给它的,而是它在学习海量互联网文本数据的过程中自己“领悟”到的。

可以把基础模型的“心理学”理解为它的内在倾向和默认行为。

以下是一些卡帕西在视频中提到的,可以帮助我们理解基础模型“心理学”的方面:

它是一个“互联网文档模拟器” (Internet document simulator):基础模型通过学习互联网上的文本数据的统计规律,变成了一个能够生成类似文本的工具。它的“目标”是尽可能地生成符合这些统计规律的 token 序列。

它本质上是概率性的 (probabilistic):模型在预测下一个 token 的时候,会考虑所有可能的 token 的概率分布,然后根据这个分布进行选择。这导致了即使是相同的输入,模型也可能给出不同的输出,具有一定的随机性。

它具有从预训练数据中获得的“知识” (knowledge):虽然它不是一个知识库,但它在训练过程中“记住”了大量的关于世界的知识。我们可以通过合适的提示语来引导它回忆和使用这些知识。

它会有“幻觉” (hallucination):由于它只是在模仿文本的统计规律,而不是真正理解语义,当被问到超出其知识范围或者需要事实准确性的问题时,它可能会生成听起来很流畅但实际上是错误或虚构的内容。这就是一种“心理”上的倾向,即它会尝试给出回答,即使它并不知道正确答案。

它对自身“身份”的认知是模糊的 (vague sense of identity):当你问它“你是谁?谁创造了你?”时,如果没有经过专门的训练来回答这类问题,基础模型可能会根据它在训练数据中看到的相关信息进行猜测,给出不准确的答案。这反映了它没有一个真实的自我意识。

它有其自身的“认知局限” (cognitive limitations):基础模型在某些方面可能非常强大(比如生成连贯的文本),但在另一些看似简单的问题上可能会犯错(比如简单的数学计算或逻辑推理)。这说明它的“思考”方式和人类不同,存在一些我们难以完全理解的局限性。

它能够进行“上下文学习” (in-context learning):即使没有经过专门的微调,通过在输入中提供一些任务的示例,基础模型有时也能够学习到任务的模式并尝试完成类似的任务。这展示了它在一定程度上能够根据上下文调整其“行为”。

卡帕西用 “psychology” 这个词,是想强调基础模型虽然是一个数学模型,但在大规模数据训练后,会展现出一些内在的行为倾向和能力,这些不是简单通过代码直接设定的,而是从数据中涌现出来的。理解这些“心理”特点,可以帮助我们更好地使用基础模型,认识到它的优势和局限,并为后续的微调和应用开发打下基础。

总而言之,基础模型的“心理学”就是指它在预训练后所具备的那些自然形成的、内在的行为模式和“认知”特点。理解这些特点对于有效地与模型互动和构建更高级的应用至关重要。

图片

结尾的问题

问题:上下文长度限制的是问题还是回答?

回答:最大上下文长度限制了以下两者的总和:

1、你提问的内容被转换成的 token 数量2 。你的问题越长,包含的信息越多,转换成的 token 数量就越多。

2、模型在回答你时生成的 token 数量3 。模型的回答越长,内容越丰富,生成的 token 数量就越多。

问题:如果超出最大上下文长度,模型会出现什么情况?

1、无法处理过长的提问:如果你的问题本身就非常长,超过了上下文长度的限制,模型可能无法完全理解你的问题,或者只能处理问题的一部分。

2、回答被截断:如果在生成回答的过程中,总的 token 数量(包括提问和回答)快要达到最大上下文长度时,模型可能会停止生成,导致你的回答不完整。

3、“忘记”较早的信息:由于上下文长度有限,模型在处理长对话或者需要回顾很久之前信息的任务时,可能会“忘记”之前的内容,导致回答不连贯或者不准确。

因此,最大上下文长度是对模型处理文本序列能力的一个重要限制,它同时影响着提问的长度和回答的长度。模型的总“思考空间”是有限的,提问占用的越多,回答能用的就越少,反之亦然。

卡帕西提到序列长度是一个“非常有限且珍贵的资源” ,这也说明了上下文长度的限制在实际应用中是一个需要考虑的关键因素。为了更高效地利用这个有限的资源,我们需要对输入和输出的长度进行合理的控制。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值