自然语言处理:大语言模型入门介绍

自然语言处理:大语言模型入门介绍

  • 语言模型的历史演进
  • 大语言模型基础知识
    • 预训练Pre-traning
    • 微调Fine-Tuning
      • 指令微调Instruction Tuning
      • 对齐微调Alignment Tuning
    • 提示Prompt
      • 上下文学习In-context Learning
      • 思维链Chain-of-thought
      • 提示开发(调用ChatGPT的API)
  • 大语言模型未来展望
  • 参考文献

随着自然语言处理(Natural Language Processing, NLP)的发展,此技术现已广泛应用于文本分类、识别和总结、机器翻译、信息提取、问答系统、情感分析、语音识别、文本生成等任务。
研究人员发现扩展模型规模可以提高模型能力,由此创造了术语——大语言模型(Large Language Model, LLM),它代指大型的预训练语言模型(Pre-training Language Model, PLM),其通常包含数千亿(甚至更多)个参数。大语言模型的一个最显著的进展是OpenAI基于LLM开发的聊天机器人ChatGPT,在此篇博客中,我将介绍大语言模型的历史演进、基础知识、核心技术以及未来展望等,并通过调用API介绍ChatGPT是如何搭建的。

语言模型的历史演进

语言模型(LM)是为了对词序列的生成概率进行建模,从而预测未来或缺失的词的概率,其发展主要有以下三个阶段:

  • 统计语言模型(SLM):基于统计学习方法(如马尔可夫假设)建立词预测模型,根据最近的上下文预测下一个词。
  • 神经语言模型(NLM):通过神经网络(如循环神经网络RNN)来描述预测单词序列的概率。
  • 大语言模型(LLM):研究人员发现扩展模型规模可以提高模型能力,通过使用Transformer架构构建大规模语言模型,并确立了“预训练和微调”的范式,即在大规模语料库上进行预训练,对预训练语言模型进行微调以适配不同的下游任务,并提高LLM的各项性能。

大语言模型基础知识

预训练Pre-traning

模型的预训练首先需要高质量的训练数据,这些数据往往来自于网页、书籍、对话、科学文献、代码等,收集到这些数据后,需要对数据进行预处理,特别是消除噪声、冗余、无关和潜在有害的数据。一个典型的预处理数据流程如下:

  • 质量过滤:删除低质量数据;
  • 去重:删除重复数据;
  • 去除隐私:删除涉及隐私的数据;
  • Token化:将原始文本分割成词序列(Token),随后作为大语言模型的输入。

目前大语言模型的主流架构可分为三大类型:编码器-解码器、因果解码器和前缀解码器,还有一种利用上述三种架构搭建的混合架构:

  • 编码器-解码器架构:利用传统的Transformer架构,编码器利用堆叠的多头自注意力层(Self-attention)对输入序列进行编码以学习其潜在表示,而解码器对这些表示进行交叉注意力(Cross-attention)计算并自回归地生成目标序列。目前只有少数LLM是利用此架构搭建,例如T5、BART。
  • 因果解码器架构:它采用单向注意力掩码,以确保每个输入token只能关注过去的token和它本身。输入和输出token通过解码器以相同的方式处理。GPT系列、OPT、BLOOM和Gopher等模型便是基于因果解码器架构开发的,目前使用较为广泛。
  • 前缀解码器架构:前缀解码器架构又称非因果解码器架构,它修正了因果解码器的掩码机制,以使其能够对前缀token执行双向注意力,并仅对生成的token执行单向注意力,这样,与编码器-解码器架构类似,前缀解码器可以双向编码前缀序列并自回归地逐个预测输出token,其中在编码和解码的过程中共享相同的参数。使用此架构的代表:GLM-130B和U-PaLM等。
  • 混合架构:利用混合专家(MoE)策略对上述三种架构进行扩展,例如Switch Transformer和GLaM等。

微调Fine-Tuning

