自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

人工智能生成文本檢測在實(shí)踐中使用有效性探討

人工智能
人工智能輔助撰寫文章的技術(shù)現(xiàn)在無處不在!ChatGPT已經(jīng)解鎖了許多基于語言的人工智能應(yīng)用程序,人工智能在任何類型的內(nèi)容生成中的使用都已經(jīng)達(dá)到了以前前所未有的高度。

人工智能輔助撰寫文章的技術(shù)現(xiàn)在無處不在!ChatGPT已經(jīng)解鎖了許多基于語言的人工智能應(yīng)用程序,人工智能在任何類型的內(nèi)容生成中的使用都已經(jīng)達(dá)到了以前前所未有的高度。

在諸如創(chuàng)意寫作之類的工作中,人們被要求創(chuàng)造自己的內(nèi)容。但是由于人工智能在這些任務(wù)中的普及和有效性,很人工智能很有可能會被濫用。所以能夠獲得可靠和值得信賴的工具來檢測人工智能生成的內(nèi)容是一個非常重要的問題。所以本文將提供構(gòu)建這樣一個工具的思路和技術(shù)規(guī)范。

文本檢測的思路

我們的目標(biāo)是“像GPT這樣的大語言模型有多大可能生成全部或部分文本?”

所以我們就要從日常入手,比如:一個典型的日常場景,你母親對你說下面這句話的可能性有多大?

親愛的,請?jiān)谕砩?點(diǎn)前上床睡覺;親愛的,請?jiān)谕砩?1點(diǎn)后上床睡覺。

我們會猜測前者比后者更有可能發(fā)生,因?yàn)槟阋呀?jīng)建立了對周圍世界的理解,并對哪些事件更有可能發(fā)生有了感覺。

這正是語言模型的工作原理。語言模型學(xué)習(xí)周圍世界的一些東西,他們學(xué)會預(yù)測給出一個不完整句子的下一個符號或單詞。

在上面的例子中,如果你被告知你的媽媽正在說某事,而到目前為止她說的是“親愛的,請上床睡覺”,那么這個句子最有可能的延續(xù)是“8:00 pm之前”,而不是“11:00 pm之后”。因?yàn)楦改付紩尯⒆釉缢X,對吧

語言模型的困惑度是什么?

困惑:困惑的狀態(tài);混亂;不確定性。

在現(xiàn)實(shí)世界中如果你遇到意想不到的情況,例如:當(dāng)你在路上開車時,看到一個紅綠燈,那么你就不太可能感到困惑,而如果你看到一只野生動物穿過城市的街道,那么你肯定就會產(chǎn)生很大的疑問。

對于一個試圖預(yù)測句子中下一個單詞的語言模型,如果它使用一個我們不期望的單詞來完成句子,我們說這個模型會讓我們感到困惑。

具有低困惑的句子看起來像下面這樣

1、It’s a sunny day outside.

2、I’m sorry I missed the flight and was unable to reach the national park in time.

具有高度困惑的句子看起來像下面這樣:

1、It’s a bread day outside.

2、I’m convenient missed light outside and could not reach national park.

如何計(jì)算語言模型所做預(yù)測的困惑度呢?

困惑度 perplexity

語言模型的復(fù)雜性與能夠毫不意外地預(yù)測句子的下一個符號(單詞)的概率有關(guān)。

假設(shè)我們用包含6600個記號的詞匯表訓(xùn)練一個語言模型,讓模型預(yù)測句子中的下一個單詞。假設(shè)選擇這個單詞的可能性是5/6600(即不太可能)。它的困惑度是概率6600/5 = 1320的倒數(shù),這表示困惑非常高。如果選擇這個單詞的可能性是6000/6600,那么困惑度將是6600/6000 = 1.1,這說明困不太困惑。

困惑度的計(jì)算公式如下:

為了保證數(shù)值的穩(wěn)定性,我們可以用對數(shù)函數(shù)來定義它。

模型的訓(xùn)練和驗(yàn)證困惑度可以直接從batch或epoch損失中計(jì)算出來。但是無法計(jì)算預(yù)測的困惑度,因?yàn)樗竺總€預(yù)測都有一組基本的真值標(biāo)簽。

讓我們假設(shè)變量probs是一個張量,它包含了語言模型在序列中那個位置預(yù)測基真值的概率。

可以使用此代碼計(jì)算每個困惑度。

token_perplexity = (probs.log() * -1.0).exp()
 print(f"Token Perplexity: {token_perplexity}")

使用此代碼可以計(jì)算樣本的困惑度。

sentence_perplexity = (probs.log() * -1.0).mean().exp().item()
 print(f"Sentence Perplexity: {sentence_perplexity:.2f}")

