GPT 构建图解

AI 摘要从 N-Gram 到现代语言模型,梳理 GPT 背后的核心演进过程与基本直觉。

语言模型雏形

N-Gram

通过二元组,去判断下一个词出现的概率,它写了一个算法,把一句句文字进行分割,然后根据前一个字,计算下一个字的最大概率,从而可以给出一个提示,快速生成一句话。

比如,二元组"我爱"在语料库中出现了3次,而二元组的前缀"我"在语料库中出现了10次。给定"我",下一个词为"爱"的概率为30%。

一般自然语言就已经给了分词工具,比如英文通常使用 NLTK、spaCy,中文使用 jieba。

from collections import defaultdict, Counter

corpus = ["我喜欢吃苹果", "我喜欢吃香蕉", "她喜欢吃葡萄",
          "他不喜欢吃香蕉", "他喜欢吃苹果", "她喜欢吃草莓"]

def tokenize(text):
    return [char for char in text]

def count_ngrams(corpus, n):
    ngrams_count = defaultdict(Counter)
    for text in corpus:
        tokens = tokenize(text)
        for i in range(len(tokens) - n + 1):
            ngram = tuple(tokens[i:i+n])
            prefix = ngram[:-1]
            token = ngram[-1]
            ngrams_count[prefix][token] += 1
    return ngrams_count

bigram_counts = count_ngrams(corpus, 2)

词袋模型

Bag-of-Words 是一种用于文本表示的技术,它将文本看作由单词构成的无序集合,通过统计单词在文本中出现的频次来表示文本。主要用于文本分类、情感分析、信息检索等NLP任务。

词的向量表示

我们把语料库中的词和某些上下文信息,都"嵌入"了向量表示中。这就是为什么词向量也叫作词嵌入。

在自然语言处理中,这意味着一个词的含义可以根据它周围的词推断出来。

Word2Vec

在CBOW模型中,输入是目标词周围的上下文词,输出是目标词。在Skip-Gram模型中,输入则是句子中的一个词,而目标词是它周围的多个词。

词向量的作用就是把表示多个维度的向量,通过训练,映射到相近。

Embedding

通过 nn.Embedding 来实现词嵌入。

RNN的实现

在 RNN 中,前一个细胞单元的状态会转移到下一个细胞单元。RNN模型可以灵活地处理不同长度的输入序列,而不需要改变网络结构。

RNN的问题:

  • 顺序计算:无法并行计算
  • 长距离依赖问题
  • 有限的可扩展性

NPLM 小结

NPLM是一种基于神经网络的语言模型,用于估计语言序列的概率分布。它通过学习上下文中的词来预测下一个词。NPLM在语言模型领域产生了深远的影响,深度学习就登上了NLP的舞台。

随着深度学习模型的不断发展,在循环神经网络之后,人们又将自注意力机制运用到Transformer中,使得模型在捕捉长距离依赖和处理变长序列等问题上表现更出色。

Seq2Seq

Seq2Seq架构的全名是"Sequence-to-Sequence",简称S2S,意为将一个序列映射到另一个序列。它的起源可以追溯到2014年,当时伊利亚·苏茨克维(他后来成为负责研发ChatGPT的首席科学家)等人首次提出了Seq2Seq架构。