AI开发者急需看的大语言模型基本原理

news2025/1/9 18:50:59

在学习大语言模型的基本原理的时候,发现遇到了很多问题,比如一个个单词是怎么转换为向量的,是提前得到的还是训练过程中得到?Transformer的输出向量又是怎么转化为自然语言的?Finetune的时候不是只需要输入和输出吗,为什么FineTune的脚本做了那么多的处理?找了很多资料发现基本都是在讲Transformer的原理,缺乏顶层视角的原理,最后不得已阅读了一下HuggingFace上关于LLaMA的代码才得到答案。

就像程序员也需要知道计算机硬件的基本原理一样,一个AI开发者也需要知道大语言模型的基本原理。本文主要是从AI开发者需要知道的角度来写,所以本文不会去涉及太底层的数学逻辑。下面一起来探讨一下。

整体架构

整体架构

整体框架分为两部分

  1. 分词器(Tokenizer) :将自然语言转化为TokenID的形式,大体可以理解为每个单词对应一个数字。(实际中稍有差异不过不影响理解,后面会详细说明)
  2. 模型:输入是TokenID,输出也是TokenID。大名鼎鼎的Transformer是这里面的一部分,当然了是最核心的部分。

为了便于理解,我们看一下用huggingface的transformers库来写代码是什么样的,做一下对比理解。

python
from transformers import AutoTokenizer, LlamaForCausalLM

# 加载模型
model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")

#加载分词器
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

prompt = "Who is LogicBit?"

#对输入的自然语言进行分词,转化为list[TokenID]
inputs = tokenizer(prompt, return_tensors="pt")

# 模型推理,得到list[TokenID]
generate_ids = model.generate(inputs.input_ids, max_length=30)

# 将模型的输出list[TokenID]转化为自然语言
tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]

从上面可以看出基本是和上面画的整体架构是一致的。使用接口上也是分为了分词器和模型。下面依次看一下具体的细节。

Tokenizer