以下代碼可以計(jì)算給定一個句子的每個單詞的概率。

def get_pointwise_loss(self, inputs: List[str], tok):
    self.model.eval()
    all_probs = []
    with torch.inference_mode():
        for input in inputs:
            ids_list: List[int] = tok.encode(input).ids
            # ids has shape (1, len(ids_list))
            ids: Torch.Tensor = torch.tensor(ids_list, device=self.device).unsqueeze(0)
 
            # probs below is the probability that the token at that location
            # completes the sentence (in ids) so far.
            y = self.model(ids)
            criterion = nn.CrossEntropyLoss(reductinotallow='none', ignore_index=0)
 
            # Compute the loss starting from the 2nd token in the model's output.
            loss = criterion(y[:,:,:-1], ids[:,1:])
 
            # To compute the probability of each token, we need to compute the
            # negative of the log loss and exponentiate it.
            loss = loss * -1.0
 
            # Set the probabilities that we are not interested in to -inf.
            # This is done to make the softmax set these values to 0.0
            loss[loss == 0.0] = float("-inf")
 
            # probs holds the probability of each token's prediction
            # starting from the 2nd token since we don't want to include
            # the probability of the model predicting the beginning of
            # a sentence given no existing sentence context.
            #
            # To compute perplexity, we should probably ignore the first
            # handful of predictions of the model since there's insufficient
            # context. We don’t do that here, though.
            probs = loss.exp()
            all_probs.append(probs)
        #
    #
    return all_probs
 #

上面就是最基本的大語言模型的工作原理,以及我們?nèi)绾斡?jì)算每個單詞和每個句子的困惑度,下面我們就可以利用這些信息來構(gòu)建一個可以檢測某些文本是否是人工智能生成的工具。

檢測ai生成的文本

為了檢查文本是否是人工智能生成的,我們需要將句子的困惑度與模型的困惑度進(jìn)行比較,該困惑度由一個模糊因子alpha縮放。如果句子的困惑程度超過模型縮放的困惑程度,那么它可能是人類編寫的文本(即不是人工智能生成的)。否則,它可能是人工智能生成的。如果句子的困惑度小于或等于模型的縮放訓(xùn)練困惑度,那么它很可能是使用該語言模型生成的,但我們不能很確定。這是因?yàn)檫@段文字有可能是人類寫的,而它恰好是模型也可以生成的。因?yàn)槟P褪窃诖罅咳祟悤鴮懙奈谋旧线M(jìn)行訓(xùn)練的,所以在某種意義上,該模型就代表了“普通人的寫作”。

上式中的Ppx (x)表示輸入“x”的困惑度。

讓我們看看人類編寫的與 ai生成文本的示例。

我們的Python代碼可以根據(jù)句子中的每個標(biāo)記相對于模型的困惑度為其上色。如果我們不考慮它的困惑,第一個符號總是認(rèn)為是手寫的(因?yàn)槟P鸵残枰谝粋€輸入才可以進(jìn)行后續(xù)的輸出)。困惑度小于或等于模型縮放困惑度的單詞用紅色表示,表明它們可能是ai生成的,而困惑度更高的令牌用綠色表示,表明它們肯定不是ai生成的。

句子前方括號中的數(shù)字表示使用語言模型計(jì)算出的句子的復(fù)雜程度。有些單詞是半紅半藍(lán)的。這是由于我們使用了子詞標(biāo)記器。

下面是生成上述HTML的代碼。

def get_html_for_token_perplexity(tok, sentence, tok_ppx, model_ppx):
    tokens = tok.encode(sentence).tokens
    ids = tok.encode(sentence).ids
    cleaned_tokens = []
    for word in tokens:
        m = list(map(ord, word))
        m = list(map(lambda x: x if x != 288 else ord(' '), m))
        m = list(map(chr, m))
        m = ''.join(m)
        cleaned_tokens.append(m)
    #
    html = [
        f"<span>{cleaned_tokens[0]}</span>",
    ]
    for ct, ppx in zip(cleaned_tokens[1:], tok_ppx):
        color = "black"
        if ppx.item() >= 0:
            if ppx.item() <= model_ppx * 1.1:
                color = "red"
            else:
                color = "green"
            #
        #
        html.append(f"<span style='color:{color};'>{ct}</span>")
    #
    return "".join(html)
 #

正如我們從上面的例子中看到的,如果一個模型檢測到一些文本是人工手寫的,那么它肯定是人工手寫的,但如果它檢測到文本是人工智能生成的,那么它就有可能不是人工智能生成的。為什么會這樣呢?讓我們看看下面!

假陽性

