语言模型进化史(上)

由于篇幅原因,本文分为上下两篇,上篇主要讲解语言模型从朴素语言模型到基于神经网络的语言模型,下篇主要讲解现代大语言模型以及基于指令微调的LLM。文章来源是:https://www.numind.ai/blog/what-are-large-language-models

一、语言模型

简单来说,语言模型能够以某种方式生成文本。它的应用十分广泛,例如,可以用语言模型进行情感分析、标记有害内容、回答问题、概述文档等等。但理论上,语言模型的潜力远超以上常见任务。

想象你有一个完备的语言模型,可生成任意类型的文本,并且人们还无法辨别这些内容是否由计算机生成,那么我们就可以使其完成很多事,例如生成具有代表性的内容,如电子邮件、新闻稿、书籍和电影剧本等。再进一步来看,还可以用其生成计算机程序,甚至构建整个软件。只要愿意,我们还可以让它生成科学论文。如果语言模型真正“完备”,那么它们生成的论文将能够以假乱真,与真实论文没有区别,这意味着必须对语言模型展开实质性研究!

当然,就目前而言,完备的语言模型还无法实现,不过也展示出了这些系统的潜力。语言模型不仅仅能“预测文本”,它们的潜力可能远超想象。

现在我们回顾一下语言模型的发展历程,从最初的朴素语言模型到目前基于Transformer的LLM(大语言模型)。

二、朴素语言模型

语言模型是机器学习模型, 因此它们会学习如何生成文本。教授它们的方法(即训练阶段)是提供一个大规模文本语料库,它们将从中学习如何模仿生成这些文本的过程。

也许这听起来有些抽象,但创建一个朴素语言模型实际上非常简单。你可以将文本语料库分成一定大小的字符串块,并测量它们的频率。下面是我使用大小为2的字符串得到的结果:

图源:《机器学习导论》

这些字符串块被称为n-gram(其中n表示字符串的大小,因此此处n=2)。通过这些n-gram,你可以像玩多米诺骨牌一样生成文本。从一个初始的n-gram开始,例如“th”,然后根据测量的频率随机选择一个以初始n-gram结尾的n-gram。在这个例子中,如果选择“hi”,就会形成  “th”+“hi”=“thi”。然后再继续添加以“i”开头的n-gram,以此类推,生成整段文本。不过正如你所想,这些n-gram模型并不能生成足够连贯的文本。但也说得通,因为该模型的记忆能力很有限, 只通过前一个字符来预测下一个字符。如果我们使用n=4的字符串,结果会稍微好一些:

“complaine building thing Lakers inter blous of try sure camp Fican chips always and to New Semested and the to have being severy undiscussion to can you better is early shoot on”

现在出现了一些拼写正确的单词,但结果仍不够理想!理论上,进一步增加n的值,输出结 果会得到改善,但在实践中,我们无法显著增加n值,因为这需要一个庞大的数据集来训练模型。最后,我们可以尝试将单词而不是字符作为基本单位(在自然语言处理术语中称为“词元(token))。这会改善输出结果,但因为n<6,生成的文本仍然缺乏连贯性。

这些朴素语言模型的记忆能力始终有限,因此无法生成超过一定长度的连贯文本。尽管如此, 它们仍具备一定用途。几年前,朴素语言模型被广泛用于文本分类和语音识别,且如今仍被用于语言识别等任务。然而,对于更高级的文本理解和文本生成任务来说,朴素语言模型就捉襟见肘了。因此需要神经网络。

三、基于神经网络的语言模型

现代语言模型基于(人工) 神经网络。神经网络是受人脑启发开发出的计算机,能够通过任务示例学习如何执行任务。这种机器学习形式也被称为深度学习, 因为其中的网络由多个计算层组成(因此被称为“深度”网络)。在神经网络中,通过遍历任务示例并迭代修改网络参数以优化任务目标,从而实现学习。你可以将这些参数想象成一组旋钮(knob),通过左右旋动以改进目标,但区别是计算机为你进行改进,并且知道如何同时正确地朝着改进方向进行调整(得益于著名的反向传播算法)。因此,网络会遍历任务示例(通常以几百个示例为一批),并在这一过程中优化目标。以下是一个正在被优化的目标示例(称为成本函数,数值越小越 好):

