大语言模型(LLM)
大语言模型 (LLM - Large Language Model) 是一类基础模型,经过大量数据训练,使其能够理解和生成自然语言和其他类型的内容,以执行各种任务。
大语言模型通常基于深度神经网络构建。其中,GPT-3使用了 Transformer 模型结构,它是一种基于自注意力机制(Self-Attention)的架构。
Transformer模型由多个编码器(Encoder)和解码器(Decoder)组成。在GPT-3中,只使用了编码器部分,因为它是一个单向语言生成模型。
语言模型前世今生
Embedding模型、Transformer模型、Bert模型 之间的关系?
- Embedding模型:是一种将离散的符号数据(如单词、字符)映射到连续向量空间中的技术。在自然语言处理中,常用的Embedding模型有Word2Vec、GloVe等,它们可以将文本数据转换为密集的向量表示,有助于模型更好地理解语言的语义和语法。
- Transformer模型:是一个通用的深度学习模型架构,主要用于处理序列数据。它包含了编码器和解码器两部分,通过自注意力机制和位置编码等技术来处理序列数据,并在机器翻译、文本生成等任务中取得了很好的效果。
- BART - Google开源
- GPT - OpenAI开源
- XLNet - Google开源
- T5 - Google开源
- RoBERTa - Facebook开源
- DistilBERT - Hugging Face发布的精简版BERT模型
- BERT模型整合了Embedding和Transformer: BERT(Bidirectional Encoder Representations from Transformers)模型是基于Transformer架构的深度学习模型,它整合了Embedding模型和Transformer模型的优点。具体来说,BERT模型首先使用了Embedding技术将文本数据转换为向量表示,然后在Transformer的基础上进行了预训练和微调,使得模型可以同时理解上下文和双向语境,适用于多种自然语言处理任务。
- import transformers
- tokenizer: 对文本句子进行向量表示 (包括句子的向量值和位置占用情况)
- model(bert): model 模型,直接训练 (定义好优化器、损失函数、评估标准)
- optimizer = tf.keras.optimizers.Adam(learning_rate=1e-5)
- loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
- metrics = ['accuracy']
- model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
- " --- "
- test_encodings = tokenizer(test_texts, truncation=True, padding=True, return_tensors='tf')
- predictions = model.predict(test_encodings)
- probs = tf.nn.softmax(predictions.logits, axis=1) # 使用softmax将logits转换为概率分布,指数次幂,都是整数,加和求概率分布
- predicted_class_index = tf.argmax(probs, axis=1).numpy() # 找到概率最高的
综上所述,Embedding模型是一种数据处理技术,Transformer模型是一种通用的序列处理架构,而BERT模型则是在Transformer基础上结合了Embedding技术和预训练微调方法,用于处理自然语言处理任务。它们之间的关系是Embedding技术为Transformer模型提供了数据表示方式,而BERT模型则是Transformer模型在自然语言处理领域的一个重要应用。
Seq2Seq 和 Attention,在 Transformer模型中又扮演了什么角色呢?
-
Seq2Seq(Sequence-to-Sequence): Seq2Seq模型是一种用于处理序列到序列(sequence-to-sequence)任务的模型架构。在Transformer中,编码器(Encoder)和解码器(Decoder)的结构就是基于Seq2Seq模型设计的。具体来说,编码器负责将输入序列(如源语言句子)编码成一个上下文向量(context vector),解码器则根据这个上下文向量生成输出序列(如目标语言句子)。
- 假设我们有一个词典包含1000个单词,每个单词用一个长度为100的密集向量表示。
- 那么“hello”的one-hot vector经过嵌入层映射后就变成了一个长度为100的向量,这个向量包含了“hello”的语义信息。
- 整个过程就是:嵌入层可以将高维稀疏的one-hot向量转换为低维稠密的向量表示。
-
Attention机制: Attention机制在Transformer模型中被广泛应用。它通过计算输入序列中不同位置之间的关联程度,帮助模型更好地理解和处理序列数据。在编码器和解码器中,Attention机制可以用来关注输入序列的重要部分,并在解码器中将这些信息与上下文向量结合,从而提高模型对序列之间关系的理解和表示能力。
- 例如:用户:Hello,你好!机器人:Hi there! 你今天过得怎么样?用户:今天很忙,工作很忙碌。
- 我们会发现用户回复的过程中的回答,就是在强化上一个问题的过程,那么这个时候如何纠正呢?
- 我们通过源码会发现,例如最开始,我们会对 “今天很忙,工作很忙碌”,通过神经网络的传递,是一个平均权重的过程。
- 这个地方就有意思了,我们会把实际的结果: 解码的结果会和编码的结果,类似做了一个加权平均,这样你的编码结果有问题,就会得到一个中和误差的作用。
- 这样我们训练出来的模型,就会不断的接近我们 上下文的结果了。
总体来说,Seq2Seq模型在Transformer中负责序列到序列的转换任务,而Attention机制则是帮助模型在处理序列数据时关注重要信息的关键技术。它们共同作用于Transformer模型中,使得模型在自然语言处理等领域取得了非常好的效果。
Seq2Seq 和 Attention的结合
没加 Attention
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
# 然后拿 decoder_outputs 去输出层预测
加入 Attention,明显感觉到信息量的增多
# Attention层,不仅有解码器的输出,还融入了编码器的输出
attention_layer = Attention()
attention_output = attention_layer([decoder_outputs, encoder_outputs])
# 合并Attention输出和解码器输出
decoder_concat_input = Concatenate(axis=-1)([decoder_outputs, attention_output])
# 然后拿 decoder_concat_input 去输出层预测
在上面的代码示例中,我们添加了一个Attention层,它能够根据解码器的当前状态和编码器的输出计算Attention权重,并将这些权重应用于编码器的输出,从而使解码器更关注输入序列中的重要部分。这样可以提高模型对序列之间关系的理解和表示能力,进而改善模型的翻译或生成效果。
RNN、LSTM 和 GRU 之间有什么关系呢?
RNN(Recurrent Neural Network)、LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)都是深度学习中常用于处理序列数据的神经网络模型,
它们之间有一些联系和区别:
联系
- RNN: RNN是一种经典的循环神经网络结构,用于处理序列数据,如文本、时间序列等。它的每个时间步都会接收输入和前一个时间步的隐藏状态,并产生一个输出和新的隐藏状态。
- LSTM: LSTM是RNN的一种变体,专门设计用来解决长期依赖问题。它引入了门控机制(gating mechanism),能够有效地控制信息的传递和保存,从而更好地处理长序列数据。
- GRU: GRU也是一种类似于LSTM的门控循环单元,但它的结构更简单,只有更新门和重置门两个门控单元。相对于LSTM,GRU在一些任务上计算速度更快,且具有更少的参数。
区别
- 内部结构: RNN的内部结构比较简单,每个时间步只有一个隐藏状态;LSTM和GRU引入了门控单元,使得模型能够更好地处理长序列和长期依赖关系。
- 门控机制: LSTM包含了输入门、遗忘门和输出门等门控单元,能够精确控制信息的流动和保存;GRU只有更新门和重置门,结构更简单。
- 参数数量: LSTM的参数数量相对较多,因为它包含了更多的门控单元和记忆单元;GRU的参数数量相对较少,计算速度更快。
总体来说,RNN是一种基础的序列模型,LSTM和GRU是对RNN的改进和扩展,能够更有效地处理长序列和长期依赖关系。在实际应用中,可以根据任务需求和数据特点选择合适的模型来进行建模和训练。
大语言模型
基本介绍
1.大语言模型和机器学习、深度学习之间存在一些本质上的不同和变化
- 范围和规模:大语言模型通常是指具有巨大规模的语言模型,它们可以在大规模文本数据上进行训练,并具备处理更广泛和复杂的语言表达的能力。而机器学习和深度学习是更广泛的概念,包括了多种算法和模型,可以用于解决各种不同的问题,不仅限于语言处理。
- 架构和技术:大语言模型通常采用了一些先进的架构和技术,例如Transformer、BERT等,这些模型结构和训练方法的提出和发展,使得大语言模型在语言理解和生成任务上取得了重大突破。而机器学习和深度学习中的模型和算法也在不断发展和改进,但并没有专门针对语言处理任务的特殊性进行优化。
- 训练数据和计算资源:大语言模型通常需要大量的训练数据和强大的计算资源来进行训练,例如GPT-3模型使用了数十亿个单词和数千个GPU进行训练。而机器学习和深度学习的训练也需要大量数据和计算资源,但并不一定要达到大语言模型的规模。
综上所述,大语言模型在语言处理领域的应用基于机器学习和深度学习的基础上,但在范围、规模、架构和训练资源等方面有其独特的特点和变化。
2.GPT-3模型和我们一起做的机器学习模型在训练过程上存在一些本质性的区别。
- 数据规模:GPT-3是一个巨大的语言模型,它使用了超过1750亿个参数,并且在大规模的文本数据上进行了训练。相比之下,我们一起做的机器学习模型可能使用的数据规模较小。
- 训练方法:GPT-3采用了自监督学习的方法进行训练,它通过预测文本中下一个词的任务来学习语言的表示,而无需人工标注的标签。而我们一起做的机器学习模型可能需要有标注的数据集,并使用监督学习的方法进行训练。
- 损失函数:GPT-3采用了最大似然估计的损失函数进行训练,目标是最大化模型生成真实数据的概率。而我们一起做的机器学习模型可能根据具体任务选择不同的损失函数,例如交叉熵损失函数用于分类任务。
- 训练资源:GPT-3的训练过程需要大量的计算资源和时间,通常需要使用分布式计算和大规模集群来进行。而我们一起做的机器学习模型可能会使用较小规模的计算资源进行训练。
总的来说,GPT-3模型和我们一起做的机器学习模型之间的本质性区别在于数据规模、训练方法、损失函数和训练资源等方面的差异。这些差异导致了GPT-3的语言表示和语言生成能力更强大,但同时也需要更多的计算资源和时间来进行训练。
3.大模型如何选型?如何基于场景选用 ChatGLM、LlaMa、Bert 类大模型?
- ChatGLM 大模型:ChatGLM 是一个面向对话生成的大语言模型,适用于构建聊天机器人、智能客服等对话系统。如果你的应用场景需要模型能够生成连贯、流畅的对话回复,并且需要处理对话上下文、生成多轮对话等,ChatGLM 模型可能是一个较好的选择。ChatGLM 的架构为Prefix Decoder,训练语料为中英双语,中英文比例为1:1。所以适合于中文和英文文本生成的任务。
- LlaMA 大模型:LLaMA(Large Language Model Meta AI)包含从 7B 到 65B 的参数范围,训练使用多达14,000亿 tokens 语料,具有常识推理、问答、数学推理、代码生成、语言理解等能力。它由一个 Transformer解码器组成。训练预料主要为以英语为主的拉丁语系,不包含中日韩文。所以适合于英文文本生成的任务。
- Bert 大模型:Bert 是一种预训练的大语言模型,适用于各种自然语言处理任务,如文本分类、命名实体识别、语义相似度计算等。如果你的任务是通用的文本处理任务,而不依赖于特定领域的知识或语言风格,Bert 模型通常是一个不错的选择。Bert 由一个 Transformer 编码器组成,更适合于 NLU相关的任务。
构建大模型步骤
- 数据准备: 收集并准备大量的文本数据,这些数据可以来自于互联网、文本语料库或者特定领域的数据集。
- 模型选择: 选择适合任务需求的预训练模型,如GPT、BERT等,并下载相应的模型文件和配置文件。
- 微调模型: 使用准备好的数据对预训练模型进行微调,以适应特定的任务或领域。微调的过程包括加载预训练模型、添加任务特定的头部、定义损失函数和优化器,然后进行训练。
- 评估和调优: 在微调完成后,对模型进行评估和调优,包括计算指标(如准确率、损失值等)、验证模型效果并进行参数调整。
- 部署和应用: 将调优后的模型部署到实际应用中,如构建对话系统、文本生成应用等,以实现具体的自然语言处理任务。
基于大语言模型开发
LangChain(标准框架)
LangChain是一个基于语言模型开发应用程序的框架。
它由Harrison Chase于2022年10月作为开源软件项目推出,当时他在机器学习初创公司Robust Intelligence工作。
LangChain是一个开源框架,它可以实现以下应用程序:
- 数据感知:将语言模型连接到其他数据源(方便:人工智能的开发者进行开发,例如: RAG - 检索增强生成)
- 自主性:允许语言模型与其环境进行交互
LangChain的主要价值在于:
- 组件化:为使用语言模型提供抽象层,以及每个抽象层的一组实现。组件是模块化且易于使用的,无论您是否使用LangChain框架的其余部分。
- 现成的链:结构化的组件集合(入门更容易),用于完成特定的高级任务。
LangChain 就是一个 LLM 编程框架,你想开发一个基于 LLM 应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。下面我们从新兴的大语言模型(LLM)技术栈的角度来看看为何它的理念这么受欢迎。
以OpenAI为例(非标框架)
如何基于 OpenAI(这个基于自己的框架) 开发应用呢,可以遵循以下步骤:
- 获取API访问权限: 首先,需要获取OpenAI的GPT-3.5 API的访问权限。可以通过OpenAI的官方网站申请API密钥,并按照他们的文档指引完成认证和设置。
- 选择开发环境: 确保你有一个Python开发环境,并安装必要的Python库,例如requests用于API请求的库。
-
编写代码: 使用Python编写代码,利用API密钥发送请求并与GPT-3.5模型进行交互。以下是一个简单的示例代码,假设你已经有了API密钥:
import openai # 设置你的API密钥 openai.api_key = 'your_api_key_here' # 定义要翻译的英文文本 english_text = "Hello, how are you?" # 调用OpenAI GPT-3.5 Turbo模型进行翻译 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": f"Translate the following English text to Chinese: {english_text}"}, {"role": "user", "content": english_text} ] ) # 提取中文翻译结果 chinese_translation = response.choices[0].message.content # 打印翻译结果 print("翻译结果:", chinese_translation)
-
测试和优化: 运行代码并测试模型的输出结果。根据输出结果进行调整和优化,可以尝试不同的请求格式、参数设置以及处理模型输出的方式。
- 应用部署: 将开发好的应用部署到实际的应用环境中。可以将代码封装为API服务,提供给其他系统或应用调用,也可以构建用户界面,让用户直接与模型进行交互。
- 监控和维护: 定期监控应用的运行情况和模型的性能,及时处理可能出现的问题,并根据用户反馈和数据分析来优化模型和应用。
- 请注意,使用GPT-3.5 API需要遵守OpenAI的使用政策和限制,包括每个请求的token数量、请求频率等。确保在开发过程中遵循相关规定,以保证使用顺畅和合法。
参考文档位置:
- OpenAI API地址: https://platform.openai.com/docs/api-reference/moderations
- LangChain 文档地址: https://python.langchain.com/docs/use_cases/summarization/
- LangChain API地址: https://api.python.langchain.com/en/latest/langchain_api_reference.html
- https://smith.langchain.com
- https://www.youtube.com/playlist?list=PLiuLMb-dLdWIYYBF3k5JI_6Od593EIuEG
- http://www.zhangshiyu.com/post/69575.html
- https://aitutor.liduos.com/01-llm/01-1.html
- https://aigc.phodal.com/misc/faq.html
- https://aitutor.liduos.com/ref/prompt.html
- https://openai.xiniushu.com/docs/guides/moderation
- https://zhuanlan.zhihu.com/p/644500258
- https://www.ciyundata.com/post/36953.html