波波算法笔记

Bob Peng

细说AI大模型采样方式

2025-03-31
细说AI大模型采样方式

细说AI大模型采样方式

贪婪解码(Greedy Decoding)

Greedy Decoding在每个时间步选择当前条件概率最高的词语作为输出,直到生成结束。

这种方法简单高效,每个时间步只需计算当前条件概率最高的词语,因此计算速度较快。但是由于每个时间步只考虑当前条件概率最高的词语,贪婪解码可能会陷入局部最优解,而无法获得全局最优解。这可能导致生成的文本缺乏多样性或不准确。

贪婪解码的一种扩展,通过在每个时间步保留多个候选序列来克服贪婪解码的局部最优问题。

在每个时间步保留概率最高的前几个候选词语,然后在下一个时间步基于这些候选词语继续扩展,直到生成结束。

温度采样(Temperature Sampling)

温度参数采样(Temperature
Sampling)常用于基于概率的生成模型,如语言模型。它通过引入一个称为“温度”(Temperature)的参数来调整模型输出的概率分布,从而控制生成文本的多样性。

看代码发现实际上temperature起到缩放logits的作用,由于值小于1,那么就是对logits进行放大。这样就使得,温度越低,放大量就会越大,logits分布会更加尖锐。导致出现概率大的词概率放大,输出多样性就会低。

probabilities = [0.7, 0.2, 0.1],这意味着第一个词有70%的概率被选择,第二个词有20%的概率,第三个词有10%的概率。

高温:增加随机性,生成的文本更多样化。但可能不太连贯 低温:减少随机性,生成的文本更一致和可预测。

import numpy as np  
  
def temperature_sampling(logits, temperature=1.0):  
    # 将logits缩放  
    scaled_logits = logits / temperature  
    # 计算缩放后的概率分布  
    exp_logits = np.exp(scaled_logits)  
    probabilities = exp_logits / np.sum(exp_logits)  
    # 根据新的概率分布进行采样  
    return np.random.choice(len(probabilities), p=probabilities)  

Top-K采样(Top-K Sampling)

Top-K 采样(在每个时间步选择条件概率排名前 K 的词语,然后在这 K
个词语中进行随机采样。这种方法既能保持一定的生成质量,又能增加文本的多样性,并且可以通过限制候选词语的数量来控制生成文本的多样性。

相对于温度采样,它使用的topk的tokens,避免了小概率的不适合的词出现。

核采样(Top-P Sampling)

Nucleus Sampling(核采样),也被称为Top-p Sampling旨在在保持生成文本质量的同时增加多样性。这种方法可以视作是Top-K
Sampling的一种变体,它在每个时间步根据模型输出的概率分布选择概率累积超过给定阈值p的词语集合,然后在这个词语集合中进行随机采样。这种方法会动态调整候选词语的数量,以保持一定的文本多样性。

这种采样会更好一点,相较于topk

topk可能包含概率较低的词[0.99,0.01]k=2. topp[0.99,0.01]当p=0.9,会跳过0.01.

总结

上面介绍的几种采样方法各有特点,适用于不同的应用场景和需求。

贪婪解码是一种简单直接的方法,适用于速度要求较高的情况,但可能导致生成文本缺乏多样性。束搜索通过保留多个候选序列来克服贪婪解码的局部最优问题,生成的文本质量更高,但计算开销较大。Top-K
采样和核采样可以控制生成文本的多样性,适用于需要平衡质量和多样性的场景。温度参数采样则可以根据温度参数灵活调节生成文本的多样性,适用于需要平衡多样性和质量的任务。