成本函数随训练迭代次数的变化。图源:《机器学习导论》

随着模型的训练,成本函数值会逐渐下降,意味着模型在任务处理上变得更加优秀。

在该案例中,我们想要生成文本。 目前,标准的方法是训练一个模型,通过前面的单词预测后面的单词。由于下一个单词有多种可能性,模型会学习为每个可能的单词关联一个概率。以下是对“the cat sat on the”之后可能出现单词的概率分布可视化图像:

改编自《机器学习导论》

一旦拥有这样的预测模型,就可以从预测概率中抽样来生成下一个单词,然后将该单词重新输入到网络,再抽样一个新的单词,以此类推,从而生成文本。这一生成过程被称为自回归,因为网络利用自己的预测结果来生成新的预测。虽然有人对此提出了异议,认为这并非最佳方法,但目前而言,这就是最实际的操作方式, 且效果也出奇地好!

曾经用于建模语言的第一类神经网络是RNN(循环神经网络),尤其是LSTM(长短期记忆网络)架构。RNN就像一个逐个阅读单词的小型机器, 在这一过程中,它会更新思维状态(mental state)。这种思维状态如同记忆,使它们在生成文本时能大概记住一段时间的信息。相比n-gram模型,RNN模型能够获得更为优越的性能。

RNN创建之初, 神经对话模型(Neural Conversational Model)给我留下了深刻印象。该模型是Google于2015年基于电影字幕训练的一个特殊LSTM模型, 当时这个模型已经算得上 是LLM了(也可能是首个LLM):拥有3亿参数,并在约10亿词的数据上进行训练。由于  电影字幕是对话形式,因此可直接将该模型用作聊天机器人。以下是不同人类输入对应的回答示例:

人类:你叫什么名字?
机器:我叫朱莉娅。
人类:你是什么时候出生的?
机器:7月20日。

人类:我的名字是大卫。我的名字是什么?
机器:大卫。
人类:天行者是谁?
机器:他是一个英雄。
人类:天空是什么颜色?
机器:蓝色。
人类:血液是什么颜色?
机器:和黑眼圈的颜色相同。

如你所见,该模型能够闲聊,同时也对世界有一定了解,这些知识完全是通过学习如何预测文本获得的!我记得自己曾对这一事实很感兴趣:学习预测文本迫使你理解世界(但并不意味着这个过程很容易)。然而,该模型也有一些明显的短板:它经常出错,并且与类似基于LSTM的模型一样,无法生成长篇连贯的文本。理论上,循环神经网络可以长时间记忆事物,但在实践中,它们却往往很快就忘记了:经过几十到一百个词之后,它们就会开始偏离主题,不再连贯。

2017年,人们针对短期记忆问题提出一种解决方案——Transformer。Transformer是一种基于注意力机制的新型神经网络架构(本质上是一种选择操作),下图来自介绍Transformer的论文,用以说明其在翻译任务中的工作原理:

Transformer架构。来源:https://arxiv.org/abs/1706.03762

Transformer在各个方面都可圈可点,但最值得一提的是, 该架构在文本建模方面表现非常出色,并且很适合在GPU上运行,从而处理(和学习)大量数据。正是有了Transformer这 种架构,才使得现代LLM得以兴起(或至少起到了很强的促进作用) 。

(上篇结束)

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

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

相关文章

【Linux】进程控制详解

目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

Excel中文显示问号

直接上操作步骤&#xff1a; 1&#xff09;打开Excel -> 文件 -> 选项 -> 语言 2&#xff09;Office 显示语言&#xff0c;“中文(简体)”设置为首选。 3&#xff09;Office创作语言和校对&#xff0c;“中文(简体)”设置为首选。 网上用记事本转换的方法&#xff0c;…

【c++】STl-list使用list模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …

点大商城V2版 2.5.7全开源版 全插件+百度+支付宝+QQ+头条+小程序端+uniapp开源端

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。分销&am…

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…

babyAGI(7)-babyCoder源码阅读3(任务执行相关agent)

