“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理和神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
在大型语言模型(LLM)的迷人世界中,模型架构、数据处理和优化常常成为关注的焦点。但解码策略在文本生成中扮演着至关重要的角色,却经常被忽视。
在这篇文章中,我们将通过深入探讨贪婪搜索和束搜索的机制,以及采用顶K采样和核采样的技术,来探索LLM是如何生成文本的。
https://mlabonne.github.io/blog/posts/2022-06-07-Decoding_strategies.html
https://colab.research.google.com/drive/19CJlOS5lI29g-B3dziNn93Enez1yiHk2?usp=sharing
为了开始,我们先举一个例子。我们将文本“I have a dream”输入到GPT-2模型中,并让它生成接下来的五个词(单词或子词)。
'cuda'
ifelse
'cpu'
'gpt2'
'gpt2'
"I have a dream"
'pt'
print
"Generated text: {generated_text}"
句子“I have a dream of being a doctor”似乎是由GPT-2生成的。然而,GPT-2并没有完全生成这句话。
接下来我们将深入探讨各种解码策略,包括贪婪搜索、束搜索以及采用顶K采样和核采样的技术。通过这些策略,我们可以更好地理解GPT-2是如何生成文本的。
人们常常误解认为像GPT-2这样的大型语言模型(LLM)直接生成文本。实际上并非如此。相反,LLM会计算对其词汇表中每个可能的词元分配的分数,这些分数称为logits。为了简化说明,以下是这个过程的详细分解:
首先,分词器(在本例中是字节对编码)将输入文本中的每个词元转换为相应的词元ID。然后,GPT-2使用这些词元ID作为输入,尝试预测下一个最有可能的词元。最终,模型生成logits,这些logits通过softmax函数转换为概率。
贪婪搜索是一种解码方法,在每一步中选择最可能的词元作为序列中的下一个词元。简单来说,它在每个阶段只保留最可能的词元,舍弃所有其他潜在选项。以我们的例子为例:
尽管这种方法听起来很直观,但需要注意的是,贪婪搜索是短视的:它只考虑每一步中最可能的词元,而不考虑对整个序列的整体影响。这个特性使得它速度快且高效,因为它不需要跟踪多个序列,但也意味着它可能错过那些包含稍微不那么可能的下一个词元的更好序列。
if
return
# Get the predicted next sub-word (here we use top-k search)
# Compute the score of the predicted token
# Add the predicted token to the list of input ids
# Add node and edge to graph
'tokenscore'
'token'"_{length}"
# Recursive call
return
if
return
# Get the predicted next sub-word (here we use top-k search)
if
'greedy'
elif
'top_k'
elif
'nucleus'
forin
# Compute the score of the predicted token
'cumscore'
# Add the predicted token to the list of input ids
# Add node and edge to graph
'tokenscore'
'cumscore'
'sequencescore'
'token'"_{length}_{j}"
# Recursive call
顶K采样是一种利用语言模型生成的概率分布,从最可能的前K个选项中随机选择一个词元的技术。
假设我们有 𝑘=3,四个词元A、B、C和D,具有以下概率:
在顶K采样中,词元D会被忽略,算法将以以下概率输出:
这种方法确保我们优先考虑最可能的词元,同时在选择过程中引入了一定的随机性。
另一种引入随机性的方法是温度的概念。温度𝑇是一个从0到1的参数,它影响softmax函数生成的概率,使最可能的词元更具影响力。在实践中,它仅仅是将输入的logits除以一个我们称之为温度的值:
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。