🤖你的大脑 vs ChatGPT丨语言模型『思考』全解密

223 阅读11分钟

引用:

入门经典必读

ChatGPT 是在做什么,为什么它有效?

writings.stephenwolfram.com/2023/02/wha…

部分插图来自网络/引用文章,侵删

什么是模型

一句话,通过输入参数,通过函数/计算的组合推测结果,使得不同入参的结果尽量接近正确答案

举例

在物理领域,如果我们希望去计算一个小球自由落体时,再某个时间段的状态(高度,速度,加速度)我们可以通过牛顿定律计算,而牛顿定律其实就是对运动学领域的物理建模。我理解,我们套入的这个公式其实就是科学家通过数据统计和推算(不断修正的数学预测)出的一个模型。

再比如,我们使用 python 做数据分析,对大量的数据去尝试拟合一个函数,其实就是对这对点进行建模,建模的结果就是函数本身。得到了函数之后(模型),我们就能够通过函数预测没有出现在训练集中的结果。从而将特解推广到通解。

抽象

就拿 python 数据分析的例子来说,我们计算出的函数就是模型的体现,我们可以通过改变函数的系数来更改函数的调整,从而令函数更加接近现实结果。再 ChatGPT 等 LLM 大模型中, 这些“系数”,就是模型的“参数”,比如 GPT 4.0 大概有 1.8 万亿个参数。在训练的过程中,不断调整这些参数,得到一个可以解决众多问题的“函数”

这里的函数,并非真的函数,LLM 实现的内容无法用一个明确的函数体现,或者说我们还没有找到能够通过严谨的数学表达,来描述 LLM 的推理过程。

其实我们人类的大脑思考过程也是一个模型,对现实生活的(入参)做出反应。某种程度上来说,相比函数模型,这个“模型”和 LLM 更加相似。我们脑子里的神经元其实和神经网络的的一个节点相似(事实上神经网络就是模仿生物神经网络设计的)。同样的,对于大脑的思考过程,我们也是黑盒状态。或许当哪天,我们能够跟踪/归纳出 LLM 的推理过程,就离完全理解人类大脑不远了。

机器学习

训练策略和反馈机制

神经网络也是机器学习的领域的产物,机器学习的训练核心方法:

  1. 监督学习。比如著名的线性回归,通过残差判断拟合程度,调整参数方向。需要有标记的训练数据参与,才能判断结果与真实值之间的举例。此外还有(SVM,决策树,神经网络)
  2. 无监督学习。给不带标签的数据,让机器自己去决定如何判断和归类数据,发现数据中隐藏模式。
  3. 强化学习 通过试错和奖励机制调整模型。

那么 LLM 是什么学习呢? 答案: 无监督 + 有监督

预训练

无监督过程其实就是预训练 pretraining过程,给模型大量的数据,让他自己找出对应的特征。至于特征是什么,我们不关心。这个过程也可以叫做自监督,但是监督的标准是模型自己发现的,所以也可以认为是无监督的。

微调

有监督过程主要是对模型做微调Fine-tuning

  1. 给出问题答案对,让模型回答与问题具有强相关。
  2. 领域微调,通过人类对答案进行评分,来让回答更加符合人类需要的,或者领域偏好的。

强化学习

  1. 基于人类反馈的强化学习 (reinforcement learning form human)
  2. 偏好数据优化(不用奖励模型)
  3. 群组相对策略优化,比较不同输出的相对顺序,避免传统 RL 的不稳定性

神经网络

神经网络是机器学习的子领域

神经网络中包含了大名鼎鼎的多层感知机和深度学习。

神经网络的原理和人类的大脑思考过程类似,那么我就拿我们人脑的思考过程来理解神经网络。

举例 1

比如我们需要判断一个图像是不是三角形,我们看到之后,大脑会去分析这个图形有几个“角”,如果有三个角,而且边都是直线,那么他就是三角形。

而机器的实现方式也类似,首先通过将图片做预处理,判断出这个哪些是边,哪些是角,然后判断角/边的特征,如果符合“三角形”的特征,那么他就是三角形。

这是一个很简单的例子,似乎还用不上神经网络,让我们来一个更难的。

举例2

给出一张动物的照片,判断这是什么动物。

和判断三角形一样,人类通过动物的特征,比如说有角,耳朵尖,腿长等来区分猫和狗或者其他动物。但是你会发现,如果只知道这些,似乎你还不能判断出这个动物。需要更多的细节,你的大脑似乎自动处理的这部分,只要你见过这个动物,很大概率你就能够判断出来,并非只是通过特征判断,这是最表层的。在这些明显的特征之外,还有很多无法直接归纳的特征,你的大脑自动且神奇的帮你处理了。

那么机器是如何实现的这样的操作的呢?这时候就需要搬出神经网络了,神经网络首先是一个网络,他可以长成下面这样。我们给机器以足够多的“猫”,“狗”的图片,让机器自己去调整每一个节点间边的权重,总结出一套规律来判断动物。浅层的特征判断可能是“耳朵”,“鼻子”,不过随着深度的递增,特征逐渐变得不可归纳。就是这么神奇,机器就得到的最终的结果。


随着神经网络的隐藏层数增加,神经网络就会进化成深度学习形成的复杂神经网络,比如 “卷积神经网络(CNN)”

