如何用大模型做出一款属于自己的 AI 应用?

语言模型是怎么回事

语言模型( language model,LM )简单来说,就是利用自然语言构建的模型。

自然语言就是我们日常生活、学习和工作中常用的文字。语言模型就是利用自然 语言文本构建的,根据给定文本,输出对应文本的模型。

语言模型具体是如何根据给定文本输出对应文本呢?方法有很多种,比如我 们写好一个模板:“XX 喜欢 YY ”。如果 XX 是我,YY 是你,那就是“我喜欢 你”,反过来就是“你喜欢我”。我们这里重点要说的是概率语言模型,它的核 心是概率,准确来说是下一个 Token 的概率。这种语言模型的过程就是通过已有 的 Token 预测接下来的Token。举个简单的例子,比如你只告诉模型“我喜欢你” 这句话,当你输入“我”的时候,它就已经知道你接下来要输入“喜欢”了。为 什么?因为它的“脑子”里就只有这 4 个字。

好,接下来,我们要升级了。假设我们给了模型很多资料,多到现在网上所 能找到的资料都给了它。这时候你再输入“我”,此时它大概不会说“喜欢”了。 为什么呢?因为见到了更多不同的文本,它的“脑子”里已经不只有“我喜欢你” 这 4 个字了。不过,如果我们考虑的是最大概率,也就是说,每次都只选择下一 个最大概率的 Token,那么对于同样的给定输入,我们依然会得到相同的对应输 出(可能还是“喜欢你”,也可能不是,具体要看给的语料)。对于这样的结果, 语言模型看起来比较“呆”。我们把这种方法叫作贪心搜索( greedy search), 因为它只往后看一个词,只考虑下一步最大概率的词!为了让生成的结果更加 多样和丰富,语言模型都会在这个地方执行一些策略。比如让模型每一步多看 几个可能的词, 而不是就看概率最大的那个词。这样到下一步时,上一步最大 概率的 Token,加上这一步的 Token,路径概率(两步概率的乘积)可能就不是 最大的了。

举个例子,如图 1-3 所示,先看第一步,如果只选概率最大的那个词,那就 变成“我想”了。但是别急,我们给“喜欢”一点机会,同时考虑它们两个。再 往下看一步,“喜欢”和“想”后面最大概率的都是“你”,最后就有了下面几句 (我们附上了它们的概率)。

· “我喜欢你”,概率为 0.3 ×0.8=0.24。 · “我喜欢吃”,概率为 0.3 ×0.1=0.03。 · “我想你”,概率为 0.4 ×0.5=0.2。

· “我想去”,概率为 0.4 ×0.3=0.12。

多看一步大不一样!看看概率最大的成谁了,变成了“我喜欢你”。上面这 种方法叫作集束搜索(beam search),简单来说,就是一步多看几个词,看最 终句子(比如生成到句号、感叹号或其他停止符号)的概率。在上面的例子中, num_beams=2(只看了两个词),看得越多,越不容易生成固定的文本。

好了,其实在最开始的语言模型中,基本就到这里,上面介绍的两种不同 搜索方法(贪心搜索和集束搜索)也叫解码策略。当时更多被研究的还是模型 本身,我们经历了从简单模型到复杂模型,再到巨大复杂模型的变迁过程。简 单模型就是把一句话拆成一个个 Token,然后统计概率,这类模型有个典型代 表——N-Gram模型,它也是最简单的语言模型。这里的 N 表示每次用到的上 下文 Token 的个数。举个例子,看下面这句话:“人工智能让世界变得更美好”。 N-Gram 模 型 中 的 通 常 等 于 2 或 3, 等 于 2 的 叫 Bi-Gram, 等 于 3 的 叫 Tri- Gram。

· Bi-Gram:人工智能/让 让/世界 世界/变得 变得/更 更/美好

· Tri-Gram:人工智能/让/世界 让/世界/变得 世界/变得/更 变得/更/美好