为了使大语言模型适配特定的任务,可使用指令微调(Instruction Tuning)和对齐微调(Alignment Tuning)等技术方法;由于大语言模型包含了大量的任务,如果进行全参数微调将会有较大开销,对参数进行高效微调的方法有:适配器微调(Adapter Tuning)、前缀微调(Prefix Tuning)、提示微调(Prompt Tuning)和低秩适配(LoRA)等,高效微调的方法在此暂不展开介绍,有兴趣的小伙伴可以自行查阅相关资料。

指令微调Instruction Tuning

指令微调通过使用自然语言描述的混合多任务数据集进行有监督地微调,从而使得大语言模型能够更好地完成下游任务,具备更好的泛化能力。在此过程中伴随着参数的更新。

对齐微调Alignment Tuning

对齐微调旨在将LLM的行为与人类价值观或偏好对齐。它需要从人类标注员(需要具备合格的教育水平甚至满足一定学历要求)中收集高质量的人类反馈数据,然后利用这些数据对模型进行微调。典型的微调技术包括:基于人类反馈的强化学习(RLHF)。

为了使大语言模型与人类价值观保持一致,学者提出了基于人类反馈的强化学习(RLHF),即使用收集到的人类反馈数据结合强化学习对LLM进行微调,有助于改善模型的有用性、诚实性和无害性。RLHF采用强化学习(RL)算法,例如近端策略优化(Proximal Policy Optimization, PPO)通过学习奖励模型使LLM适配人类反馈。

提示Prompt

为了使语言模型完成一些特定任务,利用在模型的输入中加入提示的机制,使得模型得到预想的结果或引导模型得到更好的结果,注意与微调不同,在提示这一过程中,无需额外的训练和参数更新。

上下文学习In-context Learning

上下文学习(In-context Learning, ICL)是由GPT-3正式引入,它的关键思想是从类比中学习,它将查询的问题和一个上下文提示(一些相关的样例)连接在一起,形成带有提示的输入,并将其输入到语言模型中进行预测。

思维链Chain-of-thought

思维链(Chain-of-thought, CoT)是一种改进的提示策略,旨在提高LLM在复杂推理任务中的性能,例如算术推理、常识推理和符号推理。具体做法是将中间推理步骤纳入到提示中,引导模型预测出正确结果。据相关论文,这种能力可能是在代码上训练而获得。

提示开发(调用ChatGPT的API)

ChatGPT是使用OpenAI开发的大语言模型进行聊天的web网站,其本质是调用ChatGPT的API完成各项任务,下面演示了使用ChatGPT的API完成总结的任务,除此之外,它还可以完成推理、翻译、问答、校对、扩展等多项任务,有时需要借助ICL或CoT获得更好的结果(前提是你需要从OpenAI官网获得API的密钥key)

