一、引言
通过之前的人工智能架构分析和Transformer模型的原理介绍,读者应该对人工智能有了一个初步的了解。
但是很多读者不是很想知道那么多软件方面的专业知识,通过大家的问题,大家关心的主要是三个方面:
-
ai是怎么学习的,不停的搜网上的信息进行学习,然后人工再问他一些问题,根据答案进行正确错误提示调整吗?
-
在线跟ai的对话会让ai实时学习进步吗?
-
怎么在ai时代下保持自己的竞争力?
作者在这里用一些简单的示例来说说自己的理解和摸索
二、AI怎么学习
以我们学生的时候怎么学习进行类比,首先需要有知识载体也就是书,对ai来说就是数据集。
其次需要大脑记忆和逻辑分析,这就是ai使用大量的硬件资源的原因,但是以前的硬件资源也很多,为什么就达不到现在ai的效果?这是多方面结合的原因,神经网络和深度学习框架的不断迭代让ai对于数据的存储和结合非常类似于人脑,transformer架构的演进对神经网络、卷积等等的应用远超之前。但是这些偏向于技术层,有兴趣的可以看作者之前分析transformer的文章。
还有很重要的,分词断句,学生从小也是学123,再学古诗词的,首先得知道这个字什么意思、这个逻辑公式是什么(比如1+1=2),大家才能继续往下学,所以分词就是一个很重要的事情,对于ai来说也是一样。
所以在作者看来最基础的就是书籍=数据集、大脑=神经网络+深度学习、识字断句=分词器
还有一个很重要的就是考试、考试是为了熟练记忆和知道对错,ai记忆比人狠多了,但是他是不知道对错的,对错都是在数据集里面定好的
作者在这一章主要通过数据集和分词的剖析来说明ai是怎么学习的!
1、数据集
首先要明确的是,目前的ai不具备实时学习的能力,也就是说你对他的提问和对问题的修正反馈只会被记录,但是不会被ai更新,这也是为什么目前的ai都会有个截止时间,表示他收录了什么时间段的数据。
为什么会这样呢?那就要看他收录的数据了,训练所用的数据集是很严苛的,举个例子:来自零一万物、中科院深圳先进技术研究院,和M-A-P等机构的研究者们制作的一个数据集COIG-CQIA是这样的
每个列的含义,都有严格的把控,其他数据集也差不多,各种语言、领域的,比如评论电影、感情分析等等,要给出一份合格的数据集不是一个简单的事情:
instruction:指示或指导,描述了给定任务的具体要求或指导。
input:输入,表示用户或系统提供给模型的问题或查询。
output:输出,表示模型对于给定输入的预测或生成的答案。
task_type:任务类型,描述了数据集中的问题类型,例如问答、分类、生成等。
dict:字典,表示数据集中可能包含的词典或知识库,用于支持模型的答案生成或推理。
domain:领域,表示数据集中问题和答案所涉及的特定领域或主题。
metadata:元数据,包含与数据集相关的其他信息,例如数据来源、创建日期、数据格式等。
answer_from:答案来源,表示答案是从哪里获取的,例如从知识库、专家、互联网等。
human_verified:人工验证,表示答案是否经过人工验证或审核,以确保其准确性和质量。
copyright:版权信息,表示数据集中的内容是否受版权保护,以及使用数据集时需要遵守的版权规定。
所以你在提问的时候那些不知道是否正确、不知道是否积极的反馈,大模型是不会信的,这是数据集方面的高要求导致。但不仅仅是这个问题。
加载数据集很简单,几行代码加上数据集的路径就可以,
from datasets import load_dataset
raw_datasets = load_dataset("glue", "mrpc")
raw_datasets
然后可以获得一个DatasetDict对象,其中包含训练集、验证集和测试集。每一个集合都包含几个列(sentence1, sentence2, label, and idx)以及一个代表行数的变量,即每个集合中的行的个数(因此,训练集中有3668对句子,验证集中有408对,测试集中有1725对)。
DatasetDict({
train: Dataset({
features: ['sentence1', 'sentence2', 'label', 'idx'],
num_rows: 3668
})
validation: Dataset({
features: ['sentence1', 'sentence2', 'label', 'idx'],
num_rows: 408
})
test: Dataset({
features: ['sentence1', 'sentence2', 'label', 'idx'],
num_rows: 1725
})
})
麻烦的在于后面的训练转换,时间很长,cpu、内存资源消耗很大,甚至普通cpu都不行,要gpu
2、训练
模型训练是一个非常复杂的过程,上一章说过他在把大量的数据集转换成多维向量,预训练即使是十几亿参数的小模型都可能要几周,微调时间少得多,但是几天也是至少的
预训练是训练模型前的一个操作:随机初始化权重,在没有任何先验知识的情况下开始训练。它需要大量的数据,而且训练可能需要几周的时间。
微调只需要有限的数据量:预训练模型获得的知识可以“迁移”到目标任务上,因此被称为迁移学习。
所以在线学习不可能重新训练数据集,只可能微调,那么他会微调吗?不会,有这些问题:
-
数据隐私和安全性:在线对话数据通常包含用户的个人信息和敏感数据,直接将这些数据用于模型微调可能涉及隐私和安全问题。保护用户数据的隐私和安全是非常重要的,因此需要谨慎处理和使用用户数据。
-
数据分布的变化:在线对话数据通常具有特定的领域和上下文,与预训练模型的数据分布可能存在差异。直接使用在线对话数据进行微调可能导致模型在其他领域或场景下的性能下降,因为模型过度适应了特定的对话数据。
-
训练效率和成本:大模型的微调通常需要大量的计算资源和时间。在线微调需要实时收集和处理大量的对话数据,并进行模型更新和重新训练,这对于实时应用来说可能是不可行的。此外,在线微调还需要额外的成本来维护和管理在线训练系统。
-
模型稳定性和可控性:大模型的微调可能会引入不稳定性和不可控性。在线微调可能导致模型在不同的对话场景下产生不一致的行为,难以控制和调试。预训练模型经过离线训练和验证,具有较好的稳定性和可控性,更适合用于大规模应用。
3、分词
我们学习的时候是从字开始,慢慢学更难的字,更长的句子,但是我们看作文、聊天的时候其实还是不断再拆分然后理解的。
而ai只认识数字,因此分词器(也称标记器)需要将我们的文字转换为数字数据。拆分不是一个简单的事情,比如按照符号拆分、按照空格拆分?但是不应将常用词拆分为更小的子词
举个例子,jieba是一种常用的中文分词工具,它将中文文本按照词语进行切分,给他“我是胖当当技术,喜欢吃西瓜”,他的分词过程是什么呢。
分词器的原理和过程如下:
-
文本预处理:首先,jieba会对输入的文本进行预处理,包括去除空格、标点符号等无关字符,以及处理特殊字符和数字。
-
正向最大匹配:jieba采用正向最大匹配算法来进行分词。该算法从左到右遍历文本,根据词典中最长的词语长度,尝试匹配最长的词语。如果匹配成功,则将该词语作为一个分词结果,并从文本中去除该词语。如果匹配失败,则将当前字符作为一个分词结果,并从文本中去除该字符。重复这个过程,直到文本被完全分词。
-
逆向最大匹配:为了解决正向最大匹配算法可能导致的歧义问题,jieba还采用了逆向最大匹配算法。该算法从右到左遍历文本,根据词典中最长的词语长度,尝试匹配最长的词语。如果匹配成功,则将该词语作为一个分词结果,并从文本中去除该词语。如果匹配失败,则将当前字符作为一个分词结果,并从文本中去除该字符。重复这个过程,直到文本被完全分词。
-
双向最大匹配:jieba还提供了双向最大匹配算法,结合了正向最大匹配和逆向最大匹配的结果。该算法会比较正向最大匹配和逆向最大匹配的结果,选择词数更少的作为最终的分词结果。
-
HMM模型处理:对于一些未在词典中出现的词语,jieba会使用隐马尔可夫模型(HMM)来进行处理。HMM模型会根据已有的词典和语料库中的统计信息,对未登录词进行分词。
-
输出结果:最后,分词器将最终的分词结果输出。在我们的例子中,输出结果为:['我', '是', '胖', '当当', '技术', ',', '喜欢', '吃', '西瓜']。
通过以上的原理和过程,分词器可以将中文句子切分成一个个词语,然后就到了下一步,把词语映射成数字,让机器可以认识他。
from transformers import AutoTokenizer;
tokenizer = AutoTokenizer.from_pretrained("jieba");
tokenizer("我是胖当当技术,喜欢吃西瓜")
就会得到,input_ids是将文本分词后的整数索引序列,token_type_ids用于区分不同句子的token,attention_mask用于指示哪些token是真实的输入:
{
'input_ids': [2, 4, 6, 8, 10, 12, 14, 16, 18],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]
}
分词器有不同的倾向性:
英文分词器:
空格分词器:适用于简单的英文文本,其中单词之间由空格分隔。
NLTK分词器:适用于英文文本的常规分词任务,提供了多种分词算法和功能。
spaCy分词器:适用于英文文本的高性能分词任务,具有较快的速度和准确性。
中文分词器:
jieba分词器:适用于中文文本的常规分词任务,具有较好的性能和广泛的应用。
THULAC分词器:适用于中文文本的分词和词性标注任务,具有较高的准确性和速度。
HanLP分词器:适用于中文文本的多种自然语言处理任务,提供了多种分词算法和功能。
字符级分词器:
Character-based CNN分词器:适用于处理没有明确分词边界的语言,如中文、日文等,可以将文本切分成字符级别的表示。
Byte-Pair Encoding (BPE)分词器:适用于处理未知词汇和复杂语言结构的任务,可以将文本切分成子词级别的表示。
4、小结
综合高质量数据、隐私、耗时、不确定好坏这些原因,目前大模型不会在线收集数据用于微调,更加不可能重新进行预训练,所以他的学习目前还是来自于制作各种数据集进行训练,也是因此,大模型一般都有自己的擅长领域
比如:
-
GPT适合用于文本生成、机器翻译、对话系统等任务。GPT-3具有强大的语言生成能力,可以生成连贯的文章、对话和答案。
-
BERT擅长在自然语言处理领域。它可以用于文本分类、命名实体识别、问答系统等任务。
-
ResNet适合用于图像分类、目标检测、图像分割等任务。
结合分词器,数据就会变为带有特征的数字向量,多维数组。
这里就解释了这两个问题:
-
ai是怎么学习的,不停的搜网上的信息进行学习,然后人工再问他一些问题,根据答案进行正确错误提示调整吗?
-
在线跟ai的对话会让ai实时学习进步吗?
三、怎么在AI时代下保持竞争力
目前大多数人在考虑的是ai会不会取代自己,导致失业,老实说不提ai了,后面的学生越来越多,自己没什么特长,一样容易失业。
在作者看来ai是帮助人们学习和工作的,主要是提高效率和降低时间成本,所以对于初级人员替代的确非常大,关键是这个时期发展会很迅速,不知道后面是什么样子。
作者这里也没什么建议,只是说一说自己在做什么,希望对读者有所启发。
1、了解最新的ai动态:
技术大会、国外ai社区、国内ai公司,这三个方面是作者了解ai最新动态的路径。通过这些消息途径,作者可以提取到一堆关于ai的信息,虽然有点杂乱无章,而且大家讲的各有不同,总感觉都是说不到点子上。一方面是能暴露出来的知识很少是核心人员写的,另外一方面很多技术人员表达有问题,很难说清楚一些技术点。还有就是做过研究生的都知道,很多东西光顾着吹了,写的很不实在,就是专门让人看的很懵懂。
但是和以前的技术一样的,从大量的文章和ppt里面提炼信息,自己判断对错,能拿出来的ppt和文章就算再绕也是有点东西的,不然不好意思给外界看到。
有问题的要去问,问不到也给自己一个答案,错了不要紧,你造不成什么后果,但是你的认知必须成体系,就算中间有一些错误的分叉,也可以在后面通过应用去修正。就算修正不了,有自己的理解没有问题,所以很多技术理论大家争来争去,但是没有标准答案!
2、了解公司的使用
比如作者公司有拿来做文档问答的,有拿来做ai代码评审的,还有拿来做ai测试用例评审的。
公司里面这些是真实使用的项目案例,而且环境、目的、踩坑很多都是一样的,拿来看文档和代码学习非常好,在应用层是非常典型的。
修改算法、模型参数的在整个业界都是很少的,大家的方向是要知道怎么去用模型、怎么清洗得到有价值的数据、怎么通过api组织ai的答案给用户看、怎么微调让答案更加准确、怎么调整问题让ai更清晰的理解你的问题(也就是调整输入,适应模型的算法,这基本都是大量测试出来的,没有一个算法是一定很好的适应所有方面的问题)
后面作者还会写具体的使用文章,对这些问题会有解说
3、实践
这个可能大多数人不太想做,因为比较麻烦,但是搭建部署、预训练、微调这些实践是必须的,调参或者更换比较不同模型、分词器之间的区别就不是很有必要了。
说白了就是要实践怎么用,不需要太关心怎么用得好,业界的那些报道自然会不断的更新迭代,宣传自己的突出点
4yue的全球机器学习技术大会上,许多人就提出尽快研发像docker一样简单易用的ai模型,所以后面的搭建部署、预训练、微调这些实践会越来越简单
四、总结
ai的学习使用目前是一股风潮,虽然大家对他未来的盈利点在哪里还在摸索中,但是对打工人影响非常明显。
作者也是在摸索前行,有兴趣的读者欢迎交流!