0°

一文读懂ChatGPT原理!

  最近一周多的时间,只要不是生活在火星,喜欢技术的同学一定都被OpenAI的ChatGPT给刷屏了。ChatGPT与以往的公开提供服务的对话机器人相比,性能有了显著的提高。它可以相对可靠地提供一些日常对话、知识获取的功能,也可以它根据人类提供的需求帮忙写文档、写代码,甚至可以修改文本中的各类错误或者代码中的Bug。我相信很多非AI圈的同学肯定会有一种“为什么AI突然变得这么强?“的感受。这篇文章的目的也是为了回答这个问题。在开始之前,我觉得有必要先表达一下我自己的看法:NLP技术发生跨越式发展的标志并不是ChatGPT本身,而应该是2017年-2018年间相继被提出的Transforme1r[1]和GPT[2]。

  ChatGPT是Transformer和GPT等相关技术发展的集大成者。总体来说,ChatGPT的性能卓越的主要原因可以概括为三点:

  使用的机器学习模型表达能力强。

  训练所使用的数据量巨大。

  训练方法的先进性。我们接下来将会针对这三点进行探讨。

  机器学习模型

  在步入正题之前,我们可以先梳理一下NLP发展的历史。

  基于文法的模型

  这个阶段,大家处理自然语言的主要思路就是利用语言学家的智慧尝试总结出一套自然语言文法,并编写出基于规则的处理算法进行自然语言处理。这个方法是不是乍听起来还行?其实我们熟悉的编译器也是通过这种方法将高级语言编译成机器语言的。可惜的是,自然语言是极其复杂的,基本上不太可能编写出一个完备的语法来处理所有的情况,所以这套方法一般只能处理自然语言一个子集,距离通用的自然语言处理还是差很远。

  基于统计的模型

  在这个阶段,大家开始尝试通过对大量已存在的自然语言文本(我们称之为语料库)进行统计,来试图得到一个基于统计的语言模型。比如通过统计,肯定可以确定“吃”后面接“饭”的概率肯定高于接其他词如“牛”的概率,即P(饭|吃)>P(牛|吃)。

  虽然这个阶段有很多模型被使用,但是本质上,都是对语料库中的语料进行统计,并得出一个概率模型。一般来说,用途不同,概率模型也不一样。不过,为了行文方便,我们接下来统一以最常见的语言模型为例,即建模“一个上下文后面接某一个词的概率“。刚才说的一个词后面接另一个词的概率其实就是一元语言模型。

  模型的表达能力

  在这里,我们很适合插播一下模型表达能力这个概念。

  模型表达能力简单来说就是模型建模数据的能力,比如上文中的一元语言模型就无法建模“牛吃草”和“我吃饭”的区别,因为它建模的本质统计一个词后面跟另一个词的概率,在计算是选“草”还是选“饭”的时候,是根据“吃”这个词来的,而“牛”和“我”这个上下文对于一元语言模型已经丢失。你用再多的数据让一元语言模型学习,它也学不到这个牛跟草的关系。

  模型参数数量

  有人说,既然如此,为啥我们不基于更多的上下文来计算下一个词的概率,而仅仅基于前一个词呢?OK,这个其实就是所谓的n元语言模型。总体来说,n越大,模型参数越多,表达能力越强。当然训练模型所需要的数据量越大(显然嘛,因为需要统计的概率的数量变多了)。

  模型结构

  然而,模型表达能力还有另一个制约因素,那就是模型本身的结构。对于基于统计的n元语言模型来说,它只是简单地统计一个词出现在一些词后面的概率,并不理解其中的各类文法、词法关系,那它还是无法建模一些复杂的语句。比如,“我白天一直在打游戏”和“我在天黑之前一直在玩游戏“两者语义很相似,但是基于统计的模型却无法理解两者的相似性。因此,就算你把海量的数据喂给基于统计的模型,它也不可能学到ChatGPT这种程度。

  基于神经网络的模型

  上文提到,统计语言模型的主要缺点是无法理解语言的深层次结构。曾有一段时间,科学家们尝试将基于文法的模型和基于统计的模型相结合。不过很快,风头就被神经网络抢了过去。

  RNN & LSTM

  刚开始,流行的神经网络语言模型主要是循环神经网络(RNN)以及它的改良版本LSTM。

  RNN的主要结构如下, x是输入,o是输出,s是状态。

  如果RNN作为语言模型的话,那x可以作为顺序输入进去的词汇,而o就可以作为输出的词汇,而s就是通过x计算o的过程中生成的状态变量,这个状态变量可以理解为上下文,是对计算当前词汇时前文所有出现过的所有单词的浓缩并在一次次的计算中不断迭代更新。这也是为啥RNN可以建模词与词关系的根本原理。

  与简单的基于统计的模型相比,循环神经网络的主要亮点就是能够对一段文字中不同词之间的关系进行建模,这种能力在一定程度上解决了基于统计的模型无法理解深层次的问题。

  Attention Mechanisms

  在更进一步之前,我们不得不提一下注意力(Attention)机制。

  这个机制主要针对RNN语言模型中状态S作为上下文这一机制进行改进。。在RNN中计算当前词后的状态Si主要是通过计算上一个词时的状态Si-1迭代出来的。它的主要缺点就是它假设了距离较近的词汇之间的关系更密切。但是我们都知道,在自然语言中,这一假设并不是一直成立的。引入Attention之后,计算第i个词后的状态从单纯的Si变成了S0,S1…Si的组合,而具体“如何组合”,即哪个状态比较重要,也是通过数据拟合出来的。在这样的情况下,模型的表达能力又得到了进一步的提高,它可以理解一些距离较远但是又非常密切的词汇之间的关系,比如说代词和被指代的名词之间的关系。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论