import openai
import os
fron dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv("OPENAI_API_KEY")def get_completion(prompt, temperature=0, model="gpt-3.5-turbo"):messages = [{"role": "user", "content": prompt)]response= openai.ChatCompletion.create(model=model,messages=messages,temperature=temperature, # temperature为模型的探索程度或随机性,其值是范围在0~1的浮点数,值越高则随机性越大,说明更有创造力。)return response.choices[0].message["content"]text = f"""
XXXXXXXX
"""
prompt = f"""
Summarize the text delimited by triple backticks into a single sentence.
```{text}```
"""
response = get_completion(prompt)
print(response)

ChatGPT的web网站或者聊天机器人通常包含三个角色(role)的消息(messages),包括:用户(user)的消息,ChatGPT/聊天机器人(assistant)的消息和系统(system)的消息。下面以搭建一个“订餐机器人”为例:

  • system messages:用于设置机器人的行为和人设,作为高层指令指导机器人的对话,用户一般对此不可见;
  • user messages:是用户的输入;
  • assistant messages:是机器人的回复。

代码示例如下:

import openai
import os
fron dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv("OPENAI_API_KEY")def get_completion_from_messages(messages, temperature=0, model="gpt-3.5-turbo"):response= openai.ChatCompletion.create(model=model,messages=messages,temperature=temperature, # temperature为模型的探索程度或随机性,其值是范围在0~1的浮点数,值越高则随机性越大,说明更有创造力。)return response.choices[0].message["content"]messages = ["role": "system","content": "你现在一个订餐机器人,你需要根据菜单收集用户的订餐需求。菜单:汉堡、薯条、炸鸡、可乐、雪碧。","role": "user","content": "你好,我想要一个汉堡。","role": "assistant","content": "请问还有其他需要的吗?","role": "user","content": "再要一份可乐。",
]response=get_completion_from_messages(messages)
print(response)
# 输出示例:
# 好的,一份汉堡和可乐,已为您下单。

借助上述代码示例,设计一个GUI或Web界面就可以实现人机交互,修改system messages即可更改聊天机器人的行为并让其扮演不同的角色。

大语言模型未来展望

  • 更大规模: 模型的规模可能会继续增大,从而提高模型的表现力和语言理解能力。
  • 更好的预训练: 改进预训练策略,使模型更好地理解语义和上下文,提高模型在各种任务上的迁移能力。
  • 更好的微调: 开发更有效的微调方法,以在特定任务上获得更好的性能。
  • 多模态: 将语言模型与视觉、声音等其他模态相结合,实现跨领域的多模态智能应用。
  • 工具:利用搜索引擎、计算器和编译器等外部工具,提高语言模型在特定领域的性能。

参考文献

大语言模型综述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接

FlaUi输入账号密码

FlaUI是一个用于自动化Windows桌面应用程序的开源UI自动化库,通常用于自动化Windows应用程序的测试和操作。如果你想使用FlaUI来输入账号和密码,你需要编写一些C#或其他支持.NET的编程代码来实现这一目标。以下是一个使用FlaUI来输入账号和密码的简单示例…

计算机安全学习笔记(II):自主访问控制 - DAC

书接上篇博客,自主访问方案是指一个实体可以被授权按其自己的意志使另一个实体能够访问某些资源。DAC的一种通常访问方式是在操作系统或数据库管理系统中运用的访问矩阵(access matrix)。 矩阵中的一维由试图访问资源的被标识的主体组成。这个列表一般由用户或用户…

无涯教程-进程 - 组会话控制

在本章中,我们将熟悉进程组,会话和作业控制。 进程组(Process Groups ) - 进程组是一个或多个进程的集合,一个进程组由一个或多个共享相同进程组标识符(PGID)的进程组成。 会话(Sessions) - 它是各种进程组的集合。…

简述docker映射(Mapping)和挂载(Mounting)

映射的概念: 将容器内的端口映射到主机的端口上,这样就可以通过主机的网络接口与容器内部进行通信。主机上对应端口的请求会被转发到容器内部,从而实现对容器内部程序的通信访问(注意!这里提到的容器内部的端口并不一定…

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中,全部都是单线的程序,也就是从头到尾…

多线程MySQL分页查询-性能优化

MySQL分页查询优化 一、背景二、原因三、解决四、原理探究 https://blog.csdn.net/hollis_chuang/article/details/130570281 总结: 一、背景 业务背景:给C端10万级别的用户,同时发送活动消息,活动消息分为6类。数据背景&#…

RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建

一、简介 RocketMQ的前身是Metaq,当 Metaq 3.0发布时,产品名称改为 RocketMQ MetaQ2.x版本由于依赖了alibaba公司内部其他系统,对于公司外部用户使用不够友好,推荐使用3.0版本。 项目地址: https://github.com/alibaba/RocketMQ

测试驱动开发(TDD)

测试驱动开发(TDD) 本篇文章简单叙述一下什么是测试驱动开发,以及怎么进行测试驱动开发! TDD (Test Driven Development):(源于极限编程(XP))在不…

STM32f103入门(2)流水灯蜂鸣器

流水灯 /* #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ #de…

前端工程化之规范化

规范化是我们践行前端工程化中重要的一部分。 为什么要有规范化标准 俗话说&#xff0c;无规矩不成方圆&#xff0c;尤其是在开发行业中&#xff0c;更是要有严谨的工作态度&#xff0c;我们都知道大多数软件开发都不是一个人的工作&#xff0c;都是需要多人协同的&#xff0…

版本控制工具Git常见用法

Git 是一个非常强大和灵活的版本控制工具&#xff0c;提供了许多命令和功能来管理代码的版本、分支、合并等。以下是一些 Git 的详细用法&#xff1a; 配置相关命令&#xff1a; 设置用户名和邮箱&#xff1a; git config --global user.name "Your Name" git conf…

【C++心愿便利店】No.3---内联函数、auto、范围for、nullptr

文章目录 前言&#x1f31f;一、内联函数&#x1f30f;1.1.面试题&#x1f30f;1.2.内联函数概念&#x1f30f;1.3.内联函数特性 &#x1f31f;二、auto关键字&#x1f30f;2.1.类型别名思考&#x1f30f;2.2.auto简介&#x1f30f;2.3.auto的使用细节&#x1f30f;2.4.auto不能…

批量根据excel数据绘制柱状图

要批量根据Excel数据绘制柱状图&#xff0c;可以使用Python中的pandas和matplotlib库来实现。下面是示例代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt import os def draw_bar_chart_from_excel(file_path, x_column, y_column, output_folder): …

Linux——基础IO(2)及动静态库多种方式使用及制作

目录 0. 前言 1. 文件存储设备—磁盘 1.1 文件及存储介质 1.2 磁盘结构 1.3 磁盘存储结构 1.4 磁盘的抽象&#xff08;虚拟、逻辑&#xff09;结构 1.5 磁盘分区管理 2. 理解文件系统 2.1 Linux磁盘文件管理 2.2 文件inode属性及Data block数据追溯 2.3 inode编号及…

2022年06月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;公共子序列 我们称序列Z < z1, z2, …, zk >是序列X < x1, x2, …, xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, …, ik >&#xff0c;使得对j 1, 2, … ,k, 有xij zj。比如Z < a, b, f, c > 是X < a, b, c, f, b, …

数据库操作语句

一&#xff0c;SQL分类 DDL&#xff1a;数据定义语言 DML&#xff1a;数据操纵语言 DQL&#xff1a;数据查询语言 DCL&#xff1a;数据控制语言 创建数据库和表 #创建数据库 create database 数据库名; #创建数据表 create table 表名 (字段1 字段1类型(字段长度) 字段限制,字…

网站常见安全漏洞 | 青训营

Powered by:NEFU AB-IN 文章目录 网站常见安全漏洞 | 青训营 网站基本组成及漏洞定义服务端漏洞**SQL注入****命令执行****越权漏洞****SSRF****文件上传漏洞** 客户端漏洞**开放重定向****XSS****CSRF****点击劫持****CORS跨域配置错误****WebSocket** 网站常见安全漏洞 | 青训…

算法通关村——数论经典问题解析

1. 辗转相除法 主要目的是获取两个数里面的最大公约数。 public int gcd(int a, int b) {int k 0;do {k a % b;a b;b k;} while (k ! 0);return a;}2. 素数和合数 素数的要求是必须大于等于2&#xff0c;并且只能被1和它本身整除。 判断的方法比较简单&#xff0c;就是从…

用户端Web自动化测试_L4

目录&#xff1a; selenium多浏览器处理执行 javascript 脚本headless无头浏览器使用capability配置参数解析企业微信实战cypress测试框架介绍Playwright测试框架介绍 1.selenium多浏览器处理 多浏览器测试背景 用户使用的浏览器(firefox,chrome,IE 等)web 应用应该能在任何…