目的:在计算的时候只能使用数字来进行表示,所以需要将自然语言转化为数字。
编码: 输入一个句子(str),输出:对应的TokenID的列表(List[TokenID]
解码:编码的逆向操作。
基本原理:基于训练样本,通过某种算法得到一个词汇表,然后针对每个词汇进行编号就得到单词与TokenID(也就是编号)的对应关系。

举个例子

假如我的训练样本只有who is LogicBit这句话,那么我的算法就可以直接是每个单词对应一个ID。由于在英文里面空格就是区分两个单词的,所以空格我们就可以不要了。去掉空格相当于只有三个单词。

python

#注意一下以下的代码是一个逻辑上的意思,无法运行。
#按单词出现的顺序进行编号
tokenID['who'] = 1
tokenID['is'] = 2
tokenID['LogicBit'] = 3

#编码
tokenizer.encode('who is LogicBit') = [1, 2, 3]
#解码
tokenizer.decode([1, 2, 3]) = 'who is LogicBit'

#Too Simple, right?
扩展一下

实际使用中,其实没有上面这么简单,训练的算法是比较复杂的。因为这里面有很多的考量。比如为了提高表示效率,一个单词可能对应多个TokenID。
举个例子,look这个单词就有很多状态的词汇,现在进行时looking,过去分词looked,而watch也同样有watchedwatching。如果按照一个词汇对应一个ID,我们的词汇表就有6个['looking', 'looked', 'looking', 'watch', 'watched', 'watching'],但是如果按照词根来的话就可以表示为[look, watch, ed, ing],只需要4个即可表示。这个时候比如说looking就会对应两个TokenID, ['look', 'ing']。下面具体来看个实际的例子。

python

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

tokenizer.encode("who is LogicBit?")
#output:[1, 1058, 338, 4522, 293, 21591, 29973]
# 1 是llama词汇表中一个句子的起始字符,对应'<s>',每个句子都会有,自动加上去的。
# who      -> 1058
# is       -> 338
# LogicBit -> [4522, 293, 21591] ,这里就出现了一个单词对应多个tokenid的情况。
# ?        -> 29973

模型

image.png

模型整体的输入输出:输入也就是上面分词器得到的List[TokenID],输出也是List[TokenID]Embedding模块: 将每个tokenID转化为一个向量,向量的维度是模型定义的(看模型大小)。 Transformer:输入一排向量,输出另一排向量(向量的个数是一样的,向量的维度可能不一样) Output Translation:将Transformer的输出转为TokenID。

Embedding模块

image.png

  1. TokenID转化为向量

由于一个数字无法有效的衡量一个单词的含义,比如['who', 'error']对应[1058, 1059],但是你不能说whoerror是很像的东西吧,只能说毫无关系。由于一开始不知道哪个关系更近,所以就用一个向量来表示。先假设各个单词之间没有关系,然后在训练中学习。

python
## 还是前面的例子
tokenID['who'] = 1
tokenID['is'] = 2
tokenID['LogicBit'] = 3

#假设三个单词没有关系,由于词汇表容量是3,就可以用一个三维的向量来表示。
Vector['who'] = [1, 0, 0]
Vector['is'] = [0, 1, 0]
Vector['LogicBit'] = [0, 0, 1]

为什么要用这种方式? 因为这种表示方法在数学上是正交的,模型在计算相关度的时候一般用cosincosincosin的方式来做,这样子各个单词相关度都为0.

  1. Embedding

前面假设各个单词是没有关系,现实里面却是有关系的,所以我们还是需要学习这个关系。

Embedding=W∗VtokenEmbedding = W*V_{token}Embedding=W∗Vtoken​

VtokenV_{token}Vtoken​即为上面的tokenID转化后的向量。W为需要学习的参数矩阵,[DoutDim,DvocSize][D_{outDim},D_{vocSize}][DoutDim​,DvocSize​],DoutDimD_{outDim}DoutDim​是由Transformer定义的向量维度,像LLaMA就是768维,DvocSizeD_{vocSize}DvocSize​就是词汇表的大小。

Transformer

由于我们主要是讲LLM的顶层原理,所以Transformer的原理不是我们的重点,我们这里主要讲一下Transformer给我们提供的能力。(感兴趣的可以自己可以看下李宏毅老师的视频,讲得非常清楚)

transformer

我们这里只画了Decoder,是因为现在大部分生成式的模型都是用的Decoder。
输入输出:都是一排向量。

Output Translation

由于transformer的输出是每个token对应一个向量,但是我们需要的是tokenID,才能转化为自然语言。

输出转换

输出是一个tokenID,其实是一个分类问题,只不过我们这里的类别比较多,和词汇表的大小一致。如何将一个向量转换为一个类别,机器学习里面有一个通用的做法,就是把这个向量的每个维度看成是一个类别,值代表概率。

  1. 线性转换:由于Transformer的输出的向量维度一般和词汇表的大小不一致,所以需要先转化为词汇表的大小维度,这个有点像是前面embedding的反向操作。经过转换后得到维度为词汇表大小的向量。

output=w∗zoutput = w*zoutput=w∗z

其中w的维度为(Dimvoc,DimT)(Dim_{voc},Dim_{T})(Dimvoc​,DimT​),z为transformer的输出,维度为(DimT,1)(Dim_T,1)(DimT​,1).

  1. Softmax:将各个维度进行一次计算得到每个维度的概率。其实也可以不做这个操作,只是原来的数值加起来可能大于1,或者小于1,不方便后续算法的处理而已。

假设输出向量x=[x1x2…xn]假设输出向量 x= \begin{bmatrix} x_1\x_2\…\x_n \end{bmatrix}假设输出向量x=​x1​x2​…xn​​​

那么第i个类别的概率p(i)=exi∑k=1nexk那么第i个类别的概率 p(i) = \frac{e{x_i}}{\sum_{k=1}ne^{x_k}}那么第i个类别的概率p(i)=∑k=1n​exk​exi​​

  1. 选择:选择概率最高的作为输出的值即可。(注意一下,实际上大语言模型在生成答案的时候会加入随机性,并不一定选择概率最高的,只不过概率最高的被选中的几率更大)

预训练

给定上文,预测下文。简单来说就是预测下一个词是什么?举个例子,假设样本里面有一句话['I', 'am', 'happy'],针对这句话的任务如下:

输入I,预期输出am
输入I am,预期输出 happy
:上面只是为了方便理解,实际上并不是真的将一句话拆分成多次预测任务,而是并行计算,也就是输入I am happy, 输出 I am happy,然后算法在计算某个位置的输出的时候不会考虑后面的结果是什么,也就达到了基于上文去预测的效果。

收集大量的句子按照如上进行训练。

Finetune

给定一个输入输出对的数据集,基于这个数据集在预训练的模型上面做微调。举个例子来说明一下:

输入:who are you? 输出:I am a llm.
之前一直认为就是直接按照这个输入输出进行微调的。
其实并不是,这个看上面的预训练就可以理解了,在预训练的时候llm的输入输出是一样,所以在微调的时候输入输出应该也是一样的(不然transformer的attention计算会出问题,这个留给各位思考一下为什么? )。所以需要将上面两句话合并,也就是输入输出都是who are you? I am a llm.一般Finetune的脚本都会做这个处理。
这里可能又会产生一个疑问?如果是这样子的话,那大语言模型的输出不是会把我们的问题带上吗,但是使用像chatgpt的时候,输出并没有包括输入的问题。这个是因为在对话的时候会做特殊处理,输出的内容会将问题过滤掉。但是原始的输出是会包括输入的内容的。

python

#使用huggingface的generate没有做处理的时候,就可以看到输出是带了输入的。
model.generate()

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

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

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

相关文章

百度驾驶证C++离线SDK V1.1 C#接入

百度驾驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 下载 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.…

不用Linux也可以的强大文本处理方法

不用Linux也可以的强大文本处理方法 标题党了&#xff0c;其实是论VIM的使用。 做生物信息分析最合适的还是Linux操作系统&#xff0c;所以生信宝典在最开始就推出了Linux学习系列&#xff0c;由浅入深的讲述了Linux学习中的关键点。 主要文章列举如下&#xff1a; Linux学…

连续上榜|全息网御实力入选《中国网络安全行业全景图》

2024年4月12日&#xff0c;国内网络安全专业媒体安全牛正式发布第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;。 本次全景图研究历时近4个月&#xff0c;共收到510家国内安全厂商4941项申报&#xff0c;实际收录2413项&#xff08;包含部分往…

Flutter 之 HTTP3/QUIC 和 Cronet 你了解过吗?

虽然 HTTP3/QUIC 和 cronet 跟 Flutter 没太大关系&#xff0c;只是最近在整理 Flutter 相关资料时发现还挺多人不了解&#xff0c;就放到一起聊聊。 本篇也是主要将现有资料做一些简化整合理解。 前言 其实为什么会有 HTTP3/QUIC &#xff1f;核心原因还是现有协议已经无法满…

van-uploader 在app内嵌的webview中的一些坑

问题&#xff1a; 部分版本在ios 中没有问题&#xff0c;但是安卓中不触发图片选择和拍照&#xff08;之前是可以的&#xff0c;可能是没有锁定版本&#xff0c;重新发版导致的&#xff09;。在ios中下拉文案是英文&#xff0c;html配置lang等于 zh 也没有用&#xff0c;ios里…

强化网络安全防线,您的等级保护措施到位了吗?

在这个信息化飞速发展的时代&#xff0c;网络安全已经成为我们每个人都需要关注的问题。无论是企业还是个人&#xff0c;我们的工作和生活都越来越依赖于网络。确保网络环境的安全&#xff0c;防止信息泄露和网络攻击&#xff0c;已经成为了一项至关重要的任务。等级保护制度作…

Oracle 正则,开窗,行列转换

1.开窗函数 基本上在查询结果上添加窗口列 1.1 聚合函数开窗 基本格式: ..... 函数() over([partition by 分组列,...][order by 排序列 desc|asc][定位框架]) 1&#xff0c;partition by 字段 相当于group by 字段 起到分组作用2&#xff0c;order by 字段 即根据某个字段…

​面试经典150题——对称二叉树

1. 题目描述 2. 题目分析与解析 2.1 思路一——递归 为了解决问题“检查一个二叉树是否是对称的”&#xff0c;我们需要判断树的左子树和右子树是否是彼此的镜像。这意味着树的左子树的左侧应该与右子树的右侧相同&#xff0c;左子树的右侧应该与右子树的左侧相同。 定义问题…

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…

Gitee和Git学习笔记

Gitee和Git指令 Gitee提交代码方法1 先将仓库clone到本地&#xff0c;修改后再push到 Gitee 的仓库方法2 本地初始化一个仓库&#xff0c;设置远程仓库地址后再做push 切换分支下载代码通过git clone克隆仓库通过下载 ZIP 的方式下载代码 Git提交指令 解决本地库同时关联GitHub…

货币保卫战,美联储降息预期推迟,油价飙升110美元,亚洲市场股债汇三杀,各国央行操作难度上升!

货币保卫激战 美联储降息预期一降再降&#xff0c;叠加中东局势变化带来避险需求飙升&#xff0c;美元连续第五天上涨之际&#xff0c;新兴市场再次打响“货币保卫战”&#xff0c;而更大的风险似乎仍未过去。亚洲市场普跌&#xff0c;日股跌近2%&#xff0c;韩国股指跌超2%&a…

【好书推荐6】《Excel函数与公式应用大全for Excel 365 Excel 2021》

【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》 写在最前面《Excel函数与公式应用大全for Excel 365 & Excel 2021》关键点内容简介作者简介前言/序言目录 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&…

新手怎么做好抖音小店?这六点是做店的根本,新手商家做店必读

大家好&#xff0c;我是电商花花。 只要我们开通抖音小店&#xff0c;且缴纳好类目保证金&#xff0c;就可以正常选品&#xff0c;上架商品进行售卖了。 如果你是刚开通抖音小店&#xff0c;想要做好抖音小店&#xff0c;下面这几点&#xff0c;一定要注意看。 一、开通精选联…

低版本Oracle客户端或者CMD连接Oracle 12c数据库报错ORA-1017 ORA-12560

exp test_user/test_user123456jgzh fileC:\jgzh.dmp owner(msagx) compressy; exp test_user/test_user123456jgzh fileD:\jgzh.dmp tables(msagx.C_CB_STUDENT,msagx.C_CB_SUBJECT) feedback10000 compressy;

残差网络理解

看了知乎的一篇关于残差网络的文章&#xff0c;https://zhuanlan.zhihu.com/p/72679537&#xff0c;我想发表一点我自己的看法&#xff01; 1.我对残差网络的理解 残差网络&#xff08;ResNet&#xff09;确实与传统的卷积神经网络&#xff08;CNN&#xff09;在结构上有所不同…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

冯诺依曼与进程【Linux】

文章目录 冯诺依曼体系结构&#xff08;从硬件的角度描述&#xff09;冯诺依曼体系结构&#xff08;从软件的角度描述&#xff09;操作系统&#xff08;软件&#xff09;理解管理系统调用和库函数进程查看进程的两种方式 通过系统调用获取进程的PID和PPID通过系统调用创建进程-…

解决Error (169281)、Error (169282)报错问题,QuartusII设置Virtual Pin虚拟管脚的详细操作方法

解决Error(169281)、Error(169282)报错问题,QuartusII设置Virtual Pin虚拟管脚的详细操作方法 1,QuartusII报错信息2,解决办法3,重新编译,成功参考文献: 1,Quartus如何设置虚拟管脚Virtual Pin(具体设置方法) 1,QuartusII报错信息 报错原因:    为了验证FPGA工…

Nginx内存池相关源码剖析(三)小块内存分配逻辑

在Nginx中&#xff0c;小块内存通常指的是那些大小相对较小、分配和释放频率较高的内存块。这些内存块由于数量众多、管理复杂&#xff0c;因此需要使用一种高效的内存管理机制来减少内存管理的开销和内存碎片的产生。 Nginx内存池通过一种预分配和复用的方式来管理小块内存。当…

1688店铺商品接口全攻略:一键获取商品信息,轻松玩转电商数据!

1688店铺所有商品接口技术详解 一、引言 随着电子商务的快速发展&#xff0c;越来越多的商家选择通过1688平台开展业务。为了方便商家获取店铺内所有商品的信息&#xff0c;1688平台提供了相应的API接口。本文将详细介绍如何使用这些接口获取店铺所有商品的信息&#xff0c;以…