1. 任务分配agent 该agent会根据&#xff0c;objective和task的内容自动分配要执行的agent code_writer_agent 编写新代码或增加新功能使用该agentcode_reactor_agent 任务涉及到修改或优化执行该agentcommand_executor_agent 任务涉及到文件操作执行该agent 整个任务分配的…

前端的拖拽序列(drag)

html和css代码如下 <style>.item {width: 200px;height: 50px;background: rgb(15, 226, 219);margin: 10px 0;padding-left: 20px;border-radius: 10px;line-height: 50px;}.item.move {background: transparent;color: transparent;border: 1px dashed #ccc;}</sty…

关于ubuntu18.04 ARM架构更换源失败的问题

更换源后报错&#xff1a; E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-security/main/binary-arm64/Packages 404 Not Found [IP: 2402:f000:1:400::2 80] E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-…

C++(12): std::mutex及其高级变种的使用

1. 简述 在多线程或其他许多场景下&#xff0c;同时对一个变量或一段资源进行读写操作是一个比较常见的过程&#xff0c;保证数据的一致性和防止竞态条件至关重要。 C的标准库中为我们提供了使用的互斥及锁对象&#xff0c;帮助我们实现资源的互斥操作。 2. std::mutex及其衍…

QT - 日志:qDebug/qInfo/qWarning/qCritical

篇一、日志打印函数 头文件&#xff1a; #include <QDebug> 代码&#xff1a;qDebug()<<"hello world!"; 其他打印级别&#xff1a; qInfo(): 普通信息 qDebug(): 调试信息 qWarning(): 警告信息 qCritical(): 严重错误 qFatal(): 致命错误 1. qDebug…

【Leetcode】279.完全平方数

一、题目 1、题目描述 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例1: 输入:n = 12 输出:3 解释:1…

Vue ElementPlus Form、Form-item 表单

Form 表单 由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、校验、提交数据&#xff0c;组件升级采用了 flex 布局&#xff0c;以替代旧版本的 float 布局。 在 Element Plus 中&#xff0c;el-form 是一个表单组件&#xff0c;用于创建表单以便用户填写和提…

东方 - 循环(2) - 求和计数

目录 解析部分&#xff1a;求和计数1002. 编程求解123...n问题描述解题思路代码实现代码解析 1741. 求出1~n中满足条件的数的个数和总和问题描述解题思路代码实现代码解析 1003. 编程求 \(1 3 5 ... n\)问题描述解题思路代码实现代码解析 1004. 编程求1*2*3*...*n问题描述解…

C语言:文件操作(一)

目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结&#xff08;一&#xff09; 前言 本篇文章将介绍C语言的文件操作&#xff0c;在后面的内容讲到&#xff1a;为什么使用文…

《Effective C++》《构造/析构/赋值运算——9、绝不在构造和析构过程中调用virtual函数》

文章目录 1、Terms 9:Never call virtual functions during construction or destruction1.1为什么不要在构造、析构函数中调用 virtual 函数1.1.1经典错误1.1.2 隐藏错误 1.2优化做法&#xff1a; 2、面试相关3、总结4、参考 1、Terms 9:Never call virtual functions during …

网络编程的学习2

UDP通信协议 发送数据 package UDPDEmo;import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets;public class SendMessageDemo {public static void main(String[] args) throws IOException {//发送数据//1.创建对象//细节&#xff1a;…

PCL点云库出现错误:..\dist.h(523): error C3861: “pop_t”: 找不到标识符

工程代码&#xff1a;简单地测试了k-d树的最近邻搜索功能 #include<pcl/point_cloud.h> #include<pcl/kdtree/kdtree_flann.h>#include<iostream> #include<vector> #include<ctime>using namespace std;int main(int argc, char** argv) {//使…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

Pygame基础8-碰撞

Collisions 在Pygame中&#xff0c;我们使用矩形来移动物体&#xff0c;并且用矩形检测碰撞。 colliderect检测两个矩形是否碰撞&#xff0c;但是没法确定碰撞的方向。 Rect1.colliderect(Rect2) # collision -> return Ture # else -> return Falsecollidepoint可以…