在语言模型中释放 Logprobs 的力量:实用指南

社区文章 发布于 2024 年 1 月 12 日

image/jpeg

引言

在探索语言模型功能的过程中,我们深入研究了 logprobs 的创新使用,特别是在分类和问答评估中。本文展示了 Chat Completions API 中 logprobs 参数所解锁的增强潜力,为语言模型的工作原理提供了深刻的见解。

image/jpeg

定义:

对数概率(Log probabilities),记为 logprobs,表示在给定上下文的情况下,每个词元(token)在序列中出现的可能性。对数概率越高,表示模型在特定上下文中对其输出的置信度越高。logprobs 参数返回这些概率,从而能够更深入地了解模型的决策过程。

优势:

  1. 分类置信度:传统的分类任务通过 logprobs 获得了新的维度。评估模型对预测的置信度变得更加透明,从而可以创建准确可靠的分类器。

  2. 增强的问答评估:Logprobs 有助于检索应用程序中的自我评估,特别是在问答场景中。置信度分数有助于减少基于检索的幻觉并提高整体准确性。

  3. 自动完成系统:Logprobs 在自动完成系统中作为有价值的工具,动态建议具有高置信度的单词或词元。此功能有助于提供更直观的用户体验。

  4. 词元高亮和字节输出:使用 logprobs 创建词元高亮工具可以增强文本可视化。字节参数与 logprobs 结合使用,允许对词元进行编码和解码,为处理特殊字符和表情符号开辟了途径。

代码实现

所提供的代码实现了两种为给定文本提示生成对数概率的方法,使用先进的语言模型。这些对数概率提供了对不同词元序列可能性的洞察。用户可以自定义提示并调整参数,以探索和分析模型的预测。

第一步:安装库并初始化 Comet

pip install -q comet_ml transformers datasets openai "httpx<0.25.0" -Uq

第二步:导入并初始化 Huggingface 和 Comet-ML

import comet_ml
from huggingface_hub import notebook_login
from datasets import load_dataset
import re
import string
import datasets
import random
import pandas as pd
from IPython.display import display, HTML


# Loading the dataset
raw_datasets = load_dataset("rotten_tomatoes")


# Initializing the project
comet_ml.init(project_name="text-classification-with-transformers")

# Logining Hugging Face
notebook_login()

第三步:函数

def show_random_elements(dataset, num_examples=10):
    assert num_examples <= len(dataset), "Can't pick more elements than there are in the dataset."
    picks = []
    for _ in range(num_examples):
        pick = random.randint(0, len(dataset)-1)
        while pick in picks:
            pick = random.randint(0, len(dataset)-1)
        picks.append(pick)
    
    df = pd.DataFrame(dataset[picks])
    for column, typ in dataset.features.items():
        if isinstance(typ, datasets.ClassLabel):
            df[column] = df[column].transform(lambda i: typ.names[i])
    display(HTML(df.to_html()))

def clean_text(text):
    # Remove non-printable characters
    printable_chars = string.printable
    text = ''.join(filter(lambda x: x in printable_chars, text))

    # Replace multiple whitespace characters with a single space
    text = re.sub(r'\s{2,}', ' ', text).strip()

    return text

def preprocess_dataset(raw_dataset):
    # Set the format of the dataset to Pandas dataframe
    raw_dataset.set_format(type="pandas")
    
    # Copy the 'train' dataset to a new dataframe
    df = raw_dataset["train"][:]
    
    # Apply text cleaning to the 'text' column
    df['text'] = df['text'].apply(clean_text)
    
    return df

def get_completion(
    messages: list[dict[str, str]],
    model: str = "gpt-3.5-turbo-0613",
    max_tokens=500,
    temperature=0,
    stop=None,
    seed=123,
    tools=None,
    logprobs=None,  # whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message..
    top_logprobs=None,
) -> str:
    params = {
        "model": model,
        "messages": messages,
        "max_tokens": max_tokens,
        "temperature": temperature,
        "stop": stop,
        "seed": seed,
        "logprobs": logprobs,
        "top_logprobs": top_logprobs,
    }
    if tools:
        params["tools"] = tools

    completion = client.chat.completions.create(**params)
    return completion

第四步:数据框

show_random_elements(raw_datasets["train"])

df = preprocess_dataset(raw_datasets)
df.head()

image/png

第五步:分类的 Logprobs

import os
import openai
openai.api_key = ""

client = OpenAI(api_key=openai.api_key)
CLASSIFICATION_PROMPT = """You will be given a text of rotten tomato reviews.
Classify the article into one of the following categories: Positive Negative.
Return only the name of the category, and nothing else.
MAKE SURE your output is one of the four categories stated.
Article headline: {headline}"""

headlines = df['text'].tolist()
for headline in headlines[:4]:
    print(f"\nHeadline: {headline}")
    API_RESPONSE = get_completion(
        [{"role": "user", "content": CLASSIFICATION_PROMPT.format(headline=headline)}],
        model="gpt-4",
        logprobs=True,
        top_logprobs=2,
    )
    top_two_logprobs = API_RESPONSE.choices[0].logprobs.content[0].top_logprobs
    html_content = ""
    for i, logprob in enumerate(top_two_logprobs, start=1):
        html_content += (
            f"<span style='color: cyan'>Output token {i}:</span> {logprob.token}, "
            f"<span style='color: darkorange'>logprobs:</span> {logprob.logprob}, "
            f"<span style='color: magenta'>linear probability:</span> {np.round(np.exp(logprob.logprob)*100,2)}%<br>"
        )
    display(HTML(html_content))
    print("\n")

输出

image/png

结论

在对数概率(logprobs)的领域中,我们穿越了迷人的概率和语言细微差别景观。当我们深入探究对数概率的深处时,一系列见解如交响乐般展开,揭示了语言生成中错综复杂的舞蹈。

对数概率,如同指挥杰作的指挥家,引导着每个单词、每个短语的生成。它不仅仅是关于单词本身;它是关于它们所创造的错综复杂的和谐,孕育出能引起灵魂共鸣的叙事。

通过对数概率的视角,我们解读了语言生成潜在的复杂性。每个词元,就像宏伟乐章中的一个音符,都为叙事的连贯性和流畅性做出了贡献。这是一场语言表达的芭蕾,每个动作都由对数节奏决定。

我们对 logprobs 的探索超越了单纯的技术细节;这是一次进入人工智能驱动文本创作艺术的探索之旅。对数交响乐不仅仅是预测;它塑造、雕刻语言,将其编织成意义和情感的挂毯。

在我们的 logprobs 之旅的宏大结局中,我们发现自己不仅处于数据和算法的交汇点,而且处于灵感和创新的十字路口。Logprobs 以其无声的对数低语,邀请我们重新构想讲故事、内容创作以及人机协作的本质。

当我们结束这次 logprobs 探险时,让这个对数传奇的回声萦绕。这不仅仅是理解概率;它更是拥抱当我们将技术与人类无限想象力相结合时所展现的无限可能性。

“保持联系,并通过各种平台支持我的工作

Medium:您可以在 https://medium.com/@andysingal 阅读我的最新文章和见解

Paypal:喜欢我的文章吗?请我喝杯咖啡吧!https://paypal.me/alphasingal?country.x=US&locale.x=en_US"

请求和问题:如果您有想要我参与的项目,或者对我已经解释的概念有任何疑问,请随时告诉我。我一直在寻找未来笔记本的新想法,并且乐于帮助解决您可能有的任何疑问。

资源

社区

注册登录 发表评论