1.LLM如何生成我们的文字?
在上一篇中,我们探讨了如何通过调整神经网络的权重,使得大型语言模型(LLM)能够有效区分“花”和“绿叶”。这一过程与生成字符的原理相似。以生成英文字符为例,英文字母总共有26个,我们可以将每个字母映射到一个神经元。因此,输出层将包含26个神经元,其中每个神经元对应一个字母。
在这种结构中,神经网络通过计算每个神经元的激活值来生成输出。输出概率最高的神经元所对应的字母即为最终生成的字符。通过优化网络的权重和结构,我们可以提高模型对字符生成的准确性和流畅性。这种方法不仅适用于英文字符生成,也为处理其他语言的字符提供了基础框架。
假设我们想生成“Humpty Dumpty sat on a wall”这句话。
当输入字符为“Humpty Dumpt”时,模型需要根据该输入预测下一个字符,并将输出的字符解释为“神经网络对输入字符的下一个字符的预测”。为了实现这一点,我们需要调整网络的权重和参数,使得在输入“Humpty Dumpt”时,输出为“y”。为了将字符转换为数字输入,我们首先需要建立一个“字符表”,例如:a=1,b=2,...(为简化理解,此处不区分大小写)。接着,我们将输入的文本转换为字符表中对应的数字。输出层也应按照字母的顺序排列(可以包括空格、句号、逗号等符号),如下图所示:
通过提供字符表中对应的数字,我们可以预测下一个字符。当预测出下一个字符后,可以将其添加到原始输入中,以此循环进行,从而构建一个生成语言的神经网络。然而,这里会出现一个新问题:原有神经网络的输入层包含12个神经元(包括空格)。如果我们在输入层增加一个字符,输入层的神经元数量将会增加,从而改变原有的网络结构,这在实际应用中并不现实。为了解决这个问题,我们可以保持输入层神经元总数不变,方法是去掉首个字母“h”。这样,新的输入层字符将变为“umpty dumpty”。接下来,我们使用这个新的输入层来预测下一个字符(例如空格),然后重复这一过程,最终输出下一个字符“s”。
在这里,输入层的大小即“上下文长度”(当前先进的大模型上下文已经非常长了)。
2.嵌入
调整神经网络的权重可以形成一个相对稳定的模型,同时通过改变输入层字符所映射的数字来降低损失。这意味着我们不仅可以对权重进行"梯度下降",还可以直接调整输入层的数值。
传统的单一数字映射方法存在明显局限性:
为解决这些问题,我们引入"嵌入向量"概念。嵌入向量是一组数字,共同描述符号的隐藏特征。类比于描述"草莓汁":
对于"humpty dumpt",我们采用随机初始化方法,为每个字符分配一个10维向量,使得输入层总共包含120个神经元。通过迭代训练过程,同时调整网络权重和输入层数值,使损失函数最小化。
具体步骤如下:
随机生成12个10维向量(每个字符一个)
训练神经网络,同时优化权重和输入向量
损失最小化后,提取每个字符对应向量的前10个数值
例如:
h的向量:向量的前10个数值
u的向量:向量的第11-20个数值
m的向量:向量的第21-30个数值
...以此类推
这种方法允许网络学习每个字符的内在特征表示,同时保持输入层神经元数量的一致性。通过联合优化权重和输入向量,我们可以获得更富有表现力和语义意义的字符表示。同一长度的向量集合称为矩阵,下图中的矩阵称为"嵌入矩阵"。
找到向量的方法除了随机初始化之外,还可以通过“预训练嵌入”(使用Word2Vec、GloVe等预训练嵌入模型,我们可以利用海量文本语料库自动学习字符/词的向量表示,这些向量不仅仅是简单的数字编码,而是具有深层语义意义的多维空间映射。这种方法能够捕捉词语间微妙的语义关系,使得相似或相关的词语在向量空间中彼此接近,从而为自然语言处理任务提供了一种强大且灵活的特征表示方式,显著提升了机器理解语言的能力)以及“特征工程”(通过手动设计向量,我们可以基于字符的上下文、频率等特征,融入深入的语言理解和领域专业知识,直接将关键先验信息注入模型。这种方法不仅仅依赖统计学习,而是主动构建包含语义、语境和专业属性的向量表示,使得每个维度都具有明确且有意义的特征,从而在特定任务中提供更精准、更可解释的语言表达方式)
3.子词分词器
在当前语言模型中,最常见且有效的嵌入方案是将单词分解为子词,这种方法显著提升了模型的语言理解能力。以"cats"为例,我们可以将其智能拆分为两个词元:"cat"和"s",使模型能更精确地捕捉词形变化和语义关联。分词器的核心功能是将输入文本(如"Humpty Dumpty")转换为离散的词元,并映射为数字索引,便于在嵌入矩阵中快速定位对应的语义向量。关键在于,这个过程不仅仅是机械的拆分,更是一种语义重构,每个词元都携带着独特的语言信息。
值得注意的是,嵌入矩阵中的列索引本身并不重要,重要的是确保同一个词元每次都能检索到一致的语义向量。这种方法实现了语言表示的灵活性和一致性,为深度学习模型提供了强大的语言理解基础。
结合嵌入和子词分词的神经网络如上图所示。
4.自注意力机制
传统的前馈神经网络(Feedforward Network)由多层组成,每一层只与下一层完全连接,层与层之间没有跨层连接。虽然这种结构可以学习到词语之间的权重,但权重是固定的,无法根据上下文动态调整。例如,在句子中,某些词语对预测下一个词更重要,但这些词语可能出现在句子的任何位置,而传统网络无法灵活捕捉这种动态关系。
在传统神经网络中,假设输入序列为
其中 是第个词的嵌入向量。传统前馈网络的输出为:
其中W是固定的权重矩阵,b是偏置项,f是激活函数。由于W是固定的,模型无法根据上下文动态调整权重。
为了让模型能够根据上下文“聚焦”最重要的词语,自注意力机制通过动态调整每个词语的权重,来动态调整对每个词语的关注程度。例如:在句子“Damian had a secret child, a girl, and he had written in his will that all his belongings, along with the magical orb, will belong to ____”中,预测空白处的词(“her”或“him”)依赖于句子中较早出现的“girl”或“boy”。自注意力机制能够动态识别这种依赖关系,无论关键词出现在句子的哪个位置。(在自注意力机制中,我们希望每个词语的权重不仅依赖于当前正在处理的词语,还依赖于我们即将预测的词语。这是因为某些词语对预测下一个词的影响更大,而这种重要性取决于预测目标。然而,在预测之前,我们并不知道下一个词是什么。为了解决这个问题,自注意力机制通常使用当前句子中最后一个已知的词语作为预测的参考点。)
以“humpty dumpty sat”为例,首先将它们的嵌入向量分别记作。接着加权求和,公式表达为:
其中是每个单词嵌入向量的权重。
为了得到这些权重,我们需要构建两个小型神经网络为单词生成对应的向量:首先为构建一个向量,为最后一个已知词构建查询向量,即:
为它们各自神经网络的权重矩阵。
那么:另外,在自注意力机制中,不会直接对嵌入向量()直接加权求和,而是通过另一个小型网络获得的“值”进行加权求和。为每个单词计算一个值:
为这个小型神经网络地权重矩阵
最终公式为:
过程如下图所示:
为使权重相加为1,整合softmax函数
自注意力机制可以表示为:
其中,;;
最终将这些打包为一个块,如下图所示:
5.Softmax函数