語言模型是在人類寫的大量文本上訓(xùn)練的。一般來說,很難發(fā)現(xiàn)某件東西是否是由特定的人寫的。該模型用于訓(xùn)練的輸入包括許多不同的寫作風(fēng)格,是由不同的人完成的。這使得模型學(xué)習(xí)許多不同的寫作風(fēng)格和內(nèi)容。很有可能你的寫作風(fēng)格與模型訓(xùn)練的某些文本的寫作風(fēng)格非常接近。這就會產(chǎn)生誤報(bào),也是為什么模型不能確定某些文本是人工智能生成的。但是該模型可以確定一些文本是人為生成的。

”O(jiān)penAI最近宣布將停止其用于檢測ai生成文本的工具,理由是準(zhǔn)確率低“(https://tech.hindustantimes.com/tech/news/openai-kills-off-its-own-ai-text-detection-tool-shocking-reason-behind-it-71690364760759.html)。這條新聞就說明了上面的問題。

原始版本的人工智能分類器工具從一開始就存在一定的局限性和不準(zhǔn)確性。用戶需要手動輸入至少1000個字符的文本,然后OpenAI對其進(jìn)行分析,將其分類為人工智能或人類編寫的文本。該工具的表現(xiàn)并不理想,因?yàn)樗徽_識別了26%的人工智能生成的內(nèi)容,并且在大約9%的情況下錯誤地將人類編寫的文本標(biāo)記為人工智能。

以下是OpenAI的博客文章。與本文中提到的方法相比,他們似乎使用了不同的方法。

我們的分類器是一個語言模型,對同一主題的人類編寫文本和人工智能編寫文本的數(shù)據(jù)集進(jìn)行微調(diào)。從各種各樣的來源收集了這個數(shù)據(jù)集,我們認(rèn)為這些數(shù)據(jù)是由人類編寫的,比如預(yù)訓(xùn)練數(shù)據(jù)和人類對提交給InstructGPT的提示。將每篇文章分為提示和回復(fù)。根據(jù)這些提示,從我們和其他組織訓(xùn)練的各種不同的語言模型中生成響應(yīng)。對于我們的web應(yīng)用程序,我們調(diào)整置信閾值以保持低誤報(bào)率;換句話說,如果分類器非常自信,我們只會將文本標(biāo)記為可能是人工智能編寫的。

GPTZero是一個流行的人工智能生成文本檢測工具。似乎GPTZero使用perplexity 和Burstiness 來檢測人工智能生成的文本?!癇urstiness ”指的是某些單詞或短語在文本中突發(fā)性出現(xiàn)的現(xiàn)象。如果一個詞在文本中出現(xiàn)過一次,它很可能會在很近的地方再次出現(xiàn)?!?/span>

GPTZero聲稱有非常高的成功率。根據(jù)GPTZero常見問題解答,“在0.88的閾值下,85%的人工智能文檔被歸類為人工智能,99%的人類文檔被歸類為人類?!?/span>

方法的通用性

本文中提到的方法不能很好地一般化。如果您有3個語言模型,例如GPT3、GPT3.5和GPT4,那么必須在所有3個模型中運(yùn)行輸入文本,并檢查它們的困惑度,以查看文本是否由其中任何一個生成。這是因?yàn)槊總€模型生成的文本略有不同,并且它們都需要獨(dú)立地評估文本,以查看是否有任何模型生成了文本。

截至2023年8月,隨著世界上大型語言模型的激增,人們似乎不太可能檢查任何一段文本是否來自世界上任何一個語言模型。

下面的例子顯示了要求我們的模型預(yù)測ChatGPT生成的句子是否是人工智能生成的結(jié)果。正如您所看到的,結(jié)果喜憂參半。

這種情況發(fā)生的原因有很多。

1、我們的模型是在非常少的文本上訓(xùn)練的,而ChatGPT是在tb的文本上訓(xùn)練的。

2、與ChatGPT相比,我們的模型是在不同的數(shù)據(jù)分布上訓(xùn)練的。

3、我們的模型只是一個GPT模型,而ChatGPT針對類似于聊天的響應(yīng)進(jìn)行了微調(diào),使其以略微不同的語氣生成文本。如果你有一個生成法律文本或醫(yī)療建議的模型,那么我們的模型在這些模型生成的文本上也會表現(xiàn)不佳。

4、我們的模型非常小(與chatgpt類模型的> 200B個參數(shù)相比,我們的模型小于100M個參數(shù))。

很明顯,如果希望提供一個相當(dāng)高質(zhì)量的結(jié)果來檢查任何文本是否是人工智能生成的,我們需要一個更好的方法。

接下來,讓我們來看看網(wǎng)上流傳的一些關(guān)于這個話題的錯誤信息。

