【学习笔记】ChatGPT原理与应用开发——基础科普
HuggingLLM(ChatGPT原理与应用开发)
原文链接:HuggingLLM(ChatGPT原理与应用开发)-课程详情 | Datawhale
此处仅为学习记录和总结
1:基础科普
1.1:自然语言背景
图灵测试
如果一个人(代号C)使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题,其中一个是正常思维的人(代号B),另一个是机器(代号A)。
如果经过若干询问以后,C不能得出实质的区别来分辨A与B的不同,则此机器A通过图灵测试。
1.2:语言模型基础
Token是最小语义单位,即句子由token组成
获取token的方式
🤔英文单词被分割为子词,例如:
annoyingly
=>
["annoying", "##ly"]
##
表示和前一个token直接拼接,没有空格
子词可以同时兼顾词表大小和语义表示
🤔中文被分割为字 + 词
字:独立表示意义(例如:是、有)
词:一个以上字组成的语义单位,拆开可能会丢失语义(例如:长城)
词袋模型
bag of words,BOW
🤔词袋的原理
- 文本中的每个单词都看作是独立的,忽略单词之间的顺序和语法,只关注单词出现的次数
- 每个句子可以表示为一个向量(长度为词表大小),向量的每个维度对应一个单词,维度的值表示该单词在句子中出现的次数
🤔词表表示法的问题
- 向量维度大且稀疏,计算不便
- 忽略了token之间的顺序,丢失语义
词向量
word embedding / word vector
一个token表示成一定数量个的小数(即词向量的维度),例如:
我 [0.07928, 0.37101, 0.94462, 0.87359, 0.55773, 0.13289, 0.22909, ...]
爱 [0.61048, 0.46032, 0.7194, 0.85409, 0.67275, 0.31967, 0.89993, ...]
你 [0.392, 0.13321, 0.00597, 0.74754, 0.45524, 0.23674, 0.7825, ...]
词向量的维度常用:200、300、768、1536等
Embedding技术
将任意文本(或其他非文本符号)表示成稠密向量的方法
概率语言模型
核心:预测下一个token的概率
🤔解码策略
- 贪心搜索(greedy search):只往后看一个词,只考虑下一步最大概率的词
- 集束搜索(beam search):一步多看几个词,看最终句子(生成到句号、感叹号或其他停止符号)的概率。看的越多(num_beams越大),越不容易生成固定的文本
N-Gram语言模型
N表示每次用到的上下文token个数
N=2是Bi-Gram,N=3是Tri-Gram,例如:
句子:人工智能让世界变得更美好
tokens:人工智能/让/世界/变得/更/美好N=2:人工智能/让,让/世界,世界/变得,变得/更,更/美好
N=3:人工智能/让/世界,让/世界/变得,世界/变得/更,变得/更/美好
token的表示是离散的,本质是词表中的每个单词
Gram次数除以Gram总数,就是出现概率
在给定很多语料的情况下,固定当前词,统计下个词出现的频率,例如:
当前词:人工智能N=2时,统计可能的tokens组合
(1)人工智能/让:8次
(2)人工智能/是:2次计算概率
(1)人工智能/让:0.8
(2)人工智能/是:0.2
将token转变为embedding向量
输入:token对应的d维向量X
(1 × d维)
输出:词表大小的N维向量Y
(1 × N维)
计算过程:假设W
(d × N维)是模型参数,则X · W = Y
例如:
import torch
import torch.nn as nnrnn = nn.RNN(32, 64)
input = torch.randn(4, 32)
h0 = torch.randn(1, 64)
# input是包含4个token,每个token是32维
# h0是随机的初始化输出
output, hn = rnn(input, h0)
# ouput包含4个token,每个token是64维
# hn是最后一个token的输出
output.shape, hn.shape
# (torch.Size([4, 64]), torch.Size([1, 64]))# 假设词表大小N=1000
wo = torch.randn(64, 1000)
# 得到4×1000的概率矩阵,每一行概率和为1
probs = nn.Softmax(dim=1)(output @ wo)
probs.shape, probs.sum(dim=1)
# torch.Size([4, 1000]), tensor([1.0000, 1.0000, 1.0000, 1.0000], grad_fn=<SumBackward1>)
1.3:ChatGPT原理基础
transformer
基于注意力机制的编码器-解码器(encoder-decoder架构)
- 编码器:同时利用当前token前后的所有tokens(看历史+未来)
- 解码器:只能利用当前token之前的所有tokens(只看历史)
Seq2Seq(sequence to sequence)架构
- 输入是一个文本序列,输出是另一个文本序列
注意力机制
- 自注意力:自己的每一个token和自己的每一个token的重要性权重
- 多头注意力:自己注意自己重复多次,每个头注意到的信息不同(根据不同权重的注意力提取特征)
- 遮盖多头注意力:遮盖掉未来的所有token,即只看历史
编码器更加适合非生成类任务,解码器则更加适合生成类任务
- 编码器对应自然语言理解(natural language understanding,NLU)
- 句子级别分类:给定一个句子,输出一个类别
- token级别分类:给定一个句子,要给其中每个token输出一个类别
- 解码器对应自然语言生成(natural language generation,NLG)
- 文本续写
- 生成式文本摘要
- 机器翻译
- 改写纠错
命名实体识别
NLU任务中的token级别分类
作用:把句子中的实体(人名、地名、作品等你关注的词,一般是名词)给提取出来
地名实体识别,例如:
句子:中国的首都是北京
tokens:每个字,即:中/国/的/首/都/是/北/京token对应的类别:Begin/End/Others/Others/Others/Others/Begin/End
深度学习模型的微调
把一个开源的预训练模型,放在特定的数据集上微调,让模型能够完成特定的任务
BERT
bidirectional encoder representations from transformers
只使用transformer的编码器
步骤:
- 随机把15%的token盖住(其中80%用
[MASK]
替换,10%保持不变,10%随机替换为其他token) - 利用其他没盖住的token来预测盖住位置的Token
GPT
generative pre-trained transformer
只使用transformer的解码器
🤔GPT的2个特点
- 生成式:一个Token接着一个Token生成文本
- 预训练:在大量语料上训练的语言模型
🤔GPT的发展方向
- 扩大参数规模
- 零样本
样本训练方法
零样本(Zero-shot):直接给模型任务输入让它输出任务结果
少样本(Few-shot):给模型提供一些示例,然后再给出任务,让它给出输出结果
单样本(One-shot):给模型提供一个示例,然后再给出任务,让它给出输出结果
温度(temperature)
🤔集束搜索存在的问题
- 生成的内容容易重复
- 高质量的文本和高概率并不一定相关
🤔温度的作用
- 在多样性生成中,基于已有的上下文随机选择下一个token,温度用于控制这个选择的随机性,即调整输出的概率分布
- 温度越大,输出的概率分布越平滑,高概率词和低概率词的差距越小
- 温度趋近于0,则等价于贪心搜索
重复惩罚参数(repetition_penalty)
重复惩罚参数的作用:避免生成重复的token
🤔温度和重复惩罚参数的区别
- 温度的对象是词表中的所有的token
- 重复惩罚参数的对象是“已生成”的token
- 在生成下个token时,对之前已经生成过的tokens的分数进行平滑
基于采样的方法(选择下一个token)
Top-K:在概率降序排序的情况下,选择K个词(硬截断)
Top-P:在累计概率超过P的词里进行选择
随机采样:基于已有的上下文随机选择
RLHF
Reinforcement Learning from Human Feedback(从人类反馈中进行强化学习)
🚀InstructGPT:用强化学习的算法微调一个根据人类反馈改进的语言模型
🤔Instruct GPT的步骤
- SFT,Supervised Fine-Tuning,有监督微调
- 在有标注的数据上微调训练
- 有标注的数据:输入提示词,输出相应的回复
- RM,Reward Model,奖励模型
- 一个提示词丢给SFT,输出若干个回复,人工对这些回复进行排序
- 每次取排序后的2个结果,让模型学习到好坏评价
- RL,Reinforcement Learning,强化学习
- 使用PPO策略进行训练
- PPO,Proximal Policy Optimization,近端策略优化
- 避免每次太大的更新,提高训练的稳定性
- RM对某个回复打分后,这个打分回传给模型更新参数
- 需要考虑每个token的输出和第一步SFT输出之间的差异性,防止强化学习的过度优化
- 使用PPO策略进行训练
🤔强化学习在文本生成工作的难点
- 训练的稳定性
- 解决方法:PPO策略和与SFT的差异衡量
- 奖励函数的设计
- 解决方法:加入一些语法规则限制,采用最省力法则(语言具有惰性,会朝着使用较少的词语表达尽可能多的语义这个方向进行演化)
🤔Instruct GPT的通用指标
- 有帮助
- 真实性
- 无害性
- 需要解决指标之间的冲突权衡问题
相关文章:
【学习笔记】ChatGPT原理与应用开发——基础科普
HuggingLLM(ChatGPT原理与应用开发) 原文链接:HuggingLLM(ChatGPT原理与应用开发)-课程详情 | Datawhale 此处仅为学习记录和总结 1:基础科普 1.1:自然语言背景 图灵测试 如果一个人&#x…...
基于Web的实验中心工作管理网站的设计与实现
写作任务 一、课题背景 实验中心承担了全校计算机公共基础课程和学院专业课程,需要对实验中心工作进行有效的管理。 二、课题任务 本课题设计和实现实验中心工作管理系统。 系统的主要内容包括: (1)人员管理; &am…...

