大模型入门 ch01:大模型概述

2024-09-03 06:04
文章标签 入门 概述 模型 ch01

本文主要是介绍大模型入门 ch01:大模型概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是github上的大模型教程LLMs-from-scratch的学习笔记,教程地址:教程链接

在这里插入图片描述

STAGE 1: BUILDING

1. 数据准备与采样

在这里插入图片描述
LLM的预测过程,是一个不断预测下一个词(准确的说是token)的过程,每次根据输入的内容,预测下一个词,然后将新的句子重新丢入模型预测,得到下下个输出,重复这个过程,直到模型输出结束标志。

正如上面所说,准确来说,大模型不是预测下一个单词,而是预测下一个tokentoken是模型预测输出的单位,可能不止一个单词,也可能小于一个单词(例如先输出一个单词的前半部分,然后根据前文再推导出单词后缀)。

tokenization是大模型中重要的一部分,决定了模型如何将输入的句子拆分开,根据拆分后输出的token,预测下一个token

有许多tokenizer,例如可以简单地根据空格拆分句子,或者GPT使用的BPE tokenizer
在这里插入图片描述

  1. 人为定义的Tokenizer
    • 规则型Tokenizer:这种类型的tokenizer通常是基于一些预定义的规则,比如空格、标点符号等来切分文本。例如,简单的空格分割就是基于空格将句子切分成单词。这种tokenizer是人为定义的,不需要训练。
  2. 训练得到的Tokenizer
    • 基于统计的Tokenizer:这种tokenizer会基于大量的文本数据统计信息来决定最佳的切分点。例如,字节对编码(Byte Pair Encoding, BPE)、WordPiece等算法,它们会通过训练数据来学习如何将单词切分成子词单元。这种tokenizer需要通过训练过程来优化其切分规则。

简单的说,一个tokenizer就是一本词典,告诉预处理的时候,输入的句子要如何拆分成一个一个token,并且tokenizer提供了每个token对应的索引位置,这些索引通常被用作查找表(look-up table)中的键,以获取token的嵌入向量(embedding vector)。嵌入向量是token在连续向量空间中的表示,它们通常是通过训练得到的,并且能够捕获token的语义信息。
嵌入矩阵(embedding matrix)是一个大型的矩阵,其中每一行对应词汇表中一个token的嵌入向量。

如何处理没有见过的词:正如上图所示,tokenizer包含很小的词组,因此一个大的单词,即使是一个随便拼的单词,也能被拆分成许多小的token组合而成,但是准确率和效率可能不高。

2. 模型架构

在这里插入图片描述
蓝色部分就是transformer,LLM通过重复这一模块,以及在每一层使用多个注意力头来扩大模型规模。(每一层有多个transformer,然后重复多层)
关于transformer的介绍可以阅读其他博客。

STAGE 2: PRETRAINING

类似GPT和LLAMA,都采用了自回归模型来预训练。
自回归训练(Autoregressive Training)是一种用于语言模型(如GPT)的训练方法,旨在让模型通过学习上下文来预测序列中的下一个token。该方法是生成模型的重要组成部分,特别适用于文本生成任务。下面详细介绍自回归训练的过程及其背后的原理。

自回归模型的基本思想是通过递归的方式生成序列中的每个token。具体来说,模型从序列的第一个token开始,通过观察当前已经生成的部分,逐步预测下一个token,直到生成完整的序列。

数学上,自回归模型的目标是通过给定先前的tokens来估计下一个token的条件概率,即:
P ( x t ∣ x 1 , x 2 , … , x t − 1 ) P(x_t | x_1, x_2, \dots, x_{t-1}) P(xtx1,x2,,xt1)

2.1 数据准备
  • 输入数据:预训练使用的文本数据通常是未经标注的自然语言文本。训练时,数据会被token化成一个个离散的单位(例如单词、子词或字符)。
  • 序列处理:文本数据被分割成固定长度的序列(例如512个token)。每个序列会被用作模型的输入,其中部分token将被用于预测下一个token。