输入图像 → 卷积层 → 激活函数(如ReLU) → 池化层 → ...(重复)→ 全连接层 → 输出分类

我们这里不更深的讨论机器学习,我们只需要有个大概的了解即可。

核心机制

LLM 全称是 Large Language Model 。 进行训练的是语言,更加准确一点是 token。LLM 通过预测当前语句可能的下一个 token 是什么来组成通顺的句子。通过 tranformer 架构来基于语义和频率判断下一个 token。

Token

token 不一定是一个完整的词语,可能 apple,是两个 token ,也可能 eat apple 是一个 token。由于 LLM 用 token 计数,所以才出现了判断字母数量可能会出错的问题。

Transformer

本质上,LLM 是根据语料中 Token 在某个地方出现的频率来预测下一个单词的。

比如 eat ,我们可以统计, a,t 再 e 候分别出现的频率,然后选择频率高的,最后组成句子。更进一步,LLM 训练时使用 2-gram -> n-gram 的方案。预测两个字母的组合在上一个组合候出现的频率。

1-gram 得出一个 1 维频率表。2-gram 得出一个 2 维频率矩阵,以此类推,我们推广到 n-gram,得出一个 n 维矩阵。根据这个矩阵得到的预测句子会越来越接近正常语句。

再 pretraning 无监督训练中,LLM 会给自己以被遮挡一部分的语料(Token),然后用这已知语料尝试去预测整个句子,然后不断修改正。

有思考的同学可能已经发现了,这样子得出的语句顶多算一个造句,还是没有语义上的关联。为了让 LLM 理解 Token 的含义,并建立起 token 之间的语义关系,在理解语义的基础上去预测答案,就要搬出大名鼎鼎的 Transformer 模型了。其核心组件包括:

  1. 注意力机制 Self Attention

计算输入的序列中每一个 Token 与其他 Token 的相关性权重,动态的捕捉上下文依赖。

  1. 位置编码 Position Encoding

添加位置信息,Transformer 原本无法感知词序

  1. 前馈神经网络 Feed-Forward Network

优化注意力机制的手段

  1. 残差链接和层归一化

稳定训练过程的手段

梯度下降

在训练一个模型的时候,不论是通过无监督还是有监督实现的,都需要“告诉模型”这个结果对不对,要如何调整。

用线性回归最为最小化例子,我们拟合出一个函数,图像体现为一条曲线,这条曲线于各个点之间存在举例,所有点到这条线(模型)之间的距离之和用 残差 来表示。

一维

假设这个函数只有一个系数,系数的变化会对应一个残差的变化,这个变化对应的函数叫做 损失函数 。x 表示系数取值, y 表示残差大小。我们需要找到一个残差最小的(最拟合)的系数。学过高中数学的同学就知道了,我们可以通过求一阶导,求得极值,进而求得最值

二维

如果这个函数有两个参数,那么损失函数在图像上就从一条曲线变成了一个曲面,这个曲面类似于地形,我们可以绘制他的等高线图。通过等高线图。此时残差最小处就是这块地形的最低洼。那么如何求到最低洼呢?通过对当前系数所对应的点进行求各个方向的偏导,进而得出梯度。用大白话说就是下降最快的那个方向。用地理人的话说就是水流的方向。求梯度要求函数处处可导,这很好实现,不过多赘述。

推广

同理,我们可以将参数推广到 n 个,同样可以用求梯度的方式来找到优化的方向。而这个损失函数的“损失”是由自监督/有监督学习的指标确定的。沿着梯度方向逐步更新系数,进而降低残差。

另外,细心的同学可能发现了,我们通过梯度下降找到的最低点可能只是一个极值而非最值,比如二维曲面我们可能找到一个“山湖”。经过众多科学家的验证,这种情况只会在低维情况下出现,在高维情况下,通过梯度下降总是能够收敛到最值处。

# 梯度下降伪代码示例
def gradient_descent(learning_rate, epochs):
    for _ in range(epochs):
        grads = compute_gradients(loss, params)
        params -= learning_rate * grads

反向传播

现在我们已经知道了要使用梯度下降来更新参数(系数),但是我们现在只知道预期结果与真实结果之间的更新方向(最后一步到输出层)。在神经网络中我们提到,他是基于多层感知机衍生而来的,所以他有很多个中间层。如何从输出层反推到输入层的参数变化,这就是反向传播所做的。

一句话,反向传播就是依赖静态数据,基于链式法则,将真实结果与预期结果之间的差距体现到参数上。最终实现模型的调整。

输入数据 → 前向计算预测值 → 计算损失函数 → 反向求导链式法则 → 参数更新

强化学习

个人认为,强化学习和梯度下降+反向传播有相似之处。

强化学习通过与环境交互或者环境奖励,通过计算策略梯度实现奖励最大化。

  • 返回可以是稀疏而且延迟的。
  • 最大化奖励
  • 模型会去探索未知动作以发现更高的奖励

梯度+反向通过损失函数直接量化误差,通过反向传播将真实结果和预测结果的预期调整传播到输入层。

  • 反馈及时且明确。

  • 最小化损失

  • 损失是由已有数据产生的,最消化当前已有内容的损失

小弟才疏学浅,若有错漏,各位读者多多指教。