出处: https://youtu.be/lnA9DMvHtfI?si=1QJ0uRukSzPB9EYG
大家好。在这段视频中,你将全面了解大型语言模型。
让我们从手机上的自动补全功能开始。你有没有想过它是如何工作的?这里的建议词是英语中最常用的词 “the”。让我们输入“y”下一个字母。有许多单词以“ty”开头。
如果你选择最短的,你会得到“tye”。这个图表绘制了这个词随时间的频率变化。它在18世纪非常流行,六十年代,但今天,你需要阅读2000万个单词才能找到它的第一次出现。我们可以查找每个单词的这些频率,以“ty”开头的单词。
如果我们按单词频率排序,我们会有一个明显的胜者。同样的方法适用于短语和句子。每次你在搜索引擎中开始输入时都会看到它。搜索引擎通过计算查询的频率为每个查询打分。换句话说,有多少其他人使用了那个查询?
那么这就是全部吗?语言建模?确实,目标是对每个句子分配一个概率,而频率是一种计算多个概率的方法。问题是这种频率方法不允许你对新句子进行评分。这是一个完全有效的句子,但它可能以前从未出现过。
你可能会问,真的有多少新句子,考虑到每天数以亿计的互联网帖子,当我们穷尽所有单词组合时,让我们做一个粗略的计算。英语中有超过10万单词,一个典型的句子包含超过十个单词。这意味着有10的50次方种组合。这是一个极其庞大的数字。绝大多数句子永远不会被任何人看到。
因此,在真正的语言模型中,我们需要做的不仅仅是统计已经存在的句子。我们需要某种方式来建模语法和风格等东西。
这里有一个诺贝尔奖获奖诗人的例子。让我们尝试构建一个能够像鲍勃·迪伦那样写作的语言模型。我们首先将这段文本视为一个时间序列,其中每个单词依赖于前一个单词。请注意,“was”这个词出现了三次。让我们将这三次实例合并为一次。这将我们的序列转换为一个图。另一个重复的单词是“if”,让我们也将这两个合并。如果我们为这些边添加概率,它就变成了一个语言模型。
你可以用它生成类似鲍勃·迪伦风格的文本,如果从早期开始并遍历正确的分支序列。你会得到原始的歌词。现在让我们生成一个全新的短语,这首歌里没有的。我们将从“the”开始并跟随这些分支。这是另一个例子。嘿,这些实际上相当不错。它们是全新的短语,听起来像鲍勃·迪伦的风格。但其他路径会产生奇怪的结果,大多数只是产生无意义的内容。我们如何让它变得更好?
首先,我们可以使用更多的文本构建我们的模型。如果你用整首歌构建模型,结果如下。嗯,这些仍然有点奇怪。
这里真正的问题在于我们的模型过于简单。它假设每个单词只依赖于前一个单词。我们可以将其写成条件概率。这是当前单词x(n)在给定前一个单词x(n-1)条件下的概率。
如果你查看三个单词的关系而不是两个,可以做得稍微好一点。让我们构建一个所有连续三元组的表格。这些称为三元组,你可以使用这些三元组根据前两个单词定义下一个单词的概率。生成文本的结果稍微好一些,但仍然不够好。
问题在于这些单词可能具有相当长距离的依赖关系。
例如,单词“red”与“hair”相关,这是三个单词之前的内容,但它也与“bed”押韵,这是十三个单词之前的内容。如果你忽略那些押韵,这首歌根本无法成立。
因此,我们需要建模这样的函数,甚至是更长的函数,以准确表示语言。这些函数极为复杂。
我们无法精确建模,但我们可以尝试近似它。有多种方法可以近似一个函数。
你可能听说过傅里叶级数,它使用正弦和余弦来近似函数,或者泰勒级数,
这是一个多项式的和。它们都是通用近似器。它们几乎可以近似任何函数。
另一个通用近似器的例子是神经网络。神经网络的一个优势是,你不需要了解你试图近似的函数的任何信息,只需要输入和输出对即可。
让我们尝试一个例子。这个函数很有趣。让我们用神经网络来近似它。我们将使用这个。它有五个节点和八个权重。让我们在图上选择一个点,并将其通过网络传递。第一层复制x,并将每个副本乘以不同的权重。然后每个加权副本通过激活函数,一个称为sigmoid的S形曲线。在这种情况下,乘以新的权重然后相加。结果是我们对f(x)的近似值,我们称之为y。
我们可以绘制它以查看它离我们试图拟合的函数有多远。这是我们的误差。你可以看到它相当大。那是因为我随机生成了权重。所以这只是其中一个数据点,我们可以向网络发送许多x值以生成这条红色曲线。让我们定义一个误差函数,该函数将红色和蓝色曲线值之间的所有差异相加。我们将使用这些误差来更新权重。这被称为训练网络。如果我们重复这些更新步骤数千次,我们能得到一个相当不错的拟合。
我们可以将我们的能量函数视为一个地形图。我们的目标是找到最低点,也就是盆地。这看起来很容易,对吧?但如果我没有给你展示这个函数呢?现在要难多了,对吧?好的,我会给你几个点,以及它们的负梯度,它们指向下坡方向。现在你可以沿着梯度下降到山脚下。这被称为梯度下降。这也是优化神经网络的方式。
为了训练我们的网络,我们需要误差函数的梯度。它是一个包含八个偏导数的向量,每个权重对应一个。事实证明,对于神经网络来说,计算这个相对直接。并且可以在单次反向传递中完成。在网络中计算偏导数的过程称为反向传播。它是神经网络的核心工作原理。
好吧。你现在告诉我神经网络是通用近似器,你可以拟合任何函数。那么这个函数呢,它用于建模语言?嗯,有些网络可以做到这一点,但它需要足够的容量。
举个类比的例子,假设我们尝试用这个只有四个权重的网络拟合我们的蓝色曲线。它无法拟合第二个波峰,因为网络的容量不足。
设计决策很重要。比如,如果我使用不同的激活函数呢?ReLU比较流行,但它们提供的是分段线性重构,所以你需要更多这样的单元来拟合像这样的弯曲函数。
那么我们如何设计一个用于建模语言的神经网络呢?请继续关注第二部分,在那里我们将创建一个惊人的神经网络,它可以生成诗歌,翻译语言,甚至编写计算机代码。