Bi-Gram 和 Tri-Gram 的区别是,前者的下一个 Token 是根据上一个 Token 来的,而后者的下一个 Token 是根据前两个 Token 来的。在 N-Gram 模型中,Token 的表示是离散的,实际上就是词表中的一个个单词。这种表示方式比较简 单,再加上 N 不能太大,导致难以学到丰富的上下文知识。事实上,它并没有 用到深度学习和神经网络,只是一些统计出来的概率值。以 Bi-Gram 为例,在给 定很多语料的情况下,统计的是从“人工智能”开始,下个词出现的频率。假设 “人工智能 / 让”出现了 5 次,“人工智能 / 是”出现了 3 次,将它们出现的频率 除以所有的 Gram 数就是概率。

训练 N-Gram 模型的过程其实是统计频率的过程。如果给定“人工智能”, N-Gram 模型就会找基于“人工智能”下个最大概率的词,然后输出“人工智能 让”。接下来就是给定“让”,继续往下走了。当然,我们也可以用上面提到的不 同解码策略往下走。

接下来,让每个 Token 成为一个 Embedding 向量。我们简单解释一下在这种 情况下怎么预测下一个 Token。其实还是计算概率,但这次和刚才的稍微有点不 一样。在刚才离散的情况下,用统计出来的对应 Gram 数除以 Gram 总数就是出 现概率。但是稠密向量要稍微换个方式,也就是说,给你一个 维的向量(某个 给定的 Token),你最后要输出一个长度为 的向量,N 是词表大小,其中的每 一个值都是一个概率值,表示下一个 Token 出现的概率,概率值加起来为 1。按 照贪心搜索解码策略,下一个 Token 就是概率最大的那个,写成简单的计算表达 式如下。

上面的 W 就是模型参数,其实 X 也可以被看作模型参数(自动学习到的)。 因为我们知道了输入和输出的大小,所以中间其实可以经过任意的计算,也就是 说,W 可以包含很多运算。总之各种张量(三维以上数组)运算,只要保证最后 的输出形式不变就行。各种不同的计算方式就意味着各种不同的模型。

在深度学习早期,最著名的语言模型是使用循环神经网络( recurrent neuraletwork,RNN)训练的,RNN 是一种比N-Gram 模型复杂得多的模型。RNN 与 其他神经网络的不同之处在于,RNN的节点之间存在循环连接,这使得它能够记住之前的信息,并将它们应用于当前的输入。这种记忆能力使得RNN在处理 时间序列数据时特别有用,例如预测未来的时间序列数据、进行自然语言的处理等。通俗地说,RNN就像具有记忆能力的人,它可以根据之前的经验和知识对当前的情况做出反应,并预测未来的发展趋势,如图 1-4 所示。

在图 1-4 中,右边是左边的展开,就是参数,是输入,就是输出。自 然语言是一个 Token 接着一个 Token(Token by Token)的,从而形成一个序列。 参数怎么学习呢?这就要稍微解释一下学习(训练)过程。

如图 1-5 所示,第 一 行就是输入 X,第二行就是输出 Y,SOS( start of sentence )表示句子开始,EOS( end of sentence )表示句子结束。注意,图 1-4 中的 并不是那个输出的概率,而是隐向量。如果需要概率,可以再对 执行张 量运算,归一化到整个词表即可。

上面的 nn.RNN就是 RNN 模型。输入是一个 4 ×32 的向量,换句话说,输入 是 4 个 Token,维度 d=32。h0就是随机初始化的输出,也就是 4 个 Token 中第 1 个 Token 的输出,这里 output 的 4 个 64 维的向量分别表示 4 个输出。hn 就是最后 一个 Token 的输出(它和output 的最后一个 64 维向量是一样的),也可以看成整 个句子的表示。注意,这里的 output 和图 1-5 中的输出 Y 还没有关系。别急,继 续往下看。如果要输出词的概率,就需要先扩充到词表大小,再进行归一化。

