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架构。