- 2024-12-09
-
回复了主题帖:
Transformer是做什么的?长什么样子
感觉transformer使用word2vec技术,把序列中的词元映射到了低维的向量空间,从而把对序列的分析用量化手段来处理变成了可能。
- 2024-12-07
-
回复了主题帖:
《大语言模型开发:用开源模型开发本地系统》-Llama模型实现及本地开发
Jacktang 发表于 2024-12-7 10:54
Llama是基于Transformer的人工神经网络,这个 Llama模型开发本地系统的方法和步骤看来很复杂。
...
嗯,是的,具体到实现的各个技术细节会比较复杂。
- 2024-12-06
-
发表了主题帖:
《大语言模型开发:用开源模型开发本地系统》-Llama模型实现及本地开发
本帖最后由 ljg2np 于 2024-12-6 16:46 编辑
本文分享书中对“如何实现Llama模型及本地化开发”的阅读理解。
一、引言
LLM的实现基于DNN学习原理,而对于隐藏层的设计大多采用Transformer架构,通过耗费大量的算力进行训练得到预训练模型,区别之处在于数据集选择、参数规模、神经网络架构设计,最后对模型进行测试集检验,通过模型评估进一步优化和检验。
Llama是基于Transformer的人工神经网络,以一系列单词作为输入,递归的预测下一个单词来生成文本。
Llama模型作为开源模型,与闭源的GPT4还有一些差距,但相较于开源的GPT3显现出了明显的技术和性能优势,为我们学习和研究NLP技术提供了平台。
二、Llama模型的设计与实现
书中对Llama模型的实现,从LLM的开发角度进行了阐述,没有展示过多详细的技术细节,但可以让人对Llama模型的设计与实现有一个比较全面和系统的认识。概括起来,主要包括如下几个方面:
1、语料库
Llama预训练数据集的选择,采用了24种语言的语料库,并尽力避免和删除私有语料集。
2、模型组成
Llama按照LLM的一般架构进行拆分,可分为预训练模型、增量模型和微调模型,满足LLM开发和应用的灵活性,并提供了多个版本,见下表。
Llama-chat模型是在Llama预训练模型基础上经过监督微调后推出的应用模型。
3、架构与技术实现。
Transformer模型是Llama模型的核心技术实现,通过该模型对公开的数据集进行预训练,可以得到Llama预训练大模型。
通过Transformer模型加载Llama预训练大模型,就可以进入应用环节,对用户的输入进行处理,可以实现NLP的既定应用。
Meta公布的Llama模型的Python代码中,可以看到具体的实现细节,Llama2 7B采用32个Transformer层和前馈网络层,激活函数采用SwiGLU,采用分组注意力机制,是基于PyTorch架构编写和实现的。
前文《transformer架构与实现》曾介绍了Llama2 7B模型的Transformer架构和内部运作机理,并对其基于PyTorch的实现代码进行了讲解,这里不再重复。
4、参数量计算。
参数量指模型中可学习参数的总数,在LLM中,参数量的计算取决于模型的架构。
Llama2 7B的上下文长度为4096,参数指标见下表:
用Hugging Face的Transformers模块可以读取模型中的参数量:
5、Llama2权重文件夹。
模型格式是模型的对外接口,Meta发布Llama2时提供了两种格式,分为pth格式和hf格式。
pth格式是PyTorch中用于保存模型参数和优化器状态的文件格式,可以使用torch.save函数来加载和保存。
Hugging Face的模型权重文件格式已成为LLM的标准,包括Llama模型在内,几乎所有的LLM都有hf格式存在,可以通过Transformers库读取hf格式的模型结构,代码如下:
6、模型评估标准
模型评估是模型开发过程中的重要环节,对模型的选择、优化、理解和应用有重要作用。
LLM有两种常用的评估方法:自动评估和人工评估。
书中介绍了测评指标和测评模型,其中通义千问模型Qwen-72B在多个中英文下游评测任务上,效果超越现有的开源模型,下图是通义千问给出的模型测试分数比较图。
三、Llama模型开发本地系统
Llama开源模型的实现,为本地开发提供了工具和接口,书中以中文私人定制为例,解析了用Llama模型开发本地系统的实现过程和方法。实现架构图如下:
左侧黄色方框内的部分,是处理中文的LoRA增量模型开发,右侧蓝色方框内是处理私有语料的监督微调模型开发部分。
具体实现过程:
1、对于中文,通过中文语料,采用LoRA的训练方法得到增量模型,LoRA模型属于系统微调,是有监督学习,其与预训练模型结合构成中文完整模型,如下图中蓝框所示。
2、私人定制,采用私人语料库通过监督微调的训练方法来更新模型参数,得到监督微调模型,它在中文完整模型上进行训练,如下图所示。
总结起来,中文私人本地系统的开发流程图如下:
四、技术细节及第三方应用
通过Transformer模型加载Llama预训练大模型,就可以进入模型推理的应用环节。通过对用户的输入进行处理,可以实现NLP的既定应用功能。
1、Hugging Face开发者社区
Hugging Face是一个流行的NLP模型和工具库的开发者社区。
Hugging Face的datasets库,是一个用于管理和处理各种数据集的工具库,它提供了一个统一的接口,简化了数据集的处理流程,使开发者可以更专注于模型的开发和训练。
Hugging Face Transformers库,提供了一些预训练模型,如Llama、BERT、GPT2等,可以用来进行模型训练、推理。借助于Transformers库,通过导入需要的模块,就可以方便的进行量化和分词处理。
Hugging Face 提供了PEFT(参数高效微调)库,集成了LoRA,支持基础模型和LoRA模型同时加载,可以用来完成增量模型和模型微调的处理。
2、开源微调数据集
监督微调在选择预训练模型后,需要准备面向任务的有针对性的微调数据集,这个数据集通常由人工撰写,需要有标签,数量不需要很多,书中给出了一些开源微调数据集。
3、模型接口API
Llama模型的加载:
导入Transformers库里的LlamaTokenizer模块,通过调用from_pretrained()方法,实现Llama基础模型的加载。
利用PEFT库,加载多个LoRA并随时切换:
加载第一个适配器,通过PeftModel.from_pretrained()方法,继续加载使用load_adapter()方法;切换适配器,使用PeftModel的set_adapter()方法。
4、第三方应用示例。
采用第三方工具,加载Llama chat模型(这里是Llama3模型),实现对话,如图所示。
五、小结与讨论
通过这一主题的学习,我了解了Llama模型的设计与实现需要考虑的问题及着手点,加深了Llama模型内部实现机理的学习,掌握了利用Llama模型开发本地系统的方法和步骤,即分析需求,确定架构,准备语料库,本地监督微调和评估优化。
推荐阅读和参考资料:1、LoRA增量模型。
2、CLLM2模型。
-
回复了主题帖:
【一句】来一句话证明你干过嵌入式
曾经在项目里用汇编写过8051的程序,应该算是干过嵌入式吧?
-
回复了主题帖:
AI编程工具来了~
AI编程是大势所趋,程序员的工作以后恐怕就是架构和排错了:loveliness:
- 2024-12-04
-
发表了主题帖:
《大语言模型开发:用开源模型开发本地系统》-transformer模型架构与实现
本文分享书中对“如何实现transformer模型”的阅读理解。
一、引言
transformer模型,以自注意力机制为主要特点,即对输入按照查询Q、键K、值V三部分进行分解,通过自注意力计算,然后叠加得到输出,这项技术在自然语言处理(NLP)领域得到了成熟应用。
transformer模型包括编码器和解码器,每个编、解码器由多个transformer层组成,每个transformer层由嵌入层,残差连接和归一化层,自注意力层和前馈网络层组成。
Llama2模型的transformer架构,与GPT3模型类似,都是纯解码器架构,这是由此类模型的应用需求决定的。
二、原生transformer模型
在实际应用中,transformer模型有许多变体,书中把标准的transformer理论模型称为原生transformer模型。
原生transformer模型,由6层编码器和6层解码器组成,在每个transformer层里,输入经过嵌入层,再通过多头注意力层与由两个线性层和一个激活函数构成的前馈网络层的结合处理,通过残差连接和层归一化处理输出到下一环节。
原生transformer模型的架构图,如下:
三、Llama2的transformer模型
Llama2 7B模型有32个transformer层,在每一层里分组查询注意力层和前馈网络层结合构成注意力模块,输入经过嵌入层处理,通过残差连接和层归一化,进入到注意力模块的处理,然后再经过残差连接和归一化输出到下一层。
在嵌入层上,Llama2使用了旋转字节对编码(RoBPE)技术。
在残差和归一化层的处理上,Llama2采用了RMSNorm进行归一化处理。
分组查询注意力(GQA)是Llama2的一个改进,对多头注意力(MHA)技术与多查询注意力(MQA)技术之间进行了折衷处理。
Llama2的transformer架构图,如下:
四、transformer模型实现
1、原生transformer实现
书中给出了利用PyTorch实现原生transformer模型的代码。
2、纯解码transformer实现
书中针对Meta发布的Llama2中transformer模型的PyTorch实现代码,做了简单的修改(删掉注释、减少层数、将并行运算改为串行)来满足低配运行的需要,介绍了Llama2模型的transformer实现。这是实现代码的组成框架图:
首先导入类库,除了PyTorch,还导入了math和dataclasses、typing等第三方类库。
在Llama2中,定义了Transformer类、前向网络层类FeedForward、层归一化类RMSNorm、自注意力层类Attention、TransformerBlock类,它们都是由PyTorch的nn.Module类继承而来的。
这是RMSNorm类,它执行归一化处理。
这是Transformer类,调用nn.Embedding方法执行嵌入处理,调用RMSNorm执行层归一化处理,可以看出Llama2采用的是预归一化处理。
这是TransformerBlock类,它将自注意力层和前馈网络层组合在了一起。
这是Attention类,其中wq、wk、wv、wo是查询Q、键K、值V和输出O的权重,通过nn.Linear执行线性层调用。
这是FeedForward类,它完成两个线性层和一个激活函数的处理。
Llama2 7B的transformer模型是pth格式模型。
五、小结与讨论
通过这一主题的学习,我进一步了解了transformer模型的架构机理及内部实现技术,并对Llama2 7B模型中transformer架构及代码实现加深了理解和认识。
推荐阅读和参考资料:1、分组查询注意力机制(GQA)。
2、多头注意力机制(MHA)。
3、多查询注意力机制(MQA)
- 2024-12-03
-
回复了主题帖:
《大语言模型开发:用开源模型开发本地系统》-用Numpy实现单层感知机和神经网络
hellokitty_bean 发表于 2024-12-2 22:35
看看,仅仅是看看。。。。。。。。。。。。。。
继续努力。。。。。。。。。。。。。。
谢谢支持和鼓励:congratulate:{:1_144:}
- 2024-12-02
-
发表了主题帖:
《大语言模型开发:用开源模型开发本地系统》-用Numpy实现单层感知机和神经网络
本文分享书中对“从Python Numpy实现单层感知机和神经网络的过程”的阅读理解。
一、引言
Numpy作为Python的类库,应用广泛,对于了解底层逻辑和实现,对于我们之后学习和了解深度学习框架和LLM开发很有帮助,是深度学习的基础库。
没有隐藏层的神经网络,叫单层感知机,也被广泛的称为神经元,它是一种二分类模型;包含隐藏层的神经网络,就是深度神经网络DNN,最简单的DNN就是只有一个隐藏层的DNN。
神经网络的模型调优通过反向传播和权重更新来实现,基本原理是梯度下降思想。
二、单层感知机numpy实现
文中实现了一个单层感知机,网络参数通过随机确定,不能得到准确的结果;通过训练对网络参数的优化,最后达到了预期目的。
我在实现过程中,出现了即便加大训练次数也不能改善学习效果的情况,然后又调整了学习率,也没有改善,最后我对权重和偏差参数的初值进行了设计,得到了准确的结果。
三、神经网络numpy实现
书中实现了一个简单的神经网络,相比于单层感知机的实现,反向传播的梯度计算稍微复杂一些,单层感知机在训练中是权重更新,多层感知网络则是基于链式法则,引入后向反馈,通过梯度算法,经过多轮训练得到网络参数。
参考书中代码,我进行了测试,运行正常,具体实现过程:(numpy代码解析)。
书中将神经网络以类的形式进行了封装(NeuralNetwork),蓝色方块内是我添加的语句,用来将返给外界调用者的变量初始化,forward是前馈网络,backward是反向传播,在训练时被调用来更正权重和偏差参数。
train是训练方法,蓝色方框内是我添加的语句,它将参数{轮数、损失、学习率}返给调用者,以便通过之后的图例进行比较。
calculate_loss方法计算损失,sigmoid是激活函数。
下面是对神经网络的调用,首先进行实例化给nn,采用(10,15,5)的网络结构,训练次数是10000,学习率为0.1。
下图是训练的损失曲线,可以看到学习率为0.1时的训练效果还是不错的。
四、实现、推广与比较
1、布尔运算的实现。
对于简单的基本布尔运算,如与、或、非运算,可以用单层感知机来实现。
通过numpy实现布尔和的单层感知机的处理,我发现对权重参数和偏差参数的初始值的选择对学习很关键,另外,我认为,布尔运算的例子可以通过对参数的简单设计轻松实现,同时也看出参数初值和超参数的选择是有技巧的,这与模型自身的特性(敏感度、鲁棒性等)是有关联的。
按照书中代码我进行了测试,发现对于单层感知机,对权重参数和激活函数的设计其实是很关键的,如果仅采用随机初值,增大训练次数和改变学习率等超参数,并不能有效的提升学习效果,这是我的一个试验体会,我考虑是由于布尔模型的固有特性的缘故,这从其损失值非0即1这一点上也可以看出一些端倪。
2、布尔运算网络。
多个单层感知机组成的布尔运算网络,依然是一种二分类器,例如用三个二分类器组成神经网络,对于神经网络的组成部分,布尔运算按照单层感知机给出权重和偏差,用含有一个隐藏层的神经网络来实现,并给出训练轮数及误差的比较,我把这个作为一个议题,留给感兴趣的人员进行讨论(思路:构建合适的损失函数,避免0-1振荡,来保证训练过程的收敛)。
五、小结与讨论
通过这一主题的学习,我实现了利用numpy库构建单层感知机和神经网络,并用来解决一些问题,对于LLM,网络参数十分庞大,所需算力资源都很可观,借助于深度学习框架,如tensorflow、pytorch、mxnet等,可以更加有效的解决这个问题,通过numpy构建神经网络的学习,为之后的进一步学习奠定了基础。
推荐阅读和参考资料:1、深度学习架构。
2、神经网络的PyTorch实现。
- 2024-12-01
-
回复了主题帖:
《大语言模型开发:用开源模型开发本地系统》-开源大语言模型的架构、训练和推理过程
大模型的泛化,是大模型提高其应用能力的一种手段,它可以通过对训练数据集的干预(数据清洗),以避免和减轻私有数据集对模型训练的影响。
-
回复了主题帖:
《大语言模型开发:用开源模型开发本地系统》-开源大语言模型的架构、训练和推理过程
LoRA作为增量模型出现,需要结合基础大模型一同使用,可以与基础大模型合并,也可以不合并,增量模型不能单独使用。
-
回复了主题帖:
《大语言模型开发:用开源模型开发本地系统》-开源大语言模型的架构、训练和推理过程
预训练后的大模型往往作为二次开发的基础模型,通过模型微调后得到进一步应用,如GPT是基础大模型,微调后的chatGPT应用广泛;Llama模型也有相应的微调模型,供大家进一步使用。
- 2024-11-27
-
发表了主题帖:
《大语言模型开发:用开源模型开发本地系统》-开源大语言模型的架构、训练和推理过程
首先感谢EEWorld和清华大学出版社提供此次书籍阅读和分享的机会,对本书作者的辛勤付出也表示感谢。
本文分享书中对“理解开源大语言模型的架构、训练和推理过程”的阅读理解。
一、引言
本书共分十二章,书中主要讲解了LLM的一些关键技术,本书以开源模型Llama2为主要研究对象就关键技术进行了阐述和介绍。该书并不是一本开发LLM的专著,而是将注意力放在了LLM开发的关键技术和细节上,以开源模型的代表之一Llama2为着手点,就PyTorch库在Llama2的应用进行了解析,书中有代码讲解。
通览此书,感觉书中内容详实,对LLM的发展脉络进行了整理,介绍了AI深度学习的一些基本知识,对一些基础内容进行了概述,如PyTorch应用等,对NLP的主要内容,通过一章的幅度进行了讲解,不失为一本学习NLP技术的比较难得的参考书。
二、模型架构
书中讲到,LLM模型架构,比较成熟的,是基于transformers的架构,无论闭源的GPT,还是开源的Llama。
transformer架构以自注意力机制技术得到广泛推广和应用,分为编码器、解码器和混合编解码器,它们因应用而有不同。
三、模型训练
在LLM的模型训练中,主要是大模型的预训练和模型微调相结合。
对于大模型的预训练,首先对数据集进行划分,分为训练集、验证集和预测集。由于模型的预训练,采用DNN的形式进行,通过训练得到的NN的权重参数和偏差参数的数量非常大,因此将这类模型称为大模型。
LLM的训练是无监督学习模式,基于transformer架构,通过模型训练来提取模型的特征,这与CNN和RNN的架构有所不同。
四、模型推理过程
模型推理过程,按书中的描述,主要分为两类:一类是逻辑自回归,按照之前的语料预测下一词元,典型代表是GPT;一类是自编码模型,这类模型通过上下文关系,来推理得到预测词元,典型的代表是BERT。
五、小结与讨论
总体来说,对于入门级别的读者来说,书中提供的内容和资料还是比较详实和充分的,虽然在成书的当年Meta又推出了Llama3,但对于Llama2的解析,个人认为并不过时,毕竟架构和开源的大方向是不变的,有了这个基础,对于我们了解和应用Llama3也是有帮助的。
推荐阅读和参考资料:1、transformer架构。
2、Llama3技术论文。
- 2024-11-21
-
回复了主题帖:
动手学深度学习(七):循环神经网络与现代循环神经网络
隐藏层的层数与单层神经元个数,作为神经网络设计的可变因素,与训练数据的信息量关系密切。
-
回复了主题帖:
共读入围:《大语言模型开发:用开源模型开发本地系统》
共读计划确认无误,收件地址有变,和联系人已联系。
- 2024-11-20
-
回复了主题帖:
电容并联的作用,直接用一个容量大的不就完事了?这样直接并联是不可能有带通带阻选...
QWE4562009 发表于 2024-11-20 17:45
什么叫标量运算?
标量可以认为是简单的数值,它的运算就是简单的加减,像速度这种有方向的量,只有在一个方向上时,才可以当做标量来处理。
-
回复了主题帖:
怎么快速的获取积分?
是的,要回复20个字以上才有积分的,言简意赅虽好,不到20个字,积分不给的哈。。。
-
回复了主题帖:
人工智能开发必学的数据结构有哪些?
这些数据结构,但凡学习计算机编程语言,就都会学到的,我觉得人工智能的数据结构应该指那些依附于AI特质或NN拓扑的特定结构。
-
回复了主题帖:
充电宝奖品已收到
既有小米的标,又有德州仪器的标,而且一个上,一个下,像拼图似的,给人感觉怪怪的。
-
回复了主题帖:
积分好难挣呀
好在发一条20字以上的回复,让我觉得积分也不是那么难挣,心态平了,真的平了~
-
回复了主题帖:
积分好难挣呀
积分系统有时候还净出问题,下载1个积分的资料,扣我2个积分,真是无语了。