浅谈7个大语言模型生成参数详解:原理、调优与落地看法

vllm中关于presence_penalty、frequency_penaltyrepetition_penalty的具体操作(对logits):

def apply_repetition_penalties_torch(
        logits: torch.Tensor, prompt_mask: torch.Tensor,
        output_mask: torch.Tensor, repetition_penalties: torch.Tensor) -> None:
    repetition_penalties = repetition_penalties.unsqueeze(dim=1).repeat(
        1, logits.size(1))
    # If token appears in prompt or output, apply, otherwise use 1.0 for no-op.
    penalties = torch.where(prompt_mask | output_mask, repetition_penalties,
                            1.0)
    # If logits are positive, divide by penalty, otherwise multiply by penalty.
    scaling = torch.where(logits > 0, 1.0 / penalties, penalties)
    logits *= scaling
 
 
# Apply repetition penalties as a custom op
from vllm._custom_ops import apply_repetition_penalties
apply_repetition_penalties(logits, prompt_mask, output_mask,
                           repetition_penalties)
 
# We follow the definition in OpenAI API.
# Refer to https://platform.openai.com/docs/api-reference/parameter-details
logits -= frequency_penalties.unsqueeze(dim=1) * output_bin_counts
logits -= presence_penalties.unsqueeze(dim=1) * output_mask
    return logits
 

对于repetition_penalty而言,

若新token1在prompt或output已经出现过时,降低logits  注意(penalty>=1)

logits>0时,logits = logits/penalty

logits<0时,logits = logits*penalty

对frequency_penalty而言,

若新token1在prompt或output已经出现过时,降低logits  注意(penalty>=1)

logits = logits - c*freq(token1),其中c为配置的frequency_penalty的值。

presence_penalty而言,

若新token1在prompt或output已经出现过时,降低logits  注意(penalty>=1)

logits = logits - c,其中c为配置的presence_penalty的值。

更多推荐