2.2 模型输入和输出
  • 输入序列:输入序列通常是一个连续的文本片段,例如 ["The", "cat", "is", "on", "the", "mat"]
  • 目标序列:目标序列是输入序列右移一个位置后的版本,模型的目标是基于输入序列预测目标序列的每个token。例如,输入 ["The", "cat", "is", "on", "the"] 的目标序列是 ["cat", "is", "on", "the", "mat"]
2.3 损失函数
  • 交叉熵损失:训练时,模型生成的每个token的概率分布与目标token的真实分布之间的差异由交叉熵损失函数来衡量。公式为:
    Loss = − ∑ t = 1 T log ⁡ P ( y t ∣ x 1 , … , x t − 1 ) \text{Loss} = -\sum_{t=1}^{T} \log P(y_t | x_1, \dots, x_{t-1}) Loss=t=1TlogP(ytx1,,xt1)
    其中, y t y_t yt 是目标token, P ( y t ∣ x 1 , … , x t − 1 ) P(y_t | x_1, \dots, x_{t-1}) P(ytx1,,xt1) 是模型预测的目标token的概率。

STAGE 3: FINETUNING

在预训练好的模型上进行微调,根据微调的目的,可以有两种情况,一种是基于分类任务,一种是基于指令任务。

1. 分类任务

分类任务较为简单,只需要将模型的最后一层全连接层(例如图中的768到50257,50257是tokenizer的词汇量)的维度转换为分类任务的维度,例如一个二分类任务,我们替换掉最终的50257的词汇表查找维度,改为2个维度的分类任务即可。

在这里插入图片描述

微调的时候不需要微调全部的参数,作者指出,随着微调层数的增多,微调任务的准确率没有显著上升,并且会带来更多的微调耗时。

2. 指令微调

相比于分类任务,大家更关心的可能是指令微调,如何构建一个私人,适合下游子任务的交互大模型。

通过对应任务要求,给出指令,输入,输出的数据集,微调大模型在特定任务上的能力。
在这里插入图片描述
与预训练不同,预训练是一个无监督训练的过程,不需要标签,给定一个文本后,只需要不断地做next token prediction就可以,指令微调是一个有监督的训练过程。

在指令微调过程中,损失的计算主要依赖于生成的输出序列与目标序列(即期望响应)之间的差异。通常使用交叉熵损失来衡量模型生成的每个token与目标序列中的对应token之间的差异。

  • 输入序列:包含指令(或提示),例如:“Translate the following English sentence to French: ‘Hello, how are you?’”
  • 目标序列:包含期望的响应,例如:“Bonjour, comment ça va?”

损失计算过程

  • Token化:输入序列和目标序列首先被token化,即被分解为一个个离散的token。
  • 模型预测:模型基于输入序列生成一个输出序列。在训练时,模型逐个token生成预测结果。
  • 交叉熵损失
    • 对于每一个生成的token,计算它与目标token之间的交叉熵损失。
    • 对于整个序列,交叉熵损失的公式为:
      Loss = − 1 T ∑ t = 1 T log ⁡ P ( y t ∣ X , y 1 , … , y t − 1 ) \text{Loss} = -\frac{1}{T} \sum_{t=1}^{T} \log P(y_t | X, y_1, \ldots, y_{t-1}) Loss=T1t=1TlogP(ytX,y1,,yt1)
      其中 T 是序列的长度, P ( y t ∣ X , y 1 , … , y t − 1 ) P(y_t | X, y_1, \ldots, y_{t-1}) P(ytX,y1,,yt1)是模型预测的token y t y_t yt 的概率。
    • 换句话说,对于序列中的每个token,模型计算生成该token的概率(基于先前的上下文),然后计算模型输出的概率分布与目标分布之间的交叉熵。

这篇关于大模型入门 ch01:大模型概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132230

相关文章

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应