精通自然语言处理-从基础到大语言模型-全-

精通自然语言处理:从基础到大语言模型(全)

原文:zh.annas-archive.org/md5/9aaa43d610032843316e1bd6be920e64

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书深入介绍了自然语言处理NLP)技术,从机器学习ML)的数学基础开始,逐步深入到高级NLP应用,如大型语言模型LLMs)和人工智能应用。作为学习体验的一部分,你将掌握线性代数、优化、概率和统计学,这些对于理解和实现ML和NLP算法至关重要。你还将探索一般的ML技术,了解它们与NLP的关系。在了解如何进行文本分类之前,你将学习文本数据的预处理,包括清洗和准备文本以供分析的方法。本书的后期将讨论LLMs的理论、设计和应用的高级主题,以及NLP的未来趋势,其中将包含对该领域未来的专家意见。为了加强你的实践技能,你还将解决模拟的真实世界NLP业务问题和解决方案。

本书面向对象

本书面向技术人士,包括深度学习、ML研究人员、实战NLP实践者以及ML/NLP教育工作者,以及STEM学生。那些将文本作为项目一部分的专业人士和现有的NLP实践者也会在本书中找到大量有用的信息。具备入门级ML知识和基本的Python工作知识将帮助你从本书中获得最佳效果。

本书涵盖内容

第一章导航NLP领域:全面介绍,解释了本书的内容,我们将涵盖哪些主题,以及谁可以使用本书。本章将帮助你决定本书是否适合你。

第二章掌握机器学习和自然语言处理所需的线性代数、概率和统计学,分为三个部分。在第一部分,我们将回顾本书不同部分所需的线性代数基础知识。在下一部分,我们将回顾统计学的基础知识,最后,我们将介绍基本的统计估计量。

第三章释放自然语言处理中的机器学习潜力,讨论了可用于解决NLP问题的不同ML概念和方法。我们将讨论一般的特征选择和分类技术。我们将涵盖ML问题的一般方面,如训练/测试/验证选择,以及处理不平衡数据集。我们还将讨论用于评估在NLP问题中使用的ML模型的性能指标。我们将解释方法背后的理论,以及如何在代码中使用它们。

第4章, 优化NLP性能的文本预处理技术,讨论了在现实世界问题背景下的各种文本预处理步骤。我们将根据要解决的问题场景,解释哪些步骤适合哪些需求。本章将展示并审查一个完整的Python管道。

第5章, 赋予文本分类能力:利用传统机器学习技术,解释了如何进行文本分类。理论和实现也将被解释。本章将涵盖一个综合的Python笔记本,作为案例研究。

第6章, 重新构想文本分类:深入探究深度学习语言模型,涵盖了可以使用深度学习神经网络解决的问题。这一类别中的不同问题将向您介绍,以便您学习如何高效地解决它们。这里将解释这些方法的理论,并涵盖一个综合的Python笔记本作为案例研究。

第7章, 揭秘大型语言模型:理论、设计和Langchain实现,概述了LLM开发和使用的动机,以及它们在创建过程中面临的挑战。通过考察最先进的模型设计,您将深入了解LLM的理论基础和实际应用。

第8章, 利用大型语言模型的力量:高级设置和与RAG的集成,指导您设置基于API和开源的LLM应用,并深入探讨通过LangChain的提示工程和RAG。我们将通过代码审查实际应用。

第9章, 探索前沿:由LLM驱动的先进应用和创新,深入探讨使用RAG增强LLM性能,探索高级方法、自动网络源检索、提示压缩、API成本降低和协作多智能体LLM团队,推动当前LLM应用的边界。在这里,您将审查多个Python笔记本,每个笔记本处理不同的高级解决方案以解决实际用例。

第10章, 乘风破浪:分析由LLM和AI塑造的过去、现在和未来趋势,深入探讨LLM和AI对技术、文化和社会产生的变革性影响,探索关键趋势、计算进步、大型数据集的重要性,以及LLM在商业及其他领域的演变、目的和社会影响。

第11章独家行业洞察:来自世界级专家的视角和预测,通过与法律、研究和执行角色中的专家进行对话,深入探讨了未来自然语言处理和大型语言模型趋势,探索了挑战、机遇以及大型语言模型与专业实践和伦理考量的交汇点。

要充分利用本书

本书展示的所有代码均以 Jupyter 笔记本的形式呈现。所有代码均使用 Python 3.10.X 开发,并预期在后续版本中也能正常工作。

本书涵盖的软件/硬件 操作系统要求

| 通过以下方式之一访问 Python 环境: |

  • 通过任何设备上的任何浏览器的免费且易于访问的 Google Colab 访问(推荐)

  • 具有安装公共包和访问 OpenAI API 的能力的本地/云 Python 开发环境

Windows、macOS 或 Linux

| 需要足够的计算资源,如下所示:

  • 之前推荐的免费访问 Google Colab 包括免费的 GPU 实例

  • 如果选择避免使用 Google Colab,本地/云环境应具有 GPU 以运行几个代码示例

由于本书中的代码示例具有多样化的用例,对于一些高级大型语言模型解决方案,您将需要一个 OpenAI 账户,这将允许您获得 API 密钥。

如果您使用的是本书的数字版,我们建议您亲自输入代码或从本书的 GitHub 仓库(下一节中提供链接)获取代码。这样做将帮助您避免与代码的复制和粘贴相关的任何潜在错误。

下载示例代码文件

您可以从 GitHub 下载本书的示例代码文件:https://github.com/PacktPublishing/Mastering-NLP-from-Foundations-to-LLMs。如果代码有更新,它将在 GitHub 仓库中更新。

在本书中,我们回顾了代表专业行业级别解决方案的完整代码笔记本:

章节 笔记本名称
4 Ch4_Preprocessing_Pipeline.ipynbCh4_NER_and_POS.ipynb
5 Ch5_Text_Classification_Traditional_ML.ipynb
6 Ch6_Text_Classification_DL.ipynb
8 Ch8_Setting_Up_Close_Source_and_Open_Source_LLMs.ipynbCh8_Setting_Up_LangChain_Configurations_and_Pipeline.ipynb
9 Ch9_Advanced_LangChain_Configurations_and_Pipeline.ipynbCh9_Advanced_Methods_with_Chains.ipynbCh9_Completing_a_Complex_Analysis_with_a_Team_of_LLM_Agents.ipynbCh9_RAGLlamaIndex_Prompt_Compression.ipynbCh9_Retrieve_Content_from_a_YouTube_Video_and_Summarize.ipynb

我们还有其他来自我们丰富的图书和视频目录的代码包,可在 https://github.com/PacktPublishing/ 获取。查看它们吧!

使用的约定

本书使用了多种文本约定。

文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。以下是一个示例:“现在,我们添加了一个实现语法的功能。我们定义了 output_parser 变量,并使用不同的函数来生成输出,predict_and_parse()。”

代码块设置如下:

import pandas as pd
import matplotlib.pyplot as plt
# Load the record dict from URL
import requests
import pickle

当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:

qa_engineer (to manager_0):
exitcode: 0 (execution succeeded)
Code output:
Figure(640x480)
programmer (to manager_0):
TERMINATE

粗体:表示新术语、重要单词或屏幕上出现的单词。例如,菜单或对话框中的单词以 粗体 显示。以下是一个示例:“虽然我们选择了一个特定的数据库,但您可以通过参考 Vector Store 页面来了解更多关于不同选择的信息。”

小贴士或重要注意事项

它看起来像这样。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何方面有疑问,请通过电子邮件发送给我们 customercare@packtpub.com,并在邮件主题中提及书名。

勘误:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将非常感激您能向我们报告。请访问 www.packtpub.com/support/errata 并填写表格。

盗版:如果您在互联网上以任何形式遇到我们作品的非法副本,我们将非常感激您能提供位置地址或网站名称。请通过电子邮件发送给我们 copyright@packt.com,并提供材料的链接。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为本书做出贡献,请访问 authors.packtpub.com

评论

请留下评论。一旦您阅读并使用过这本书,为什么不在您购买它的网站上留下评论呢?潜在读者可以查看并使用您的客观意见来做出购买决定,Packt 可以了解您对我们产品的看法,我们的作者也可以看到他们对书籍的反馈。谢谢!

有关 Packt 的更多信息,请访问 www.packtpub.com

分享您的想法

读完 Mastering NLP from Foundations to LLMs 后,我们非常乐意听到您的想法!请 点击此处直接进入此书的亚马逊评论页面 并分享您的反馈。

您的审阅对我们和科技社区非常重要,并将帮助我们确保我们提供高质量的内容。

下载本书的免费 PDF 版本

感谢您购买此书!

您喜欢在移动中阅读,但无法携带您的印刷书籍到处走吗?

您的电子书购买是否与您选择的设备不兼容?

别担心,现在每购买一本Packt图书,你都可以免费获得该书的DRM免费PDF版本。

在任何地方、任何设备上阅读。直接从你最喜欢的技术书籍中搜索、复制和粘贴代码到你的应用程序中。

优惠不仅限于此,你还可以获得独家折扣、时事通讯和每日免费内容的每日邮箱访问权限。

按照以下简单步骤获取优惠:

  1. 扫描下面的二维码或访问以下链接

下载此书的免费PDF副本

https://packt.link/free-ebook/978-1-80461-918-6

  1. 提交你的购买证明

  2. 就这样!我们将直接将免费的PDF和其他优惠发送到你的邮箱

第一章:探索 NLP 领域:全面介绍

本书旨在帮助专业人士将自然语言处理NLP)技术应用于他们的工作,无论他们是在从事 NLP 项目还是在其他领域(如数据科学)中使用 NLP。本书的目的是向您介绍 NLP 领域及其基础技术,包括机器学习ML)和深度学习DL)。全书强调数学基础的重要性,如线性代数、统计学和概率论以及优化理论,这些都是理解 NLP 中使用的算法所必需的。内容配有 Python 代码示例,以便您进行预练习、实验并生成书中展示的一些开发内容。

本书讨论了 NLP 面临的挑战,例如理解词语的上下文和含义、它们之间的关系以及需要标记数据的需求。本书还提到了 NLP 最近的进展,包括预训练语言模型,如 BERT 和 GPT,以及大量文本数据的可用性,这导致了 NLP 任务性能的改进。

本书将通过讨论语言模型对 NLP 领域的影响来吸引您,包括 NLP 任务中准确性和有效性的提高、更高级 NLP 系统的发展以及更广泛人群的易用性。

本章将涵盖以下标题:

  • 什么是自然语言处理?

  • 自然语言机器处理初始策略

  • NLP 和 ML 的协同效应——两者的结合

  • NLP 中的数学和统计学简介

本书面向对象

本书的目标受众是那些将文本作为其项目一部分的专业人士。这可能包括 NLP 实践者,他们可能是初学者,以及那些通常不处理文本的人。

什么是自然语言处理?

NLP 是一个专注于计算机与人类语言之间交互的人工智能AI)领域。它涉及使用计算技术来理解、解释和生成人类语言,使计算机能够自然和有意义地理解和响应人类输入。

自然语言处理的历史和演变

自然语言处理(NLP)的历史是一段迷人的时光之旅,追溯至20世纪50年代,那时艾伦·图灵等先驱者做出了重要贡献。图灵的开创性论文《计算机与智能》引入了图灵测试,为未来在人工智能和自然语言处理领域的探索奠定了基础。这一时期标志着符号NLP的诞生,其特征是使用基于规则的系统,如1954年著名的乔治敦实验,该实验雄心勃勃地旨在通过生成俄语内容到英语的翻译来解决机器翻译问题(参见https://en.wikipedia.org/wiki/Georgetown%E2%80%93IBM_experiment)。尽管早期充满乐观,但进展缓慢,揭示了语言理解和生成的复杂性。

20世纪60年代和70年代见证了早期NLP系统的发展,这些系统展示了机器使用有限的词汇和知识库进行类似人类交互的潜力。这一时期也见证了概念本体的发展,这对于在计算机可理解格式中结构化现实世界信息至关重要。然而,基于规则方法的局限性导致了20世纪80年代末向统计NLP的范式转变,这一转变得益于机器学习的发展和计算能力的提升。这一转变使得从大型语料库中更有效地学习成为可能,显著推进了机器翻译和其他NLP任务。这一范式转变不仅代表了技术和方法上的进步,而且强调了NLP中语言学研究方法的概念演变。在摆脱预定义语法规则的僵化之后,这一转变接受了语料库语言学,这是一种允许机器通过广泛接触大量文本“感知”和理解语言的方法。这种方法反映了对语言的一种更经验性和数据驱动的理解,其中模式和意义是从实际语言使用中而不是从理论结构中得出的,从而使得语言处理能力更加细腻和灵活。

进入21世纪,互联网的出现提供了大量数据,催化了无监督和半监督学习算法的研究。突破随着2010年代神经NLP的出现而到来,当时深度学习技术开始占据主导地位,在语言建模和解析方面提供了前所未有的准确性。这一时期以Word2Vec等复杂模型的发展以及深度神经网络的激增为标志,推动NLP向更自然和有效的人机交互发展。随着我们继续在这些进步的基础上构建,NLP站在人工智能研究的前沿,其历史反映了不懈追求理解和复制人类语言细微差别的不懈追求。

近年来,自然语言处理(NLP)也被应用于广泛的行业,如医疗保健、金融和社交媒体,在这些行业中,它被用于自动化决策并增强人与机器之间的沟通。例如,NLP已被用于从医疗文件中提取信息,分析客户反馈,翻译不同语言之间的文档,以及搜索大量帖子。

自然语言机器处理中的初始策略

自然语言处理(NLP)的传统方法包括文本预处理,这与文本准备同义,然后是应用机器学习方法。在自然语言处理和机器学习应用中,文本预处理是一个基本步骤,它涉及清理和转换原始文本数据,使其能够被机器学习算法轻松理解和分析。预处理的目标是去除噪声和不一致性,并标准化数据,使其更适合高级自然语言处理和机器学习方法。

预处理的一个重要好处是它可以显著提高机器学习算法的性能。例如,去除像“”和“”这样的常见词,这些词没有太多意义,可以帮助减少数据的维度,使算法更容易识别模式。

以以下句子为例:

我要去商店买一些牛奶 和面包

在去除停用词后,我们得到以下内容:

去商店买 牛奶面包

在示例句子中,停用词“”,“”,“”,“”,“一些”和“”并没有给句子增加任何额外的意义,并且可以去除而不改变句子的整体意义。应该强调的是,去除停用词需要根据具体目标进行定制,因为在一个上下文中省略某个词可能微不足道,但在另一个上下文中可能是有害的。

此外,词干提取词形还原,这些方法将单词还原到其基本形式,可以减少数据中独特单词的数量,使算法更容易识别它们之间的关系,这将在本书中完全解释。

以以下句子为例:

这些男孩跑了,跳了,并且 游得快

在应用词干提取后,每个单词都被还原到其根或词干形式,不考虑词的时态或派生词缀,我们可能会得到:

这个男孩跑了,跳了,并且 游得快

词干提取简化了文本到其基本形式。在这个例子中,“”,“”和“”分别被还原到“”,“”和“”。请注意,“跑”和“游”没有变化,因为词干提取通常会导致单词接近其词根形式,但不是字典中的基本形式。这个过程有助于减少文本数据的复杂性,使机器学习算法更容易匹配和分析模式,而不会因为同一词的不同变体而陷入困境。

以以下句子为例:

男孩们奔跑、跳跃,并且 快速游泳

在应用词形还原后,考虑到词的形态分析,旨在将词还原到基础或词典形式,即词元,我们得到:

男孩跑、跳,并且 快速游泳

词形还原准确地将“ran”、“jumped”和“swam”转换为“run”、“jump”和“swim”。这个过程考虑了每个词的词性,确保将词还原到基本形式既符合语法也符合语境。与词干提取不同,词形还原提供了更精确的基本形式还原,确保处理后的文本在意义上和语境上保持准确。这通过使NLP模型能够更有效地理解和处理语言,减少了数据集的复杂性,同时保持了原文的完整性。

预处理的其他两个重要方面是数据归一化和数据清洗。数据归一化包括将所有文本转换为小写,删除标点符号,并标准化数据的格式。这有助于确保算法不会将同一单词的不同变体视为不同的实体,这可能导致结果不准确。

数据清洗包括删除重复或不相关的数据,以及纠正数据中的错误或不一致。这在大型数据集中尤为重要,因为手动清洗既耗时又容易出错。自动预处理工具可以帮助快速识别和删除错误,使数据更适合分析。

图1.1 展示了一个全面的预处理流程。我们将在 第4章 中介绍这个代码示例:

图1.1 – 综合预处理流程

图1.1 – 综合预处理流程

总之,预处理文本是NLP和ML应用中的一个关键步骤;它通过去除噪声和不一致性以及标准化数据来提高ML算法的性能。此外,它在为NLP任务准备数据以及数据清洗中发挥着至关重要的作用。通过在预处理上投入时间和资源,可以确保数据质量高,并准备好进行高级NLP和ML方法,从而获得更准确和可靠的结果。

当我们的文本数据准备进行进一步处理时,下一步通常涉及将机器学习模型拟合到数据上。

一个成功的协同效应——自然语言处理和机器学习的结合

机器学习是人工智能的一个子领域,涉及训练算法从数据中学习,使它们能够在没有明确编程的情况下做出预测或决策。机器学习正在推动许多不同领域的进步,如计算机视觉、语音识别,当然还有自然语言处理。

深入探讨ML的具体技术,NLP中使用的特定技术是统计语言模型,它涉及在大文本语料库上训练算法以预测给定单词序列的可能性。这被广泛应用于各种应用中,如语音识别、机器翻译和文本生成。

另一种关键技术是深度学习(DL),它是机器学习的一个子领域,涉及在大数据集上训练人工神经网络。深度学习模型,如卷积神经网络(CNNs)和循环神经网络(RNNs),已被证明适用于NLP任务,如语言理解、文本摘要和情感分析。

图1.2 描述了AI、ML、DL和NLP之间的关系:

图1.2 – 不同学科之间的关系

图1.2 – 不同学科之间的关系

NLP中的数学和统计学简介

NLP和ML的坚实基础是算法的数学基础。特别是,关键基础是线性代数、统计学和概率论以及优化理论。第二章将概述您需要了解这些主题的关键主题。在整个书中,我们将展示各种方法和假设的证明和论证。

NLP的一个挑战是处理人类语言中产生的大量数据。这包括理解上下文,以及词语的意义及其之间的关系。为了应对这一挑战,研究人员开发了各种技术,如嵌入和注意力机制,分别以数值格式表示词语的意义并帮助识别文本中最关键的部分。

NLP的另一个挑战是需要标记数据,因为手动标注大量文本语料库既昂贵又耗时。为了解决这个问题,研究人员已经开发了无监督和弱监督方法,可以从未标记数据中学习,例如聚类、主题建模和自监督学习。

总体而言,NLP是一个快速发展的领域,有潜力改变我们与计算机和信息交互的方式。它被应用于各种应用中,从聊天机器人、语言翻译到文本摘要和情感分析。机器学习技术,如统计语言模型和深度学习,在开发这些系统中发挥了关键作用。正在进行的研究解决剩余的挑战,例如理解上下文和处理缺乏标记数据的问题。

自然语言处理(NLP)领域最显著的进步之一是预训练语言模型的发展,如双向编码器表示的TransformerBERTs)和生成式预训练TransformerGPTs)。这些模型在大量文本数据上进行了训练,并且可以针对特定任务进行微调,例如情感分析或语言翻译。

Transformer,BERT和GPT模型背后的技术,通过使机器更有效地理解句子中单词的上下文而彻底改变了NLP。与之前线性处理文本的方法不同,Transformer可以并行处理单词,通过注意力机制捕捉语言的细微差别。这使得它们能够辨别每个单词相对于其他单词的重要性,极大地增强了模型理解复杂语言模式和细微差别的能力,为NLP应用中的准确性和流畅性设定了新的标准。这增强了NLP应用的开发,并在广泛的NLP任务上提高了性能。

图1.3 详细说明了Transformer组件的功能设计。

图1.3 – 模型架构中的Transformer

图1.3 – 模型架构中的Transformer 架构

自然语言处理(NLP)领域的另一个重要发展是大量标注文本数据的可用性增加,这允许训练更精确的模型。此外,无监督和半监督学习技术的发展使得在更少的标注数据上训练模型成为可能,使得在更广泛的场景中应用自然语言处理成为可能。

语言模型对自然语言处理(NLP)领域产生了重大影响。语言模型改变该领域的关键方式之一是通过提高自然语言处理任务的准确性和有效性。例如,许多语言模型在大量文本数据上进行了训练,使它们更好地理解人类语言的细微差别和复杂性。这导致了语言翻译、文本摘要和情感分析等任务性能的提高。

另一种语言模型改变自然语言处理(NLP)领域的方式是通过促进更高级、更复杂的NLP系统的开发。例如,一些语言模型,如GPT,可以生成类似人类的文本,这为自然语言生成和对话系统开辟了新的可能性。其他语言模型,如BERT,提高了问答、情感分析和命名实体识别等任务的性能。

语言模型通过使其对更广泛的人群更加易于访问而改变了该领域。随着预训练语言模型的出现,开发者现在可以轻松地对这些模型进行微调以适应特定任务,而无需大量标记数据或从头开始训练模型的专业知识。这使得开发者构建NLP应用变得更加容易,并导致了基于NLP的新产品和服务的大量涌现。

总体而言,语言模型通过提高现有NLP任务的性能、促进更高级NLP系统的发展以及使NLP对更广泛的人群更加易于访问,在推进NLP领域方面发挥了关键作用。

理解语言模型——ChatGPT示例

ChatGPT,GPT模型的变体,因其生成类似人类文本的能力而受到欢迎,这可以用于广泛的自然语言生成任务,如聊天机器人系统、文本摘要和对话系统。

它之所以受欢迎的主要原因在于其高质量的输出以及生成难以与人类书写文本区分的文本的能力。这使得它在需要自然语言的应用中非常适用,例如聊天机器人系统、虚拟助手和文本摘要。

此外,ChatGPT在大量文本数据上进行了预训练,这使得它能够理解人类语言的细微差别和复杂性。这使得它在需要深入理解语言的应用中非常适用,例如问答和情感分析。

此外,通过提供少量特定任务的数据,可以对ChatGPT进行微调以适应特定的使用场景,这使得它具有多功能性和适应性,能够广泛应用于各种应用。它在工业、研究和个人项目中得到广泛应用,包括客户服务聊天机器人、虚拟助手、自动内容创作、文本摘要、对话系统、问答和情感分析。

总体而言,ChatGPT生成高质量、类似人类文本的能力以及其能够针对特定任务进行微调的能力,使其成为各种自然语言生成应用的流行选择。

让我们继续总结本章内容。

摘要

在本章中,我们向您介绍了自然语言处理(NLP)领域,它是人工智能的一个子领域。本章强调了数学基础,如线性代数、统计学和概率论以及优化理论的重要性,这些是理解NLP中使用的算法所必需的。它还涵盖了NLP中面临的挑战,如理解词语的上下文和含义、它们之间的关系以及需要标记数据的需求。我们讨论了NLP的最近进展,包括预训练语言模型,如BERT和GPT,以及大量文本数据的可用性,这导致了NLP任务性能的提高。我们简要提到了文本预处理的重要性,以及您在了解数据清洗、数据归一化、词干提取和词形还原在文本预处理中的重要性。然后我们讨论了NLP和机器学习(ML)的结合如何推动该领域的进步,并成为自动化任务和改善人机交互的越来越重要的工具。

在学习本章后,您将能够理解NLP、ML和DL技术的重要性。您将能够理解NLP的最近进展,包括预训练语言模型。您还将了解文本预处理的重要性以及它在为NLP任务准备数据和数据清洗中的关键作用。

在下一章中,我们将介绍机器学习的数学基础。这些基础将贯穿整本书。

问答

  1. Q: 什么是自然语言处理(NLP)?

    • Q: 在人工智能领域,什么定义了NLP?

    • A: NLP是人工智能的一个子领域,专注于使计算机能够以自然和有意义的方式理解、解释和生成人类语言。

  2. 自然语言机器处理初始策略

    • Q: 在自然语言处理(NLP)中,预处理的重要性是什么?

    • A: 预处理,包括去除停用词和应用词干提取或词形还原等任务,对于清洗和准备文本数据至关重要,从而提高机器学习算法在NLP任务上的性能。

  3. NLP与机器学习(ML)的协同作用

    • Q: 机器学习如何促进NLP的进步?

    • A: 机器学习,特别是统计语言模型和深度学习等技术,通过使算法能够从数据中学习、预测词序列以及更有效地执行语言理解和情感分析等任务,推动NLP向前发展。

  4. NLP中的数学和统计学简介

    • Q: 为什么数学基础在NLP中很重要?

    • A: 线性代数、统计学和概率论等数学基础对于理解和开发支撑NLP技术的算法至关重要,从基本的预处理到复杂的模型训练。

  5. NLP的进步——预训练语言模型的作用

    • Q: 预训练模型如BERT和GPT是如何影响NLP的?

    • A: 在大量文本数据上训练的预训练模型可以针对特定任务如情感分析或语言翻译进行微调,显著简化了NLP应用的开发并提升了任务性能。

  6. 理解语言模型中的Transformer

    • Q: 为什么Transformer被认为是NLP领域的突破性进展?

    • A: Transformer并行处理单词,并使用注意力机制来理解句子中单词的上下文,显著提高了模型处理人类语言复杂性的能力。

第二章:掌握机器学习和自然语言处理(NLP)中的线性代数、概率和统计学

自然语言处理(NLP)和机器学习(ML)是两个从数学概念中受益显著的领域,尤其是线性代数和概率理论。这些基本工具能够分析变量之间的关系,构成了许多NLP和ML模型的基础。本章提供了一个关于线性代数和概率理论的全面介绍,包括它们在NLP和ML中的实际应用。本章从向量和矩阵的概述开始,涵盖了基本操作。此外,为了理解后续章节中的概念和模型,还将解释统计学的基础。最后,本章介绍了优化的基础知识,这对于解决NLP问题和理解变量之间的关系至关重要。到本章结束时,你将具备线性代数和概率理论的良好基础,并理解它们在NLP和ML中的基本应用。

在本章中,我们将涵盖以下主题:

  • 线性代数简介

  • 特征值和特征向量

  • 机器学习的基本概率

线性代数简介

让我们先从理解标量、向量和矩阵开始:

  • 标量:标量是一个单一的数值,在大多数机器学习应用中通常来自实数域。在自然语言处理(NLP)中,标量的例子包括文本语料库中单词的频率。

  • 向量:向量是一组数值元素。这些元素可以被称为条目、分量或维度,这些分量的数量定义了向量的维度。在NLP中,一个向量可以包含与单词频率、情感排名等元素相关的分量。NLP和ML是两个从数学学科中受益巨大的领域,尤其是线性代数和概率理论。这些基础工具有助于评估变量之间的相关性,并且是众多NLP和ML模型的核心。本部分提供了一个关于线性代数和概率理论的详细入门,以及它们在NLP和ML中的实际应用。例如,一个文本文档的三维向量表示可能被表示为一个实数数组,例如[单词频率,情感排名,复杂度]。

  • 矩阵:矩阵可以被视为由行和列组成的数值元素的矩形集合。要从矩阵中检索一个元素,需要指定其行和列索引。在自然语言处理(NLP)领域,数据矩阵可能包括与不同文本文档对应的行和与不同文本属性(如词频、情感等)对应的列。此类矩阵的维度用符号 n × d 表示,其中 n 是行数(即文本文档数),d 是列数(即属性数)。

让我们继续了解标量、向量和矩阵的基本操作。

标量、向量和矩阵的基本操作——加法和减法——可以在具有相同维度的向量上执行。让我们考虑两个向量:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">x</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">y</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">x</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi><mml:mi mathvariant="bold">y</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo-</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo-</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo.</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub>mml:mo-</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>

例如,如果我们有两个向量,a = [4,1] 和 b = [2,4],那么 a + b = [6,5].

让我们这样可视化:

图2.1 – 添加两个向量(a = [4,1] 和 b = [2,4]) 意味着 a + b = [6,5]

图2.1 – 添加两个向量(a = [4,1] 和 b = [2,4])意味着 a + b = [6,5]

可以通过乘以一个标量来缩放一个向量。这个操作是通过将向量的每个分量乘以标量值来完成的。例如,让我们考虑一个n维向量,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">x</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>. 缩放这个向量乘以一个因子<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mia</mml:mi></mml:math>的数学表示如下:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">x</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mia</mml:mi>mml:mo∙</mml:mo><mml:mi mathvariant="bold">x</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mia</mml:mi>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mia</mml:mi>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:mia</mml:mi>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>

这个操作结果是一个新向量,其维度与原始向量相同,但每个分量都乘以标量值 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mia</mml:mi></mml:math>

向量之间有两种乘法类型:点积 (<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mo∙</mml:mo></mml:math>) 和叉积 (<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mo×</mml:mo></mml:math>)。点积是我们常在机器学习算法中使用的。

点积是一种可以应用于两个向量(x = [x 1, x 2, … , x n] 和 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" mathvariant="bold-italic" display="inline">mml:miy</mml:mi></mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo…</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:math>)的数学运算。它有许多实际应用,其中之一是帮助确定它们的相似性。它被定义为两个向量对应元素的乘积之和。向量 xy 的点积用符号 x**<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="inline">mml:mo∙</mml:mo></mml:math> y(中间有一个点)表示,并定义为以下内容:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">x</mml:mi>mml:mo∙</mml:mo><mml:mi mathvariant="bold">y</mml:mi>mml:mo=</mml:mo>mml:mrowmml:munderover<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mrow>mml:mo.</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math>

其中 n 代表向量的维度。点积是一个标量量,可以用来测量两个向量之间的角度,以及一个向量在另一个向量上的投影。它还在许多机器学习算法中发挥着至关重要的作用,包括线性回归和神经网络。

点积是交换律的,这意味着向量的顺序不会影响结果。这意味着 x <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="inline">mml:mo∙</mml:mo></mml:math> y = y**<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="inline">mml:mo∙</mml:mo></mml:math> x. 此外,点积保持了标量乘法的分配律,意味着以下内容:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">x</mml:mi>mml:mo∙</mml:mo><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">y</mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="bold">z</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo><mml:mi mathvariant="bold">x</mml:mi>mml:mo∙</mml:mo><mml:mi mathvariant="bold">y</mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="bold">x</mml:mi>mml:mo∙</mml:mo><mml:mi mathvariant="bold">z</mml:mi></mml:math>

向量与其自身的点积也称为其平方范数或欧几里得范数。范数,用 norm**(x) 表示,表示向量的长度,并计算如下

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:min</mml:mi>mml:mio</mml:mi>mml:mir</mml:mi>mml:mim</mml:mi>mml:msupmml:mrow<mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow></mml:mfenced></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msup>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi><mml:mi mathvariant="bold">x</mml:mi>mml:mo∙</mml:mo><mml:mi mathvariant="bold">x</mml:mi>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi>mml:mrowmml:munderover<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mii</mml:mi>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubsupmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msubsup></mml:mrow></mml:mrow></mml:math>

向量的归一化可以通过除以其范数(也称为欧几里得范数或向量的长度)来实现。这会得到一个单位长度的向量,记为 x’。归一化过程可以表示为

x′=xx=xx∙x

其中 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">x</mml:mi></mml:math> 是原始向量,而 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced open="‖" close="‖" separators="|">mml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow></mml:mrow></mml:mfenced></mml:math> 表示其范数。需要注意的是,归一化向量会保留其方向,同时将其长度设置为1,从而允许在不同空间中比较向量。

两个向量 x=x1,x2,…,xn<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold-italic">y</mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mi </mml:mi>mml:mo…</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub>mml:mi </mml:mi></mml:mrow></mml:mfenced></mml:math> 的余弦相似度在数学上表示为归一化到单位长度后两个向量的点积。这可以表示如下:

Co<mi}sx,y=x∙yx∙y=x∙yx∙x∙y∙y

其中 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced open="‖" close="‖" separators="|">mml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow></mml:mfenced></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced open="‖" close="‖" separators="|">mml:mrow<mml:mi mathvariant="bold">y</mml:mi></mml:mrow></mml:mfenced></mml:math> 分别是向量 xy 的范数。此计算出的 xy 之间的余弦相似度等同于这两个向量之间角度的余弦值,记为 θ

点积为 0 的向量被认为是正交的,这意味着在存在非 0 向量的情况下,它们之间的角度是 90 度。我们可以得出结论,0 向量与任何向量都是正交的。如果一组向量中的每一对都是正交的,并且每个向量的范数为 1,则该组向量被认为是正交的。这种正交归一集在许多数学情境中非常有价值。例如,当在不同正交坐标系之间转换时,这种方法就会发挥作用,此时新坐标点的计算是基于修改后的方向集。这种方法被称为解析几何中的坐标变换,在线性代数领域得到了广泛的应用。

矩阵和向量的基本运算

矩阵转置是指获取矩阵的转置,这个过程涉及到交换其行和列。这意味着矩阵中原本位于 (i, j) 位置的元素现在占据了其转置矩阵中 (j, i) 位置。因此,原本大小为 n × m 的矩阵在转置后变成了 m × n 的矩阵。表示矩阵 X 转置的符号是 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>。以下是一个矩阵转置操作的示例:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">X</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1,1</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1,2</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2,1</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2,2</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn3,1</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn3,2</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msupmml:mrow<mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1,1</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2,1</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn3,1</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1,2</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2,2</mml:mn></mml:mrow></mml:msub></mml:mtd>mml:mtdmml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn3,2</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

关键的是,矩阵 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrowmml:msupmml:mrowmml:mo(</mml:mo><mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:mo)</mml:mo></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math> 的转置 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math> 恢复到原始矩阵 X。此外,很明显,行向量可以转置为列向量,反之亦然。此外,以下对于矩阵和向量都成立:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msupmml:mrow<mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">X</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="normal"> </mml:mi><mml:mi mathvariant="bold">Y</mml:mi></mml:mrow></mml:mfenced></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="normal"> </mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">Y</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>

值得注意的是,矩阵和向量的点积是可交换的:

XT∙Y=YT∙X

xT∙y=yT∙x

矩阵定义

在本节中,我们将介绍不同类型的矩阵定义:

  • 对称矩阵:对称矩阵是一种方阵,其转置矩阵等于原矩阵。用数学术语来说,如果一个矩阵 X 是对称的,那么 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">X</mml:mi>mml:mo=</mml:mo>mml:msupmml:mrow<mml:mi mathvariant="bold">X</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>。例如,

    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">X</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:mn1</mml:mn></mml:mtd>mml:mtdmml:mn2</mml:mn></mml:mtd>mml:mtdmml:mn3</mml:mn></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mn2</mml:mn></mml:mtd>mml:mtdmml:mn4</mml:mn></mml:mtd>mml:mtdmml:mn5</mml:mn></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mn3</mml:mn></mml:mtd>mml:mtdmml:mn5</mml:mn></mml:mtd>mml:mtdmml:mn7</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

    是对称的。

  • 矩形对角矩阵:这是一个在维度上为 m × n 的矩阵,其主对角线上的值非 0

  • 上(或下)三角矩阵:如果一个矩阵的所有(i,j)位置的元素(在主对角线以下或以上)都是0,则该矩阵称为上(三角)矩阵。接下来,我们将描述矩阵运算。

矩阵行列式

方阵的行列式提供了一个关于其乘以其坐标向量时对 d-维物体体积影响的观念。行列式,用 det(A) 表示,代表由矩阵的行向量或列向量形成的平行六面体的(有符号)体积。这种解释是一致的,因为由行和列向量确定的体积在数学上是相同的。当一个可对角化的矩阵 A 与一组坐标向量相互作用时,随之而来的扭曲被称为各向异性缩放。行列式有助于确定这种转换的尺度因子。方阵的行列式提供了关于通过矩阵乘法实现的线性变换的深刻见解。特别是,行列式的符号反映了变换对系统方向的影响。

计算行列式的公式如下:

  1. 对于一个 1×1 的矩阵 A,其行列式等同于它内部的单个标量。

  2. 对于较大的矩阵,可以通过锁定一列,j,然后使用该列中的元素进行展开来计算行列式。作为另一种选择,也可以固定一行,i,并沿着该特定行展开。无论选择固定行还是列,最终结果,即矩阵的行列式,都将保持一致。

    j 为从 1d 的固定值时,

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mrowmml:mrow<mml:mi mathvariant="normal">det</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrow<mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mrow><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mrowmml:munderover<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:mid</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msupmml:mrow<mml:mfenced separators="|">mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:mfenced></mml:mrow>mml:mrow<mml:mfenced separators="|">mml:mrowmml:mii</mml:mi>mml:mo+</mml:mo>mml:mij</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:msup></mml:mrow></mml:mrow>mml:msubmml:mrowmml:mia</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mij</mml:mi></mml:mrow></mml:msub>mml:mrowmml:mrow<mml:mi mathvariant="normal">det</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrow<mml:mfenced separators="|">mml:mrowmml:msubmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mij</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mrow></mml:math>

或者,固定 i

detA=∑j=1d−1i+jaijdetAij

根据以下方程,我们可以看到某些情况可以很容易地计算:

  • 对角矩阵:对于一个对角矩阵,其行列式是其对角元素之积。

  • 三角矩阵:在三角矩阵的上下文中,行列式是通过乘以其所有对角元素得到的。如果一个矩阵的行或列的所有元素都是0,那么行列式也是0。

    对于一个 2 × 2 矩阵

    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">A</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:mia</mml:mi></mml:mtd>mml:mtdmml:mib</mml:mi></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mic</mml:mi></mml:mtd>mml:mtdmml:mid</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

    其行列式可以计算为 ad - bc。如果我们考虑一个 3 × 3 矩阵,

    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">A</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:mia</mml:mi></mml:mtd>mml:mtdmml:mib</mml:mi></mml:mtd>mml:mtdmml:mic</mml:mi></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mid</mml:mi></mml:mtd>mml:mtdmml:mie</mml:mi></mml:mtd>mml:mif</mml:mi></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mig</mml:mi></mml:mtd>mml:mtdmml:mih</mml:mi></mml:mtd>mml:mii</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

    矩阵的行列式计算如下:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mia</mml:mi><mml:mfenced separators="|">mml:mrowmml:mie</mml:mi>mml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mih</mml:mi>mml:mif</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mid</mml:mi><mml:mfenced separators="|">mml:mrowmml:mib</mml:mi>mml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mih</mml:mi>mml:mic</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mig</mml:mi><mml:mfenced separators="|">mml:mrowmml:mib</mml:mi>mml:mif</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mie</mml:mi>mml:mic</mml:mi></mml:mrow></mml:mfenced></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mia</mml:mi>mml:mie</mml:mi>mml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mia</mml:mi>mml:mih</mml:mi>mml:mif</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mid</mml:mi>mml:mib</mml:mi>mml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mid</mml:mi>mml:mih</mml:mi>mml:mic</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo+</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mig</mml:mi>mml:mib</mml:mi>mml:mif</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mig</mml:mi>mml:mie</mml:mi>mml:mic</mml:mi></mml:math>

现在我们来讨论特征值和向量。

特征值和特征向量

一个属于 d × d 矩阵 A 的向量 x,如果满足方程 Ax = λx,其中 λ 代表与矩阵相关的特征值,则该向量是一个特征向量。这种关系界定了矩阵 A 和其对应的特征向量 x 之间的联系,这可以被视为矩阵的“拉伸方向”。在 A 是可以对角化的矩阵的情况下,它可以分解为一个 d × d 可逆矩阵 V 和一个对角 d × d 矩阵 Δ,使得

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="bold"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="bold"> </mml:mi><mml:mi mathvariant="bold">V</mml:mi><mml:mi mathvariant="bold"> </mml:mi><mml:mi mathvariant="bold">Δ</mml:mi><mml:mi mathvariant="bold"> </mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msup></mml:math>

V的列包含d个特征向量,而Δ的对角元素包含相应的特征值。线性变换Ax可以通过一系列三个操作来直观理解。最初,x乘以<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mrow>mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msup></mml:math>计算xV列关联的非正交基中的坐标。随后,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mrow>mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msup></mml:math> x乘以Δ使用Δ中的因子缩放这些坐标,与特征向量的方向一致。最后,与V相乘将坐标恢复到原始基,从而在d*个特征向量方向上实现各向异性缩放。

对角化矩阵表示涉及沿d个线性无关方向的各向异性缩放的变换。当V的列是正交归一向量时,V−1等于其转置,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>,表示沿相互正交的方向进行缩放。在这种情况下,矩阵A总是对角化的,并且当V的列是正交归一向量时,表现出对称性,如以下关系所证实。

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi><mml:mi mathvariant="bold">V</mml:mi>mml:mi </mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">Δ</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi><mml:mi mathvariant="bold">V</mml:mi><mml:mi mathvariant="bold-italic"> </mml:mi><mml:mi mathvariant="bold">Δ</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mi </mml:mi><mml:mi mathvariant="bold">A</mml:mi></mml:math>

求特征向量的数值方法

确定矩阵 A 的特征向量的传统方法涉及找到方程的 d 个根,λ1,…,λd,如下所示:

det(A−λI)=0

其中一些根可能是重复的。接下来的步骤涉及求解线性系统,形式为 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">A</mml:mi>mml:mo-</mml:mo>mml:miλ</mml:mi><mml:mi mathvariant="bold">I</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="bold">x</mml:mi>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math>,通常使用高斯消元法实现。然而,这种方法可能并不总是最稳定或最精确的,因为多项式方程的求解器在实际应用中可能会表现出病态和数值不稳定性。确实,在工程中解决高次多项式方程的一种常见技术是构建具有与原始多项式相同特征多项式的伴随矩阵,然后确定其特征值。

特征值分解

特征值分解,也称为矩阵的奇异分解或对角化,是线性代数和计算数学中的一种强大数学工具。特征值分解的目标是将给定的矩阵分解为表示矩阵特征向量和特征值的矩阵的乘积。

矩阵 A 的特征值分解是将矩阵分解为两个矩阵的乘积:矩阵 V 和矩阵 D

V 的列是矩阵 A 的特征向量,而 D 是一个对角矩阵,其对角线上包含相应的特征值。

特征值问题是要找到非零向量 v 和标量 λ,使得 Av = λv,其中 A 是一个方阵,因此 vA 的一个特征向量。标量 λ 被称为矩阵 A 的特征值。特征值问题可以写成矩阵形式 Av = λIv,其中 I 是单位矩阵。

确定特征值的过程与矩阵 A 的特征方程密切相关,该特征方程是从 det(A−λI)=0 得到的多项式方程。特征方程可以解出特征值 λ,它们是方程的根。一旦找到特征值,可以通过解线性方程组 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold">A</mml:mi>mml:mo-</mml:mo>mml:miλ</mml:mi><mml:mi mathvariant="bold">I</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="bold">v</mml:mi>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math> 来找到特征向量。

特征值分解的一个重要特性是它允许我们将矩阵对角化,这意味着我们可以通过使用适当的特征向量矩阵将矩阵转换成对角形式。矩阵的对角形式很有用,因为它使我们能够轻松地计算矩阵的迹和行列式。

特征值分解的另一个重要特性是它能够揭示矩阵的结构。例如,对称矩阵的特征值总是实数,特征向量是正交的,这意味着它们彼此垂直。在非对称矩阵的情况下,特征值可以是复数,特征向量也不一定是正交的。

矩阵的特征值分解在数学、物理、工程和计算机科学中有着广泛的应用。在数值分析中,特征值分解用于求解线性系统、计算矩阵的特征值和找到矩阵的特征向量。在物理学中,特征值分解用于分析系统的稳定性,例如微分方程中平衡点的稳定性。在工程学中,特征值分解用于研究系统的动力学,例如机械系统的振动。

在计算机科学领域,特征值分解在多个领域都有广泛的应用,包括机器学习和数据分析。在机器学习中,特征值分解在实现主成分分析(PCA)中扮演着关键角色,这是一种用于大规模数据集降维的技术。在数据分析领域,特征值分解被用来计算奇异值分解(SVD),这是一种用于剖析和理解复杂数据集的有力工具。

奇异值分解

最小化问题<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="bold">x</mml:mi></mml:math>,其中x是一个具有单位范数的列向量,而A是一个对称的d × d数据矩阵,是众多机器学习场景中遇到的典型问题。这种问题类型常出现在主成分分析、奇异值分解和谱聚类等应用中,这些都涉及特征工程和降维。优化问题可以表述如下:

最小化

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msupmml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="bold">x</mml:mi></mml:math>

受限于

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msupmml:mrow<mml:mfenced open="‖" close="‖" separators="|">mml:mrow<mml:mi mathvariant="bold">x</mml:mi></mml:mrow></mml:mfenced></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msup>mml:mo=</mml:mo>mml:mi </mml:mi>mml:mn1</mml:mn></mml:math>

我们可以将优化问题表示为最大化或最小化形式。施加约束,使得向量 x 必须是单位向量,这显著改变了优化问题的本质。与上一节相比,矩阵 A 的正半定性质对于确定解已不再至关重要。即使 A 是不定矩阵,对向量 x 的范数约束也能确保一个明确的解,防止出现具有无界大小或平凡解(如 0 向量)的向量。奇异值分解SVD)是一种数学技术,它将一个矩形矩阵 A 分解为三个矩阵:US<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>。矩阵 A 被定义为 n × p 矩阵。SVD 定理表明 A 可以表示为三个矩阵的乘积:<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">U</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">n</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mi mathvariant="normal">n</mml:mi></mml:mrow></mml:msub>mml:msubmml:mrow<mml:mi mathvariant="bold-italic">S</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">n</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:mrow></mml:msub>mml:msubmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">p</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:mrow></mml:msub></mml:math>,其中 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">U</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">U</mml:mi>mml:mo=</mml:mo>mml:msubmml:mrow<mml:mi mathvariant="bold">I</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">n</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mi mathvariant="normal">n</mml:mi></mml:mrow></mml:msub></mml:math>,和 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">V</mml:mi>mml:mo=</mml:mo>mml:msubmml:mrow<mml:mi mathvariant="bold">I</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">p</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:mrow></mml:msub></mml:math>,并且 UV 是正交矩阵。

U 矩阵的列被称为左奇异向量,而 V 矩阵转置 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math> 的行是右奇异向量。具有奇异值的 S 矩阵是一个与 A 相同大小的对角矩阵。奇异值分解将原始数据分解到一个定义向量是正交归一(既是正交又是单位)的坐标系中。奇异值分解的计算涉及识别矩阵 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">T</mml:mi></mml:mrow></mml:msup></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi></mml:math> 的特征值和特征向量。矩阵 V 的列由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">T</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi></mml:math> 的特征向量组成,而矩阵 U 的列由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">T</mml:mi></mml:mrow></mml:msup></mml:math> 的特征向量组成。S 矩阵中的奇异值是从 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi></mml:math> 的特征值的平方根得到的,并按降序排列。这些奇异值是实数。如果 A 是实矩阵,UV 也将是实数。

为了说明奇异值分解(SVD)的计算,提供了一个示例。考虑一个 4 × 2 矩阵。可以通过计算 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi></mml:math> 来找到矩阵的特征值,然后确定这些矩阵的特征向量。U 的列由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math> 的特征向量组成,而 V 的列由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math> 的特征向量组成。S 矩阵由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="bold">A</mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">A</mml:mi></mml:math> 的特征值的平方根组成。在给定的示例中,通过求解特征方程 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mfenced open="|" close="|" separators="|">mml:mrow<mml:mi mathvariant="bold">W</mml:mi>mml:mo-</mml:mo>mml:miλ</mml:mi><mml:mi mathvariant="bold">I</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math> 来找到特征值,其中 W 是矩阵,I 是单位矩阵,而 λ 是特征值。然后通过求解从特征值方程导出的方程组来找到特征向量。最终通过结合特征向量和奇异值得到最终的矩阵 US<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">V</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup></mml:math>

应该注意的是,单个值是按降序排列的,其中 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miλ</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo></mml:mo>mml:msubmml:mrowmml:miλ</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo></mml:mo>mml:mo…</mml:mo></mml:math>

让我们继续讨论机器学习的基本概率。

机器学习的基本概率

概率提供了关于事件发生的可能性的信息。在这个领域,有几个关键术语是重要的,需要理解:

  • 试验或实验:一个以一定可能性产生特定结果的行为

  • 样本空间:这包括给定实验的所有潜在结果

  • 事件:这表示样本空间的一个非空部分

因此,从技术角度讲,概率是在进行实验时事件发生的可能性的度量。

在这个非常简单的例子中,事件 A 有一个结果时的概率等于事件 A 的概率除以所有可能事件的机会。例如,在抛一个公平的硬币时,有两种相同机会的结果:正面和反面。出现正面的概率将是 1/(1+1) = ½

为了计算给定事件 A 和样本空间 S 的概率,其中 An 个结果,事件 A 的概率计算如下

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miA</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mrowmml:munderover<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mii</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miE</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mrow></mml:math>

其中 E1,…,En 表示 A 中的结果。假设实验的所有结果都有相同的机会,并且选择一个结果不会影响后续轮次中选择其他结果(这意味着它们在统计上是独立的),那么

PA=No.ofoutcomesinANo.outcomesinS

因此,概率的值从 01,样本空间代表了所有可能结果的完整集合,表示为 P(S) = 1

统计独立

在统计学领域,如果事件 A 的发生不影响事件 B 发生的可能性,则称这两个事件是独立的。用正式的说法,当事件 AB 独立时,恰好是 P(A and B) = P(A)P(B),其中 P(A)P(B) 分别是事件 AB 发生的概率。

考虑以下例子来阐明统计独立的概念:假设我们有两枚硬币,一枚是公平的(出现正面或反面的机会相等)和一枚是有偏的(出现正面的概率大于反面)。如果我们同时抛掷这两枚硬币,这两个事件在统计上是独立的,因为一枚硬币抛掷的结果不会改变另一枚硬币出现正面或反面的概率。具体来说,两枚硬币同时出现正面的概率是各自概率的乘积:(1/2) * (3/4) = 3/8

统计独立是统计学和概率论中的一个关键概念,在机器学习中常被用来描述数据集中变量之间的关系。通过理解这些关系,机器学习算法可以更好地发现模式并做出更精确的预测。以下我们将描述不同类型事件之间的关系:

  • 互补事件:事件 A 的互补事件,表示为 A’,包括了样本空间中不属于 A 的所有可能结果的概率。重要的是要理解 AA’ 在统计上是独立的:

P(A′)=1−P(A)

  • 并集和交集:与A互补的事件,表示为A’,包括样本空间中不在A中的所有潜在结果的概率。重要的是要理解AA’在统计学上是独立的。

  • 互斥:当两个事件没有共同的结果时,它们被视为互斥的。换句话说,如果AB是互斥事件,那么P(A B) = 0。这个结论可以从概率的加法规则中得出,因为AB是互斥事件:

P(AUB)=P(A)+P(B)

  • 独立:当其中一个事件的发生不影响另一个事件的发生时,这两个事件被认为是独立的。如果AB是两个独立事件,那么

P(A∩B)=P(A)∙P(B)

接下来,我们将描述离散随机变量、其分布以及如何使用它来计算概率。

离散随机变量及其分布

离散随机变量指的是可以假设有限或可数无限多个潜在结果的变量。此类变量的例子可能包括抛硬币得到的正面数量、在特定时间段内通过收费站的汽车数量,或者教室中金发学生的数量。

离散随机变量的概率分布为变量可能采用的每个潜在结果分配一定的可能性。例如,在抛硬币的情况下,概率分布将0.5的概率分配给01,分别代表反面和正面。对于汽车收费站场景,分布可能将0.1的概率分配给没有汽车通过,0.3的概率分配给一辆车,0.4的概率分配给两辆车,0.15的概率分配给三辆车,以及0.05的概率分配给四辆车或更多。

可以通过概率质量函数PMF)来图形化表示离散随机变量的概率分布,该函数将变量的每个可能结果与其发生的可能性相关联。这个函数通常以条形图或直方图的形式表示,每个条形表示特定值的概率。

离散随机变量的概率质量函数(PMF)受两个关键原则的约束:

  • 必须在随机变量的所有潜在值上都是非负的

  • 所有可能结果的概率总和应等于1

离散随机变量的期望值可以揭示其中心趋势,计算为其可能结果的概率加权平均值。这个期望值表示为E[X],其中X代表随机变量。

概率密度函数

概率密度函数(PDF)是描述连续随机变量分布的工具。它可以用来计算一个值落在特定范围内的概率。简单来说,它有助于确定连续变量X在区间[a, b]内或统计学上的值出现的概率。

P(A<X<B)

对于连续变量,单个值出现的概率始终为0,这与可以分配非0概率给不同值的离散变量形成对比。PDF提供了一种估计值落在给定范围内的可能性,而不是单个值。

例如,你可以使用概率密度函数来找出下一个测量的智商分数落在100120之间的概率。

图2.2 – 智商100至120的概率密度函数

图2.2 – 智商100至120的概率密度函数

为了确定离散随机变量的分布,可以提供其概率质量函数(PMF)或累积分布函数(CDF)。对于连续随机变量,我们主要利用CDF,因为它已经建立。然而,PMF不适用于这些类型的变量,因为对于所有在实数集中的xP(X=x)等于0,给定X可以取ab之间的任何实数值。因此,我们通常定义概率密度函数。概率密度函数类似于物理学中的质量密度概念,表示概率的集中。其单位是每单位长度的概率。为了理解概率密度函数,让我们分析一个连续随机变量X,并建立如下函数fX(x)

fXx=lim∆→0+P(x<X≤x+∆)∆

如果极限存在。

函数 fXx 提供了在给定点 x 的概率密度。这相当于区间 (x, x + Δ] 的概率与该区间长度的比值的极限。

让我们考虑一个具有绝对连续累积分布函数的连续随机变量 X,表示为 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced></mml:math>。如果 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced></mml:math>x 处可导,则函数 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced></mml:math> 被称为 X 的概率密度函数:

fXx=lim∆→0+FXx+∆−FXx∆=dFXxdx=F′Xx

假设 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mix</mml:mi></mml:math> 处可导。

例如,让我们考虑一个具有均匀<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miU</mml:mi>mml:mo(</mml:mo>mml:mia</mml:mi>mml:mo,</mml:mo>mml:mib</mml:mi>mml:mo)</mml:mo></mml:math>分布的连续均匀随机变量X。其累积分布函数(CDF)由以下公式给出:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mfracmml:mrowmml:mn1</mml:mn></mml:mrow>mml:mrowmml:mib</mml:mi>mml:mo-</mml:mo>mml:mia</mml:mi></mml:mrow></mml:mfrac><mml:mi mathvariant="normal"> </mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mii</mml:mi>mml:mif</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mia</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo<</mml:mo>mml:mix</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo<</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mib</mml:mi></mml:math>

这对于任何在边界之外的x都是0

通过积分,可以从概率密度函数(PDF)获得CDF:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mrowmml:munderover<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mo-</mml:mo><mml:mi mathvariant="normal">∞</mml:mi></mml:mrow>mml:mrowmml:mix</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:miu</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi>mml:miu</mml:mi></mml:mrow></mml:mrow></mml:math>

此外,我们还有

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:mia</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo<</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:miX</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:mo≤</mml:mo>mml:mib</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mib</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:msubmml:mrowmml:miF</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mia</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mrowmml:msubsup<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mia</mml:mi></mml:mrow>mml:mrowmml:mib</mml:mi></mml:mrow></mml:msubsup>mml:mrowmml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:miu</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi>mml:miu</mml:mi></mml:mrow></mml:mrow></mml:math>

因此,如果我们对整个实数线进行积分,我们将得到1:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mrowmml:munderover<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mo-</mml:mo><mml:mi mathvariant="normal">∞</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">∞</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:miu</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi>mml:miu</mml:mi></mml:mrow></mml:mrow><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mn1</mml:mn></mml:math>

明确来说,当我们对概率密度函数在整个实数线上进行积分时,结果应该等于1。这意味着概率密度曲线下的面积必须等于1,或者P(S) = 1,这在均匀分布中依然成立。概率密度函数表示概率密度;因此,它必须是非负的,并且可以超过1

考虑一个连续随机变量 X,其概率密度函数(PDF)表示为 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced></mml:math>. 以下性质适用:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal"> </mml:mi>mml:mo≥</mml:mo>mml:mn0</mml:mn></mml:math>

对于所有实数 x

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mrowmml:munderover<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mo-</mml:mo><mml:mi mathvariant="normal">∞</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">∞</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubmml:mrowmml:mif</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:miu</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi>mml:miu</mml:mi></mml:mrow></mml:mrow><mml:mi mathvariant="normal"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="normal"> </mml:mi>mml:mn1</mml:mn></mml:math>

接下来,我们将继续介绍最大似然估计。

最大似然估计

最大似然估计是一种统计方法,用于估计概率分布的参数。目标是确定最大化观察数据似然性的参数值,本质上确定最有可能生成数据的参数。

假设我们有一个从具有概率分布 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:mif</mml:mi>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo|</mml:mo><mml:mi mathvariant="bold-italic">θ</mml:mi>mml:mo)</mml:mo></mml:math> 的总体中抽取的随机样本 X={X1,…,Xn},其中 θ 是参数的向量。给定参数 θ,观察样本 X 的似然定义为观察每个数据点的概率的乘积:

L(θ|X)=f(X|θ)

在具有独立同分布观测值的情况下,似然函数可以表示为单变量密度函数的乘积,每个函数都在相应的观测值上评估:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miL</mml:mi><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:mif</mml:mi><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced>mml:mif</mml:mi><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced>mml:mo…</mml:mo>mml:mif</mml:mi><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced></mml:math>

最大似然估计(MLE)是在参数空间中提供似然函数最大值的参数向量值。

在许多情况下,使用似然函数的自然对数,即所谓的对数似然,会更加方便。对数似然的峰值出现在似然函数最大值相同的参数向量值处,而达到最大值(或最小值)所需的条件是通过将每个参数的对数似然导数等于0来获得的。如果对数似然相对于参数是可微的,这些条件将导致一组方程,可以通过数值方法求解以推导出最大似然估计(MLE)。一个MLE对机器学习模型性能产生显著影响的常见用例或场景是在线性回归中。在构建线性回归模型时,MLE通常用于估计定义输入特征与目标变量之间关系的系数。MLE有助于找到系数的值,以最大化在假设的线性回归模型下观察给定数据的似然性,从而提高预测的准确性。

参数的最大似然估计(MLEs)θ是使似然函数最大化的值。换句话说,最大似然估计(MLEs)是使观察到的数据X最可能的θ的值。

为了找到最大似然估计(MLEs),我们通常取似然函数的自然对数,因为与乘积本身相比,处理乘积的对数通常更容易:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:miL</mml:mi><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mrow>mml:mi </mml:mi>mml:mo=</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:mif</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced>mml:mo+</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:mif</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced>mml:mo+</mml:mo>mml:mo…</mml:mo>mml:mo+</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:mif</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrowmml:msubmml:mrowmml:miX</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi></mml:mrow></mml:msub></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow></mml:mfenced></mml:math>

最大似然估计(MLEs)是通过将关于每个参数的似然函数对数偏导数等于0来确定的,然后解这些方程以找到参数:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mo∂</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:miL</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:mrow></mml:mfenced>mml:mo/</mml:mo>mml:mo∂</mml:mo>mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math>

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mo∂</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:miL</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:mfenced>mml:mo/</mml:mo>mml:mo∂</mml:mo>mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math>

...

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:mo∂</mml:mo>mml:mrowmml:mrow<mml:mi mathvariant="normal">ln</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrowmml:miL</mml:mi></mml:mrow></mml:mrow><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="bold-italic">θ</mml:mi></mml:mrow>mml:mrowmml:miX</mml:mi></mml:mrow></mml:mfenced>mml:mo/</mml:mo>mml:mo∂</mml:mo>mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mik</mml:mi></mml:mrow></mml:msub>mml:mo=</mml:mo>mml:mn0</mml:mn></mml:math>

其中 kθ 中的参数数量。最大似然估计器的目标是找到 θ,使得

θ(x)=argmaxθL(θ|x)

一旦找到了最大似然估计值,它们就可以用来根据样本数据对总体进行预测。最大似然在许多领域中得到广泛应用,包括心理学、经济学、工程学和生物学。它作为理解变量之间联系和基于观察数据预测结果的有力工具。例如,使用最大似然估计构建单词预测器。

接下来,我们介绍单词自动补全的问题,也称为单词预测,这是一个功能,其中应用程序预测用户接下来可能输入的单词。单词预测的目的是通过根据用户的先前输入和其他上下文因素预测用户可能输入的内容来节省时间和简化输入。单词预测可以在许多应用程序中以各种形式找到,包括搜索引擎、文本编辑器和移动设备键盘,旨在节省时间和提高输入的准确性。

给定用户输入的一组单词,我们该如何建议下一个单词?

如果单词是The United States of,那么假设下一个单词将是America是显而易见的。然而,对于How are的下一个单词,我们该怎么办?有人可能会建议几个可能的下一个单词。

通常不会只有一个明确的下一个单词。因此,我们希望提出最可能的单词,或者甚至是最可能的单词。在这种情况下,我们会对提出可能的下一个单词的概率表示感兴趣,并选择最可能的下一个单词。

最大似然估计器为我们提供了这种精确的能力。它可以告诉我们,给定用户输入的前一个单词,哪个单词最有可能。

为了计算最大似然估计(MLE),我们需要计算所有单词组合的概率函数。我们可以通过处理大量文本并计算每种单词组合出现的次数来实现这一点。

考虑审查一个具有以下出现次数的大量文本:

“****you” “****they” “****those” “****the” Any other word
“how are …” 16 14 0 100 10
not “how are…” 200 100 300 1,000 30,000

表2.1 – 文档中n-gram出现次数的样本

例如,在文本中有16次出现“how are you”的序列。有140个长度为三的序列以“how are”开头。这可以这样计算:

16+14+0+100+10=140

有216个长度为三的序列以单词“you”结尾。这可以这样计算:

16+200=216

现在,让我们提出一个最可能下一个单词的公式。

基于概率变量的常见最大似然估计<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msub></mml:math>,公式将是为了找到一个<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msub></mml:math>的值,该值最大化:

PW3W1,W2)

然而,这个常见的公式有几个特性,对我们应用来说并不有利。

考虑下一个公式,它具有对我们用例必要的特定优势。它是参数估计的最大似然公式,意味着估计确定性参数。它建议找到一个<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msub></mml:math> 的值,使其最大化:

PW1,W2W3)

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msub></mml:math> 绝非一个确定性的参数,然而,这个公式适合我们的用例,因为它减少了常见的词义偏差,强调了上下文匹配,并调整了词的特定性,从而增强了我们预测的相关性。我们将在本练习的结论中进一步阐述这些特性。

让我们改进这个公式,使其更容易计算:

PW1,W2W3)=P(W1,W2,W3)P(W3)

在我们的情况下,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> 代表“如何”,而<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:math> 代表“是”。

下一个词有五个候选者;让我们计算每个候选者的概率:

  • P(“how”, “are” | “you”) = 16 / (200 + 16) = 16/216 = 2/27

  • P(“how”, “are” | “they”) = 14 / (100 +14) = 14/114 = 7/57

  • P(“how”, “are” | “those”) = 0 / 300 = 0

  • P(“how”, “are” | “the”) = 100 / (1000 + 100) = 100/1100 = 1/11

  • P(“how”, “are” | 任何其他词) = 10 / (30,000 + 10) = 10/30010 = 1/3001

在所有选项中,概率最高的是 7/57,这是当“they”是下一个词时实现的。

注意,这个最大似然估计器的直觉是建议的下一个词使得用户输入的词最有可能。有人可能会想,为什么不取给定前两个词最可能出现的词,即,概率变量的原始最大似然公式?从表中,我们看到给定“how are”这个词组,最频繁出现的第三个词是“the”,概率为 100/140。然而,这种方法不会考虑到“the”这个词在整体上极其普遍的事实,因为它在文本中是最频繁使用的。因此,它的高频率并不是由于它与前两个词的关系;而是因为它在一般情况下是一个非常常见的词。我们选择的最大似然公式正是考虑了这一点。

贝叶斯估计

贝叶斯估计是一种统计方法,它涉及根据新数据更新我们对感兴趣量的信念或概率。术语“贝叶斯”指的是托马斯·贝叶斯,一位18世纪的统计学家,他首先提出了贝叶斯概率的概念。

在贝叶斯估计中,我们开始于对感兴趣量的先验信念,这些信念以概率分布的形式表达。随着我们收集新的数据,这些先验信念会得到更新。更新的信念以后验分布的形式表示。贝叶斯框架提供了一种系统的方法来使用新数据更新先验信念,同时考虑到先验信念和新数据的不确定性程度。

后验分布是使用贝叶斯定理计算的,这是贝叶斯估计的基本方程。贝叶斯定理指出

PΘ|X=PX|ΘPΘPX

其中 Θ 是感兴趣的量,X 是新的数据,P(Θ|X) 是后验分布,P(X|Θ) 是给定参数值的数据似然,P(Θ) 是先验分布,而 P(X) 是边缘似然或证据。

边缘似然的计算如下:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miX</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:mrowmml:munderover<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mi </mml:mi></mml:mrow>mml:mrowmml:mi </mml:mi></mml:mrow></mml:munderover>mml:mrowmml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miX</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="normal">Θ</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mrow>mml:mo∙</mml:mo>mml:miP</mml:mi><mml:mfenced separators="|">mml:mrow<mml:mi mathvariant="normal">Θ</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi><mml:mi mathvariant="normal">Θ</mml:mi></mml:math>

其中积分是在Θ的整个空间上进行的。边缘似然通常用作归一化常数,确保后验分布积分等于1

在贝叶斯估计中,选择先验分布非常重要,因为它反映了我们在收集任何数据之前对感兴趣数量的信念。先验分布可以根据先验知识或先前研究来选择。如果没有先验知识,可以使用非信息性先验,例如均匀分布。

一旦计算出后验分布,就可以用它来对感兴趣的数量进行预测。例如,后验分布的均值可以作为点估计,而后验分布本身可以用来建立可信区间。这些区间代表了目标数量真实值可能存在的可能范围。

摘要

本章主要介绍了机器学习中的线性代数和概率论,涵盖了理解许多机器学习算法所必需的基本数学概念。本章从线性代数的复习开始,包括矩阵乘法、行列式、特征向量和特征值等内容。随后转向概率论,介绍了随机变量和概率分布的基本概念。我们还涵盖了统计推断中的关键概念,如最大似然估计和贝叶斯推断。

在下一章中,我们将介绍自然语言处理(NLP)的机器学习基础,包括数据探索、特征工程、选择方法和模型训练与验证等内容。

进一步阅读

请参考以下附加阅读内容:

  • 豪斯霍尔德反射矩阵:豪斯霍尔德反射矩阵,或称豪斯霍尔德矩阵,是一种在数值线性代数中由于计算有效性和数值稳定性而被使用的线性变换。这种矩阵用于在平面或超平面上对给定的向量进行反射,使向量在特定维度上只具有非0分量。豪斯霍尔德矩阵H)定义为

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">H</mml:mi><mml:mi mathvariant="bold"> </mml:mi>mml:mo=</mml:mo><mml:mi mathvariant="bold"> </mml:mi><mml:mi mathvariant="bold">I</mml:mi><mml:mi mathvariant="bold"> </mml:mi>mml:mo-</mml:mo><mml:mi mathvariant="bold"> </mml:mi>mml:mn2</mml:mn><mml:mi mathvariant="bold"> </mml:mi><mml:mi mathvariant="bold">u</mml:mi><mml:mi mathvariant="bold"> </mml:mi>mml:msupmml:mrow<mml:mi mathvariant="bold">u</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="bold">T</mml:mi></mml:mrow></mml:msup></mml:math>

在这里,I是单位矩阵,而u是一个定义反射平面的单位向量。

豪斯霍尔德变换的主要目的是执行QR分解并将矩阵简化为三对角或海森伯格形式。其对称性和正交性使得豪斯霍尔德矩阵在计算上高效且数值稳定。

  • 可对角化:如果一个矩阵可以写成D=P−1APD=P−1AP的形式,其中A是原始矩阵,D是对角矩阵,而P是一个其列是A的特征向量的矩阵,那么这个矩阵被称为可对角化的。对角化简化了线性代数中的许多计算,因为对角矩阵的计算通常更为直接。为了使一个矩阵可对角化,它必须拥有足够的线性无关的特征向量来构成其空间的基,通常情况下,当所有特征值都不同时,这种情况是成立的。

  • 可逆:可逆矩阵,也称为非奇异矩阵或非退化矩阵,是一个有逆的方阵。如果一个矩阵,A,是可逆的,那么存在另一个矩阵,通常表示为 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrow<mml:mi mathvariant="bold">A</mml:mi></mml:mrow>mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msup></mml:math>,当它们相乘时,会产生单位矩阵。换句话说,AA−1=A−1A=I,其中 I 是单位矩阵。单位矩阵是一个特殊的方阵,其对角线上的元素为1,其余位置为0。逆矩阵的存在很大程度上取决于矩阵的行列式——一个矩阵是可逆的当且仅当其行列式不为0。可逆矩阵在数学的许多领域都非常重要,包括解线性方程组、矩阵分解以及在工程和物理中的许多应用。

  • 高斯消元法:高斯消元是线性代数中用于解线性方程组的基本算法。它通过将系统转换为等价系统来实现,在该系统中方程更容易求解。这种方法使用一系列操作来修改方程组,目的是创建行阶梯形或简化行阶梯形。以下是高斯消元法的简化步骤:首先,交换行以移动任何带有首项系数(从左数第一个非0数字,也称为主元)的行,以便在顶部有1。然后,将任何行乘以或除以一个标量,以创建一个首项系数为1(如果尚未存在)。最后,通过加减行来创建主元下方的0和主元以上方的0。一旦矩阵处于行阶梯形(所有0行都在底部,每个首项系数都在其上方行的首项系数右侧),我们就可以使用回代法来找到变量。如果我们进一步简化矩阵到简化行阶梯形(每个首项系数是其列中唯一的非0项),则可以直接从矩阵中读取解。高斯消元法还可以用于找到矩阵的秩、计算行列式以及如果系统是方阵且有唯一解,则执行矩阵求逆。

  • :方阵的迹是其对角元素的和。它表示为 Tr(A)trace(A),其中 A 是一个方阵。例如,如果

    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block"><mml:mi mathvariant="bold">A</mml:mi>mml:mo=</mml:mo><mml:mfenced open="[" close="]" separators="|">mml:mrowmml:mtablemml:mtrmml:mtdmml:mia</mml:mi></mml:mtd>mml:mtdmml:mib</mml:mi></mml:mtd></mml:mtr>mml:mtrmml:mtdmml:mic</mml:mi></mml:mtd>mml:mtdmml:mid</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mfenced></mml:math>

    Tr(A) = a + d.

参考文献

  • Alter O, Brown PO, Botstein D. (2000) 全基因组表达数据处理的奇异值分解和建模. 美国国家科学院院刊, 97, 10101-6.

  • Golub, G.H., and Van Loan, C.F. (1989) 矩阵计算, 第二版. (巴尔的摩: 约翰霍普金斯大学出版社).

  • Greenberg, M. (2001) 微分方程与线性代数 (Upper Saddle River, N.J. : 预习出版社).

  • Strang, G. (1998) 线性代数导论 (Wellesley, MA : Wellesley-Cambridge Press).

  • Lax, Peter D. 线性代数及其应用. 第78卷. 约翰·威利与 sons, 2007.

  • Dangeti, Pratap. 机器学习统计学. Packt Publishing Ltd, 2017.

  • DasGupta, Anirban. 概率论与统计机器学习:基础与高级主题. 纽约: 斯普林格, 2011.

第三章:在自然语言处理中释放机器学习的潜力

在本章中,我们将深入研究机器学习(ML)的基本原理和预处理技术,这些技术对于自然语言处理(NLP)任务是必不可少的。机器学习是构建可以从数据中学习的模型的有力工具,而自然语言处理(NLP)是机器学习中最激动人心和最具挑战性的应用之一。

到本章结束时,你将全面了解数据探索、预处理和数据拆分,了解如何处理不平衡数据技术,并了解一些成功机器学习所需的常见机器学习模型,特别是在自然语言处理(NLP)的背景下。

本章将涵盖以下主题:

  • 数据探索

  • 常见机器学习模型

  • 模型欠拟合和过拟合

  • 数据拆分

  • 超参数调整

  • 集成模型

  • 处理不平衡数据

  • 处理相关数据

技术要求

本章以及本书后续章节假定你具备编程语言(尤其是Python)的先验知识。还期望你已经阅读了前面的章节,以便熟悉将在本章详细讨论的必要线性代数和统计学概念。

数据探索

在方法论环境中工作,数据集通常是众所周知的且已预处理,例如Kaggle数据集。然而,在现实世界的商业环境中,一项重要任务是定义来自所有可能数据来源的数据集,探索收集到的数据以找到最佳预处理方法,并最终决定最适合问题和底层数据的机器学习和自然语言模型。这个过程需要仔细考虑和分析数据,以及对当前业务问题的深入理解。

在自然语言处理(NLP)中,数据可能相当复杂,因为它通常包括文本和语音数据,这些数据可能是非结构化的且难以分析。这种复杂性使得预处理成为准备数据供机器学习模型使用的一个基本步骤。任何自然语言处理(NLP)或机器学习(ML)解决方案的第一步都是探索数据,以了解更多关于它的信息,这有助于我们决定解决问题的路径。

一旦数据预处理完成,下一步就是探索它,以便更好地理解其特性和结构。数据探索是一个迭代过程,涉及可视化和分析数据,寻找模式和关系,以及识别潜在的问题或异常值。这个过程可以帮助我们确定哪些特征对我们的人工智能模型最重要,并识别任何潜在的数据质量或偏差问题。为了通过人工智能模型简化数据并增强分析,可以采用诸如分词、词干提取和词形还原等预处理方法。在本章中,我们将概述人工智能问题的一般预处理技术。在下一章中,我们将深入探讨特定于文本处理的预处理技术。值得注意的是,采用有效的预处理技术可以显著提高人工智能模型的性能和准确性,使它们更加稳健和可靠。

最后,一旦数据预处理和探索完成,我们就可以开始构建我们的人工智能模型。没有一种神奇的解决方案适用于所有人工智能问题,因此仔细考虑哪种模型最适合当前的数据和问题是至关重要的。存在多种类型的自然语言处理模型,包括基于规则的、统计的和深度学习模型。每种模型类型都有其独特的优势和劣势,这强调了选择最适合特定问题和数据集的重要性。

数据探索是人工智能工作流程中的重要且初始步骤,涉及在构建人工智能模型之前分析和理解数据。数据探索的目标是深入了解数据,识别模式,检测异常,并为建模准备数据。数据探索有助于选择正确的人工智能算法,并确定最佳的特征集。

这里有一些在数据探索中常用的技术:

  • 数据可视化:数据可视化涉及通过图形或图像格式来表示数据。它使数据可视化探索成为可能,提供了关于其分布、模式和关系的见解。在数据可视化中广泛使用的技术包括散点图、条形图、热图、箱线图和相关性矩阵。

  • 数据清洗:数据清洗是预处理的一个步骤,其中我们识别错误、不一致性和缺失值并纠正它们。由于人工智能模型对数据中的错误敏感,这会影响模型的最终结果。删除重复项和填充缺失值是一些常见的数据清洗技术。

  • 特征工程:特征工程在通过从现有数据中构建新特征来优化机器学习模型的有效性方面发挥着至关重要的作用。这个过程不仅涉及识别相关特征,还包括转换现有特征和引入新特征。包括缩放、归一化、降维和特征选择在内的各种特征工程技术有助于提高模型的总体性能。

  • 统计分析:统计分析运用一系列统计技术来审查数据,揭示其内在属性的有价值见解。基本的统计方法包括假设检验、回归分析和时间序列分析,所有这些都有助于全面理解数据的特征。

  • 领域知识:利用领域知识意味着应用对数据领域已有的理解来提取洞察并做出明智的决策。这种知识在识别相关特征、解释结果以及选择最适合当前任务的机器学习算法方面非常有价值。

我们将在接下来的小节中探讨这些技术的每一个。

数据可视化

数据可视化是机器学习的一个关键组成部分,因为它使我们能够更轻松地理解和探索复杂的数据集。这涉及到使用图表、图形和其他类型的视觉辅助工具来创建数据的视觉表示。通过视觉呈现数据,我们可以识别出在仅检查原始数据时可能不明显存在的模式、趋势和关系。

对于自然语言处理任务,数据可视化可以帮助我们深入了解文本数据中的语言模式和结构。例如,我们可以创建词云来可视化语料库中单词的频率,或使用热图来显示单词或短语的共现。我们还可以使用散点图和折线图来可视化随时间变化的情感或主题。

对于机器学习来说,散点图是一种常见的可视化类型,用于显示两个变量之间的关系。通过在X轴和Y轴上绘制两个变量的值,我们可以识别它们之间存在的任何模式或趋势。散点图在识别具有相似特征的数据点的簇或组方面特别有用。

在机器学习中经常使用的一种可视化类型是直方图,这是一种展示单个变量分布的工具。通过将数据分组到不同的区间并描绘每个区间中数据点的频率,我们可以确定在数据集中占主导地位的价值范围。直方图在检测异常值或异常情况以及识别数据可能表现出偏斜或偏差的区域方面非常有用。

除了这些基本的可视化之外,机器学习从业者经常使用更高级的技术,例如降维和网络可视化。降维技术,如主成分分析PCA)和t-分布随机邻域嵌入t-SNE),常用于降维以及更轻松地可视化或分析数据。另一方面,网络可视化用于显示实体之间的复杂关系,例如词语的共现或社交媒体用户之间的联系。

数据清洗

数据清洗,也称为数据净化或数据清理,涉及识别和纠正或消除数据集中的错误、不一致性和不准确性。在机器学习数据准备的这个关键阶段,它对模型的准确性和性能有重大影响,依赖于用于训练的数据质量。在数据清洗中采用了许多常见的技术。让我们更详细地了解一下。

处理缺失值

缺失数据是许多机器学习项目中常见的问题。处理缺失数据很重要,因为机器学习模型无法处理缺失数据,可能会产生错误或提供不准确的结果。

在机器学习项目中处理缺失数据有几种方法:

  • 删除行:处理缺失数据可能涉及一种简单的方法,即丢弃包含这些值的行。然而,在采用这种方法时,谨慎行事至关重要,因为过度删除行可能会导致宝贵数据的丢失,从而影响模型的总体准确性。我们通常在数据集中只有几行,并且有几行缺失值时使用这种方法。在这种情况下,删除几行可能是训练我们的模型的一个好方法,而且最终性能不会受到显著影响。

  • 删除列:另一种方法是删除包含缺失值的列。如果缺失值集中在少数几列,并且这些列对于分析不是很重要,那么这种方法可能是有效的。然而,删除重要的列可能会导致宝贵信息的丢失。在删除这些列之前,最好进行某种相关性分析,以查看这些列中的值与目标类别或值的关联性。

  • 均值/中位数/众数插补:均值、中位数和众数插补涉及用从相应列中非缺失值得到的均值、中位数或众数来替换缺失值。这种方法易于实现,当缺失值很少且随机分布时可能有效。然而,它也可能引入偏差并影响数据的变异性。

  • 回归插补:回归插补涉及根据数据集中其他变量的值预测缺失值。当缺失值与数据集中的其他变量相关时,此方法可能有效,但需要为每个具有缺失值的列构建回归模型。

  • 多重插补:多重插补包括通过统计模型生成多个插补数据集,然后合并结果以生成最终数据集。这种方法在处理非随机分布的缺失值和数据集中大量空缺时特别有效。

  • K最近邻插补:K最近邻插补包括识别缺失值附近的k个最近数据点,并使用它们的值来插补缺失值。当缺失值在数据集中聚集在一起时,此方法可能有效。在这种情况下,我们可以找到与具有缺失值的数据集记录最相似的记录,然后使用这些记录的值的平均值作为该特定记录的缺失值。

从本质上讲,选择处理缺失数据的方法取决于缺失数据的性质和程度、分析目标和资源可用性。仔细评估每种方法的优缺点,并选择最适合特定项目的最合适方法至关重要。

移除重复项

消除重复项是一种常见的预处理措施,通过检测和删除重复记录来净化数据集。重复记录的出现可能归因于数据输入错误、系统故障或数据合并过程。重复项的存在可能会扭曲模型并导致不准确的分析。因此,识别和消除重复记录对于维护数据集的准确性和可靠性至关重要。

在数据集中移除重复项有不同的方法。最常见的方法是比较数据集的所有行以识别重复记录。如果有两个或更多行在所有列中都具有相同的值,则它们被认为是重复的。在某些情况下,如果某些列更容易出现重复,可能只需要比较列的子集。

另一种方法是使用唯一标识符列来识别重复项。唯一标识符列是包含每个记录唯一值的列,例如ID号码或唯一列的组合。通过比较唯一标识符列,可以识别并从数据集中删除重复记录。

在识别出重复记录之后,下一步是决定保留哪些记录以及删除哪些记录。一种方法是保留重复记录的第一个出现,并删除所有后续出现。另一种方法是保留信息最完整的记录,或者是最新的时间戳的记录。

认识到删除重复记录可能会导致数据集大小的减少,这可能会影响机器学习模型的表现至关重要。因此,评估删除重复记录对数据集和机器学习模型的影响是必不可少的。在某些情况下,如果重复记录包含其他记录无法获得的重要信息,可能需要保留重复记录。

标准化和转换数据

标准化和转换数据是准备数据用于机器学习任务的关键步骤。这个过程涉及对数据集的数值特征进行缩放和归一化,以便更容易解释和比较。标准化和转换数据的主要目标是通过对不同尺度和范围的特性影响进行缓解,从而提高机器学习模型的准确性和性能。用于标准化数据的一种广泛使用的方法被称为“标准化”或“Z分数归一化”。这种技术涉及将每个特征转换,使其具有零均值和标准差为1。标准化的公式如下所示:

x′=(x−mean(x))/std(x)

在这里,x 代表特征,mean(x) 表示特征的均值,std(x) 表示特征的标准差,而 x’ 表示分配给特征的新值。通过这种方式标准化数据,每个特征的取值范围被调整为以零为中心,这使得比较特征更容易,并防止具有大值的特征主导分析。

另一种转换数据的技术是“最小-最大缩放”。这种方法将数据重新缩放到一个一致的范围,通常在0到1之间。最小-最大缩放的公式如下所示:

x′=(x−min(x))/(max(x)−mn(x))

在这个方程中,x 代表特征,min(x) 表示特征的最低值,而 max(x) 表示特征的最高值。Min-max缩放在数据的精确分布不是关键,但需要标准化数据以进行不同特征之间的有意义的比较时是有益的。

数据转换也可能涉及改变数据的分布。常用的转换是对数转换,它用于减轻数据中的异常值和偏斜的影响。这种转换涉及对特征值取对数,这有助于使分布正常化并减少极端值的影响。

总体而言,标准化和转换数据是机器学习数据预处理工作流程中的关键阶段。通过缩放和归一化特征,我们可以提高机器学习模型的准确性和性能,使数据更具可解释性,并有利于进行有意义的比较。

处理异常值

异常值是明显偏离数据集中其他观测值的数据点。它们的产生可能源于测量错误、数据损坏或真实的极端值。异常值的存在可能会对机器学习模型的输出产生重大影响,扭曲数据并破坏变量之间的关系。因此,处理异常值是机器学习数据预处理的重要步骤。

处理异常值有几种方法:

  • 移除异常值:一种直接的方法是消除数据集中被识别为异常值的观测。然而,采用这种方法时必须谨慎,因为过度移除观测值可能会导致丢失有价值的信息,并可能引入分析结果的偏差。

  • 转换数据:应用对数或平方根等数学函数来转换数据可以减轻异常值的影响。例如,对一个变量取对数可以减轻极端值的影响,因为对数尺度上的增长速度比原始值慢。

  • Winsorizing:Winsorizing是一种技术,涉及用数据集中最近的最高或最低值替换极端值。采用这种方法有助于保持样本大小和数据的整体分布。

  • 值填充:值填充涉及用从数据集中剩余观测值中估计的值替换缺失或极端值。例如,用剩余观测值的均值或中位数替换极端值是一种常见的填充技术。

  • 使用稳健的统计方法:稳健的统计方法对异常值的敏感性较低,即使在存在极端值的情况下也能得出更准确的结果。例如,选择中位数而不是均值可以有效地减少异常值对最终结果的影响。

强调选择异常值处理方法应针对数据的独特特性和具体问题量身定制至关重要。通常,建议采用多种方法的组合来全面处理异常值,并评估每种方法对结果的影响是必要的。此外,记录管理异常值的步骤对于可重复性和阐明决策过程非常重要。

纠正错误

在预处理阶段纠正错误是准备数据供机器学习使用的关键阶段。错误可能由于数据输入错误、测量差异、传感器不准确或传输故障等多种原因产生。在数据中纠正错误对于确保机器学习模型在可靠和精确的数据上训练至关重要,从而提高预测的准确性和可靠性。

存在几种纠正数据错误的技术。以下是一些广泛使用的方法:

  • 人工检查:纠正数据错误的一种方法是对数据集进行人工检查,其中错误通过手工进行更正。这种方法经常被采用,尤其是在处理相对较小且可管理的数据集时。

  • 统计方法:统计方法在识别和纠正数据错误方面非常有效。例如,当数据遵循已知的分布时,可以使用如Z分数这样的统计技术来检测异常值,然后可以选择删除或替换这些异常值。

  • 机器学习方法:利用机器学习算法可以促进对数据错误的检测和纠正。例如,聚类算法在确定明显偏离更大数据集的数据点方面非常有价值。随后,这些确定的数据点可以进行进一步的检查和纠正。

  • 领域知识:利用领域知识对于在数据中定位错误至关重要。例如,当从传感器收集数据时,考虑到传感器能够产生的预期值范围,可以识别和纠正错误。

  • 插补:插补是一种在数据中填充缺失值的方法。这可以通过各种方式完成,包括使用均值或中位数插补等统计方法,以及k最近邻插补等机器学习算法。

选择技术取决于数据性质、数据集的大小以及您可用的资源等因素。

特征选择

特征选择涉及从数据集中选择最相关的特征来构建机器学习模型。目标是减少特征数量,同时不显著降低模型的准确性,从而提高性能、加快训练速度,并使模型解释更加直接。

存在多种特征选择方法。让我们看一下。

过滤方法

这些技术使用统计方法根据特征与目标变量的相关性对特征进行排序。常见的方法包括卡方、互信息和相关系数。然后根据预定义的阈值选择特征。

卡方

卡方检验是机器学习中广泛使用的统计方法,特别适用于分类变量。此测试衡量两个随机变量之间的依赖性,提供一个P值,表示获得与实际观察结果一样或更极端结果的可能性。

在假设检验中,卡方检验用于评估收集到的数据是否与预期数据一致。卡方检验统计量较小表示匹配良好,而较大的统计量则表示匹配较弱。当P值小于或等于0.05时,会导致拒绝零假设,认为其极不可能。相反,当P值大于0.05时,结果为接受或“未能拒绝”零假设。当P值在0.05附近波动时,需要对假设进行进一步审查。

在特征选择中,卡方检验评估数据集中每个特征与目标变量之间的关系。它根据特征观察频率与预期频率之间是否存在统计上显著差异来确定显著性,假设特征与目标变量之间相互独立。具有高卡方分数的特征表现出对目标变量的更强依赖性,这使得它们在分类或回归任务中更具信息量。计算卡方的公式在以下方程中给出:

X2=∑(Oi−Ei)2Ei

在这个公式中,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miO</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 表示观察值,而<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miE</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 表示期望值。计算涉及找到观察频率与期望频率之间的差异,将结果平方,然后除以期望频率。这些值在所有特征类别上的总和给出了该特征的总体卡方统计量。

测试的自由度取决于特征中的类别数和目标变量中的类别数。

卡方特征选择的典型应用在于文本分类,特别是在文档中特定单词的存在或缺失作为特征的场景中。卡方检验有助于识别与特定类别或文档类别强烈相关的单词,从而使其在机器学习模型中作为特征使用。在分类数据中,尤其是在特征与目标变量之间关系非线性的情况下,卡方检验证明是特征选择的有价值方法。然而,对于连续或高度相关的特征,其适用性会降低,此时可能需要其他特征选择方法。

互信息

互信息作为一种度量,用于衡量两个随机变量之间的相互依赖性。在特征选择的背景下,它量化了特征对目标变量提供的信息。核心方法包括计算每个特征与目标变量之间的互信息,最终选择互信息得分最高的特征。

从数学上讲,两个离散随机变量 XY 之间的互信息可以定义为以下:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miI</mml:mi><mml:mfenced separators="|">mml:mrowmml:miX</mml:mi>mml:mo;</mml:mo>mml:miY</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:mrowmml:munder<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mix</mml:mi>mml:mo∈</mml:mo>mml:miX</mml:mi></mml:mrow></mml:munder>mml:mrowmml:mrowmml:munder<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:miy</mml:mi>mml:mo∈</mml:mo>mml:miY</mml:mi></mml:mrow></mml:munder>mml:mrowmml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi>mml:mo,</mml:mo>mml:miy</mml:mi></mml:mrow></mml:mfenced>mml:mrow<mml:mi mathvariant="normal">log</mml:mi></mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrow<mml:mfenced separators="|">mml:mrowmml:mfracmml:mrowmml:miP</mml:mi>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo,</mml:mo>mml:miy</mml:mi>mml:mo)</mml:mo></mml:mrow>mml:mrowmml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:mix</mml:mi></mml:mrow></mml:mfenced>mml:miP</mml:mi>mml:mo(</mml:mo>mml:miy</mml:mi>mml:mo)</mml:mo></mml:mrow></mml:mfrac></mml:mrow></mml:mfenced></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:math>

在给定的方程中,p(x, y) 代表 XY 的联合概率质量函数,而 p(x)p(y) 分别代表 XY 的边缘概率质量函数。

在特征选择的情况下,互信息计算涉及将特征视为 X,将目标变量视为 Y。通过计算每个特征的互信息得分,然后我们可以选择得分最高的特征。

为了计算互信息所需的概率质量函数,可以使用基于直方图的方法。这涉及到将每个变量的范围划分为固定数量的桶,并根据每个桶中观察到的频率来估计概率质量函数。或者,可以使用核密度估计来估计概率密度函数,然后基于估计的密度计算互信息。

在实际应用中,互信息通常与其他特征选择方法(如卡方检验或基于相关性的方法)一起使用,以增强特征选择过程的整体性能。

相关系数

相关系数是两个变量之间线性关系强度和方向的指标。在特征选择领域,这些系数在识别与目标变量高度相关的特征方面非常有用,因此可以作为潜在的宝贵预测因子。

在特征选择中普遍使用的相关系数是皮尔逊相关系数,也称为皮尔逊的 r。皮尔逊的 r 衡量两个连续变量之间的线性关系,范围从 -1(表示完美的负相关)到 1(表示完美的正相关),0 表示无相关。其计算涉及将两个变量的协方差除以它们标准差的乘积,如下方程所示:

r=cov(X,Y)std(X)∙std(Y)

在给定的方程中,XY 代表感兴趣的两个变量,cov() 表示协方差函数,而 std() 表示标准差函数。

使用皮尔逊相关系数(Pearson’s r)进行特征选择涉及计算每个特征与目标变量之间的相关性。然后选择具有最高绝对相关系数的特征。高绝对相关系数表示与目标变量有强烈的关联,无论是正相关性还是负相关性。皮尔逊相关值及其相关程度的解释见 表 3.1

皮尔逊 相关系数 相关 程度
± 1 完美相关
± 0.50 - ± 1 高度相关
± 0.30 - ± 0.49 中度相关
< +0.29 低度相关
0 无相关

表 3 .1 – 皮尔逊相关值及其相关程度

值得注意的是,皮尔逊相关系数(Pearson’s r)仅适用于识别变量之间的线性关系。如果关系是非线性的,或者如果其中一个或两个变量是分类的,那么其他相关系数,如斯皮尔曼的 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miρ</mml:mi></mml:math> 或肯德尔的相关系数 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miτ</mml:mi></mml:math> 可能更合适。此外,在解释相关系数时需要谨慎,因为高相关性并不一定意味着因果关系。

包装方法

这些技术通过迭代模型训练和测试深入到特征子集。众所周知的方法包括前向选择、后向消除和递归特征消除。虽然计算量较大,但这些方法有可能显著提高模型精度。

包装方法的具体示例是递归特征消除RFE)。作为一种反向消除方法,RFE系统地移除最不重要的特征,直到剩余预定的特征数量。在每次迭代中,机器学习模型在现有特征上训练,并根据其特征重要性分数修剪最不重要的特征。这个过程持续进行,直到达到指定的特征数量。特征重要性分数可以从多种方法中提取,包括线性模型的系数值或从决策树中导出的特征重要性分数。RFE是一种计算成本较高的方法,但在特征数量非常大且需要减少特征空间时可能很有用。另一种方法是训练过程中的特征选择,这通常通过嵌入方法来完成。

嵌入方法

这些方法在模型的训练过程中选择特征。常见的方法包括LASSO和岭回归、决策树和随机森林。

LASSO

LASSO,即最小绝对收缩和选择算子的缩写,是一种常用于机器学习特征选择的线性回归技术。其机制涉及向标准回归损失函数中引入惩罚项。这种惩罚鼓励模型将不太重要的特征的系数减少到零,从而有效地从模型中消除它们。

当处理高维数据时,特征的数量远超过样本数量,LASSO方法特别有价值。在这种情况下,区分预测目标变量的最关键特征可能具有挑战性。LASSO通过自动识别最相关的特征,同时缩小其他特征的系数,脱颖而出。

LASSO方法通过寻找以下优化问题的解来工作,这是一个最小化问题:

minwy−Xw22+λw1

在给定的方程中,向量 y 代表目标变量,X 表示特征矩阵,w 表示回归系数向量,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miλ</mml:mi></mml:math> 是一个超参数,用于决定惩罚项的强度,而 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mo|</mml:mo>mml:mo|</mml:mo><mml:mi mathvariant="bold">w</mml:mi>mml:mo|</mml:mo>mml:mo|</mml:mo></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> 表示系数的 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="script">l</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> 范数(即它们的绝对值之和)。

目标函数中包含 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="script">l</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> 惩罚项促使模型精确地将某些系数置零,从而从模型中消除相关的特征。惩罚强度的程度由 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miλ</mml:mi></mml:math> 超参数控制,这可以通过交叉验证进行微调。

与其他特征选择方法相比,LASSO具有多个优势,例如其处理相关特征的能力以及同时执行特征选择和回归的能力。然而,LASSO也有一些局限性,例如它倾向于从一组相关特征中仅选择一个特征,并且如果特征数量远大于样本数量,其性能可能会下降。

考虑LASSO在预测房价中的特征选择应用。想象一个包含关于房屋的详细信息的数据集,例如卧室数量、地块大小、建筑年份等,以及它们各自的售价。使用LASSO,我们可以确定预测售价的最关键特征,同时将线性回归模型拟合到数据集上。结果是这样一个模型,可以根据房屋的特征预测新房屋的售价。

岭回归

岭回归是一种适用于特征选择的线性回归方法,它与普通最小二乘回归非常相似,但引入了惩罚项以防止过拟合。

在岭回归中,成本函数通过包含一个与系数幅度的平方成正比的惩罚项而进行修改。这个惩罚项由一个超参数控制,通常表示为 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miλ</mml:mi></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math>,它决定了正则化的强度。当 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math> 设置为零时,岭回归就退化为普通最小二乘回归。

惩罚项的影响体现在将系数的幅度缩小到零。这有助于减轻过拟合,阻止模型过度依赖任何单个特征。实际上,惩罚项通过减少不相关特征的重要性,充当一种特征选择的形式。

岭回归损失函数的方程如下:

minwy−Xw22+αw2

这里,我们有以下内容:

  • N 是训练集中样本的数量。

  • y 是大小为 N 的目标值的列向量。

  • X 是输入特征的设计矩阵。

  • w 是待估计的回归系数向量。

  • <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math> 是控制惩罚项强度的正则化参数。它是一个需要调整的超参数。

损失函数的第一个项衡量的是预测值与真实值之间的均方误差。第二个项是<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="script">l</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:math>惩罚项,它将系数缩小到零。岭回归算法找到使该损失函数最小化的回归系数值。通过调整正则化参数<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math>,我们可以控制模型的偏差-方差权衡,较高的α值会导致更强的正则化和较低的过拟合。

岭回归可以通过检查模型产生的系数的幅度来进行特征选择。系数接近零或更小的特征被认为不太重要,可以从模型中删除。可以使用交叉验证调整<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math>的值,以找到模型复杂性和准确性之间的最佳平衡。

岭回归的一个主要优点是它能够处理多重共线性,当自变量之间存在强相关性时会发生多重共线性。在这种情况下,普通最小二乘回归可能会产生不稳定和不可靠的系数估计,但岭回归可以帮助稳定估计并提高模型的总体性能。

选择LASSO或岭回归

岭回归和LASSO都是线性回归中使用的正则化技术,通过惩罚模型的系数来防止模型过拟合。虽然这两种方法都旨在防止过拟合,但它们在惩罚系数的方法上有所不同。

岭回归向平方误差和SSE)添加一个惩罚项,该惩罚项与系数幅度的平方成正比。惩罚项由正则化参数<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miα</mml:mi></mml:math>控制,它决定了应用于系数的收缩量。这个惩罚项将系数的值缩小到零,但不会将它们精确地设置为零。因此,岭回归可以用来减少模型中无关特征的影响,但不会完全消除它们。

另一方面,LASSO也向SSE添加一个惩罚项,但惩罚项与系数的绝对值成比例。与岭回归一样,LASSO也有一个正则化参数(<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miλ</mml:mi></mml:math>),它决定了应用于系数的收缩量。然而,当正则化参数足够高时,LASSO具有将一些系数精确设置为零的独特属性。因此,LASSO可以用作特征选择,因为它可以消除无关特征并将它们的对应系数设置为0。

通常,如果数据集具有许多特征,其中只有少数被认为是重要的,LASSO回归是一个更好的选择,因为它会将无关特征的系数设置为0,从而得到一个更简单、更可解释的模型。另一方面,如果预计数据集中的大多数特征都是相关的,则岭回归是一个更好的选择,因为它会将系数缩小到零,但不会将它们精确地设置为零,从而保留模型中的所有特征。

然而,需要注意的是,岭回归和LASSO之间的最佳选择取决于具体问题和数据集,并且通常建议尝试两者并使用交叉验证技术比较它们的性能。

维度约简技术

这些方法将特征转换到低维空间,同时尽可能保留信息。常见的方法包括PCA、线性判别分析LDA)和t-SNE

PCA

PCA是机器学习中广泛使用的技术,用于降低大型数据集的维度,同时保留大部分重要信息。PCA的基本思想是将一组相关变量转换为一组称为主成分的不相关变量。

PCA的目标是在数据中识别最大方差的方向,并将数据投影到这些方向上,从而降低数据的维度。主成分按解释的方差量排序,第一个主成分解释了数据中最大的方差。

PCA算法包括以下步骤:

  1. 标准化数据: PCA要求数据被标准化——也就是说,每个特征必须具有零均值和单位方差。

  2. 计算协方差矩阵: 协方差矩阵是一个方阵,它衡量数据中成对特征之间的线性关系。

  3. 计算协方差矩阵的特征向量和特征值: 特征向量代表数据集中最高方差的主要方向,而特征值量化了每个特征向量解释的方差程度。

  4. 选择主成分的数量:保留主成分的数量可以通过分析特征值,并选择解释最大方差的前k个特征向量来确定。

  5. 将数据投影到选定的主成分上:原始数据被投影到选定的主成分上,从而得到数据的低维表示。

主成分分析(PCA)可以通过选择解释数据中最大方差的前k个主成分来进行特征选择。这可以用于降低高维数据集的维度并提高机器学习模型的性能。然而,需要注意的是,PCA并不总是能带来性能的提升,特别是当数据已经是低维的或者特征之间没有高度相关性时。同时,还需要考虑所选主成分的可解释性,因为它们并不总是对应于数据中的有意义特征。

LDA

LDA是一种降维技术,用于机器学习中的特征选择。它通常用于分类任务,通过将特征转换到低维空间来减少特征数量,同时尽可能保留尽可能多的类区分信息。

在线性判别分析(LDA)中,目标是找到一个原始特征的线性组合,以最大化类之间的分离度。LDA的输入是一个标记示例的数据集,其中每个示例都是一个具有相应类标签的特征向量。LDA的输出是一组原始特征的线性组合,这些组合可以用作机器学习模型中的新特征。

执行LDA的第一步是计算每个类的均值和协方差矩阵。然后从类均值和协方差矩阵中计算出整体均值和协方差矩阵。目标是投影数据到低维空间,同时保留类信息。这是通过找到协方差矩阵的特征向量和特征值,按特征值降序排列,并选择与k个最大特征值对应的k个特征向量来实现的。所选特征向量构成新特征空间的基础。

线性判别分析(LDA)算法可以总结如下步骤:

  1. 计算每个类的均值向量。

  2. 计算每个类的协方差矩阵。

  3. 计算整体均值向量和整体协方差矩阵。

  4. 计算类间散布矩阵。

  5. 计算类内散布矩阵。

  6. 使用以下方程计算矩阵的特征向量和特征值:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msubsupmml:mrow<mml:mi mathvariant="bold">S</mml:mi></mml:mrow>mml:mrow<mml:mi mathvariant="bold-italic">w</mml:mi></mml:mrow>mml:mrowmml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msubsup><mml:mi mathvariant="normal">*</mml:mi>mml:msubmml:mrow<mml:mi mathvariant="bold">S</mml:mi></mml:mrow>mml:mrowmml:mib</mml:mi></mml:mrow></mml:msub></mml:math>

这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">S</mml:mi></mml:mrow>mml:mrowmml:miw</mml:mi></mml:mrow></mml:msub></mml:math>是类内散布矩阵,而<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">S</mml:mi></mml:mrow>mml:mrowmml:mib</mml:mi></mml:mrow></mml:msub></mml:math>是类间散布矩阵。

  1. 选择具有最高特征值的k个主特征向量作为新的特征空间。

LDA在特征数量大而示例数量少时特别有用。它可以用于各种应用,包括图像识别、语音识别和NLP。然而,它假设类是正态分布的,并且类协方差矩阵是相等的,但在实际应用中这并不总是成立。

t-SNE

t-SNE是一种降维技术,用于在低维空间中可视化高维数据,常用于特征选择。它由Laurens van der Maaten和Geoffrey Hinton于2008年开发。

t-SNE的基本思想是在低维空间中保留数据点的成对相似性,而不是保留它们之间的距离。换句话说,它试图保留数据的局部结构,同时丢弃全局结构。这在高维数据难以可视化的情况下可能很有用,但数据点之间可能存在有意义的模式和关系。

t-SNE首先计算高维空间中每对数据点之间的成对相似性。相似性通常使用高斯核来衡量,它给附近的点更高的权重,给远离的点更低的权重。然后,使用softmax函数将相似性矩阵转换为概率分布。这个分布用于创建一个低维空间,通常是2D或3D。

在低维空间中,t-SNE再次计算每对数据点之间的成对相似度,但这次使用学生t分布而不是高斯分布。t分布的尾部比高斯分布更重,这有助于更好地保留数据的局部结构。然后t-SNE调整低维空间中点的位置,以最小化高维空间中的成对相似度与低维空间中的成对相似度之间的差异。

t-SNE是一种通过将其降低到低维空间来可视化高维数据的有力技术。然而,它通常不用于特征选择,因为其主要目的是创建复杂数据集的视觉表示。

相反,t-SNE可以用来帮助识别具有相似特征的数据点簇,这可能有助于识别对特定任务重要的特征组。例如,假设你有一个包含客户人口统计信息和购买历史的数据集,你想根据他们的购买行为识别相似的客户组。你可以使用t-SNE将高维特征空间降低到二维,然后在散点图上绘制结果数据点。通过检查图表,你可能能够识别具有相似购买行为的客户簇,这可以随后指导你的特征选择过程。以下是对MNIST数据集的t-SNE示例:

图3.1 – MNIST数据集上的t-SNE

图3.1 – MNIST数据集上的t-SNE

值得注意的是,t-SNE主要是一个可视化工具,不应作为特征选择的唯一方法。相反,它可以与其他技术结合使用,例如LDA或PCA,以更全面地了解数据的潜在结构。

特征选择方法的选择取决于数据的性质、数据集的大小、模型的复杂性和可用的计算资源。在特征选择后仔细评估模型的性能,以确保没有丢失重要信息,这是一个重要的过程。另一个重要的过程是特征工程,它涉及为机器学习模型转换或选择特征。

特征工程

特征工程是从原始数据中选择、转换和提取特征的过程,以提高机器学习模型的表现。特征是数据中可以用来进行预测或分类的个别可测量属性或特征。

特征工程中的一种常见技术是特征选择,它涉及从原始数据集中选择一组相关特征以提高模型的准确性和降低其复杂性。这可以通过统计方法如相关分析或使用决策树或随机森林进行特征重要性排名来实现。

特征工程中的另一种技术是特征提取,它涉及将原始数据转换为可能对模型更有用的新特征集。特征选择与特征工程之间的主要区别在于它们的方法:特征选择在不修改所选特征的情况下保留原始特征的一个子集,而特征工程算法重新配置和转换数据到新的特征空间。特征选择和提取在先前的子节(3-1-3)中已详细解释。

特征缩放是特征工程中另一个重要的技术,它涉及将特征值缩放到相同的范围,通常是介于 0 和 1 或 -1 和 1 之间。这样做是为了防止某些特征在模型中主导其他特征,并确保算法在训练过程中可以快速收敛。当数据集中的特征具有不同的尺度时,这可能会导致使用某些对特征相对大小敏感的机器学习算法时出现问题时。特征缩放可以通过确保所有特征处于相似尺度来帮助解决这个问题。常见的特征缩放方法包括最小-最大缩放、Z 分数缩放和基于最大绝对值的缩放。

特征缩放有几种常见的方法:

  • 最小-最大缩放:也称为归一化,这种技术将特征值缩放到指定的范围,通常是介于 0 和 1 之间(对于常规机器学习模型,有时对于深度学习模型是 -1 和 1)。最小-最大缩放的公式如下所示:

xscaled=(x−min(x))/(max(x)−min(x))

在这里,x 是原始特征值,min(x) 是特征的最小值,而 max(x) 是特征的最大值。

  • 标准化:这种技术将特征值转换为具有 0 均值和 1 标准差。与最小-最大缩放相比,标准化受数据中异常值的影响较小。标准化的公式如下所示:

xscaled=(x−mean(x))/std(x)

在这里,x 是原始特征值,mean(x) 是特征的平均值,std(x) 是特征的标准差。

  • 鲁棒缩放: 这种技术与标准化类似,但使用中位数和四分位距IQR)而不是平均值和标准差。当数据包含会显著影响平均值和标准差的外部值时,鲁棒缩放很有用。鲁棒缩放的公式如下:

xscaled=(x−median(x))/(Q3(x)−Q1(x))

在这里,x 是原始特征值,median(x) 是特征的中位数,Q1(x) 是特征的第一四分位数,Q3(x) 是特征的第三四分位数。

  • 对数变换: 当数据高度偏斜或具有长尾时,使用此技术。通过对特征值取对数,可以使分布更加正常或对称,这可以提高某些机器学习算法的性能。对数变换的公式如下:

xtransformed=log(x)

在这里,x 是原始特征值。

  • 幂变换: 这种技术与对数变换类似,但允许更广泛的变换范围。最常见的幂变换是Box-Cox变换,它将特征值提升到通过最大似然估计确定的幂。Box-Cox变换的公式如下:

xtransformed=xλ−1λ

在这里,x 是原始特征值,而 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miλ</mml:mi></mml:math> 是通过最大似然估计得到的功率参数。

这些是机器学习中特征缩放的一些最常见方法。方法的选择取决于数据的分布、所使用的机器学习算法以及问题的具体要求。

特征工程中的最后一项技术是特征构造,它涉及通过组合或转换现有特征来创建新的特征。这可以通过多项式展开、对数变换或交互项等技术来完成。

多项式展开

多项式展开是一种特征构造技术,它通过将现有特征的幂组合来创建新的特征。这种技术在机器学习中常用以建模特征与目标变量之间的非线性关系。

多项式展开背后的思想是通过将现有特征提升到不同的幂次并取其乘积来创建新的特征。例如,假设我们有一个单个特征,x。我们可以通过取 x 的平方(x2)来创建新的特征。我们还可以通过将 x 提升到更高的幂次来创建更高阶的多项式特征,例如 x3 x4,等等。一般来说,我们可以通过取原始特征的乘积和幂的所有可能组合来创建度数为 d 的多项式特征。

除了从单个特征创建多项式特征外,我们还可以从多个特征创建多项式特征。例如,假设我们有两个特征,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:math>。我们可以通过取它们的乘积 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:math>) 并将它们提升到不同的幂次(<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubsupmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msubsup></mml:math>, <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubsupmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msubsup></mml:math>, 等等)来创建新的多项式特征。同样,我们可以通过取原始特征的所有可能的乘积和幂次的组合来创建任何程度的多项式特征。

在使用多项式展开时,一个重要的考虑因素是它可能会迅速导致大量特征的产生,尤其是在高次多项式的情况下。这可能会使得到的模型更加复杂且难以解释,如果特征数量没有得到适当的控制,还可能导致过拟合。为了解决这个问题,通常使用正则化技术或特征选择方法来选择最有信息量的多项式特征子集。

总体而言,多项式展开是一种强大的特征构造技术,可以帮助捕捉特征与目标变量之间的复杂非线性关系。然而,在使用时应谨慎,并采用适当的正则化或特征选择来避免过拟合并保持模型的可解释性。

例如,在一个回归问题中,你可能有一个只包含一个特征的数据集,比如说x,你想要拟合一个模型来捕捉x和目标变量y之间的关系。然而,xy之间的关系可能不是线性的,一个简单的线性模型可能不足以捕捉这种关系。在这种情况下,可以使用多项式展开来创建额外的特征,以捕捉xy之间的非线性关系。

为了说明,假设你有一个包含一个特征x和一个目标变量y的数据集,并且你想要拟合一个多项式回归模型。目标是找到一个函数f(x),它最小化预测值和实际值y之间的差异。

可以使用多项式展开来创建基于x的额外特征,例如<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msup></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msupmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msup></mml:math>,等等。这可以使用如scikit-learn这样的库来完成,它有一个PolynomialFeatures函数可以自动生成指定度数的多项式特征。

通过添加这些多项式特征,模型变得更加具有表现力,可以捕捉xy之间的非线性关系。然而,重要的是要注意不要过度拟合数据,因为添加过多的多项式特征可能导致模型过于复杂,在新数据上表现不佳。

对数变换

对数变换是一种常见的数据预处理特征工程技术。对数变换的目标是通过应用对数函数到特征上,使数据更加对称并减少偏斜。这种技术对于具有长尾高值的偏斜特征尤其有用。

对数变换被定义为对数据进行自然对数运算的方程:

y=log(x)

在这里,y是变换后的数据,x是原始数据。对数函数将原始数据映射到一个新的空间,其中值之间的关系得到保留,但尺度被压缩。对数变换对于具有大范围或呈指数分布的特征特别有用,例如产品的价格或个人的收入。

对数变换的一个好处是它可以帮助数据归一化,使其更适合某些假设数据正态分布的机器学习算法。此外,对数变换可以减少异常值对数据的影响,这有助于提高某些模型的表现。

重要的是要注意,对数变换并不适用于所有类型的数据。例如,如果数据包含零或负值,则不能直接应用对数变换。在这些情况下,可以使用修改后的对数变换,例如在对数之前添加一个常数。总的来说,对数变换是特征工程中的一种有用技术,可以帮助提高机器学习模型的表现,尤其是在处理偏斜或指数分布的数据时。

总结来说,特征工程是机器学习流程中的关键步骤,因为它可以显著影响最终模型的表现力和可解释性。有效的特征工程需要领域知识、创造力和测试和改进不同技术的迭代过程,直到确定最佳特征集。

交互项

在特征构建中,交互项指的是通过将数据集中两个或更多现有特征通过乘法、除法或其他数学运算组合来创建新的特征。这些新特征捕捉了原始特征之间的交互或关系,并且可以帮助提高机器学习模型的准确性。

例如,在一个房地产价格数据集中,你可能会有诸如卧室数量、浴室数量和房产面积等特征。单独来看,这些特征提供了一些关于房产价格的信息,但它们并没有捕捉到特征之间的任何交互效应。然而,通过在卧室数量和面积之间创建交互项,你可以捕捉到这样一个观点:具有更多卧室的大面积房产通常比具有相同卧室数量的较小房产更贵。

在实践中,交互项是通过将两个或更多特征相乘或相除来创建的。例如,如果我们有两个特征,xy,我们可以通过将它们相乘来创建一个交互项:xy。我们也可以通过将一个特征除以另一个特征来创建交互项:x/y

在创建交互项时,重要的是要考虑要组合哪些特征以及如何组合它们。以下是一些常见的技术:

  • 领域知识:使用领域知识或专家直觉来确定哪些特征可能存在交互以及它们可能如何交互。

  • 成对组合:通过成对组合数据集中所有特征的成对来创建交互项。这可能计算成本较高,但可以帮助识别潜在的交互效应。

  • PCA:使用PCA来识别最重要的特征组合,并基于这些组合创建交互项。

总体而言,交互项是特征构建中的强大工具,可以帮助捕捉特征之间的复杂关系,并提高机器学习模型的准确性。然而,在创建交互项时需要谨慎,因为过多或选择不当的项可能导致过拟合或降低模型的可解释性。

常见的机器学习模型

在这里,我们将解释一些最常用的机器学习模型,以及它们的优缺点。了解这些信息将帮助您选择最适合问题的模型,并能够改进所实现的模型。

线性回归

线性回归是一种监督学习算法,用于建模因变量和一或多个自变量之间的关系。它假设输入特征与输出之间存在线性关系。线性回归的目标是找到最佳拟合线,根据自变量预测因变量的值。

具有一个自变量的简单线性回归方程(也称为简单线性方程)如下:

y=mx+b

这里,我们有以下内容:

  • y 是因变量(我们想要预测的变量)

  • x 是自变量(输入变量)

  • m 是直线的斜率(当x变化时y的变化量)

  • b 是y截距(当x = 0时,直线与Y轴的交点)

线性回归的目标是找到mb的值,以最小化预测值与因变量的实际值之间的差异。这种差异通常使用成本函数来衡量,例如均方误差或平均绝对误差。

多元线性回归是简单线性回归的扩展,其中存在多个自变量。多元线性回归的方程如下:

y=b0+b1x1+b2x2+...+bnxn

这里我们有以下内容:

  • y 是因变量

  • x1,x2,...,xn是自变量

  • <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mib</mml:mi></mml:mrow>mml:mrowmml:mn0</mml:mn></mml:mrow></mml:msub></mml:math>是y轴截距(当所有自变量都等于0时)

  • b1,b2,...,bn是系数(当每个自变量变化时,y的变化量)

与简单的线性回归类似,多重线性回归的目标是找到b0,b1,b2,...,bnb0,b1,b2,...,bn的值,以最小化预测值与依赖变量实际值之间的差异。

线性回归的优点如下:

  • 它简单易懂

  • 它可以用来模拟依赖变量和自变量之间广泛的多种关系

  • 它计算效率高,使其快速且适用于大型数据集

  • 它提供可解释的结果,允许分析每个自变量对依赖变量的影响

线性回归的缺点如下:

  • 它假设输入特征与输出之间存在线性关系,这在现实世界的数据中可能并不总是如此

  • 它可能无法捕捉输入特征与输出之间的复杂非线性关系

  • 它对异常值和有影响力的观测值敏感,这可能会影响模型的准确性

  • 它假设误差是正态分布且方差恒定,这在实践中可能并不总是成立

逻辑回归

逻辑回归是一种流行的机器学习算法,用于分类问题。与用于预测连续值的线性回归不同,逻辑回归用于预测离散结果,通常是二元结果(0或1)。

逻辑回归的目标是根据一个或多个输入变量估计某个结果的概率。逻辑回归的输出是一个概率分数,可以通过应用阈值值将其转换为二元类别标签。阈值值可以根据问题的具体要求进行调整,以在精确度和召回率之间取得平衡。

逻辑回归模型假设输入变量与输出变量之间的关系在 logit(对数几率)空间中是线性的。对数几率函数定义为以下:

logit(p)=log(p/(1−p))

在这里,p 是正结果的概率(即事件发生的概率)。

逻辑回归模型可以用以下数学公式表示:

logit(p)=β0+β1*x1+β2*x2+...+βn*xn

在这里,β0,β1,β2,…,βn 是模型的系数,x1,x2,…,xn 是输入变量,而 logit(p) 是正结果概率的对数几率函数。

逻辑回归模型使用带标签的示例数据集进行训练,其中每个示例由一组输入变量和一个二元标签组成,表示正结果是否发生。模型的系数通过最大似然估计来估计,该估计旨在找到使观察数据的似然性最大化的系数值。

逻辑回归的优点如下:

  • 可解释性:模型的系数可以解释为与对应输入变量单位变化相关的正结果对数概率的变化,这使得理解每个输入变量对预测正结果概率的影响变得容易

  • 计算效率高:逻辑回归是一个简单的算法,可以在大型数据集上快速训练

  • 适用于小型数据集:逻辑回归即使在观察值数量较少的情况下也可以有效,只要输入变量与预测任务相关

逻辑回归的缺点如下:

  • 假设线性关系:逻辑回归假设输入变量与正结果概率的对数之间的线性关系,但在现实世界的数据集中这并不总是成立

  • 可能存在过拟合问题:如果输入变量的数量与观察值的数量相比很大,模型可能存在过拟合问题,导致在新数据上的泛化性能较差

  • 不适用于非线性问题:逻辑回归是一个线性算法,不适用于输入变量与输出变量之间关系为非线性的问题

决策树

决策树是一种用于分类和回归分析的监督学习算法。决策树由一系列节点组成,每个节点代表一个决策点,每个节点有一个或多个分支,这些分支通向其他决策点或最终预测。

在分类问题中,树的每个叶节点代表一个类标签,而在回归问题中,每个叶节点代表一个数值。构建决策树的过程涉及选择一个属性序列,以最佳方式将数据分割成更同质化的子集,这些子集与目标变量相关。这个过程通常在每个子集上递归重复,直到满足停止标准,例如每个子集中的最小实例数或树的最大深度。

决策树的方程涉及在每个决策点计算每个潜在分割的信息增益(或另一个分割标准,如基尼不纯度或熵)。具有最高信息增益的属性被选为该节点的分割标准。信息增益的概念公式如下所示:

Informationgain=entropy(parent)−[weightedaverageofentropiesofpatent′schildren]

在这里, 是衡量系统不纯度或随机性的度量。在决策树的情况下,熵用于衡量树中节点的杂乱程度。

节点的 计算如下:

Entropy=∑i=1c−pilog2pi

在这里,c 是类的数量,而 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mip</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是属于节点类 i 的样本比例。

节点的熵值范围从 0 到 1,其中 0 表示纯节点(即所有样本都属于同一类),1 表示节点在所有类别之间均匀分割。

在决策树中,节点的熵用于确定树的分割标准。其思想是将节点分割成两个或更多子节点,使得子节点的熵低于父节点的熵。具有最低熵的分割被选为最佳分割。

请注意,决策树中下一个节点的选择取决于底层算法——例如,CART、ID3 或 C4.5。这里我们解释的是 CART,它使用基尼不纯度和熵来分割数据。

使用熵作为分割标准的好处是它可以处理二分类和多分类分类问题。与其他分割标准相比,它也相对计算效率高。然而,使用熵的一个缺点是它倾向于创建偏向于具有许多类别的属性的偏斜树。

下面是决策树的一些优点:

  • 容易理解和解释,即使是对于非专家来说也是如此

  • 可以处理分类数据和数值数据

  • 可以处理缺失数据和异常值

  • 可以用于特征选择

  • 可以与其他模型结合使用,例如随机森林

下面是决策树的一些缺点:

  • 可能容易过拟合,特别是如果树太深或太复杂

  • 可能对数据或树构建方式中的微小变化敏感

  • 可能会偏向于具有许多类别或高基数的特征

  • 可能会与罕见事件或不平衡数据集有问题

随机森林

随机森林是一种灵活的集成学习方法,可以执行分类和回归任务。它通过在训练过程中生成多个决策树来操作,对于分类任务,基于多数决策树的投票结果预测目标类别,对于回归任务,基于树的平均预测值进行预测。随机森林构建算法可以总结如下步骤:

  1. 自助采样:随机选择与原数据集相同大小的数据子集,并允许重复选择以创建新的数据集。

  2. 特征选择:在构建决策树时,随机选择每个分割的特征(列)子集。这有助于在树之间创建多样性并减少过拟合。

  3. 树构建:为每个自助采样和特征子集构建一个决策树。决策树通过根据选定的特征递归地分割数据来构建,直到满足停止标准(例如,最大深度或叶节点中的最小样本数)。

  4. 集成学习:将所有决策树的预测结果结合起来进行最终预测。对于分类,决策树投票最多的类别是最终预测。对于回归,所有决策树的预测平均值是最终预测。

随机森林算法可以用以下数学公式表示。

给定一个包含 N 个样本和 M 个特征的样本集 D,我们通过应用前面的步骤创建 T 个决策树 {树1, 树2, … , 树T}。每个决策树都是使用数据集 D 的自助样本 D’(大小为 N’(N’ <= N))和特征子集 F’(大小为 m(m <= M))构建的。对于决策树中的每个分割,我们从 F’ 中随机选择 k(k < m)个特征,并根据一个不纯度度量(例如,基尼指数或熵)选择最佳特征来分割数据。决策树会构建到满足停止标准(例如,最大深度或叶节点中的最小样本数)为止。

对于新样本 x 的最终预测,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mover accent="true">mml:mrow<mml:mi mathvariant="bold">y</mml:mi></mml:mrow>mml:mo^</mml:mo></mml:mover></mml:math>,是通过聚合所有决策树的预测得到的。

对于分类,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mover accent="true">mml:mrow<mml:mi mathvariant="bold">y</mml:mi></mml:mrow>mml:mo^</mml:mo></mml:mover></mml:math> 是从所有决策树中获得最多投票的类别:

yˆ=argmaxj∑iI(yi,j=1)

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mo,</mml:mo>mml:mij</mml:mi></mml:mrow></mml:msub></mml:math> 是第 j 个决策树对第 i 个样本的预测,而 I() 是指示函数,当条件为真时返回 1,否则返回 0。

对于回归,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mover accent="true">mml:mrow<mml:mi mathvariant="bold">y</mml:mi></mml:mrow>mml:mo^</mml:mo></mml:mover></mml:math> 是所有决策树预测的平均值:

yˆ=(1/T)∑i=1Tyi

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是对新样本 x 的第 i 个决策树的预测。

总结来说,随机森林是一种强大的机器学习算法,可以处理高维和噪声数据集。它通过使用数据的自助样本和特征子集构建多个决策树,然后汇总所有决策树的预测来做出最终预测。该算法可扩展、易于使用,并提供特征重要性的度量,使其成为许多机器学习应用的流行选择。

随机森林的优点如下:

  • 鲁棒性:随机森林是一个非常鲁棒的算法,可以处理各种输入数据类型,包括数值、分类和有序数据。

  • 特征选择:随机森林可以对特征的重要性进行排序,使用户能够识别分类或回归任务中最重要的特征。

  • 过拟合:随机森林具有一个内置的减少过拟合的机制,称为袋装(bagging),这有助于在新数据上很好地泛化。

  • 可扩展性:随机森林可以处理具有大量特征的大型数据集,使其成为大数据应用的不错选择。

  • 异常值:随机森林对异常值的存在具有鲁棒性,因为它基于决策树,可以有效地处理异常值。

随机森林的缺点如下:

  • 可解释性:由于随机森林模型基于决策树的集成,因此它们可能难以解释。

  • 训练时间:随机森林的训练时间可能比其他简单的算法长,尤其是在集成中树的数量很大时。

  • 内存使用:由于随机森林需要存储决策树在内存中,因此它比其他一些算法需要更多的内存。

  • 偏差:如果数据不平衡或目标变量具有高基数,随机森林可能会出现偏差。

  • 过拟合:尽管随机森林旨在防止过拟合,但如果超参数没有适当调整,仍然可能导致模型过拟合。

总体而言,随机森林是一种强大的机器学习算法,具有许多优点,但在将其应用于特定问题之前,仔细考虑其局限性是很重要的。

支持向量机(SVMs)

SVMs 被认为是鲁棒的有监督学习算法,可以执行分类和回归任务。它们在具有复杂决策边界的场景中表现出色,超越了线性模型的限制。在核心上,SVMs 的目标是识别一个多维空间中的超平面,该超平面最大限度地分离了类别。这个超平面定位在最大化其与每个类中最近点的距离,这些点称为支持向量。以下是 SVMs 在二元分类问题中的工作方式。给定一组训练数据,{(x1,y1),(x2,y2),...,(xn,yn)},其中 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是一个 d 维特征向量,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是二进制类别标签(+1 或 -1),SVM 的目标是找到一个超平面,该超平面以最大的间隔分离两个类别。间隔定义为超平面与每个类中最近数据点之间的距离:

图 3.2 – SVM 边界

图 3.2 – SVM 边界

超平面由权重向量 w 和偏置项 b 定义,对于任何新的数据点 x,预测的类别标签 y 由以下方程给出:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mi mathvariant="normal">y</mml:mi>mml:mo=</mml:mo>mml:mis</mml:mi>mml:mii</mml:mi>mml:mig</mml:mi>mml:min</mml:mi>mml:mo(</mml:mo>mml:msupmml:mrow<mml:mi mathvariant="bold">w</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msup><mml:mi mathvariant="bold">x</mml:mi></mml:math>+b)

在这里,符号函数是返回+1如果参数为正,否则返回-1的函数。

SVM 的目标函数是在最大化间隔的约束下最小化分类误差。这可以表述为一个优化问题:

minimize1/2||w||2

subjecttoyi(wTxi+b)≥1fori=1,2,...,n

这里,||w||2 是权重向量 w 的欧几里得范数的平方。约束条件确保所有数据点都被正确分类,并且边缘被最大化。

这里是 SVM 的一些优点:

  • 在高维空间中有效,这在特征数量大时很有用

  • 可用于分类和回归任务

  • 与线性可分和非线性可分数据都兼容

  • 由于使用了边缘概念,可以很好地处理异常值

  • 有一个正则化参数,允许你控制过拟合

这里是 SVM 的一些缺点:

  • 对核函数的选择可能很敏感,这可能会极大地影响模型的表现

  • 对于大数据集计算密集

  • 解释 SVM 模型的结果可能很困难

  • 需要仔细调整参数以实现良好的性能

神经网络和转换器

神经网络和转换器都是强大的机器学习模型,用于各种任务,如图像分类、自然语言处理和语音识别。

神经网络

神经网络从人脑的结构和功能中汲取灵感。它们代表一类机器学习模型,擅长各种任务,如分类、回归等。这些网络由称为神经元的相互连接的多层节点组成,能够熟练地处理和操作数据。每一层的输出被输入到下一层,创建了一个特征表示的层次结构。第一层的输入是原始数据,最后一层的输出是预测。一个简单的神经网络,根据一个人的身高和体重检测其性别,如图 3**.3 所示:

图 3.3 – 简单神经网络

图 3.3 – 简单神经网络

神经网络中单个神经元的操作可以用以下方程表示:

y=f∑i=1nwixi+b

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是输入值,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是神经元之间的连接权重,b 是偏差项,f 是激活函数。激活函数将非线性变换应用于加权输入和偏差项的总和。

训练神经网络涉及调整神经元的权重和偏差以最小化损失函数。这通常是通过使用随机梯度下降等优化算法来完成的。

神经网络的优势包括它们能够学习输入和输出数据之间的复杂非线性关系,它们能够从原始数据中自动提取有意义的特征,以及它们能够扩展到大型数据集。

神经网络的缺点包括它们的高计算和内存需求,对超参数调整的敏感性,以及解释其内部表示的困难。

变压器

变压器是一种特别适合于序列数据(如文本或语音)的神经网络架构。它们在自然语言处理(NLP)的背景下被引入,并且自那时起已应用于广泛的任务中。

变压器的核心组件是自注意力机制,它允许模型在计算输出时关注输入序列的不同部分。自注意力机制基于查询向量、一组键向量和一组值向量之间的点积。产生的注意力权重用于加权值,然后将这些值组合起来生成输出。

自注意力操作可以用以下方程表示:

Q=XWQ

K=XWK

V=XWV

A(Q,K,V)=softtmaxQKTdKV

在这里,X 是输入序列,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:miQ</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:miK</mml:mi></mml:mrow></mml:msub></mml:math>,和<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:miV</mml:mi></mml:mrow></mml:msub></mml:math>分别是查询、键和值向量的学习投影矩阵,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mid</mml:mi></mml:mrow>mml:mrowmml:miK</mml:mi></mml:mrow></mml:msub></mml:math>是键向量的维度,而<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miW</mml:mi></mml:mrow>mml:mrowmml:miQ</mml:mi></mml:mrow></mml:msub></mml:math>是一个将注意力机制的输出映射到最终输出的学习投影矩阵。

变压器的优点包括其处理可变长度输入序列的能力、捕捉数据中长距离依赖关系的能力以及在许多NLP任务上的最先进性能。

变压器的缺点包括其高计算和内存需求、对超参数调整的敏感性以及处理需要显式建模序列动态的任务的困难。

这些只是最受欢迎的机器学习模型中的几个。模型的选择取决于手头的问题、数据的大小和质量以及期望的结果。现在我们已经探讨了最常见的机器学习模型,我们将解释训练过程中发生的模型欠拟合和过拟合。

模型欠拟合和过拟合

在机器学习中,最终目标是构建一个能够在未见数据上良好泛化的模型。然而,有时模型可能由于欠拟合或过拟合而无法实现这一目标。

当模型过于简单,无法正确捕捉数据中的潜在模式时,就会发生欠拟合。换句话说,模型无法正确学习特征与目标变量之间的关系。这可能导致训练和测试数据上的性能较差。例如,在 图 3.4 中,我们可以看到模型欠拟合,它无法很好地呈现数据。这不是我们希望在机器学习模型中看到的,我们通常希望看到一个精确的模型,如图 图 3.5 所示:

图 3.4 – 机器学习模型在训练数据上的欠拟合

图 3.4 – 机器学习模型在训练数据上的欠拟合

当模型训练不当或模型复杂度不足以捕捉数据中的潜在模式时,就会发生欠拟合。为了解决这个问题,我们可以使用更复杂的模型,并继续训练过程:

图 3.5 – 机器学习模型在训练数据上的最佳拟合

图 3.5 – 机器学习模型在训练数据上的最佳拟合

当模型很好地捕捉到数据中的模式但不过拟合每个样本时,就会发生最佳拟合。这有助于模型在未见数据上更好地工作:

图 3.6 – 在训练数据上过拟合模型

图 3.6 – 在训练数据上过拟合模型

另一方面,当模型过于复杂且与训练数据拟合得太紧密时,就会发生过拟合,这可能导致在新、未见数据上的泛化能力较差,如图 图 3.6 所示。这发生在模型学习训练数据中的噪声或随机波动,而不是潜在的模式。换句话说,模型对训练数据过于专业化,在测试数据上表现不佳。如图所示,模型过拟合,试图非常精确地预测每个样本。这个模型的问题在于它没有学习到一般模式,而是学习了每个单个样本的模式,这使得它在面对新的、未见记录时表现不佳。

理解欠拟合和过拟合之间的权衡的一个有用方法是偏差-方差权衡。偏差是指模型预测值与训练数据中实际值之间的差异。高偏差意味着模型复杂度不足以捕捉数据中的潜在模式,并且欠拟合数据(图 3.7)。欠拟合模型在训练和测试数据上的性能都较差:

图 3.7 – 高偏差

图 3.7 – 高偏差

另一方面,方差是指模型对训练数据中微小波动的敏感度。高方差意味着模型过于复杂,过度拟合了数据,这导致在新数据上的泛化性能较差。一个过拟合的模型在训练数据上表现良好,但在测试数据上表现较差:

图3.8 – 正好合适(既不高偏差,也不高方差)

图3.8 – 正好合适(既不高偏差,也不高方差)

为了在偏差和方差之间取得平衡,我们需要选择一个既不太简单也不太复杂的模型。如前所述,这通常被称为偏差-方差权衡(图3**.8)。具有高偏差和低方差的模型可以通过增加模型的复杂性来改进,而具有高方差和低偏差的模型可以通过减少模型的复杂性来改进:

图3.9 – 高方差

图3.9 – 高方差

减少模型中的偏差和方差有几种方法。一种常见的方法是正则化,它通过向损失函数添加惩罚项来控制模型的复杂性。另一种方法是使用集成,它通过结合多个模型来减少方差,从而提高整体性能。交叉验证也可以用来评估模型的性能,并调整其超参数以找到偏差和方差之间的最佳平衡。

总的来说,在机器学习中理解偏差和方差至关重要,因为它帮助我们选择合适的模型并识别模型中的错误来源。

偏差是指通过用一个简化的模型近似现实世界问题而引入的错误。另一方面,方差是指模型对训练数据中微小波动敏感度所引入的错误。

当一个模型具有高偏差和低方差时,它是欠拟合的。这意味着模型没有捕捉到问题的复杂性,并做出了过于简化的假设。当一个模型具有低偏差和高方差时,它是过拟合的。这意味着模型对训练数据过于敏感,并拟合了噪声而不是潜在的模式。

为了克服欠拟合,我们可以尝试增加模型的复杂性,添加更多特征,或使用更复杂的算法。为了防止过拟合,可以使用以下几种方法:

  • 交叉验证:评估机器学习模型的性能是至关重要的。交叉验证作为一种评估机器学习模型有效性的方法,它包括在数据的一部分上训练模型,并在另一部分上测试它。通过使用不同的子集进行训练和评估,交叉验证可以降低过拟合的风险。关于这种技术的进一步阐述将在数据拆分的下一节中提供。

  • 正则化:正则化是一种在训练过程中向损失函数添加惩罚项的技术,有助于降低模型的复杂性并防止过拟合。正则化有多种类型,包括 L1 正则化(LASSO)、L2 正则化(岭回归)和弹性网络正则化。

  • 提前停止:提前停止是一种在验证数据的模型性能开始下降时停止训练过程的技术。这有助于通过在模型已经达到最大性能时停止其从训练数据中继续学习来防止过拟合。这种技术通常用于迭代算法,如深度学习方法,其中模型被训练多个迭代(周期)。要使用提前停止,我们通常在评估模型在训练和验证子集上的性能的同时训练模型。随着训练的增加,模型的性能通常在训练集上提高,但由于模型尚未看到验证集,验证错误通常最初会下降,并在某个时刻开始再次增加。这一点是模型开始过拟合的地方。通过在训练过程中可视化模型的训练和验证错误,我们可以识别并在此点停止模型(图 3**.10):

图 3.10 – 提前停止

图 3.10 – 提前停止

  • Dropout:Dropout 是一种在深度学习模型中使用的技巧,用于在训练过程中随机丢弃一些神经元,这有助于防止模型过度依赖一小部分特征或神经元,并避免对训练数据过拟合。在训练过程中通过降低神经元的权重,我们使模型学习一般模式,并防止它记住训练数据(过拟合)。

  • 数据增强:数据增强是一种方法,我们可以通过应用变换,如旋转、缩放和翻转,来人工扩大现有数据集的大小,从而扩展我们的训练数据。这种策略通过为模型提供更多样化的例子来学习,有助于减轻过拟合。

  • 集成方法:集成方法是用来结合多个模型以改进其性能和防止过拟合的技术。这可以通过使用诸如袋装、提升或堆叠等技术来实现。

通过使用这些技术,可以防止过拟合并构建对新、未见数据具有良好泛化能力的模型。在实践中,监控模型的训练和测试性能并相应地调整,以实现最佳可能的泛化性能非常重要。我们将在下一节中解释如何将数据分为训练集和测试集。

数据分割

在开发机器学习模型时,将数据分为训练集、验证集和测试集非常重要;这被称为数据分割。这样做是为了评估模型在新、未见过的数据上的性能,并防止过拟合。

分割数据最常见的方法是训练-测试分割,它将数据分为两个集合:训练集,用于训练模型;测试集,用于评估模型的性能。数据被随机分为两个集合,典型的分割是80%的数据用于训练,20%用于测试。使用这种方法,模型将使用大部分数据(训练数据)进行训练,然后在对剩余数据(测试集)进行测试。使用这种方法,我们可以确保模型的性能是基于新的、未见过的数据。

在机器学习模型开发的大部分时间里,我们有一组我们希望调整的模型超参数(我们将在下一小节解释超参数调整)。在这种情况下,我们希望确保我们在测试集上获得的是可靠的性能,而不是仅仅基于一组超参数的偶然性。在这种情况下,根据我们训练数据的大小,我们可以将数据分为60%、20%和20%(或70%、15%和15%)用于训练、验证和测试。在这种情况下,我们在训练数据上训练模型,并选择在验证集上给出最佳性能的超参数集。然后,我们报告测试集上的实际模型性能,该测试集在模型训练或超参数选择之前从未见过或使用过。

当我们的训练数据量有限时,分割数据的一种更高级的方法是k折交叉验证。在这个方法中,数据被分为k个大小相等的“折”,模型被训练和测试k次,每个折被用作测试集一次,其余的折用作训练集。然后,将每个折的结果平均,以获得模型性能的整体度量。K折交叉验证对于小数据集很有用,因为训练-测试分割可能会导致性能评估的大幅波动。在这种情况下,我们报告模型在每个k个折上的平均、最小和最大性能,如图3.11所示。

图3.11 – K折交叉验证

图3.11 – K折交叉验证

k折交叉验证的另一种变体是分层k折交叉验证,它确保目标变量的分布在整个折中是一致的。这在处理不平衡数据集时很有用,其中一个类的实例数量远小于其他类。

时间序列数据在分割时需要特别注意。在这种情况下,我们通常使用一种称为时间序列交叉验证的方法,该方法保留了数据的时序顺序。在这个方法中,数据被分割成多个段,每个段代表一个固定的时间间隔。然后,模型在历史数据上训练并在未来数据上测试。这有助于评估模型在实际场景中的性能。您可以在图3.12中看到一个如何分割时间序列数据示例:

图3.12 – 时间序列数据分割

图3.12 – 时间序列数据分割

在所有情况下,确保随机分割但每次使用相同的随机种子,以确保结果的再现性是很重要的。同样重要的是要确保分割代表底层数据 – 即,目标变量的分布应在所有集合中保持一致。一旦我们将数据分割成不同的子集用于训练和测试我们的模型,我们就可以尝试找到我们模型的最佳超参数集。这个过程称为超参数调整,将在下文中解释。

超参数调整

超参数调整是机器学习过程中的一个重要步骤,涉及为给定模型选择最佳的超参数集。超参数是在训练过程开始之前设置的值,可以显著影响模型的表现。超参数的例子包括学习率、正则化强度、神经网络中的隐藏层数量等。

超参数调整的过程涉及选择最佳的超参数组合,以实现模型的最佳性能。这通常是通过在一个预定义的超参数集中搜索并评估它们在验证集上的性能来完成的。

超参数调整有几种方法,包括网格搜索、随机搜索和贝叶斯优化。网格搜索涉及创建一个所有可能的超参数组合的网格,并在验证集上评估每个组合以确定最佳的超参数集。另一方面,随机搜索则是从预定义的分布中随机采样超参数,并在验证集上评估它们的性能。

随机搜索网格搜索是用于在整个搜索空间或随机搜索的方法,不考虑先前超参数的结果。因此,这些方法效率低下。已经提出了一种替代的贝叶斯优化方法,该方法迭代地计算函数的后验分布,并考虑过去的评估以找到最佳的超参数。使用这种方法,我们可以通过更少的迭代找到最佳的超参数集。

贝叶斯优化利用过去的评估结果,以概率地将超参数映射到目标函数得分,如下面的方程所示:

P(score|hyperparameters)

下面是贝叶斯优化采取的步骤:

  1. 它为目标函数开发了一个代理概率模型。

  2. 它根据代理确定最优超参数。

  3. 它将这些超参数用于实际的目标函数。

  4. 它更新代理模型以整合最新的结果。

  5. 它重复步骤2步骤4,直到达到最大迭代次数或时间限制。

基于序列模型的优化SMBO)方法是贝叶斯优化的形式化,试验一个接一个地运行,每次尝试更好的超参数并更新概率模型(代理)。SMBO方法在步骤3步骤4上有所不同——具体来说,它们如何构建目标函数的代理以及选择下一个超参数的准则。这些变体包括高斯过程、随机森林回归和树结构帕尔森估计器等。

在具有数值超参数的低维问题中,贝叶斯优化被认为是可用的最佳超参数优化方法。然而,它仅限于中等维度的问题。

除了这些方法之外,还有一些库可以自动化超参数调整的过程。这些库的例子包括scikit-learn的GridSearchCVRandomizedSearchCVKeras TunerOptuna。这些库允许进行高效的超参数调整,并且可以显著提高机器学习模型的性能。

机器学习中的超参数优化可能是一个复杂且耗时的过程。在搜索过程中出现了两个主要的复杂性挑战:试验执行时间和搜索空间的复杂性,包括评估的超参数组合的数量。在深度学习中,这些挑战尤其相关,因为搜索空间广泛,并且使用了大量的训练集。

为了解决这些问题并减少搜索空间,可以使用一些标准技术。例如,根据统计抽样减少训练数据集的大小或应用特征选择技术可以帮助减少每个试验的执行时间。此外,确定优化中最重要的超参数以及使用除准确度之外的其他目标函数,例如操作数量或优化时间,可以帮助减少搜索空间的复杂性。

通过结合通过反卷积网络进行的可视化,研究人员已经取得了优异的结果。然而,需要注意的是,这些技术并不全面,最佳方法可能取决于具体的问题。

提高模型性能的另一种常见方法是使用多个并行模型;这些被称为集成模型。它们在处理机器学习问题时非常有用。

集成模型

集成建模是机器学习中的一种技术,通过结合多个模型的预测来提高整体性能。集成模型背后的理念是,多个模型可能比单个模型更好,因为不同的模型可能捕捉到数据中的不同模式。

存在多种类型的集成模型,所有这些我们将在接下来的章节中介绍。

Bagging

Bootstrap aggregating,也称为 Bagging,是一种集成方法,通过结合在训练数据的不同子集上训练的多个独立模型来减少方差并提高模型泛化能力。

Bagging 算法可以概括如下:

  1. 给定一个大小为 n 的训练数据集,创建 m 个大小为 n 的自助样本(即,用替换方式抽取 n 个实例 m 次)。

  2. 独立地对每个自助样本训练一个基础模型(例如,决策树)。

  3. 将所有基础模型的预测进行聚合以获得集成预测。这可以通过在分类的情况下进行多数投票或在回归的情况下进行平均来实现。

当基础模型不稳定(即,具有高方差)时,Bagging 算法特别有效,例如决策树,以及当训练数据集较小时。

基础模型的预测聚合方程取决于问题的类型(分类或回归)。对于分类,通过多数投票获得集成预测:

Yen<mi}semble=argmaxj∑i=1mI(yij=j)

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mij</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 基础模型对<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mij</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 实例的预测类别,而 I() 是指示函数(如果 x 为真,则等于 1,否则为 0)。

对于回归,通过取平均分数来获得集成预测:

Yen<mi}semblle=∑i=1myi

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 基础模型的预测值。

套袋法的优点如下:

  • 通过减少方差和过拟合来提高模型泛化能力

  • 能够处理具有复杂关系的超高维数据集

  • 可以与各种基础模型一起使用

套袋法的缺点如下:

  • 由于使用多个基础模型,模型复杂度和计算时间增加

  • 如果基础模型过于复杂或数据集太小,有时会导致过拟合

  • 当基础模型高度相关或存在偏差时,效果不佳

提升法

提升是另一种流行的集成学习技术,旨在通过将它们组合成一个更强的分类器来提高弱分类器的性能。与bagging不同,boosting侧重于通过调整训练示例的权重来迭代地提高分类器的精度。提升背后的基本思想是从先前弱分类器的错误中学习,并更加关注在先前迭代中被错误分类的示例。

有几种提升算法,但其中最受欢迎的一种是AdaBoost(即自适应提升)。AdaBoost算法的工作原理如下:

  1. 首先,它将训练示例的权重初始化为相等。

  2. 然后,它在训练集上训练一个弱分类器。

  3. 接下来,它计算弱分类器的加权错误率。

  4. 然后,它根据其加权错误率计算弱分类器的重要性。

  5. 然后,它增加被弱分类器错误分类的示例的权重。

  6. 完成这一步后,它将示例的权重归一化,使它们的总和为1。

  7. 它重复步骤2到6,直到达到预定的迭代次数或达到所需的精度。

  8. 最后,它通过根据它们的重要性分配权重,将弱分类器组合成一个强分类器。

最终分类器是弱分类器的加权组合。每个弱分类器的重要性由其加权错误率决定,该错误率按以下方程计算:

ERRORm=∑i=1NwiI(yi−hm(xi))∑i=1Nwi

在这里,m 是弱分类器的索引,N 是训练样本的数量,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 训练样本的权重,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 训练样本的真实标签,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mih</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:mo(</mml:mo>mml:msubmml:mrowmml:mix</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub>mml:mo)</mml:mo></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mim</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 弱分类器对 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mii</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mih</mml:mi></mml:mrow></mml:msub></mml:math> 训练样本的预测,并且 I(yi−hmxi) 是一个指示函数,如果弱分类器的预测错误则返回 1,否则返回 0。

弱分类器的重要性通过以下公式计算:

αm=ln1−errorrerrorr

样本的权重根据其重要性进行更新:

wi=wiαmIyi−hmxi

最终分类器是通过组合弱分类器得到的:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:msubmml:mrowmml:miH</mml:mi></mml:mrow>mml:mrowmml:mix</mml:mi></mml:mrow></mml:msub>mml:mo=</mml:mo>mml:mis</mml:mi>mml:mii</mml:mi>mml:mig</mml:mi>mml:min</mml:mi><mml:mfenced separators="|">mml:mrowmml:mrowmml:munderover<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mim</mml:mi>mml:mo=</mml:mo>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:miM</mml:mi></mml:mrow></mml:munderover>mml:mrowmml:msubmml:mrow<mml:mi mathvariant="normal">α</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:msubmml:mrowmml:mih</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:mfenced></mml:math>

在这里,M 是弱分类器的总数,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mih</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo)</mml:mo></mml:math> 是第 m 个弱分类器的预测,sign() 是一个函数,如果其参数为正则返回 +1,否则返回 -1。

让我们来看看增强学习的优点:

  • 增强学习可以提高弱分类器的准确性,并可能导致性能的显著提升

  • 增强学习相对容易实现,并且可以应用于广泛的分类问题

  • 增强学习可以处理噪声数据并降低过拟合的风险

增强学习的缺点包括:

  • 增强学习对异常值敏感,并且可能对噪声数据过拟合

  • 增强学习在处理大数据集时可能计算成本较高

  • 提升方法可能难以解释,因为它涉及到多个弱分类器的组合

Stacking

Stacking是一种流行的集成学习技术,通过在基础模型的预测上训练一个高级模型来结合多个基础模型的预测。Stacking背后的理念是利用不同基础模型的优势,以实现更好的预测性能。

这里是如何进行Stacking的:

  1. 将训练数据分为两部分:第一部分用于训练基础模型,第二部分用于创建一个由基础模型预测组成的新数据集。

  2. 在训练数据的第一个部分上训练多个基础模型。

  3. 使用训练好的基础模型对训练数据的第二部分进行预测,以创建一个预测的新数据集。

  4. 在预测的新数据集上训练一个高级模型(也称为元模型或混合器)。

  5. 使用训练好的高级模型对测试数据进行预测。

高级模型通常是一个简单的模型,例如线性回归、逻辑回归或决策树。其理念是使用基础模型的预测作为高级模型的输入特征。这样,高级模型就能学会结合基础模型的预测,以做出更准确的预测。

随机森林

最常见的集成模型之一是随机森林,其中模型结合了多个决策树的预测并输出预测结果。这通常更准确,但容易过拟合。我们在本章前面详细介绍了随机森林。

梯度提升

梯度提升是另一种可以用于分类和回归任务的集成模型。它通过获取一个弱分类器(例如简单的树),并在每一步尝试改进这个弱分类器以构建更好的模型。这里的核心理念是模型试图关注每一步中的错误,并通过纠正前一步树中犯下的错误来调整模型。

在每次迭代中,算法计算关于预测值的损失函数的负梯度,然后拟合一个决策树到这些负梯度值。然后,使用一个学习率参数(它控制每个树对最终预测的贡献)将新树的预测与先前树的预测相结合。

梯度提升模型的总体预测是通过将所有树的预测相加得到的,这些预测根据它们各自的学习率进行加权。

让我们来看看梯度提升算法的公式。

首先,我们使用一个常数值初始化模型:

F0(x)=argminc∑i=1NL(yi,c)

在这里,c 是一个常数,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miy</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是第 i 个样本的真实标签,N 是样本数量,L 是损失函数,它用于衡量预测标签和真实标签之间的误差。

在每次迭代中,m,算法将决策树拟合到损失函数关于预测值的负梯度值,即rm=−∇L(y,F(x))。决策树预测负梯度值,然后使用以下方程更新模型的预测:

Fm(x)=Fm−1(x)+η*hm(x)

在这里,Fm−1(x) 是模型在前一次迭代的预测,η 是学习率,而<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mih</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo)</mml:mo></mml:math> 是当前迭代中决策树的预测。

模型的最终预测是通过结合所有树的预测得到的:

F(x)=∑m=1Mηm*hm(x)

在这里,M 是模型中树的总数,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miη</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub></mml:math><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mih</mml:mi></mml:mrow>mml:mrowmml:mim</mml:mi></mml:mrow></mml:msub>mml:mo(</mml:mo>mml:mix</mml:mi>mml:mo)</mml:mo></mml:math> 分别是 m 棵树的学习率和预测值。

让我们来看看梯度提升的一些优点:

  • 高预测准确率

  • 处理回归和分类问题

  • 可以处理缺失数据和异常值

  • 可以与各种损失函数一起使用

  • 可以处理高维数据

现在,让我们来看看一些缺点:

  • 对过拟合敏感,尤其是在树的数量很大时

  • 训练计算量大,耗时,尤其是对于大数据集

  • 需要仔细调整超参数,例如树的数量、学习率和树的最大深度

因此,我们已经回顾了可以帮助我们提高模型性能的集成模型。然而,有时我们的数据集有一些特征,在应用机器学习模型之前我们需要考虑。一个常见的情况是我们有一个不平衡的数据集。

处理不平衡数据

在大多数现实世界的问题中,我们的数据是不平衡的,这意味着不同类别的记录分布不同(例如,有癌症和无癌症的患者)。在机器学习中处理不平衡数据集是一个重要的任务,因为常见的情况是数据集具有不均匀的类别分布。在这种情况下,少数类通常代表性不足,这可能导致模型性能不佳和预测偏差。其背后的原因是机器学习方法试图优化其适应度函数以最小化训练集中的错误。现在,假设我们有99%的数据来自正类,1%来自负类。在这种情况下,如果模型将所有记录预测为正,错误率将是1%;然而,这个模型对我们来说没有用。这就是为什么,如果我们有一个不平衡的数据集,我们需要使用各种方法来处理不平衡数据。一般来说,我们可以有三种处理不平衡数据集的方法:

  • 下采样:一个简单的方法是使用少数类的较少训练记录。这种方法有效,但我们需要考虑的是,通过使用较少的训练数据,我们向模型提供的信息更少,这会导致训练和最终模型不够鲁棒。

  • 重采样:重采样方法涉及修改原始数据集以创建平衡分布。这可以通过对少数类进行过采样(创建更多少数类的样本)或对多数类进行下采样(从多数类中删除样本)来实现。过采样技术包括 随机过采样合成少数过采样技术SMOTE)和自适应合成采样ADASYN)。下采样技术包括随机下采样Tomek 链接聚类中心

  • 处理机器学习模型中的不平衡数据集:例如修改代价函数,或在深度学习模型中进行修改的批量处理。

SMOTE

SMOTE 是处理机器学习中不平衡数据集的常用算法。它是一种合成数据生成技术,通过在现有样本之间插值来创建新的、合成的少数类样本。SMOTE 通过识别少数类样本的 k 个最近邻,然后在这些邻居之间连接的线段上生成新的样本。

这里是 SMOTE 算法的步骤:

  1. 选择一个少数类样本,x

  2. 选择其 k 个最近邻之一,x’

  3. 通过在 xx’ 之间插值来生成一个合成样本。为此,选择一个介于 0 和 1 之间的随机数,r,然后按照以下方式计算合成样本:

newsample=x+r*x′−x

这将创建一个新的样本,它在 xx’ 之间,但不是两者中的任何一个。

  1. 重复步骤 1 到 3,直到生成所需的合成样本数量。

这里是 SMOTE 的优缺点:

  • 通过在少数类中创建合成样本,有助于解决类别不平衡的问题。

  • SMOTE 可以与其他技术结合使用,例如随机下采样或 Tomek 链接,以进一步改善数据集的平衡。

  • SMOTE 可以应用于分类数据和数值数据。

  • SMOTE 有时可能会创建出不真实或噪声的合成样本,导致过拟合。

  • SMOTE 有时会导致决策边界对少数类过于敏感,从而影响多数类的性能。

  • 对于大数据集,SMOTE 可能会计算成本较高。

这里是 SMOTE 在实际应用中的例子。假设我们有一个包含两个类别的数据集:多数类(类别 0)有 900 个样本,少数类(类别 1)有 100 个样本。我们想使用 SMOTE 为少数类生成合成样本:

  1. 我们选择一个少数类样本,x

  2. 我们选择其 k 个最近邻之一,x’

  3. 我们通过使用随机数 rxx’ 之间进行插值来生成一个合成样本:

newsample=x+r*(x′−x)

例如,假设 x 是 (1, 2),x’ 是 (3, 4),而 r0.5。在这种情况下,新的样本如下:

ne<mi}sample=(1,2)+0.5*((3,4)−(1,2))=(2,3)

  1. 我们重复 步骤 13,直到我们生成了所需的合成样本数量。例如,如果我们想生成 100 个合成样本,我们将对每个 100 个少数类样本重复 步骤 13,然后将原始的少数类样本与合成样本结合起来,创建每个类别有 200 个样本的平衡数据集。

近失算法

NearMiss 算法是一种通过下采样(移除)主要类别的记录来平衡类别分布的技术。当两个类别的记录非常接近时,从多数类中移除一些记录可以增加两个类别之间的距离,这有助于分类过程。为了避免大多数下采样方法中的信息丢失问题,近失法被广泛使用。

最近邻方法的工作基于以下步骤:

  1. 找到主要类和少数类中所有记录之间的距离。我们的目标是下采样主要类的记录。

  2. 从主要类中选择 n 个最接近少数类的记录。

  3. 如果少数类中有 k 个记录,最近的方法将返回主要类中的 kn* 个记录。

我们可以使用三种 NearMiss 算法的变体来找到主要类中的 n 个最近记录:

  • 我们可以选择主要类中平均距离到少数类 k 个最近记录最小的记录。

  • 我们可以选择多数类别的记录,使得到少数类别的k个最远记录的平均距离最小。

  • 我们可以实施两个步骤。在第一步中,对于少数类别的每个记录,将存储其M个最近的邻居。然后,选择多数类别的记录,使得到N个最近邻居的平均距离最大。

成本敏感学习

成本敏感学习是一种用于在不平衡数据集上训练机器学习模型的方法。在不平衡数据集中,某一类别的示例数量(通常是少数类别)远低于另一类别(通常是多数类别)。成本敏感学习涉及为模型分配基于预测类别的不同误分类成本,这可以帮助模型更多地关注正确分类少数类别。

假设我们有一个具有两个类别(正面和负面)的二分类问题。在成本敏感学习中,我们为不同类型的错误分配不同的成本。例如,我们可能将错误地将正面示例分类为负面的成本设置得更高,因为在不平衡数据集中,正面类别是少数类别,错误分类正面示例可能会对模型的性能产生更大的影响。

我们可以将成本以混淆矩阵的形式分配:

预测正面 预测负面
实际正面 TP_cost FN_cost
实际负面 FP_cost TN_cost

表3.2 – 混淆矩阵成本

这里,TP_costFN_costFP_costTN_cost分别是真实正面、假阴性、假阳性和真实负面的相关成本。

为了将成本矩阵纳入训练过程,我们可以修改模型在训练期间优化的标准损失函数。一个常见的成本敏感损失函数是加权交叉熵损失,其定义如下:

lo<mi}s<mi}s=−(wpos*y*log(yˆ)+wneg*(1−y)*log(1−yˆ))

在这里,y是真实标签(要么是0要么是1),<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:mover accent="true">mml:mrow<mml:mi mathvariant="normal">y</mml:mi></mml:mrow>mml:mo^</mml:mo></mml:mrow></mml:mover></mml:math>是预测的正类概率,而wpos<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi>mml:mie</mml:mi>mml:mig</mml:mi></mml:mrow></mml:msub></mml:math>是分别分配给正类和负类的权重。

权重,wpos<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi>mml:mie</mml:mi>mml:mig</mml:mi></mml:mrow></mml:msub></mml:math>,可以通过混淆矩阵中分配的成本来确定。例如,如果我们对假阴性(即错误地将正例分类为负例)分配更高的成本,我们可能会将wpos的值设置得比<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:min</mml:mi>mml:mie</mml:mi>mml:mig</mml:mi></mml:mrow></mml:msub></mml:math>高。

成本敏感学习也可以与其他类型的模型一起使用,例如决策树和SVMs。将成本分配给不同类型的错误的概念可以以多种方式应用于不平衡数据集以提高模型性能。然而,根据数据集和解决问题的具体特征,仔细选择合适的成本矩阵和损失函数是非常重要的:

  • 集成技术:集成技术通过结合多个模型来提高预测性能。在不平衡数据集中,可以针对数据集的不同子集训练模型集,确保每个模型都在少数和多数类上进行了训练。不平衡数据集的集成技术示例包括bagging和boosting。

  • 异常检测:异常检测技术可以用来在数据集中识别少数类作为异常。这些技术旨在识别与多数类显著不同的罕见事件。然后,可以识别的样本用于在少数类上训练模型。

数据增强

数据增强背后的思想是通过应用变换到原始示例来生成新的示例,同时仍然保留标签。这些变换可以包括旋转、平移、缩放、翻转和添加噪声等。这对于不平衡数据集尤其有用,其中一个类别的示例数量远小于另一个类别。

在不平衡数据集的背景下,数据增强可以用来创建少数类的新示例,从而有效地平衡数据集。这可以通过对少数类示例应用相同的变换集来实现,创建一组新的示例,这些示例仍然代表少数类,但与原始示例略有不同。

数据增强中涉及到的方程相对简单,因为它们是基于对原始示例应用变换函数。例如,为了将图像旋转一定角度,我们可以使用旋转矩阵:

x′=xcos(θ)−ysin(θ)

y′=xsin(θ)+ycos(θ)

在这里,xy 是图像中像素的原始坐标,x’y’ 是旋转后的新坐标,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:miθ</mml:mi></mml:math> 是旋转角度。

同样,为了应用平移,我们可以简单地通过一定数量的像素移动图像:

x′=x+dx

y′=y+dy

在这里,dxdy 分别是水平和垂直位移。

数据增强可以是一种强大的技术,用于解决不平衡数据集,因为它可以创建代表少数类的示例,同时仍然保留标签信息。然而,在应用数据增强时需要谨慎,因为它也可能在数据中引入噪声和伪影,并且如果不当处理可能会导致过拟合。

总之,处理不平衡数据集是机器学习的一个重要方面。有几种技术可以处理不平衡数据集,每种技术都有其优缺点。技术选择取决于数据集、问题和可用资源。除了处理不平衡数据之外,在处理时间序列数据的情况下,我们可能会遇到相关数据。我们将在下一部分更详细地探讨这一点。

处理相关数据

在机器学习模型中处理相关时间序列数据可能具有挑战性,因为传统的技术,如随机抽样,可能会引入偏差并忽略数据点之间的依赖关系。以下是一些可以帮助的方法:

  • 时间序列交叉验证:时间序列数据通常依赖于过去值,在模型训练和评估期间保持这种关系很重要。时间序列交叉验证涉及将数据分成多个折叠,每个折叠包含一个连续的时间块。这种方法确保模型在历史数据上训练并在未来数据上评估,这更好地模拟了模型在实际场景中的表现。

  • 特征工程:相关时间序列数据可能难以用传统的机器学习算法进行建模。特征工程可以帮助将数据转换成更合适的格式。时间序列数据特征工程的一些例子包括在时间序列中创建滞后或差异,将数据聚合到时间桶或窗口中,以及创建滚动统计量,如移动平均数。

  • 时间序列特定模型:有几个模型专门设计用于时间序列数据,例如自回归积分移动平均ARIMA)、季节性自回归积分移动平均SARIMA)、Prophet长短期记忆LSTM)网络。这些模型旨在捕捉时间序列数据中的依赖性和模式,并且可能优于传统的机器学习模型。

  • 时间序列预处理技术:时间序列数据可以预处理以去除相关性并使数据更适合机器学习模型。例如,差分、去趋势和归一化等技术可以帮助从数据中去除趋势和季节性成分,这有助于减少相关性。

  • 降维技术:相关的时间序列数据可能具有高维度,这可能会使建模变得困难。PCA或自动编码器等降维技术可以帮助减少数据中的变量数量,同时保留最重要的信息。

通常,使用能够保留数据中时间依赖性和模式的技术来处理时间序列数据是很重要的。这可能需要专门的建模技术和预处理步骤。

摘要

在本章中,我们学习了与机器学习相关的各种概念,从数据探索和预处理技术开始。然后我们探讨了各种机器学习模型,如逻辑回归、决策树、支持向量机和随机森林,以及它们的优缺点。我们还讨论了将数据分为训练集和测试集的重要性,以及处理不平衡数据集的技术。

本章还涵盖了模型偏差、方差、欠拟合和过拟合的概念,以及如何诊断和解决这些问题。我们还探讨了集成方法,如袋装法、提升法和堆叠法,这些方法可以通过结合多个模型的预测来提高模型性能。

最后,我们学习了机器学习的局限性和挑战,包括需要大量高质量数据、存在偏差和不公平的风险,以及解释复杂模型的困难。尽管存在这些挑战,机器学习仍然提供了强大的工具来解决广泛的问题,并有可能改变许多行业和领域。

在下一章中,我们将讨论文本预处理,这是使文本能够被机器学习模型使用所必需的。

参考文献

  • Shahriari, B., Swersky, K., Wang, Z., Adams, R.P., de Freitas, N.: 将人从循环中移除:贝叶斯优化的综述。IEEE汇刊,第104卷第1期,148–175页 (2016)。 DOI 10.1109/JPROC.2015.2494218.

第四章:Streamlining Text Preprocessing Techniques for Optimal NLP Performance

文本预处理在自然语言处理(NLP)领域是一个至关重要的初始步骤。它包括将原始、未加工的文本数据转换为机器学习算法可以轻松理解的格式。为了从文本数据中提取有意义的见解,必须清理、规范化和将数据转换成更结构化的形式。本章概述了最常用的文本预处理技术,包括分词、词干提取、词形还原、停用词移除和词性标注POS),以及它们的优缺点。

有效的文本预处理对于各种NLP任务至关重要,包括情感分析、语言翻译和信息检索。通过应用这些技术,原始文本数据可以被转换成一种结构化和规范化的格式,便于使用统计和机器学习方法进行分析。然而,选择合适的预处理技术可能具有挑战性,因为最佳方法取决于具体任务和数据集。因此,仔细评估和比较不同的文本预处理技术,以确定针对特定应用的最高效方法,这一点非常重要。

本章将涵盖以下主题:

  • NLP中的小写转换

  • 移除特殊字符和标点符号

  • 移除停用词

  • 命名实体识别(NER)

  • 词性标注

  • 解释预处理流程

技术要求

要跟随本章关于文本预处理的示例和练习,你需要对一种编程语言(如Python)有实际操作的知识,以及一些对NLP概念的了解。你还需要安装某些库,例如自然语言工具包NLTK)、spaCyscikit-learn。这些库提供了强大的文本预处理和特征提取工具。建议你能够访问Jupyter Notebook环境或另一个交互式编码环境,以促进实验和探索。此外,拥有一个用于工作的样本数据集可以帮助你理解各种技术及其对文本数据的影响。

文本规范化是将文本转换为标准形式的过程,以确保一致性并减少变化。用于规范化文本的技术包括小写转换、移除特殊字符、拼写检查以及词干提取或词形还原。我们将详细解释这些步骤,以及如何使用它们,并附上代码示例。

NLP中的小写转换

将文本转换为小写是一种常见的文本预处理技术,在自然语言处理(NLP)中用于标准化文本并降低词汇的复杂性。在这种技术中,所有文本都被转换为小写字符。

将文本转换为小写的主要目的是使文本统一,并避免因大写字母引起的任何差异。通过将所有文本转换为小写,机器学习算法可以将大写和非大写的相同单词视为相同,从而减少整体词汇量,使文本更容易处理。

将文本转换为小写对于文本分类、情感分析和语言建模等任务特别有用,在这些任务中,文本的意义不受单词大小写的影响。然而,它可能不适合某些任务,例如命名实体识别(NER),在这些任务中,大小写可能是一个重要的特征。

移除特殊字符和标点符号

移除特殊字符和标点符号是文本预处理的重要步骤。特殊字符和标点符号对文本的意义贡献不大,如果它们没有被移除,可能会给机器学习模型带来问题。执行此任务的一种方法是通过使用正则表达式,如下所示:

re.sub(r"[^a-zA-Z0-9]+", "", string)

这将移除输入字符串中的非字符和数字。有时,我们可能希望将特殊字符替换为空格。请看以下示例:

  • 竞选总统

  • 正文类型

在这两个示例中,我们希望将“-”替换为空格,如下所示:

  • 竞选总统

  • 正文类型

接下来,我们将介绍停用词移除。

停用词移除

停用词是不太影响句子或文本意义的单词,因此可以安全地移除,而不会丢失太多信息。停用词的例子包括“a”、“an”、“the”、“and”、“in”、“at”、“on”、“to”、“for”、“is”、“are”等等。

停用词移除是文本预处理中常见的步骤,在执行任何文本分析任务之前进行,如情感分析主题建模信息检索。目标是减少词汇量和特征空间的维度,这可以提高后续分析步骤的效率和效果。

停用词移除的过程包括识别一组停用词(通常是预定义的或从语料库中学习得到的),将输入文本分词成单词或标记,然后移除任何与停用词列表匹配的单词。结果文本仅包含携带文本意义的单词。

停用词移除可以使用各种编程语言、工具和库来完成。例如,NLTK是一个流行的Python NLP库,它为各种语言提供停用词列表,以及从文本中移除停用词的方法。

以下是一个停用词移除的示例:

这是一个展示停用词过滤的示例句子。

在执行停用词移除后,我们得到以下输出:

示例句子展示停用词过滤

本章包含专门为此编写的Python代码。您可以参考本章中描述的每个操作。

如我们所见,原始句子中的停用词“这是”、“是”和“一个”已被移除,只留下了重要的单词。

拼写检查和纠错

拼写检查和纠错涉及纠正文本中的拼写错误。这很重要,因为拼写错误可能会导致数据不一致并影响算法的准确性。例如,看看以下句子:

我要去 面包店

这将转换为以下内容:

我要去 面包店

让我们继续讨论词形还原。

词形还原

词形还原是一种文本归一化方法,旨在将一个单词简化为其基本或词典形式,称为词元。词形还原的主要目标是聚合同一单词的各种形式,以便将它们作为一个统一术语进行分析。

例如,考虑以下句子:

三只猫在田野里追逐老鼠,同时一只猫在观察 一只老鼠

在这个句子的上下文中,“cat”和“cats”是同一单词的两种不同形式,“mouse”和“mice”也是同一单词的两种不同形式。词形还原会将这些单词还原到其基本形式:

这只猫正在田野里追逐老鼠,同时一只猫在观察 一只老鼠

在这种情况下,“cat”和“cats”都已还原到其基本形式“cat”,“mouse”和“mice”也都已还原到其基本形式“mouse”。这允许更好地分析文本,因为“cat”和“mouse”的出现现在被视为同一术语,无论其屈折变化如何。

词形还原与词干提取不同,后者涉及将一个单词还原到一个可能本身不是单词的通用词干。例如,“cats”和“cat”的词干都是“cat”。而“cats”和“cat”的词元也是“cat”。

可以使用各种NLP库和工具执行词形还原,例如NLTK、spaCy和Stanford CoreNLP。

词干提取

词干提取涉及将单词还原到其基本或根形式,称为“词干”。这个过程在NLP中通常用于准备文本以进行分析、检索或存储。词干提取算法通过截断单词的末尾或后缀来实现,只留下词干。

词干提取的目标是将一个单词的所有屈折或派生形式转换为一种通用词干。例如,“running”这个词的词干是“run”,“runs”这个词的词干也是“run”。

常用的词干提取算法之一是波特词干提取算法。该算法基于一系列规则,用于识别词尾并将其从单词中移除,以获得词干。例如,波特算法会将单词“leaping”转换为“leap”,通过移除“ing”后缀。

让我们通过一个示例句子来看看词干提取的实际应用:

他们正在跑跳着穿过 墙壁

这里是使用Porter算法提取的词干文本:

他们跑着跳着穿过 墙壁

如您所见,单词“running”和“leaping”已被转换为它们的词干形式“run”和“leap”,并且从“walls”中移除了后缀“s”。

词干提取对于文本分析任务,如信息检索或情感分析是有用的,因为它减少了文档或语料库中独特单词的数量,并有助于将相似单词分组。然而,词干提取也可能引入错误,因为它有时会产生不是实际单词的词干,或者产生不是单词预期基本形式的词干。例如,词干提取器可能会将“walk”作为“walked”和“walking”的词干,尽管“walk”和“walked”有不同的含义。因此,评估词干提取的结果以确保其产生准确和有用的结果是重要的。

NER

命名实体识别(NER)是一种自然语言处理(NLP)技术,旨在检测和分类文本中的命名实体,包括但不限于人名、组织名、地点等。NER的主要目标是自主地从无结构化文本数据中识别和提取有关这些命名实体的信息。

命名实体识别通常涉及使用机器学习模型,如条件随机字段(CRFs)或循环神经网络(RNNs),为给定句子中的单词标记相应的实体类型。这些模型在包含带有标签实体的文本的大型标注数据集上训练。然后,这些模型使用基于上下文的规则来识别新文本中的命名实体。

命名实体识别(NER)可以识别的命名实体类别有几个,包括以下内容:

  • 人物:一个命名个人,例如“巴拉克·奥巴马”(Barack Obama)

  • 组织:一个命名公司、机构或组织,例如“谷歌”(Google)

  • 地点:一个命名地点,例如“纽约市”(New York City)

  • 日期:一个命名的日期或时间,例如“2023年1月1日”(January 1, 2023)

  • 产品:一个命名的产品或品牌,例如“iPhone”

这里有一个命名实体识别(NER)的工作示例。看看以下句子:

苹果公司(Apple Inc.)是一家总部位于加利福尼亚州库比蒂诺(Cupertino, California)的技术公司。

在这里,NER会将“Apple Inc.”识别为组织,将“Cupertino, California”识别为地点。命名实体识别系统的输出可以是句子的结构化表示,如下所示:

{"organization": "Apple Inc.",
"location": "Cupertino, California"}

命名实体识别(NER)在各个领域都有许多应用,包括信息检索问答情感分析等。它可以自动从无结构化文本数据中提取结构化信息,这些信息可以进一步分析或用于下游任务。

执行命名实体识别(NER)有不同的方法和工具,但执行NER的一般步骤如下:

  1. 数据收集:第一步是收集用于命名实体识别(NER)的数据。这些数据可以是无结构化文本的形式,例如文章、社交媒体帖子或网页。

  2. 预处理:下一步是预处理数据,这涉及各种步骤,如分词、停用词去除、词干提取或词形还原以及归一化。

  3. 标记:预处理后,下一步是将数据用命名实体标签进行标记。有不同的标记方案,但最常用的一种是内部-外部-开始IOB)标记方案。在这个方案中,文本中的每个单词都被标记为B(命名实体的开始)、I(命名实体内部)或O(命名实体外部)。

  4. 训练:一旦数据被标记,下一步就是训练一个机器学习模型以识别新、未见过的文本中的命名实体。NER可以使用不同类型的模型,例如基于规则的系统、统计模型和深度学习模型。

  5. 评估:在训练模型后,评估其在测试数据集上的性能非常重要。这有助于识别模型中可能存在的问题,例如过拟合、欠拟合或偏差。

  6. 部署:最后,训练好的模型可以被部署到对新、未见过的文本执行命名实体识别(NER)。这可以实时进行,也可以批量进行,具体取决于应用程序的需求。

下面是一个如何执行NER的示例:

原始文本:

Apple is negotiating to buy a Chinese start-up this year.

预处理文本:

apple negotiating buy Chinese start-up year

标记文本:

B-ORG O O B-LOC O O

在这个示例中,命名实体“Apple”和“Chinese”分别被识别为组织(B-ORG)和地点(B-LOC)。在这个示例中,“this year”没有被识别为命名实体,但如果使用更复杂的标记方案或模型在促进这种识别的数据上训练,它将被识别。

根据编程语言和项目的具体需求,可以使用几个库进行NER。让我们看看一些常用的库:

  • spaCyspaCy是一个广泛使用的开源库,旨在用于各种NLP任务,包括NER。它提供跨多种语言的预训练模型,并且还允许用户针对特定需求进行模型训练。

  • NLTK:这是另一个广泛使用的NLP任务库,包括NER。它提供几个预训练模型,并允许用户训练自己的模型。

  • 斯坦福命名实体识别器NER):这是一个基于Java的NER工具,为包括英语、德语和中文在内的多种语言提供预训练模型。

  • AllenNLP:AllenNLP是一个流行的开源库,用于构建和评估NLP模型,包括NER。它为包括NER在内的几个任务提供预训练模型,并允许用户训练自己的模型。

  • Flair:Flair是一个用于最先进自然语言处理(NLP)的Python库,包括NER。它为多种语言提供预训练模型,并允许用户训练自己的模型。

  • 通用文本工程架构GATE):这是一个用于NLP的工具套件,包括NER。它提供了一个图形界面来创建和评估NLP模型,并允许用户为特定任务开发自定义插件。

对于命名实体识别(NER),有许多其他库可供选择,库的选择将取决于编程语言、可用模型和项目的具体要求。在下一节中,我们将解释词性标注(POS tagging)以及执行此任务的不同方法。

词性标注

词性标注(POS tagging)是将诸如名词、动词、形容词等语法标签分配给句子中单个单词的实践。这一标注过程在包括文本分类、情感分析和机器翻译在内的各种NLP任务中是一个基础步骤。

词性标注可以使用不同的方法进行,例如基于规则的方法、统计方法和基于深度学习的方法。在本节中,我们将简要概述每种方法。

基于规则的方法

基于规则的方法进行词性标注涉及定义一组规则或模式,这些规则或模式可以用于自动将文本中的单词标注为相应的词性,如名词、动词、形容词等。

该过程包括定义一组规则或模式,用于识别句子中的不同词性。例如,一条规则可能声明以“-ing”结尾的任何单词都是动名词(作为名词使用的动词),而另一条规则可能声明以“a”或“an”等冠词开头的任何单词很可能是名词。

这些规则通常基于语言学知识,例如语法和句法知识,并且通常针对特定语言。它们还可以补充以词典或词汇表,这些词典或词汇表提供了关于单词意义和用法的额外信息。

基于规则的标签化过程涉及将这些规则应用于给定的文本,并为每个单词识别词性。这可以手动完成,但通常使用支持正则表达式和模式匹配的软件工具和编程语言进行自动化。

基于规则的方法的一个优点是,当规则设计得很好并且覆盖了广泛的语言学现象时,它们可以非常准确。它们还可以根据特定领域或文本类型进行定制,例如科学文献或法律文件。

然而,基于规则的方法的局限性在于,它们可能无法捕捉自然语言的全部复杂性和可变性,并且随着语言随时间演变和变化,可能需要大量努力来开发和维护规则。它们还可能难以处理歧义,例如在单词可以根据上下文具有多种可能的词性时。

尽管有这些局限性,基于规则的 POS 标注方法在 NLP 中仍然是一个重要的方法,特别是对于需要高精度和精确度的应用。

统计方法

POS 标注的统计方法基于使用概率模型自动为句子中的每个单词分配最可能的 POS 标签。这些方法依赖于一个已标记的语料库,其中 POS 标签已经分配给单词,以学习特定单词与每个标签关联的概率。

用于 POS 标注的两种主要统计方法是:隐马尔可夫模型HMMs)和 CRFs。

HMMs 是一类广泛应用于处理序列数据(包括文本)的概率模型。在 POS 标注的背景下,HMMs 表示一系列单词的 POS 标签的概率分布。HMMs 假设一个句子中特定位置的 POS 标签的可能性仅取决于序列中的前一个标签。此外,它们还假设给定其标签的特定单词的可能性与其他句子中的单词无关。为了确定给定句子的最可能的 POS 标签序列,HMMs 使用 Viterbi 算法。

CRFs 是另一种常用于序列标注任务(包括 POS 标注)的概率模型。CRFs 与 HMMs 的不同之处在于,它们模型化的是给定输入序列(即单词)的输出序列(即 POS 标签)的条件概率,而不是输出和输入序列的联合概率。这使得 CRFs 能够比 HMMs 捕获输入和输出序列之间更复杂的依赖关系。CRFs 使用迭代算法,如梯度下降或 L-BFGS,来学习模型的最佳权重集。

让我们来看看统计方法的优点:

  • 统计方法可以捕捉到单词的上下文以及句子中单词之间的关系,从而产生更准确的标注结果。

  • 这些方法可以处理训练数据中未出现的单词和句子。

  • 统计方法可以在大型数据集上训练,这使得它们能够捕捉到语言中的更多变化和模式。

现在,让我们看看缺点:

  • 这些方法需要大量的标注数据用于训练,这可能既耗时又昂贵。

  • 统计方法可能对训练数据的质量敏感,如果数据是嘈杂或偏颇的,可能会表现不佳。

  • 统计模型通常是黑盒,这使得很难解释模型所做的决策。

基于深度学习的方法

基于深度学习的 POS 标注方法涉及训练一个神经网络模型来预测给定句子中每个单词的 POS 标签。这些方法可以在文本数据中学习复杂的模式和关系,以准确地为单词分配其适当的词性。

最受欢迎的基于深度学习的词性标注方法之一是使用带有LSTM单元的RNN。基于LSTM的模型可以处理单词序列并捕捉它们之间的依赖关系。模型输入是一个单词嵌入序列,这些嵌入是高维空间中单词的向量表示。这些嵌入是在训练过程中学习的。

基于LSTM的模型由三个主要层组成:输入层、LSTM层和输出层。结构涉及将单词嵌入作为输入传递到输入层。随后,LSTM层处理这些嵌入的序列,旨在掌握它们内在的相互依赖关系。最终,输出层负责预测输入序列中每个单词的词性标签。另一种流行的基于深度学习的词性标注方法是使用基于transformer的模型,例如双向编码器表示的TransformerBERT)。BERT是一个预训练的语言模型,它使用基于transformer的架构来深入理解句子中单词之间的上下文关系。它使用大量文本数据进行训练,并且可以微调以在各种自然语言处理任务中表现出色,其中之一就是词性标注。

要使用BERT进行词性标注,输入句子必须进行分词,并且每个标记词必须分配一个初始的词性标签。然后,标记词嵌入被输入到预训练的BERT模型中,该模型为每个标记词输出上下文化的嵌入。这些嵌入随后通过前馈神经网络传递,以预测每个标记词的最终词性标签。

基于深度学习的词性标注方法在多个基准数据集上展示了前沿的性能。然而,它们的有效性需要大量的训练数据和计算资源,并且训练过程可能耗时。此外,它们可能缺乏可解释性,这使得理解模型如何进行预测变得困难。

在各种编程语言中,如Python、Java和C++,都有可用于执行词性标注的库。一些提供词性标注功能的流行自然语言处理库包括NLTK、spaCy、Stanford CoreNLP和Apache OpenNLP。

下面是使用Python中的NLTK库进行词性标注的示例:

import nltk
input_sentence = "The young white cat jumps over the lazy dog"
processed_tokens = nltk.word_tokenize(input_sentence)
tags = nltk.pos_tag(processed_tokens)
print(tags)

输出如下:

[('The', 'DT'), (young, 'JJ'), (white, 'NN'), ('cat', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]

在这个例子中,使用了nltk.pos_tag()函数来标注句子中的单词。该函数返回一个元组列表,其中每个元组包含一个单词及其词性标签。这里使用的词性标签基于宾州树库标签集

正则表达式

正则表达式是一种文本模式,在现代编程语言和软件中具有多种应用。它们用于验证输入是否符合特定的文本模式,定位与模式匹配的大文本体内的文本,将匹配模式的文本替换为其他文本或重新排列匹配文本的部分,以及将文本块划分为子文本列表,但如果不正确使用,可能会导致意外的后果。

在计算机科学和数学中,术语正则表达式来源于数学表达式中的“规律性”概念。

正则表达式,通常称为regex或regexp,是一系列构成搜索模式的字符。正则表达式用于匹配和操作文本,通常在文本处理、搜索算法和NLP的上下文中使用。

正则表达式由字符和元字符的混合组成,共同建立用于在文本字符串中搜索的模式。正则表达式的最简单形式是精确匹配字符序列。例如,正则表达式“hello”会匹配包含“hello”字符序列的任何字符串。

元字符是正则表达式中的独特字符,具有预定义的含义。例如,“.”(点)元字符用于匹配任何单个字符,而“*”(星号)元字符用于匹配前一个字符或组的零个或多个实例。正则表达式可用于广泛的文本处理任务。让我们更深入地了解一下。

验证输入

可以使用正则表达式通过匹配模式来验证输入。例如,您可以使用正则表达式验证电子邮件地址或电话号码。

文本操作

使用正则表达式进行文本操作涉及使用模式匹配技术来查找和操作文档或数据集中的文本字符串。正则表达式是处理文本数据的强大工具,允许进行复杂的搜索和替换操作、文本提取和格式化。

可以使用正则表达式完成的一些常见文本操作任务如下:

  • 搜索和替换:使用正则表达式在文档中搜索特定的模式或字符序列,并用其他文本或格式替换它们

  • 数据提取:可以通过定义匹配特定数据格式的模式来使用正则表达式从文本中提取数据

这里是使用正则表达式进行数据提取的一般步骤:

  1. 定义正则表达式模式:第一步是定义一个匹配您想要提取的数据的正则表达式模式。例如,如果您想从文本文档中提取所有电话号码,您可以定义一个匹配电话号码格式的模式。

  2. 编译正则表达式模式:在建立正则表达式模式后,下一步是将它编译成一个正则表达式对象,然后可用于匹配目的。

  3. 在文本中搜索模式:一旦编译了正则表达式对象,您就可以使用它来在文本中搜索该模式。您可以在单个字符串或更大的文本块中搜索该模式。

  4. 提取匹配的数据:在您在文本中搜索到模式后,您可以提取与该模式匹配的数据。您可以提取所有匹配数据的所有出现,或者只提取第一次出现。

这里是一个使用Python中的正则表达式从字符串中提取所有电子邮件地址的示例:

import re
text = "John's email is john@example.com and Jane's email is jane@example.com"
# Pattern for email addresses:
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
regex = re.compile(pattern)
# Search for all occurrences of the pattern in the text:
matches = regex.findall(text)
print(matches)

这里是输出:

['john@example.com', 'jane@example.com']

接下来,我们将介绍文本清理。

文本清理

文本清理意味着使用正则表达式清理和标准化文本数据,从而移除不需要的字符、空白或其他格式。

这里是一些常见的使用正则表达式的文本清理技术:

  • 移除特殊字符:正则表达式可用于匹配并移除特定字符,例如标点符号、括号和其他特殊符号。例如,[^a-zA-Z0-9] 正则表达式将匹配任何非字母数字字符。

  • 移除停用词:停用词是诸如“the”、“and”和“but”等常见单词,通常从文本中移除以关注最有意义的单词。正则表达式可用于匹配并从文本中移除这些单词。

  • 移除HTML标签:如果您正在处理从网站抓取的文本,您可能需要在分析文本之前移除HTML标签。正则表达式可用于匹配并移除HTML标签。

  • 将文本转换为小写:正则表达式可用于将所有文本转换为小写或大写,这可以使比较和分析更容易。

  • 文本归一化:归一化涉及将文本转换成标准格式。正则表达式可用于执行诸如词干提取和词形还原等任务,这涉及到将单词还原到其词根形式。

通过使用正则表达式进行文本清理,您可以从文本中移除噪声和不相关信息,使其更容易分析和提取有意义的见解。

解析

解析涉及分析文本字符串以根据指定的语法识别其语法结构。正则表达式是文本解析的有力工具,尤其是在处理简单和规则的语法模式时。

要使用正则表达式解析文本,您需要为要解析的语言定义一个语法。该语法应指定句子的可能组成部分,例如名词、动词、形容词等,以及规定这些组成部分如何组合成有效句子的规则。

一旦您定义了语法,您就可以使用正则表达式来识别句子的各个组成部分及其之间的关系。例如,您可以使用正则表达式匹配句子中的所有名词或识别动词的主语和宾语。

使用正则表达式进行解析的一个常见方法是为语法中的不同词性和句子结构定义一组模式。例如,您可能为匹配名词定义一个模式,为匹配动词定义一个模式,以及为匹配由主语、动词和宾语组成的句子定义一个模式。

要使用这些模式进行解析,您需要使用正则表达式引擎将它们应用于文本字符串,该引擎会将模式与字符串的适当部分匹配。解析过程的输出将是一个解析树或其他表示句子语法结构的数据库结构。

正则表达式解析的一个局限性是它通常不适用于处理更复杂或模糊的语法。例如,处理一个词可能是名词或动词取决于上下文的情况,或者句子结构模糊的情况可能会很困难。

我们还可以使用正则表达式根据特定的模式或分隔符将较大的文本文档拆分为较小的块或词元。

要使用正则表达式进行文本操作,您通常需要定义一个匹配您想要查找或操作的文本的模式。此模式可以包括特殊字符和语法来定义构成文本字符串的特定字符序列、数字或其他元素。

例如,正则表达式模式 \d{3}-\d{2}-\d{4} 可能用于在更大的文本文档中搜索和提取社会保险号码。此模式匹配三个数字序列,后面跟着一个连字符,然后是两个更多数字,另一个连字符,最后是四个数字,后面跟着一个非数字字符,这些字符一起代表了美国社会保险号码的标准格式。

一旦您定义了正则表达式模式,您就可以使用它和各种文本操作工具和编程语言,如grep、sed、awk、Perl、Python等,来执行复杂的文本操作任务。

一些编程语言,如Perl和Python,内置了对正则表达式的支持。其他编程语言,如Java和C++,则需要您使用库或API来处理正则表达式。

虽然正则表达式是文本处理中的强大工具,但它们也可能很复杂,难以理解。熟悉正则表达式的语法和行为对于在代码中有效地使用它们至关重要。

词元化

分词是NLP中的一个过程,涉及将文本片段或句子分解成单个单词或术语,称为标记。分词过程可以应用于各种形式的数据,如文本文档、社交媒体帖子、网页等。

分词过程是许多NLP任务的重要初始步骤,因为它将非结构化文本数据转换成可以用于机器学习算法或其他技术分析的格式化格式。这些标记可以用于在文本中执行各种操作,例如统计单词频率、识别最常见的短语等。

分词有不同的方法:

  • 单词分词:这种方法使用空格、标点符号和其他字符作为分隔符将文本片段分解成单个单词或标记。例如,看看以下句子:

    敏捷的白色猫跳过了 睡着的狗

    这可以分词成以下单词列表:

    [“The”, “nimble”, “white”, “cat”, “jumps”, “over”, “the”, “**sleepy”, “dog”]

  • 句子分词:这种方法使用句号、感叹号和问号等标点符号作为分隔符将文本片段分解成单个句子。例如,看看以下段落:

    这是 第一句话。

    这是 第二句话。

    这是 第三句话

    这可以分词成以下句子列表:

    [“This is the first sentence.”,

    “这是 第二句话。”,

    “这是 第三句话。”]

  • 正则表达式分词:这种方法使用正则表达式来定义分词规则。正则表达式可以用于匹配文本中的模式,如电子邮件地址、URL或电话号码,并将它们作为单独的标记提取出来。

分词是NLP中的重要步骤,并在许多应用中使用,如情感分析、文档分类、机器翻译等。

分词也是语言模型中的重要步骤。例如,在BERT这个著名的语言模型中,分词器是一个子词分词器,意味着它将单词分解成更小的子词单元,称为标记。它使用WordPiece分词,这是一种基于训练文本语料库的数据驱动方法,它构建了一个包含大量子词的大词汇表。

使用分词器也是语言模型中的重要步骤。例如,BERT利用WordPiece分词器,该分词器采用将单词分为完整形式或更小的称为词元的组件的技术。这意味着单个单词可以由多个标记表示。它采用数据驱动的方法,根据训练文本语料库构建一个包含大量子词的大词汇表。这些子词单元以嵌入的形式表示,用作BERT模型的输入。

BERT分词器的一个关键特性是它可以处理词汇表外的OOV)单词。如果分词器遇到不在其词汇表中的单词,它将单词分解成子词,并将单词表示为其子词嵌入的组合。我们将在本书的后面部分更详细地解释BERT及其分词器。在语言模型中使用分词器的优点是我们可以将输入的大小限制为我们字典的大小,而不是所有可能的输入。例如,BERT有30,000个单词的词汇量,这有助于我们限制深度学习语言模型的大小。使用更大的分词器会增加模型的大小。在下一节中,我们将解释如何使用本章中介绍的方法在完整的预处理流程中使用。

解释预处理流程

我们将解释作者提供的完整的预处理流程,供读者了解。

如以下代码所示,输入是一个带有编码标签的格式化文本,类似于我们可以从HTML网页中提取的内容:

"<SUBJECT LINE> Employees details<END><BODY TEXT>Attached are 2 files,\n1st one is pairoll, 2nd is healtcare!<END>"

让我们看看将每个步骤应用到文本上的效果:

  1. 解码/移除编码:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险!

  2. 小写化:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险!

  3. 数字转文字:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险!

  4. 移除标点符号和其他特殊字符:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险

  5. 拼写纠正:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险

  6. 移除停用词:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险

  7. 词干提取:

    员工详情附上两个文件,第一个是工资单,第二个 是医疗保险

  8. 词形还原:

    员工详情附上两个文件,第一个是工资单 第二个是医疗保险

通过这些,我们了解了不同的预处理方法。接下来,我们将回顾一段执行NER和POS的代码。

NER和POS的代码

对于这个例子,我们使用了Python的spaCy库来执行这些任务。我们的输入如下:

The companies that would be releasing their quarterly reports tomorrow are Microsoft, 4pm, Google, 4pm, and AT&T, 6pm.

这是NER的输出:

明天将发布季度报告的公司有微软 ORG ,下午4点 TIME ,谷歌 ORG ,下午4点 TIME ,以及AT&T ORG ,晚上6点 TIME 。

如您所见,使用命名实体识别(NER),我们能够检测到与公司名称(ORG)或日期相关的句子部分。

图4**.1 展示了使用spaCy进行词性标注的示例:

图4.1 – 使用spaCy进行词性标注

图4.1 – 使用spaCy进行词性标注

这是输出:

[['companies', 'NOUN'],
 ['releasing', 'VERB'],
 ['quarterly', 'ADJ'],
 ['reports', 'NOUN'],
 ['tomorrow', 'NOUN'],
 ['Microsoft', 'PROPN'],
 ['pm', 'NOUN'],
 ['Google', 'PROPN'],
 ['pm', 'NOUN'],
 ['AT&T', 'PROPN'],
 ['pm', 'NOUN']]

以下代码示例展示了预处理的不同方面,预处理将原始文本转换为适合下游模型的形式,以便符合整体设计的用途。

摘要

在本章中,我们介绍了一系列文本预处理的技术和方法,包括规范化、分词、停用词去除、词性标注等。我们探讨了这些技术的不同方法,例如基于规则的方法、统计方法以及基于深度学习的方法。我们还讨论了每种方法的优缺点,并提供了示例和代码片段来说明它们的使用。

到目前为止,你应该对文本预处理的重要性以及用于清理和准备文本数据以供分析的各种技术和方法有了扎实的理解。你应该能够使用Python中流行的库和框架实现这些技术,并理解不同方法之间的权衡。此外,你应该对如何处理文本数据以在自然语言处理任务(如情感分析、主题建模和文本分类)中取得更好的结果有更深入的了解。

在下一章中,我们将解释文本分类,以及执行此任务的不同方法。

第五章:激活文本分类:利用传统机器学习技术

在本章中,我们将深入探讨文本分类的迷人世界,这是自然语言处理(NLP)和机器学习(ML)的基础任务,涉及将文本文档分类到预定义的类别中。随着数字文本数据量的指数级增长,准确且高效地分类文本的能力对于广泛的应用变得越来越重要,例如情感分析、垃圾邮件检测和文档组织。本章为来自不同背景和技能水平的读者提供了一个关于文本分类中使用的核心概念、方法和技术的全面概述。

我们将首先探讨各种文本分类任务的类型及其独特特征,提供对每种类型所面临的挑战和机遇的见解。接下来,我们将介绍N-gram的概念,并讨论它们如何作为文本分类的特征被利用,不仅捕捉单个单词,还捕捉文本中的局部上下文和单词序列。然后,我们将研究广泛使用的词频-逆文档频率TF-IDF)方法,该方法根据单词在文档中的频率和在整个语料库中的频率分配权重,展示了其在区分分类任务中相关单词方面的有效性。

随后,我们将深入研究强大的Word2Vec算法及其在文本分类中的应用。我们将讨论Word2Vec如何创建捕获语义意义和关系的密集向量表示,以及这些嵌入如何作为特征来提高分类性能。此外,我们还将介绍如连续词袋模型CBOW)和 Skip-Gram 等流行架构,提供对它们内部工作原理的更深入理解。

最后,我们将探讨主题建模的概念,这是一种在文档集合中揭示隐藏主题结构的技巧。我们将研究如潜在狄利克雷分配LDA)等流行算法,并描述主题建模如何应用于文本分类,从而发现文档之间的语义关系并提高分类性能。

在本章中,我们旨在提供对文本分类中使用的潜在概念和技术的深入理解,为您提供解决现实世界文本分类问题的知识和技能。

本章将涵盖以下主题:

  • 文本分类的类型

  • 基于 N-gram 的文本分类

  • 基于 TF-IDF 的文本分类

  • Word2Vec 及其在文本分类中的应用

  • 主题建模

  • 回顾我们的用例 - 在 Jupyter 笔记本中为 NLP 分类设计的机器学习系统

技术要求

为了有效地阅读和理解这一章,对各种技术领域的坚实基础是必不可少的。对NLP、ML和线性代数的基本概念有深刻的理解至关重要。熟悉文本预处理技术,如分词、停用词去除以及词干提取或词形还原,对于理解数据准备阶段是必要的。

此外,理解基本的ML算法,如逻辑回归和支持向量机SVMs),对于实现文本分类模型至关重要。最后,熟悉评估指标,如准确率、精确率、召回率和F1分数,以及过拟合、欠拟合和超参数调整等概念,将有助于更深入地理解文本分类中的挑战和最佳实践。

文本分类的类型

文本分类是一个NLP任务,其中ML算法根据文本的内容将其分配到预定义的类别或标签。它涉及在标记数据集上训练一个模型,以便它能够准确预测未见或新的文本输入的类别。文本分类方法可以分为三种主要类型——监督学习无监督学习半监督学习

  • 监督学习:这种文本分类涉及在标记数据上训练模型,其中每个数据点都与一个目标标签或类别相关联。然后,该模型使用这些标记数据来学习输入文本和目标标签之间的模式和关系。文本分类的监督学习算法示例包括朴素贝叶斯、SVMs以及卷积神经网络(CNNs)和循环神经网络(RNNs)等神经网络。

  • 无监督学习:这种文本分类涉及将文本文档聚类或分组到类别或主题中,而不需要任何关于类别或标签的先验知识。当没有可用的标记数据或当类别或主题的数量未知时,无监督学习非常有用。文本分类的无监督学习算法示例包括K-means聚类、LDA和层次狄利克雷过程HDP)。

  • 半监督学习:这种文本分类结合了监督学习和无监督学习的方法。它涉及使用少量标记数据来训练模型,然后使用该模型来分类剩余的无标签数据。然后,该模型使用无标签数据来提高其分类性能。当标记数据稀缺或难以获得时,半监督学习非常有用。文本分类的半监督学习算法示例包括自训练协同训练多视角学习

这些文本分类类型各有其优势和劣势,适用于不同类型的应用。了解这些类型有助于为特定问题选择适当的方法。在以下小节中,我们将详细解释这些方法。

监督学习

监督学习是一种机器学习类型,其中算法从标注数据中学习以预测新、未见数据的标签。

在文本分类的背景下,监督学习涉及在标注数据集上训练模型,其中每个文档或文本样本都被标注为相应的类别或类别。然后,该模型使用这些训练数据来学习文本特征与其相关标签之间的模式和关系:

  1. 在监督文本分类任务中,第一步是获取一个标注数据集,其中每个文本样本都被标注为相应的类别或类别。

    标注数据集被认为具有最高可靠性。通常,它是通过让主题专家手动审查文本并为每个项目分配适当的类别来获得的。在其他情况下,可能存在用于生成标签的自动化方法。例如,在网络安全领域,你可能收集历史数据然后分配标签,这些标签可能收集每个项目之后的成果——也就是说,该操作是否合法。由于大多数领域都存在此类历史数据,因此这些数据也可以作为可靠的标注集。

  2. 下一步是对文本数据进行预处理,以准备建模。这可能包括诸如分词、词干提取或词形还原、去除停用词以及其他文本预处理技术。

  3. 在预处理之后,文本数据被转换为数值特征,通常使用诸如词袋模型或TF-IDF编码等技术。

  4. 然后,使用这些数值特征在标注数据集上训练监督学习算法,如逻辑回归、SVM或神经网络。

一旦模型被训练,就可以使用它来根据学习到的文本特征与其相关标签之间的模式和关系来预测新、未见文本数据的类别或类别。

监督学习算法通常用于文本分类任务。让我们看看一些常用的用于文本分类的监督学习算法。

朴素贝叶斯

朴素贝叶斯是一种概率算法,常用于文本分类。它基于贝叶斯定理,该定理表明,给定一些观察到的证据(在这种情况下,文档中的单词),假设(在这种情况下,文档属于特定类别)的概率与证据在假设下给出的概率成正比,乘以假设的先验概率。朴素贝叶斯假设在类别标签给定的情况下,特征(单词)之间是相互独立的,这也是其名称中“朴素”部分的原因。

逻辑回归

逻辑回归是一种用于二元分类问题(即只有两个可能类别的問題)的统计方法。它使用逻辑函数来模拟文档属于特定类别的概率,该函数将任何实值输入映射到0到1之间的值。

SVM

SVM是一种强大的分类算法,在各种应用中使用,包括文本分类。SVM通过找到最佳分离数据的超平面来工作。在文本分类中,特征通常是文档中的词语,而超平面用于将所有可能的文档空间划分为对应不同类别的不同区域。

所有这些算法都可以使用标记数据进行训练,其中训练集中的每个文档的类别标签都是已知的。一旦训练完成,该模型就可以用来预测新、未标记文档的类别标签。模型的性能通常使用准确率、精确率、召回率和F1分数等指标进行评估。

无监督学习

无监督学习是一种机器学习类型,其中数据未标记,算法被留给自行寻找模式和结构。在文本分类的背景下,当没有标记数据可用或目标是发现文本数据中的隐藏模式时,可以使用无监督学习方法。

一种常见的用于文本分类的无监督学习方法是聚类。聚类算法根据文档的内容将相似的文档分组在一起,而不需要任何关于每个文档内容的先验知识。聚类可以用来识别文档集合中的主题,或将相似的文档分组在一起进行进一步分析。

另一种流行的用于文本分类的无监督学习算法是LDA。LDA是一种概率生成模型,假设语料库中的每个文档都是主题的混合,每个主题是词语的概率分布。LDA可以用来发现文档集合中的潜在主题,即使主题没有明确标记。

最后,词嵌入是一种流行的无监督学习技术,用于文本分类。词嵌入是词语的密集向量表示,根据它们出现的上下文捕获其语义意义。它们可以用来识别相似词语,并找出词语之间的关系,这对于文本相似性和推荐系统等任务可能很有用。常见的词嵌入模型包括Word2Vec和GloVe。

Word2Vec是一种流行的算法,用于生成词嵌入,即在高维空间中词语的向量表示。该算法由Google的研究团队在2013年开发,由Tomas Mikolov领导。Word2Vec背后的主要思想是,在相似上下文中出现的词语往往具有相似的意义。

该算法以大量文本语料库作为输入,并为词汇表中的每个单词生成一个向量表示。这些向量通常是高维的(例如,100或300维),可用于执行各种NLP任务,如情感分析、文本分类和机器翻译。

Word2Vec使用了两种主要架构:CBOWskip-gram。在CBOW架构中,算法试图根据上下文单词的窗口预测目标词。在skip-gram架构中,算法试图根据目标词预测上下文词。训练目标是最大化目标词或上下文词在给定输入下的可能性。

Word2Vec在NLP社区中得到广泛应用,并在各种基准测试中显示出最先进的性能。它也被用于许多实际应用中,如推荐系统、搜索引擎和聊天机器人。

半监督学习

半监督学习是介于监督学习和无监督学习之间的机器学习范式。它利用标记数据和未标记数据的组合进行训练,这在底层模型需要昂贵或耗时的标记数据时特别有用。这种方法允许模型利用未标记数据中的信息来提高其在分类任务上的性能。

在文本分类的背景下,当我们拥有有限的标记文档但大量未标记文档时,半监督学习可以是有益的。目标是利用未标记数据中包含的信息来提高分类器的性能。

有几种常见的半监督学习算法,包括标签传播和Co-training。我们将在下一节中更详细地讨论这些算法。

Label propagation

Label propagation是一种基于图的半监督学习算法。它使用标记和未标记数据点构建一个图,每个数据点表示为一个节点,边表示节点之间的相似性。该算法通过根据它们的相似性从标记节点传播标签到未标记节点来工作。

关键思想是相似的数据点应该有相似的标签。算法首先为未标记的节点分配初始标签概率,通常基于它们与标记节点的相似性。然后,一个迭代过程将把这些概率传播到整个图中,直到收敛。最终的标签概率用于对未标记的数据点进行分类。

Co-training

Co-training 是另一种半监督学习技术,它在数据的不同视角上训练多个分类器。视角是特征的一个子集,对于学习任务来说是足够的,并且给定类别标签时是条件独立的。基本思想是使用一个分类器的预测来标记一些未标记的数据,然后使用这些新标记的数据来训练另一个分类器。这个过程是迭代进行的,每个分类器通过改进另一个分类器来提高性能,直到满足停止条件。

要在特定领域应用半监督学习,让我们考虑一个医学领域,我们希望将科学文章分类到不同的类别中,例如心脏病学神经病学肿瘤学。假设我们有一小部分标记的文章和一大群未标记的文章。

一种可能的方法是创建一个文章图,其中节点代表文章,边代表文章之间的相似性。相似性可以基于各种因素,例如使用的单词、覆盖的主题或文章之间的引用网络。在传播标签后,我们可以根据最终的标签概率对未标记的文章进行分类。

或者,我们可以通过将特征分为两个视角来使用 co-training,例如文章的摘要和全文。我们将训练两个分类器,每个视角一个,并迭代地使用另一个分类器在未标记数据上的预测来更新分类器。

在这两种情况下,目标都是利用未标记数据中的信息来提高特定领域的分类器性能。

在本章中,我们将详细阐述监督文本分类和主题建模。

使用 one-hot 编码向量表示进行句子分类

One-hot 编码向量表示是一种表示分类数据(如单词)为二进制向量的方法。在文本分类的上下文中,one-hot 编码可以用来将文本数据表示为分类模型的数值输入特征。以下是使用 one-hot 编码向量进行文本分类的详细解释。

文本预处理

第一步是预处理文本数据,如前一章所述。预处理的主要目标是将原始文本转换为更结构化和一致的格式,以便机器学习算法可以轻松理解和处理。以下是文本预处理对于 one-hot 编码向量分类的几个原因:

  • 噪声减少:原始文本数据通常包含噪声,例如拼写错误、拼写错误、特殊字符和格式不一致。预处理有助于清理文本,减少可能对分类模型性能产生负面影响的噪声。

  • 降维:one-hot 编码向量表示具有高维度,因为数据集中每个唯一的单词对应一个单独的特征。预处理技术,如停用词去除、词干提取或词形还原,可以帮助减少词汇表的大小,从而降低特征空间的维度。这可以提高分类算法的效率并降低过拟合的风险。

  • 一致的表示:将所有文本转换为小写并应用词干提取或词形还原确保具有相同意义或词根形式的单词在 one-hot 编码向量中保持一致表示。这可以帮助分类模型从数据中学习到更有意义的模式,因为它不会将同一单词的不同形式视为不同的特征。

  • 处理无关信息:预处理可以帮助移除无关信息,如 URL、电子邮件地址或数字,这些信息可能不会对分类任务做出贡献。移除此类信息可以提高模型专注于文本中有意义单词和模式的能力。

  • 提高模型性能:预处理文本数据可以提高分类模型的表现,因为模型将从更干净、更有结构的数据集中学习。这可能导致准确率的提高以及对新、未见文本数据的泛化能力。

一旦我们预处理完文本,我们就可以开始提取文本中的单词了。我们称这个任务为词汇构建。

词汇构建

构建一个包含预处理文本中所有唯一单词的词汇表。为词汇表中的每个单词分配一个唯一的索引。

词汇构建是准备文本数据以进行 one-hot 编码向量分类的一个关键步骤。词汇是预处理文本数据中所有唯一单词(标记)的集合。它作为创建每个文档的 one-hot 编码特征向量的基础。以下是 one-hot 编码向量分类的词汇构建过程的详细说明:

  1. 创建一组唯一单词:在预处理文本数据后,从所有文档中收集所有单词并创建一组唯一单词。这个集合将代表词汇表。词汇表中单词的顺序不重要,但必须跟踪分配给每个单词的索引,因为它们将用于稍后创建 one-hot 编码向量。

    例如,考虑以下预处理数据集由两个文档组成:

    • 文档 1: “apple banana orange”

    • 文档 2: “banana grape apple”

    该数据集的词汇表将是 {“apple”, “banana”, “orange”, “grape”}。

  2. 为单词分配索引:一旦你有了唯一单词的集合,为词汇表中的每个单词分配一个唯一的索引。这些索引将用于创建每个文档的 one-hot 编码向量。

    使用前面的示例,你可能分配以下索引:

    • “apple”:0

    • “banana”:1

    • “orange”:2

    • “grape”:3

One-hot 编码

使用构建的词汇表和分配的索引,你现在可以为数据集中的每个文档创建独热编码的向量。创建独热编码向量的一个简单方法就是使用词袋模型。对于文档中的每个单词,找到它在词汇表中的对应索引,并在独热编码向量中设置该索引的值为 1。如果一个单词在文档中多次出现,其在独热编码向量中的对应值仍然为 1。向量中的所有其他值都将为 0。

例如,使用之前提到的词汇表和索引,文档的独热编码向量如下所示:

  • 文档 1: [1, 1, 1, 0](存在苹果、香蕉和橙子)

  • 文档 2: [1, 1, 0, 1](存在苹果、香蕉和葡萄)

一旦我们得到了每个文档对应的值,我们就可以创建一个特征矩阵,其中以独热编码的向量作为行,每一行代表一个文档,每一列代表词汇表中的一个单词。这个矩阵将被用作文本分类模型的输入。例如,在之前的例子中,两个文档的特征向量如下所示:

苹果 香蕉 橙子 葡萄
文档 1 1 1 1 0
文档 2 1 1 0 1

表 5.1 – 两个文档的样本独热编码向量

请注意,通过文本预处理,拥有一个更小的词汇表有助于提高模型性能。此外,如果需要,我们可以在提取的特征向量上执行特征选择方法(如本书之前所述),以提高我们的模型性能。

虽然从单词创建独热编码向量很有用,但有时我们需要考虑两个单词相邻的存在。例如,“非常好”和“不好”可能有不同的含义。为了达到这个目标,我们可以使用 N-grams。

N-grams

N-grams 是 bag-of-words 模型的一种推广,它通过考虑连续的 n 个单词的顺序来考虑单词的顺序。N-gram 是从给定文本中连续的 n 个项目(通常是单词)的序列。例如,在句子“The cat is on the mat”中,2-grams(双词)将是“The cat”,“cat is”,“is on”,“on the”,和“the mat”。

使用 N-grams 可以帮助捕捉局部上下文和单词关系,这可能会提高分类器的性能。然而,它也增加了特征空间的维度,这可能会在计算上变得昂贵。

模型训练

在特征矩阵上训练一个机器学习模型,如逻辑回归、SVM 或神经网络,以学习独热编码文本特征与目标标签之间的关系。该模型将学会根据文档中特定单词的存在与否来预测类别标签。一旦我们决定了训练过程,我们需要执行以下任务:

  • 模型评估:使用适当的评估指标评估模型性能,例如准确率、精确率、召回率、F1分数或混淆矩阵,并使用交叉验证等技术来获得模型在未见数据上的可靠性能估计。

  • 模型应用:将训练好的模型应用于新的、未见过的文本数据。使用相同的词汇表对新的文本数据进行预处理和独热编码,然后使用模型预测类别标签。

使用独热编码向量进行文本分类的一个潜在局限性是它们没有捕捉到单词顺序、上下文或单词之间的语义关系。这可能导致性能不佳,尤其是在更复杂的分类任务中。在这种情况下,更高级的技术,如词嵌入(例如Word2Vec或GloVe)或深度学习模型(例如CNNs或RNNs),可以提供更好的文本数据表示。

总结来说,使用独热编码向量进行文本分类涉及预处理文本数据、构建词汇表、将文本数据表示为独热编码特征向量、在特征向量上训练机器学习模型,以及评估和应用模型到新的文本数据。独热编码向量表示是一种简单但有时有限的文本分类方法,对于复杂任务可能需要更高级的技术。

到目前为止,我们已经学习了使用N-gram对文档进行分类。然而,这种方法有一个缺点。文档中频繁出现的大量单词并不增加我们模型的价值。为了改进模型,已经提出了使用TF-IDF进行文本分类的方法。

使用TF-IDF进行文本分类

独热编码向量是进行分类的好方法。然而,它的一个弱点是它没有考虑不同文档中不同单词的重要性。为了解决这个问题,使用TF-IDF可能会有所帮助。

TF-IDF是一种数值统计量,用于衡量一个词在文档集合中相对于整个文档集合的重要性。它有助于反映文档中单词的相关性,不仅考虑了单词在文档中的频率,还考虑了单词在整个文档集合中的稀有度。一个词的TF-IDF值与其在文档中的频率成正比,但会因该词在整个文档集合中的频率而抵消。

下面是计算TF-IDF所涉及的数学公式的详细解释:

  • 词频(TF):一个词t在文档d中的TF表示该词在文档中出现的次数,除以文档中单词的总数。TF可以使用以下公式计算:

TF(t,d)=(Numberoftimesword′t′appearsingdocument′d′)/(Totalnumberofwordsingocument′d′)

TF 衡量一个单词在特定文档中的重要性。

  • 逆文档频率(IDF):单词 t 的 IDF 反映了该单词在整个文档集合中的稀有度。IDF 可以使用以下公式计算:

    IDF(t) = log ((集合中文档的总数) / (包含单词′t′的文档数))

    对数用于减弱 IDF 成分的效应。如果一个单词在许多文档中出现,其 IDF 值将更接近 0,而如果一个单词在较少的文档中出现,其 IDF 值将更高。

  • TF-IDF 计算:文档中单词 t 的 TF-IDF 值可以通过将文档中该单词的 TF 与整个文档集合中该单词的 IDF 相乘来计算:

TF−IDF(t,d)=TF(t,d)*IDF(t)

结果的 TF-IDF 值表示一个单词在文档中的重要性,同时考虑其在文档中的频率和在整个文档集合中的稀有度。高 TF-IDF 值表示在特定文档中更重要的单词,而低 TF-IDF 值表示在所有文档中都很常见或在特定文档中很罕见的单词。

让我们考虑一个简单的例子,将电影评论分为两类:正面和负面。我们有一个包含三个电影评论及其相应标签的小数据集,如下所示:

  • 文档 1(正面):“我喜欢这部电影。表演很棒,故事很吸引人。”

  • 文档 2(负面):“这部电影很无聊。我不喜欢这个故事,表演也很糟糕。”

  • 文档 3(正面): “一部令人惊叹的电影,拥有精彩的故事和出色的表演。”

现在,我们将使用TF-IDF对一篇新的、未见过的电影评论进行分类:

  • 文档 4(未知): “故事很有趣,表演也很出色。”

这里是我们需要执行的步骤,以便让分类器预测我们文档的类别:

  1. 步骤 1 – 预处理文本数据:对所有文档中的单词进行分词、转换为小写、去除停用词,并应用词干提取或词形还原:

    • 文档 1: “love movi act great stori captiv”

    • 文档 2: “movi bore not like stori act terribl”

    • 文档 3: “amaz movi wonder stori brilliant act”

    • 文档 4: “stori interest act good”

  2. 步骤 2 – 创建词汇表:将预处理文档中的所有唯一单词合并:

    词汇表:

  3. 步骤 3 – 计算TF和IDF值:计算每个文档中每个单词的TF和IDF。

    例如,对于文档 4 中的单词“stori”,我们有以下内容:

TF("stori",Document4)=1/4=0.25

IDF("stori")=log(4/3)≈0.287

  1. 步骤 4 – 计算TF-IDF值:计算每个文档中每个单词的TF-IDF值。

TF−IDF("stori")=0.25*0.287≈0.0717

对所有文档中的所有单词重复此过程,并创建一个包含TF-IDF值的特征矩阵。

  1. 步骤 5 – 训练分类器:将数据集分为训练集(文档 1 到 3)和测试集(文档 4)。使用训练集的TF-IDF特征矩阵及其相应的标签(正面或负面)来训练一个分类器,例如逻辑回归或SVM。

  2. 步骤 6 – 预测类别标签:使用相同的词汇对新的电影评论(文档 4)进行预处理和计算 TF-IDF 值。使用训练好的分类器根据文档 4 的 TF-IDF 特征向量预测其类别标签。

例如,如果分类器预测文档 4 为正面标签,分类结果如下:

  • 文档 4(预测:“正面”

通过遵循这些步骤,您可以使用 TF-IDF 表示来根据文档中相对于整个文档集合的词的重要性对文本文档进行分类。

总结来说,TF-IDF 值是通过 TF 和 IDF 的数学公式计算得出的。它作为衡量一个词在文档中相对于整个文档集合重要性的指标,同时考虑了该词在文档中的频率以及在整个文档中的稀有度。

使用 Word2Vec 进行文本分类

执行文本分类的一种方法是将词转换为嵌入向量,以便可以使用这些向量进行分类。Word2Vec 是执行此任务的一种知名方法。

Word2Vec

Word2Vec 是一组基于神经网络的模型,用于创建词嵌入,这些嵌入是词在连续向量空间中的密集向量表示。这些嵌入根据词在文本中出现的上下文捕获词的语义意义和关系。Word2Vec 有两种主要架构。如前所述,设计用来学习词嵌入的两种主要架构是 CBOWskip-gram。两种架构都是通过预测周围上下文中的词来学习词嵌入的:

  • CBOW:CBOW 架构旨在根据周围上下文词预测目标词。它以上下文词嵌入的平均值作为输入,并预测目标词。CBOW 训练速度快,适用于小型数据集,但对于不常见的词可能不够准确。

    在 CBOW 模型中,目标是最大化观察目标词给定上下文词的平均对数概率:

ObjectiveCBow=1T∑contextlog(P(target|context))

这里,T 是文本中的总词数,P(target | context) 是在给定上下文词的情况下观察目标词的概率,它使用 softmax 函数计算:

Ptarget|context=evtargetT∙vcontext∑ieviT∙vcontext

这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubsupmml:mrow<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mia</mml:mi>mml:mir</mml:mi>mml:mig</mml:mi>mml:mie</mml:mi>mml:mit</mml:mi></mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msubsup></mml:math> 是目标词的输出向量(词嵌入),<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>mml:mrowmml:mic</mml:mi>mml:mio</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mix</mml:mi>mml:mit</mml:mi></mml:mrow></mml:msub></mml:math> 是上下文词的平均输入向量(上下文词嵌入),分母中的求和遍历了词汇表中的所有词。

  • Skip-gram:skip-gram 架构旨在根据目标词预测周围的上下文词。它以目标词嵌入作为输入并预测上下文词。Skip-gram 在大型数据集上表现良好,并能更准确地捕捉不常见词的意义,但与 CBOW 相比,它可能训练速度较慢。

    在 skip-gram 模型中,目标是最大化在给定目标词的情况下观察上下文词的平均对数概率:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miO</mml:mi>mml:mib</mml:mi>mml:mij</mml:mi>mml:mie</mml:mi>mml:mic</mml:mi>mml:mit</mml:mi>mml:mii</mml:mi>mml:miv</mml:mi>mml:msubmml:mrowmml:mie</mml:mi></mml:mrow>mml:mrowmml:miS</mml:mi>mml:mik</mml:mi>mml:mii</mml:mi>mml:mip</mml:mi>mml:mo-</mml:mo>mml:miG</mml:mi>mml:mir</mml:mi>mml:mia</mml:mi>mml:mim</mml:mi></mml:mrow></mml:msub>mml:mo=</mml:mo>mml:mfracmml:mrowmml:mn1</mml:mn></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:mfrac>mml:mrowmml:munder<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mic</mml:mi>mml:mio</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mix</mml:mi>mml:mit</mml:mi></mml:mrow></mml:munder>mml:mrow<mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">o</mml:mi><mml:mi mathvariant="normal">g</mml:mi>mml:mo⁡</mml:mo>mml:mo(</mml:mo>mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:mic</mml:mi>mml:mio</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mix</mml:mi>mml:mit</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mia</mml:mi>mml:mir</mml:mi>mml:mig</mml:mi>mml:mie</mml:mi>mml:mit</mml:mi></mml:mrow></mml:mfenced>mml:mo)</mml:mo></mml:mrow></mml:mrow></mml:math>

在这里,T 是文本中的总单词数,P(context | target) 是在给定目标词的情况下观察上下文词的概率,该概率使用 softmax 函数计算:

Pcontext|target=evcontextT∙vtarget∑ieviT∙vtarget

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubsupmml:mrow<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>mml:mrowmml:mic</mml:mi>mml:mio</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mix</mml:mi>mml:mit</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msubsup></mml:math>是上下文词的输出向量(上下文词嵌入),<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi>mml:mia</mml:mi>mml:mir</mml:mi>mml:mig</mml:mi>mml:mie</mml:mi>mml:mit</mml:mi></mml:mrow></mml:msub></mml:math>是目标词的输入向量(词嵌入),分母中的求和遍历词汇表中的所有词。

CBOW和skip-gram的训练过程都涉及遍历文本,并使用随机梯度下降SGD)和反向传播来更新输入和输出权重矩阵,以最小化预测词和实际词之间的差异。学习到的输入权重矩阵包含词汇表中每个词的词嵌入。

使用Word2Vec进行文本分类

使用Word2Vec进行文本分类涉及使用Word2Vec算法创建词嵌入,然后训练一个机器学习模型来根据这些嵌入对文本进行分类。以下步骤详细概述了该过程,包括数学方面:

  1. 文本预处理:通过分词、小写化、去除停用词以及词干提取或词形还原来清洁和预处理文本数据。

  2. 训练Word2Vec模型:在预处理后的文本数据上训练一个Word2Vec模型(无论是CBOW还是Skip-Gram),以创建词嵌入。Word2Vec算法学习根据上下文(CBOW)预测目标词,或者根据目标词预测上下文词(skip-gram)。训练目标是最大化在给定目标词的情况下观察上下文词的平均对数概率:

Objective=1T∑contextlog(Pcontext|target)

在这里,T 是文本中的总单词数,P(context | target) 是在给定目标词的情况下观察上下文词的概率,这使用softmax函数来计算:

Pcontext|target=evcontextT∙vtarget∑ieviT∙vtarget

在这里,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubsupmml:mrow<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>mml:mrowmml:mic</mml:mi>mml:mio</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mix</mml:mi>mml:mit</mml:mi></mml:mrow>mml:mrowmml:miT</mml:mi></mml:mrow></mml:msubsup></mml:math>是上下文词的输出向量(上下文词嵌入),<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="bold">v</mml:mrow>mml:mrowmml:mit</mml:mi>mml:mia</mml:mi>mml:mir</mml:mi>mml:migmml:mie</mml:mi>mml:mit</mml:mrow></mml:msub></mml:math>是目标词的输入向量(词嵌入),分母中的求和遍历了词汇表中的所有单词。

  1. 创建文档嵌入:对于数据集中的每个文档,通过计算文档中单词的词嵌入的平均值来计算文档嵌入:

DocumentEmbedding=1N∑iWordEmbeddingi

在这里,N是文档中的单词数量,求和遍历文档中的所有单词。请注意,根据我们的经验,使用Word2Vec进行文本分类的方法仅在文档长度较短时才有效。如果你有较长的文档或文档中有相反的词语,这种方法表现不佳。一个替代方案是将Word2Vec和CNN结合使用来获取词嵌入,然后将这些嵌入作为CNN的输入。

  1. 模型训练:使用文档嵌入作为特征来训练一个机器学习模型,如逻辑回归、SVM或神经网络,用于文本分类。该模型学习根据文档嵌入预测类别标签。

  2. 模型评估:使用适当的评估指标(如准确率、精确率、召回率、F1分数或混淆矩阵)评估模型的性能,并使用交叉验证等技术来获得模型在未见数据上的可靠性能估计。

  3. 模型应用:将训练好的模型应用于新的、未见过的文本数据。使用相同的Word2Vec模型和词汇表对新的文本数据进行预处理和计算文档嵌入,并使用该模型预测类别标签。

总结来说,使用Word2Vec进行文本分类涉及使用Word2Vec算法创建词嵌入,平均这些嵌入以创建文档嵌入,并训练一个机器学习模型根据这些文档嵌入对文本进行分类。Word2Vec算法通过最大化观察给定目标词的上下文词的平均对数概率来学习词嵌入,在这个过程中捕捉词语之间的语义关系。

模型评估

评估文本分类模型的性能对于确保它们达到期望的准确性和泛化水平至关重要。通常使用多种指标和技术来评估文本分类模型,包括准确率、精确率、召回率、F1分数和混淆矩阵。让我们更详细地讨论这些指标:

  • 准确性:准确性是分类任务中最直接的指标。它衡量所有分类记录中正确分类的记录数量。它被定义为如下:

Accuracy=(TruePositives+TrueNegatives)(TruePositives+TrueNegatives+FalsePositives+FalseNegatives)

虽然准确性容易理解,但它可能不是不平衡数据集的最佳指标,因为在不平衡数据集中,多数类可以主导指标的值。

  • 精确度:精确度衡量正确识别的正例与模型预测为正的总实例的比例。它也被称为阳性预测值PPV)。在关联到错误正例成本较高的场景中,精确度非常有价值。精确度被定义为如下:

[[OMML-EQ-21D]]

  • 召回率:召回率,也称为灵敏度或真正例率TPR),评估正确识别的正例与总实际正例的比例。当错误负例的成本很高时,召回率非常有用。数学上,它被定义为如下:

[[OMML-EQ-22D]]

  • F1 分数:F1 分数是精确度和召回率的调和平均值,将这两个指标整合为一个统一的价值。在不平衡数据集的上下文中,它是一个重要的指标,因为它考虑了错误正例和错误负例。F1 分数从 0 到 1 变化,1 代表最佳结果,F1 分数的数学表达式如下:

F1Score=2Preci<mi}sion∙RecallPreci<mi}sion+Recall

当处理多类分类问题时,我们有F1微平均和F1宏平均。F1微平均和F1宏平均是计算多类或多标签分类问题F1分数的两种方法。它们以不同的方式聚合精确度和召回率,导致对分类器性能的不同解释。让我们更详细地讨论每种方法:

  • F1宏平均:F1宏平均独立计算每个类的F1分数,然后取这些值的平均值。这种方法将每个类视为同等重要,不考虑类不平衡。从数学上讲,F1宏平均定义为以下:

F1Macro=1n∑iF1i

在这里,n 是类的数量,而 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miF</mml:mi>mml:mn1</mml:mn></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub></mml:math> 是第i个类的F1分数。

F1宏平均特别适用于当你想要评估分类器在所有类上的性能而不给多数类赋予更多权重时。然而,当类分布高度不平衡时,它可能不适用,因为它可能会提供一个过于乐观的模型性能估计。

  • F1微平均:另一方面,F1微平均通过计算所有类的全局精确度和召回率值来聚合所有类的贡献以计算F1分数。它通过考虑每个类中的实例数量来考虑类不平衡。从数学上讲,F1微平均定义为以下:

    F1 微型评估器的计算公式

    这里,全局精度和全局召回率的计算方法如下:

全局精度和全局召回率的计算如下

全局召回率的计算公式

F1 微型评估器在您希望评估分类器的整体性能并考虑类别分布时非常有用,尤其是在处理不平衡数据集时。

总结来说,F1宏平均和F1微平均是计算多类或多标签分类问题F1分数的两种方法。F1宏平均将每个类别视为同等重要,不考虑类别分布,而F1微平均通过考虑每个类别的实例数量来考虑类别不平衡。F1宏平均和F1微平均的选择取决于具体问题以及是否将类别不平衡视为一个重要的考虑因素。

混淆矩阵

混淆矩阵作为一种表格形式的表示,展示了分类模型做出的真实阳性、真实阴性、假阳性和假阴性预测的数量。这个矩阵提供了对模型有效性的细致视角,使得可以全面理解其优势和劣势。

对于二元分类问题,混淆矩阵的排列如下:

实际/预测 (预测) 阳性 (预测) 阴性
(实际) 阳性 真阳性 假阴性
(实际) 阴性 假阳性 真阴性

表5.2 – 混淆矩阵 – 通用视图

对于多类分类问题,混淆矩阵扩展到包括每个类别的真实和预测计数。对角线元素代表正确分类的实例,而偏对角线元素代表错误分类。

总结来说,评估文本分类模型涉及使用各种指标和技术,如准确率、精确率、召回率、F1分数和混淆矩阵。选择适当的评估指标取决于具体问题、数据集特征以及假阳性和假阴性之间的权衡。使用多个指标评估模型可以提供对其性能的更全面理解,并有助于指导进一步的改进。

过拟合和欠拟合

过拟合和欠拟合是机器学习模型训练过程中,包括文本分类模型训练中常见的两个问题。它们都与模型对新、未见数据的泛化能力有关。本节将解释过拟合和欠拟合的发生情况以及如何防止它们。

过拟合

过拟合发生在模型过度适应训练数据的复杂性时。在这种情况下,模型捕捉到噪声和随机波动,而不是辨别基本模式。因此,尽管模型可能在训练数据上表现出高性能,但当应用于未见数据(如验证集或测试集)时,其有效性会降低。

为了避免文本分类中的过拟合,可以考虑以下策略:

  • 正则化:引入正则化技术,例如 <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="script">l</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math>l2L2正则化,这会在损失函数中添加惩罚,从而阻止模型过于复杂。

  • 早停法:在此方法中,我们监控模型在验证集上的性能,一旦验证集上的性能开始变差,即使训练集上的模型性能在提高,我们也停止训练过程。这有助于我们防止过拟合。

  • 特征选择:通过选择最有信息量的特征或使用PCA或LSA等降维技术来减少用于分类的特征数量。

  • 集成方法:通过结合多个模型,例如袋装法或提升法,通过平均它们的预测来减少过拟合。

  • 交叉验证:使用k折交叉验证来获得对未见数据上模型性能的更可靠估计,并相应地微调模型超参数。

接下来,我们将介绍欠拟合问题。

欠拟合

当模型过于简单且无法捕捉数据中的潜在模式时,就会发生欠拟合。因此,模型在训练和测试数据上的性能都较低。模型过于简单,无法表示数据的复杂性,并且无法很好地泛化。

为了避免在文本分类中发生欠拟合,可以考虑以下策略:

  • 增加模型复杂性:使用更复杂的模型,例如更深的神经网络,以捕捉数据中的更复杂模式。

  • 特征工程:创建新的、有信息量的特征,帮助模型更好地理解文本数据中的潜在模式,例如添加N-gram或使用词嵌入。

  • 超参数调整:优化模型超参数,例如学习率、层数或隐藏单元数,以提高模型从数据中学习的能力。我们将在下一节中解释超参数调整以及执行此任务的不同方法。

  • 增加训练数据:如果可能,收集更多标记数据用于训练,因为更多的例子可以帮助模型更好地学习潜在模式。

  • 减少正则化:如果模型过度正则化,考虑减少正则化强度,使模型变得更加复杂,更好地拟合数据。

总结来说,过拟合和欠拟合是文本分类中常见的两个问题,它们会影响模型泛化到新数据的能力。避免这些问题涉及平衡模型复杂性、使用适当的特征、调整超参数、应用正则化和监控模型在验证集上的性能。通过解决过拟合和欠拟合问题,可以提高文本分类模型的表现和泛化能力。

超参数调整

构建一个有效的分类模型的一个重要步骤是超参数调整。超参数是在训练之前定义的模型参数;它们在训练过程中不会改变。这些参数决定了模型架构和行为。可以使用的某些超参数包括学习率和迭代次数。它们可以显著影响模型的表现和泛化能力。

文本分类中超参数调整的过程涉及以下步骤:

  1. 定义超参数及其搜索空间:确定您想要优化的超参数,并指定每个超参数的可能值范围。文本分类中常见的超参数包括学习率、层数、隐藏单元数量、dropout率、正则化强度以及特征提取参数,如N-gram或词汇大小。

  2. 选择搜索策略:选择一种探索超参数搜索空间的方法,例如网格搜索、随机搜索或贝叶斯优化。网格搜索系统地评估所有超参数值的组合,而随机搜索在搜索空间内随机采样组合。贝叶斯优化使用概率模型来指导搜索,根据模型的预测平衡探索和利用。

  3. 选择评估指标和方法:选择一个最能代表您文本分类任务目标的性能指标,例如准确率、精确率、召回率、F1分数或ROC曲线下的面积。同时,选择一个评估方法,如k折交叉验证,以获得模型在未见数据上的性能的可靠估计。

  4. 执行搜索:对于每个超参数值的组合,在训练数据上训练一个模型,并使用所选的指标和评估方法评估其性能。记录最佳性能的超参数组合。

  5. 选择最佳超参数:搜索完成后,选择在评估指标上产生最佳性能的超参数组合。使用这些超参数在整个训练集上重新训练模型。

  6. 在测试集上评估:使用保留的测试集评估最终模型在优化超参数下的性能,以获得其泛化能力的无偏估计。

超参数调整通过找到在所选评估指标上产生最佳模型性能的参数组合来影响模型的性能。调整超参数可以帮助解决诸如过拟合和欠拟合等问题,平衡模型复杂性,并提高模型对新数据的泛化能力。

超参数调整是文本分类中的一个关键过程,涉及在选择的评估指标上搜索最优模型参数组合以最大化性能。通过仔细调整超参数,你可以提高文本分类模型的性能和泛化能力。

应用文本分类的附加主题

在现实世界中,应用文本分类涉及各种实际考虑和挑战,这些挑战源于现实世界数据的性质和问题要求。一些常见问题包括处理不平衡数据集、处理噪声数据和选择合适的评估指标。

让我们更详细地讨论这些内容。

处理不平衡数据集

文本分类任务经常遇到不平衡数据集的问题,其中某些类别的实例数量明显多于其他类别。这种不平衡可能导致模型偏向,擅长预测多数类,但在准确分类少数类方面表现不佳。为了处理不平衡数据集,可以考虑以下策略:

  • 重采样:你可以对少数类进行过采样,对多数类进行欠采样,或者使用两者的组合来平衡类别分布。

  • 加权损失函数:在损失函数中为少数类分配更高的权重,使模型对少数类的误分类更加敏感。

  • 集成方法:使用关注少数类的集成技术,如袋装或提升。例如,你可以使用带有袋装的随机欠采样或成本敏感的提升算法。

  • 评估指标:选择对类别不平衡不那么敏感的评估指标,如精确度、召回率、F1分数或ROC曲线下的面积,而不是准确度。

  • 处理噪声数据:现实世界的文本数据通常很嘈杂,包含拼写错误、语法错误或不相关信息。噪声数据可能会对文本分类模型的性能产生负面影响。

为了处理噪声数据,可以考虑以下策略:

  • 预处理:通过纠正拼写错误、删除特殊字符、扩展缩写词和将文本转换为小写来清洗文本数据。

  • 停用词去除:移除没有太多意义的常见词,例如“the”、“is”、“and”等。

  • 词干提取或词形还原:将单词还原为其基本形式,以最小化形态变化的影响。

  • 特征选择:使用如卡方检验或互信息等技术来选择最有信息量的特征,减少噪声或不相关特征的影响

无论我们是否在处理不平衡数据,我们都需要评估我们的模型,选择合适的指标来评估我们的模型非常重要。接下来,我们将解释如何选择最佳的指标来评估我们的模型。

选择合适的评估指标

选择合适的评估指标对于衡量您的文本分类模型性能和指导模型改进至关重要。

选择评估指标时考虑以下因素:

  • 问题要求:选择与您的文本分类任务具体目标一致的指标,例如最小化误报或误判

  • 类别不平衡:对于不平衡的数据集,使用考虑类别不平衡的指标,如精确率、召回率、F1分数或ROC曲线下的面积,而不是准确率

  • 多类或多标签问题:对于多类或多标签分类任务,使用如微平均和宏平均F1分数等指标,这些指标根据问题的要求以不同的方式聚合精确率和召回率

总结来说,文本分类中的实际考虑因素包括处理不平衡数据集、处理噪声数据以及选择合适的评估指标。解决这些问题可以帮助提高文本分类模型的表现力和泛化能力,并确保它们满足问题的具体要求。

主题建模——无监督文本分类的一个特定用例

主题建模是一种无监督机器学习技术,用于在大量文档集中发现抽象主题或主题。它假设每个文档可以表示为多个主题的混合,每个主题表示为词分布。主题建模的目的是找到潜在的主题及其词分布,以及每个文档的主题比例。

有几种主题建模算法,但其中最受欢迎和最广泛使用的是LDA。我们将详细讨论LDA,包括其数学公式。

LDA

LDA是一种生成概率模型,它假设每个文档的以下生成过程:

  1. 选择文档中的词数。

  2. 从参数α的Dirichlet分布中选择文档的主题分布(θ)。

  3. 对于文档中的每个词,执行以下操作:

    1. 从主题分布(θ)中选择一个主题(z)。

    2. 从所选主题(φ)的词分布中选择一个词(w),该词分布是该主题的词分布,由参数β的Dirichlet分布抽取。

生成过程是LDA(Latent Dirichlet Allocation)用来从假设的主题中逆向工程原始文档的理论模型。

LDA 的目标是找到最佳解释观察到的文档的主题-单词分布 (φ) 和文档-主题分布 (θ)。

从数学上讲,LDA 可以用以下符号描述:

  • M: 文档数量

  • N: 文档中的单词数量

  • K: 主题数量

  • α: 文档-主题分布的 Dirichlet 先验,它影响文档内主题的稀疏性

  • β: 主题-单词分布的 Dirichlet 先验,它影响主题内单词的稀疏性

  • θ: 文档-主题分布(M × K 矩阵)

  • φ: 主题-单词分布(K × V 矩阵,其中 V 是词汇量)

  • z: 每个文档中每个单词的主题分配(M × N 矩阵)

  • w: 文档中观察到的单词(M × N 矩阵)

在给定主题-单词分布 (φ) 和文档-主题分布 (θ) 的情况下,文档中主题分配 (z) 和单词 (w) 的联合概率可以表示如下:

Pz,w|θ,φ=∏i=1M∏j=1MPwij|φ,zijPzij|θi

LDA 的目标是最大化在 Dirichlet 先验 α 和 β 下观察到的单词的概率:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:miα</mml:mi>mml:mo,</mml:mo>mml:miβ</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:mrow<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:mrow<mml:mo stretchy="false">∫</mml:mo>mml:mrowmml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:miθ</mml:mi>mml:mo,</mml:mo>mml:miφ</mml:mi></mml:mrow></mml:mfenced>mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:miα</mml:mi></mml:mrow></mml:mfenced>mml:miP</mml:mi><mml:mfenced separators="|">mml:mrowmml:miφ</mml:mi></mml:mrow>mml:mrowmml:miβ</mml:mi></mml:mrow></mml:mfenced>mml:mid</mml:mi>mml:miθ</mml:mi>mml:mid</mml:mi>mml:miφ</mml:mi></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:math>

然而,由于对潜在变量 θ 和 φ 的积分,直接计算似然是不切实际的。因此,LDA 使用近似推理算法,如吉布斯采样或变分推理,来估计后验分布 P(θ | w, α, β) 和 P(φ | w, α, β)。

一旦估计了后验分布,我们就可以获得文档-主题分布(θ)和主题-词分布(φ),这些可以用来分析发现的主题及其词分布,以及每个文档的主题比例。

让我们考虑一个简单的主题建模示例。

假设我们有一组三个文档:

  • 文档 1:“我喜欢和朋友们踢足球。”

  • 文档 2:“足球比赛激烈而兴奋。”

  • 文档 3:“我的新笔记本电脑电池寿命和性能惊人。”

我们希望在这个文档集中发现两个主题(K = 2)。以下是我们需要执行的步骤:

  1. 预处理:首先,我们需要预处理文本数据,这通常涉及分词、停用词去除和词干提取/词形还原(这在本章前面已经解释过)。在这个例子中,为了简单起见,我们将跳过这些步骤,并假设我们的文档已经预处理过。

  2. 初始化:选择狄利克雷先验的初始值 α 和 β。例如,我们可以设置 α = [1, 1] 和 β = [0.1, 0.1, ..., 0.1](假设一个 V 维向量,每个词汇的值为 0.1)。

  3. 随机主题分配:随机为每个文档中的每个词分配一个主题(1 或 2)。

  4. 迭代推理(例如,吉布斯采样或变分推理):迭代更新主题分配和主题-词分布以及文档-主题分布(φ 和 θ),直到收敛或达到固定的迭代次数。这个过程细化了分配和分布,最终揭示了潜在的主题结构。

  5. 解释:在算法收敛或达到最大迭代次数后,我们可以通过查看每个主题的最可能词和每个文档的最可能主题来解释发现的主题。

    对于我们的例子,LDA 可能会发现以下主题:

    • 主题 1

    • 主题 2

    使用这些主题,文档-主题分布(θ)可能看起来像这样:

    • <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> = [0.9, 0.1](文档 1 有 90% 关于主题 1,10% 关于主题 2)

    • <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:math> = [0.8, 0.2](文档2有80%关于主题1,20%关于主题2)

    • <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miθ</mml:mi></mml:mrow>mml:mrowmml:mn3</mml:mn></mml:mrow></mml:msub></mml:math> = [0.1, 0.9](文档3有10%关于主题1,90%关于主题2)

在这个例子中,主题1似乎与足球和体育相关,而主题2似乎与技术和小工具相关。每个文档的主题分布显示,文档1和2主要关于足球,而文档3是关于技术的。

请注意,这是一个简化的例子,现实世界的数据需要更复杂的预处理和更多的迭代次数以收敛。

我们现在可以讨论在工作和研究环境中构建完整项目的范式。

实际世界中的NLP文本分类机器学习系统设计

本节将专注于我们讨论的各种方法的实际实施。它将围绕Python代码展开,作为完整的管道。

为了提供一个全面的学习体验,我们将讨论典型机器学习项目的整个旅程。图5.1展示了机器学习项目的不同阶段:

图5.1 – 典型机器学习项目的范式

图5.1 – 典型机器学习项目的范式

让我们以类似行业典型项目的方式分解这个问题。

商业目标

无论是商业还是研究环境中的机器学习项目,都源于一个原始目标,这个目标通常是定性的而不是技术的。

这里有一个例子:

  1. “我们需要知道哪些患者处于更高的风险。”

  2. “我们希望最大化我们广告的参与度。”

  3. “我们需要自动驾驶汽车在有人走到它前面时发出警报。”

接下来是技术目标。

技术目标

原始目标需要被翻译成技术目标,如下所示:

  1. “我们将处理每位患者的医疗记录,并基于实现风险的历史构建一个风险估计器。”

  2. “我们将收集去年所有广告的数据,并构建一个回归器来根据广告的特征估计参与度水平。”

  3. “我们将收集由汽车前摄像头拍摄的一组图像,并将这些图像展示给访问我们网站的在线用户,告诉他们这是出于安全原因,并且他们需要点击显示人类的区域以证明他们不是机器人。然而,在实践中,我们将收集他们的自由标签用于训练,开发一个用于人类的计算机视觉分类器,而不会给他们任何信用。”

虽然原始的商业或研究目标是一个开放性问题,但技术目标反映了一个可执行的计划。然而,请注意,任何给定的技术目标只是与原始商业或研究目标一致的多项潜在解决方案之一。理解原始目标并将其转化为技术目标是技术权威(如CTO、ML经理或高级开发者)的责任。此外,技术目标可能会在后续阶段进行细化甚至替换。形成技术目标之后的下一步是为其制定计划。

初步的高级系统设计

为了实现技术目标,我们需要制定一个计划来决定哪些数据将被用于输入到ML系统中,以及ML系统的预期输出是什么。在项目的早期阶段,可能会有几个被认为是能够指示所需输出的潜在数据来源。

在前面提到的三个示例之后,以下是一些数据描述的示例:

  1. 输入数据将是patient_records SQL表的A、B和C列,风险将评估为1/N,其中N是从给定时刻到患者在急诊室出现所经过的天数。

  2. 输入数据将是广告的几何和颜色描述,参与度将是广告每天收到的点击次数。

  3. 输入数据是用于输入到计算机视觉神经网络分类器的汽车前摄像头图像,输出数据将是图像是否捕捉到人。

选择度量标准

在定义一个潜在的解决方案方法时,应额外注意确定最佳的度量标准来关注,也称为目标函数或误差函数。这是评估解决方案成功与否的度量标准。将此度量标准与原始的商业或研究目标联系起来是很重要的。

根据前面的示例,我们可能有以下内容:

  1. 最小化70百分位置信区间。

  2. 最小化平均绝对误差。

  3. 在固定召回率的情况下最大化精度。这个固定的召回率理想情况下将由业务领导或法律团队决定,形式为“系统必须至少捕获99.9%的人站在车前的案例。”

现在我们有一个初步的计划,我们可以探索数据并评估设计的可行性。

探索

探索分为两个部分——探索数据和探索设计的可行性。让我们更深入地了解一下。

数据探索

数据并不总是完美适合我们的目标。我们在前面的章节中讨论了一些数据不足之处。特别是,自由文本通常因存在许多异常现象而臭名昭著,如编码、特殊字符、拼写错误等。在探索我们的数据时,我们希望揭露所有这些现象,并确保数据可以被转换成服务于目标的形式。

可行性研究

在这里,我们希望前瞻性地识别计划设计预期成功的代理。虽然对于某些问题有已知的预期成功的代理,但在商业和特别是研究环境中,大多数问题需要大量的经验和独创性来提出初步的成功代理。

一个非常简单的案例是一个只有一个输入变量和一个输出变量的简单回归问题。比如说,自变量是你流媒体服务目前拥有的活跃观众数量,因变量是公司服务器达到最大容量的风险。初步的设计计划将是构建一个估算任何给定时刻风险的回归器。一个成功的回归器可行性的强大代理可能是计算历史数据点的线性相关性。基于样本数据计算线性相关性既简单又快捷,如果其结果接近1(或在我们的业务问题不同的情况下为-1),那么这意味着线性回归器肯定能成功,因此,它是一个很好的代理。然而,请注意,如果线性相关性接近0,这并不一定意味着回归器会失败,只是线性回归会失败。在这种情况下,应该推迟到不同的代理。

回顾我们的用例 - 在Jupyter Notebook中进行NLP分类的机器学习系统设计部分,我们将回顾我们的代码解决方案。我们还将提出一种评估文本分类器可行性的方法。该方法旨在模拟输入文本与输出类别之间的关系。但由于我们希望该方法适用于文本变量而不是数值变量,我们将回到原点,计算输入文本与输出类别之间的统计依赖性度量。统计依赖性是变量之间关系的最基本度量,因此不需要它们中的任何一个必须是数值的。

假设可行性研究成功,我们可以继续实施机器学习解决方案。

实施机器学习解决方案

这部分是机器学习开发者的专业知识发挥作用的环节。对于这一过程有不同的步骤,开发者会根据问题选择哪些步骤是相关的——无论是数据清洗、文本分割、特征设计、模型比较还是指标选择。

我们将在回顾我们已解决的特定用例时详细阐述这一点。

评估结果

我们根据选择的指标来评估解决方案。这部分需要一些经验,因为机器学习开发者通常会随着时间的推移而变得更好。这项任务的主要陷阱是设置结果客观评估的能力。这种客观评估是通过将完成的模型应用于它之前从未“见过”的数据来完成的。但往往那些刚开始应用机器学习的人会发现,在看到保留集的结果后,他们的设计得到了改进。这导致了一个反馈循环,其中设计实际上被调整以适应不再保留的集。虽然这确实可以改进模型和设计,但它削弱了提供模型在现实世界中实施时表现客观预测的能力。在现实世界中,它将看到真正保留且未进行过拟合的数据。

已完成并交付

通常情况下,当设计完成、实施完成,并且结果令人满意时,工作就会呈现在商业实施中,或者在研究环境中,用于发表。在商业环境中,实施可以采取不同的形式。

其中一种最简单的形式是,输出被用来提供业务洞察。其目的是展示。例如,当评估营销活动对销售增长贡献了多少时,机器学习团队可能会计算该贡献度量的估计值,并将其呈现给管理层。

另一种实施形式是在实时仪表板中。例如,模型计算患者进入急诊室的预测风险,并且它每天都会这样做。结果被汇总,并在医院仪表板上展示一个图表,以显示未来30天内每天预计进入急诊室的人数。

一种更高级且更常见的形式是,当数据输出被引导以便可以输入到下游任务中时。然后,模型将在生产中实施,成为更大生产管道中的一个微服务。一个例子是,当分类器评估你公司Facebook页面上每篇帖子时。当它识别出冒犯性语言时,它会输出一个检测信号,然后将其传递到管道中的另一个系统,该系统会删除该帖子并可能阻止该用户。

代码设计

代码的设计应在工作完成后符合代码的目的。根据之前提到的不同实施形式,某些实施要求特定的代码结构。例如,当完成的代码在更大的、已经存在的管道中交付给生产时,生产工程师将决定对机器学习团队的限制。这些限制可能涉及计算和时序资源,但也会涉及代码设计。通常,基本的代码文件,如.py文件,是必要的。

就像代码用于展示的情况一样,例如在展示营销活动贡献性的例子中,Jupyter Notebook 可能是更好的选择。

Jupyter Notebook 可以提供非常丰富和有教育意义的信息。因此,许多机器学习开发者在探索阶段开始他们的项目时,会选择使用 Jupyter Notebook。

接下来,我们将在一个 Jupyter Notebook 中回顾我们的设计。这将使我们能够将整个流程封装在一个单一的连贯文件中,该文件旨在向读者展示。

在 Jupyter Notebook 中回顾我们的用例 – NLP 分类机器学习系统设计

在本节中,我们将通过一个动手示例进行操作。我们将遵循之前提出的步骤来阐述问题、设计解决方案和评估结果。本节描绘了机器学习开发者在行业中的典型项目中所经历的过程。有关更多信息,请参阅笔记本 https://colab.research.google.com/drive/1ZG4xN665le7X_HPcs52XSFbcd1OVaI9R?usp=sharing

商业目标

在这个场景中,我们为一家金融新闻机构工作。我们的目标是实时发布有关公司和产品的新闻。

技术目标

CTO 从商业目标中推导出几个技术目标。其中一个目标是针对机器学习团队的:在实时金融推文流中,检测讨论公司或产品信息的推文。

流程

让我们回顾流程的不同部分,如图 图 5**.2 所示:

图 5.2 – 典型机器学习流程的结构

图 5.2 – 典型机器学习流程的结构

注意

图 5**.2 中的流程阶段将在以下小节中探讨

代码设置

在这部分代码中,我们设置了关键参数。我们选择将它们作为代码的一部分,因为这是一段用于展示的指导性代码。在代码预期用于生产的情况中,可能更好的做法是将参数托管在一个单独的 .yaml 文件中。这也会适应开发阶段的重度迭代,因为它将允许你在不改变代码的情况下迭代不同的代码参数,这通常是期望的。

关于这些值的选择,应该强调的是,其中一些值应该优化以适应解决方案的优化。我们在这里选择了固定度量值以简化过程。例如,用于分类的特征数量在这里是一个固定数量,但它也应该优化以适应训练集。

数据收集

这一部分加载数据集。在我们的案例中,加载函数很简单。在其他商业案例中,这部分可能相当大,因为它可能包括一系列被调用的SQL查询。在这种情况下,可能最好在单独的.py文件中编写一个专用函数,并通过导入部分调用它。

数据处理

在这里,我们以适合我们工作方式格式化数据。我们也首次观察了一些数据。这使我们能够了解其性质和质量。

我们在这里采取的一个关键行动是定义我们关心的类别。

预处理

正如我们在第4章中讨论的那样,预处理是管道的关键部分。例如,我们注意到许多推文中都包含URL,我们选择将其删除。

初步数据探索

在这一点上,我们已经观察了文本的质量和类别的分布。这就是我们探索数据可能的其他特征的地方,这些特征可能意味着其质量或其指示所需类别的能力。

特征工程

接下来,我们开始处理文本。我们试图将每个观察到的文本表示为一组数值特征。这样做的主要原因是因为传统的机器学习模型是设计用来接受数字作为输入,而不是文本。例如,一个常见的线性回归或逻辑回归模型是应用于数字,而不是单词、类别或图像像素。因此,我们需要为文本提供一个数值表示。当与语言模型BERTGPT一起工作时,这种设计限制被解除。我们将在接下来的章节中看到这一点。

我们将文本分割成N-gram,其中N是代码的一个参数。在这个代码中N是固定的,但应该优化以最好地适应训练集。

一旦文本被分割成N-gram,它们就被建模为数值。当选择二进制(即独热编码)方法时,代表某些N-gram的数值特征,如果观察到的文本包含该N-gram,则得到“1”,否则得到“0”。请参见图5.3以获取示例。如果选择BOW方法,则特征值是N-gram在观察到的文本中出现的次数。这里没有实现的一种常见特征工程方法是TF-IDF

仅使用单语词我们可以得到以下结果:

输入句子:“filing submitted。”

N-gram “report” “filing” “submitted” “product” “quarterly” 其他单语词
特征值 0 1 1 0 0 (0的)

图5.3 – 通过单语词编码将输入文本句子转换为数值表示

以下图显示了使用单语词和双语词得到的结果:

N-gram “report” “filing” “filing submitted” “report news” “submitted” 其他N-gram
特征值 0 1 1 0 1 (0的)

图5.4 – 通过将输入文本句子划分为单词和双词并通过独热编码进行转换,将其转换为数值表示

注意,在代码的这个阶段,数据集还没有被划分为训练集和测试集,预留集(也称为测试集)尚未排除。这是因为二进制和BOW特征工程方法不依赖于底层观察之外的数据。对于TF-IDF来说,情况则不同。每个特征值都是使用整个数据集的文档频率来计算的。

探索新的数值特征

现在我们已经将文本表示为特征,我们可以对其进行数值探索。我们可以查看其频率和统计信息,并了解其分布情况。

划分训练/测试集

这是我们必须暂停并划分预留集(也称为测试集,有时也称为验证集)的部分。由于这些术语在不同的来源中有不同的用法,重要的是要解释一下,我们所说的测试集实际上是一个预留集。预留集是我们专门用于评估解决方案性能的数据子集。它被预留出来以模拟当系统在实际世界中实施并遇到新数据样本时预期的结果。

我们如何知道何时划分预留集?

如果我们“过早”地划分它,例如在加载数据后立即进行,那么我们保证将其保留为预留集,但可能错过数据中的差异,因为它不会参与初步探索。如果我们“过晚”地划分它,我们的设计决策可能会因为它们而变得有偏见。例如,如果我们根据包括将要预留的集的结果选择一个机器学习模型而不是另一个,那么我们的设计就会针对那个集,从而阻止我们对该模型进行客观评估。

然后,我们需要在第一个将输入到设计决策中的动作之前执行测试集。在下文中,我们将进行统计分析,然后我们可以将其输入到特征选择中。由于该选择应该与预留集无关,因此我们将从这部分开始排除该集。

初步统计分析与可行性研究

这是我们在几页前讨论的探索阶段的第二部分。第一部分是数据探索,我们在代码的前几部分实现了它。现在我们已经将文本表示为数值特征,我们可以进行可行性研究。

我们试图衡量文本输入和类别值之间的统计依赖性。同样,动机是模仿线性相关在回归问题中提供的代理。

我们知道,对于两个随机变量,XY,如果它们在统计上独立,那么我们得到以下结果:

P(X=x,Y=y)=P(X=x)P(Y=y),foreveryxandy

或者,我们得到以下结果:

P(X=x,Y=y)P(X=x)P(Y=y)=1,

这发生在每个产生非零概率的 x, y 值上。

相反,我们可以使用贝叶斯定理:

P(X=x|Y=y)P(Y=y)P(X=x)P(Y=y)=1

P(X=x|Y=y)P(X=x)=1.

现在,让我们考虑任意两个不一定相互独立的随机变量。我们想要评估这两个变量之间是否存在统计关系。

让一个随机变量代表我们的任何数值特征,另一个随机变量代表输出类别,取值为0或1。假设特征工程方法是二元的,因此特征也取值为0或1。

观察最后一个等式,左侧的表达式展示了 XY 之间关系能力的非常强大的度量:

P(feature=x|class=y)P(feature=x),x,ybelongto{0,1}.

它之所以强大,是因为如果特征对类别值完全没有指示性,那么在统计上,我们说这两个是统计独立的,因此这个度量将等于 1。

相反,这个度量与 1 之间的差异越大,这个特征与这个类别之间的关系就越强。当我们对我们设计的可行性研究进行评估时,我们希望看到数据中存在与输出类别有统计关系的特征。

因此,我们计算每个特征和每个类别的每一对特征的表达式的值。

我们展示了类别“0”的最具指示性的术语,类别“0”是指不表明公司或产品信息的推文类别,我们还展示了类别“1”中最具指示性的术语,这意味着当一条推文讨论公司或产品信息时。

这证明给我们看,确实存在一些文本术语可以指示类别值。这是可行性研究的明确和清晰的成功。我们可以继续前进,并期待在实现分类模型时取得有成效的结果。

作为一个附带说明,请记住,与大多数评估一样,我们刚才提到的只是文本预测类别的潜在性的一个充分条件。如果它失败了,这并不一定意味着没有可行性。就像当 XY 之间的线性相关性接近 0 时,这并不意味着 X 不能推断 Y。这只意味着 X 不能通过线性模型推断 Y。线性是一个为了简化问题而做出的假设,如果它成立。

在我们提出的方法中,我们做出了两个关键假设。首先,我们假设特征设计非常特别的方式,对于 N-gram 分区是某个特定的 N,对于值的定量方法是二进制。第二个是,我们执行最简单的统计依赖性评估,即单变量统计依赖性。但可能只有更高阶的,比如单变量,才会对结果类别有统计依赖性。

在进行文本分类的可行性研究时,如果方法尽可能简单同时覆盖尽可能多的“信号”,那么这是理想的。我们在这个例子中设计的方法是在多年的不同集合和不同问题设置的经验基础上得出的。我们发现它非常准确地击中了目标。

特征选择

通过可行性研究,我们经常一石二鸟。因为一个成功的可行性研究不仅可以帮助我们确认计划,而且经常暗示我们应该采取的下一步。正如我们所看到的,一些特征是类别指示性的,我们学会了哪些是最重要的。这使我们能够减少分类模型需要划分的特征空间。我们通过保留每个类别中最具指示性的特征来实现这一点。我们选择保留的特征数量理想情况下应由计算约束(例如,过多的特征会导致模型计算时间过长)、模型能力(例如,由于共线性,过多的特征可能无法被模型很好地处理)以及训练结果的优化来决定。在我们的代码中,我们固定了这个数字,以使事情变得快速简单。

应该强调的是,在许多机器学习模型中,特征选择是模型设计的一个固有部分。例如,对于最小绝对收缩和选择算子LASSO),<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrow<mml:mi mathvariant="script">l</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub></mml:math>范数的超参数缩放器会影响哪些特征得到零系数,从而被“排除”。有时可能且建议跳过这一部分的特征选择过程,保留所有特征,并让模型自行进行特征选择。当所有被评估和比较的模型都具有这一特性时,建议这样做。

记住,在这个阶段,我们只是在观察训练集。既然我们已经决定保留哪些特征,我们就需要将这个选择应用到测试集上。

这样,我们的数据已经为机器学习建模做好了准备。

遍历机器学习模型

为了选择最适合这个问题的模型,我们必须训练几个模型,并查看哪一个表现最好。

我们应该强调,我们可以做很多事情来尝试确定给定问题的最佳模型选择。在我们的案例中,我们只选择评估少数几个模型。此外,为了使事情简单快捷,我们选择不使用综合交叉验证方法来优化每个模型的超参数。我们只是使用每个模型默认设置将其拟合到训练集。一旦我们确定了我们想使用的模型,我们就通过交叉验证优化其在训练集上的超参数。

通过这样做,我们确定了最佳模型。

生成所选模型

在这里,我们优化所选模型超参数,并将其拟合到我们的训练集。

生成训练结果 – 设计选择

在这个阶段,我们首次观察模型的性能结果。这个结果可以用来将洞察力反馈到设计选择和选择的参数中,例如特征工程方法、特征选择中保留的特征数量,甚至预处理方案。

重要注意事项

注意,当将训练集结果中的洞察力反馈到解决方案的设计中时,你冒着过度拟合训练集的风险。你可以通过训练集和测试集结果之间的差距来判断你是否这样做。

虽然预期这些结果之间存在差距,有利于训练结果,但较大的差距应被视为一个警报,表明设计不是最优的。在这种情况下,应使用基于代码的系统参数重新设计该设计,以确保做出公平的选择。甚至可以从训练集中划分出另一个半保留集,通常称为验证集。

生成测试结果 – 展示性能

就这些!

现在由于设计已经优化,并且我们对其满足我们的目标有信心,我们可以将其应用于我们的保留集并观察测试结果。这些结果是我们对系统在现实世界中表现如何的最客观预测。

如前所述,我们应该避免让这些结果影响我们的设计选择。

摘要

在本章中,我们开始对文本分类进行了全面的探索,这是自然语言处理(NLP)和机器学习(ML)不可或缺的方面。我们深入研究了各种文本分类任务,每个任务都提出了独特的挑战和机遇。这种基础理解为有效地解决广泛的应用奠定了基础,从情感分析到垃圾邮件检测。

我们探讨了N-gram在捕捉文本中的局部上下文和词序列中的作用,从而增强了用于分类任务的特性集。我们还阐明了TF-IDF方法的力量,Word2Vec在文本分类中的作用,以及CBOW和skip-gram等流行架构,为您提供了对这些机制的深入理解。

然后,我们介绍了主题建模,并探讨了如何将LDA等流行算法应用于文本分类。

最后,我们介绍了一种在商业或研究环境中领导NLP-ML项目的专业范式。我们讨论了项目目标和设计方面,然后深入到系统设计。我们通过代码实现了一个真实世界的示例,并对其进行了实验。

本质上,本章旨在通过涉及该领域的核心概念、方法和技术,使你对文本分类和主题建模有一个全面的理解。所传授的知识和技能将使你能够有效地处理和解决现实世界的文本分类问题。

在下一章中,我们将介绍文本分类的高级方法。我们将回顾深度学习方法,如语言模型,讨论其理论和设计,并展示代码中的实际系统设计。

第六章:重新构想文本分类:深入探索深度学习语言模型

本章深入探讨深度学习(DL)及其在自然语言处理(NLP)中的应用,特别是专注于基于转换器的突破性模型,如双向编码器表示从转换器BERT)和生成预训练转换器GPT)。我们首先介绍深度学习的基础知识,阐述其从大量数据中学习复杂模式的能力,使其成为最先进 NLP 系统的基石。

随后,我们深入探讨转换器,这是一种新颖的架构,它通过提供比传统的循环神经网络RNNs)和卷积神经网络CNNs)更有效的处理序列数据的方法,从而彻底改变了 NLP。我们剖析了转换器的独特特性,包括其注意力机制,这使得它能够关注输入序列的不同部分,从而更好地理解上下文。

然后,我们将注意力转向 BERT 和 GPT,这些基于转换器的语言模型利用这些优势来创建高度细腻的语言表示。我们详细分析了 BERT 架构,讨论了其创新性地使用双向训练来生成语境丰富的词嵌入。我们将揭示 BERT 的内部运作机制,并探索其预训练过程,该过程利用大量文本语料库来学习语言语义。

最后,我们讨论了如何针对特定任务(如文本分类)微调 BERT。我们将引导你通过数据预处理、模型配置、训练和评估的步骤,提供如何利用 BERT 的力量进行文本分类的动手理解。

本章全面探讨了自然语言处理(NLP)中的深度学习(DL),从基础概念到实际应用,使你具备利用 BERT 和转换器模型的能力,以应对你的文本分类任务。

本章涵盖了以下主题:

  • 理解深度学习基础知识

  • 不同神经网络的架构

  • 转换器

  • 语言模型

  • 训练神经网络的挑战

  • BERT

  • GPT

  • 如何使用语言模型进行分类

  • NLP-ML 系统设计示例

技术要求

为了成功阅读本章,以下技术先决条件是必要的:

  • 编程知识:对 Python 的深入了解是必不可少的,因为它是大多数深度学习和 NLP 库的主要语言。

  • 机器学习基础:对基本机器学习概念的良好掌握,如训练/测试数据、过拟合、欠拟合、准确率、精确率、召回率和 F1 分数,将非常有价值。

  • 深度学习基础知识:熟悉深度学习的概念和架构,包括神经网络、反向传播、激活函数和损失函数,将是必不可少的。了解RNN和CNN将是有益的,但不是严格必要的,因为我们将会更多地关注transformer架构。

  • NLP基础知识:对基本NLP概念如分词、词干提取、词形还原和词嵌入(例如Word2VecGloVe)的理解将大有裨益。

  • 库和框架:对于使用TensorFlowPyTorch构建和训练神经网络的经验至关重要。熟悉NLP库如NLTKSpaCy也可能有益。对于专门使用BERT,了解Hugging Facetransformers库将非常有帮助。

  • 硬件要求:深度学习模型,尤其是基于transformer的模型如BERT,计算密集,通常需要现代图形处理单元GPU)在合理的时间内进行训练。推荐使用具有GPU能力的性能计算机或基于云的解决方案。

  • 数学:对线性代数、微积分和概率的良好理解有助于理解这些模型的内部工作原理,但大多数章节可以在没有深入数学知识的情况下理解。

这些先决条件旨在为你提供理解和实现章节中讨论的概念所需的必要背景。有了这些,你应该为深入探索使用BERT进行文本分类的迷人的深度学习世界做好了充分的准备。

理解深度学习基础知识

在这部分,我们解释了神经网络和深度神经网络是什么,使用它们的动机,以及深度学习模型的不同类型(架构)。

什么是神经网络?

神经网络是人工智能(AI)和机器学习(ML)的一个子领域,它专注于受大脑结构和功能启发的算法。它也被称为“深度”学习,因为这些神经网络通常由许多重复的层组成,形成了一个深度架构。

这些深度学习模型能够从大量复杂、高维和无结构的数据中“学习”。术语“学习”指的是模型能够自动从经验中学习并改进,而无需为任何特定任务(或任务集)明确编程。

深度学习可以是监督的、半监督的或无监督的。它在众多应用中使用,包括自然语言处理(NLP)、语音识别、图像识别,甚至玩游戏。这些模型可以识别模式并做出基于数据的预测或决策。

深度学习(DL)的一个关键优势是它能够处理和建模各种类型的数据,包括文本、图像、声音等。这种多功能性导致了从自动驾驶汽车到复杂的网络搜索算法以及高度响应的语音识别系统等广泛的应用。

值得注意的是,尽管深度学习具有很高的潜力,但它也要求有显著的计算能力和大量高质量的数据来有效地训练,这可能是一个挑战。

从本质上讲,深度学习(DL)是一种强大且变革性的技术,它是许多当今技术进步的前沿。

使用神经网络的动机

在机器学习和人工智能领域,神经网络被用于各种原因。以下是一些关键动机:

  • 非线性:神经网络通过其复杂的结构和激活函数的使用,可以捕捉数据中的非线性关系。许多现实世界现象在本质上是非线性的,神经网络提供了一种建模这些复杂性的方法。

  • 通用逼近定理:这个定理表明,具有足够隐藏单元的神经网络可以以高精度逼近几乎任何函数。这使得它们非常灵活,能够适应广泛的任务。

  • 处理高维数据的能力:神经网络可以有效地处理具有大量特征或维度的数据,这使得它们在图像或语音识别等高度维度的任务中非常有用。

  • 模式识别和预测:神经网络在识别大型数据集中的模式和趋势方面表现出色,这使得它们在预测任务中特别有用,例如预测销售或预测股市趋势。

  • 并行处理:神经网络的结构允许它们同时执行许多操作,这使得它们在现代硬件上实现时效率非常高。

  • 从数据中学习:随着神经网络接触到更多的数据,它们可以提高自己的性能。这种从数据中学习的能力使它们在大量数据可用的任务中非常有效。

  • 鲁棒性:神经网络可以处理输入数据中的噪声,对输入的小幅变化具有鲁棒性。

此外,由于几个原因,神经网络在自然语言处理(NLP)任务中被广泛使用。以下是一些主要动机:

  • 处理序列数据:自然语言本质上是序列性的(单词依次排列以形成连贯的句子)。循环神经网络(RNN)及其高级版本,如长短期记忆LSTM)和门控循环单元GRUs),是能够通过保持关于序列中先前步骤的某种内部状态或记忆来处理序列数据的神经网络类型。

  • 上下文理解:神经网络,尤其是循环神经网络,能够通过考虑周围的词语甚至之前的句子来理解句子中的上下文,这在NLP任务中至关重要。

  • 语义哈希:神经网络通过使用词嵌入(如Word2Vec和GloVe)以保留其语义意义的方式对词语进行编码。具有相似意义的词语在向量空间中放置得更近,这对于许多NLP任务非常有价值。

  • 端到端学习:神经网络可以直接从原始数据中学习。例如,在图像分类中,神经网络可以从像素级别学习特征,而不需要任何手动特征提取步骤。这是一个显著的优势,因为特征提取过程可能耗时且需要领域专业知识。

    同样,神经网络可以学习从原始文本数据中执行NLP任务,而不需要手动特征提取。这在NLP中是一个很大的优势,因为创建手工特征可能既困难又耗时。

  • 性能:神经网络,特别是随着基于transformer架构的BERT、GPT等的出现,已经在许多NLP任务中实现了最先进的结果,包括但不限于机器翻译、文本摘要、情感分析和问答。

  • 处理大型词汇:神经网络可以有效地处理大型词汇和连续的文本流,这在许多NLP问题中很常见。

  • 学习层次特征:深度神经网络可以学习层次化的表示。在自然语言处理(NLP)的背景下,较低层通常学习表示简单的事物,例如n-gram,而较高层可以表示复杂的概念,例如情感。

尽管有这些优势,但值得注意的是,神经网络也面临挑战,包括其“黑盒”性质,这使得其决策过程难以解释,以及它们在训练过程中需要大量数据和计算资源。然而,它们在性能方面提供的优势以及从原始文本数据中学习并建模复杂关系的能力,使它们成为许多NLP任务的首选选择。

神经网络的基本设计

神经网络由多层相互连接的节点,或称为“神经元”组成,每个神经元对其接收到的数据进行简单的计算,并将输出传递给下一层的神经元。每个神经元之间的连接都有一个相关的权重,该权重在学习过程中进行调整。

基本神经网络的结构由三种类型的层组成,如图图6.1所示:

图6.1 – 神经网络的基本架构

图6.1 – 神经网络的基本架构

在以下列表中,我们将更详细地解释模型的每一层:

  • 输入层:这是网络接收输入的地方。例如,如果网络被设计为处理28x28像素的图像,那么输入层将有784个神经元,每个神经元代表一个像素的值。

  • 隐藏层(s):这些层位于输入层和输出层之间。隐藏层中的每个神经元都会接收来自前一层的神经元输出,将这些输出与各自连接的权重相乘,并将这些值相加。这个和随后通过一个“激活函数”传递,以向模型引入非线性,这有助于网络学习复杂的模式。神经网络中可以有任何数量的隐藏层,具有许多隐藏层的网络通常被称为“深度”神经网络。

  • 输出层:这是网络中的最后一层。该层的神经元产生网络的最终输出。例如,对于分类问题,你可能设计网络使其具有一个输出神经元对应于问题中的每个类别,每个神经元输出一个值,表示输入属于其相应类别的概率。

网络中的神经元是相互连接的。这些连接的权重最初设置为随机值,代表网络在训练数据上训练后所学习的内容。

在训练过程中,使用诸如反向传播之类的算法来调整网络中连接的权重,以响应网络输出与期望输出之间的差异。这个过程会重复多次,网络逐渐提高其在训练数据上的性能。

为了提供一个简单的视觉概念,想象有三组圆圈(代表神经元)排列成列(代表层)。第一列是输入层,最后一列是输出层,任何介于两者之间的列都是隐藏层。然后,想象连接每一列中每个圆圈到下一列中每个圆圈的线条,代表神经元之间的加权连接。这就是神经网络的基本视觉表示。

在下一部分,我们将描述与神经网络相关的常见术语。

神经网络常见术语

在以下小节中,我们将探讨神经网络中最常用的术语。

神经元(或节点)

这是神经网络中的基本计算单元;通常,简单的计算涉及输入、权重、偏差和激活函数。神经元,也称为节点或单元,是神经网络的基本元素。它从其他节点或外部源接收输入,如果神经元位于输入层,则从外部源接收。然后,神经元根据这个输入计算输出。

每个输入都有一个相关的权重(w),这个权重是根据其与其他输入的相对重要性分配的。神经元将权重应用于输入,将它们加起来,然后对总和加上偏置值(b)应用激活函数。

下面是逐步分解:

  1. 加权求和:每个输入(x)到神经元的乘以相应的权重(w)。这些加权输入然后与偏置项(b)相加。偏置项允许激活函数向左或向右移动,有助于神经元模拟更广泛的模式。从数学上讲,这一步可以表示如下:

    z=w1*x1+w2*x2+…+wn*xn+b

  2. 激活函数:加权求和的结果随后通过激活函数。激活函数的目的是将非线性引入神经元的输出。这种非线性使得网络能够从错误中学习并做出调整,这对于执行复杂任务(如语言翻译或图像识别)至关重要。常见的激活函数选择包括 sigmoid 函数、双曲正切(tanh)和修正线性单元(ReLU)等。

    神经元的输出是激活函数的结果。它作为网络下一层神经元的输入。

    神经元中的权重和偏置是可学习的参数。换句话说,它们的值是在神经网络在数据上训练的过程中逐渐学习的:

    • 权重:两个神经元之间连接的强度或幅度。在训练阶段,神经网络学习正确的权重,以便更好地将输入映射到输出。权重在神经元中,如前所述使用。

    • 偏置:神经元中的一个附加参数,允许激活函数向左或向右移动,这对于成功学习至关重要(也用于神经元)。

激活函数

确定神经元应产生给定其输入的输出的函数(在每个神经元中)称为激活函数。常见的例子包括 sigmoid、ReLU 和 tanh。

这里是一些最常见的激活函数类型:

  • Sigmoid 函数:这里我们基本上是将输入分类为 0 或 1。Sigmoid 函数将实值输入压缩到 0 到 1 之间。它通常用于二元分类网络的输出层:

    f(x)=1(1+exp(−x))

    然而,它有两个主要缺点:梯度消失问题(对于大的正或负输入,梯度非常小,这可能会在反向传播期间减慢学习速度)和输出不是 零中心

  • 双曲正切函数:tanh函数也接受实数值输入并将其压缩到-1和1之间。与sigmoid函数不同,其输出以零为中心,因为其范围在原点周围是对称的:

    f(x)=(exp(x)−exp(−x))(exp(x)+exp(−x))

    它也受到梯度消失问题的影响,与sigmoid函数一样。

  • ReLU函数:ReLU函数在近年来变得非常流行。其计算方式如下:

    f(x)=max(0,x)

    换句话说,如果输入是正的,激活就是输入本身;否则,它是零。

    它不会同时激活所有神经元,这意味着只有当线性变换的输出小于0时,神经元才会被关闭。这使得网络稀疏且高效。然而,ReLU单元在训练期间可能很脆弱,如果通过它们的大梯度流动,它们可能会“死亡”(完全停止学习)。

  • Leaky ReLU:Leaky ReLU是ReLU的一种变体,它解决了“dying ReLU”问题。我们不是将函数定义为负x0,而是将其定义为x的一个小的线性分量:

    f(x)=max(0.01x,x)

    这允许函数在输入为负时“泄露”一些信息,有助于缓解dying ReLU问题。

  • 指数线性单元(ELU):ELU也是ReLU的一种变体,它修改了函数,使其对于负x具有非零值,这有助于学习过程:

    f(x) = x if x > 0, else

    α(exp(x) − 1)

    在这里,alpha (α) 是一个常数,它定义了当输入为负时函数的平滑性。ELU倾向于更快地将成本收敛到零并产生更准确的结果。然而,由于使用了指数运算,它可能计算得较慢。

  • Softmax函数:softmax函数常用于分类器的输出层,其中我们试图将输入分配到几个可能的类别之一。它给出了任何给定输入属于每个可能类别的概率:

fxi=exi∑jexj

分母将概率归一化,因此它们在所有类别中加起来等于1。softmax函数也用于多项式逻辑回归。

这些激活函数各有优缺点,激活函数的选择可能取决于具体的应用和问题的具体背景。

一组在同一抽象级别处理信号的神经元。第一层是输入层,最后一层是输出层,介于两者之间的所有层都称为隐藏层。

Epoch

在训练神经网络的背景下,epoch是一个术语,用来表示对整个训练数据集的一次完整遍历。在一个epoch期间,神经网络会更新其权重,试图最小化损失函数。

超参数“epoch”的数量决定了深度学习算法处理整个训练数据集的次数。epoch过多可能导致过拟合,即模型在训练数据上表现良好,但在新数据上表现较差。相反,epoch过少可能意味着模型欠拟合——它可能需要进一步训练来改进。

还需要注意的是,epoch的概念在批量和迷你批量的梯度下降变体中更为相关。在随机梯度下降中,模型在看到每个单独的例子后更新其权重,因此epoch的概念就不那么直接了。

批量大小

在一次迭代中使用的训练实例数量。批量大小指的是在一次迭代中使用的训练示例数量。

当你开始训练一个神经网络时,你有几种选择来决定如何将数据输入到模型中:

  • 批量梯度下降:在这里,整个训练数据集被用来计算优化器每个迭代的损失函数的梯度(就像梯度下降一样)。在这种情况下,批量大小等于训练数据集中示例的总数。

  • 随机梯度下降(SGD):SGD在每个优化器的迭代中使用单个例子。因此,SGD的批量大小为1

  • 小批量梯度下降法:这是批梯度下降法和随机梯度下降法之间的折中方案。在小批量梯度下降法中,批量大小通常在10到1,000之间,具体取决于你拥有的计算资源。

批量大小可以显著影响学习过程。较大的批量大小在训练中进展更快,但并不总是收敛得那么快。较小的批量大小频繁更新模型,但训练进展较慢。

此外,较小的批量大小具有正则化作用,可以帮助模型更好地泛化,从而在未见过的数据上获得更好的性能。然而,使用过小的批量大小可能导致训练不稳定,梯度估计不准确,最终导致模型性能更差。

选择合适的批量大小是一个试错的过程,并且取决于具体问题和可用的计算资源:

  • 迭代次数:算法看到的批量数据数量(或它在数据集上进行的遍历次数)。

  • 学习率:一个超参数,通过根据损失梯度调整权重更新率来控制学习算法的收敛速度。

  • 损失函数(代价函数):损失函数评估神经网络在数据集上的性能。预测值与实际结果之间的偏差越大,损失函数的输出就越大。目标是使这个输出最小化,这将使模型做出更准确的预测。

  • 反向传播:在神经网络上执行梯度下降的主要算法。它计算输出层的损失函数梯度,并将其分布回网络的各层,通过更新权重和偏置以最小化损失。

  • 过拟合:一种情况,其中模型学习训练数据中的细节和噪声,以至于它在新的、未见过的数据上的表现较差。

  • 欠拟合:一种情况,其中模型过于简单,无法学习数据的潜在结构,因此训练数据和新的数据上的表现都较差。

  • 正则化:一种通过向损失函数添加惩罚项来防止过拟合的技术,这反过来又限制了网络的权重。

  • Dropout:一种正则化技术,在训练期间忽略随机选择的神经元,这有助于防止过拟合。

  • CNN:一种非常适合图像处理和计算机视觉任务的神经网络类型。

  • RNN:一种旨在识别数据序列中模式(如时间序列或文本)的神经网络类型。

让我们继续探讨不同神经网络的架构。

不同神经网络的架构

神经网络有多种类型,每种类型都有适合不同任务的特定架构。以下列表包含了一些最常见类型的通用描述:

  • 前馈神经网络 (FNN): 这是最直接的一种神经网络。在这个网络中,信息仅沿一个方向移动,从输入层通过任何隐藏层到输出层。网络中没有循环或环路;它是一条直线,“前馈”路径。

图6.2 – 前馈神经网络

图6.2 – 前馈神经网络

  • 多层感知器 (MLP): MLP是一种前馈网络,除了其输入和输出层外,至少还有一个隐藏层。层之间是完全连接的,这意味着层中的每个神经元都与下一层的每个神经元相连。MLP可以模拟复杂模式,并被广泛用于图像识别、分类、语音识别和其他类型的机器学习任务。MLP是一种前馈网络,具有按顺序排列的神经元层。信息从输入层通过隐藏层流向输出层,方向单一:

图6.3 – 多层感知器

图6.3 – 多层感知器

  • CNN: CNN特别适合涉及空间数据的任务,如图像。其架构包括三种主要类型的层:卷积层、池化层和全连接层。卷积层对输入应用一系列过滤器,这使得网络能够自动和自适应地学习特征的空间层次结构。池化层减少表示的空间大小,从而减少网络中的参数和计算,以控制过拟合并降低后续层的计算成本。全连接层获取池化层的输出,并在输出上进行高级推理。

图6.4 – 卷积神经网络

图6.4 – 卷积神经网络

  • 循环神经网络 (RNN): 与前馈网络不同,RNNs具有形成有向循环的连接。这种架构允许它们使用先前输出的信息作为输入,这使得它们非常适合涉及序列数据的任务,例如时间序列预测或自然语言处理。RNNs的一个重要变体是LSTM网络,它除了标准单元外还使用特殊单元。RNN单元包括一个“记忆细胞”,可以在长时间内保持信息在内存中,这对于需要从数据中的长距离依赖关系学习的任务特别有用,例如手写识别或语音识别。

图6.5 – 循环神经网络

图6.5 – 循环神经网络

  • 自动编码器 (AE): AE 是一种用于学习输入数据有效编码的神经网络。它具有对称架构,并设计用于应用反向传播,将目标值设置为等于输入。自动编码器通常用于特征提取、学习数据的表示和降维。它们还用于生成模型、噪声去除和推荐系统。

图 6.6 – 自动编码器架构

图 6.6 – 自动编码器架构

  • 生成对抗网络 (GAN): GAN 由两部分组成,一个生成器和一个判别器,它们都是神经网络。生成器创建数据实例,旨在与训练数据集的分布相同。判别器的目标是区分来自真实分布的实例和来自生成器的实例。生成器和判别器一起训练,目标是随着训练的进行,生成器产生更好的实例,而判别器则变得更好地区分真实实例和生成实例。

图 6.7 – 计算机视觉中的生成对抗网络

图 6.7 – 计算机视觉中的生成对抗网络

这些只是神经网络架构的几个例子,存在许多变体和组合。你为任务选择架构将取决于任务的具体要求和限制。

神经网络训练的挑战

训练神经网络是一项复杂的工作,在训练过程中会面临挑战,如局部最小值和梯度消失/爆炸,以及计算成本和可解释性。所有挑战都在以下各点中详细解释:

  • 局部最小值: 训练神经网络的目的是找到使损失函数最小化的权重集。这是一个高维优化问题,存在许多点(权重集)的损失函数具有局部最小值。次优局部最小值是损失低于附近点的点,但高于全局最小值,全局最小值是整体可能的最小损失。训练过程可能会陷入这种次优局部最小值。重要的是要记住,即使是在凸损失函数中,由于数字计算中的一部分离散表示,局部最小值问题也存在。

  • 梯度消失/爆炸:这是在训练深度神经网络时遇到的一个困难。在反向传播过程中,损失函数的梯度可能在网络的深层中变得非常小(消失)或非常大(爆炸)。梯度消失使得网络难以从数据中学习,因为权重更新变得非常小。梯度爆炸可能导致训练过程失败,因为权重更新变得过大,损失变得未定义(例如,NaN)。

  • 过拟合:在训练机器学习模型时,一个常见的问题是我们的模型过于复杂,训练过度。在这种情况下,模型甚至学习了训练数据中的噪声,在训练数据上表现良好,但在未见过的测试数据上表现不佳。

  • 欠拟合:相反,当模型过于简单,无法捕捉数据的潜在结构时,就会发生欠拟合。通过使用适当的模型复杂度、正则化技术和足够数量的训练数据,可以减轻过拟合和欠拟合。

  • 计算资源:训练神经网络,尤其是深度网络,需要大量的计算资源(CPU/GPU功率和内存)。它们通常还需要大量的训练数据才能表现良好,当这些数据不可用时,这可能成为一个问题。

  • 缺乏可解释性:虽然这不是一个严格意义上的训练问题,但神经网络缺乏可解释性是一个重大问题。它们通常被称为“黑盒”,因为很难理解它们为什么会做出这样的预测。

  • 选择适当架构和超参数的困难:有众多类型的神经网络架构可供选择(例如CNN和RNN),每种架构都有一组需要调整的超参数(例如学习率、批量大小、层数和每层的单元数)。为特定问题选择最佳架构并调整这些超参数可能是一个具有挑战性和耗时的工作。

  • 数据预处理:神经网络通常需要输入数据以特定格式。例如,数据可能需要归一化,分类变量可能需要独热编码,缺失值可能需要填充。这个预处理步骤可能既复杂又耗时。

这些挑战使得训练神经网络成为一个非平凡的任务,通常需要技术专长、计算资源和试错法的结合。

语言模型

语言模型是NLP中的一种统计模型,旨在学习和理解人类语言的结构。更具体地说,它是一种概率模型,经过训练可以估计在给定一个单词场景的情况下单词的可能性。例如,语言模型可以被训练来预测句子中的下一个单词,给定前面的单词。

语言模型是许多NLP任务的基础。它们被用于机器翻译、语音识别、词性标注和命名实体识别等任务。最近,它们还被用来创建对话式AI模型,如聊天机器人和个人助手,以及生成类似人类的文本。

传统的语言模型通常基于显式的统计方法,例如n-gram模型,这些模型在预测下一个词时只考虑前n个词,或者隐藏马尔可夫模型(HMMs)。

最近,神经网络在创建语言模型方面变得流行,导致了神经语言模型的兴起。这些模型利用神经网络的强大功能来考虑每个词的上下文,从而实现更高的准确性和流畅性。神经语言模型的例子包括RNN、Transformer模型以及各种基于Transformer的架构,如BERT和GPT。

语言模型在计算环境中理解、生成和解释人类语言是必不可少的,它们在许多自然语言处理(NLP)的应用中扮演着至关重要的角色。

这里是使用语言模型的一些动机:

  • 机器翻译:语言模型是翻译系统中的一个关键组件,它们可以评估翻译句子的流畅性,并帮助在多种可能的翻译中选择。

  • 语音识别:语言模型在语音识别系统中被用来帮助区分听起来相似的单词和短语。通过预测句子中可能出现的下一个词,它们可以提高转录的准确性。

  • 信息检索:当你在互联网上搜索某物时,语言模型有助于确定哪些文档与你的查询相关。它们可以理解你的搜索词与潜在结果之间的语义相似性。

  • 文本生成:语言模型可以生成类似人类的文本,这在聊天机器人、写作助手和内容创作工具等应用中非常有用。例如,聊天机器人可以使用语言模型来生成对用户查询的适当响应。

  • 情感分析:通过理解语言结构,语言模型可以帮助判断一段文本的情感是积极、消极还是中性。这在社交媒体监控、产品评论和客户反馈等领域非常有用。

  • 语法检查:语言模型可以预测句子中下一个词应该是什么,这有助于识别语法错误或表达不当。

  • 命名实体识别:语言模型可以帮助识别文本中的命名实体,如人名、组织、地点等。这对于信息提取和自动摘要等任务非常有用。

  • 理解上下文:语言模型,尤其是基于深度学习(DL)的最近模型,如transformers,在理解单词和句子的上下文方面非常出色。这种能力对于许多自然语言处理(NLP)任务至关重要,例如问答、摘要和对话系统。

所有这些动机都源于一个中心主题:语言模型帮助机器更有效地理解和生成人类语言,这在当今数据驱动的世界中对于许多应用至关重要。

在下一节中,我们将介绍不同类型的学习,然后解释如何使用自监督学习来训练语言模型。

半监督学习

半监督学习是一种机器学习方法,它利用标记数据和未标记数据来训练。当你只有少量标记数据而大量未标记数据时,这种方法特别有用。这里的策略是使用标记数据来训练一个初始模型,然后使用这个模型来预测未标记数据的标签。然后,使用新标记的数据重新训练模型,从而提高其准确性。

无监督学习

另一方面,无监督学习涉及完全基于未标记数据进行模型训练。这里的目的是在数据中找到潜在的规律或结构。无监督学习包括诸如聚类(目的是将相似实例分组在一起)和降维(目的是简化数据而不丢失太多信息)等技术。

使用自监督学习来训练语言模型

自监督学习是一种无监督学习形式,其中数据提供监督。换句话说,模型学会从同一输入数据的其他部分预测输入数据的一部分。它不需要人类提供的显式标签,因此称为“自监督”。

在语言模型的背景下,自监督通常通过预测句子的一部分来实现,当给出其他部分时。例如,给定句子“The cat is on the __”,模型将被训练来预测缺失的单词(在这种情况下是“mat”)。

接下来,让我们看看一些流行的自监督学习策略,用于训练语言模型。

掩码语言模型(MLM)

这种策略在BERT的训练中使用,随机掩盖输入标记的一部分,并要求模型根据未掩盖的词提供的上下文预测掩盖的单词。例如,在句子“The cat is on the mat”中,我们可以掩盖“cat”,而模型的任务就是预测这个单词。请注意,也可以掩盖多个单词。

从数学上讲,多标签学习(MLM)的目标是最大化以下似然函数:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miL</mml:mi>mml:mo=</mml:mo>mml:mrowmml:munder<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mii</mml:mi></mml:mrow></mml:munder>mml:mrowmml:mrowmml:mrow<mml:mi mathvariant="normal">log</mml:mi></mml:mrow>mml:mo⁡</mml:mo>mml:mrow<mml:mfenced separators="|">mml:mrowmml:miP</mml:mi>mml:mo(</mml:mo>mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub>mml:mo|</mml:mo>mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo;</mml:mo>mml:miθ</mml:mi>mml:mo)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:math>

其中 wi 是一个掩码词,w 是非掩码词,而 θ 代表模型参数。

自回归语言模型

在自回归语言模型中,如 GPT 模型所使用的,模型根据句子中所有前面的词预测句子中的下一个词。它被训练以最大化给定句子中先前词的词的概率。

自回归语言模型的目标是最大化

L=∑ilogP(wi|w1,…,wi−1;θ)

其中 w_i 是当前词,<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mn1</mml:mn></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:mo.</mml:mo>mml:mo.</mml:mo>mml:mo.</mml:mo>mml:mo.</mml:mo>mml:mo,</mml:mo>mml:msubmml:mrowmml:miw</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi>mml:mo-</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:msub></mml:math> 是前面的词,而 θ 代表模型参数。

这些策略使语言模型能够直接从原始文本中获得对语言语法和语义的丰富理解,而无需显式标签。然后,这些模型可以通过各种任务进行微调,例如文本分类、情感分析等,利用从自监督预训练阶段获得的语言理解。

迁移学习

迁移学习是一种机器学习技术,其中预训练模型被重新用作不同但相关问题的起点。与传统机器学习方法相比,传统方法是从随机权重初始化模型开始,迁移学习有从相关任务学习到的模式中启动学习过程的优势,这既可以加快训练过程,也可以提高模型的性能,尤其是在你有有限的标记训练数据时。

在迁移学习中,一个模型通常是在一个大规模任务上训练的,然后使用模型的一部分作为另一个任务的起点。这个大规模任务通常选择得足够广泛,以至于学习到的表示对许多不同的任务都有用。当两个任务的输入数据类型相同且任务相关时,这个过程特别有效。

应用迁移学习有几种方法,最佳方法可能取决于你任务的数据量以及你的任务与模型训练的原任务相似程度。

特征提取

预训练模型充当特征提取器。你移除模型的最后一层或几层,保留网络的其他部分。然后,你将数据通过这个截断的模型传递,并使用输出作为训练用于你特定任务的新、更小模型输入。

微调

你使用预训练模型作为起点,并更新模型的所有或部分参数以适应你的新任务。换句话说,你继续从上次停止的地方训练,允许模型从通用的特征提取调整到更具体于你任务的特性。在微调期间,通常使用较低的学习率,以避免在训练过程中完全覆盖预学习的特征。

迁移学习是一种强大的技术,可以用来提高机器学习模型的性能。它在有少量标记数据可用的任务中特别有用。它通常在深度学习应用中使用。例如,在图像分类问题中,几乎已经成为标准,即使用在ImageNet(一个大规模标注图像数据集)上预训练的模型(ResNet、VGG、Inception等)作为起点。这些模型学习到的特征对图像分类来说是通用的,并且可以在包含更少数据的具体图像分类任务上进行微调。

这里有一些迁移学习应用的例子:

  • 一个用于分类猫和狗图像的模型可以被用来微调一个模型,以分类其他动物的图像,如鸟类或鱼类。

  • 一个用于将英语翻译成西班牙语的文本模型可以被用来微调一个模型,以将西班牙语翻译成法语。

  • 一个用于预测房价的模型可以被用来微调一个模型,以预测汽车的价格。

类似地,在自然语言处理中,大型预训练模型,如BERT或GPT,通常被用作广泛任务(如文本分类、情感分析、问答等)的起点。这些模型在大量文本语料库上预训练,并学习到丰富的语言表示,可以针对特定任务进行微调。

理解Transformer

Transformer是一种由Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Łukasz Kaiser和Illia Polosukhin在论文《Attention is All You Need》中提出的神经网络架构(Advances in neural information processing systems 30 (2017), Harvard)。它们在NLP领域产生了深远的影响,并成为BERT和GPT等最先进模型的基础。

Transformer的关键创新是自注意力机制,它允许模型在生成输出时权衡输入中每个词的相关性,从而考虑每个词的上下文。这与之前的模型(如RNN或LSTM)不同,这些模型按顺序处理输入,因此更难捕捉词之间的长距离依赖关系。

Transformer的架构

Transformer由一个编码器和解码器组成,它们都由几个相同的层组成,如图图6.8所示。编码器中的每一层包含两个子层:一个自注意力机制和一个位置感知的全连接前馈网络。在每个子层周围都采用了残差连接,然后是层归一化:

图6.8 – 自注意力机制

图6.8 – 自注意力机制

同样,解码器中的每一层也有三个子层。第一个是自注意力层,第二个是跨注意力层,它关注编码器堆栈的输出,第三个是位置感知的全连接前馈网络。与编码器一样,这些子层周围都有残差连接,然后是层归一化。请注意,在图中只显示了一个头,我们可以有多个头并行工作(N个头)。

自注意力机制

自注意力机制,或缩放点积注意力,计算序列中每个词对当前正在处理的词的相关性。自注意力层的输入是一个词嵌入序列,每个嵌入通过分别学习的线性变换被分割成一个查询Q)、一个K)和一个V)。

每个词的注意力分数计算如下:

Attention(Q,K,V)=softmax(QKT/sqrt(d_k))V

其中d_k是查询和键的维度,用于缩放点积以防止其变得过大。softmax操作确保注意力分数是归一化的并且总和为1。这些分数代表在产生当前单词的输出时,对每个单词值的赋予的权重。

自注意力层的输出是一个新的向量序列,其中每个单词的输出是所有输入值的加权总和,权重由注意力分数决定。

位置编码

由于自注意力机制没有考虑序列中单词的位置,因此Transformer在编码器和解码器堆栈的底部添加了位置编码到输入嵌入中。这种编码是位置的固定函数,允许模型学习使用单词的顺序。

在原始的Transformer论文中,位置编码是位置和维度的正弦函数,尽管也有效地使用了学习位置编码。

Transformer的应用

自从它们被引入以来,Transformer已被用于在包括机器翻译、文本摘要、情感分析等在内的广泛NLP任务上实现最先进的结果。它们也被应用于其他领域,如计算机视觉和强化学习。

Transformer的引入导致了NLP领域向在大型文本语料库上预训练大型Transformer模型,然后在特定任务上进行微调的转变,这是一种有效的迁移学习方法。这种方法已被用于BERT、GPT-2、GPT-3和GPT-4等模型。

了解更多关于大型语言模型

大型语言模型是一类在广泛互联网文本上训练的机器学习模型。

“大型语言模型”中的“大型”一词指的是这些模型所拥有的参数数量。例如,GPT-3有1750亿个参数。这些模型使用自监督学习在大量的文本语料库上进行训练,这意味着它们预测句子中的下一个单词(例如GPT)或基于周围单词的单词(例如BERT,它也被训练来预测一对句子是否连续)。由于它们接触到了如此大量的文本,这些模型学习了语法、关于世界的知识、推理能力,以及它们在训练数据中存在的偏见。

这些模型基于转换器架构,这意味着它们利用了转换器架构,该架构使用自注意力机制来衡量输入数据中单词的重要性。这种架构使得这些模型能够处理文本中的长距离依赖关系,使它们在广泛的自然语言处理任务中非常有效。

大型语言模型可以通过在特定任务上进行微调来实现高性能。微调涉及在较小的、特定任务的语料库上进行额外的训练,这使得模型能够将其通用的语言理解能力适应到任务的特定细节。这种方法已被用于在许多自然语言处理基准测试中实现最先进的结果。

尽管大型语言模型展示了令人印象深刻的能力,但它们也提出了重要的挑战。例如,由于它们是在互联网文本上训练的,它们可以复制和放大数据中存在的偏见。它们还可以生成有害或误导性的输出。此外,由于它们的规模,这些模型在训练和部署时需要大量的计算资源,这引发了成本和环境影响的问题。

尽管存在这些挑战,大型语言模型在人工智能领域代表了重大进步,并且是广泛应用于翻译、摘要、内容创作、问答等众多领域的强大工具。

训练语言模型的挑战

训练大型语言模型是一项复杂且资源密集型的工作,面临着诸多挑战。以下是其中一些关键问题:

  • 计算资源:大型语言模型的训练需要大量的计算资源。这些模型拥有数十亿个参数,需要在训练过程中进行更新,这涉及到在庞大的数据集上执行大量的计算。这种计算通常在高性能GPU或张量处理单元TPUs)上执行,相关的成本可能非常昂贵。

  • 内存限制:随着模型大小的增加,存储模型参数、训练过程中的中间激活和梯度的内存需求也增加。这可能导致即使在最先进的硬件上也会出现内存问题。可以使用模型并行化、梯度检查点和卸载等技术来减轻这些问题,但它们会增加训练过程的复杂性。

  • 数据集大小和质量:大型语言模型是在广泛的文本语料库上训练的。找到、清理和结构化组织如此庞大的数据集可能具有挑战性。此外,数据集的质量直接影响模型的表现。由于这些模型从它们训练的数据中学习,数据中的偏差或错误可能导致偏差或易出错的模型。

  • 过拟合:虽然大型模型具有学习复杂模式的高容量,但它们也可能过度拟合训练数据,尤其是在可用数据量与模型大小相比有限的情况下。过拟合会导致未见数据泛化能力差。可以使用正则化技术,如权重衰减、dropout和提前停止,来对抗过拟合。

  • 训练稳定性:随着模型变大,稳定训练它们变得更加困难。挑战包括管理学习率和批量大小,以及处理梯度消失或爆炸等问题。

  • 评估和微调:由于这些模型的大小,评估它们的性能也可能具有挑战性。此外,在特定任务上对这些模型进行微调可能很棘手,因为这可能导致“灾难性遗忘”,即模型忘记了预训练的知识。

  • 伦理和安全问题:大型语言模型可以生成有害或不适当的内容。它们还可以传播和放大训练数据中存在的偏见。这些问题需要开发强大的方法来控制模型的行为,无论是在训练期间还是在运行时。

尽管存在这些挑战,大型语言模型领域仍在继续取得进展。研究人员正在开发新的策略来减轻这些问题,并更有效地、负责任地训练大型模型。

语言模型的特定设计

在这里,我们将详细解释两种流行的语言模型架构,BERT和GPT。

BERT

我们之前提到的BERT,现在将进一步展开介绍,它是一种基于转换器的NLP任务机器学习技术。由谷歌开发,并在Jacob Devlin、Ming-Wei Chang、Kenton Lee和Kristina Toutanova合著的论文《Bert: Pre-training of deep bidirectional transformers for language understanding》,arXiv预印本arXiv:1810.04805(2018)中提出。

BERT的设计是为了通过在所有层中对左右上下文进行联合条件预训练,从未标记的文本中预训练深度双向表示。这与之前的方法,如GPT和ELMo,不同,它们只从左上下文或分别从左右上下文中预训练文本表示。这种双向性允许BERT更准确地理解上下文和单词的语义意义。

BERT的设计

BERT基于Transformer模型架构,如图6所示,最初由Vaswani等人发表在论文Attention is All You Need中提出。模型架构由堆叠的自注意力层和逐点全连接层组成。

BERT有两种大小:BERT BaseBERT Large。BERT Base由12个Transformer层组成,每个层有12个自注意力头,总共有1100万个参数。BERT Large更大,有24个Transformer层,每个层有16个自注意力头,总共有3400万个参数。

BERT的训练过程包括两个步骤:预训练微调

训练或使用语言模型的第一步是创建或加载其字典。我们通常使用分词器来实现这一目标。

分词器

为了高效地使用语言模型,我们需要使用一个分词器,将输入文本转换为有限数量的标记。子词分词算法,如字节对编码BPE)、一元语言模型ULM)和WordPiece,将单词分割成更小的子词单元。这对于处理词汇表外的单词很有用,并允许模型学习对子词部分的有意义表示,这些部分通常携带语义意义。

BERT分词器是BERT模型的一个关键组件,执行模型输入所需文本数据的初始预处理。BERT使用WordPiece分词,这是一种子词分词算法,将单词分解成更小的部分,允许BERT处理词汇表外的单词,减少词汇表的大小,并处理语言的丰富性和多样性。

下面是BERT分词器工作原理的详细分解:

  1. 基本分词:首先,BERT分词器执行基本分词,通过在空白和标点符号处分割文本来将文本分解成单个单词。这与其他分词方法中可能找到的方法类似。

  2. WordPiece分词:在基本分词之后,BERT分词器应用WordPiece分词。这一步将单词分解成更小的子词单元或“WordPieces”。如果一个单词不在BERT词汇表中,分词器将迭代地将单词分解成更小的子词,直到在词汇表中找到匹配项,或者直到不得不求助于字符级表示。

    例如,单词“unhappiness”可能被分解成两个WordPieces:“un”和“##happiness”。符号“##”用于表示是更大单词的一部分的子词,而不是一个完整的单词。

  3. 特殊标记添加:BERT分词器随后添加了必要的特殊标记,以支持特定的BERT功能。每个句子的开头都附加了[CLS]标记,作为分类任务的聚合表示。每个句子的结尾添加了[SEP]标记,以表示句子边界。如果输入了两个句子(对于需要句子对的任务),它们将通过这个[SEP]标记分开。

  4. 标记到ID的转换:最后,每个标记都被映射到一个整数ID,这个ID对应于它在BERT词汇表中的索引。这些ID是BERT模型实际使用的输入。

总结来说,BERT分词器的工作原理是首先将文本分词成单词,然后(如果需要)进一步将这些单词分解成WordPieces,添加特殊标记,最后将这些标记转换成ID。这个过程使得模型能够理解和生成对各种单词和子词的有意义的表现,从而有助于BERT在多种NLP任务上表现出强大的性能。

预训练

在预训练期间,BERT在大量的文本语料库上进行了训练(原始论文中使用了整个英文维基百科和BooksCorpus)。模型被训练去预测句子中的掩码单词(掩码语言模型),以及区分文本中两个句子是否按顺序出现(下一句预测),如这里所解释的:

  • 掩码语言模型:在这个任务中,一个句子中的15%的单词被一个[MASK]标记所替换,模型被训练去预测由非掩码单词提供的上下文中的原始单词。

  • 下一句预测:当模型被给出一对两个句子时,它也被训练去预测句子B是否是句子A之后的下一句。

微调

预训练后,BERT可以在具有显著较少训练数据的具体任务上进行微调。微调涉及向BERT添加一个额外的输出层,并在特定任务上端到端地训练整个模型。这种方法已经在包括问答、命名实体识别、情感分析等多种NLP任务上实现了最先进的结果。

BERT的设计及其预训练/微调方法彻底改变了NLP领域,并导致了在广泛的数据上训练大型模型,然后在特定任务上进行微调的趋势。

如何微调BERT进行文本分类

正如之前提到的,BERT已经在大量的文本数据集上进行了预训练,学习到的表示可以针对特定任务进行微调,包括文本分类。以下是如何逐步微调BERT进行文本分类的步骤:

  1. 预处理输入数据:BERT需要特定的输入数据格式。句子需要使用BERT自己的分词器将句子分词成子词,并添加特殊标记,如[CLS](分类)和[SEP](分隔)。[CLS]标记添加在每个示例的开头,用作分类任务的聚合序列表示。[SEP]标记添加在每个句子的末尾,以表示句子边界。然后,所有序列都填充到固定长度,以形成一个统一的输入。

  2. 加载预训练BERT模型:BERT有多个预训练模型,应根据任务选择正确的模型。这些模型在模型大小和预训练数据的语言方面有所不同。一旦加载预训练BERT模型,就可以用它为输入数据创建上下文化的词嵌入。

  3. 添加分类层:在预训练BERT模型之上添加一个分类层,也称为分类头。这个层将被训练以对文本分类任务进行预测。通常,这个层是一个全连接神经网络层,它以对应于[CLS]标记的表示作为输入,并输出类别的概率分布。

  4. 微调模型:微调涉及使用标记数据在特定任务(在这种情况下,文本分类)上训练模型。这个过程可以通过多种方式完成。更常见的方法是更新预训练BERT模型和新添加的分类层权重,以最小化损失函数,通常是分类任务的交叉熵损失。在微调期间使用较低的学习率很重要,因为较大的学习率可能会使预学习的权重不稳定。此外,建议的epoch数通常是两到四个,这样模型就能学习任务但不会过拟合。这种方法的好处是模型权重将被调整以在特定任务上表现良好。或者,我们可以冻结BERT层,只更新分类层权重。

  5. 评估模型:一旦模型经过微调,就可以在验证集上评估其性能,以评估其性能。这包括计算准确率、精确率、召回率和F1分数等指标。在训练和评估任务期间,与其他ML和DL模型类似,我们可以执行超参数调整。

  6. 应用模型:经过微调的模型现在可以用于对新、未见过的文本数据进行预测。与训练数据一样,这些新数据也需要预处理成BERT期望的格式。

重要注意事项

注意,与BERT一起工作需要相当的计算资源,因为该模型具有大量的参数。通常建议使用GPU进行微调和应用BERT模型。有一些模型比BERT轻量,性能略低,例如DistilBERT,在计算或内存资源受限的情况下可以使用。此外,BERT能够处理512个标记,这限制了我们的输入文本长度。如果我们想处理更长的文本,Longformer或BigBird是不错的选择。这里所解释的内容适用于类似的语言模型,如RoBERTa、XLNet等。

总结来说,对BERT进行文本分类的微调涉及预处理输入数据,加载预训练的BERT模型,添加分类层,在标记数据上微调模型,然后评估和应用模型。

我们将演示先前的BERT微调范式,然后在本章末尾应用它。您将有机会亲自使用它并调整以满足您的需求。

GPT-3

GPT-3,即生成****预训练Transformer 3,是由OpenAI开发的一种自回归语言模型,它使用深度学习技术生成类似人类的文本。它是GPT系列的第三个版本。GPT系列的后续版本,GPT-3.5和GPT-4,将在下一章中介绍,因为我们将扩展关于大型语言模型的内容。

GPT-3的设计和架构

GPT-3的架构扩展了其前辈使用的transformer模型架构。该架构基于一个使用Transformer块的Transformer模型,其中每个块由自注意力层和前馈神经网络层组成。

与之前的版本相比,GPT-3规模庞大。它由1750亿个ML参数组成。这些参数在训练阶段学习,模型学习预测一系列单词中的下一个单词。

GPT-3的Transformer模型旨在处理数据序列(在这种情况下,文本中的单词或标记序列),使其非常适合语言任务。它从左到右顺序处理输入数据,并为序列中的下一个项目生成预测。这是BERT和GPT之间的区别,在BERT中,使用两侧的单词来预测掩码词,但在GPT中,仅使用前面的单词进行预测,这使得它成为生成任务的不错选择。

预训练和微调

与BERT和其他基于Transformer的模型类似,GPT-3也涉及两个步骤的过程:预训练微调

预训练

在这个阶段,GPT-3在大量的文本数据语料库上进行训练。它学习预测句子中的下一个单词。然而,与BERT使用双向上下文进行预测不同,GPT-3仅使用左侧上下文(即句子中的前面的单词)。

微调

在预训练阶段之后,GPT-3 可以使用较少的任务特定训练数据在特定任务上进行微调。这可以是任何 NLP 任务,例如文本补全、翻译、摘要、问答等。

零样本、一样本和少样本学习

GPT-3 令人印象深刻的特点之一是其执行少样本学习的能力。当被赋予一个任务和该任务的几个示例时,GPT-3 通常能够准确地学习执行该任务。

在零样本设置中,模型被赋予一个任务而没有任何先前的示例。在一样本设置中,它被赋予一个示例,在少样本设置中,它被赋予几个示例来学习。

使用 GPT-3 的挑战

尽管GPT-3拥有令人印象深刻的性能,但也存在一些挑战。由于其规模庞大,它需要大量的计算资源来训练。它有时会生成不正确或无意义的响应,并且可能会反映训练数据中存在的偏差。它还难以处理需要深入理解世界或超越从文本中学习到的常识推理的任务。

回顾我们的用例 - 在 Jupyter Notebook 中为 NLP 分类设计的 ML/DL 系统设计

在本节中,我们将处理一个现实世界的问题,并看看我们如何可以使用 NLP 管道来解决它。这部分代码以 Google Colab 笔记本的形式共享,网址为 Ch6_Text_Classification_DL.ipynb

业务目标

在这种情况下,我们处于医疗保健行业。我们的目标是开发一个与医疗保健领域最新发现非常同步的通用医学知识引擎。

技术目标

技术总监从业务目标中推导出几个技术目标。其中一个目标是针对 ML 团队:鉴于与医学出版物相对应的结论集合不断增长,识别出代表建议的结论。这将使我们能够识别出源于基础研究的医学建议。

管道

让我们回顾一下管道的各个部分,如图 图 6**.9 所示:

图 6.9 – 典型探索和模型管道的结构

图 6.9 – 典型探索和模型管道的结构

注意这个设计与我们在 图 5**.2 中看到的设计有何不同。在那里,探索和评估部分利用了后来由 ML 模型使用的相同特征工程技术。在这里,使用 LMs,特征工程不是建模准备的一部分。预训练模型,特别是分词器,执行特征工程,这产生了与二进制、BoW 或 TF-IDF 特征非常不同且难以解释的特征。

注意

代码部分:从“设置”到“生成传统 ML 模型的结果”。

这些部分在本质上与第第5章中讨论的模拟部分相同。唯一的区别与数据的不同有关。

深度学习

在这段代码中,我们使用了一个深度学习语言模型。

当考虑通过LM应用迁移学习并针对我们的目标和数据进行微调时,有多个堆栈可供选择。最突出的是Google的TensorFlow和Meta的PyTorch。一个名为Transformers的包被构建为这些堆栈的包装器,以允许代码的更简单实现。在这个例子中,我们利用了transformers模型的简洁性和丰富性。

值得强调的是构建并支持Transformers包的公司:Hugging Face。Hugging Face承担起创建一个围绕免费、开源DL模型收集和共享的整个生态系统,这包括许多适应实现这些模型的组件。最实用的工具是Transformers包,这是一个Python包,致力于选择、导入、训练和部署一个庞大且不断增长的DL模型集合。

我们在这里审查的代码不仅提供了一个现实世界中的ML/DL系统设计的示例;还展示了Hugging Face的Transformers。

数据格式化

在这里,我们将数据设置成适合Transformers库的格式。列名必须非常具体。

评估指标

我们决定要优化的指标,并将其插入到训练过程中。对于这个二元分类问题,我们优化了准确率,并将我们的结果与数据集的基线准确率进行了比较,也称为先验。

训练器对象

这是用于在Transformers中训练LM的核心对象。它包含一组预定义的配置。一些关键的训练配置如下:

  • 神经网络的数学学习超参数,例如以下:

    • 学习率

    • 梯度下降设置

  • 训练轮数

  • 计算硬件使用情况

  • 训练过程中记录目标指标进度的日志设置

微调神经网络参数

关于微调语言模型的基本概念是迁移学习。神经网络非常适合迁移学习,因为可以从结构的末端简单地剥离任意数量的层,并用未训练的层替换它们,这些层将基于底层问题进行训练。未移除且未训练的其余层将继续以与语言模型最初训练时(当它最初构建时)完全相同的方式运行。如果我们替换最后一层但保留其余的原始层,那么我们可以将这些层视为监督特征工程,或者相反,作为嵌入机制。这种特性反映了迁移学习的概念。理想情况下,模型预计将很好地适应我们的底层问题,因此我们将选择保留绝大多数的原始层,只有一小部分会被替换并训练。这样,一个需要几周时间预训练的大型深度学习模型可以在几分钟内迁移和适应新的问题。

在我们的代码中,我们以这种方式设置模型,即我们确切地指定我们想要微调其哪些层。这是我们的设计选择,基于性能和计算资源。一个选择是微调紧接最终输出的最后一层,也称为分类头。另一种选择是微调所有层。在我们的代码中,我们明确调用模型的配置,该配置控制哪些层被微调,因此代码可以以任何适合设计的方式更改。

我们将训练器配置为实时记录训练性能。它将这些日志以表格形式打印出来,以便我们观察和监控。当训练完成后,我们绘制训练和评估的进度。这有助于我们了解训练结果和评估结果之间的关联。由于训练器使用的评估集可以被视为训练器上下文中的保留集,这个图表使我们能够研究欠拟合和过拟合。

生成训练结果——用于设计选择

我们回顾了训练集的结果,以及训练器打印出的日志。我们将它们与基线准确率进行了比较,并观察到准确率的提高。通过迭代多个不同的设计选择并进行比较,我们了解了我们设计的质量。将这个过程自动化为代码,以便对最佳设置进行系统评估。我们只是在笔记本中这样做,以保持示例的简单性。一旦我们相信我们已经找到了最佳设置,我们就可以说这个过程已经完成。

生成测试结果——用于展示性能

就像 第 5 章 中的代码一样,在这里,我们也以回顾测试结果结束。值得注意的是评估集和测试集之间的差异。有人可能会建议,由于训练者没有使用评估集进行训练,它可以作为一个保留的测试集,从而节省了从训练中排除许多观察结果的需要,并为模型提供更多标记数据。然而,尽管训练者没有使用评估集,我们确实使用了它来做出我们的设计决策。例如,我们观察了前一个部分的图表,并判断哪个数量的周期数是达到最佳拟合的最优选择。在 第 5 章 中也使用了评估集,但我们不需要明确定义它;它是作为 K 折交叉验证机制的一部分执行的。

摘要

在这一启发性的章节中,我们全面探索了深度学习及其在文本分类任务中通过语言模型应用的显著应用。我们从深度学习的概述开始,揭示了其从大量数据中学习复杂模式的能力,以及在推进最先进自然语言处理系统中的无可争议的作用。

然后,我们深入到变换器模型的变革性世界,这些模型通过提供传统 RNN 和 CNN 处理序列数据的有效替代方案,已经彻底改变了自然语言处理。通过解开注意力机制——变换器中的一个关键特性——我们突出了其专注于输入序列不同部分的能力,从而促进了上下文理解的更好。

我们的旅程继续深入探索 BERT 模型。我们详细介绍了其架构,强调其开创性地使用双向训练来生成语境丰富的词嵌入,并突出了其预训练过程,该过程从大量文本语料库中学习语言语义。

然而,我们的探索并未就此结束;我们还介绍了 GPT,另一个利用变换器能力以略有不同方式变革的模型——专注于生成类似人类的文本。通过比较 BERT 和 GPT,我们阐明了它们的独特优势和用例。

本章以一个关于如何使用这些高级模型设计和实现文本分类模型的实用指南结束。我们引导您经历了这个过程的各个阶段,从数据预处理和模型配置到训练、评估,最后是在未见过的数据上做出预测。

本质上,本章提供了对自然语言处理中深度学习的全面理解,从基本原理过渡到实际应用。凭借这些知识,您现在可以充分利用变压器模型、BERT和GPT的能力来处理您的文本分类任务。无论您是想进一步深入研究自然语言处理的世界,还是在实际环境中应用这些技能,本章都为您奠定了坚实的基础。

在本章中,我们向您介绍了大型语言模型。在下一章中,我们将更深入地探讨这些模型,以了解更多关于它们的信息。

第七章:揭秘大型语言模型:理论、设计和Langchain实现

在本章中,我们深入探讨了大型语言模型(LLMs)错综复杂的领域及其性能背后的数学概念。这些模型的出现彻底改变了自然语言处理(NLP)领域,提供了无与伦比的理解、生成和与人类语言互动的能力。

LLMs是人工智能(AI)模型的一个子集,可以理解和生成类似人类的文本。它们通过在多样化的互联网文本上进行训练来实现这一点,从而学习到关于世界的广泛事实。它们还学会了预测文本中的下一个内容,这使得它们能够生成富有创意、流畅且上下文一致的句子。

随着我们探索大型语言模型(LLMs)的操作,我们将介绍关键指标困惑度,这是衡量不确定性的一个关键指标,对于确定这些模型的性能至关重要。较低的困惑度表明语言模型(LM)在预测序列中的下一个单词时的信心,从而展示了其熟练程度。

本章借鉴了多篇深入探讨LLMs数学洞察力的有见地出版物。其中一些包括《神经概率语言模型》、《Attention is All You Need》和《PaLM:通过路径扩展语言建模》。这些资料将指导我们理解支撑LLMs及其卓越能力的稳健机制。

我们还将探讨在LMs背景下新兴的人类反馈强化学习(RLHF)领域。RLHF已被证明是微调LLMs性能的强大工具,从而导致了更准确和有意义的生成文本。

通过对LLMs数学基础的全面理解和对RLHF的深入研究,我们将获得这些先进AI系统的稳健知识,为该领域的未来创新和进步铺平道路。

最后,我们将讨论最近模型(如Pathways语言模型(PaLM)、大型语言模型Meta AI(LLaMA)和GPT-4)的详细架构和设计。

现在,让我们看看本章涵盖的主题:

  • 什么是LLMs,它们与LMs有何不同?

  • 开发和使用LLMs的动机

  • 开发LLMs的挑战

技术要求

对于本章,你应具备机器学习(ML)概念的坚实基础,特别是在Transformer强化学习领域。理解基于Transformer的模型至关重要,这些模型是许多当今LLMs的基础。这包括对诸如自注意力机制、位置编码和解码器架构结构等概念的了解。

理解强化学习原理也是必不可少的,因为我们将会深入探讨在LM微调中RLHF的应用。熟悉诸如策略梯度、奖励函数和Q学习等概念将大大提高你对这些内容的理解。

最后,编程能力,特别是Python,至关重要。这是因为许多概念将通过编程的角度进行演示和探索。熟悉PyTorch或TensorFlow等流行的机器学习库,以及Hugging Face的Transformers库(用于处理Transformer模型的关键资源)也将大有裨益。

然而,如果你觉得自己在某些领域有所欠缺,请不要气馁。本章旨在引导你了解这些主题的复杂性,并在过程中填补任何知识空白。因此,带着学习的心态做好准备,让我们深入探索LLMs的迷人世界!

LLM是什么?它们与LM有何不同?

LM是一种机器学习模型,它被训练来预测给定之前单词(或在某些模型中,周围单词)的序列中的下一个单词(或字符或子词,具体取决于模型的粒度)。它是一个概率模型,能够生成遵循某种语言风格或模式的文本。

在Transformer模型(如生成预训练Transformer(GPTs)和双向编码器表示来自Transformer(BERT))出现之前,NLP任务中广泛使用了其他几种类型的LM。以下小节将讨论其中的一些。

n-gram模型

这些是一些最简单的LM。一个n-gram模型使用前n-1个词来预测句子中的第n个词。例如,在二元(2-gram)模型中,我们会使用前一个词来预测下一个词。这些模型易于实现且计算效率高,但它们通常不如更复杂的模型表现得好,因为它们无法捕捉到词之间的长距离依赖关系。随着n的增加,它们的性能也会下降,因为它们受到数据稀疏性问题的影响(没有足够的数据来准确估计所有可能的n-gram的概率)。

隐藏马尔可夫模型(HMMs)

这些模型考虑了生成观察数据的“隐藏”状态。在语言建模的背景下,每个词都是一个观察状态,而“隐藏”状态则是一种某种类型的语言特征,它不是直接可观察的(例如,词的词性)。然而,与n-gram模型一样,HMMs也难以捕捉到词之间的长距离依赖关系。

循环神经网络(RNNs)

这些是一种神经网络,其中节点之间的连接形成了一个沿着时间序列的定向图。这使得它们能够使用它们的内部状态(记忆)来处理输入序列,使它们非常适合语言建模。它们可以捕捉单词之间的长距离依赖关系,但它们在所谓的梯度消失问题上挣扎,这使得在实践中学习这些依赖关系变得困难。

长短期记忆(LSTM)网络

LSTM网络是一种特殊的RNN,旨在学习长期依赖关系。它们通过使用一系列“门”来控制信息在网络记忆状态中的流入和流出。LSTMs在语言建模的先进技术中迈出了重要一步。

门控循环单元(GRU)网络

这些是LSTM的一种变体,它们的架构中使用了略微不同的门。它们通常比LSTMs更简单、训练更快,但它们是否比LSTMs表现更好或更差,往往取决于具体任务。

每个这些模型都有其自身的优点和缺点,并且它们之间没有一个是本质上比另一个更好或更差的——这完全取决于具体任务和数据集。然而,基于Transformer的模型在广泛的任务中通常优于所有这些模型,这导致了它们在NLP领域的当前流行。

LLMs如何脱颖而出

LLMs,例如GPT-3和GPT-4,仅仅是训练在大量文本上并且拥有大量参数的LMs。模型(就参数和训练数据而言)越大,它理解和生成复杂多变文本的能力就越强。以下是LLMs与较小LMs不同的几个关键方式:

  • 数据:LLMs在大量数据上训练。这使得它们能够从广泛的语用模式、风格和主题中学习。

  • 参数:LLMs拥有巨大的参数数量。ML模型中的参数是从训练数据中学习到的模型的部分。模型拥有的参数越多,它能够学习的复杂模式就越多。

  • 性能:由于它们在更多数据上训练并且拥有更多参数,LLMs通常比较小的LLMs表现更好。它们能够生成更连贯、多样化的文本,并且更好地理解上下文、进行推理,甚至能够在广泛的主题上回答问题或生成文本。

  • 计算资源:LLMs在训练过程中需要大量的计算资源,包括处理能力和内存。它们的训练时间也更长。

  • 存储和推理时间:大型模型也需要更多的存储空间,生成预测所需的时间更长(尽管在现代硬件上,这个推理时间通常仍然相当快)。

因此,我们可以这样说,LLMs实际上是小型LMs(语言模型)的扩展版本。它们在更多数据上进行训练,具有更多参数,并且通常能够产生更高品质的结果,但它们也需要更多资源来训练和使用。除此之外,LLM的一个重要优势是,我们可以在大量数据语料库上无监督地训练它们,然后使用有限的数据对不同的任务进行微调。

开发和使用LLMs的动机

开发和使用LLMs的动机源于与这些模型的能力相关的几个因素,以及它们在多样化应用中可能带来的潜在好处。以下小节详细介绍了这些关键动机之一。

性能提升

当LLMs(大型语言模型)在充足的数据上进行训练时,通常比小型模型表现出更好的性能。它们更擅长理解上下文,识别细微差别,并生成连贯且与上下文相关的响应。这种性能提升适用于NLP(自然语言处理)的广泛任务,包括文本分类、命名实体识别、情感分析、机器翻译、问答和文本生成。如表7.1所示,BERT(第一个广为人知的LLMs之一)和GPT的性能与之前的模型在通用语言理解评估GLUE)基准上进行了比较。GLUE基准是一系列多样化的自然语言理解NLU)任务集合,旨在评估模型在多个语言挑战中的性能。基准涵盖了诸如情感分析、问答和文本蕴涵等任务。它是NLU领域广泛认可的标准,为比较和改进语言理解模型提供了一个全面的套件。可以看出,它在所有任务中的表现都更好:

模型 所有任务平均( 情感分析 语法 相似度
BERT large 82.1 94.9 60.5 86.5
BERT base 79.6 93.5 52.1 85.8
OpenAI GPT 75.1 91.3 45.4 80.0
预开AI 艺术状态STOA 74.0 93.2 35.0 81.0
双向长短期记忆(BiLSTM)+ 语言模型(ELMo)嵌入 + 注意力 71.0 90.4 36.0 73.3

表7.1 – 比较不同模型在GLUE上的性能(此比较基于BERT和GPT发布时的2018年)

广泛泛化

在多样化数据集上训练的LLMs可以在不同的任务、领域或语言风格之间更好地泛化。它们可以从训练数据中有效地学习,以识别和理解广泛的语言模式、风格和主题。这种广泛的泛化能力使它们适用于各种应用,从聊天机器人到内容创作到信息检索。

当LM更大时,这意味着它有更多的参数。这些参数允许模型捕捉和编码数据中的更复杂关系和细微差别。换句话说,更大的模型可以从训练数据中学习并保留更多信息。因此,它在训练后能够更好地处理更广泛的任务和上下文。正是这种增加的复杂性和容量使得更大的LLM在不同任务上具有更强的泛化能力。正如我们在图7.1中可以看到的,更大的LLM在不同任务上的表现更好。

图7.1 – 基于大小和训练的LLM性能

图7.1 – 基于大小和训练的LLM性能

我们还可以在图7.2中看到过去三年LLM发展的进展。

图7.2 – 2019年至2023年间发布的LLM(公开可用的模型已突出显示)

图7.2 – 2019年至2023年间发布的LLM(公开可用的模型已突出显示)

然而,需要注意的是,虽然较大的模型往往具有更强的泛化能力,但它们也带来了挑战,例如计算需求增加和过拟合的风险。同时,确保训练数据能够代表模型预期执行的任务和领域也是至关重要的,因为模型可能会继承训练数据中存在的任何偏差。

少样本学习

GPT-3、GPT-3.5和GPT-4等LLM展示了令人印象深刻的少样本学习能力。给定几个示例(“样本”),这些模型可以有效地泛化到完成类似任务。这使得在实际应用中调整和部署这些模型更加高效。提示可以设计为包含模型可以参考的信息,例如示例问题和相应的答案。

模型会从给定的示例中临时学习,并将给定信息作为额外来源。例如,当将LLM用作个人助理或顾问时,可以将有关用户背景的信息附加到提示中,使模型能够“了解你”,因为它使用你的个人信息提示作为参考。

理解复杂上下文

由于LLM在广泛的数据上进行大量训练,包括各种主题、文学风格和细微差别,以及其深度架构和大型参数空间,它们具有理解复杂上下文的优势。这种能力使它们即使在复杂或细微的情况下也能理解和生成适当的回应。

例如,考虑一个用户要求模型总结一篇复杂科学文章的场景。LLM可以理解文章的上下文和使用的专业技术语言,并生成连贯且简化的摘要。

多语言能力

LLM可以有效地处理多种语言,使其适用于全球应用。以下是一些著名的多语言LLM。

mBERT(多语言BERT)

mBERT(多语言BERT)是对BERT的一种扩展,它使用掩码语言模型目标在拥有最大维基百科的104种主要语言上进行预训练。

跨语言语言模型(XLM)

它在100种语言上进行训练。它将BERT模型扩展到包括几种跨语言模型训练方法。

XLM-RoBERTa

XLM-RoBERTa扩展了RoBERTa,而RoBERTa本身是BERT的一个优化版本,并在一个覆盖更多语言的更大多语言语料库上进行了训练。

MarianMT

Hugging Face的Transformers库的一部分,MarianMT是一个针对翻译任务优化的最先进的基于Transformer的模型。

DistilBERT 多语言

这是通过蒸馏过程实现的mBERT的一个较小且更快的版本。

T2T(T5)多语言

这是一种文本到文本迁移转换器T5)模型的变体,它针对翻译任务进行了微调。

这些模型在各种任务中取得了显著成果,例如翻译、命名实体识别、词性标注和多种语言中的情感分析。

人类似文本生成

LLMs在生成类似人类的文本方面表现出非凡的能力。它们可以在对话中创建上下文适当的回应,撰写文章,并生成诗歌和故事等创意内容。GPT-3、ChatGPT和GPT-4等模型在文本生成任务中取得了良好的结果。

虽然优势很多,但重要的是要注意,使用LLMs(大型语言模型)也存在挑战和潜在风险。它们需要大量的计算资源来训练和部署,并且持续存在有关它们可能生成有害或偏见内容、可解释性和环境影响的相关担忧。研究人员正在积极研究减轻这些问题同时利用这些模型强大功能的方法。

由于这些原因,公司正在尝试实施和训练更大的LMs(图7**.3):

图7.3 – 新的LMs及其大小,以及开发者

图7.3 – 新的LMs及其大小,以及开发者

开发LLMs的挑战

开发LLMs带来了一系列独特的挑战,包括但不限于处理大量数据、需要巨大的计算资源以及引入或持续偏见的风险。以下小节概述了这些挑战的详细解释。

数据量

LLMs require enormous amounts of data for training. As the model size grows, so does the need for diverse, high-quality training data. However, collecting and curating such large datasets is a challenging task. It can be time-consuming and expensive. There’s also the risk of inadvertently including sensitive or inappropriate data in the training set. To have more of an idea, BERT has been trained using 3.3 billion words from Wikipedia and BookCorpus. GPT-2 has been trained on 40 GB of text data, and GPT-3 has been trained on 570 GB of text data. Table 7.2 shows the number of parameters and size of training data of a few recent LMs.

Model Parameters Size of training data
GPT-3.5 175 B 300 billion tokens
GPT-3 175 B 300 billion tokens
PaLM 540 B 780 billion tokens
LLaMA 65 B 1.4 trillion tokens
Bloom 176 B 366 billion tokens

表7.2 – 一些最近LM的参数数量和训练数据

计算资源

Training LLMs requires substantial computational resources. These models often have billions or even trillions of parameters and need to process vast amounts of data during training, which requires high-performance hardware (such as GPUs or TPUs) and a significant amount of time. This can be costly and could limit the accessibility of developing such models to only those who have these resources. For example, training GPT-3 took 1 million GPU hours, which cost around 4.6 million dollars (in 2020). Table 7.3 shows the computational resources and training time of a few recent LMs.

Model Hardware Training time
PaLM 6144 TPU v4 -
LLaMA 2048 80G A100 21 days
Bloom 384 80G A100 105 days
GPT-3 1024x A100 34 days
GPT-4 25000 A100 90–100 days

表7.3 – 一些最近LM的硬件和训练时间

偏差风险

LLMs can learn and perpetuate biases present in their training data. This could be explicit bias, such as racial or gender bias in the way language is used, or more subtle forms of bias, such as the underrepresentation of certain topics or perspectives. This issue can be challenging to address because bias in language is a deeply rooted societal issue, and it’s often not easy to even identify what might be considered bias in a given context.

模型鲁棒性

It’s challenging to ensure that LLMs will perform well in all possible scenarios, particularly on inputs that differ from their training data. This includes dealing with ambiguous queries, handling out-of-distribution data, and ensuring a level of consistency in the responses. Making sure that the model is not overtrained can help to have a more robust model, but much more is needed to have a robust model.

可解释性和调试

LLMs,就像大多数深度学习DL)模型一样,通常被描述为“黑盒”。理解它们为何做出特定的预测或如何得出结论并不容易。如果模型开始产生错误或不适当的输出,这会使调试变得具有挑战性。提高可解释性是一个活跃的研究领域。例如,一些库试图通过采用诸如特征重要性分析等技术来阐明LM的决策过程,这些技术涉及移除一些单词并分析梯度变化。

其中一种方法是输入扰动技术。在这种方法中,从输入文本中扰动或移除一个单词(或多个单词),并分析模型输出的变化。背后的原理是了解特定输入单词对模型输出预测的影响。如果移除某个单词显著改变了模型的预测,可以推断模型认为这个单词对其预测很重要。

分析梯度变化是另一种流行的方法。通过研究当移除某个单词时,输出相对于输入的梯度如何变化,可以深入了解模型决策过程如何受到该特定单词的影响。

这些解释技术为LLMs复杂的决策过程提供了更透明的视角,使研究人员能够更好地理解和改进他们的模型。LIME和SHAP等库提供了模型解释任务的工具,从而使这个过程对研究人员更加容易访问。

环境影响

训练LLMs所需的强大计算资源可能对环境产生重大影响。这些模型训练所需的能量可能有助于碳排放,这是一个从可持续性的角度来看的担忧。

此外,人们对LLMs中的隐私和安全问题表示担忧。例如,建议不要分享使用患者医疗信息训练的模型,或者不要将敏感信息输入到公开可用的LLMs,如ChatGPT,因为它可以将这些信息作为其他用户问题的答案返回。

不同类型的LLMs

LLMs通常是训练在大量文本数据上的神经网络架构。术语“大”指的是这些模型在参数数量和训练数据规模方面的规模。以下是一些LLMs的例子。

Transformer模型

Transformer模型在最近的LLMs浪潮中处于前沿。它们基于“Transformer”架构,该架构在Vaswani等人撰写的论文《Attention is All You Need》中引入,它使用自注意力机制在预测时权衡输入中不同单词的相关性。Transformers是一种神经网络架构,由Vaswani等人引入的论文《Attention is All You Need》中提出。它们的一个显著优势,尤其是对于LLMs的训练,是它们适合并行计算。

在传统的RNN模型中,例如LSTM和GRU,文本中的标记(单词、子词或字符)必须按顺序处理。这是因为每个标记的表示不仅取决于标记本身,还取决于序列中的前一个标记。这些模型的内在顺序性质使得它们的操作难以并行化,这可能会限制训练过程的速度和效率。

与之相反,Transformer通过使用称为自注意力的机制(或缩放点积注意力)消除了顺序处理的需要。在自注意力过程中,每个标记的表示被计算为序列中所有标记的加权总和,权重由注意力机制确定。重要的是,这些针对每个标记的计算与其他标记的计算是独立的,因此可以并行执行。

这种并行化能力为训练LLM带来了几个优势,我们将在下面讨论。

速度

通过并行计算,Transformers可以比RNN更快地处理大量数据。这种速度可以显著减少LLM的训练时间,因为LLM通常需要处理大量数据。

可扩展性

Transformer的并行化使得扩大模型规模和训练数据量变得更加容易。这种能力对于开发LLM至关重要,因为这些模型通常从在大数据集上训练和拥有更多参数中受益。

长距离依赖

Transformer能够更好地捕捉标记之间的长距离依赖关系,因为它们同时考虑序列中的所有标记,而不是逐个处理。这种能力在许多语言任务中非常有价值,可以提高LLM的性能。

这些模型各有其优势和劣势,最佳模型的选择可能取决于具体任务、可用训练数据量和计算资源。

最先进的LLM的示例设计

在本部分,我们将深入探讨在撰写本书时一些最新LLM的设计和架构。

GPT-3.5和ChatGPT

ChatGPT的核心是一个Transformer,这是一种使用自注意力机制来衡量输入中不同单词相关性的模型架构。它允许模型在生成响应时考虑输入的完整上下文。

GPT模型

ChatGPT基于Transformer的GPT版本。GPT模型被训练来预测给定所有先前单词的序列中的下一个单词。它们从左到右处理文本(单向上下文),这使得它们非常适合文本生成任务。例如,ChatGPT所基于的GPT版本之一,GPT-3,包含1750亿个参数。

两步训练过程

ChatGPT的训练过程分为两个步骤:预训练和微调。

预训练

在这一步,模型在互联网上公开可用的文本的大量语料库上进行训练。然而,值得注意的是,它并不知道其训练集中具体有哪些文档,也无法访问任何特定的文档或来源。

微调

在预训练之后,基础模型在OpenAI创建的定制数据集上进行进一步训练(微调),这些数据集包括正确行为的演示以及不同响应的排序比较。一些提示来自Playground和ChatGPT应用的用户,但它们被匿名化,并去除了个人身份信息。

RLHF

微调过程的一部分涉及RLHF,其中人类AI训练师对一系列示例输入的模型输出提供反馈,并将此反馈用于改进模型的响应。RLHF是用于训练ChatGPT的微调过程中的一个关键组件。这是一种通过学习来自人类评估者的反馈来细化模型性能的技术。在这里,我们首先解释RLHF的一般概念,在下一节中,我们将逐步解释。

RLHF的第一步是收集人类反馈。对于ChatGPT来说,这通常涉及让人类AI训练师参与对话,在其中他们扮演双方(用户和AI助手)。训练师还可以访问模型撰写的建议,以帮助他们撰写响应。这种对话,其中AI训练师实际上是在与自己进行对话,被添加到数据集以进行微调。

除了对话之外,还创建了比较数据,其中多个模型响应根据质量进行排序。这是通过采取一个对话轮次,生成几个不同的完成(响应),并让人类评估者对它们进行排序来完成的。评估者不仅对响应的事实正确性进行排序,还根据他们认为响应的有用性和安全性进行排序。

然后使用近端策略优化PPO)算法对模型进行微调,这是一种强化学习算法。PPO试图根据人类反馈改进模型的响应,通过对模型参数进行小幅度调整,增加获得好评响应的可能性,并减少获得差评响应的可能性。

RLHF是一个迭代过程。收集人类反馈、创建比较数据和使用PPO微调模型的过程重复多次,以逐步改进模型。接下来,我们将更详细地解释PPO的工作原理。

PPO是一种用于优化代理π策略的强化学习算法。策略定义了代理如何根据其当前状态选择动作。PPO旨在优化此策略,以最大化预期的累积奖励。

在深入研究PPO之前,定义奖励模型非常重要。在强化学习的背景下,奖励模型是一个R(s, a)函数,它为每个状态-动作对(s, a)分配一个奖励值。代理的目标是学习一个策略π,该策略最大化这些奖励的期望总和。

强化学习的目标可以从以下方面进行数学定义:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" display="block">mml:miJ</mml:mi><mml:mfenced separators="|">mml:mrowmml:miπ</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo>mml:msubmml:mrowmml:miE</mml:mi></mml:mrow>mml:mrowmml:miπ</mml:mi></mml:mrow></mml:msub><mml:mfenced separators="|">mml:mrowmml:mrowmml:munder<mml:mo stretchy="false">∑</mml:mo>mml:mrowmml:mit</mml:mi></mml:mrow></mml:munder>mml:mrowmml:miR</mml:mi>mml:mo(</mml:mo>mml:msubmml:mrowmml:mis</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi></mml:mrow></mml:msub>mml:mo,</mml:mo>mml:msubmml:mrowmml:mia</mml:mi></mml:mrow>mml:mrowmml:mit</mml:mi></mml:mrow></mml:msub>mml:mo)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:mfenced></mml:math>

在这个公式中,Eπ[.]是遵循策略π生成的轨迹(状态-动作对的序列)的期望,s_t是时间t的状态,a_t是时间t采取的动作,而R(s_t, a_t)是时间t收到的奖励。

PPO通过引入一个比率,r_t(θ),来修改这个目标,以鼓励策略空间的探索,同时防止在每次更新时策略发生太大变化。这个比率r_t(θ)表示当前策略π_θ与旧策略π_θ_old的概率比:

rt(θ)=πθ(at|st)πθold(at|st)

PPO的目标随后定义为以下:

JPPOπ=Eπoldmin(rtθAt,clip(rtθ,1−ϵ,1+ϵ)At

在这里,A_t 是一个优势函数,它衡量采取行动 a_t 相比于状态 s_t 的平均行动有多好,而 clip(r_t(θ), 1 - ε, 1 + ε)r_t(θ) 的裁剪版本,旨在阻止策略更新过大。

算法随后使用随机梯度上升优化这个目标,调整策略参数 θ 以增加 J_PPO(π)

在 ChatGPT 和 RLHF 的背景下,状态对应于会话历史,动作对应于模型生成的消息,奖励对应于对这些消息的人类反馈。PPO 被用来调整模型参数,以提高人类反馈判断的生成消息质量。

人类排名被用来创建奖励模型,该模型量化了每个响应的好坏。奖励模型是一个函数,它接受一个状态和一个动作(在这种情况下,是会话上下文和模型生成的消息),并输出一个标量奖励。在训练过程中,模型试图最大化其期望累积奖励。

RLHF 的目标是使模型的行为与人类价值观保持一致,并提高其生成有用和安全响应的能力。通过学习人类反馈,ChatGPT 可以适应更广泛的会话上下文,并提供更合适、更有帮助的响应。值得注意的是,尽管有这些努力,系统仍然可能会犯错误,处理这些错误和改进 RLHF 流程是一个持续研究的领域。

生成响应

当生成响应时,ChatGPT 以会话历史为输入,包括会话中的先前消息以及最新的用户消息,并生成一个模型生成的消息作为输出。会话历史被标记化并输入到模型中,模型生成一系列标记作为响应,然后这些标记被反标记化以形成最终的输出文本。

系统级控制

OpenAI还实施了一些系统级控制,以减轻ChatGPT的有害或不真实输出。这包括一个 moderation API,它会警告或阻止某些类型的不安全内容。

ChatGPT中RLHF的逐步过程

由于RLHF是ChatGPT和其他许多最先进SOTA)模型的重要组成部分,更好地理解它对您是有用的。近年来,LM已经展示了非凡的能力,根据人类生成的提示创建出多样化和引人入胜的文本。尽管如此,由于它本质上是主观的并且取决于上下文,精确地定义“好的”文本仍然具有挑战性。例如,在创作故事时需要创造力,信息性文章需要准确性,而代码片段需要可执行性。

定义一个损失函数来封装这些属性似乎几乎是不可能的,因此大多数LM都是使用基本的下一个标记预测损失进行训练,例如交叉熵。为了克服损失函数的限制,个人已经开发了与人类偏好更好地对齐的指标,例如BLEU或ROUGEBLEU分数,或双语评估助手,是一个用于衡量机器翻译文本与一组参考翻译相比有多好的指标。尽管这些指标在评估性能方面更有效,但它们本质上是有局限性的,因为它们仅仅使用基本规则将生成的文本与参考进行比较。

如果我们能将人类对生成文本的反馈作为性能指标,甚至更好的是作为优化模型的损失,那将会产生变革性的影响吗?这就是RLHF背后的概念——利用强化学习技术直接使用人类反馈来优化LM。RLHF已经开始使LM能够将基于通用文本语料库训练的模型与复杂的人类价值观对齐。

RLHF最近在ChatGPT的开发中取得了成功应用。

RLHF的概念由于其多方面的模型训练过程和不同的部署阶段,提出了一个巨大的挑战。在这里,我们将训练过程分解为其三个基本组成部分:

  • LM的初始预训练

  • 数据收集和奖励模型训练

  • 使用强化学习精炼LM

我们将首先检查LM的预训练阶段。

LM预训练

作为基础,RLHF使用了一个已经使用传统预训练目标进行预训练的LM,这意味着我们根据训练数据创建分词器,设计模型架构,然后使用训练数据预训练模型。对于其最初受到好评的RLHF模型InstructGPT,OpenAI使用了GPT-3的小型版本。另一方面,Anthropic使用了从1000万到520亿参数的transformer模型进行这项任务,而DeepMind则使用了其2800亿参数的模型Gopher。

这个初步模型可以在额外的文本或特定条件下进一步细化,尽管这并不总是必要的。例如,OpenAI选择使用被标记为“更可取”的人类生成的文本来细化其模型。这个数据集被用来进一步微调模型,使用RLHF模型,基于人类提供的上下文提示来提炼原始LM模型。

通常来说,关于“哪种模型”作为RLHF的最佳起点的问题并没有一个确定的答案。可供RLHF训练的选项尚未得到充分探索。

接下来,一旦LLM就位,就需要生成数据来训练奖励模型。这一步对于将人类偏好整合到系统中至关重要。

图7.4 – 预训练LM

图7.4 – 预训练LM

训练奖励模型

在新提出的方法中,RLHF被用作RM,这同样被称为偏好模型。这里的核心理念是获取一段文本并返回一个反映人类偏好的标量奖励。这种方法可以有两种实现方式。首先,实现一个端到端的LLM,它给出我们想要的输出。这个过程可以通过微调一个LLM或从头开始训练一个LLM来完成。其次,有一个额外的组件,它对LLM的不同输出进行排序,并返回最佳输出。

用于训练RM的数据集是一组提示生成对。提示从预定的数据集(Anthropic的数据)中采样。这些提示通过初始LM进行处理,以生成新的文本。

人类标注员对LM生成的文本输出进行排名。直接为每个文本片段分配标量分数以生成奖励模型似乎很直观,但在现实中这很具挑战性。不同的价值观使得这些分数无法标准化且不可靠。因此,排名被用来比较多个模型输出,从而创建一个大大改善的正则化数据集。

文本排名有几种策略。一种成功的方法是让用户比较两个LLM在相同提示下产生的文本。通过直接比较模型输出,可以生成一个Elo评分系统,我们将在下面描述,它可以生成模型和输出之间的排名。然后,这些不同的排名方法被归一化成一个标量奖励信号用于训练。最初为国际象棋开发的Elo评分系统也适用于LM的RLHF。

在LM的背景下,每个模型或变体(例如,不同训练阶段的模型)可以被视为一个“玩家”。它的Elo评分反映了它在生成人类偏好输出方面的表现。

Elo评分系统的基本机制保持不变。以下是它如何适应LM中的RLHF:

  • 初始化:所有模型都以相同的Elo评分开始,通常是1,000或1,500。

  • 比较:对于给定的提示,两个模型(A和B)生成它们的输出。然后,人类评估者对这些输出进行排名。如果评估者认为模型A的输出更好,则模型A“赢得”比赛,而模型B“失败”。

每次评估后,Elo评分以这种方式更新。随着时间的推移,它们根据人类偏好提供模型的持续、动态排名。这对于跟踪训练过程中的进度以及比较不同的模型或模型变体非常有用。

成功的RLHF系统使用了不同大小的奖励语言模型相对于文本生成。例如,OpenAI使用了一个175B的语言模型和一个6B的奖励模型,Anthropic使用了从10B到52B的语言模型和奖励模型,而DeepMind为语言模型和奖励模型都使用了70B的Chinchilla模型。这是因为偏好模型必须与模型生成文本所需的容量相匹配。在RLHF的此阶段,我们拥有一个能够进行文本生成的初始语言模型和一个根据人类感知对任何文本进行评分的偏好模型。接下来,我们应用强化学习来优化原始语言模型以适应奖励模型。

图7.5 – 强化学习的奖励模型

图7.5 – 强化学习的奖励模型

如何使用强化学习微调模型

在相当长的一段时间里,由于技术和算法上的挑战,使用强化学习训练语言模型被认为是不可能的。然而,一些组织已经通过策略梯度强化学习算法——即PPO,成功地对初始语言模型副本的一些或所有参数进行了微调。由于使用10B或100B+参数的整个模型进行微调的成本过高(更多细节请参阅针对语言模型的低秩自适应(LoRA)或DeepMind的Sparrow语言模型),因此语言模型的参数保持静态。PPO作为一种已经存在一段时间的方法,有大量的指南解释其工作原理。这种成熟度使其成为扩展到RLHF新型应用(分布式训练)的吸引人选择。似乎通过确定如何使用已知算法更新如此庞大的模型,RLHF已经取得了重大进展(更多内容将在后面介绍)。

我们可以将这个微调任务表述为一个强化学习问题。最初,策略是一个接受提示并生成一系列文本(或仅仅是文本的概率分布)的LM。这个策略的动作空间是与LM词汇表相匹配的所有标记(通常约为50 K个标记),而观察空间是可能的输入标记序列的分布,鉴于强化学习之前的用途(维度近似于输入标记序列词汇大小的幂(^)长度)。奖励函数将偏好模型与策略转移的约束结合起来。

奖励函数是系统将所有讨论过的模型整合到单个强化学习与人类反馈(RLHF)过程中的交汇点。给定数据集中的提示x,文本y由当前迭代的微调策略创建。这个文本与原始提示一起传递给偏好模型,该模型返回一个表示“偏好度”的标量度量rθ

此外,强化学习策略的每个标记的概率分布与初始模型中的概率分布进行对比,以计算它们差异的惩罚。在OpenAI、Anthropic和DeepMind的几篇论文中,这个惩罚被构建为这些分布序列之间的Kullback–LeiblerKL)散度的缩放版本<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">mml:msubmml:mrowmml:mir</mml:mi></mml:mrow>mml:mrowmml:miK</mml:mi>mml:miL</mml:mi></mml:mrow></mml:msub></mml:math>。KL散度项惩罚强化学习策略在每次训练批次中显著偏离初始预训练模型,确保生成合理连贯的文本片段。

没有这种惩罚,优化过程可能会开始生成一些胡言乱语,这些胡言乱语可能会以某种方式欺骗奖励模型,使其给予高奖励。在实践中,KL散度通过从两个分布中进行采样来近似。最终传递给强化学习更新规则的奖励如下:

r=rθ−λrKL

一些RLHF系统已经将额外的术语纳入奖励函数。例如,OpenAI的InstructGPT成功尝试将额外的预训练梯度(来自人类标注集)融合到PPO的更新规则中。预计随着RLHF的继续研究,这个奖励函数的公式将继续演变。

最后,更新规则是PPO从当前数据批次中优化奖励指标参数的更新(PPO是按策略的,意味着参数只更新当前批次的提示生成对)。PPO是一种信任域优化算法,它通过约束梯度来确保更新步骤不会破坏学习过程。DeepMind为Gopher采用了类似的奖励设置,但使用了同步优势演员。

图7.6 – 使用强化学习微调模型

图7.6 – 使用强化学习微调模型

前面的图表可能表明,两个模型对相同的提示产生了不同的响应,但实际上,强化学习策略生成文本,然后将其提供给初始模型以推导其相对概率,用于KL惩罚。

可选地,RLHF可以通过周期性地更新奖励模型和政策来从这一阶段进一步发展。随着强化学习策略的演变,用户可以保持这些输出与模型先前版本的排名。然而,大多数论文尚未解决这一操作的实现,因为收集此类数据所需的部署模式仅适用于能够访问活跃用户基础的对话代理。Anthropic将这种替代方案称为迭代在线RLHF(如原文所述),其中策略的迭代被纳入模型之间的Elo排名系统。这带来了策略和奖励模型演变的复杂动态,代表了一个复杂且未解决的问题。在下一节中,我们将解释一些RLHF的知名开源工具。

GPT-4

在撰写本书时,我们对GPT-4模型设计所知甚少。由于OpenAI缓慢地透露信息,我们假设GPT-4不是一个单一模型,而是八个220亿参数模型的组合,这一假设得到了AI社区关键人物的证实。这一假设表明OpenAI使用了“专家混合”策略,这是一种ML设计策略,其历史甚至可以追溯到LLMs之前。然而,尽管我们,作为作者,支持这一假设,但它尚未得到OpenAI的官方确认。

尽管存在猜测,但GPT-4令人印象深刻的性能是无可否认的,无论其内部结构如何。它在写作和编码任务上的能力是显著的,而它是一个模型还是八个捆绑在一起,并不改变其影响。

一种常见的说法是,OpenAI巧妙地管理了人们对GPT-4的期望,专注于其能力,并因竞争压力而未披露规格。围绕GPT-4的保密性使许多人相信它是一个科学奇迹。

LLaMA

Meta 已公开发布 LLaMA,这是一个高性能的大型语言模型(LLM),旨在帮助 AI 研究人员。这一举措使得那些有限访问广泛基础设施的个人能够检查这些模型,从而扩大了在这个快速发展的领域的访问。

LLaMA 模型之所以吸引人,是因为它们需要的计算能力和资源显著减少,这使得探索新的方法和用例成为可能。这些模型有多种尺寸,旨在针对各种任务进行微调,并且是在负责任的 AI 实践中开发的。

尽管大型语言模型(LLMs)取得了进步,但由于训练和运行它们所需的资源有限,它们的研究可访问性有限。在更多标记上训练的较小模型,如 LLaMA,更容易重新训练和调整以适应特定用例。

与其他模型类似,LLaMA 以一系列单词作为输入来预测下一个单词并生成文本。尽管它具有强大的功能,但 LLaMA 在偏见、有害评论和幻觉方面与其他模型面临相同的挑战。通过共享 LLaMA 的代码,Meta 使研究人员能够测试在大型语言模型(LLMs)中解决这些问题的新的方法。

Meta 强调了在 AI 社区内部建立关于负责任 AI 和 LLMs 的指导方针的必要性。他们预计 LLaMA 将促进该领域的新的学习和开发。

PaLM

PaLM 是一个拥有 5400 亿参数、密集激活的 Transformer 语言模型(LM),它使用 Pathways 这个新的机器学习系统在 6144 个 TPU v4 芯片上进行了训练,该系统使得跨多个 TPU pod 的训练效率极高。

已有研究表明,PaLM 在各种自然语言任务上实现了突破性的性能,包括以下方面:

  • 多步骤推理任务

  • 最近发布的 超越模仿游戏 基准(BIG-bench

  • 多语言任务

  • 源代码生成

BIG-bench基准测试值得进一步探讨,因为它作为公认的基准测试集合,用于衡量各种性能。BIG-bench是一个专门为大规模语言模型设计的广泛评估机制。它是一个基于广泛、社区关注的基准,提供了各种任务来评估模型在不同学科中的性能,以及其在自然语言理解、问题解决和推理方面的能力。总共有来自132个机构的450位贡献者提交的204个任务,BIG-bench涵盖了包括语言学、儿童发展、数学、常识推理、生物学、物理学、软件开发甚至社会偏见在内的多种主题。它专注于被认为目前超出现有语言模型能力范围的问题。BIG-bench的主要目标超越了简单的模仿或图灵测试风格的评估,而是旨在对大型模型的能力和限制进行更深入、更细致的评价。这一倡议基于这样的信念:一种开放、协作的评估方法为更全面地理解这些语言模型及其潜在的社会影响铺平了道路。

PaLM 540B在多种多步推理任务上超越了经过微调的最先进状态,并在BIG-bench基准测试中超越了平均人类表现。随着PaLM扩展到其最大规模,许多BIG-bench任务在性能上实现了显著飞跃,显示出从模型规模到性能的连续改进。PaLM在多语言任务和源代码生成方面也具有强大的能力。例如,PaLM可以在50种语言之间进行翻译,并且可以生成多种编程语言的代码。

PaLM论文的作者还讨论了与大型语言模型相关的伦理考量,并讨论了潜在的缓解策略。例如,他们建议,了解大型语言模型中潜在的偏见是很重要的,并且开发检测和缓解偏见的技术的也很重要。

PaLM架构

PaLM采用传统的Transformer模型架构,在解码器专用设置中,允许每个时间步只关注自身和前一时间步。对此设置进行了以下几项修改:

  • SwiGLU激活函数:与标准的ReLU、GeLU或Swish激活函数不同,PaLM使用SwiGLU激活函数(Swish(xW) · xV)作为多层感知器MLP)的中间激活函数,因为它们在提升质量方面表现出更优越的性能。然而,这种方法在MLP中需要三个矩阵乘法,而传统方法只需要两个。

  • 并行层:不同于典型的“序列化”方法,PaLM为每个Transformer块使用“并行”公式。

    标准结构如下:

    y=x+MLP(LayerNorm(x+Attention(LayerNorm(x)))

    并行结构如下:

    y=x+MLP(LayerNorm(x))+Attention(LayerNorm(x))

    由于MLP和注意力输入矩阵乘法的融合,这在大规模上导致大约15%的训练速度提升。

  • 多查询注意力:在传统的Transformer公式中,使用k个注意力头。对于每个时间步,输入向量被线性投影到查询、键和值张量,这些张量的形状为[k, h],其中h表示注意力头的大小。在新方法中,“键”和“值”的投影在所有头之间共享,这意味着“键”和“值”被投影到[1, h],而“查询”保持[k, h*]的形状。作者声称,这种方法不会显著影响模型质量或训练速度,但在自回归解码期间它确实导致了显著的成本降低。原因在于标准多头注意力在加速器硬件上的低效,因为在自回归解码期间,键/值张量没有在示例之间共享,并且每次只解码一个标记。

  • 旋转位置嵌入(RoPE)嵌入:RoPE嵌入在较长的序列长度上表现出更好的性能,因此比绝对或相对位置嵌入更受欢迎。

  • 共享输入-输出嵌入:输入和输出嵌入矩阵是共享的,这种做法在先前的工作中很常见,尽管并非普遍存在。

  • 无偏差:该模型避免在任何密集核或层归一化中使用偏差,这增强了大型模型的训练稳定性。

  • 词汇表:PaLM使用256k-token SentencePiece词汇表,该词汇表专为训练语料库中的多种语言设计,确保高效训练而不会过度标记化。这保留了所有空白字符和词汇表外的Unicode字符,同时将数字拆分为单个数字标记以提高清晰度。

总体而言,PaLM是一个功能强大的LM,具有广泛应用的潜力。它仍在开发中,但已经证明了在多个任务上实现突破性性能的能力。

用于RLHF的开源工具

OpenAI在2019年发布了第一个用于执行RLHF的开源代码。他们已经实施了这种方法来改进GPT-2,用于不同的用例,如摘要。根据人类反馈,该模型经过优化,其输出与人类相似,例如复制笔记的部分内容。有关此项目的更多信息,请参阅以下链接:https://openai.com/research/fine-tuning-gpt-2.

代码也可以在以下链接找到:https://github.com/openai/lm-human-preferences.

Transformer强化学习TRL)是一个为在Hugging Face生态系统中使用PPO微调预训练LM的工具。由CarperAI开发的增强分支TRLX能够处理在线和离线训练的大规模模型。目前,TRLX配备了支持RLHF的PPO和隐式语言Q学习ILQL)的生产就绪API,可用于部署高达330亿参数的LLMs。TRLX的未来版本旨在适应高达2000亿参数的LLMs,使其成为在如此规模上工作的ML工程师的理想选择。

另一个很好的库是语言模型强化学习RL4LMs)。RL4LMs项目旨在解决训练LLMs以符合人类偏好指标所面临的挑战。它认识到许多NLP任务可以被视为序列学习问题,但由于强化学习训练不稳定、自动NLP指标的高方差和奖励黑客等问题,其应用受到限制。该项目通过以下方式提供解决方案:

  • 通过一个持续更新的基准GRUE提供关于何时使用强化学习的指南,并建议合适的NLP任务/指标

  • 引入一种新的强化学习算法,自然语言策略优化NLPO),旨在更好地处理大型语言动作空间和奖励方差

  • 提供高质量的实现和强化学习以及其他强化学习算法的超参数,用于在Hugging Face库中训练Transformers。

该项目的代码可以在以下链接找到:https://github.com/allenai/RL4LMs

摘要

在本章中,我们深入探讨了最先进语言模型的动态和复杂世界。我们讨论了它们的出色泛化能力,使它们成为广泛任务的通用工具。我们还强调了理解复杂背景的重要性,在这些模型中,它们通过掌握语言的细微差别和各种主题的复杂性而表现出色。

此外,我们还探讨了RLHF范式及其如何被用于增强语言模型。RLHF通过模拟人类判断来利用标量反馈改进语言模型,从而帮助减轻在NLP任务中遇到的常见陷阱。

我们讨论了与这些模型一起工作的技术要求,强调了在Transformers、强化学习和编码技能等领域拥有基础知识的重要性。

本章还涉及了一些突出的语言模型,如GPT-4和LLaMA,讨论了它们的架构、方法和性能。我们强调了某些库在解释语言模型预测时采用的策略,例如删除某些单词和分析梯度变化。

总结来说,本章全面概述了当前语言模型的状态,探讨了它们的性能、挑战、用于改进它们的方法,以及用于评估和解释它们的不断发展的工具和措施。

参考文献

第八章:访问大型语言模型的力量:高级设置和与RAG的集成

在这个充满活力的人工智能AI)和机器学习ML)时代,理解可用的各种资源并学习如何有效地利用它们至关重要。大型语言模型LLMs)如GPT-4通过在从内容生成到复杂问题解决的各种任务中展现出前所未有的性能,彻底改变了自然语言处理NLP)领域。它们的巨大潜力不仅体现在理解和生成类似人类的文本上,还体现在弥合机器与人类之间的差距,无论是在通信还是任务自动化方面。拥抱LLMs的实际应用能够赋予企业、研究人员和开发者创建更直观、智能和高效的系统,以满足广泛的业务需求。本章将为您提供一个指南,介绍如何设置访问LLMs,并指导您如何使用它们以及如何构建与它们相关的管道。

我们的旅程从深入研究使用应用程序编程接口APIs)的封闭源模型开始,以OpenAI的API作为一个典范示例。我们将通过一个实际场景向您展示,如何使用Python代码中的API密钥与该API交互,并展示此类模型在现实世界中的应用潜力。

随着我们不断前进,我们将把焦点转向开源工具的领域,向您介绍一些广泛使用的开源模型,这些模型可以通过Python进行操作。我们的目标是让您了解这些模型提供的力量和多功能性,强调开源开发的社区驱动优势。

随后,我们将向您介绍检索增强生成,特别是LangChain,这是一个专门为与LLMs交互而设计的强大工具。LangChain对于LLMs的实际应用至关重要,因为它提供了一个统一和抽象的接口,以及一系列工具和模块,这些工具和模块简化了LLM驱动应用程序的开发和部署。我们将引导您了解LangChain的基础概念,突出其独特的解决LLMs固有挑战的方法。

这种方法的基石是将数据转换为嵌入。我们将阐明语言模型LMs)和LLMs在这次转换中扮演的关键角色,展示它们如何参与创建这些嵌入。随后,我们将讨论建立本地向量数据库的过程,为您简要概述向量数据库及其在管理和检索这些嵌入中的关键作用。

然后,我们将讨论用于提示的LLM的配置,这可能与用于嵌入过程的LLM相同。我们将逐步引导您进行设置过程,详细说明这种策略的优势和潜在应用。

在最后一部分,我们将涉及将LLM部署到云的话题。云服务的可扩展性和成本效益导致了托管AI模型采用率的增加。我们将概述领先的云服务提供商,包括Microsoft AzureAmazon Web ServicesAWS)和Google Cloud PlatformGCP),并为您提供关于他们的服务提供方式和如何利用它们进行LLM部署的见解。

在我们开始探索LLM的过程中,承认这些模型运行在其内的数据景观的持续演变至关重要。数据的动态特性——其体积、多样性和复杂性的增长——需要我们采取前瞻性的方法来开发、部署和维护LLM。在随后的章节中,特别是第10章,我们将深入探讨这些演变数据景观的战略影响,为您准备应对它们带来的挑战和机遇。这种基础理解不仅将增强您与LLM的即时工作,还将确保您的项目在面对快速的技术和数据驱动变化时保持韧性和相关性。

让我们回顾本章涵盖的主要主题:

  • 设置LLM应用 – 基于API的闭源模型

  • 提示工程和初始化GPT

  • 设置LLM应用 – 本地开源模型

  • 通过Python使用Hugging Face的LLM

  • 探索高级系统设计 – RAG和LangChain

  • 在Jupyter笔记本中回顾简单的LangChain设置

  • 云端LLM

技术要求

对于本章,以下将是必需的:

  • 编程知识:熟悉Python编程是必需的,因为开源模型、OpenAI的API和LangChain都是使用Python代码进行说明的。

  • 访问OpenAI的API:探索闭源模型需要OpenAI的API密钥。这可以通过在OpenAI创建账户并同意他们的服务条款来获得。

  • 开源模型:需要访问本章中提到的特定开源模型。这些模型可以通过各自的存储库或通过包管理器如pipconda访问和下载。

  • 本地开发环境:需要一个安装了Python的本地开发环境。可以使用集成开发环境IDE)如PyCharm、Jupyter Notebook或简单的文本编辑器。请注意,我们推荐使用免费的Google Colab笔记本,因为它将这些要求封装在一个无缝的网页界面中。

  • 安装库的能力:你必须有权安装所需的Python库,例如NumPy、SciPy、TensorFlow和PyTorch。请注意,我们提供的代码中包含了所需的安装,你不需要事先安装它们。我们只是强调你应该有权这样做,我们预期你会这样做。具体来说,使用免费的Google Colab笔记本就足够了。

  • 硬件要求:根据你正在处理的模型复杂性和大小,你需要一台具有足够处理能力(可能包括用于机器学习任务的优秀GPU)和充足内存的计算机。这仅在你选择不使用免费的Google Colab时相关。

现在我们已经了解了LLM的变革潜力以及可用的各种工具,让我们更深入地探讨如何有效地使用API设置LLM应用程序。

设置LLM应用程序 - 基于API的闭源模型

当考虑使用模型(特别是LLM)时,有各种设计选择和权衡。一个关键的选择是是否在本地环境中托管模型,还是通过通信渠道远程使用它。本地开发环境将是你代码运行的地方,无论是你的个人电脑、本地服务器、云环境,等等。你的选择将影响许多方面,如成本、信息安全、维护需求、网络过载和推理速度。

在本节中,我们将介绍一种快速简单的方法,通过API远程使用LLM。这种方法快速简单,因为它免除了我们为本地托管LLM而分配不寻常的计算资源的需求。LLM通常需要大量的内存和计算资源,这在个人环境中并不常见。

选择远程LLM提供商

在深入实施之前,我们需要选择一个与我们的项目需求相匹配的合适的LLM(大型语言模型)提供商。例如,OpenAI提供了GPT-3.5和GPT-4的多个版本,并配有全面的API文档。

通过API在Python中访问OpenAI的远程GPT

要获取OpenAI的LLM API访问权限,我们需要在他们的网站上创建一个账户。这个过程包括注册、账户验证和获取API凭证。

OpenAI的网站提供了这些常见操作的指导,你将能够快速设置好。

注册后,我们应该熟悉OpenAI的API文档。这份文档将指导我们了解与LLM交互的各种端点、方法和参数。

我们将要进行的第一个动手实践将是通过 Python 使用 OpenAI 的 LLMs。我们准备了一个笔记本,展示了通过 API 使用 OpenAI 的 GPT 模型的简单步骤。请参考 Ch8_Setting_Up_Close_Source_and_Open_Source_LLMs.ipynb 笔记本。这个名为 设置近源和开源 LLMs 的笔记本将在当前关于 OpenAI API 的章节中使用,也将在后续关于设置本地 LLMs 的章节中使用。

让我们逐步分析代码:

  1. 我们首先安装所需的 Python 库。特别是,为了与 LLM API 进行通信,我们需要安装必要的 Python 库:

    !pip install --upgrade openai
    
  2. 定义 OpenAI 的 API 密钥:在向 LLM API 发送请求之前,我们必须将我们的个人 API 密钥嵌入到库的配置中。当你注册 OpenAI 时,API 密钥会在 OpenAI 的网站上提供给你。这可以通过将密钥的字符串明确粘贴到我们的代码中以硬编码,或者从包含该字符串的文件中读取它来完成。请注意,前者是展示 API 的最简单方式,因为它不需要设置额外的文件,但在共享开发环境中工作时可能不是最佳选择:

    openai.api_key = "<your key>"
    
  3. 设置 – 设置模型的配置。在这里,我们设置控制模型行为的各种参数。

在为通过 API 连接到 LLMs 奠定基础后,将我们的注意力转向同样重要的一个方面——提示工程和预处理,这是与这些模型有效沟通的艺术。

提示工程和 GPT 预处理

在返回讨论代码的下一部分之前,让我们暂停并提供一些背景信息。

提示工程是 NLP 中用于设计有效提示或指令的技术,当与 LLMs 交互时使用。它涉及精心设计提供给模型的输入,以产生期望的输出。通过在提示中提供特定的提示、上下文或约束,提示工程旨在引导模型的行为,并鼓励生成更准确、相关或针对性的响应。这个过程通常涉及迭代优化、实验,并理解模型的优势和局限性,以优化提示,提高在各种任务(如问答、摘要或对话生成)中的性能。有效的提示工程在利用 LMs 的能力以及塑造其输出以满足特定用户需求方面发挥着至关重要的作用。

让我们回顾一下提示工程中最具影响力的工具之一,启动。通过API启动GPT涉及在生成响应之前向模型提供初始上下文。启动步骤有助于设定生成内容的方向和风格。通过提供与所需输出相关的相关信息或示例,我们可以引导其理解并鼓励更专注和连贯的响应。启动可以通过包含特定指令、上下文,甚至与预期结果一致的片段句子来实现。有效的启动可以增强模型生成与用户意图或具体要求更匹配的响应的能力。

通过引入GPT和几种类型的信息来进行启动:

  • 主要信息是系统提示。这条信息指导模型关于可能扮演的角色,它应该如何回答问题,可能面临的约束等等。

  • 第二种信息类型是用户提示。用户提示在启动阶段发送给模型,它代表一个示例用户提示,就像您可能在ChatGPT的网页界面中输入的提示一样。然而,在启动时,这条消息可以展示给模型作为如何处理此类提示的示例。开发者将引入某种用户提示,然后展示模型如何预期回答该提示。

    例如,观察以下启动代码:

    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
               {"role": "system",
                   "content": "You are a helpful assistant. You provide short answers and you format them in Markdown syntax"},
                  {"role": "user",
                   "content": "How do I import the Python library pandas?"},
                  {"role": "assistant",
                   "content": "This is how you would import pandas:  \n```\nimport pandas as pd\n```py"},
                  {"role": "user",
                   "content": "How do I import the python library numpy?"}
            ])
    text = response.choices[0].message.content.strip()
    print(text)
    )
    

    这是输出:

    To import numpy, you can use the following syntax: 
    ```python
    
    import numpy as np
    
    ```py
    

您可以看到我们启动模型以提供Markdown格式的简洁答案。用于教导模型的示例是问题和答案的形式。问题是通过用户提示,而我们告诉模型潜在答案的方式是通过助手提示。然后我们向模型提供另一个用户提示;这是我们要模型为我们处理的实际提示,如输出所示,它回答正确。

通过查看OpenAI关于提示工程的文档,你会发现还有其他类型的提示可以用来启动GPT模型。

回到我们的笔记本和代码,在这个部分,我们利用GPT-3.5 Turbo。我们以最简单的方式启动它,只给它一个系统提示来提供方向,以展示系统提示如何产生额外的功能。我们告诉模型通过提醒我们提示中的错误并纠正它们来完成响应。

然后我们在用户提示部分提供我们想要的提示,并在其中插入一些错误。运行那段代码并尝试一下。

尝试OpenAI的GPT模型

在这个阶段,我们向模型发送我们的提示。

以下简单的示例代码在设置近源和开源LLMs笔记本中运行一次。您可以将它封装在一个函数中,并在自己的代码中重复调用它。

值得注意的一些方面如下:

  • 解析和处理模型返回的输出:我们以连贯的方式结构化输出响应,以便用户阅读:

    print(f"Prompt: {user_prompt_oai}\n\n{openai_model}'s Response: \n{response_oai}")
    
  • 错误处理:我们设计代码允许在接受API使用失败之前进行多次尝试:

    except Exception as output:
        attempts += 1
        if attempts >= max_attempts:
            […]
    
  • 速率限制和成本缓解:我们在这里没有实施此类限制,但在实验设置中,也许在生产环境中,同时拥有这两者将是理想的。

    以下代码的结果展示如下:

    Prompt: If neuroscience could extract the last thoughts a person had before they dyed, how would the world be different?
    gpt-3.5-turbo's Response:
    If neuroscience could extract the last thoughts a person had before they died, it would have profound implications for various aspects of society.
    This ability could potentially revolutionize fields such as psychology, criminology, and end-of-life care.
    Understanding a person's final thoughts could provide valuable insights into their state of mind, emotional well-being, and potentially help unravel mysteries surrounding their death.
    It could also offer comfort to loved ones by providing a glimpse into the innermost thoughts of the deceased.
    However, such technology would raise significant ethical concerns regarding privacy, consent, and the potential misuse of this information.
    Overall, the world would be both fascinated and apprehensive about the implications of this groundbreaking capability.
    Typos in the prompt:
    1\. "dyed" should be "died"
    2\. "diferent" should be "different"
    Corrections:
    If neuroscience could extract the last thoughts a person had before they died, how would the world be different?
    

模型为我们提供了一个合法、简洁的响应。然后它通知我们有关错别字,这与我们提供给它的系统提示完全一致。

那是一个展示远程、场外、闭源LLM应用的例子。虽然利用像OpenAI提供的付费API的强大功能提供了便利和尖端性能,但挖掘免费开源LLM的潜力同样巨大。让我们接下来探索这些成本效益高的替代方案。

设置LLM应用程序 - 本地开源模型

现在,我们将讨论闭源实现的补充方法,即开源、本地实现。

我们将看到您如何在不注册账户、付费或与第三方供应商(如OpenAI)共享可能包含敏感信息的提示的情况下,实现与上一节中我们审查的类似的功能结果。

关于区分开源和闭源的不同方面

在选择开源LLM(如LLaMA和GPT-J)和闭源、基于API的模型(如OpenAI的GPT)之间时,必须考虑几个关键因素。

首先,成本是一个主要因素。开源LLM通常没有许可费用,但它们需要大量的计算资源进行训练和推理,这可能很昂贵。闭源模型虽然可能收取订阅费或按使用付费的费用,但消除了对大量硬件投资的必要性。

处理速度和维护与计算资源密切相关。如果部署在足够强大的系统上,开源LLM可以提供高速处理,但需要实施团队持续维护和更新。相比之下,由提供商管理的闭源模型确保持续的维护和模型更新,通常效率更高,停机时间更短,但处理速度可能取决于提供商的基础设施和网络延迟。

关于模型更新,开源模型提供了更多控制权,但需要主动方法来整合最新的研究和改进。然而,闭源模型由提供商定期更新,确保用户无需额外努力即可访问最新的进展。

在这两种情况下,安全和隐私都是至关重要的。开源模型可能更安全,因为它们可以在私有服务器上运行,确保数据隐私。然而,它们需要强大的内部安全协议。由外部提供商管理的闭源模型通常带有内置的安全措施,但由于第三方处理数据,可能存在潜在的隐私风险。

总体而言,开源和闭源语言模型(LLM)之间的选择取决于成本、控制和便利性之间的权衡,每种选择都有一套自己的优势和挑战。

考虑到这一点,让我们重新审视 Hugging Face,这家公司汇集了最大的、最易于访问的免费语言模型(LM)中心。在下面的示例中,我们将利用 Hugging Face 简便且免费的库:transformers。

Hugging Face 的模型中心

当我们寻找为我们任务选择一个 LLM 时,我们建议参考 Hugging Face 的在线模型页面。他们提供了大量的基于 Python 的开源 LLM。每个模型都有一个专门的页面,您可以在这里找到有关它的信息,包括在您的个人环境中通过 Python 代码使用该模型所需的语法。

应该注意的是,为了在本地实现模型,您必须从运行 Python 代码的机器上拥有互联网连接。然而,由于这个要求在某些情况下可能成为瓶颈——例如,当开发环境受到公司内部网络的限制或由于防火墙限制而有限的互联网访问时——存在其他方法。我们推荐的方法是从 Hugging Face 的域名克隆模型仓库。这是一个不那么简单且不太常用的方法。Hugging Face 在每个模型的网页上提供了必要的克隆命令。

选择模型

当寻找模型时,可能会有几个因素需要考虑。根据您的意图,您可能关心配置速度、处理速度、存储空间、计算资源、法律使用限制等。另一个值得注意的因素是模型的流行度。它证明了该模型在社区中其他开发者中被选择的频率。例如,如果您寻找标记为零样本分类的 LMs,您将找到一个非常大的可用模型集合。但是,如果您进一步缩小搜索范围,以便只剩下在新闻文章数据上训练的模型,您将只剩下更小的可用模型集合。在这种情况下,您可能需要参考每个模型的流行度,并从使用最频繁的模型开始您的探索。

其他可能引起你兴趣的因素可能包括关于该模型的出版物、模型的开发者、发布该模型的公司或大学、模型训练所使用的数据集、模型设计的架构、评估指标,以及在每个模型在Hugging Face网站上网页上可能存在的其他潜在因素。

通过Python使用Hugging Face的LLMs

现在,我们将回顾一个代码笔记本,它展示了如何使用Hugging Face的免费资源在本地实现开源LLM。我们将继续使用上一节中相同的笔记本,设置近源和开源LLMs

  1. 在终端上使用pip,我们将运行以下命令:

    pip install –upgrade transformers
    

    如果直接从Jupyter笔记本运行,请在命令的开头添加!

  2. 实验Microsoft的DialoGPT-medium:这个LLM专注于对话应用。它由Microsoft生成,在与其他LLMs的常见基准比较中取得了高分。因此,它在Hugging Face平台上也非常受欢迎,从ML开发者的角度来看,它经常被下载。

  3. 在笔记本中的设置代码部分,我们将定义此代码的参数并导入模型及其分词器:

    hf_model = "microsoft/DialoGPT-medium"
    max_length = 1000
    tokenizer = AutoTokenizer.from_pretrained(hf_model)
    model = AutoModelForCausalLM.from_pretrained(hf_model)
    

    注意,此代码需要访问互联网。即使模型是本地部署的,也需要互联网连接来导入它。再次提醒,如果你愿意,你可以从Hugging Face克隆模型的repo,然后不再需要访问互联网。

  4. 定义提示:如以下代码块所示,我们在这里选择了简单的提示,类似于GPT-3.5-Turbo模型的用户提示。

  5. 实验模型:在这里,我们有适合此代码的语法。如果你想与该模型进行滚动对话,你可以将此代码包裹在一个函数中,并实时收集用户的提示。

  6. 结果:生成的提示是,如果恐龙今天还活着,它们会对人类构成威胁吗

    microsoft/DialoGPT-medium's Response:
    I think they would be more afraid of the humans
    

本节确立了LLMs可以带来的巨大价值主张。我们现在有了学习和探索高效LLM应用开发新前沿的必要背景——使用LangChain等工具构建管道。让我们深入了解这种方法。

探索高级系统设计——RAG和LangChain

检索增强生成RAG)是一个专为与LLMs无缝交互而设计的开发框架。由于LLMs具有通用性,它们能够胜任大量任务。然而,它们的通用性往往阻止它们对需要特定知识或深入领域专业知识的问题提供详细、细微的响应。例如,如果你希望使用LLM来回答有关特定学科(如法律或医学)的查询,它可能能够满意地回答一般性查询,但可能无法准确回答需要详细见解或最新知识的问题。

RAG设计为LLM处理中通常遇到的限制提供了一个全面的解决方案。在RAG框架中,文本语料库经过初步预处理,被分割成摘要或独立的块,然后嵌入到向量空间中。当提出查询时,模型识别出这些数据中最相关的部分,并利用它们来形成响应。这个过程涉及离线数据预处理、在线信息检索以及应用LLM进行响应生成的应用。这是一个灵活的方法,可以适应各种任务,包括代码生成和语义搜索。RAG模型作为一个抽象层,协调这些过程。这种方法的有效性正在不断提高,其应用范围随着LLMs的发展而扩大,在提示处理过程中需要更多上下文丰富的数据。在第10章中,我们将更深入地讨论RAG模型及其在LLM解决方案未来中的作用。

现在我们已经介绍了RAG模型的前提和功能,让我们专注于一个特定的例子,称为LangChain。我们将回顾其设计原则的细节以及它是如何与数据源交互的。

LangChain的设计理念

在本节中,我们将剖析使LangChain脱颖而出的核心方法和架构决策。这将使我们深入了解其结构框架、数据处理效率以及其将LLMs与各种数据源集成的创新方法。

数据源

LangChain最显著的优点之一是能够将任意LLM连接到定义好的数据源。这里的“任意”意味着它可以是任何现成的LLM,这些LLM的设计和训练没有针对我们想要连接的数据进行特定的考虑。使用LangChain允许我们根据我们的领域进行定制。数据源在构建用户提示的答案时用作参考。这些数据可能是公司拥有的专有数据,也可能是个人机器上的本地个人信息。

然而,当涉及到利用特定的数据库时,LangChain所做的不仅仅是将LLM指向数据;它采用特定的处理方案,使其快速高效。它创建一个向量数据库。

对于原始文本数据,无论是.txt文件中的自由文本、格式化文件还是其他各种文本数据结构,通过将文本分割成适当长度并使用指定的模型创建数值文本嵌入,创建一个向量数据库。请注意,如果指定的嵌入模型选择为LLM,它不需要与用于提示的LLM相同。例如,嵌入模型可以选择为免费、次优的开源LLM,而提示模型可以是具有最佳性能的付费LLM。这些嵌入随后存储在向量数据库中。您可以看到,这种方法非常节省存储空间,因为我们将文本和可能的编码文本转换成有限的一组数值,其本质上是密集的。

当用户输入提示时,搜索机制会在嵌入的数据源中识别相关的数据块。提示使用相同的指定嵌入模型进行嵌入。然后,搜索机制应用相似度度量,例如余弦相似度,并找到定义的数据源中最相似的文字块。然后,检索这些块的原文本。然后将原始提示再次发送,这次发送到提示LLM。区别在于,这次提示不仅包括原始用户的提示,还包括作为参考检索到的文本。这使得LLM能够获得问题和丰富的文本补充作为参考。然后,LLM可以参考添加的信息作为参考。

如果没有这个设计,当用户想要找到他们问题的答案时,他们需要阅读大量的材料并找到相关的部分。例如,这些材料可能是一家公司整个产品方法,包括许多PDF文档。这个过程利用了自动智能搜索机制,将相关材料缩小到可以放入提示中的文本量。然后,LLM构建问题的答案并立即呈现给用户。如果您愿意,可以将管道设计为引用构建答案时使用的原始文本,从而实现透明度和验证。

这个范式在图8.1中展示:

.

图8.1 – 典型LangChain管道的范式

图8.1 – 典型LangChain管道的范式

为了解释LangChain管道背后的提示工程,让我们回顾一个金融信息用例。您的数据源是美国上市公司的证券 & 交易所 委员会SEC)的文件集合。您正在寻找向股东发放股息的公司及其年份。

你的提示如下:

Which filings mention that the company gave dividends in the year 2023?

流水线随后将这个问题嵌入其中,寻找具有相似上下文的文本块(例如,讨论派息的)。它识别了许多这样的块,如下所示:

"Dividend Policy. Dividends are paid at the discretion of the Board of Directors. In fiscal 2023, we paid aggregate quarterly cash dividends of $8.79 per share […]"

LangChain流水线随后形成一个新的提示,其中包含已识别块的文字。在这个例子中,我们假设被提示的LLM是OpenAI的GPT。LangChain将信息嵌入到发送给OpenAI GPT模型的系统提示中:

"prompts": [
    "System: Use the following pieces of context to answer the user's question. \nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n----------------\n Dividend Policy. Dividends are paid at the […]"
]

如我们所见,系统提示用于指导模型如何行动,并提供上下文。

既然我们已经了解了LangChain的基础方法和好处,让我们更深入地探讨其复杂的设计概念,从它如何高效地将LLMs与各种数据源桥接开始。

未预先嵌入的数据

虽然前面的描述是关于预处理成向量数据库形式的数据,但另一种方法是设置访问尚未处理成嵌入形式的外部数据源。例如,你可能希望利用SQL数据库来补充其他数据源。这种方法被称为多个****检索源

我们现在已经探讨了LangChain如何高效地与各种数据源接口;现在,理解其功能的核心结构元素至关重要——链和代理。

LangChain内部的原子构建块被称为组件。典型的组件可能包括提示模板、访问各种数据源以及访问LLMs。当将各种组件组合成系统时,我们形成了一个链。一个链可以代表一个完整的由LLM驱动的应用程序。

现在,我们将介绍代理的概念,并通过一个代码示例展示链和代理如何结合在一起,创建出不久前相当复杂的功能。

代理

在链之上,下一层复杂性是代理。代理通过使用链并辅以额外的计算和决策来利用链。虽然链可能对简单的请求提示产生响应,但代理会处理响应并根据规定的逻辑进行进一步的下层处理。

你可以将代理视为一种推理机制,它使用我们所说的工具。工具通过将LLMs与其他数据或功能连接起来来补充LLMs。

由于典型的LLM缺陷阻止了LLMs成为完美的多任务执行者,代理以规定和监控的方式使用工具,使它们能够检索必要的信息,将其作为上下文,并使用指定的现有解决方案执行操作。然后代理观察结果并使用规定的逻辑进行进一步的下层处理。

例如,假设我们想要计算我们地区一名普通初级程序员的薪资轨迹。这个任务由三个关键子任务组成——找出平均起薪是多少,确定薪资增长的因素(例如,生活成本的变动或典型的绩效提升),然后进行预测。一个理想的LLM能够独立完成整个过程,不需要比一个连贯的提示更多的东西。然而,考虑到典型的缺陷,如幻觉和有限的训练数据,当前的LLM无法达到可以在商业产品中商业化的水平。一种最佳实践是将任务分解,并通过代理监控思维过程。

在其最简单的设计中,这需要以下步骤:

  1. 定义一个可以访问互联网并能根据增长因子计算时间序列未来值的代理

  2. 为代理提供全面的提示

  3. 代理将提示分解为不同的子任务:

    1. 从互联网上获取平均工资

    2. 获取增长因子

    3. 通过应用增长因子到起始薪资并创建薪资值的未来时间序列来使用计算工具

为了说明代理方法,让我们回顾一个简单的任务,该任务涉及从网络上获取特定细节,并使用它来进行计算。

  1. 首先,安装以下包:

    !pip install openai
    !pip install wikipedia
    !pip install langchain
    !pip install langchain-openai
    
  2. 然后,运行以下代码:

    from langchain.agents import load_tools, initialize_agent
    from langchain_openai import OpenAI
    import os
    os.environ["OPENAI_API_KEY"] = "<your API key>"
    llm = OpenAI(model_name='gpt-3.5-turbo-instruct')
    tools = load_tools(["wikipedia", "llm-math"], llm=llm)
    agent = initialize_agent(tools, llm=llm, agent="zero-shot-react-description", verbose=True)
    agent.run("Figure out how many pages are there in the book Animal Farm. Then calculate how many minutes would it take me to read it if it takes me two minutes to read one page.")
    

    输出结果如下所示:

    > Finished chain.
    'It would take me approximately 224 minutes or 3 hours and 44 minutes to read Animal Farm.'
    

注意,我们没有应用任何方法来固定LLM以重现这个确切响应。再次运行此代码将产生略微不同的答案。

在下一章中,我们将更深入地探讨几个带有代码的示例。特别是,我们将编写一个多代理框架,其中一组代理正在共同完成一个项目。

长期记忆和引用先前对话

另一个非常重要的概念是长期记忆。我们讨论了LangChain如何通过附加额外的数据源来补充LLM的知识,其中一些可能属于专有数据,使其针对特定用例高度定制化。然而,它仍然缺少一个非常重要的功能,即引用先前对话并从中学习的能力。例如,你可以为项目经理设计一个助手。随着用户与之互动,他们理想情况下会每天更新工作进度、互动、挑战等内容。如果助手能够消化所有这些新积累的知识并保持其持续性,那就更好了。这将允许出现以下场景:

  • 用户:“关于吉姆团队的任务,我们目前处于什么位置?”

  • 助手:“根据原始路线图,吉姆团队应该处理客户对原型设计的反馈。根据上周的更新,客户只提供了部分反馈,您认为这还不足以让吉姆团队开始工作。”

我们将在下一章中更深入地探讨记忆的概念。

通过增量更新和自动化监控确保持续的相关性

为了在动态信息环境中保持 LLM 输出的准确性和相关性,实施持续更新和维护向量数据库的策略至关重要。随着知识库的持续扩展和演变,作为 LLM 响应基础的嵌入也必须如此。采用增量更新技术允许这些数据库在新的信息可用时刷新其嵌入,确保 LLMs 可以提供最准确和最新的响应。

增量更新涉及定期重新嵌入现有数据源的最新信息。这个过程可以自动化,以扫描数据源中的更新,重新嵌入新的或更新的内容,然后将这些更新的嵌入集成到现有的向量数据库中,无需进行全面的重构。通过这样做,我们确保数据库反映了最当前的知识,增强了 LLM 提供相关和细微响应的能力。

自动监控在这个生态系统中发挥着关键作用,它通过持续评估 LLM 输出的质量和相关性。这涉及到建立跟踪 LLM 性能的系统,识别由于信息过时或缺失上下文而导致响应可能不足的区域。当发现这些差距时,监控系统可以触发增量更新过程,确保数据库始终是当前知识格局的稳健和准确反映。

通过采用这些策略,我们确保 LangChain 和类似的 RAG 框架能够随着时间的推移保持其有效性。这种方法不仅增强了 LLM 应用程序的相关性,还确保它们能够适应信息快速发展的格局,保持其在 NLP 技术前沿的位置。

我们现在可以亲身体验 LangChain。

在 Jupyter 笔记本中回顾简单的 LangChain 设置

现在,我们已经准备好设置一个完整的管道,该管道可以后来用于各种 NLP 应用程序。

请参阅 Ch8_Setting_Up_LangChain_Configurations_and_Pipeline.ipynb 笔记本。这个笔记本实现了 LangChain 框架。我们将一步一步地走过它,解释不同的构建块。在这里,我们选择了一个简单的用例,因为这段代码的主要目的是展示如何设置 LangChain 管道。

在这个场景中,我们处于医疗保健行业。我们有许多护理者;每位护理者都有许多他们可能看到的病人。首席医师代表医院内的所有医师提出请求,希望能够跨他们的笔记进行智能搜索。他们了解到 LLMs 的新兴功能,并希望拥有一个工具,可以在他们编写的医疗报告中进行搜索。

例如,一位医生说了以下内容:

我经常遇到可能与几个月前看过的患者相关的科研,但我记不起那个人是谁。我希望有一个工具,我可以问,‘那个抱怨耳朵疼痛并且有偏头痛家族史的患者是谁?’,然后它会找到那个患者。’

因此,这里的商业目标是以下内容:

CTO要求我们快速构建一个以Jupyter笔记本形式的原型。我们将从医院的数据库中收集几份临床报告,并使用LangChain以示例中描述的医生的方式进行搜索。”

让我们直接进入设计解决方案的Python实现。

使用Python设置LangChain管道

深入LangChain的实际应用,本节将逐步指导您使用Python设置LangChain管道,从安装必要的库到执行复杂的相似性搜索。

安装所需的Python库

和往常一样,我们有一个需要安装的库列表。由于我们将在Jupyter笔记本中编写代码,我们可以从代码中安装它们:

  1. 加载带有模拟医生笔记的文本文件: 在这里,我们准备了一些模拟医生笔记。我们加载并按照LangChain范式处理它们。我们强调,这些不是真实的医疗笔记,那里描述的人并不存在。

  2. 处理数据以便准备嵌入: 在这里,我们根据嵌入模型的要求分割文本。正如我们在前面的章节中提到的,像用于嵌入的LMs这样的模型有一个有限的输入文本窗口,它们可以在单个批次中处理。这个大小是硬编码在其设计架构中,并且对于每个特定模型是固定的。

  3. 创建将存储在向量数据库中的嵌入: 向量数据库是LangChain范式的重要支柱之一。在这里,我们将文本转换为每个项目的嵌入。这些嵌入随后存储在一个专门的向量数据库中。LangChain库允许您使用几个不同的向量数据库。虽然我们选择了一个特定的数据库,但您可以参考向量存储页面了解更多关于不同选择的信息。

  4. 创建向量数据库: 在这里,我们创建向量数据库。这个过程可能因数据库选择的不同而略有不同。然而,这些数据库的创建者确保移除所有困难的工作,并留下一个简单的现成函数,在给定适当的向量形式嵌入的情况下为您创建数据库。我们利用Meta的Facebook AI相似性搜索FAISS)数据库,因为它简单、部署快速且免费。

  5. 基于我们内部文档进行相似度搜索:这是流程中的关键部分。我们提出几个问题,并使用LangChain的相似度搜索来识别最能回答我们问题的医生笔记。

如我们所见,相似度搜索功能能够很好地处理大多数问题。它将问题嵌入并寻找嵌入相似的报告。

然而,当正确回答问题时,相似度搜索只能走这么远。很容易想到一个问题,讨论的是与笔记非常相似的事情,但微小的差异却使相似度搜索机制困惑。例如,相似度搜索过程实际上在第二个问题中犯了一个错误,错误地将不同的月份混淆,从而提供了错误的答案。

为了克服这个问题,我们不仅想要进行相似度搜索。我们希望一个LLM能够审查相似度搜索的结果并应用其判断。我们将在下一章中看到这是如何实现的。

在为LangChain在Python中的实际应用打下基础后,现在让我们继续了解云在其中的关键作用,尤其是在利用当代计算范式中的LLM真正潜力时。

云中的LLM

在大数据和计算时代,云平台已成为管理大规模计算的重要工具,提供可快速部署和释放的基础设施、存储和服务,同时管理努力最小化。

本节将专注于云中的计算环境。这些已成为许多领先公司和机构的首选。作为一个组织,拥有云中的计算环境而不是本地环境,会带来重大差异。它影响资源共享和管理分配、维护和成本的能力。使用云服务而不是拥有物理机器有许多权衡之处。你可以通过在线搜索或甚至询问一个聊天LLM来了解它们。

与云计算相比,一个显著的不同点是提供商围绕其构建的生态系统。当你选择一个云提供商作为你的计算中心时,你将接入一系列额外的产品和服务,开启一个全新的能力世界,这些能力在其他情况下可能无法轻易获得。

在本节中,我们将重点关注这些服务中的LLM(大型语言模型)方面。

三个主要的云平台是AWS、Microsoft Azure和GCP。这些平台提供了一系列服务,满足企业和开发者的不同需求。当涉及到NLP和LLM时,每个平台都提供专门资源和服务,以促进实验、部署和生产。

让我们探索这些平台中的每一个,看看它们如何满足我们的特定需求。

AWS

AWS在云计算领域仍然是一个主导力量,提供了一套全面且不断发展的服务,以满足机器学习和人工智能开发的需求。AWS以其强大的基础设施、广泛的服务提供以及与机器学习工具和框架的深度集成而闻名,使其成为寻求使用LLM进行创新的开发者和数据科学家的首选平台。

在AWS上实验LLM

AWS提供了一套丰富的工具和服务,旨在促进LLM的开发和实验,确保研究人员和开发者能够访问最先进的机器学习能力:

  • Amazon SageMaker:AWS上机器学习的基础,SageMaker是一个全托管服务,它简化了整个机器学习工作流程。它提供Jupyter笔记本实例进行实验,支持广泛的框架,包括TensorFlow和PyTorch,以及一系列用于模型构建、训练和调试的工具。SageMaker的能力不断得到增强,以支持训练和微调LLM的复杂性,提供可扩展的计算选项和优化的机器学习环境。

  • AWS深度学习容器和深度学习AMIs:对于那些希望定制他们的机器学习环境的人来说,AWS提供了预装了流行机器学习框架的深度学习容器和Amazon Machine Images(AMIs)。这些资源简化了LLM实验的设置过程,使得开发者能够专注于创新而不是基础设施配置。

  • 预训练模型和SageMaker JumpStart:AWS通过SageMaker JumpStart扩展了其可访问的预训练模型库,简化了各种自然语言处理任务中LLM的快速实验。JumpStart还提供了解决方案模板和可执行的示例笔记本,使得开发者更容易开始和扩展他们的机器学习项目。

在AWS上部署和产品化LLM

AWS提供了一套旨在高效部署和管理大规模LLM的服务,确保模型在各种负载下易于访问且性能出色:

  • SageMaker端点:为了部署LLM,SageMaker端点提供具有自动扩展功能的全托管托管服务。这项服务允许开发者快速将训练好的模型部署到生产环境中,同时基础设施会自动调整以适应应用程序的需求。

  • 弹性推理和Amazon EC2 Inf1实例:为了优化推理成本,AWS提供了弹性推理服务,它为SageMaker实例增加了GPU驱动的推理加速功能。为了获得更高的性能和成本效率,由AWS Inferentia芯片驱动的Amazon EC2 Inf1实例为深度学习模型提供了高吞吐量和低延迟的推理服务。

  • AWS Lambda和Amazon Bedrock:对于无服务器部署,AWS Lambda支持在无需配置或管理服务器的情况下运行推理,非常适合需求可变的应用程序。Amazon Bedrock代表了向前迈出的重要一步,通过API、模型定制和无缝集成到组织网络中,提供无服务器访问基础模型,确保数据隐私和安全。

让我们继续下一个主题,微软Azure。

微软Azure

微软Azure处于云计算服务的最前沿,为ML和LLMs的开发、部署和管理提供了一个强大的平台。借助其与OpenAI的战略合作伙伴关系,Azure提供了对GPT模型的独家云访问,使其成为旨在利用高级NLP技术的开发人员和数据科学家的重要资源。最近的增强功能扩展了Azure的能力,使其成为那些希望推动AI和ML应用边界的人的更具吸引力的选择。

在Azure上实验LLMs

Azure显著丰富了其产品,以支持LLMs的研究和实验,提供各种工具和平台,满足AI开发社区的多样化需求:

  • Azure OpenAI服务:直接将OpenAI的尖端模型,包括最新的GPT版本、DALL·E和Codex,集成到Azure生态系统中。此服务使开发者能够轻松地将复杂的AI功能集成到他们的应用程序中,同时享有Azure的可伸缩性和管理工具的额外好处。

  • Azure机器学习(Azure ML):这提供了一个高级环境,用于在特定数据集上对LLMs进行定制培训和微调,从而在特定任务上提高了模型性能。Azure ML Studio的预构建和可定制的Jupyter笔记本模板支持广泛的编程语言和框架,简化了实验过程。

  • Azure认知服务:这提供了一系列预构建的AI服务,包括文本分析、语音服务和由LLMs驱动的决策能力。这些服务使开发者能够快速地将复杂的AI功能添加到应用程序中,无需深厚的ML专业知识。

在Azure上部署和商业化LLMs

Azure的基础设施和服务为LLM应用程序的部署和商业化提供了全面的解决方案,确保了可伸缩性、性能和安全性:

  • 部署选项:Azure通过Azure容器实例(ACI)支持各种部署场景,适用于轻量级部署需求,以及Azure Kubernetes服务(AKS)支持更大、更复杂的应用程序,这些应用程序需要高可伸缩性。这些服务允许高效地扩展LLM应用程序以满足用户需求。

  • 模型管理:通过 Azure ML,开发者可以管理其模型的生命周期,包括版本控制、审计和治理。这确保了部署的模型不仅性能出色,而且符合行业标准和管理要求。

  • 安全和合规性:Azure 强调在其所有服务中实现安全和合规性,提供数据加密、访问控制和全面的合规性认证等功能。这种承诺确保在 Azure 上构建和部署的应用程序符合数据保护和隐私的最高标准。

GCP

GCP 继续在云计算领域保持领先地位,提供了一套广泛的服务,以满足人工智能(AI)和机器学习(ML)发展的不断变化的需求。以其在 AI 和 ML 领域的尖端创新而闻名,GCP 提供了一个丰富的工具和服务生态系统,简化了 LLMs 的开发、部署和扩展,使其成为开发者和研究人员利用最新 AI 技术的理想平台。

在 GCP 上实验 LLMs

GCP 进一步增强了其用于实验和开发 LLMs 的功能,提供了一套全面的支持整个 ML 工作流程的工具,从数据摄取和模型训练到超参数调整和评估:

  • Vertex AI:作为 GCP 机器学习产品线的核心,Vertex AI 提供了一套集成的工具和服务,简化了机器学习工作流程。它为训练和微调 LLMs 提供了高级功能,包括用于自动化选择最佳模型架构和超参数的 AutoML 功能。Vertex AI 与 GCP 强大的数据和数据分析服务的集成使得管理对训练 LLMs 至关重要的大数据集变得更加容易。

  • 集成开发环境(IDE):Vertex AI 内置的笔记本服务提供了一个完全管理的 JupyterLab 环境,使开发者能够无缝地编写、运行和调试机器学习(ML)代码。此环境针对 ML 开发进行了优化,支持 TensorFlow 和 PyTorch 等流行框架,这些框架对于构建和实验大型语言模型(LLMs)至关重要。

  • AI 和 ML 库:GCP 继续扩展其预训练模型和机器学习 API 的库,包括专门为自然语言处理(NLP)和理解设计的那些。这些工具允许开发者快速将高级 NLP 功能集成到他们的应用程序中。

在 GCP 上部署和产品化 LLMs

GCP 为部署和产品化 LLMs 提供了强大且可扩展的解决方案,确保在其平台上构建的应用程序能够满足现实世界使用的需求:

  • Vertex AI 预测:一旦 LLM 被训练,Vertex AI 的预测服务允许轻松地将模型作为完全管理的、自动扩展的端点进行部署。此服务简化了使 LLMs 可用于应用程序的过程,同时基础设施会自动调整以适应工作负载需求。

  • Google Kubernetes Engine (GKE):对于需要高可用性和可扩展性的复杂部署场景,GKE 提供了一个托管环境来部署容器化的 LLM 应用程序。GKE 的全球基础设施确保您的模型具有高可用性,并且可以扩展以满足企业级应用程序的需求。

云服务总结

云计算领域持续快速发展,AWS、Azure 和 GCP 各自为 LLM 的开发和部署提供了独特的优势。AWS 以其广泛的基础设施和与 ML 工具的深度集成而突出,使其成为各种 ML 和 AI 项目的理想选择。Azure 通过其对 OpenAI 模型的独家访问和在微软生态系统中的深度集成,为企业利用 AI 技术的尖端提供了无与伦比的机会。GCP 以其在 AI 和 ML 领域的创新而闻名,提供与谷歌内部 AI 进步相匹配的工具和服务,吸引那些寻求最新 AI 研究和开发的人。随着这些平台功能的不断扩展,选择它们之间的差异将越来越多地取决于具体项目需求、组织协调和战略伙伴关系,这突显了基于当前和未来基于云的 AI 和 ML 环境进行深思熟虑评估的重要性。

摘要

随着自然语言处理和 LLM 领域的快速增长,系统设计的各种实践也在增加。在本章中,我们回顾了 LLM 应用和管道的设计过程。我们讨论了这些方法的组成部分,涉及基于 API 的封闭源代码和本地开源解决方案。然后,我们通过代码让您亲身体验。

我们后来更深入地探讨了系统设计过程,并介绍了 LangChain。我们回顾了 LangChain 包含的内容,并在代码中进行了示例管道的实验。

为了补充系统设计过程,我们调查了领先的云服务,这些服务允许您进行实验、开发和部署基于 LLM 的解决方案。

在下一章中,我们将重点关注特定的实际用例,并伴随代码。

第九章:探索前沿:由LLM驱动的先进应用和创新

在自然语言处理(NLP)快速发展的领域中,大型语言模型(LLM)已经迈出了革命性的一步,重塑了我们与信息互动、自动化流程以及从大量数据池中提取洞察的方式。本章代表了我们在NLP方法和出现与发展过程中的旅程的总结。在这里,之前章节中建立的理论基础与实际、前沿的应用相结合,展示了当使用正确的工具和技术时,LLM的非凡能力。

我们深入探讨LLM应用中最新的和最激动人心的进展,通过详细的Python代码示例进行展示,旨在进行动手学习。这种方法不仅展示了LLM的力量,还使你具备在现实场景中实施这些技术的技能。本章涵盖的主题经过精心挑选,以展示一系列高级功能和应用的广度。

本章的重要性不容小觑。它不仅反映了NLP的最新水平,还作为通往未来的桥梁,在这些技术融入日常解决方案时变得无缝。到本章结束时,你将全面了解如何应用最新的LLM技术和创新,赋予你推动NLP及其超越可能性的边界的能力。加入我们,踏上这段激动人心的旅程,解锁LLM的全部潜力。

让我们回顾本章中涵盖的主要标题:

  • 使用RAG和LangChain增强LLM性能——深入高级功能

  • 基于链的高级方法

  • 从各种网络来源自动检索信息

  • 提示压缩和API成本降低

  • 多个代理——形成一个LLM协作的团队

技术要求

对于本章,以下将是必需的:

  • 编程知识:熟悉Python编程是必需的,因为开源模型、OpenAI的API和LangChain都是使用Python代码进行说明的。

  • 访问OpenAI的API:探索封闭源模型需要OpenAI的API密钥。这可以通过在OpenAI创建账户并同意他们的服务条款来获得。

  • 开源模型:访问本章中提到的特定开源模型将是必要的。这些模型可以通过各自的存储库或通过包管理器如pip或conda进行访问和下载。

  • 本地开发环境:需要一个安装了Python的本地开发环境。可以使用集成开发环境(IDE)如PyCharmJupyter Notebook或简单的文本编辑器。请注意,我们推荐免费的Google Colab笔记本,因为它将这些要求封装在一个无缝的网页界面中。

  • 安装库的能力:您必须拥有安装所需Python库(如NumPySciPyTensorFlowPyTorch)的权限。请注意,我们提供的代码中已包含所需的安装,因此您无需提前安装。我们只是强调您应该有权限这样做,我们预期您会这样做。具体来说,使用免费的Google Colab笔记本就足够了。

  • 硬件要求:根据您所处理的模型复杂性和大小,您将需要一个具有足够处理能力(可能包括用于ML任务的良好GPU)和充足内存的计算机。这仅当您选择不使用免费的Google Colab时才相关。

现在我们已经使用API和本地设置好了LLM应用,我们终于可以部署LLM的高级应用,让我们能够利用其巨大的力量。

利用RAG和LangChain增强LLM性能——深入高级功能

检索增强生成(RAG)框架已成为针对特定领域或任务定制大型语言模型(LLM)的关键工具,它弥合了提示工程简单性和模型微调复杂性之间的差距。

提示工程是定制LLM的最初、最易访问的技术。它利用模型根据输入提示解释和响应用户查询的能力。例如,要查询Nvidia在其最新公告中是否超过了收益预期,可以在提示中直接提供收益电话会议内容,以弥补LLM缺乏即时、最新上下文的问题。这种方法虽然简单,但取决于模型在单个或一系列精心设计的提示中消化和分析提供的信息的能力。

当调查范围超出提示工程所能容纳的范围时——例如分析十年来的科技行业收益电话会议——RAG变得不可或缺。在采用RAG之前,替代方案是微调,这是一个资源密集型的过程,需要显著调整LLM的架构以纳入大量数据集。RAG通过预处理并将大量数据存储在向量数据库中简化了这一点。它智能地隔离和检索与查询相关的数据段,有效地将大量信息压缩成LLM可管理的、提示大小的上下文。这一创新大幅减少了此类广泛数据熟悉任务所需的时间、资源和专业知识。

第8章中,我们介绍了RAG(检索增强生成)的一般概念,特别是LangChain,这是一个以其先进功能而区别于其他RAG框架的框架。

现在,我们将讨论LangChain为增强LLM应用提供的额外独特功能,为您提供其实施和复杂NLP任务中的实用见解。

使用Python的LangChain管道 – 通过LLM增强性能

在本节中,我们将从我们上一节在第8章中的最后一个例子继续进行。在这个场景中,我们处于医疗行业,在我们的医院中,我们的护理提供者表示需要能够根据对患者的粗略描述或其状况来快速检索患者的记录。例如,“去年我看到的那位怀有双胞胎的患者是谁?”“我是否曾经有过一位双亲都有癌症病史的患者,他们对临床试验感兴趣?”等等。

重要提示

我们强调,这些不是真实的医疗笔记,并且笔记中描述的人也不是真实的。

在我们例子中的第8章,我们通过简单地利用临床笔记的嵌入向量数据库,将管道保持在了最小复杂度,然后我们应用了相似度搜索来根据简单的请求查找笔记。我们注意到其中一个问题,即第二个问题,在使用相似度搜索算法时得到了错误的答案。

现在,我们将增强这个管道。我们不会满足于相似度搜索的结果,并将这些结果展示给医生;我们将那些被认为与请求内容相似的结果,并使用LLM来检查这些结果,核实它们,并告诉我们哪些确实与医生相关。

支付的LLM与免费的

我们将使用这个管道来展示付费或免费类型的LLM的实用性。通过paid_vs_free变量,你可以选择使用OpenAI的付费GPT模型或一个免费的LLM。使用OpenAI的付费模型将利用他们的API,并需要一个API密钥。然而,免费的LLM被导入到运行Python代码的本地环境中,因此任何有互联网连接和足够计算资源的人都可以使用。

让我们开始动手实验代码。

应用高级LangChain配置和管道

参考以下笔记本:Ch9_Advanced_LangChain_Configurations_and_Pipeline.ipynb

注意,笔记本的前一部分与第8章中的笔记本相同,因此我们将跳过该部分的描述。

安装所需的Python库

在这里,我们需要扩展已安装的库,并安装openaigpt4all。此外,为了利用gpt4all,我们需要从网络上下载一个.bin文件。

这两个步骤通过笔记本执行都很简单。

设置LLM – 在付费LLM(OpenAI的GPT)和免费LLM(来自Hugging Face)之间选择

如上所述,我们让你选择是否想要通过OpenAI的付费API或免费的LLM来运行这个例子。

记住,由于OpenAI的服务包括托管LLM和处理提示,它只需要最少的资源和时间以及基本的互联网连接。这也涉及到将我们的提示发送到OpenAI的API服务。提示通常包含在现实世界设置中可能是专有信息。因此,需要做出关于数据安全的行政决策。在过去的十年中,公司从本地计算向云迁移时,类似的考虑是核心的。

与该要求相反,使用免费的LLM,你将本地托管它,你将避免将任何信息导出至你的计算环境之外,但你需要承担处理工作。

另一个需要考虑的方面是每个LLM的使用条款,因为每个LLM可能有不同的许可条款。虽然LLM可能允许你免费实验,但它可能对你在商业产品中使用它施加限制。

在运行时间和计算资源受限的背景下,选择付费LLM进行此示例将产生更快的响应。

为了满足你想要免费实验LLM的愿望,并且因为我们渴望让你在Google Colab上快速免费运行代码,我们必须将LLM的选择限制在那些可以在Google免费账户所提供的有限RAM上运行的LLM。为了做到这一点,我们选择了一个精度降低的LLM,也称为量化LLM。

根据你选择基于API的LLM还是免费的本地LLM,LLM将被分配给llm变量

创建一个QA链

在这里,我们设置了一个RAG框架。它被设计用来接受各种文本文档并将它们设置为检索。

当使用LLM作为“大脑”而不是嵌入相似性时,基于相同要求进行搜索。

我们现在将运行与第8章中的示例完全相同的请求。这些请求将在相同的笔记和相同的向量数据库上执行,该数据库包含相同的嵌入。这一切都没有改变或增强。区别在于我们将让LLM监督答案的处理。

第8章中,我们看到了第二个问题得到了错误的答案。问题是:“是否有任何原定于9月出生的孕妇?”

我们在第8章中看到的答案是关于一位原定于8月出生的病人。错误是由于相似性算法的不足。确实,那位病人的记录内容与问题相似,但分娩在不同月份的细微差别应该是使那些记录无关紧要的因素。

在这里,在我们的当前管道中,应用了OpenAI的LLM,它正确地告诉我们没有病人原定于9月出生。

注意,当选择免费 LLM 时,它可能会出错。这体现了该模型的次优方面,因为它被量化以节省 RAM 要求。

为了总结这个例子,我们建立了一个内部搜索机制,允许用户(在我们的例子中,是一位医生)根据某些标准搜索他们的患者记录以找到患者。这个系统设计的独特之处在于让 LLM 从外部数据源检索相关答案,而不仅限于它所训练的数据。这种范式是 RAG 的基础。

在下一节中,我们将展示 LLM 的更多用途。

带链的高级方法

在本节中,我们将继续探索一个人可以利用 LLM 管道的方式。我们将重点关注链。

请参考以下笔记本:Ch9_Advanced_Methods_with_Chains.ipynb。这个笔记本展示了一个链管道的演变,因为每一次迭代都展示了 LangChain 允许我们使用的另一个功能。

为了使用最少的计算资源、内存和时间,我们使用了 OpenAI 的 API。您可以选择使用免费的 LLM,并且可以以与我们在本章前一个示例中设置笔记本类似的方式这样做。

笔记本总是从基本配置开始,因此我们可以跳过审查笔记本的内容。

向 LLM 提出一个一般知识问题

在这个例子中,我们希望使用 LLM 告诉我们一个简单问题的答案,这个问题需要训练有素的 LLM 应该拥有的常识:

"Who are the members of Metallica. List them as comma separated."

然后,我们定义了一个简单的链,称为 LLMChain,并给它提供 LLM 变量和提示。

LLM 确实知道答案,并从其知识库中返回:

'James Hetfield, Lars Ulrich, Kirk Hammett, Robert Trujillo'

请求输出结构 – 使 LLM 以特定的数据格式提供输出

这次,我们希望输出具有特定的语法,这可能允许我们以计算方式使用它进行下游任务:

"List the first 10 elements from the periodical table as comma separated list."

现在,我们添加了一个用于实现语法的功能。我们定义了 output_parser 变量,并使用不同的函数生成输出,predict_and_parse()

输出如下:

['Hydrogen',
'Helium',
'Lithium',
'Beryllium',
'Boron',
'Carbon',
'Nitrogen',
'Oxygen',
'Fluorine',
'Neon']

发展到流畅的对话 – 插入记忆元素,以便将先前交互作为后续提示的参考和上下文

这个功能为链带来了新的价值水平。到目前为止,提示没有上下文。LLM 独立处理每个提示。例如,如果你想提出一个后续问题,你做不到。管道没有你的先前提示及其响应作为参考。

为了从提出零散的问题转变为拥有持续的、滚动对话般的体验,LangChain 提供了 ConversationChain()。在这个函数中,我们有一个 memory 参数,它将链的先前交互映射到当前提示。因此,提示模板就是内存“居住”的地方。

而不是使用基本模板进行提示,例如

"List all the holidays you know as comma separated list."

现在模板已经适应了记忆功能:

"Current conversation:
{history}
Your task:
{input}}"

在这里,你可以将这个字符串视为类似于Python f"…"字符串的格式,其中historyinput是字符串变量。ConversationChain()函数处理这个提示模板,并插入这两个变量以完成提示字符串。input变量由函数本身生成,当我们激活记忆机制时,然后我们运行以下内容:

conversation.predict_and_parse(input="Write the first 10 holidays you know, as a comma separated list.")

输出如下:

['Christmas',
'Thanksgiving',
"New Year's Day",
'Halloween',
'Easter',
'Independence Day',
"Valentine's Day",
"St. Patrick's Day",
'Labor Day',
'Memorial Day']

现在,让我们提出一个只有在前一个请求和输出上下文中才能理解的后续请求:

conversation.predict_and_parse(input=" Observe the list of holidays you printed and remove all the non-religious holidays from the list.")

的确,我们得到了适当的输出:

['Christmas',
'Thanksgiving',
"New Year's Day",
'Easter',
"Valentine's Day",
"St. Patrick's Day,"]

为了完成这个例子,让我们假设我们的意图是快速生成一个包含名称和描述的节日表格:

"For each of these, tell about the holiday in 2 sentences.
Form the output in a json format table.
The table's name is "holidays" and the fields are "name" and "description".
For each row, the "name" is the holiday's name, and the "description" is the description you generated.
The syntax of the output should be a json format, without newline characters."

现在,我们从链中得到了一个格式化的字符串:

{
  "holidays": [
    {
      "name": "Christmas",
      "description": "Christmas is a religious holiday that celebrates the birth of Jesus Christ and is widely observed as a secular cultural and commercial phenomenon."
    },
    {
      "name": "Thanksgiving",
      "description": "Thanksgiving is a national holiday in the United States, celebrated on the fourth Thursday of November, and originated as a harvest festival."
    },
    {
      "name": "Easter",
      "description": "Easter is […]

我们可以使用pandas将这个字符串转换为表格:

dict = json.loads(output)
pd.json_normalize(dict[ "holidays"])

在pandas将dict处理为DataFrame之后,我们可以在表9.1中观察到它:

名称 描述
0 圣诞节 圣诞节是基督教节日,庆祝耶稣基督的诞生。每年12月25日庆祝。
1 感恩节 感恩节是一个人们聚集在一起表达对生活中祝福的感激之情的节日。在美国,感恩节庆祝于11月的第四个星期四。
2 新年 新年标志着格里高利日历年的开始。它通过各种传统和庆祝活动在1月1日庆祝。
3 复活节 复活节是基督教节日,纪念耶稣基督从死里复活。它是在春分后的第一个满月后的第一个星期日庆祝的。
4 情人节 情人节是庆祝爱情和亲情的日子。它传统上与浪漫爱情相关联,但也是表达对朋友和家人的感激之情的时候。
5 圣帕特里克节 圣帕特里克节是一个文化和宗教节日,纪念爱尔兰的守护圣人圣帕特里克。它在3月17日通过游行、穿绿色和其他节日活动来庆祝。

表9.1 – pandas将表从字典转换为DataFrame,从而适合下游处理

这总结了笔记本展示的各种链式功能。注意我们如何利用了这两个链和LLM带来的功能。例如,虽然记忆和解析功能完全由链的方面处理,但以特定格式(如JSON格式)呈现响应的能力则完全归功于LLM。

在我们的下一个例子中,我们将继续使用LLM和LangChain展示新的实用工具。

从各种网络来源自动检索信息

在这个例子中,我们将回顾如何简单地利用LLMs(大型语言模型)访问网络并提取信息。我们可能希望研究某个特定主题,因此我们希望从几个网页、几个介绍该主题的YouTube视频等中整合所有信息。这样的努力可能需要一段时间,因为内容可能非常庞大。例如,有时几个YouTube视频可能需要数小时才能审查。通常,一个人只有在观看视频的很大一部分后,才知道视频有多有用。

另一个用例是当需要实时跟踪各种趋势时。这可能包括跟踪新闻来源、YouTube视频等。在这里,速度至关重要。与之前示例中速度重要是为了节省我们个人时间不同,在这里,速度是使我们的算法对识别实时新兴趋势具有相关性的必要条件。

在本节中,我们将构建一个非常简单且有限的示例。

从YouTube视频中检索内容并进行总结

参考以下笔记本:Ch9_Retrieve_Content_from_a_YouTube_Video_and_Summarize.ipynb (https://github.com/embedchain/embedchain)。我们将基于名为EmbedChain的库(https://github.com/embedchain/embedchain)构建我们的应用程序。EmbedChain利用RAG框架,并通过允许向量数据库包含来自各种网络来源的信息来增强它。

在我们的例子中,我们将选择一个特定的YouTube视频(Robert Waldinger: What makes a good life? Lessons from the longest study on happiness | TEDhttps://www.youtube.com/watch?v=8KkKuTCFvzI&ab_channel=TED)。我们希望将该视频的内容处理成RAG框架。然后,我们将向LLM提出与该视频内容相关的疑问和任务,这样我们就可以提取我们想要了解的所有关于视频的信息,而无需观看它。

应该强调的是,这个方法依赖的一个关键特性是YouTube为其许多口头视频提供了书面字幕。这使得视频文本上下文的导入变得无缝。然而,如果有人希望将此方法应用于没有字幕的视频,这并不是问题。一个人需要选择一个语音转文字模型,其中许多是免费且质量极高的。视频的音频将被处理,提取出字幕,然后你可以将其导入到RAG(Retrieval-Augmented Generation,检索增强生成)过程中。

安装、导入和设置

与之前的笔记本一样,我们安装必要的包,导入所有相关包,并设置我们的OpenAI API密钥。

我们接下来要做以下几步:

  1. 选择我们的模型。

  2. 选择一个将服务于RAG向量数据库功能的嵌入模型。

  3. 选择一个提示LLM。注意你可以设置更多控制模型输出的参数,例如返回的最大令牌数或温度。

  4. 选择你想要应用此代码的YouTube视频,并使用视频的URL设置一个字符串变量。

设置检索机制

我们需要设置EmbedChain的RAG过程。我们指定我们正在传递一个YouTube视频的路径,并提供视频的URL。

我们可以打印出获取的文本,并验证它确实与我们要分析的视频对齐。

审阅、总结和翻译

我们现在将观察此代码产生的价值。

我们要求LLM审阅内容,整理一个总结,并以英语、俄语和德语呈现该总结:

Please review the entire content, summarize it to the length of 4 sentence, then translate it to Russian and to German.
Make sure the summary is consistent with the content.
Put the string '\n----\n' between the English part of the answer and the Russian part.
Put the string '\n****\n' between the Russian part of the answer and the German part.

返回的输出非常准确,因为它完全捕捉了TED演讲的精髓。我们编辑它以移除分隔字符串,得到:

The content emphasizes the importance of good
relationships in keeping us happy and healthy
throughout our lives. It discusses how social
connections, quality of close relationships, and
avoiding conflict play crucial roles in our well-
being. The study follows the lives of 724 men over
75 years, highlighting the significance of
relationships over wealth and fame in leading a
fulfilling life.
Russian:
Содержание подчеркивает
Важность [...]
German:
Der
Inhalt betont die Bedeutung  [...]

现在,为了使内容对德语使用者来说简单易懂,我们要求LLM将德语总结形成几个最佳描述视频内容的要点。

它做得很好,输出如下:

- Betonung der Bedeutung guter Beziehungen für Glück und Gesundheit
- Diskussion über soziale Verbindungen, Qualität enger Beziehungen und Konfliktvermeidung
- Verfolgung des Lebens von 724 Männern über 75 Jahre in der Studie
- Hervorhebung der Bedeutung von Beziehungen im Vergleich zu Reichtum und Ruhm
- Fokus auf Beziehungen als Schlüssel zu einem erfüllten Leben

虽然此代码旨在作为一个基本的证明概念,但人们可以看到如何简单地向其中添加更多数据源,自动化它以持续运行,并根据发现采取行动。虽然一个可读的总结很有帮助,但人们可以将代码修改为根据确定的内容采取行动并执行下游应用。

既然我们已经观察到了LLMs可以执行的一些功能,我们可以退后一步,改进我们利用这些LLMs的方式。在下一节中,我们将举例说明如何减少LLM处理,从而节省API成本,或者当使用本地LLM时,减少推理计算。

提示压缩和API成本降低

这一部分专门介绍在采用基于API的LLMs(如OpenAI的服务)进行资源优化方面的最新进展。在考虑使用远程LLM作为服务与本地托管LLM之间的许多权衡时,一个关键指标是成本。特别是,根据应用和用途,API成本可能会累积到相当大的数额。API成本主要受发送到和从LLM服务发送的令牌数量驱动。

为了说明这种支付模式在商业计划中的重要性,考虑那些产品或服务依赖于API调用OpenAI的GPT的业务单元,其中OpenAI作为第三方供应商。作为一个特定例子,想象一个允许用户通过LLM助手评论帖子的社交网络。在这种情况下,用户想要评论一个帖子,而不是写一个完整的评论,一个功能允许用户用三到五个词描述他们对帖子的感受,而后端过程则增加一个完整的评论。

在这个特定的例子中,引擎收集用户的三个到五个单词,它还收集评论针对的帖子的内容,这意味着它还会收集社交网络专家认为与增强评论相关的所有其他相关信息。例如,用户的个人资料描述,他们过去的几条评论等等。

这意味着每次用户希望对评论进行增强时,都会从社交网络的服务器通过API发送一个详细的提示。

现在,这种类型的流程可能会积累很高的成本。

在本节中,我们将分析一种通过减少通过API发送给LLM的令牌数量来降低这种成本的方法。基本假设是,人们总是可以减少发送给LLM的单词数量,从而降低成本,但性能的降低可能是显著的。我们的动机是在保持高质量性能的同时减少这种数量。然后我们询问是否只发送“正确”的单词,忽略其他“非重要”的单词。这个概念让我们想起了文件压缩的概念,其中使用了一种智能且定制的算法来减少文件的大小,同时保持其目的和价值。

提示压缩

在这里,我们介绍LLMLingua,这是微软开发的一个旨在通过压缩来处理“信息稀疏”的提示的开发工具。

LLMLingua利用一个紧凑、训练有素的语料库模型,如LLaMA-7B,来识别和删除提示中的非必要令牌。这种方法使得使用LLM进行推理变得高效,实现了高达20倍压缩且性能损失最小(https://github.com/microsoft/LLMLingua)。

在他们的论文(https://arxiv.org/abs/2310.05736https://arxiv.org/abs/2310.06839)中,作者解释了该算法及其提出的优势。值得注意的是,除了成本降低外,压缩还旨在聚焦剩余内容,作者指出这可以通过LLM的性能提升来实现,因为它避免了稀疏和嘈杂的提示。

让我们在一个真实世界的例子中尝试提示压缩,并评估其影响和各种权衡。

尝试提示压缩并评估权衡

为了进行这个实验,我们将展示一个真实世界的例子。

在我们当前的使用案例中,我们正在开发一个位于学术出版物数据库之上的功能。该功能允许用户选择特定的出版物并对其提出问题。后端引擎评估问题,审查出版物,并得出答案。

为了缩小该功能的范围以便进行一系列实验,出版物来自特定的AI出版物类别,用户提出的问题是以下内容:

"Does this publication involve Reinforcement Learning?"

这个问题需要对每一篇出版物进行深入和有洞察力的审查,因为在某些情况下,一篇出版物讨论了一种新颖的算法,其中在出版物的任何地方都没有明确提到强化学习这个术语,但根据算法的描述,可以推断出它确实利用了强化学习的概念,并将其标记为强化学习。

请参考以下笔记本:Ch9_RAGLlamaIndex_Prompt_Compression.ipynb

在这个代码中,我们运行了一系列实验,每个实验都按照上述特征描述进行。每个实验都是以一个完整的、端到端的RAG(Retrieval-Augmented Generation)任务的形式进行的。虽然我们在之前的RAG示例中使用了LangChain,但在这里,我们引入了LlamaIndex。LlamaIndex是一个开源的Python库,它采用了一个RAG框架(https://docs.llamaindex.ai/en/stable/index.html)。LlamaIndex在这一点上与LangChain相似。

微软团队整合的LLMLingua代码栈与LlamaIndex集成。

让我们详细审查代码。

代码设置

与之前的笔记本类似,这里我们也使用以下方式设置了初始设置:

  1. 在这个代码部分,我们首先定义了一些关键变量。

  2. 我们设置了想要运行的实验数量。我们想要确保选择一个足够大的数字,以便能够得到压缩影响的良好统计代表性。

  3. 我们设置了top-k,这是RAG框架为提示上下文检索的块的数量。

  4. 我们预先定义了希望压缩减少的目标令牌数量。

  5. 最后,就像之前的代码一样,我们设置了我们的OpenAI API密钥。

我们借此机会强调,在这个评估中,一些参数被固定是为了限制其复杂性,并使其适合教育目的。在商业或学术环境中进行此类评估时,应该有定性的或定量的推理来支持所选择的价值。定性可能的形式是“由于预算限制,我们将把期望的减少量固定为999个令牌”,而定量的可能寻求不固定它,而是将其作为其他权衡的一部分进行优化。在我们的案例中,我们将这个特定的参数固定为一个值,这个值被发现可以在保持两个评估方法之间良好的协议率的同时,实现令人印象深刻的压缩率。另一个例子是我们选择的实验数量,这是在运行时间、GPU内存分配和统计功效之间的权衡。

收集数据

我们需要收集出版物的数据集,并且我们也对其进行筛选,以便只保留属于AI类别的有限出版物群体。

LLM配置

在这里,我们为将要使用的两个LLM(大型语言模型)奠定了基础。

压缩方法LLMLingua使用Llama2作为压缩LLM。它将获得LlamaIndex RAG管道检索到的上下文、用户的问题,并将上下文内容的大小压缩和减少。

OpenAI的GPT将被用作提示的下游LLM,这意味着它将获得关于强化学习的问题以及额外的相关上下文,并返回一个答案。

此外,在这里,我们定义了用户的问题。请注意,我们为OpenAI的GPT添加了如何呈现答案的说明。

实验

这是笔记本的核心。一个for循环遍历各种实验。在每次迭代中,评估两种场景:

  1. 第一种场景:部署了一个普通的RAG任务,其中上下文在未压缩的情况下被检索。提示由检索到的上下文和用户的问题组成,记录LLM返回的答案以及发送的标记数和处理时间。

  2. 第二种场景:使用LLMLingua。检索到的上下文被压缩。压缩后的上下文连同用户的问题一起发送给LLM。再次,记录返回的答案以及发送的标记数和处理时间。

当这个代码单元完成时,我们有一个字典record,它保存了每个迭代的有关值,这些值将被用于汇总和得出结论。

分析上下文压缩的影响——分类性能的降低与资源效率的提升

在这里,我们总结了实验的数值,并推断出提示压缩对LLM性能、处理时间和API成本的影响:

  • 我们发现,上下文长度的减少产生了92%的一致率。

  • 我们发现,压缩过程将处理时间延长了11倍。

  • 我们发现,上下文长度的减少节省了发送标记总成本的92%!

注意,成本降低与一致率呈负相关,因为我们预计成本节省的增加将降低一致率。

这种降低是显著的,在某些情况下,甚至可能将服务从亏损转变为盈利。

这里有一些关于不一致的意义和额外权衡的注意事项。关于两种方法之间的一致率下降,虽然两种方法之间的一致性暗示它们都是正确的,但不一致可能有两种情况。可能是第二种场景中,压缩扭曲了上下文,因此模型无法正确分类它。然而,情况可能相反,因为压缩可能减少了无关内容,使LLM专注于内容的相关方面,从而使压缩上下文的场景得出正确答案。

关于额外的权衡,上述LLM性能、处理时间和API成本的指标并没有揭示出额外的考虑因素,例如压缩所需的计算资源。在我们的案例中,本地的压缩LLM(Llama2)需要本地托管和本地GPU。这些是非平凡的资源,普通笔记本电脑上并不存在。记住,原始方法,即第一种场景,并不需要这些。普通的RAG方法可以使用较小的LM进行嵌入,例如基于BERT的LM,或者甚至基于API的嵌入。根据我们的原始假设,提示LLM被选为远程和基于API的,从而使得部署环境具有最少的计算资源,就像普通笔记本电脑提供的资源一样。

这一评估证明,LLMLingua提示压缩方法作为成本降低手段非常具有影响力和实用性。

在本章接下来的最后一个代码演示中,我们将继续观察这一经验的结果,我们将通过组建一个由专家组成的团队来实现,每个专家由一个LLM扮演,以增强得出分析结论的过程。

多个代理——形成一个LLM团队进行协作

本节讨论了LLM领域中最近最激动人心的方法之一,即同时使用多个LLM。在本节的背景下,我们试图定义多个代理,每个代理都由一个LLM支持,并赋予不同的指定角色。与我们在ChatGPT中看到的用户直接与LLM工作不同,在这里,用户设置了多个LLM,并为每个LLM定义了不同的系统提示来设定它们的角色。

多个LLM代理同时工作的潜在优势

就像人们一起工作时一样,这里我们也看到了同时使用几个LLM的优势。

一些优势如下:

  • 增强验证和减少幻觉:研究表明,当向大型语言模型(LLM)提供反馈并要求其进行推理或检查其回答时,其回答的可靠性会提高。在为团队中的各种LLM代理指定角色时,至少其中一方的系统提示可能包括批评和验证答案的要求。

  • 允许个人根据意愿参与或退出过程:在指定各种角色时,用户可以将自己插入团队中,这样当轮到用户参与对话时,其他代理会等待用户输入。然而,如果用户希望的话,他们也可以完全退出,让LLM自动工作。

    在以下示例中,我们将看到后者的示例。

  • 允许不同的大型语言模型(LLM)得到最佳利用:如今,我们有几种领先的LLM可供选择。有些是免费的,本地托管,有些是基于API的。它们在大小和能力上有所不同,其中一些在特定任务上比其他LLM更强。当组建一个每个代理都分配不同角色的团队时,可能需要设置一个最适合该角色的不同LLM。例如,在编码项目的背景下,其中一位代理是特定编程语言的程序员,用户可以选择为该代理设置一个在该特定编程语言中代码生成能力更强的LLM。

  • 优化资源 – 使用多个较小的LLM:想象一个涉及技术功能和领域专业知识的项目。例如,在医疗领域构建一个用户平台。你希望有一个前端工程师、后端工程师、设计师和医学专家,所有这些都由项目经理和产品经理管理。如果你要使用多代理框架开发这个平台,你会定义代理,将各种角色分配给他们,并选择一个LLM来驱动他们。如果你要为所有代理使用相同的LLM,比如说OpenAI最新的GPT,那么这个模型将必须非常通用,因此可能需要非常大、可能非常昂贵,甚至可能很慢。然而,如果你可以访问到每个都预先训练以仅执行有限功能的单个LLM,例如,一个专注于医疗服务领域的LLM和一个专注于Python后端开发的LLM,那么你将把每个特定的LLM分配给相应的代理。

    这可能显著减少模型大小,因为几个专业LLM的组合架构可能比一个通用LLM的架构更小,假设两种情况下的性能相同。

  • 优化资源 – 单一LLM的最佳分配:使用多个LLM的一个独特且特定的情况是我们寻求根据当前任务优化所选择的LLM。这种情况与上述所有情况都不同,因为它不涉及多个LLM同时工作的情况。在这种情况下,一个路由算法根据当前约束和变量的状态选择一个LLM。这些可能包括以下内容:

    • 计算系统各部分的当前负载

    • 成本限制,这些可能随时间变化

    • 提示的来源,因为不同的客户/地区可能有不同的优先级

    • 提示的目的,因为不同的业务场景可能被赋予不同的优先级

    • 提示的要求,作为一个代码生成任务,可能需要使用一个小型且高效的代码生成LLM来获得出色的响应,而审查法律文件并提出先例的建议可能需要完全不同的模型

AutoGen

我们在本节中使用的特定框架称为AutoGen,由微软提供(GitHub仓库:https://github.com/microsoft/autogen/tree/main)。

图9**.1 展示了AutoGen框架。以下内容来自GitHub仓库中的说明:

AutoGen是一个框架,它使开发者能够使用能够相互对话以解决任务的多个代理来开发LLM应用。AutoGen代理是可定制的、可对话的,并允许无缝地参与人类。它们可以在各种模式下运行,这些模式结合了LLM、人类输入和工具*。

图9.1 – AutoGen功能

图9.1 – AutoGen功能

图9**.1 的左侧,我们观察到为个体代理指定的角色和能力;在右侧,我们观察到一些可用的对话结构。

AutoGen在代码仓库中展示的关键功能:

  • AutoGen通过最小努力使基于多代理对话的下一代LLM应用成为可能。它简化了复杂LLM工作流程的编排、自动化和优化。它最大化了LLM模型的表现并克服了它们的弱点。

  • 它支持复杂工作流程中的多样化对话模式。通过可定制和可对话的代理,开发者可以使用AutoGen构建关于对话自主性、代理数量和代理对话拓扑的广泛对话模式。

  • 它提供了一系列具有不同复杂度的运行系统。这些系统涵盖了从各个领域和复杂度范围内的广泛应用。这展示了AutoGen如何轻松支持多样化的对话模式。

  • AutoGen提供了增强型LLM推理。它提供了API统一和缓存等实用工具,以及错误处理、多配置推理、上下文编程等高级使用模式。

AutoGen由微软、宾夕法尼亚州立大学和华盛顿大学的研究合作研究支持。

接下来,我们可以深入到代码中的实际示例。

完成复杂分析——可视化结果并得出结论

在这里,我们将展示一个由多个代理组成的团队,每个代理都有不同的指定角色,如何作为一个专业团队提供服务。我们选择的用例是之前运行代码的延续。在上次代码中,我们执行了对使用提示压缩的复杂评估,当该代码完成后,我们得到了两个结果项:一个包含实验的数值测量的dict,称为record,以及关于结果协议率、令牌和成本的减少以及处理时间的变化的口头陈述。

在之前的笔记本中,我们故意停了下来。我们没有可视化令牌和成本的减少,也没有形成关于是否倡导使用提示减少的观点。然而,在商业或学术环境中,人们需要提供这两者。当你向利益相关者、决策者或研究社区展示你的发现时,你期望在可行的情况下,可视化实验的统计显著性。作为NLP和ML的主题专家,你也期望提供你的建议,即是否采用实验方法。

我们将使用那个评估的结果,并将任务分配给一组代理来完成这项工作!

请参考以下笔记本:Ch9_Completing_a_Complex_Analysis_with_a_Team_of_LLM_Agents.ipynb。该笔记本从安装、导入和设置的常见方面开始。你会注意到AutoGen有一个特定的字典形式的设置格式。它们提供了详细信息,正如你可以在我们的笔记本中看到的那样。

现在,我们转向有趣的部分!

创建实验重要性的可视化

record.pickle文件是一个dict变量。它是之前评估笔记本中数值结果的集合。我们的愿望是可视化每个实验的令牌计数分布。有原始提示的令牌计数和压缩提示的令牌计数,以及每个实验中两者的比率。

在本节中,我们将组建一个团队,编写代码以可视化三个分布。

定义团队需要完成的任务

首先,我们定义团队需要完成的任务。我们告诉团队文件保存的位置、上下文以及dict中值的性质,从而为团队提供他们需要来构思任务解决方案的理解。然后,我们描述了创建图表和可视化分布的任务。所有这些细节都在描述任务的单一字符串中。请注意,在敏捷Scrum工作环境中,这个任务字符串类似于故事的目的。

现在我们已经形成了一个全面的描述,应该很清楚期望的是什么。例如,我们要求标注图表和坐标轴,但我们没有明确说明期望的标签是什么。代理会自己理解,就像我们自己会理解一样,因为标签是从任务和数据字段名称中推断出来的。

定义代理和分配团队成员的角色

对于这个任务,我们需要三名团队成员:一名程序员编写代码,一名QA工程师运行代码并提供反馈,以及一名团队领导来验证任务是否完成。

对于每个角色,我们阐述一个系统提示。正如我们在 第8章 中所学,这个系统提示对LLM的功能有重大影响。请注意,我们还为QA工程师和团队领导提供了运行代码的能力。这样,他们就能验证程序员的代码并提供客观反馈。如果我们让同一个代理编写代码并确认其正确性,我们可能会发现,在实践中,它可能会生成一个初稿,不会麻烦去运行和验证它,并且会在未经验证的情况下完成该任务。

定义群组对话

这里,我们将对话定义为多代理对话;这是AutoGen的一个特性。这与定义一系列对话的情况略有不同,其中每个对话只涉及两个代理。群组对话涉及更多的代理。

当定义一个群组对话时,我们也会定义一个对话经理。

部署团队

团队领导将我们定义的任务分配给经理。然后经理将工作委托给程序员和QA工程师。

下面是屏幕上显示的自动化对话的要点:

lead (to manager_0):
Refer to the Python dict that is in this [...]
programmer (to manager_0):
```python

import pandas as pd

import matplotlib.pyplot as plt

# 从URL加载记录字典

import requests

import pickle

[...]

qa_engineer (向 manager_0):

exitcode: 0 (执行成功)

代码输出:

图(640x480)

programmer (向 manager_0):

终止

```py

As can be seen, the conversation had four interactions, each between two agents. Each interaction starts by telling the user which agent is talking to which other agent; these parts are in bold letters in the preceding printout.

In the second interaction, the programmer provided a complete Python script. We pasted only the first four commands to keep it short, but you can observe the full script in the notebook. The QA engineer ran the script and reported that it ran well. If it hadn’t run well, it would have returned an `exitcode: 1` and would have provided the programmer with the error specification for the programmer to fix the code; the conversation would have continued until a solution was found, or, if not, the team would report failure and conclude the conversation.

This task provided us with the code to create the visual we wanted. Note that we didn’t ask the agents to run the code and provide us with the visual; we asked for the code itself. One could, if desired, configure the LLMs to run the code and provide us with the resulting image. See AutoGen’s repo for the various examples and capabilities.

In the next code cell, we pasted the code that the team created. The code runs well and visualizes the three distributions exactly as we asked the team (see *Figure 9**.2*):

![Figure 9.2 – Visualizing the value that prompt compression provides](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/ms-nlp-fund-llm/img/B18949_09_2.jpg)

Figure 9.2 – Visualizing the value that prompt compression provides

The top visualization displays the distributions of the token count for the original prompts (blue/light shade) and the compressed prompts (orange/dark shade), and the bottom part of the figure shows the distribution of the ratio between each pair of prompts. *Figure 9**.2* shows just how effective the reduction rate is, as this ratio translates to a reduction in API cost.

This concludes the visualization of the significance of the experiments.

#### Human intervention in the team’s tasks

Note that all three agents are driven by LLMs, thus making this entire task automatically performed without human intervention. One could change the lead’s configuration to represent a human user, meaning you. If you did that, then you would be able to intervene and demand certain verifications from the QA engineer or certain additional features in the code from the programmer.

This could be particularly useful if you wanted to run the code yourself in your environment instead of letting the QA engineer agent run it in its own environment. Your environments are different. One advantage of doing this is when the code is required to load a data file that you have locally. If you told the agent to write code that loads this file, then when the QA engineer agent ran it, it would tell you the code failed since that data file doesn’t exist in its environment. In this case, you may elect to be the one who iterates with the programmer and the one who runs the code during the iterations and provides feedback.

Another case where you would want to be the one running the code and providing feedback is when the QA engineer encounters an error or a bug in the programmer’s code, but the two agents aren’t able to figure out the solution. In that case, you would want to intervene and provide your insight. For instance, in a case where a for loop iterates over a dict’s keys instead of its values, you may intervene and enter *The code runs but the for loop is iterating on the dict’s keys. It should iterate over its values for the* *key ‘key1.*

We can now move on to the second part of concluding the evaluation.

#### Reviewing the results of the experiments and forming an educated conclusion

As with every complex evaluation where we perform experiments to target the impact of a particular feature, we would now like to derive a qualitative summary of the results and suggest a conclusion for our audience, whether it is the decision-makers in the company or the research community in academia.

What is unique about this part is that the act of deriving a conclusion has never been left to any mathematical or algorithmic model to derive. As we humans govern the various evaluations, and although we may seek to automate as much as possible to feed into the final conclusion, we are the entity that forms the final impression and conclusion.

Here, we attempt to automate that final part. We will assign a team of expert agents to provide an educated summary of the results that the evaluation notebook printed out. We'll then push the team to provide us with a recommendation as to whether we should implement the new feature of prompt compression or not. We provide the team with the actual results of the evaluation notebook, but in order to examine its reliability, we then task it again, this time providing it with mocked results that are much poorer, hoping that the team will apply judgment and provide a different recommendation. All of this is done without any human intervention.

As we did before, we start by defining the task for our team to fulfill.

#### Defining the task to be fulfilled by the team

Our aim is to provide the team with the printout of the evaluation notebook from the previous section. That printout describes, in words, the change in agreement rate, the impact on the number of prompt tokens, and the processing runtime, all due to employing the LLMLingua prompt compression method.

We then copy that from the previous notebook and paste it as a text string.

Note that we have also created another text string of results (which are mocked results that are much worse than the true results), but we see that the agreement rate is very low, and the reduction in token count due to compression is much less significant.

As we did in the visualization case, we then create the instructions for the team; we paste the results into the task description for the team to refer to when deriving its conclusion. We have two task descriptions, as we will have two separate runs, one with the true results and one with the mocked bad results.

We will now allocate the roles.

#### Defining the agents and assigning team members roles

For this task, we would need three team members: a principal engineer who is an experienced technical person, a technical writer who writes the conclusion as per the principal engineer’s feedback, and a team lead to verify when the task is complete, which was defined in the previous task.

#### Defining a group conversation

Here, we define the group conversation, just like we did in the visualization part. This time, we have a new group conversation manager, as the group consists of different agents.

#### Deploying the team

The team lead tasks the manager with the task we defined. The manager then delegates the work to the writer and the principal engineer.

Here are the highlights of that automated conversation as it appears on the screen:

lead (向 manager_1):

请参考下面打印的结果。

这些是从 [...] 得出的结果。

writer (向 manager_1):

使用LLMLingua进行提示压缩的实验产生了以下结果:

  • 分类性能:

  • [...] 的协议率

principal_engineer (向 manager_1):

[...]


The agents have a few iterations between them and come to an agreement regarding the summary and the conclusion.

They provide a summary of the numeric results and seal it with the following recommendation:

仔细考虑提示压缩带来的权衡是至关重要的,因为虽然它可能导致资源节约,但可能会对处理效率产生影响。采用提示压缩的决定应该基于对这些权衡的全面理解。


The team agrees on a cautious approach to presenting the various trade-offs and avoids making a decision in spite of being tasked to do so.

One would wonder, could a definite decision to adopt or not to adopt the method be made here?

#### Evaluation of the team’s judgment

Now, we will ask the team to perform the same action, this time providing it with the mocked results that make the compression method seem much less effective and with a great reduction in agreement with the classification of the noncompressed method.

The team has a conversation, and the final agreement summary is sealed with the following statement:

总体而言,结果表明,虽然提示压缩可能导致成本节约和资源减少,但它是以降低分类性能和显著增加处理时间为代价的。

建议: 使用LLMLinguam进行提示压缩不推荐,因为它可能会对分类性能产生负面影响,并显著增加处理时间,超过了潜在的节约成本。


在这里,团队发现得出明确结论要容易得多。它没有进行任何人为干预,仅基于给出的数值结果。

## 对多代理团队的总结性思考

这种同时使用多个LLM的新兴方法在AI领域引起了兴趣和关注。在本节中我们展示的代码实验中,毫无疑问地证明了AutoGen的群组对话在专业环境中可以提供有形和可操作的价值。尽管设置这些代码实验需要一系列的尝试和错误来正确设置代理角色和描述任务,但它表明这个框架正朝着减少人类干预的方向发展。似乎仍然是一个重要组成部分的是,对那些代理团队*工作*产生的结果进行人类监督、反馈和评估。我们想向读者强调,在我们这本书中分享的各种应用和创新中,我们将多代理框架标记为最有可能增长并成为最受欢迎的框架。这是基于行业对AI自动化和展示类似人类的专业知识的压倒性期望,而像Autogen和Autodev这样的创新,后者由微软推出,都展示了日益增长的可行性和能力。

# 摘要

在这个关键章节的整个过程中,我们深入探讨了最近和最具突破性的LLM应用,这些应用通过全面的Python代码示例进行展示。我们首先通过使用RAG框架和LangChain来解锁高级功能,从而增强LLM在特定领域任务中的性能。旅程继续,我们探讨了用于复杂格式化和处理的链的高级方法,随后是来自不同网络来源的信息检索自动化。我们还解决了通过提示压缩技术优化提示工程的问题,显著降低了API成本。最后,我们探索了LLM的协作潜力,通过组建一个协同解决复杂问题的模型团队。

通过掌握这些主题,你现在已经掌握了一套强大的技能,使你能够利用LLM的力量应用于各种应用。这些新获得的能力不仅使你准备好应对NLP中的当前挑战,还为你提供了洞察力,以创新和推动该领域的可能性边界。从本章中获得的实际知识将赋予你应用高级LLM技术解决现实世界问题的能力,为效率、创造力和问题解决开辟新的机会。

随着我们翻过这一页,下一章将带我们进入AI和LLM技术新兴趋势的领域。我们将深入研究最新的算法发展,评估它们对各个商业部门的影响,并考虑AI的未来格局。这次即将到来的讨论承诺为您提供对领域未来走向的全面理解,以及如何保持技术创新的前沿。




# 第十章:乘浪而行:分析由LLMs和AI塑造的过去、现在和未来趋势

**自然语言处理**(**NLP**)和**大型语言模型**(**LLMs**)位于语言学和人工智能的交汇点,是我们理解人机交互的里程碑。它们的故事始于基本的基于规则的系统,虽然在当时具有创新性,但由于人类语言的复杂性和庞大性,往往陷入困境。这些系统的局限性凸显了转变的需求,为**机器学习**(**ML**)时代的到来铺平了道路,其中数据和模式识别规定了设计和模型。

在本章中,我们将回顾在自然语言处理和大型语言模型中出现的几个关键趋势,其中一些趋势足够广泛,可以捕捉到人工智能整体的方向。我们将从定性的角度讨论这些趋势,旨在突出它们的宗旨、价值和影响。在接下来的章节中,我们将分享我们对未来的看法。我们希望激发你的好奇心,并激励你与我们一同探索这些新兴路径。

让我们回顾本章涵盖的主要主题:

+   大型语言模型和人工智能的关键技术趋势

+   计算能力 - LLMs背后的引擎

+   大型数据集及其对自然语言处理和大型语言模型的不可磨灭的影响

+   大型语言模型的演变 - 宗旨、价值和影响

+   自然语言处理和大型语言模型中的文化趋势

+   商业世界中的自然语言处理和大型语言模型

+   由人工智能和大型语言模型引发的行动趋势 - 社会方面

让我们深入探讨我们看到的许多趋势,从技术趋势开始。

# 大型语言模型和人工智能的关键技术趋势

在本节中,我们涵盖了我们在自然语言处理和大型语言模型领域识别出的关键趋势。

我们将首先探讨技术趋势,稍后,我们将触及一些较软的文化趋势。

## 计算能力 - LLMs背后的引擎

随着技术的进步,尤其是在计算领域,科技领域的许多领域都蓬勃发展,尤其是自然语言处理(NLP)和大型语言模型(LLMs)。这不仅仅关乎更快的计算和更大的参数空间;这关乎新的可能性以及重塑我们的数字世界。在本节中,我们将探讨计算领域的这种增长如何成为今天NLP和LLMs的基础,重点关注它们的宗旨、价值和影响。

### 目的 - 为进步铺路

在人工智能和机器学习的初期,模型是基础的——不是因为缺乏想象力或意图,而是因为受限于计算边界。我们现在认为基本任务,如简单的模式识别,是重大的工作,因为它们需要高度算法的复杂性以实现低复杂性。在计算机科学课程中,我们被教导,具有超出线性的复杂性的算法具有较差的可持续性和不切实际的扩展性。

随着计算能力的增长,研究者的雄心也日益增长。他们不再局限于玩具问题或理论设置。计算进化意味着他们现在可以设计和测试相当复杂和深入的模型,这是我们今天认为高级NLP和LLMs的先决条件。

并行处理的出现和**图形处理单元(GPU**)的发展标志着根本性的转变。由于它们被设计为同时处理多个操作,这些创新似乎是为NLP的需求量身定制的,允许训练广泛的计算任务,如神经网络,并促进实时处理。

### 价值 - 放大潜力和效率

计算能力的提升不仅改善了可能性的范围,还改变了实际可行的范围。训练大型模型变得经济可行,确保研究机构和公司能够在没有高昂成本的情况下进行实验、迭代和优化他们的模型。

数字时代引入了数据泛滥。有效地处理、解析和从这信息海洋中提取洞察力变得可行,这主要得益于计算能力的指数级增长。这对于LLMs在大量数据集上进行自我训练的能力至关重要,它提取细微的语言模式并将它们作为预测和辅助等下游任务的信号。

今天的用户越来越习惯于不断增长的处理速度,并要求即时互动。无论是提供建议的数字助手还是AI驱动的客户服务平台,实时响应已成为标准。增强的计算能力确保了复杂的NLP任务,在过去可能需要几分钟甚至几小时,现在在终端设备上只需几秒钟就能完成。

### 影响 - 重新塑造数字互动和洞察

计算能力的提升使得AI驱动的界面成为常态。从网站上的聊天机器人到语音激活的家庭助手,NLP和LLMs,凭借先进的处理能力,已经成为日常生活的一部分。

艺术、文学和娱乐领域已经见证了人工智能的进入,得益于自然语言处理/大型语言模型(NLP/LLMs)与计算能力的紧密关系,AI驱动的内容创作者和音乐生成器等工具成为可能。

通过处理各种语言数据的计算手段,NLP模型现在提供多语言支持,打破语言障碍,促进全球数字包容性。在2023年,我们见证了Meta发布了SeamlessM4T,这是一个多语言LLM,是一个单一模型,能够执行多达100种语言的语音转文本、语音转语音、文本转语音和文本转文本翻译;您可以在此处了解更多信息:[https://about.fb.com/news/2023/08/seamlessm4t-ai-translation-model/#:~:text=SeamlessM4T%20is%20the%20first%20all,languages%20depending%20on%20the%20task](https://about.fb.com/news/2023/08/seamlessm4t-ai-translation-model/#:~:text=SeamlessM4T%20is%20the%20first%20all,languages%20depending%20on%20the%20task)。

总结来说,计算能力及其与NLP和大型语言模型(LLMs)的关系是一个相互增长和演变的故事。这是一个强调硬件进步和软件创新之间联系的故事。展望未来,随着量子计算和神经形态芯片预示着计算跃进的下一个前沿,人们只能想象NLP和LLMs将迎来进一步的革命。我们所见证的计算进步的目的、价值和影响是它作为人工智能驱动语言革命基石作用的证明。

现在,让我们看看事情将走向何方。

## 自然语言处理(NLP)计算能力的未来

我们确定了将发生的一些进步,并将推动计算能力,这些能力将被人工智能和特别是NLP所利用。

### 速度的指数级增长

摩尔定律传统上认为,每两年微芯片上的晶体管数量大约翻一番。尽管有人对其在传统意义上的可持续性表示怀疑,但它为估计计算能力的增长提供了一个有用的指南。芯片架构的进步,如3D堆叠和创新的晶体管设计,可能有助于维持甚至加速这种增长。

对于实时NLP应用的需求,从翻译服务到语音助手,将继续推动对更快计算速度的需求。我们正在见证一个新的趋势,即AI专用硬件。谷歌在2015年发布了Tensor Processing Unit([https://spectrum.ieee.org/google-details-tensor-chip-powers](https://spectrum.ieee.org/google-details-tensor-chip-powers)),自那时起,我们看到了更多这样的专用硬件,无论是来自大公司如Meta和Nvidia,还是来自小型新兴初创公司。

### 规模经济和成本效益

随着人工智能和NLP的日益普及,科技巨头和初创公司都有显著的动机投资于更高效、可扩展和成本效益的计算基础设施。

云计算向的转变已经使大量计算资源对即使是小型初创公司也变得可访问。这一趋势很可能会持续下去,预计每项计算的成本将降低,使自然语言处理应用更加可访问和负担得起。

### 量子计算 – 下一个前沿

量子计算代表了我们在理解和利用计算能力方面的一个范式转变。量子比特,或称为量子位,可以通过叠加现象同时表示0和1,这可能会为特定问题提供指数级的加速。

尽管量子计算还处于发展阶段,但其对自然语言处理的潜在影响是深远的。训练复杂模型,目前可能需要几天或几周,可能缩短到几小时甚至几分钟。

谷歌已经在量子计算领域确立了自己作为重要先锋的地位(以下引用来自此处:[https://quantumai.google/learn/map](https://quantumai.google/learn/map)):

*从大约100个物理量子比特开始,我们可以研究构建逻辑量子比特的不同方法。一个逻辑量子比特允许我们存储量子数据,而不会出错,足够长的时间,以至于我们可以用它们进行复杂计算。之后,我们将达到量子计算的分立时刻:即我们证明这项技术已经准备好进行扩展和商业化的那一刻* *。

谷歌制定了一个里程碑路线图,概述了关键成就的未来预测。见*图10*.*1*。值得注意的是,谷歌一直在坚持这一路线图,这对于这样一个雄心勃勃的研究领域来说是非常惊人的:

![图10.1 – 构建纠错量子计算机的关键里程碑](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/ms-nlp-fund-llm/img/B18949_10_1.jpg)

图10.1 – 构建纠错量子计算机的关键里程碑

密码学,作为安全数据传输的关键组成部分,对于基于云的自然语言处理服务至关重要,也将经历巨大的变化,鉴于量子计算有可能破解几种现有的加密方法。因此,量子安全加密方法的出现将至关重要。

### 能源效率和可持续性

随着对计算能力的需求增长,数据中心能耗也在增加。将会有一个双重驱动,即向更节能的计算和可持续能源来源转变,以支持这些计算工作。

在自然语言处理的背景下,这可能意味着更高效的模型架构,需要更少的能量来训练和运行,以及最大化每瓦特操作的硬件创新。

### 专门用于NLP的硬件

我们已经见证了专门用于深度学习的**张量处理单元**(**TPUs**)的兴起。展望未来,可能会有针对自然语言处理(NLP)任务的专用硬件,确保更快速和高效的模型操作。

神经形态计算,它试图模仿人脑的架构,可能在需要逻辑和直觉结合的任务,如自然语言处理(NLP)中,提供独特的优势。Davies等人在其出版物“*通过Loihi推进神经形态计算:结果概述*”中回顾了一些关键机遇。

### 高端计算的民主化

随着边缘计算的发展以及日常设备中强大处理器的丰富,高端NLP任务可能并不总是需要连接到集中的数据中心。潜在地,高级NLP能力可能成为智能手机、智能家居设备和甚至智能手表的标准。你将能够在个人设备上获得一个LLM,它本地运行并立即响应,就像你的计算器一样。

### 云计算 - NLP和LLMs演变的催化剂

云平台在计算资源方面提供了前所未有的灵活性,使得训练更大、更复杂的NLP模型变得更加容易。

如AWS的SageMaker、Microsoft的Azure机器学习工作室和Google的Vertex AI等平台,促进了协作精神,为研究人员和开发者提供了无缝共享模型、数据集和工具的工具。

本地、边缘和云计算的组合确保了NLP任务的高效处理,平衡了延迟和计算能力。

云平台正在演变,使高端计算能力更加易于获取,定价模式反映了实际使用情况,并在降低成本的情况下提供临时的高性能计算访问。

要总结我们对计算能力未来的看法,特别是与NLP相关,它显然是呈上升趋势的。尽管挑战依然存在,尤其是在能耗和传统芯片扩展的潜在障碍领域,但量子计算等创新有望开启通往具有自己份额的专著的能力。

计算能力的未来,即NLP运行的引擎,看起来前景光明,因此让我们讨论另一个关键组件:数据。

# 大型数据集及其对NLP和LLMs不可磨灭的影响

大数据时代以及随之而来的NLP和LLMs的崛起紧密相连。没有提及可用的庞大数据集,就无法讨论NLP和LLMs转变为今天强大发展的过程。让我们探讨这种关系。

## 目的 - 训练、基准测试和领域专业知识

在本质上,大型数据集的出现为训练日益复杂的模型提供了所需的原始材料。通常,数据集越大,模型可以学习的信息就越全面和多样化。

大型数据集不仅作为训练场地,还为评估模型性能提供了基准。这导致了标准化措施的出现,为研究人员提供了明确的目标,并允许在模型之间进行苹果对苹果的比较。有一系列常见的基准可以用来评估LLMs。谷歌创建了一个著名且非常全面的基准,即超越模仿游戏基准(BIG-bench)。这是一个旨在评估LLMs的响应并推断其未来能力的基准。它包含了超过200个任务,如阅读理解、摘要、逻辑推理,甚至社会推理。

覆盖特定领域的大型数据集,例如医疗保健或法律文本,为能够以高精度理解和操作特定领域的专业模型铺平了道路。例如,BERT是由谷歌开发的,后来由Hugging Face免费提供。BERT的设计采用了迁移学习;因此,它非常适合定制和创建一个针对特定领域的模型的新版本。其中一些最成功的版本包括BERT-base-japanese,它是在日本数据上预训练的;BERTweet,它是在英语推文上预训练的;以及FinBERT,它是在金融数据上预训练的。

## 价值 - 坚固性、多样性和效率

随着数据的增加,模型可以捕捉到人类语言更多细微之处和微妙之处。这种信息量的丰富使得模型能够更好地泛化到各种任务中。

大量且多样化的数据集的可用性确保了模型在多种语言、方言和文化背景下进行训练。这推动了NLP向更具包容性的方向发展,能够识别和回应更广泛的受众。

大型数据集在一定程度上消除了对大量手动标记的需求。本书前面提到的无监督和自监督学习模型利用了这种丰富性,节省了时间和金钱。

## 影响 - 民主化、熟练度和新的担忧

通过对大型数据集的开放访问,NLP研究领域的许多进入障碍已经降低。这导致了NLP的民主化,更多的人和组织能够进行创新。

GPT-3和BERT等LLMs的熟练程度归功于它们所训练的广泛数据。这些被认为是当前最先进的模型,在各种NLP任务中设定了新的基准,所有这些都得益于它们所训练的丰富数据集。

由于NLP多年来主要是一个研究领域,一些适用于商业领域的法律方面并不适用。然而,随着这些模型的大量使用和商业化,它们所反映的大型数据集引起了严重的担忧。这些数据集通常是从网络中抓取的,引发了关于隐私、数据所有权和潜在偏差的伦理问题。这导致监管机构着手制定有关如何道德地获取和使用数据的指南。例如,在撰写本书时,我们注意到不同国家采取了不同的行动。日本迅速采取了一种非常自由的政策,允许模型在可在线获取的数据上进行训练,而欧盟则表现出更为限制性的方法。美国的官方指南似乎避免涉及版权争议。

我们现在可以阐述一些关于数据和其在LLMs发展中作用的未来预测。

### NLP中数据可用性的未来

未来,我们将看到数据如何继续增长,同时解决各种方面和挑战。以下是关键点。

#### 领域专业知识和专业化

随着大型语言模型(LLMs)证明其能力和受欢迎程度,人们越来越重视使它们精通。我们可以通过多种方式提高LLM的熟练度,其中一种方式是向其提供捕捉特定领域数据的数据集,并利用LLM在该特定领域的专业知识。未来,我们预计将培养更多细分、特定领域的专业数据集。无论是医疗保健、法律、金融还是任何专业领域,重点都将放在数据的丰富性和特异性上,使模型能够实现无与伦比的领域专业知识。自LLMs出现和日益流行以来,我们已经看到了许多针对特定商业领域定制LLM的商业案例,医疗保健和金融领域受到了很多关注。

相反,随着不同领域的重叠,综合数据集出现。这些数据集结合了多个领域的专业知识。例如,一个数据集可能将法律和人工智能伦理交织在一起,试图提出促进人工智能监管的新见解。另一个例子是为了形成算法交易方案,将计算机代码和股票交易联系起来。

#### 追求多样性

随着技术的扩展,数据集将越来越多地涵盖不太为人所知的语言和地方方言。这将使NLP能够满足更广泛的全球受众,使数字通信更具包容性。我们在本章 earlier 讨论的 Meta 的 SeamlessM4T 是一个能够通过LLM进行跨语言对话的优秀例子。

除了语言本身,语言的文化方面也很重要,比如行话或仅仅是词语的选择。捕捉文化细微差别和语境将成为未来文本生成中的关键。这将导致更具文化意识和情境感知的模型。

#### 消除偏见

在认识到我们数字内容中存在的隐含偏见时,将出现大量工具和方法来审计数据集的偏见。社区将努力实现既大又公平的数据集。而不是盲目地从网络中抓取数据,更多的努力将用于数据整理,确保其具有代表性且无明显的偏见。这可能包括积极寻找代表性不足的声音或过滤掉可能有害的偏见。

#### 监管环境

随着对数据隐私的关注日益增加,尤其是在欧盟的GDPR和加州的CCPA,我们可以期待对数据集的收集和利用有更严格的指导方针。

除了隐私之外,还将推动更多道德的方式来收集数据。这意味着确保数据收集不涉及剥削,有适当的同意,并尊重个人和群体的权利。

在可重复研究的精神下,可能会推动使数据集,尤其是用于基准测试和主要模型的数据集,更加透明和开放。当然,这需要与隐私问题相平衡。

#### 增强数据集

在一个数字环境中,创造真正新颖和独特的数据是一项非凡的任务,增强数据集提供了一个替代解决方案。通过人工扩展和修改现有数据集,增强可以迅速满足对多样化数据的日益增长的需求,而无需进行繁琐的新数据收集过程。增强数据集有助于解决以下四个数据集挑战:

+   **增强领域专业知识**:虽然特定领域的数据集可以满足领域特定性,但它们的大小往往受到限制。增强数据集可以填补这一差距,人为地扩展特定领域的数据集,从而提供深度和广度。例如,可能只有有限真实世界数据的罕见医疗状况可以通过增强来训练稳健的模型。

+   **多样性放大**:捕捉全球语言和文化的众多细微差别是一项艰巨的任务,但可以通过增强来显著缓解。诸如回译或同义词替换等技术可以引入语言多样性,基于上下文的修改可以模拟文化细微差别,从而推动模型向真正的全球理解发展。

+   **偏差校正**:数据增强的一个突破性应用在于其平衡偏差的潜力。通过识别数据集中代表性不足的声音或主题,增强可以人为地提升它们,确保更平衡的代表性。可以采用对抗性训练等技术,故意向模型展示具有挑战性或矛盾的数据,以消除偏差。

+   **合规性监管**:在一个不断加强数据监管的世界中,增强数据集提供了宝贵的优势。此外,可以设计技术来确保增强数据遵守隐私规范,从而为模型提供充足的学习数据,同时不越过监管边界。例如,想想我们的医疗代码示例,我们实现了一个内部搜索引擎,可以根据医生的查询找到医疗记录。为了给它提供数据库,我们通过提示ChatGPT生成了模拟的医疗记录。

尽管增强数据集为许多数据相关挑战提供了创新解决方案,但它们并非没有缺点。原则上,过度依赖增强可能导致模型擅长识别人工模式,但在现实世界的变异性上却失败。如果原始数据集存在未考虑的偏差,还存在无意中放大偏差的风险。此外,并非所有增强技术都普遍适用;对某个数据集有效可能对另一个数据集造成扭曲。最后,关于创建合成数据的伦理辩论也是一个问题,特别是在敏感领域,其中真实和增强之间的区别可能会模糊基本真相。

为了总结我们在NLP和AI背景下对数据的讨论,我们观察到大型数据集的可用性如何彻底改变了NLP领域以及大型语言模型(LLMs)的发展。它们为现代NLP的辉煌建立提供了基础,塑造了其目的,放大了其价值,并对研究、应用以及整个社会产生了持久的影响。

在可预见的未来,随着大型数据集继续塑造NLP的世界,我们正展望一个不仅数据丰富,而且具有道德意识、特定领域和全球包容性的未来。这些趋势源自当前网络文章和出版物中的集体智慧,描绘了NLP数据驱动旅程的美好前景。

现在我们已经讨论了驱动算法创建的计算能力和指导LLMs智能的数据,我们可以考虑LLMs本身。

# 大型语言模型的演变——目的、价值和影响

LLMs的兴起和发展是我们不懈追求更先进算法的见证。这些巨大的计算语言学模型从其最初的形式已经走了很长的路,不仅在规模上增长,而且在能力上也增长。当我们深入研究这些强大工具的目的、价值和影响时,很明显,它们的演变与我们利用机器驱动通信和认知的真正潜力的愿望紧密相连。

## 目的——为什么追求更大、更好的LLMs?

LLMs发展的背后逻辑围绕着弥合人类与机器通信差距的追求,其中人类语言将被输入机器进行下游处理。随着数字时代的开始,对流畅、上下文感知和智能系统的需求变得明显,这些系统能够以细微的方式理解人类语言。正如前几章所广泛讨论的,深度学习(DL)是LLMs的基础。随着计算能力的提升,DL模型在深度和复杂性上增长,在各种任务中,尤其是在自然语言处理(NLP)任务中,性能得到了提升。

传统深度学习模型的训练依赖于需要标注数据的监督学习,这反过来又既资源密集又限制性。自监督学习和如**从人类反馈中进行强化学习**(**RLHF**)等方法的出现拓宽了视野。这些方法不仅最小化了显式标注的需求,还为模型以更有机的方式学习打开了大门,模仿人类的学习过程。

早期的自然语言处理模型能够针对狭窄的焦点回答问题或执行任务。大型语言模型(LLMs)的演变带来了范式转变,其中模型开始表现出推理能力,遵循思维链,并产生连贯、较长的响应。这是朝着复制类似人类对话的重大一步。早期模型的通用方法有其局限性。随着技术的成熟,出现了将LLMs定制到特定任务的能力。例如,设置检索数据集或微调预训练模型等技术,使企业和研究人员能够将通用的LLMs塑造成专业工具,提高准确性和实用性。

## 价值——LLMs的优势

LLMs随着其演变,在多个领域带来了前所未有的价值。它们变得更加准确、高效、适应性强和可定制。

更大的模型展示了内在的把握上下文的能力,减少了解释和输出的错误。这种准确性转化为在各种应用中的效率,如聊天机器人和内容创作。它们通过利用如RLHF等卓越技术来适应,这些技术使它们能够从交互和反馈中学习,使它们随着时间的推移变得更加有弹性和动态。由于可定制,LLMs可以满足利基行业和任务的需求,成为各个行业中的宝贵资产。

另一个我们可以看到正在增长的价值是打破语言障碍的能力,因为模型能够理解和生成多种语言,满足了全球对通用通信的渴望。

## 影响——改变格局

LLM的兴起和演变在技术格局和人与机器的互动中留下了永久的印记。从医疗保健和金融到娱乐和教育,LLM正在革新运营、客户互动和数据分析。有趣的是,随着这些模型变得更加复杂,它们的使用变得更加简单。技术敏锐度成为一个更低的要求,因为随着更直观和自然语言界面的出现,无论技术知识如何,更广泛的受众现在都可以利用高级计算工具的力量。

这些影响元素是数字生态系统协同发展的一个部分。随着LLM在各个平台和服务中整合,我们正在见证更多有组织、同步的数字生态系统的创建,这些系统提供无缝的用户体验。

想象LLM下一步将走向何方,令人兴奋。

### LLM设计的未来

LLM的快速进化预示着一个充满创新的未来。从当前的研究趋势、在线出版物和专家预测中汲取灵感,我们可以预测LLM设计可能走向的几个方向。

#### 学习方案和深度学习架构的优化

正如我们所见,自监督学习和RLHF已经改变了LLM的游戏规则。下一个前沿可能涉及结合各种学习范式或引入新的范式。随着深度学习技术的进步,我们可能会看到更多混合模型,这些模型整合了不同架构的最佳特性,以提高性能、泛化能力和效率。

Palantir的首席技术官Shyam Sankar提出的一个同时使用多个LLM的例子,他描述了他们的K-LLMs方法。他将LLM比作专家,并问为什么只用一个专家来回答问题,而可以组建一个委员会来共同回答这个问题?他建议使用不同LLM的集合,每个LLM可能具有互补的优势,以便能够综合出一个更加周全的答案。应该强调的是,在这个想法中,每个LLM都被分配了相同任务。这并不一定非得如此,在下一个方法中,我们将讨论相反的情况。请在此处查看完整视频:[https://youtu.be/4aKN5mCPF5A?si=kThpx8hOok1i0QWC&t=327](https://youtu.be/4aKN5mCPF5A?si=kThpx8hOok1i0QWC&t=327)。

另一种吸收专家团队的方法是通过模拟一个专业团队。在这里,为LLM分配了指定的角色。然后,任务由指定的每个角色依次处理。每个角色不仅处理任务,还处理之前其他角色完成的工作的遗留问题。这样,就有了一种迭代的方法来构建对复杂问题的深思熟虑的解决方案。我们在[*第9章*](B18949_09.xhtml#_idTextAnchor506)的例子中看到了这个迷人的过程,我们利用了Microsoft的Autogen。

#### 提示工程的兴起

有效提示LLM已经成为一门微妙的艺术和科学,被称为**提示工程**。随着模型的发展,手动制作每一个查询可能变得不可行。未来可能会看到自动化或半自动的方法来生成提示,以确保一致和期望的输出。推动的方向是使LLM更加用户友好,最小化有效与之交互所需的专门知识。

在[*第8章*](B18949_08.xhtml#_idTextAnchor440)中,我们讨论了提示工程的一些关键方面。我们解释了如何利用OpenAI的GPT模型,通过一个技术特性,如系统提示。有趣的是,提示工程中还有一些非技术方面,对于实现最佳LLM结果同样有价值。当我们说非技术时,我们指的是在提示中提供连贯的请求描述,就像我们提供给寻求帮助我们的人类一样。

我们期待看到在提示中进一步出现微妙的技术,就像提示链和软提示一样。提示链是将复杂任务分解成小任务并反映在每个小提示中的提示迭代。这允许有更高的遵守度、正确性和监控。软提示是一种算法技术,旨在微调表示提示的向量。

一个这样的迷人例子是C[. 杨等人的**大型语言模型作为优化器**](https://arxiv.org/abs/2309.03409);参见**Arxiv**上的出版物:[https://arxiv.org/abs/2309.03409](https://arxiv.org/abs/2309.03409)。他们发现,鼓励LLM在解决方案上给予深思熟虑的关注,可以带来更好的性能。如果我们假设LLM只有一个继承的过程来解决每一个特定问题,这可能会让人感到惊讶。例如,如果我们要求它解一个方程,人们可能会假设LLM会采用一种特定的数学技术,但面对需要分解成一系列逐步任务且这些任务的结构非平凡、每个任务的解决方案方法也非显而易见的复杂问题时,该怎么办呢?通过命令LLM不仅优化结果,还优化推导过程,这个过程可以改善结果。这是通过添加如下请求来实现的:

+   “让我们仔细思考这个问题,一起解决它。”

+   “让我们一步步计算出解决方案!”

+   “让我们一步步解决这个问题。”

这些都是从出版物中摘录的。其中最引人注目的是这个:

+   “深呼吸,一步步解决这个问题。”

他们的研究表明,虽然大型语言模型(LLM)显然不会呼吸,但它理解这个提示的增加是对推导过程重要性的强调。

#### 检索增强生成模型 - RAGs

我们借此机会再次讨论,我们预计将在明年继续出现的一个重要新范式:RAGs。

正如我们所见证的,由LLM驱动的生成式AI擅长根据对大量数据语料库的广泛训练,产生详细且易于理解的文本响应。然而,这些响应仅限于AI的训练数据。如果LLM的数据过时或缺乏关于某个主题的特定细节,它可能不会产生准确或相关的答案。

#### 重新审视RAG

**检索增强生成**(Retrieval-augmented generation),也称为**RAG**,通过整合有针对性的、当前的,甚至可能是动态的信息来增强LLM的能力,而不改变LLM本身。这种方法是在P. Lewis等人于2020年发表的一篇名为《Retrieval-Augmented Generation》(*for Knowledge-Intensive NLP Task*)[*see on *Arxiv*: [https://arxiv.org/abs/2005.11401](https://arxiv.org/abs/2005.11401)]的论文中提出的。

在第8章和第9章中,我们从实际的角度研究了RAGs,为读者提供了必要的工具和知识,以便进行实际实验和实施。当我们重新审视RAGs时,我们的重点转向了检查它们在NLP和LLM发展更广泛叙事中的重要性。这次讨论是在一个定性的、概念性的背景下进行的,探讨了算法进步的演变趋势和未来方向。我们的目标是使RAGs不仅仅作为一个技术工具,而且作为一个关键组成部分,在LLM持续演化的过程中发挥重要作用,突出它们在塑造下一代AI解决方案中的作用。这次探索旨在将技术与理论相结合,提供关于RAGs如何贡献并受到AI研究和应用动态景观影响的见解。

为了直观理解,考虑以下例子。让我们以某种编程语言为例;它可以是Python、R、C++或其他任何通用语言。它自带了继承的“知识”,即内置的库和函数。如果你编写代码来执行基本的数学运算或形成有序列表,你会发现当前编程语言的状态适合你,因为它有内置的代码库,包含了所有你需要的函数。然而,当你想要执行一些与常见库和函数集非常不同的操作时怎么办?例如,将外语翻译成英语,计算傅里叶变换或进行图像分类。从理论上讲,人们可以寻求开发一种全新的专用编程语言,其中内置库集包含了他们需要的所有功能。相反,人们可能只是构建一个专用库并将其导入到编程语言的环境中。这样,你的代码只需检索必要的函数。显然,这就是通用编程语言的工作方式,这是两种解决方案中最简单、最可扩展的。这就是RAGs在LLM环境中试图实现的目标。LLM相当于编程语言,从外部数据源检索信息相当于导入一个专用库。

让我们观察**图10.2**,在我们更深入地回顾RAGs时。

![图10.2 – 典型RAG的流程图](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/ms-nlp-fund-llm/img/B18949_10_2.jpg)

图10.2 – 典型RAG的流程图

RAGs是如何工作的

以下是RAG功能的基础:

+   **数据集成**:组织拥有各种数据类型,包括数据库、文件以及内部和外部通信流。RAG会将这些数据编译成统一格式,创建一个知识库。

+   **数据转换**:通过使用嵌入LM/LLM,知识库中的数据被转换成存储在向量数据库中的数值向量,以便快速检索。

+   **用户交互**:当用户提出问题时,查询被转换成一个向量。这个向量用于根据嵌入向量空间中的度量邻近性从数据库中识别相关信息。这些信息被检索并与LLM的知识结合,以构建一个全面的回答。

这种机制可能对你来说很熟悉。我们在第8章和第9章中实现了这种范式,当时我们介绍了LangChain的功能并设计了从外部文件检索文本的管道。

通过回顾它们的优缺点,让我们对RAGs有更多的了解。

#### RAGs的优势

让我们通过以下列表来了解RAGs的优势:

+   正如我们强调的,RAGs提供的数据比通用的LLM更**具有上下文相关性**。

+   RAGs可以提供访问比LLM通过其训练内在可用的数据**更新**。

+   RAGs 允许知识库**持续更新**,而无需高昂的成本。RAG 不仅可以利用新数据,而且可以频繁地对其进行更改。

+   由于用户控制 LLM 可以访问的数据,可以开发出用于**监控结果正确性**的专用模式。这减少了幻觉和错误,这两者是 LLM 的两个主要缺点,因此使 RAGs 成为一种潜在的解决方案。

+   RAGs 非常**简单且易于启动**。可以使用公共代码免费构建 RAG,使用的存储空间可能与你笔记本电脑上的存储空间一样少。从概念上讲,在其基本形式中,RAG 是一组现有计算和数据资源之间的连接。

#### RAGs 的挑战

由于 RAGs 是建立在 LLM 之上的新技术,而 LLM 本身也是一种新技术,这带来了各种挑战。

其中一个挑战是检索数据结构设计的选择,这对 RAG 的功能至关重要。通常的做法是在使用 LLM 之前,批量处理原始数据,以便数据已经以适合检索过程的格式存在。因此,这个离线过程在以检索次数或提示信息数量为函数时,其复杂度为 O(1)。向量数据库正在成为这一目的的首选设计。它们是数值数据库,旨在以类似于 LLM 处理提示信息时使用的格式捕捉数据的最小表示。这种格式就是我们全书所讨论的嵌入。应该补充的是,嵌入是一种有损压缩机制。虽然嵌入空间针对预定义的目的进行了优化,但在两个方面并不完美。首先,它优化了一个特定的损失函数,可能比另一个目的更适合,其次,它在权衡其他方面(如存储和运行时间)的同时进行优化。我们观察到嵌入空间中存在一个趋势,即维度——嵌入向量的尺寸——正在增加。更高的维度可以容纳每个向量更广泛的上下文,从而为更好的检索机制打开大门,这些机制反过来又适应了需要深入和复杂洞察的领域,例如法律或新闻业。

另一个缺点是,为了适应外部数据源提供的信息,发送给 LLM 的提示信息需要增加其大小。现在,提示信息并不需要包含整个数据库的文本。首先,会应用一个初步机制来缩小可能相关的文本范围,正如我们在医疗保健领域的代码示例中所看到的。然而,仍然需要对提示信息中发送的数据量进行限制,从而在 LLM 需要参考的上下文数量和提示信息的数据量之间进行权衡。

#### RAGs 的应用

RAG的即时用例与拥有针对特定需求的引擎相关。以下是一些例子:

+   **客户服务聊天机器人**:这些对寻求满足其客户需求的公司有吸引力。

+   **公司知识库**:这为公司员工提供内部服务。典型的公司管理几个不同的内部引擎,每个引擎都针对特定的需求。例如,内部网站、工资应用、服务请求应用、前端数据探索器(通常有多个)、培训服务、法律和合规资源等等。RAG可以作为公司聊天机器人的后端,整合各种信息。员工可以针对他们需要的各种需求进行提示。以下是一些例子:

    +   “全职员工的带薪休假政策是什么?”

    +   “哪个SQL表映射客户名称和唯一的客户标识符,谁提供对这个表的访问权限?”

+   **特定领域的LLM**:这可以设计成RAG的形式,从而消除在特定领域数据上训练的需求。这可以服务于研究、营销和教育等领域。例如,想象你从特定的书籍或研究论文中学习一个特定主题;使这些文档可用于检索,并要求LLM进行搜索、总结、回答特定问题,并简化是很简单的。

随着我们确定RAG是可能主导内部定制开发的关键技术,让我们讨论定制LLM本身的更重和更全面的方法。

#### 定制LLM

定制趋势将继续加强,因为定制的LLM提供了一个完全整体的产品,这是其制造商专有的。我们可能会看到行业或任务特定的LLM成为常态。从针对法律术语量身定制的LLM到擅长医学诊断的LLM,未来将是专业化的。这将涉及各种模型预训练、模型微调和基于检索的设计的设计选择,这些设计利用了专用数据集。

虽然典型的RAG旨在利用内部和非公开数据,但定制的LLM适合需要学习和掌握整个领域的情况。例如,如果我们想选择这两种方法之一作为构思和综合NLP和AI解决方案的工具,我们会选择在相关数据上训练的LLM,例如出版物、学习材料和专利,而不是仅仅使这些数据对通用LLM可用的RAG。定制的LLM将提供从其训练数据继承的思维链。RAG将利用具有通用思维链的通用LLM,其中它将参考额外的数据。

我们现在已经触及了提升LLMs性能的四个支柱。从优化提示到构建专门的LLM,必须权衡性能潜在改进与过程成本和复杂性的关系。*图10.3*展示了这一概念:

![图10.3 – 复杂性范围](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/ms-nlp-fund-llm/img/B18949_10_3.jpg)

图10.3 – 复杂性范围

#### 使用LLMs作为代码生成器的编程

英语成为了新的编程语言。在编码领域的LLMs(大型语言模型)前景特别吸引人。传统上,编码被视为一种专业技能,需要细致入微的注意力和广泛的培训。但随着LLMs的发展,软件开发的民主化潜力正在逐渐增长。我们正在见证一个长期愿景的实现,在这个愿景中,开发者不再需要逐行审查代码,而是可以向LLM提供高级指令,LLM随后生成所需的代码。这就像拥有一个能够轻松将人类意图转化为机器可读指令的流畅翻译者。我们已经在[*第9章*](B18949_09.xhtml#_idTextAnchor506)中看到了一个例子,其中LLM承担了多个专业角色,并为用户完成了一个编程项目。

这样的转变不仅会简化编码过程,还可能从根本上改变谁能够创建软件。非技术人士可以更直接地参与软件开发,弥合从想法生成到执行之间的差距。例如,初创公司可以迅速将他们的愿景转化为原型,加快创新周期,并促进更具包容性的技术生态系统。我们预计这将彻底改变几个商业领域,例如技术产品管理。当然,这并不意味着传统的编码技能会变得过时。相反,理解编程语言的复杂性始终有其价值,尤其是在需要精确和细微差别的工作中。然而,LLMs可以作为无价助手,捕捉错误,提出优化建议,甚至帮助处理日常和重复性任务。这种人类开发者和LLMs之间的协同作用可能会导致软件开发的黄金时代,其中创造力成为焦点,技术障碍降低。此外,随着LLMs在理解和生成代码方面变得更加熟练,我们可能会看到新型算法、框架和工具的开发增加。这些进步可能会受到机器在解决问题的独特视角的推动,以及它所训练的大量数据和模式的支持。

总结来说,LLMs在编码世界的未来充满了合作、包容性和创新的承诺。虽然无疑会面临挑战,但这对经验丰富的开发者和新进入该领域的人的好处是巨大的。

#### 使用LLMOps进行运营和维护

正如DevOps革命了软件开发一样,**LLM运营**(**LLMOps**)正成为LLM可扩展部署、监控和维护的关键。随着企业越来越依赖LLM,确保其平稳运行、持续学习和及时更新将变得至关重要。LLMOps可能会引入一些实践来简化这些流程,确保LLM保持高效和相关性。我们正在看到大量针对这一目标付出的努力,这些努力以付费工具和服务的形式出现。公司正在设计覆盖运营和监控全谱系的解决方案。在这一端,有提供LLM功能基本监控的工具,而在另一端,则有提供对输入数据、输出数据和模型特性的可视化和统计洞察的工具。

LLMOps领域的一个新趋势是从监控流到模型调整机制的反馈循环。这模仿了实时自适应模型的概念,例如卡尔曼滤波器,它负责将阿波罗11号送上月球。监控流识别出不断增长的偏差,然后将这些偏差反馈到训练机制中,调整模型的参数。通过这样做,不仅用户会收到模型变得次优时的警报,而且还会对模型进行适当的调整。

总结这篇评论,LLM的旅程,由深度学习(DL)的飞跃、创新的学习技术和定制能力所标记,触及了人类更广泛的抱负:创造能够理解和增强我们世界的机器。LLM的演变体现了这一追求,随着它们继续成熟,它们的目的、价值和影响无疑将塑造我们的数字未来的轮廓。

LLM设计的未来正处于技术创新、以用户为中心的设计和伦理考量的交汇点。随着研究的进展和用户需求的演变,明天的LLM可能会与我们今天想象的截然不同,功能更强大,集成度更高。

我们已经讨论了围绕LLM的各种技术趋势,这些趋势是其出现和增长的核心。现在,我们将触及更远离核心的趋势,这些趋势反映了这些模型产生的影响以及预期将产生的影响。

.自然语言处理和LLM的文化趋势

在本节中,我们将讨论LLM和AI对商业和社会产生的一些趋势和影响点。我们将触及一些我们认为最有可能繁荣的行业,因为LLM和AI带来的价值。我们将讨论公司内部正在发生的变化,因为它们寻求获得优势并保持领先。最后,我们将触及围绕LLM和AI的一些文化方面。

# 商业世界中的自然语言处理和LLM

NLP和LLMs正在证明自己在商业领域具有变革性。从提高效率到启用新的商业模式,NLP的能力已被利用来自动化日常任务、从数据中提取见解以及提供高级客户支持。

初始时,NLP主要局限于学术界和特定领域。然而,随着数字化的兴起、数据的爆炸式增长以及开源机器学习(ML)的进步,企业开始认识到其潜力。计算能力的可负担性和对大量数据集的访问使得LLMs在企业中的实施变得可行,从而允许更复杂的NLP应用。我们观察到,NLP向商业世界的转变发生在2018-2019年间。首先,NLP和传统ML模型结合用于有限任务(如文本分类)的目的,开始渗透到商业运营和分析中。2019年,Hugging Face发布了谷歌BERT的免费版本,这是其开创性的LM,我们已在之前的章节中讨论过(更多关于该模型的信息请参阅模型页面:[https://huggingface.co/bert-base-uncased](https://huggingface.co/bert-base-uncased))。BERT通过迁移学习的方式,在相对较少的标记数据的情况下实现了强大的分类能力,并迅速成为许多以文本为驱动的商业模型的首选模型。

一些行业继承了使其更有可能采用基于NLP的自动化并从中繁荣发展的特性。在评估NLP对某个行业或特定业务可能产生的潜在影响时,考虑以下这些特征:

+   **数据丰富**:该行业应能够访问大量数据,尤其是文本形式的数据,因为NLP主要处理理解和生成人类语言。

+   **数字化准备**:数据应数字化和结构化。已经拥有数字化文化的行业更容易利用AI和NLP。

+   **计算基础设施**:处理高计算工作负载的能力是必不可少的,无论是通过内部基础设施还是基于云的解决方案,因为NLP模型,尤其是LLMs,需要大量的计算能力。

+   **重复性任务**:在客户服务查询或文档审查等大量手动、重复性任务中进行的行业,可以从使用NLP的自动化中受益显著。

+   **依赖洞察力的决策**:如果决策通常基于从文本数据(例如,社交媒体的市场情绪)中得出的见解,那么NLP可以简化并增强决策过程。

+   **高客户互动**:直接与客户互动的行业,尤其是通过数字渠道,可以使用NLP进行聊天机器人、反馈分析和个性化营销。

+   **个性化需求**:如果需要根据用户偏好和反馈提供个性化服务或产品,自然语言处理(NLP)可以帮助定制满足个人需求的产品。

+   **持续学习和更新**:需要保持最新信息、研究或趋势的行业可以利用自然语言处理(NLP)进行自动内容聚合、摘要和分析。

+   **多语言互动**:在全球或多语言地区运营的行业可以从自然语言处理(NLP)驱动的翻译服务和多语言客户互动中受益。

+   **合规性和文档管理**:如果需要定期审查和遵守法规、标准或维护文档,自然语言处理(NLP)可以帮助进行自动合规检查和文档生成。

+   **管道扩展的灵活性**:由于自然语言处理(NLP)需要处理时间和计算资源,它只有在实时流程能够适应这些要求的情况下才能产生效益。

让我们探讨具体的商业领域,看看人工智能(AI)和大型语言模型(LLMs)是如何在各个领域产生影响的。

## 商业领域

医疗保健是一个高度依赖自由文本的行业。在医疗保健领域,任何与患者治疗互动的企业,无论是诊所、医院,甚至是保险公司,都有一个涉及自由文本的数据流。这可能包括医疗记录的转录、患者查询响应、药物相互作用以及其他信息来源。其中绝大多数都是数字化的,因此是机器可读的,这使得下游处理成为可能。这些流程可能包括从放射学报告中识别诊断、根据医生笔记对病人细节进行分类、基于患者报告发出潜在风险警报,以及许多其他用例。

在医疗保健领域,另一个正在出现的重大用例是患者从生成式AI工具(如ChatGPT)寻求医疗建议。由于大型语言模型(LLMs)可以访问海量数据,患者发现大型语言模型(LLMs)可能会对一个医疗问题提出答案。虽然潜力巨大,但风险同样巨大。

在接下来的几年里,我们预计在大型语言模型(LLMs)支持医疗保健需求方面的能力将取得重大改进。特别是在患者护理方面,我们将看到核心医疗能力的增强。不同层级的医疗建议、诊断和预后将分配不同比例的专业建议和AI建议。例如,纵观历史,我们看到患者自我诊断轻微疾病,如皮疹或疼痛,或从其他非专业人士那里寻求建议。此外,如今我们看到患者在网上文章和帖子中寻求建议。我们预计对于这些被视为低风险的相同条件,患者将采用大型语言模型(LLMs)寻求建议。至于官方政策,我们将看到临床系统制定指南,说明哪些案例将由AI处理以及到何种程度。

金融是一个高度依赖文本信息的广泛行业。从财务报告到收益电话会议,新闻流到监管更新,交易细节到信用报告,等等。金融部门被视为其他行业随着AI的兴起可能如何演变的先驱。其对数据处理的高度依赖使其成为AI的理想选择,并作为其他地方可能发生的事情的案例研究。

我们看到自然语言处理(NLP)和大型语言模型(LLMs)被应用于金融领域的各个角落。我们注意到的一个新趋势是为特定主题甚至个别公司构建专门的聊天机器人,因为它们寻求以交互式聊天机器人的形式向客户展示其专有服务。

我们对金融未来的总体预期是一个协作环境,其中AI驱动的模型与行业专家无缝协作。我们用来类比这一愿景的最佳历史例子是微软在Excel和金融分析师之间创造的协同效应。设想一个环境,其中传统的AI模型绘制出财务预测,其生成式对应物则深入数据,不仅突出差异,还基于多种预测模型提出战略选择。

电子商务是一个始终处于客户和技术交汇点的行业。电子商务领域的一个用例是个性化的购物体验。随着自然语言处理技术的日益复杂,电子商务平台可以预测新兴趋势,根据用户情绪提供实时个性化折扣,并增强交叉销售和升级销售策略。从产品搜索的角度来看,LLMs理解自然语言查询,使用户能够更有效地找到产品。

电子商务的未来格局预计将经历一次转型性转变。随着AI赋能的元宇宙购物时代的到来,虚拟领域正在扩展,结合了视觉AI、增强现实和虚拟现实技术。这将给消费者提供尝试产品的激动人心的机会,从服装到家具,提供尽可能接近现实的购物体验。此外,供应链管理的复杂性将继续通过AI驱动的预测分析得到解决,优化库存流程。AI承诺将成为塑造电子商务行业动态和高效未来的基石。

我们想要提到的倒数第二个行业是教育。在这里,我们也看到了个性化趋势。自然语言处理(NLP)允许建立适应个别学生需求的自适应学习平台,根据他们的学习节奏和风格提供资源和测验。由NLP驱动的平台可以分析学生的输入、论文和反馈,提供定制化的学习路径。另一个趋势是语言学习。大型语言模型(LLMs)提供实时翻译、纠正甚至文化背景,使语言学习更加沉浸式。

随着生成式人工智能工具的快速发展日益渗透教育领域,传统的教学和学习模式正准备发生重大变革。我们期待一个未来,在那里人工智能无缝地融入课堂,以前所未有的方式增强教学效果并个性化学习体验。同时,我们将看到个性化方面的进步,学生可以享受到一种最佳描述为计算机化私人辅导的学习体验。它将根据学生的节奏和感知调整教学内容和传达方式。对于当今出生的孩子来说,我们期望教育体验将是创新、无限且绝不无聊的。

娱乐和内容消费行业被赋予了最后但同样重要的位置。近年来,人工智能与媒体行业之间的相互关系变得日益明显。随着大型语言模型(LLMs)和人工智能技术的不断进步,媒体平台已经利用它们来优化内容创作、分发和消费。

音乐景观正在被重塑。深度学习模型(DL models)在从现有音乐模式中学习后生成独特的作品。例如,Spotify等平台通过机器学习驱动的推荐个性化播放列表,分析收听历史和偏好。传统上需要专业技能的音频母带制作过程现在结合了人工智能解决方案,如LANDR,使音乐制作民主化并加速了音乐制作过程。

电影制作者利用大型语言模型(LLMs)进行剧本创作,同时评估剧本中的潜在不确定性。华纳兄弟、二十世纪福克斯和索尼影业等公司展示了人工智能的预测能力,它们分别使用Cinelytic、Merlin和ScriptBook等平台。

人工智能通过模拟真实非玩家角色行为和动态生成内容来丰富游戏体验。它提供个性化的游戏推荐,根据玩家的偏好定制体验。自适应难度系统分析实时玩家行为,调整挑战以确保平衡的游戏体验。

在图书出版领域,人工智能简化了稿件提交流程,自动化筛选并预测市场潜力。人工智能驱动的工具通过确保清晰度、连贯性和遵循风格指南来加强编辑阶段。大型语言模型(LLMs)通过提供关于人物和情节结构的见解,帮助作者创作引人入胜的叙事。平台中的个性化算法根据用户的口味定制内容推荐,增强用户参与度。例如,Google AdSense这样的平台利用人工智能精确地定位在线广告,优化营销活动的覆盖范围。人工智能还扮演着监管角色,根据用户人口统计数据过滤内容,并确保符合广播指南。最后,流媒体平台利用人工智能进行内容分类,为用户提供无缝的内容发现体验。

这些在娱乐行业中人工智能和LLMs的超级创新应用将不断增长并塑造它们所触及的创造。创作过程将变得更短、更快。越来越频繁的问题是,由计算机模型编排的艺术创作是否会削弱其魅力。

接下来,我们将从商业领域退一步,讨论一个在所有面向客户的商业中普遍存在的特定用例。

## 客户互动与服务 - 早期采用者

自然语言处理(NLP)在商业中最明显的影响之一是在客户互动方面。LLMs使聊天机器人能够做出响应,协助情感分析,并提供实时解决方案,从而提升用户体验。早期的聊天机器人是基于规则的,只能处理有限的查询。有了LLMs,聊天机器人能够理解上下文,处理复杂的查询,甚至参与轻松的对话。这种进步导致了客户满意度的提高,减少了等待时间,并为企业节省了大量的成本。

在接下来的几年里,我们可以期待继续看到人工智能和LLMs在广泛的客户服务应用中使用,包括聊天机器人、推荐系统、主动客户参与系统和客户服务分析系统。这些由人工智能和LLMs驱动的应用将为企业和客户带来多方面的好处。我们将看到聊天机器人变得更加全面,以至于能够处理目前需要人工代理介入的那些案例。推荐系统将进一步个性化,并捕捉个别客户的兴趣,并吸收目前只有一小部分人口才能享有的个人人类助手。从宏观层面来看,客户服务分析系统将用于分析客户数据,并识别可用于改进客户服务运营的趋势和模式。

总体而言,人工智能和大型语言模型在客户服务领域的潜力非常巨大。这些技术正处于准备改变商业客户互动的状态,提供更加定制化、预见性和沉浸式的服务体验。

在探讨了人工智能和大型语言模型在客户服务中的变革性作用之后,现在让我们转向另一个关键维度:组织结构。随着公司为人工智能时代做准备,了解它们如何重塑内部框架以整合这些技术进步至关重要。

## 由人工智能影响驱动的变革管理

随着人工智能,尤其是大型语言模型的能力的飞速发展,全球的企业都在感受到其连锁反应。为了保持竞争力并充分利用这些技术奇迹的潜力,许多组织正在经历其内部结构和运营的转型性转变。这些变化从重新构想工作流程动态到引入如首席人工智能官等关键角色。我们现在将探讨人工智能的深远影响如何重塑当代商业范式的基础。

### 内部商业结构和运营的转变

除了外部客户互动之外,大型语言模型对企业的内部运营产生了深远的影响。从自动化电子邮件到处理人力资源查询,自然语言处理简化了运营。最初,企业使用简单的自动化工具来处理重复性任务。随着大型语言模型的出现,可自动化任务的范畴得到了扩展。无论是起草报告、分析员工反馈还是预测市场趋势,自然语言处理都发挥着关键作用。

我们在组织景观中看到的一个特定转变是技术栈结构。传统上,一家公司的技术栈可以被视为一个层次蛋糕,每一层都有其独特的角色:

+   **决策层**,它推动公司的业务

+   **数据层**作为骨架,包括以下内容:

    +   数据存储库和存储

    +   运营数据

    +   数据摄取和分发服务

+   **核心交易层**将基础设施层的数据映射到数据层

+   **基础设施层**和**基础层**提供可能存在于本地或云端的计算资源和能力

随着人工智能的发展,新的层次和组件正在被引入,重塑了技术栈:

+   一个经过修订的决策层正在演变,并将由利用人工智能处理多模态内容的应用程序组成,例如以下内容:

    +   文本和请求

    +   视觉

    +   音频

    +   代码

+   栈中的新层,即AI层,包括以下内容:

    +   **人工智能产品**:这些是基于人工智能构建的工具和平台,可以是面向内部或外部的

    +   **可观测性和监控**:这确保了人工智能的道德和正确使用,以及性能控制

+   **修订后的数据层**:由于数据仍然处于核心地位,它将包括满足上述基于人工智能要求的更新组件

让我们回顾这些新增功能。

#### 深入探讨人工智能驱动的技术栈

这些变化是人工智能驱动的快速创新的结果。例如,多模态能力正在出现并使我们能够处理文本、图像、视频、音频和音乐以及代码等信号。此外,人工智能产品,如聊天机器人、推荐系统和预测分析工具,正成为企业不可或缺的组成部分。

修订后的决策层现在由人工智能应用驱动。与传统的软件不同,人工智能应用具有“思考”和“学习”的能力。它们以曾经被认为不可能的方式处理多媒体内容,如图像、视频和音乐。例如,通过图像识别,人们可以在照片中识别和分类对象,而视频分析可以实时分析实时视频中的模式和异常。更有趣的是,一些应用程序能够生成新的音乐作品或艺术品,弥合了技术与艺术之间的差距。

下一个新层是人工智能层。其关键组件是人工智能产品。当我们谈论人工智能产品时,我们指的是建立在人工智能基础之上的各种工具和平台。这些从提供实时客户支持的聊天机器人到个性化电子商务平台用户体验的推荐系统不等。预测分析作为人工智能产品的另一个支柱,允许企业预测趋势并做出明智的决策。这些产品共同代表了一种从被动到主动的商业策略范式转变,确保企业始终领先一步。

可观测性和监控通过降低风险和实施质量控制来补充上述新增功能。尽管人工智能非常强大,但它也带来了伦理和运营上的挑战。人工智能的护栏可以通过确保人工智能在定义的伦理边界内运行,促进公平、透明和隐私来解决这些担忧。例如,一个人工智能护栏可能阻止算法基于有偏见的数据进行决策,或者它可以为人工智能系统做出的决策提供解释。在技术信任至关重要的时代,这些护栏对于确保人工智能不仅聪明,而且负责任至关重要。与此同时,对数据和模型输出的传统生产监控也被应用于确保一致性和质量。

总结我们对技术栈转变的讨论,我们预计人工智能将不仅仅是一个技术推动的趋势,而更是一个推动新技术趋势的推动者。因此,我们预计数据和技术的范式将发生变化,并将人工智能置于中心。我们相信那些适应并进化其技术栈以利用这些新能力的企业将更好地定位在新的数字时代取得成功。

当我们回顾现代组织不断演变和重塑的过程时,让我们回顾一下企业界的一个特定新增职位:首席人工智能官。这是一个强调人工智能在现代企业领域至关重要的职位。

#### 首席人工智能官的兴起

随着人工智能预计将对商业产生影响,它也将重塑商业。在前一节中,我们详细阐述了我们对将改变并给纯人工智能组件留下空间的常见组织技术堆栈的预期。遵循类似的路径,领导结构也预计将发生变化,为新角色腾出空间:**首席人工智能官**(**CAIO**)。本节将深入探讨CAIO的角色、职责以及他们为组织带来的独特价值。

#### 为什么公司需要一个首席人工智能官

人工智能不再是遥远的技术奇迹;它现在与我们的日常生活紧密相连。随着OpenAI的ChatGPT和谷歌的Bard等生成工具的创建,人工智能的能力现在对所有性质的企业都是可访问的。人工智能的变革潜力从创造创新服务、提高运营效率到彻底改变整个行业。

考虑到人工智能的深远影响,将其融入核心商业战略是至关重要的。首席人工智能官(CAIO)的必要性源于将人工智能嵌入战略决策的重要性,确保公司能够充分利用它带来的机遇。

#### 首席人工智能官的核心职责和特质

首席人工智能官的核心职责是引导组织的AI战略,使其与整体商业目标保持一致。这包括以下内容:

+   **战略人工智能愿景**:领导创建一个人工智能愿景,它不仅融入组织的运营,而且识别关键领域,如客户体验或供应链改进,人工智能可以推动变革性变革。这个愿景必须与组织的更广泛目标无缝对接。

+   **机会识别**:精准定位并利用将人工智能整合到现有流程中的机会,发现由人工智能驱动的创新商业方向,并确定哪些工作流程适合自动化。

+   **实施人工智能战略**:在构思之外,通过促进跨部门合作,确保人工智能愿景的实际执行。这包括确保与人工智能的角色、潜力以及有效扩展其部署的手段保持一致。

+   **人才和资源管理**:确保组织拥有部署和管理人工智能项目所需的能力、人员和资源。

+   **推广人工智能理解**:作为组织的主要人工智能教育者和倡导者,消除误解,并在所有组织层级培养对人工智能益处和细微差别的深入理解。

+   **培养以AI为先的文化**:倡导以人工智能为中心的创新文化,鼓励持续探索和应用尖端人工智能研究、工具和实践。

+   **在人工智能演变中保持领先**:在快速发展的AI领域,积极吸收最新的研究、工具和实践。确保组织在人工智能创新的前沿,以保持竞争优势。

+   **参与利益相关者**:定期与多样化的组织利益相关者沟通,确保一致,解决担忧,并强调人工智能倡议的切实优势。

+   **道德人工智能使用的守护者**:保护组织免受潜在的人工智能陷阱,确保人工智能实践符合用户期望,从而赢得客户和利益相关者的信任。

+   **道德监督和合规性**:在人工智能部署方面,作为组织的护栏。确保人工智能解决方案符合道德标准,尊重用户隐私,无偏见,并遵守不断变化的科技法规。

技术敏锐度和软技能的平衡至关重要,CAIO应熟练掌握人工智能工具和基础设施,并在沟通、团队合作、问题解决和时间管理方面表现出色。

他们必须熟悉人工智能的商业影响,了解其当前格局,并预测未来的发展。他们必须对特定人工智能技术可能对其行业产生的后果保持警觉。

在人工智能的道德考量至关重要的时代,CAIO必须成为道德支柱,应对与偏见、隐私和社会影响相关的挑战。预期公司合规团队和法律团队之间将形成直接而流畅的沟通渠道,以帮助识别和预测CAIO可能涉足的敏感领域。

总结来说,随着企业越来越多地将人工智能融入其运营结构,首席人工智能官(CAIO)的角色变得不可或缺;他们作为引路人,为组织照亮了利用人工智能全部潜力、道德和有效性的道路。随着人工智能在商业领域的意义日益增强,CAIO正准备成为现代C级管理层的一个基石。

尽管人工智能和大型语言模型无疑正在改变商业格局,但它们的影响范围远超企业领域。在我们过渡到下一节时,我们将探讨这些技术带来的深刻社会和行为影响,影响我们社会的本质。

# 由人工智能和大型语言模型引发的行为趋势——社会方面

人工智能(AI)的普及,尤其是像LLMs这样的高级模型,对社交行为产生了深远的影响。这种影响从日常任务到更广泛的沟通趋势都有所体现。随着AI融入日常生活,它塑造了行为,引入了新的规范,并偶尔引发担忧。在这里,我们将深入探讨这些行为变化。

## 个人助理变得不可或缺

随着Siri、Alexa和Google Assistant等AI驱动的虚拟助手的增加,人们越来越依赖这些工具来完成日常任务。无论是安排约会、查看天气还是控制智能家居设备,AI助手正成为许多人的首选,改变了我们与技术互动的方式,有时甚至导致我们将这些工具拟人化。

在未来,我们将看到AI个人助理成为我们生活中完全沉浸式且不可分割的一部分。我们将它类比为数字日历在我们生活中的狭窄和有限角色。通过允许我们高效地安排和调度事件,保持日历确保我们履行承诺,并在个人和职业活动中保持平衡。此外,自动提醒和跨设备同步减轻了记住每个约会的压力,让我们能够安心地专注于更紧迫的事情。无论是AI驱动的还是人工的,个人助理都将事情提升到下一个层次。它与其他个人同步,优先排序,提供建议,收集信息,并执行其他日常任务。直到最近,只有人工助手能够以高信心完成这项功能。我们很快将看到自动化模型以低成本和少量监管来完成这项工作。如果你戴处方眼镜,你就知道我们与个人AI助手的关系将是什么样的,而且更重要的是,如果你失去了访问它,会是什么样子。

## 沟通便利和跨越语言障碍

大型语言模型(LLMs)已经改进了我们的沟通方式,尤其是在书面内容方面。人们使用它们进行语法检查、内容建议,甚至生成整个文本。这可能导致沟通更加精致,但也引发了关于真实性的问题。

由AI驱动的实时翻译工具正在改变我们跨文化交流的方式。像Google Translate这样的平台使得个人能够无缝互动,促进全球联系。然而,对这些工具的过度依赖可能会减少某些人学习新语言的动力。

在不久的将来,随着高级LLM和AI创新的融合,沟通的边界预计将进一步扩大。我们很快将看到实现这一愿景,即两个人进行通话,每个人说不同的母语,并且可以无缝地进行对话,AI无形中并即时地将他们的 spoken words 翻译。这意味着,当一个人用普通话说话时,他们的对方可能会实时听到西班牙语,延迟最小化。这样的进步可以有效地消除语言障碍,实现真正全球的人际连通性。

此外,沟通的领域并不仅限于口头语言。前沿研究正在深入探索将神经信号直接转换为语音的可能性。神经传感器将检测并解释大脑活动,使个体能够在不移动嘴唇的情况下“说话”。这可能会是一项突破性的进步,特别是对于那些有言语障碍或沟通障碍的人来说,以他们从未体验过的方式给予他们声音。

除了这些能力之外,沟通的触觉维度也可能看到创新。我们预计将出现可穿戴设备,使人们能够“感受”信息,将词语或情感转化为特定的触觉感觉。这将开辟新的理解渠道,特别是对于视觉或听觉受损的人。

AR与AI的结合将重新定义我们对“存在”的概念。当Meta的元宇宙还在努力巩固其地位时,通过虚拟存在进行互动的观念将出现并受到需求。你将能够将你的虚拟形象投射到遥远的位置,与他人进行交流,就像你真的在那里一样。面部表情、肢体语言和手势的细微差别将被捕捉并传达,为远程对话增添深度。

## 委托决策的伦理影响

随着人们对AI推荐的适应,从购物到阅读,存在过度委托决策的风险。这可能导致批判性思维减少,使个体更容易受到算法偏见或操纵的影响。

随着我们进一步进入AI驱动的时代,个人对自动化系统过度信任的可能性越来越大,这可能导致个人责任和能动性的侵蚀。随着更多决策的自动化,社会可能会看到个人在没有算法输入的情况下做出知情判断的能力下降。此外,随着行业越来越多地依赖AI做出关键决策,这些算法的透明度和理解将变得至关重要,以防止无意中的系统性偏差。AI持续或甚至放大现有社会偏差的可能性——无论是通过数据还是设计——提出了深刻的伦理影响。作为回应,我们预计对AI伦理课程、透明算法框架和监管监督的需求将激增,以确保AI系统与人类价值观和社会规范保持一致。

总结我们对这些各种社会趋势的回顾,AI和LLMs正在以多方面的方式重塑社会景观。虽然它们带来了便利和新的体验,但也提出了社会必须应对的挑战。在AI在日常生活中作用的持续演变中,平衡利益与潜在的风险将至关重要。

现在,我们将重点转向AI的两大方面,这些方面可能对每个寻求使用AI的个人和实体都越来越感兴趣,即伦理和风险。

## 伦理与风险 - 对AI实施日益增长的担忧

在整本书中,我们讨论了关于AI的一般性和LLMs的各个方面。我们简要地提到了不同新兴的担忧,在本节中,我们将重点关注两个最大的讨论主题:伦理和风险。

AI,尤其是LLMs的整合,给我们的生活带来了前所未有的便利和潜力。然而,随着这些进步的到来,一系列不断演变的伦理担忧和风险从个人层面扩展到社会层面。随着这些技术的成熟,理解和应对这些领域变得至关重要。

AI伦理指的是指导AI设计、部署和使用的道德原则。它围绕确保AI系统中的公平性、透明度、隐私和问责制展开。早期的AI应用较为基础,因此引发的伦理困境较少。随着AI的复杂性增加,其决策的后果也随之增加,将伦理问题推到了前沿。LLMs的出现,凭借其生成类似人类文本的能力,进一步加剧了这些担忧。

关键的伦理担忧如下;

+   **偏差与公平性**:AI模型可能会无意中学习到训练数据中存在的偏差。这可能导致歧视性输出,对个人或整个群体产生不利影响。

+   **透明度和可解释性**:随着AI模型变得复杂,其决策过程变得不那么透明。某些模型的“黑盒”性质在问责制方面提出了挑战。

+   **隐私**:人工智能处理大量数据的能力引发了关于数据隐私和滥用的担忧。这延伸到可能无意中生成揭示敏感信息的输出的LLMs。

+   **依赖与自主性**:过度依赖人工智能可能会侵蚀人类的自主性。例如,盲目跟随人工智能推荐而不进行批判性评估可能会造成问题,甚至损害道德方面。

关键风险如下:

+   **安全**:人工智能系统可能成为对抗性攻击的目标,恶意行为者提供欺骗性输入以获取期望的输出。

+   **幻觉与虚假信息**:LLMs可以生成令人信服但虚假的信息,放大虚假信息的传播。

+   **社会经济**:过度自动化可能导致各种下游后果,例如某些行业的就业岗位流失,影响经济稳定。

随着人工智能的快速发展,这些担忧正在迅速增长。虽然快速进步标志着进步和新可能性,但也给政策制定者和伦理学家带来了挑战。随着人工智能系统变得更加复杂和强大,它们往往超过了道德指南和监管措施的发展。这意味着,当我们利用最新的AI突破时,我们可能正在进入没有道德指南或安全网的不熟悉领域。人工智能进化的敏捷性也给企业和政府带来了挑战。他们必须不断适应,以确保他们的实践、法规和标准与最新发展保持一致。

另一个看待这些担忧的角度是社会规模。一端是个体层面,其中担忧围绕隐私、数据滥用和个人偏见。个人发现自己难以区分人工智能生成内容和人类生成内容。我们一直在见证的一个日益严重的问题是虚假信息的传播,无论是故意的还是偶然的。这种现象威胁到个人对选举官员、法律程序和社会其他支柱的信心。

在公司层面,组织面临确保其人工智能系统公平、透明并符合法规的挑战。他们还可能因偏见或有问题的AI输出而遭受声誉损害。

在宏观层面,社会必须解决人工智能的更广泛影响,从自动化导致的潜在失业到人工智能歧视性决策可能引发的社会分裂。

#### 未来展望——道德、法规、意识和创新的结合。

当我们站在一个时代的前沿,人工智能的影响几乎渗透到我们生活的方方面面,几个关键趋势塑造了我们的共同未来。首先,对人工智能开发和部署中的伦理指南和框架的呼声从未如此强烈。在认识到在这个数字时代人类福祉的首要重要性时,围绕创建优先考虑和保护人类利益的AI系统的势头正在显著增强。这不仅仅是对合规或经济考量的简单遵守;这是确保未来的AI系统与我们的共同人类价值观产生共鸣,并为更大的善作出贡献。

与对伦理的强调并行,各国政府和全球实体正在为更直接的方法做准备。对人工智能采取自由放任或袖手旁观态度的时代正在消退。相反,人们期待着有力的法规,这些法规不仅能够跟上人工智能的进步,还能确保其负责任和公平的使用。这样的法规可能会涵盖一系列关注点,从数据隐私和安全到透明度和公平性,从而确保公司和个人都遵守一套全球公认的最佳实践。

2023年,OpenAI的首席执行官山姆·奥特曼在美国国会面前分享了他对监管不断扩大的AI领域的看法。他强调了谨慎的重要性,指出人类历史上如此有影响力的转变需要适当的保障措施,以确保其负责任和有益的实施。奥特曼的论点核心是他的信念,即AI模型的力量将很快超过我们的最初预期,使它们成为无价之工具和前所未有的挑战的潜在来源。他热情地倡导政府采取积极的监管干预,断言这些措施对于解决和减轻这些日益复杂的模型相关的风险至关重要。

哥伦比亚大学名誉教授加里·马库斯提出了另一个观点,建议建立一个更稳健的监管机制。他提议建立一个专门负责审查人工智能项目的新的联邦机构。该机构的作用是在这些项目公开之前对其进行审查,确保它们的安全性、伦理考虑和有效性。马库斯关注到人工智能的快速演变,警告说,未来还会有更多未预见的进步,他比喻说:“还有更多的精灵将从更多的瓶子中释放出来。”

我们期待看到以护栏形式出现的主要行动,无论是市政还是组织治理,将决定要执行和维护的界限,这还有待观察。这将解决敏感领域,例如使用大型语言模型(LLMs)处理与医疗相关的事务、财务决策、未成年人使用以及其他需要高度责任感的事项。特别是,我们期待关于允许用于训练模型的数据以及何种情况下可以使用这些数据的明确性。

然而,尽管法规和伦理框架至关重要,但它们只是方程的一部分。最终用户——公众——在塑造人工智能轨迹方面发挥着关键作用。随着人工智能技术成为日常生活的一部分,从智能家居到个性化医疗保健,围绕其伦理考量和相关风险的公共讨论变得迫切需要。这种对话将培养一个更加知情和有能力的用户群体,能够对所使用的AI工具做出明智的选择。教育运动、研讨会和公共辩论可能会激增,创造一个每个人不仅是被动消费者,而且是知情利益相关者的环境。

最后,技术前沿将见证某种形式的复兴。那些只关注创建最强大或最高效人工智能模型的年代已经过去了。研究人员和开发者现在越来越多地将他们的努力投入到创建本质上更加透明、公平且对潜在威胁具有抵抗力的AI系统中。愿景是清晰的:AI模型不仅在其任务上表现出色,而且是以一种可理解、公平且不受恶意攻击的方式做到这一点。

从本质上讲,人工智能的未来不仅仅是关于技术奇迹;它是将创新与责任、力量与透明度、进步与道德相结合。随着我们迈向这个未来,这些趋势的交汇预示着一个世界,其中人工智能丰富了生活,维护了价值观,并为社会的共同福祉服务。

总结来说,人工智能、伦理和风险之间的关系是多方面的。虽然人工智能,尤其是大型语言模型(LLMs)具有巨大的潜力,但认识到并解决随之而来的伦理困境和风险至关重要。只有通过平衡的方法,我们才能利用人工智能的好处,同时保护个人和社会的利益。

# 总结

在本章中,我们开始了一次全面之旅,探索塑造人工智能世界的关键趋势,特别强调大型语言模型(LLMs)。这些模型的核心是计算能力,它作为驱动引擎,推动突破并放大其潜力。随着计算能力的进步,我们不仅进展得更快,而且解锁了新的效率,重新定义了可能性的领域。

与这种计算能力相辅相成的是庞大的数据集,在自然语言处理(NLP)和大型语言模型(LLM)上留下了不可磨灭的印记。我们在本章中探讨了它们的重要性,并了解到它们发挥着关键作用。展望未来,NLP 中数据可用性的未来将是一个动态的领域,不断演变以应对这些挑战。

LLMs 本身已经经历了显著的演变;每一次迭代都旨在实现更大的规模和更强的能力。我们回顾了这些模型所具有的影响,并了解到它们无疑已经改变了各种领域,从商业到社交互动,为尚未到来的创新铺平了道路。

自然语言处理(NLP)和大型语言模型(LLM)的文化足迹在商业世界中显而易见,正在重塑客户互动、重新定义内部商业结构,甚至导致出现如首席人工智能官(CAIO)等专门角色的出现。这些进步虽然令人印象深刻,但也预示着一个新的行为转变时代。从日常任务到高级商业决策,AI 对社会结构的影响是深远的。

然而,与这些进步交织在一起的是对 AI 伦理实施及其相关风险的日益增长的担忧。AI 进步的快速步伐、决策过程的透明度以及数据滥用的可能性,都强调了制定伦理准则、制定强有力的法规和增强公众意识紧迫性的必要性。最后,随着 AI 继续其不懈的前进步伐,我们必须既对其潜力充满热情,又对其挑战保持谨慎,确保技术以最负责任和最有益的方式服务于人类。




# 第十一章:顶级专家独家行业洞察:来自世界级专家的观点和预测

随着本书的旅程展开,探索自然语言处理(**NLP**)和大型语言模型(**LLMs**)的广阔领域,我们来到了一个关键的转折点[*第11章*](B18949_11.xhtml#_idTextAnchor551)。本章不仅是对之前主题和讨论的总结,也是通往NLP和LLMs领域未开发潜力以及即将到来的挑战的桥梁。通过各章节,我们的努力是描绘NLP从基础概念到LLMs建筑奇迹的演变,剖析机器学习(**ML**)策略、数据预处理、模型训练以及改变行业和社会互动的实用应用的复杂性。

本章的动机源于对NLP和LLM技术发展速度的敏锐认识以及它们对我们数字社会结构的多方面影响的深刻认识。在探索这些高级模型及其引发的趋势的复杂性时,从创新、研究和道德思考的前沿寻求指导至关重要。与来自不同领域的专家——法律、研究和高管——的对话,为我们理解LLMs如何与专业实践的各个方面相交以及未来可能的发展轨迹提供了灯塔。

本文讨论的主题反映了本书更广泛的主题,但更深入地探讨了LLMs带来的具体挑战和机遇。从减轻数据集中的偏差到将开放研究与隐私相协调,从人工智能(**AI**)带来的组织结构调整到LLMs内部学习范式的演变,每一次讨论都是洞察的拼贴,描绘了当前状态和未来的全面图景。

在本章中,我们将涵盖以下内容:

+   我们专家概述

+   我们的问题和专家的回答

# 我们专家概述

让我们先逐一介绍每位专家。

# Nitzan Mekel-Bobrov, 博士

Nitzan Mekel-Bobrov是eBay的**首席人工智能官**(**CAIO**),负责公司范围内的人工智能和技术创新战略。作为一名训练有素的研发科学家,Nitzan在其职业生涯中致力于开发机器智能系统,这些系统直接集成到关键任务产品中。他领导了多个行业的企业AI组织,包括医疗保健、金融服务和电子商务,Nitzan是实时AI规模化交付转型影响的思想领袖,改变公司的商业模式和核心价值主张,使其客户受益。Nitzan在芝加哥大学获得了博士学位,目前作为eBay纽约市的总经理居住在纽约市。

# David Sontag, 博士

David Sontag是麻省理工学院电气工程和计算机科学系的教授,同时是医学工程与科学研究所和计算机科学及人工智能实验室的一部分。他的研究专注于推进机器学习和人工智能,并利用这些技术来改变医疗保健。此前,他在纽约大学担任计算机科学和数据科学助理教授,是**计算机智能、学习、视觉和机器人**(**CILVR**)实验室的一部分。他还是Layer Health的联合创始人和首席执行官。

# John D. Halamka,医学博士,理学硕士

John D. Halamka,医学博士,理学硕士,Mayo Clinic平台的总裁,在2023年领导了一项影响4500万人的变革性数字健康倡议。他在医疗信息策略和急诊医学方面拥有超过40年的经验,他的工作包括在Beth Israel Deaconess医疗中心(**BIDMC**)服务,从乔治·W·布什到巴拉克·奥巴马的政府顾问,以及作为哈佛医学院教授的教学。作为斯坦福大学、UCSF和UC伯克利大学的校友,Halamka还是Mayo Clinic医学院和科学学院的急诊医学教授。他著有15本书和数百篇文章,并于2020年当选为国家医学院院士。

# Xavier Amatriain,博士

Xavier Amatriain最近是LinkedIn的AI产品策略副总裁,在那里他领导了从平台和基础设施到产品功能的公司级生成式AI工作。他还是Curai Health的董事会成员,这是一家医疗/人工智能初创公司,他共同创立并担任CTO至2022年。在此之前,他领导了Quora的工程团队,并在Netflix担任研究/工程总监,在那里他创立并领导了构建著名的Netflix推荐算法的算法团队。Xavier在学术界和工业界都以研究者的身份开始了他的职业生涯。他拥有超过100篇研究论文(以及6,000次引用),以他在人工智能和机器学习领域,尤其是推荐系统方面的工作而闻名。

# Melanie Garson,博士

Dr. Melanie Garson,Tony Blair研究所的网络安全政策与技术地缘政治负责人,深入研究网络安全政策、地缘政治AI、计算和互联网、科技公司作为地缘政治行为者的崛起、数据治理,以及颠覆性技术、外交政策、国防和外交的交汇点。在伦敦大学学院,她是副教授,教授新兴技术对冲突、谈判和技术外交的影响。Melanie是BBC和CNN等国际论坛和媒体的常客演讲者,她的背景包括在Freshfields Bruckhaus Deringer担任认证调解人和律师。她拥有伦敦大学学院的博士学位和弗莱彻法律与外交学院的硕士学位。

# 我们的问题和专家的回答

我们有机会向这些经验丰富的每个人请教,了解他们的职业生涯如何与AI和LLMs交叉并利用。我们为每个人量身定制了问题,以便他们通过他们的洞察力和观点来教导我们。我们发现这些讨论很有价值,因为它们揭示了常见的话题,对于阅读这本书的任何人来说都将是宝贵的。让我们直接进入正题。

## Nitzan Mekel-Bobrov

Nitzan带来了CAIO的视角,因为他和Ebay正在遇到AI和LLMs所能提供的巨大潜力。他分享了许多CAIO必须解决和决定的问题。

让我们与Nitzan Mekel-Bobrov一起探讨问题和答案。

## Q1.1 – LLM的未来 – 混合学习范式:鉴于学习方案的演变,您认为在LLMs中结合不同学习范式的下一个突破是什么?

在思考在LLMs(大型语言模型)中结合不同学习范式可能出现的下一个突破时,我可以阐述以下想法:

+   **过渡到大型基础模型(LFMs)**:学习范式演变中的下一个明显步骤是向完全多模态模型或LFMs的过渡。这些模型同时整合和处理多种形式的数据(例如,文本、图像、音频),提供更全面的理解并生成更具情境丰富性的响应。这一过渡预计将先于当前模型底层架构的任何重大变化。

+   **可扩展性和模型尺寸优化**:部署LLMs的主要挑战之一是可扩展性。未来的发展可能会集中在创建在尺寸上显著较小的同时保持高性能的模型。这涉及到减少超参数的数量并优化模型以更有效地使用较少的计算资源。

+   **实时模型分类**:实时选择最适合每个特定提示的最佳模型预计将成为一个重要的改进领域。这涉及到优化给定的约束条件,如计算资源、响应时间或性能。它允许根据手头的任务动态选择最合适的模型,而不是仅仅依赖于可用的最大模型。

+   **通过多个LLMs减轻幻觉**:一个模型越通用,生成幻觉(不准确或虚构的信息)的风险就越高。缓解这一问题的有前景的方法是使用多个LLMs,同时使用几个LLMs来检查彼此的答案以验证响应。这不仅提高了准确性,还利用了各种模型之间的协同作用,每个模型都扮演着专业化的角色。

+   **模仿人类能力以实现广泛用途**:为了使大型语言模型(LLMs)具有广泛的应用价值,它们需要更接近地模仿人类智能。这不仅包括生成准确的信息,还包括以更具有情境性和细微差别的方式进行推理,而不仅仅是二元真/假输出。向能够理解和解释类似于人类思维过程的复杂、模糊逻辑的模型演变是未来突破的关键领域。

这些想法指向一个未来,其中人工智能模型不仅更高效和可扩展,而且显著更智能,能够进行细微的理解和推理。对多模态、可扩展性、实时优化和增强推理能力的强调突出了人工智能发展向更全面、类似人类智能和实用性的方向。

### Q1.2 – 在同时使用多个LLMs的背景下,我们如何优化这些“专家”模型之间的协同作用,以实现更精细和全面的输出?

使用多个LLMs的概念可以超越验证和减少幻觉的范畴。一个更广泛的想法,有时被称为K-LLMs,可以利用多个LLMs来回答问题或创建复杂的解决方案。正如之前讨论的那样,其中一个方案是每个模型检查其他模型的答案以验证响应。另一种可能的方法是分配给它们各自的角色,每个角色都有其特定的专业领域(例如,产品经理、设计师、前端工程师、后端工程师和QA工程师),并且它们在解决方案上迭代,形成一个专家团队。这也可以允许使用更小、更专业的LLMs,因此训练成本更低,处理速度更快,计算需求更小。

## Q2.1 – 随着首席人工智能官在企业管理层中的重要性日益增强,你预见在弥合人工智能潜力与实际商业应用之间的差距时有哪些独特的挑战,以及首席人工智能官的角色应该如何演变以应对这些挑战?

作为首席人工智能官,我的角色包括在我们组织内部各个领域导航人工智能的广泛影响。以下是我关注的几个最重要的领域:

+   **人工智能影响的广度**:人工智能在大型企业内部各个领域的广泛影响需要首席人工智能官(CAIO)对后台和前台需求都有深入的理解。这要求公司在整个范围内广泛参与,以识别和优先考虑人工智能变革性影响的机会。

+   **努力和优先级**:由于无法参与大型企业的每个方面,这个角色需要大量的努力来进行优先级排序。这包括在有限的数据下做出决策,确定最大的投资回报在哪里,借鉴其他公司的经验,并了解内部运营以评估人工智能可以产生重大影响的领域。

+   **快速产生影响的压力**:存在明显的压力迅速产生可衡量的结果,同时应对现有的技术、流程和人员限制。在不彻底改变现有流程的情况下将人工智能创新整合到当前生态系统中是一个巨大的挑战。

### Q2.2 – 作为关于CAIO角色的问题的延续,你能告诉我监管方面的内容以及CAIO的角色如何与之相遇吗?

在监管方面,我花费了大量时间与我们的法律团队、合规官员和信息安全人员进行讨论。人工智能监管的领域在很大程度上是未知的,这意味着在先例很少的情况下制定指南和护栏。理想情况下,我寻求明确的“可以”和“不可以”的指导,但通常,这是一个定义这些指南的协作努力。这次持续的对话侧重于管理风险、保护我们的客户和推进创新,同时最大限度地减少我们的风险敞口。

我们已经成立了一个负责人工智能的办公室,负责定义人工智能应用的适当商业环境。这项工作的大部分内容涉及在仅仅法律合规性之外的伦理考量,尤其是由于法规往往针对高风险领域。然而,典型的公司运营中有大约90%不属于这些高风险类别,使我们处于监管灰色地带。在这里,伦理判断变得至关重要。虽然我支持新兴的全球法规,但我认识到它们提供了一个框架而不是完整的解决方案。这些法规主要关注高风险领域,仍然需要在我们日常运营中进行细微的应用。

从本质上讲,作为CAIO的角色要求我采取一种灵活的方法,平衡技术专长、伦理前瞻性和战略规划。这是关于负责任地利用人工智能的潜力,并有效地在业务中应用人工智能的广泛适用性和人工智能伦理与法规不断变化的格局中导航。

## Q3 – 基础模型和主要科技公司向开源的策略如何影响数据所有权及其对企业的价值?

作为首席人工智能官,我发现自己经常在思考我们当前以人工智能驱动的商业范式下,专有数据所有权的重要性如何变化。一方面,基础模型正在民主化人工智能,显著降低了缺乏大量专有数据集的公司进入门槛。这些模型提供的性能似乎与在专用、专有数据上训练的一样强大。这一趋势可能表明,拥有独特数据集的价值可能正在下降,因为强大的AI能力正在被更广泛的实体所获取,而这些实体没有大量的数据资产。

然而,这个领域是微妙的。我们正在见证微调和其他预训练技术的兴起,这些技术将这些通用模型定制到特定需求,微妙地重新确立了独特数据的重要性。这种定制能力暗示着数据所有权可能会演变而不是减少其相关性,成为新的竞争优势或进入障碍。

此外,像Meta这样的主要公司向开源其AI解决方案的战略转变并非纯粹利他,而是旨在颠覆现状,挑战微软和谷歌等巨头的统治地位。这一向开源的转变正在重塑行业,迫使这些巨头在其模型周围增加更全面、面向企业的生态系统。最终的价值主张不再是模型本身,而是整个包——支持它们的生态系统,使其对企业应用具有吸引力。

在此背景下,监管者的角色以及不同国家在数据隐私和共享方面的立场差异开始发挥作用,可能将市场引向各种方向。这创造了一个复杂的环境,企业必须在这个环境中不仅应对技术进步,还要应对可能影响数据所有权战略价值的监管格局。

总结来说,虽然通过基础模型和开源倡议实现人工智能的民主化挑战了传统的数据所有权观念,但它同时也开辟了新的竞争差异化途径。企业必须保持敏捷,根据这些发展重新评估他们的数据策略,以有效地利用人工智能,同时在这个不断发展的环境中应对监管和战略的微妙之处。

## 大卫·桑塔格

大卫·桑塔格拥有丰富的学术研究记录,他将这些研究与行业参与和合作相结合。在本节中,他分享了他对LLMs(大型语言模型)中一些新兴发展的独特见解。

让我们与大卫·桑塔格一起探讨问题和答案。

## Q1 – 随着我们朝着创建更公平和无偏见的数据库迈进,您认为哪些策略在识别和减轻大型数据集中的隐含偏见方面最为有效?

在医疗保健领域,机器学习的应用已远远超出单纯的预测分析,它正在培养能够从根本上改变患者护理和结果的认识。这一领域的复杂性通过捕捉健康的社会决定因素——如生活环境、食品安全和交通可及性等变量——的挑战得到强调,这些变量对健康结果有重大影响。然而,当前的数据收集和模型训练领域往往忽视了这些关键但难以量化的患者生活方面,导致在个性化应用机器学习预测方面存在差距。

一个主要问题源于依赖于无法完全封装个体复杂性的数据集中的替代品或代理。这种依赖可能会掩盖每个患者固有的细微差别,从而削弱机器学习在医疗环境中产生有意义变化的可能性。数据模型训练所依据的内容与它们应用于的现实世界环境之间的差异进一步复杂化了这个问题。例如,在通用文本数据上训练的LLMs缺乏细腻应用所需的上下文丰富性,例如根据个人的社会环境定制医疗建议。

这种脱节不仅阻碍了模型在提供相关见解方面的效用,还引入了意外的偏见。当模型缺乏上下文或对其训练数据的局限性缺乏了解时,将泛化的预测错误地应用于个别案例时,这些偏见就会出现。解决这一挑战需要共同努力,丰富数据收集过程,以捕捉患者社会决定因素的更全面视角,并确保模型能够有效地解释和应用这些信息。

为了减轻大数据集中的隐含偏见并推进公平的机器学习模型,一个关注数据收集、分析和模型优化的多方面方法是必不可少的。关键策略包括将歧视指标分解为偏差、方差和噪声(“*我的分类器为什么具有歧视性?*”)以识别不公平的具体来源,强调丰富且足够大的训练样本在提高公平性和准确性方面的关键作用。

此外,通过增加更具代表性的样本和相关变量来扩充数据集可以解决不同群体之间预测性能的差异(“*机器学习中的潜在偏见及其对健康保险公司的应对机会*”)。实施这些策略需要严格、持续的评估模型输出和影响,确保它们不会延续现有的偏见或引入新的偏见。向算法警觉、敏感数据的道德使用以及将不同观点纳入模型开发过程中的行业协作努力也是至关重要的。通过将公平性作为模型准确性和效用基本方面的优先考虑,我们可以利用机器学习在各个领域提供更公正和公平的结果。

总结来说,在深入探讨之前提出的创建公平和无偏数据集的策略之前,承认机器学习在医疗保健中面临的根本挑战至关重要。这些挑战包括对病人社会决定因素的更深入理解,以及弥合数据模型训练所依据的内容与它们部署的上下文之间的差距。解决这些问题是充分利用机器学习以改善医疗保健结果并确保机器学习的创新对病人护理产生积极和公平贡献的先决条件。

## Q2 – 你如何看待这些策略随着NLP技术的进步而演变,你预见在LLMs(大型语言模型)内部结合不同学习范式方面的下一个突破是什么?

随着NLP技术的持续发展,增强其效用和公平性的策略也在进步,尤其是在麻省理工学院David Sontag团队领导的工作中。David分享了他们在实验室中引领的这三项研究进展:

1.  **透明度**:他们研究的基础是开发方法,以提供对NLP模型输出的每一块信息的全面归因。这涉及到回溯到训练数据,以识别影响模型预测的来源。这种做法不仅增强了NLP应用的信誉和可靠性,而且赋予了用户验证他们所呈现信息来源的能力。通过使输出到输入的清晰谱系透明化,用户可以理解模型决策背后的理由,从而增强对NLP系统的信任。

1.  **通用LLM在特定领域的应用**:该团队正在探索创新的方法,将通用LLM如GPT-4适应特定领域,而无需进行大量的重新训练或微调。这是通过一种允许这些模型协作的方法实现的,它们利用其通用能力,同时结合具有特定领域知识(如医学)的模型,以提供更准确和相关的输出。这种策略标志着向更适应性和高效使用现有NLP资源的转变,确保该领域的进步可以迅速应用于各种特定情境,而不会产生高昂的成本或时间延迟。(*个人评论*:这个用例是我们覆盖的两个用例之一的一个特殊情况,这两个用例都围绕同时利用多个LLM。第一个是K-LLMs方案,其中多个模型在一个旨在模仿专家委员会的设置中相互交互。每个模型都有自己的角色(例如,软件开发者与QA工程师合作,或项目经理与设计师合作),并且它们轮流改进结果输出。在这里,每个角色可以由同一个模型扮演;例如,每个角色可以由OpenAI的GPT代表,或者不同的模型可以承担不同的角色,其中每个模型承担的角色是基于模型的优势和劣势选择的。第二个是一个有几个不同模型的情况,每个模型都有自己的优势和劣势(例如,一个速度快但不会产生高质量见解;另一个速度慢但非常精确),并且“正确”的模型将通过一个针对给定约束条件优化的决策过程根据每个输入选择。例如,需要对给定的小句子集进行二进制*是/否*推理的提示可能被引导到一个简单的LLM,而需要应用法律判断的提示可能被引导到最新的GPT版本。)

1.  **高效微调大型语言模型**:他们研究的另一个焦点是如何以数据高效和计算高效的方式对大型语言模型(LLM)进行微调。这包括识别LLM架构中最具影响力的超参数进行调整,确定哪些应该保持固定,哪些应该调整以适应特定需求。这里的目的是在优化特定应用的同时,保持原始模型的结构完整性和强度,从而以最小的资源消耗扩展LLM在各个领域的实用性。

这些进步强调了改善自然语言处理(NLP)技术灵活性、透明度和适用性的更广泛承诺。通过关注这些关键领域,麻省理工学院(MIT)的David Sontag的研究旨在推动该领域的发展,确保NLP工具不仅更强大,而且对各个领域的用户来说更易于访问、理解和道德。这种方法与学术和实践的最高标准相一致,有望塑造下一代在医疗保健等领域的NLP应用。

## 第三季度——我们正在见证围绕人工智能的监管从训练数据和模型使用方面的持续演变。在这个受监管的环境中,对于未来LLMs的发展有何影响?

在围绕人工智能不断演变的监管环境中,对于未来大型语言模型(LLMs)的发展产生了重大影响。随着监管的持续进步,重点关注人工智能的安全性,包括国家安全威胁和人工智能的道德使用,LLMs开发和部署的框架正在重塑:

1.  **演变的监管**:人工智能的监管预计将加剧,强调在人工智能技术应用中的安全性和适当性。这种不断演变的监管环境需要采取积极主动的合规方法,LLMs的开发者必须确保他们的模型不仅有效,而且与新兴的法律和伦理标准保持一致。这些法规旨在减轻与人工智能相关的风险,引导行业走向负责任的创新。

1.  **数据和模型的质量**:行业和学术界都在积极提升用于训练模型的数据质量。追求质量是开发更准确、更可靠的LLMs的基础,因为模型从精心整理和具有代表性的数据中受益。研究表明,在数据使用方面具有效率的潜力,选择“正确”的数据可以大幅减少对大型数据集的需求,同时不损害模型的表现。这种效率不仅符合监管对透明度和问责制的需求,还为更可持续的模型开发流程开辟了途径。

1.  **元数据和模型监控**:将元数据纳入训练过程代表了向更大责任和可解释性转变的关键步骤。通过将详细元数据附加到用于模型训练的数据点上,开发者可以提供清晰的审计轨迹,阐明模型如何得出结论。这种能力对于监控模型性能和确保LLMs在伦理和法律边界内运行至关重要。这也反映了更广泛的行业趋势,即拥抱机器学习可解释性方法,使利益相关者能够审查和理解LLMs的决策过程。

这些发展,由大卫·桑塔格的洞察力所预测,强调了这样一个未来:LLMs不仅在技术上先进,而且在道德上扎根,符合监管要求。这一轨迹确保了随着LLMs在各个领域的日益嵌入,它们将以优先考虑安全、公平和透明的方式进行。这种做法不仅符合学术卓越的最高标准,而且使LLMs能够对社会产生积极和负责任的影响。

## 约翰·D·哈拉姆卡

约翰为这一章节带来了执行层面的内容。在这一部分,他阐述了一系列见解和行动,公司和组织可以实施,以实现AI的进步,并保持高度监控和负责任的方向。

让我们与约翰·D·哈拉姆卡一起探讨问题和答案。

### Q1.1 – 梅奥诊所如何制定政策,在NLP社区中协调开放、可重复研究的需求与严格的隐私保护,以及它是如何在国际法规的复杂环境中进行导航的?

在协调开放、可重复研究的需求与NLP社区中保护个人隐私的需求之间,由**梅奥诊所平台**开创的“数据背后的玻璃”模型提供了一个令人信服的解决方案。这一模型在处理敏感健康数据方面代表了范式转变,体现了一种以平台为中心的方法,确保数据质量、符合监管要求,并且在整个数据生命周期中维护患者信任。

在其核心,梅奥诊所平台连接作为一个分布式数据网络,体现了联邦架构。在这个网络中,合作伙伴贡献他们独特的数据集,同时保持对其数据的严格控制,保护在其组织IT边界内的隐私和机密性。这种联邦方法为数据共享和利用提供了一个协作且安全的环境。

这一模型成功的关键在于细致入微的数据去标识化过程。通过采用符合隐私法律和法规的行业认可的统计方法,数据被匿名化,确保在保留数据在研发价值的同时,保护个人隐私。如哈希、统一日期偏移和标记化等技术被用于模糊数据,便于在联邦学习中使用而不损害患者隐私。

此外,Connect 所基于的“设计即安全”哲学确保数据**知识产权**(**IP**)始终处于各自所有者的控制之下,仅按授权访问。这种方法不仅保护了隐私,还通过允许梅奥诊所平台客户在去标识化数据群体上开发、培训和验证算法,促进了创新。严格的控制措施,包括代码库审查、严格的访问管理和禁止数据导入导出,进一步强化了平台对隐私和安全的承诺。

“玻璃背后的数据”模型独特地定位在解决不断变化的监管环境。随着国际监管机构加强对 AI 和 ML 应用程序的审查,梅奥诊所平台的可适应框架旨在应对全球隐私法规的复杂拼图。无论是欧盟的**通用数据保护条例**(**GDPR**),巴西的**通用数据保护法**(**LGPD**),还是中国的安全和隐私规则,该模型都确保了合规性,同时促进了全球合作。

总结来说,“玻璃背后的数据”模型为自然语言处理(NLP)社区实现双重目标提供了一条可行的途径:一方面促进开放研究,另一方面保护隐私。通过去标识化、安全化和联邦化数据,梅奥诊所平台使数据的使用民主化,同时不损害患者隐私,为在透明度和隐私之间保持平衡的时代树立了负责任的数据处理的先例。这一模型展示了技术创新与对道德标准的深厚承诺相结合如何为医疗保健乃至更广泛的领域中的变革性进步铺平道路,确保患者信任始终处于数字健康倡议的前沿。

### Q1.2 – 在这个监管环境中,LLM 的未来发展趋势有哪些影响?

*让我们首先回顾一个强大的指导来源,该来源旨在促进围绕 LLM 和 AI 在医疗保健领域的使用进行政策制定:T***he Coalition of Health** **AI** *(***CHAI™***).*

在其网站上,CHAI 讨论了以下倡议:

“健康人工智能联盟(CHAI™)([https://coalitionforhealthai.org/](https://coalitionforhealthai.org/)) *致力于制定指导方针,通过采用可信、公平和透明的健康人工智能系统来推动高质量的医疗保健。我们提供了一个可信赖的 AI 实施指导草案和医疗保健 V1.0 的保证,供公众[https://coalitionforhealthai.org/insights](https://coalitionforhealthai.org/)) *审查和评论。*”

CHAI通过制定采用可信、公平和透明的健康AI系统的指南,为医疗保健行业做出贡献。他们关于可信AI实施和保证的草案蓝图强调了与**美国商务部国家标准与技术研究院**(**NIST**)的AI风险管理框架保持一致的重要性,并将这些概念扩展到医疗保健领域。主要贡献包括以下方面:

+   **框架一致性**:将指导与NIST定义的结构化,重点关注验证、可靠性和AI风险管理的*映射*、*衡量*、*管理*和*治理*功能

+   **可信度要素**:强调在AI的设计、开发和部署中承担专业责任和社会责任,以积极和可持续地影响社会

+   **医疗保健中的实用性**:倡导AI算法不仅有效可靠,而且对病人和医疗保健提供有益,需要临床验证和持续监控

+   **验证和可靠性**:强调在受监管的AI/ML技术中,包括**软件作为医疗设备**(**SaMD**),软件验证的重要性,并确保AI系统的准确性、可操作性和预期用途

+   **可重复性和可靠性**:解决AI/ML对硬件和软件变化的敏感性,强调在医疗保健环境中实现可靠性和可重复性的必要性

+   **监控和测试**:倡导对AI工具进行持续监控和测试,以确保可靠性,检测输入数据或工具输出的变化,并保持人机协作的质量

+   **可用性和益处**:将可用性定义为依赖于模型的环境、最终用户视角、简单性和工作流程集成,并衡量算法对预期结果的影响

+   **安全措施**:确保AI系统不会对人类生命、健康、财产或环境构成风险,重点是防止比现状更糟糕的结果

+   **责任和透明度**:强调可审计性、最小化伤害、报告负面影响,并使设计权衡和纠正机会清晰

+   **可解释性和可理解性**:平衡AI系统在操作上可理解以及在输出上有意义的需求,这对于建立用户对健康AI的信任至关重要

+   **公平性和偏见管理**:解决选定群体之间的不同表现或结果,并确保AI不会加剧偏见或不利公平结果的风险

+   **安全和弹性**:强调AI系统需要能够承受不利事件,维持功能,并确保机密性、完整性和可用性

+   **隐私增强**:遵守医疗保健中隐私的既定标准,如**健康保险可携带性和责任法案**(**HIPAA**),同时适应其他司法管辖区规则,如GDPR

CHAI的努力旨在确保医疗保健中的人工智能系统以符合伦理标准、提高患者护理和维护公众信任的方式开发和部署。

## Q2 – 人工智能驱动的组织结构 – 你预测人工智能将以哪些方式继续重塑公司的组织结构,以最大化人工智能的益处?

“人工智能确实重塑了公司。特别是,在梅奥诊所,我们问自己,我们应该将人工智能运营集中化还是分散到组织内部?我观察到许多案例中采用了不同的方法。在梅奥诊所,我们的做法是将所有人工智能工作去中心化,但将数据治理和政策制定集中化。这使创新没有遗憾。”

让我们回顾一下这种工作模式的一些关键好处。

### 去中心化人工智能工作模型的好处

+   **增强创新和敏捷性**:通过去中心化人工智能运营,像梅奥诊所这样的组织营造了一个环境,使各个部门能够根据其特定的需求和挑战创新和应用定制的人工智能解决方案。这种灵活性允许更快地适应和实施人工智能技术。

+   **赋权和所有权**:去中心化人工智能赋予个人团队和部门探索人工智能应用和解决方案的自主权。这种所有权感可以推动更加投入和有动力的团队,从而带来创新解决方案和运营改进。

+   **多样化的应用和解决方案**:去中心化的方法使人工智能在组织的不同方面得到更广泛的探索。不同的部门可以通过人工智能解决各种问题,从而产生一系列针对各种组织需求的人工智能驱动解决方案和应用。

+   **快速实验和学习**:随着人工智能的去中心化,团队可以快速测试、学习和迭代人工智能项目,而不会受到集中决策瓶颈的限制。这种快速实验可以导致更快地发现,并从成功和失败中更有效地学习。

### 集中化数据治理的好处

+   **数据安全和隐私**:集中化数据治理确保有持续的政策和协议来保护敏感信息并遵守隐私法规。这在医疗保健和其他数据隐私至关重要的领域至关重要。

+   **数据质量和完整性**:集中化的数据治理方法有助于在整个组织中保持高数据质量和完整性。通过统一的标准和政策,组织可以确保人工智能模型是在准确、干净和可靠的数据上训练的。

+   **高效资源管理**:集中数据治理允许更有效地管理数据资源,避免重复并确保数据资产在整个组织中得到最佳利用。这可能导致成本节约和更高效的数据存储和计算资源的使用。

+   **法规合规**:通过集中数据治理,组织可以更有效地确保符合不断变化的法规要求。统一的数据政策制定方法可以帮助在复杂的法律环境中导航,并降低不合规的风险。

通过采用一种将AI工作去中心化同时集中数据治理和政策制定的模型,像梅奥诊所这样的组织可以在确保数据安全、质量和法规合规的同时,刺激AI应用的创新和适应性。这种平衡的方法可以实现“无遗憾的创新”,允许以负责任和有效的方式探索和实施AI解决方案。

## Q3 – 伦理担忧和应对过度委托的策略——随着AI继续渗透到日常决策过程中,你推荐哪些策略来防止过度依赖AI系统,并保持健康水平的人类批判性思维和自主性?

**医疗保险与医疗补助服务中心(Centers for Medicare & Medicaid Services,**CMS**)关于拟议规则制定的公告在提供关于AI角色的指导方面非常有帮助。约翰解释说:“*该提案指出,所有AI都应增强,而不是替代,* *人类决策*。”

我们深入研究了在线提出的提案([https://www.govinfo.gov/content/pkg/FR-2022-08-04/pdf/2022-16217.pdf](https://www.govinfo.gov/content/pkg/FR-2022-08-04/pdf/2022-16217.pdf))。特别是,我们关注了第47880页的*临床算法在决策中的应用(§ 92.210)*部分,并得出以下结论:

+   **临床算法的非歧视性**:CMS强调,临床算法不应导致基于种族、肤色、国籍、性别、年龄或残疾的歧视。临床算法的使用不应被禁止,而应受到监控,以防止产生歧视性结果。

+   **增强而非替代**:CMS提议临床算法应增强而非替代人类临床判断。不考虑其潜在的歧视性影响而过度依赖算法可能违反现有法规。

+   **基于临床算法的决策责任**:虽然实体对其未开发的算法不承担责任,但如果这些决策导致歧视,它们可能因基于这些算法做出的决策而承担责任。

+   **算法偏差意识**:CMS强调临床算法中普遍存在的“种族校正”或“种族规范”做法,这些做法可能导致基于种族或民族的歧视性待遇。他们提倡使用没有已知偏差的更新工具。

+   **种族和民族意识变量的适当使用**:虽然种族和民族变量可能在某些情况下用于解决健康差异,但CMS警告不要以可能导致歧视的方式使用它们。

+   **对残疾和年龄的担忧**:算法也可能歧视残疾人和老年人,尤其是在公共卫生紧急事件期间危机标准和资源分配决策中。

+   **拟议规则§ 92.210**:这项新规定明确禁止通过使用临床算法进行歧视,旨在确保这些工具不会取代临床判断或导致歧视性结果。

+   **指导和专业技术支持**:CMS表示致力于提供专业技术支持以支持遵守民权义务,征求对规定范围、缓解措施和所需技术援助类型的意见。

总结来说,CMS的方法强调了利用AI改善医疗保健和确保这些工具不会削弱人类判断或延续歧视之间的关键平衡。他们提出的规则和征求意见反映了持续努力制定对AI在医疗决策中作用的响应性和负责任指南。

## Xavier Amatriain

让我们与Xavier Amatriain一起探讨问题和答案。

## Q1.1 – LLM的未来 – 混合学习范式:鉴于学习方案的演变,您如何看待在LLM中结合不同学习范式的下一个突破?

最重要的是要记住,我们在LLM研究领域还非常早期,这是一个快速发展的领域。虽然注意力驱动的Transformer已经带我们走得很远,但还有许多其他方法的空间。例如,在预训练方面,现在有许多关于后注意力方法(如**结构化状态空间模型**(**SSMs**或**S4**))的有趣研究。同样,**专家混合**(**MoEs**),虽然不是新概念,但最近证明它们在提供更小、更高效的模型方面具有惊人的力量,例如Mistral AI的Mixtral。而这只是预训练空间。对于对齐,我们已经看到**直接偏好**(**DP**)或**卡尼曼-特沃斯基**(**KT**)等方法迅速显示出大量前景。不用说,自我博弈作为改进和对齐的机制也被使用。

我在这里的主要信息是,我们应该保持警惕,并期待在接下来的几年里,会有大量的创新迅速出现在我们面前。我认为几年后,我们会回顾并认为GPT4架构是过时且完全不高效的。非常重要的一点是,其中一些改进将使LLM在准确性上更好,同时也在成本和规模上更加高效,因此我们应该期待GPT4类似的模型能在我们的手机上运行。

### Q1.2 – LLM的未来 – 集成方法中的专用LLM:考虑到K-LLMs方法,即使用具有互补优势的多个LLM的概念,应该有哪些具体标准来指导在集成中LLMs的选择和组合以处理复杂任务?

在LLMs的背景下,有许多方式和地方可以使用集成技术。选择和组合这些技术的标准取决于用途和这种组合发生的地方。以下是三个使用LLMs组合有用的地方:

在预训练阶段,**专家混合**(**MoEs**)是一种集成形式,其中不同的深度神经网络被组合起来以提高输出。选择和权衡不同专家的权重是在预训练期间学习的。重要的是,其中一些权重为零,这使得推理变得更加高效,因为并非所有专家都需要完成所有任务。

另一种组合不同LLMs的方法是在蒸馏阶段。在一些方法,如教师/学生蒸馏中,LLMs被用来生成数据,然后训练一个更小或更具体的模型。每个LLM的选择和权重是在学生模型的训练阶段学习的。

最后,我们可以通过将每个LLM实例视为一个代理来在应用层组合LLMs。这导致了多代理系统的概念,其中专门针对特定任务的LLM代理被组合起来执行更复杂的任务。

## Q2 – AI驱动的组织结构 – 你预测AI将以哪些方式继续重塑内部业务运营,公司应如何准备调整其组织结构以最大化AI的益处,尤其是在决策和运营效率方面?

生成式AI将彻底改变组织的各个方面。我坚定的预测是AI将成为组织中的另一个成员。例如,软件工程师将在日常工作中与一个AI(或几个AI)协作。这将使他们的效率提高不是10倍而是100倍。

当然,这样的革命性力量将改变我们组织团队、招聘人员或评估他们绩效的方式。我认为我们为即将到来的世界做好准备非常重要,在这个世界中,组织中的任何人都将需要具备与AI协作和工作的能力。

## 梅兰妮·加森

梅兰妮带来了在法律和监管领域工作的丰富经验。随着AI和LLMs继续推动政策和指南,这种专业知识的价值变得越来越清晰和重要。

让我们与梅兰妮·加森一起回顾问题和答案。

## Q1 – 由于这本书旨在面向ML和AI世界的技术实践者,他们了解各种法律和监管方面会有什么价值?

理解围绕人工智能的地缘政治格局,包括监管、法律和风险考虑因素,对于从开发者到**主题专家**(**SMEs**)的技术实践者来说至关重要。在人工智能领域,随着公司进行战略和政策讨论,让技术熟练的个人参与这些对话是必不可少的。决策者越来越认识到,在决策过程中拥有技术视角的价值,以确保决策全面且受技术可能性和限制的指导。

一个信息丰富的技术专业人士可以有效地传达他们的见解,弥合技术潜力和执行愿景之间的差距。这种能力不仅增强了决策过程,还确保了策略的稳健性、合规性,并意识到不断变化的监管格局。

此外,随着组织努力使自己的运营与监管要求保持一致并减轻潜在风险,他们很可能会建立专门的团队,负责开发和实施符合这些新战略方向的科技解决方案。熟悉塑造人工智能行业的法律和监管动态的技术专家将发现自己处于显著优势,准备为这些团队做出实质性贡献。他们的专业知识不仅使他们成为无价之才,而且使他们为在这些战略举措中的领导角色做好准备,推动合规性、创新和在全球监管市场中获得竞争优势。

## Q2 – 从法律专家的角度来看,我们如何对与人工智能技术迅速发展相关的各种风险进行分类?

从法律角度来看,人工智能技术的快速进步带来了一系列风险,这些风险可以分为几个不同的类别,每个类别都有其独特的挑战和影响。这些风险包括以下内容:

+   **技术风险**:这些风险源于人工智能算法内在的缺陷,例如招聘过程中的偏见或针对意外、有害结果的优化系统。一个臭名昭著的例子是谷歌的Gemini,被发现生成不准确的历史图像。Gemini创建了历史人物的各种图像,其中所选择的描绘人物的性别和种族与历史事实完全矛盾。另一个案例是微软的Tay聊天机器人,它从其在Twitter上的互动中适应了种族歧视的侮辱性语言,突显了人工智能系统如何由于不匹配或恶意输入而与预期功能大相径庭。

+   **伦理风险**:伦理考量至关重要,尤其是对于面部识别等技术,这些技术对个人隐私构成重大威胁。此外,关于为大型人工智能模型提供训练数据的人的剥削也出现了伦理困境,这些人通常在补偿或工作条件不充分的情况下工作。

+   **社会风险**:人工智能传播虚假信息或侵蚀社会信任的能力体现了其社会风险。虚假信息的传播和可信来源的破坏可能对公共讨论和社会凝聚力产生深远影响。

+   **经济风险**:人工智能的经济影响广泛,从侵犯知识产权到可能增加市场集中度和失业,这些风险突显了人工智能对竞争格局和劳动力市场变革性的影响。

+   **安全风险**:恶意行为者滥用人工智能代表了一个重大的安全关切。这包括利用人工智能制造化学神经毒剂或进行数据提取攻击,其中大型语言模型(LLMs)可能被利用来访问私人个人信息,从而损害数据隐私和安全。

+   **存在风险**:或许最深刻的危险是由超越人类智能的人工智能系统带来的存在威胁。这样的系统,如果未能与人类价值观和目标充分对齐,可能会以对人类造成灾难性后果的方式追求其目标。

认识到这些风险的广泛性和深度对于国家、开发者和整个社会来说至关重要,以确保人工智能技术的部署以最小化潜在危害的方式进行。这需要一种积极的治理方法、开发实践和社会参与方法,以负责任地应对人工智能进步的复杂格局。

## Q3 – 如何引导人工智能和大型语言模型(LLMs)的开发和部署,以减轻诸如偏见等伦理问题,并确保其在决策过程中的负责任使用,尤其是在高风险和受监管的行业?

为了减轻诸如偏见等伦理问题,并确保人工智能和大型语言模型(LLMs)在决策过程中的负责任使用,尤其是在高风险和受监管的行业,需要采取多方面的方法。这种方法应解决将人工智能系统整合到商业和社会关键领域的技术和社会技术挑战。以下策略可以指导人工智能系统的开发和部署:

+   **发展重点转移**:AI 系统的设计应旨在增强而非复制人类思维。这种关注点的转变有助于通过确保 AI 系统支持和增强人类决策而不是取代它来维持公众对 AI 的信任。信任对于 AI 在决策过程中的长期集成至关重要,而维护它需要清楚地展示 AI 对人类能力的补充作用。

+   **合规监管和偏见缓解**:遵守新兴法规,例如 2024 年通过的欧盟 AI 法案,以及旨在限制高风险用例中偏见的协议标准,是至关重要的。开发者还应意识到偏见在合规监管之外的更广泛影响,认识到以西方和英语为中心的 AI 系统带来的挑战。应努力使数据集和算法多样化,以反映全球人口结构并减少固有的偏见。

+   **压力测试和安全措施**:AI 系统,尤其是 LLMs,应接受严格的压力测试,以确保它们能够处理具有更多确定性结果的高风险用例。应开发安全性和缓解策略来应对潜在的 AI 失败,重点是预防灾难性的“脆弱”失败,这些失败可能产生广泛的影响。

+   **人类监督**:将人类纳入作为战略瓶颈可以作为一种有效的保障措施,以防止 AI 决策的意外后果。这种策略确保 AI 系统持续受到人类判断的监控和指导,特别是在 AI 决策具有重大影响的情况下。

+   **构建基础 AI 基础设施**:政府和组织应投资于创建支持 AI 伦理和负责任部署的基础 AI 基础设施。这包括促进私营部门、学术界和政府之间的合作,共同开发既创新又符合社会价值观的 AI 工具。

+   **技能和文化发展**:在劳动力中推广实验和 AI 技术的安全使用文化至关重要。这包括对公务员和行业专业人士进行 AI 伦理使用培训,包括理解其局限性和潜在偏见。

+   **长期战略规划**:建立长期机制来识别、试点和部署前沿 AI 应用至关重要。这种规划应考虑 AI 技术的伦理、社会和经济影响,旨在利用 AI 为公众谋福利,同时最大限度地减少对公民和社会的风险。

通过采用这些策略,AI 开发者和政策制定者可以解决偏见问题,并确保 AI 和大型语言模型(LLMs)被负责任和有效地使用,尤其是在它们影响最深远、可能产生变革性影响的领域。

## Q4 – 可以实施哪些策略来实现从传统角色到协作人机团队的转变,确保在职场中人工智能整合的同时发展人类专业知识?

要从传统角色过渡到协作人机团队,并确保在职场中人工智能整合的同时发展人类专业知识,需要采取多方面的方法。这种策略包括以下内容:

+   **创造新的技能发展途径**:解决自动化对入门级角色的替代风险,需要建立新的职业发展途径和专业技能发展途径。这涉及到利用**生成式人工智能**(**GenAI**)工具的潜力,如斯坦福和麻省理工学院的研究所示,以提高工人生产力,同时探索人工智能对工作职能的更广泛影响。设计教育和培训计划,为劳动力准备更高层次的分析和战略角色至关重要,确保中小企业与人工智能进步同步发展。

+   **培养对人工智能输出的批判性参与**:为了对抗对人工智能和自动化的过度依赖,需要一种文化转变,鼓励员工批判性地评估人工智能决策。实施提供改进的可解释性系统——“玻璃盒子”,可以阐明人工智能决策背后的推理——可以赋予员工理解、质疑和有效协作人工智能工具的能力。这确保了人类认知技能和人工智能能力的平衡整合,增强了决策过程和对人工智能应用的信任。

+   **加强工作场所整合评估机制**:将人工智能有效融入工作场所,不仅超越了与基准数据集相比的性能指标。它需要全面理解现实世界的工作流程、潜在的限制以及管理异常情况的战略。这意味着开发评估方法,以评估人工智能系统如何在特定操作环境中补充人类角色,认识到自动化可以处理任务,但并不一定能够完全取代人类工作的细微和复杂性质。

+   **促进人机协作团队**:商业的未来需要接受一种范式,即人类和机器协作以实现共同目标。这种方法强调双方互补的优势,利用人工智能提高效率和规模,同时利用人类专业知识进行创新、道德考虑和复杂问题解决。实现这种协同效应需要战略性的组织规划、持续的学习机会,以及营造一种技术增强而非取代人类贡献的环境。

通过解决这些关键问题,组织可以培养一个环境,其中AI赋能的工具被深思熟虑地整合到工作场所。这确保了人类专业知识不仅得到保留,而且得到增强,为未来铺平道路,在那里协作的人机团队以负责任的方式推动创新、生产力和可持续增长。

# 摘要

在我们探索NLP和LLMs动态世界的最后一章中,我们有幸与各个领域的专家进行交流。他们富有洞察力的讨论揭示了LLMs的复杂发展、法律考量、运营方法、监管影响以及新兴能力。通过他们的专业视角,我们深入探讨了紧迫问题,如创建公平的数据集、推进NLP技术、在研究中导航隐私保护、围绕AI重组组织以及预测学习范式的突破。

与这些杰出人物的对话突出了一个共同主题:技术创新与伦理、法律和组织考虑因素的交汇。当我们思考减轻数据集偏差的策略、展望混合学习范式的未来,以及评估基础模型对数据所有权的影响时,变得明显的是,NLP和LLMs的演变不仅仅是一个技术旅程,而是一个多学科的事业,它挑战我们深入思考这些进步的更广泛影响。

本章作为本书的压轴之作,将全书各章节中讨论的广泛主题串联起来,从NLP的基础及其与ML的集成到LLMs的复杂设计、应用以及它们预示的未来趋势。它概括了我们旅程的精髓——强调学术界与工业界之间的合作,在充分理解伦理和法律环境的基础上,对于发挥LLMs的潜力至关重要。

在我们不仅结束这一章,而且结束整本书之际,我们站在NLP和LLMs新时代的边缘。我们专家分享的见解并不标志着结束,而是未来探索和创新的灯塔。本书旨在为来自学术界或工业界的读者提供对NLP和LLMs演变的全面理解和前瞻性见解,鼓励他们通过自己的研究、发展和伦理考量为这个不断发展的叙事做出贡献。
posted @ 2025-09-23 21:57  绝不原创的飞龙  阅读(40)  评论(0)    收藏  举报