有些文章錯誤地解釋了困惑。例如,如果你在google.com上搜索“人類寫的內(nèi)容是高困惑還是低困惑?”,將在第一個位置獲得以下結(jié)果。

這是不正確的,因?yàn)榕c人工智能生成的內(nèi)容相比,人類編寫的內(nèi)容通常具有更高的困惑度。

最近kaggle也發(fā)布了一個 LLM - Detect AI Generated Text 的比賽,目前的baseline只用的tfidf和lgb,有興趣的也可以關(guān)注一下。

以下是我總結(jié)的一些代碼:

import nltk
 from collections import Counter
 from sklearn.feature_extraction.text import CountVectorizer
 from textblob import TextBlob
 import numpy as np
 
 text = "This is some sample text to detect. This is a text written by a human? or is it?!"
 
 # 1. N-gram Analysis
 def ngram_analysis(text, n=2):
    n_grams = nltk.ngrams(text.split(), n)
    freq_dist = nltk.FreqDist(n_grams)
    print(freq_dist)
 
 ngram_analysis(text)
 
 # 2. Perplexity
 # Perplexity calculation typically requires a language model
 # This is just an example of how perplexity might be calculated given a probability distribution
 def perplexity(text, model=None):
    # This is a placeholder. In practice, we would use the model to get the probability of each word
    prob_dist = nltk.FreqDist(text.split())
    entropy = -1 * sum([p * np.log(p) for p in prob_dist.values()])
    return np.exp(entropy)
 
 print(perplexity(text))
 
 # 3. Burstiness
 def burstiness(text):
    word_counts = Counter(text.split())
    burstiness = len(word_counts) / np.std(list(word_counts.values()))
    return burstiness
 
 print(burstiness(text))
 
 # 4. Stylometry
 def stylometry(text):
    blob = TextBlob(text)
    avg_sentence_length = sum(len(sentence.words) for sentence in blob.sentences) / len(blob.sentences)
    passive_voice = text.lower().count('was') + text.lower().count('were')
    vocabulary_richness = len(set(text.split())) / len(text.split())
    return avg_sentence_length, passive_voice, vocabulary_richness
 
 print(stylometry(text))
 
 # 5. Consistency and Coherence Analysis
 # Again, this is a simple way to explain the idea of calculating the consistency of a text. In reality, more complex algorithms are used.
 def consistency(text):
    sentences = text.split(".")
    topics = [sentence.split()[0] for sentence in sentences if sentence]
    topic_changes = len(set(topics))
    return topic_changes
 
 print(consistency(text))

總結(jié)

本文介紹了關(guān)于如何檢測ai生成文本的思路??梢允褂玫闹饕笜?biāo)是生成文本的困惑度。還介紹了這種方法的一些缺點(diǎn),包括誤報(bào)的可能性。希望這有助于理解檢測人工智能生成文本背后的細(xì)節(jié)。

但是當(dāng)我們討論檢測人工智能生成文本的技術(shù)時,這里的假設(shè)都是整個文本要么是人類編寫的,要么是人工智能生成的。但是實(shí)際上文本往往部分由人類編寫,部分由ai生成,這使事情變得相當(dāng)復(fù)雜。本文總結(jié)的代碼也是對所有文本內(nèi)容的檢測,對于部分由人類編寫,部分由ai生成則會復(fù)雜的多。

對于人工智能生成文本的檢測是一個不斷發(fā)展的領(lǐng)域,還需要我們努力找出一種方法,以更高的準(zhǔn)確率檢測人工智能生成的文本。

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2024-07-08 08:18:45

2023-02-06 10:12:04

人工智能文本生成工具

2024-07-09 07:54:26

2012-08-30 16:24:04

HTML5歐朋W3C

2017-06-21 14:16:56

編程程序員開發(fā)

2022-12-22 09:00:00

微服務(wù)架構(gòu)

2020-07-29 07:48:55

數(shù)字孿生物聯(lián)網(wǎng)IOT

2010-03-17 16:06:08

Java線程同步

2021-09-14 14:58:09

人工智能威脅檢測網(wǎng)絡(luò)安全

2024-01-26 10:35:21

人工智能教育領(lǐng)域AI

2023-08-02 18:26:31

2025-03-03 10:13:09

2021-08-23 10:40:30

人工智能KubernetesAI

2023-05-30 15:34:22

2023-05-05 14:02:59

人工智能聊天機(jī)器人

2023-09-05 07:17:23

2018-09-27 15:52:20

人工智能人類AI

2022-11-26 00:02:00

優(yōu)化器SQL語句

2023-08-10 17:40:33

人工智能

2024-02-28 08:00:00

人工智能Slackbot
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號