这里的 probs 的每一行就是词表大小的概率分布,概率和为 1 ,意思是根 据当前 Token 生成下一个 Token 的概率,下一个 Token 有可能是词表中的任意一 个 Token,但它们的概率和一定为 1 。因为我们知道接下来每个位置的 Token 是 什么(也就是图 1-5 中的输出 Y)。这里得到最大概率的那个 Token,如果正好是 这个 Token,则说明预测对了,参数就不用怎么调整;反之,模型就会调整前面 的参数( RNN、h0、input 和 wo)。你可能会疑惑为什么 input 也是参数,其 实前面我们偷懒了,本来的参数是一个 1000 ×32 的大矩阵,但我们使用了 4 个 Token 对应位置的向量。这个 1000 ×32 的大矩阵其实就是词向量(每个词一行), 开始时全部随机初始化,然后通过训练调整参数。

训练完成后,这些参数就不变了,然后就可以用前面同样的步骤来预测了, 也就是给定一个 Token,预测下一个 Token。如果使用贪心搜索,则每次给定同样的 Token 时,生成的结果就一样。其余的就和前面讲的接上了。随着深度学习 的不断发展,出现了更多比 RNN 还复杂的网络结构,而且模型变得更大,参数 更多,但逻辑和方法是一样的。

好了,语言模型就介绍到这里。上面的代码看不懂没关系,你只需要大致了解每个 Token 是怎么表示、怎么训练和预测出来的就行。简单直观地说,构建 (训练)语言模型的过程就是学习词、句内在的“语言关系”;而推理(预测)就 是在给定上下文后,让构建好的模型根据不同的解码策略输出对应的文本。无论 是训练还是预测,都以 Token 为粒度进行。

准备一本《ChatGPT原理与应用开发》,你就可以用大语言模型轻松做出自己的AI产品。

1. Di一本基于大语言模型进行商业应用开发的书;

2. 以任务(相似匹配、句词分类、文本生成、复杂推理)为中心,内容不仅可用于ChatGPT,也适用于其他大语言模型;

3. 侧重于任务的讲解与设计,思路可用于任何项目;

4. 有详细的示例代码,大部分的代码稍作修改后可用于生产环境,还有Datawhale的HuggingLLM开源教程、全方位助力学习与实践。

全书共8 章内容,第1 章介绍与ChatGPT 相关的基础知识,第2~5 章分别介绍相似匹配、句词分类、文本生成和复杂推理方面的任务,第6~8 章分别介绍ChatGPT 的工程实践、局限与不足,以及商业应用,以帮助读者更好地构建自己的应用。

本书以实践为主,尤其注重任务的讲解和设计,但同时也对自然语言处理相关算法的基本原理和基础知识进行科普性介绍,适合所有对大语言模型感兴趣的开发者阅读。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jquery 合并单元格

原始表格 合并后的单元格 直接上代码 //合并第一列单元格//给tbody下的第一行(tr:first-child)第一个单元格(td).eq(0))//加上rowspan 长度是这个表格tr的长度(attr(rowspan, $("tbody tr").length);)$(tbody tr:first-child td).eq(0).attr(rowspan, $("t…

idea2023 运行多 springboot 实例

概要 1、修改idea运行多实例(本地测试负载) 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发(源码级剖析可用于实际生产项目)_springsecurity redis管理token…

算法导论第十二章练习参考答案(22) - 12.1-12.4

Exercise 12.1-1 任何时候,如果一个节点有一个子节点,就把它当作右子节点,左子节点为NIL。 Exercise 12.1-2 二叉搜索树的属性保证了左子树的所有节点都更小,右子树的所有节点都更大。最小堆属性只保证一般的子节点大于父节点的关…

3.18 杂题小结

类似的对于n个物体根据其某种递减关系选择的题目可以利用数位 :当前字符可以选也可以不选 !:当前字符无法选 思路:需要同一位置多次比对的一般使用动态规划(背包中物品是否拿取、字符串取舍与修改方式等)…

2024华为OD统一考试(C卷)最新题库(Java Python C++)

关于华为OD ​ 华为的员工补充途径有三种,分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径,但是从近几届开始竞争非常激烈,尤其是在CV、AI、NLP等赛道上,所以对于C9等专业的学生来说,可以考虑转向一些冷…

Python轴承故障诊断 (17)基于TCN-CNN并行的一维故障信号识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

Cannot access aliyunmaven ( xxx ) in offline mode and the artifact