docker 安装minio
docker pull minio/minio #启动 mkdir -p /root/minio/config mkdir -p /root/minio/datadocker run -d \--name minio \-p 9002:9000 \-p 9001:9001 \--restartalways \-v /root/minio/data:/data \-v /root/minio/config:/root/.minio \-e "MINIO_ACCESS_KEYminioadmin…...
ubuntu下ipmi的使用(4028)
参考ubuntu系统下配置IPMI_ubuntu ipmi-CSDN博客 参考:ipmitool ubuntu 安装_ipmi centos ubuntu使用总结-CSDN博客 1.安装 sudo apt-get -y install ipmitool 2.加载 modprobe ipmi_msghandlermodprobe ipmi_devintfmodprobe ipmi_si 3.使用,查看不到的话&am…...
周记-唐纳德的《计算机程序设计艺术》
用代码生成代码 开发一个协议,字段有些多,每个字段是QT的属性,需要写Q_PROPERTY,一个一个编辑的话比较繁琐,耗费时间。后来就用代码生成了头文件和源文件,get和set还有signal函数,内容基本都是…...
极品飞车6的快捷键与车辆等级
极品飞车,英文全称为Need for Speed,是EA公司于1994年开始研发的赛车类竞技游戏。从1996年的《极品飞车-特别版》、2002年的《极品飞车:闪电追踪2》、2005年的《极品飞车:地下狂飙2》、到2024年《极品飞车:集结》,是70后、80年、90年等几代人…...

计算机毕业设计Python+知识图谱大模型AI医疗问答系统 健康膳食推荐系统 食谱推荐系统 医疗大数据 机器学习 深度学习 人工智能 爬虫 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
纯真社区版IP库CZDB数据格式使用教程
1. 概述 纯真社区版IP库是一种免费且公开的IP地理位置数据库,主要面向非商业用途。其最新推出的CZDB格式是一种全新的数据文件格式,自2024年10月起将成为官方维护和更新的唯一版本。该格式支持同时存储IPv4和IPv6地址信息,具备以下优点&…...

Linux(Centos 7.6)软件包安装
Linux软件安装,常见的有三种方式,rpm方式、yum方式、源码编译安装方式。其中rpm方式可能存在依赖方式,可能会比较麻烦;源码编译安装同样可能会缺少一些编译需要的软件需要安装,也会比较麻烦;相对比较好的方…...

[WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同
[WASAPI] 从Qt MultipleMedia 来看WASAPI 最近在学习有关Windows上的音频驱动相关的知识,在正式开始说WASAPI之前,我想先说一说Qt的Multiple Media,为什么呢?因为Qt的MultipleMedia实际上是WASAPI的一层封装,它在是线…...

【畅购商城】微信支付之支付模块
目录 支付页面 接口 后端实现 前端实现 支付页面 步骤一:创建 flow3.vue组件 步骤二:引入第三方资源(js、css) <script> import TopNav from ../components/TopNav import Footer from …...
网络安全专有名词详解_2
57.Webshell 就是以ASP、php、jsp、cgi等网页文件形式存在的一种命令执行环境,也叫做网页的后门,可以上传下载文件,查看数据库和执行任意的程序命令等。 58.跨站攻击 XSS,是指攻击者利用网站程序对用户输入过滤不足,输…...

【传感器技术与应用】第2章 基本电量传感器,电位器式传感器,电感式传感器,电容式传感器
注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数…...

【day20】集合深入探讨
模块19回顾 在深入探讨模块20之前,让我们回顾一下day19中的关键内容: Collection集合:单列集合的顶级接口,提供了add、addAll、clear、size、isEmpty、remove、toArray、contains等方法。迭代器(Iterator)…...
【英语语法】用must表对过去推测时,要用完成时must have been / must have done(不能直接用过去时)
文章目录 疑问解释1. 表达过去的推测2. 与时态一致3. 语法结构的限制4. 例子对比总结 疑问 This must have been a year-round activity as no structures have been found which would have been used to shelter animals in the winter. 为什么must表示对过去推测要用完成时&…...

数值计算期末考试重点(一)(黄云清版教材)
1.误差的分类 2.绝对误差和绝对误差限 3.绝对误差和绝对误差限 例题(课后习题1.2) 4.有效数字 例题(课后习题1.6) 5.算法的数值稳定性 例题(课后习题1.9) 这个手算比较艰难,还是给计算机算吧&am…...

使用 pushy 热更新后 sentry 不能正常显示源码
问题 使用 Android Studio 打包后,上传使用 sentry 官网命令打包的 sourcemap 文件,sentry能正常显示异常位置源码。 使用 pushy 热更新之后,sentry 不能正常显示异常位置的源代码。 如下图: 问题原因: 使用 pushy …...

IntelliJ IDEA 远程调试
IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时,在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下,我们会通过打 Log 或者 Debug 的方式去定位并解决问题,两种方式各有利弊,今天就简要介绍下如何通过远程 Debug 的情况下…...

Java实现简单爬虫——爬取疫情数据
1.项目准备 在项目中使用到了jsoup和fastjson jsoup用于创建一个连接(绘画) 用于获取和解析HTML页面 而fastjson对数据进行一个格式化 在pom.xml导入坐标 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</a…...

大数据技术-Hadoop(一)Hadoop集群的安装与配置
目录 一、准备工作 1、安装jdk(每个节点都执行) 2、修改主机配置 (每个节点都执行) 3、配置ssh无密登录 (每个节点都执行) 二、安装Hadoop(每个节点都执行) 三、集群启动配置&a…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...