记一次Maven无脑报错 报错提示: Cannot access aliyunmaven (https://maven.aliyun.com/repository/public) in offline mode and the artifact 当看到这个报错信息后,首先想到的就是maven环境变量是否配置正确,然而经过一番查看后&#xf…

minio数据迁移工具rclone使用

文章目录 前言一、下载rclone二、安装配置三、迁移命令结尾 前言 Rclone是一个命令行程序,用于管理云存储上的文件。它是云供应商的web存储接口的一个功能丰富的替代品。超过40种云存储产品支持rclone,包括S3对象存储、企业和消费者文件存储服务以及标准…

mysql 索引(为什么选择B+ Tree?)

索引实现原理 索引:排好序的数据结构 优点:降低I/O成本,CPU的资源消耗(数据持久化在磁盘中,每次查询都得与磁盘交互) 缺点:更新表效率变慢,(更新表数据,还要…

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…

【LeetCode热题100】101. 对称二叉树(二叉树)

一.题目要求 给你一个二叉树的根节点 root , 检查它是否轴对称。 二.题目难度 简单 三.输入样例 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出&a…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(后记)

2024.03.05: 测试了开发板网线直连电脑可以传输数据。但是通过开发板→交换机→电脑,没有数据传输。通讯采用UDP通讯,一个是无法满足后续对采集数据的傅里叶变换和傅里叶逆变换的处理。二是无法通过交换机传输数据。 2024.03.07&#xff1a…

【2024第一期CANN训练营】Ascend C算子开发进阶篇

文章目录 【2024第一期CANN训练营】Ascend C算子开发进阶篇1. 工程创建2. Kernel侧核函数实现2.1 核函数定义(add_custom.cpp)2.2 KernelAdd类实现 3. Host侧算子实现(add_custom_tiling.h ,add_custom.cpp)3.1 Tiling…

以电折水智能遥测终端机RTU应用哪些省份?

以电折水主要研究耗电量与取水量之间的关系,分析水电折算系数,进而通过计算耗电量与水电折算系数的乘积来推求取水量。 以电折水智能遥测终端机RTU通过高度集成化设计,巧妙融合了空气开关、开关电源、隔离变压器、接触器、智能电表、RTU、4G…

服务器段的连接端口和监听端口编程实现

new ServerSocket(int)是开启监听端口,并不是连接端口。真正的连接端口是随机开辟的空闲端口,当连接创建完成后,监听关口可以继续等待下一次连接请求,处于空闲等待状态。 编程实现方式 1 、主线程一直处于阻塞等待状态&#xff0c…

精通Python调试技巧:从assert开始

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 使用方法 📒📝 assert的语法📝 assert的用法示例🐾 示例1:基本用法🐾 示例2:检查变量类型🐾 示例3:检查列表长度📒 assert的注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,a

Java 世界破破烂烂,电音小猫缝缝补补

Java 世界破破烂烂,电音小猫缝缝补补 Java 通用代码生成器光 2.4.0 电音之王尝鲜版六正在研发,昨天发布了介绍视频,请见: https://www.bilibili.com/video/BV1yD421j7UP/ 电音之王尝鲜版六支持哑数据模式,支持枚举。…

nginx 报Too many open files

nginx 异常报 Too many open files 上周时,nginx已经报 Too many open files 当时把 配置文件调整最大连接65535了,reload 重新加载nginx后不报错了。 cat /proc/14921/limits |grep "Max open file" * soft nofile 65535 * hard nof…

界面控件DevExpress ASP.NET Scheduler - 助力快速交付个人信息管理系统(下)

DevExpress ASP. NET Scheduler组件能完全复制Microsoft Outlook Scheduler的样式和功能,具有日、周、月和时间轴视图,并包括内置的打印支持,因此用户可以在尽可能短的时间内交付全功能的个人信息管理系统。在上文中(点击这里回顾…

sentry-cli - error: Failed to load .sentryclirc file from project path

Xcode 15.2 warning sentry-cli - error: Failed to load .sentryclirc file from project path (/Users/zhuhongwei/Desktop/pandabill/.sentryclirc)推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于…