人工知能によるテキスト検出の実践的有効性に関する議論

人工知能によるテキスト検出の実践的有効性に関する議論

AI 支援による記事執筆は今やどこにでもあります。ChatGPT は多くの言語ベースの AI アプリケーションを解き放ち、あらゆる種類のコンテンツ生成における AI の使用は前例のないレベルに達しました。

クリエイティブライティングなどの仕事では、独自のコンテンツを作成することが求められます。しかし、これらのタスクにおける AI の人気と有効性により、AI が悪用される可能性が高くなります。したがって、AI によって生成されたコンテンツを検出するための信頼性の高いツールを入手できることは非常に重要な問題です。そこでこの記事では、そのようなツールを構築するためのアイデアと技術仕様を紹介します。

テキスト検出のアイデア

私たちの目標は、「GPT のような大規模な言語モデルがテキストの全部または一部を生成できる可能性はどれくらいか」でした。

ですから、私たちは日常生活から始めなければなりません。たとえば、典型的な日常の場面で、あなたのお母さんがあなたに次のように言う可能性はどれくらいあるでしょうか?

あなた、午後 8 時前に寝てください。あなた、午後 11 時以降に寝てください。

あなたは周囲の世界についての理解を深め、どのような出来事が起こる可能性が高いかを感知しているので、後者よりも前者の方が可能性が高いと推測します。

まさにこれが言語モデルの仕組みです。言語モデルは周囲の世界について何かを学習し、不完全な文が与えられた場合に次の記号や単語を予測することを学びます。

上記の例で、お母さんが何か言っていて、今までのところ「ねえ、寝なさい」としか言っていなかったとしたら、文の続きは「午後 11 時以降」ではなく「午後 8 時前」になる可能性が最も高くなります。だって親は子供をいつも早く寝かせてるでしょ?

言語モデルの難しさとは何か?

混乱: 混乱、混沌、不確実性の状態。

現実世界では、道路を運転中に信号を見たときなど、予期しない状況に遭遇しても混乱することはまずありませんが、野生動物が市街地の道路を横切っているのを見たら、間違いなく多くの疑問が湧くでしょう。

文中の次の単語を予測しようとしている言語モデルの場合、その文が予想外の単語で完成すると、そのモデルは私たちを混乱させていると言えます。

困惑度が低い文は次のようになります。

1. 外は晴れた日です。

2. 飛行機に乗り遅れてしまい、国立公園に間に合わなかったことをお詫び申し上げます。

混乱度の高い文は次のようになります。

1. 外はパンの日です。

2. 外はちょうどいい明るさで、国立公園にたどり着けませんでした。

言語モデルによる予測の困惑度をどのように計算するのでしょうか?

困惑

言語モデルの複雑さは、文中の次の記号 (単語) を驚かずに予測できる確率に関係します。

6600 トークンの語彙を持つ言語モデルをトレーニングし、モデルに文中の次の単語を予測するように要求するとします。この単語を選択する確率が 5/6600 (つまり、ありそうにない) であるとします。その困惑度は確率の逆数 6600/5 = 1320 であり、これは困惑度が非常に高いことを意味します。この単語を選択する確率が 6000/6600 であれば、困惑度は 6600/6000 = 1.1 となり、それほど混乱していないことを意味します。

困惑度の計算式は次のとおりです。

数値の安定性を確保するために、対数関数を使用して定義することができます。

モデルのトレーニングおよび検証のパープレキシティは、バッチ損失またはエポック損失から直接計算できます。ただし、予測ごとにグラウンドトゥルースラベルのセットが必要になるため、予測の困惑度を計算することはできません。

変数 probs は、言語モデルがシーケンス内のその位置で正解を予測する確率を含むテンソルであると仮定します。

このコードを使用して、各パープレキシティを計算できます。

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

このコードを使用して、サンプルのパープレキシティを計算します。

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

次のコードは、文が与えられた場合に各単語の確率を計算します。

 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 #

上記は、最も基本的な大規模言語モデルの仕組みと、各単語と各文の難解度を計算する方法です。これで、この情報を使用して、特定のテキストが人工知能によって生成されたかどうかを検出できるツールを構築できます。

AI生成テキストの検出

テキストが AI によって生成されたかどうかを確認するには、文の難解度とモデルの難解度を、あいまいさ係数アルファでスケーリングして比較する必要があります。文の難解度がモデルによってスケールされた難解度を超える場合、その文は人間が書いたテキスト(つまり AI によって生成されたテキストではない)である可能性が高くなります。そうでなければ、AI によって生成されたものである可能性があります。文の難解度がモデルのスケールされたトレーニング難解度以下の場合、その文はその言語モデルを使用して生成された可能性が高いですが、確信はありません。これは、このテキストが人間によって書かれた可能性があり、モデルが生成できるものでもあるためです。このモデルは大量の人間が書いたテキストでトレーニングされているため、ある意味では「一般の人が書いたもの」を表現していると言えます。

上記の式のPpx(x)は入力「x」の難しさを表します。

人間が書いたテキストと AI が生成したテキストの例を見てみましょう。

私たちの Python コードは、モデルに対するその困惑度に応じて文中の各トークンに色を付けることができます。困惑度を考慮しなければ、最初の記号は常に手書きであると見なされます (モデルは後続の出力を作成するために最初の入力も必要とするため)。モデルのスケールされた困惑度以下の困惑度を持つ単語は赤色で表示され、AI によって生成された可能性が高いことを示します。一方、困惑度が高いトークンは緑色で表示され、AI によって生成されたものではないことが確実に示されます。

文の前の括弧内の数字は、言語モデルを使用して計算された文の複雑さを示します。いくつかの単語は半分が赤で半分が青です。これは、サブワード トークナイザーを使用しているためです。

以下は上記の 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) #

上記の例からわかるように、モデルがテキストが人間によって手書きされたものであると検出した場合、それは間違いなく人間によって手書きされたものですが、テキストが AI によって生成されたものであると検出した場合、AI によって生成されたものではない可能性があります。なぜこのようなことが起こるのでしょうか? 以下で見てみましょう。

偽陽性

言語モデルは、人間が書いた大量のテキストでトレーニングされます。一般的に言えば、何かが特定の人物によって書かれたものかどうかを発見することは困難です。モデルのトレーニングに使用される入力には、さまざまな人によるさまざまな書き方が含まれます。これにより、モデルはさまざまなライティングスタイルとコンテンツを学習できるようになります。あなたの文章スタイルは、モデルがトレーニングされたテキストの一部の文章スタイルに非常に近い可能性が高いです。これにより誤検知が発生する可能性があり、モデルが一部のテキストが AI によって生成されたものであると判断できないことがあります。しかし、モデルは一部のテキストが人間によって生成されたものであると判断できます。

「OpenAIは最近、精度が低いことを理由に、AI生成テキストを検出するツールの提供を中止すると発表した」(https://tech.hindustantimes.com/tech/news/openai-kills-off-its-own-ai-text-detection-tool-shocking-reason-behind-it-71690364760759.html)。このニュースは上記の問題を例証しています。

AI 分類ツールのオリジナルバージョンには、最初から一定の制限と不正確さがありました。ユーザーは少なくとも1,000文字のテキストを手動で入力する必要があり、OpenAIはそれを分析してAIが書いたテキストか人間が書いたテキストかに分類します。このツールのパフォーマンスは良くなく、AI 生成コンテンツの 26 パーセントしか正しく識別できず、約 9 パーセントのケースで人間が書いたテキストを誤って AI 生成と分類してしまった。

以下はOpenAI のブログ投稿です。彼らはこの記事で言及されているものとは異なるアプローチを使用しているようです。

私たちの分類器は、同じトピックについて人間が書いたテキストと AI が書いたテキストのデータセットに基づいて微調整された言語モデルです。このデータセットは、事前トレーニング データや InstructGPT に送信されたプロンプトに対する人間の応答など、人間によって作成されたと思われるさまざまなソースから収集されました。各記事をプロンプトと応答に分けます。これらのプロンプトに基づいて、私たちや他の人たちによってトレーニングされたさまざまな言語モデルから応答が生成されます。当社の Web アプリケーションでは、誤検出率を低く抑えるために信頼しきい値を調整しています。つまり、分類器の信頼性が非常に高い場合にのみ、テキストが AI によって書かれた可能性が高いとフラグ付けします。

GPTZero は、AI によって生成されたテキストを検出するための人気のツールです。 GPTZero は、AI 生成テキストを検出するために、困惑度とバースト性を利用しているようです。 「バースト性」とは、特定の単語やフレーズがテキスト内に突然現れる現象を指します。テキスト内に一度だけ出現する単語は、近い場所に再び出現する可能性が高くなります。 ”

GPTZero は成功率が非常に高いと主張しています。 GPTZero FAQ によると、「しきい値 0.88 では、AI ドキュメントの 85% が AI として分類され、人間のドキュメントの 99% が人間として分類されました。」

方法の普遍性

この論文で紹介されている方法は十分に一般化されていません。たとえば、GPT3、GPT3.5、GPT4 の 3 つの言語モデルがある場合は、入力テキストを 3 つのモデルすべてに通して、そのモデルがどれかによってテキストを生成したかどうかを確認するために、モデルの難解さをチェックする必要があります。これは、各モデルがわずかに異なるテキストを生成するため、いずれかのモデルがテキストを正しく生成したかどうかを確認するために、すべてのモデルがテキストを個別に評価する必要があるためです。

2023 年 8 月の時点では、世界中で大規模な言語モデルが急増しているため、テキストの一部が世界中のいずれかの言語モデルからのものであるかどうかを誰も確認できなくなると思われます。

以下の例では、ChatGPT によって生成された文が AI によって生成されたものかどうかをモデルに予測するように要求しています。ご覧のとおり、結果はまちまちです。

これが起こる理由はたくさんあります。

1. 私たちのモデルはごく少量のテキストでトレーニングされていますが、ChatGPT はテラバイト単位のテキストでトレーニングされています。

2. ChatGPT と比較して、私たちのモデルは異なるデータ分布でトレーニングされています。

3. 私たちのモデルは単なる GPT モデルですが、ChatGPT はチャットのような応答に合わせて微調整されており、わずかに異なる口調のテキストを生成します。法律文書や医療アドバイスを生成するモデルがある場合、これらのモデルによって生成されたテキストに対しても、当社のモデルのパフォーマンスは低下します。

4. 私たちのモデルは非常に小さいです(chatgpt のようなモデルの 2000 億を超えるパラメータと比較して、1 億未満のパラメータ)。

テキストが AI によって生成されたものであるかどうかをチェックするための、かなり高品質な結果を提供したいのであれば、より優れた方法が必要であることは明らかです。

次に、このトピックに関してオンラインで広まっている誤った情報のいくつかを見てみましょう。

いくつかの記事では混乱を誤解しています。たとえば、google.com で「人間が書いたコンテンツの難解度は高いか低いか」と検索すると、最初の位置に次の結果が表示されます。

これは誤りです。人間が書いたコンテンツは、AI が生成したコンテンツよりも混乱度が高いことが多いからです。

最近、Kaggle は LLM - AI 生成テキスト検出コンペも開始しました。現在のベースラインでは tfidf と lgb のみを使用しています。興味のある方は、こちらも注目してください。

以下に私がまとめたコードをいくつか示します。

 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))

要約する

この記事では、AI によって生成されたテキストを検出する方法についてのアイデアを紹介します。使用できる主な指標は、生成されたテキストの難解さです。このアプローチには、誤検知の可能性など、いくつかの欠点も示されています。これが、AI 生成テキストの検出の詳細を理解するのに役立つことを願っています。

しかし、AI によって生成されたテキストを検出する技術について議論する場合、テキスト全体が人間によって書かれたか、AI によって生成されたものであるという前提があります。しかし、テキストの一部は人間によって書かれ、一部は AI によって生成されることが多いため、事態は非常に複雑になります。この記事でまとめたコードも、すべてのテキスト コンテンツを検出します。一部が人間によって書かれ、一部が AI によって生成された場合は、はるかに複雑になります。

AI 生成テキストの検出は発展途上の分野であり、AI 生成テキストをより正確に検出する方法を見つけるために、引き続き努力する必要があります。

<<:  AIGCとアップグレードにより、PC販売は2024年に8%回復する可能性がある

>>:  李開復:中国の大型モデル競争は非常に激しく、最終的には大きな勝者が数人出るだろう

ブログ    
ブログ    
ブログ    

推薦する

マスク氏はまたも常識に反する発言をしました。自動運転は普及初期段階では渋滞を増加させるでしょう。

自動運転の普及初期には交通渋滞が悪化するだろう。これは、自動運転についてのあなたの理解と異なりますか...

...

AIを優先する際にITの基礎を軽視してはいけない

GenAI は多くの企業の IT プロジェクトで引き続き主流を占めており、ビジネス リーダーの 3 ...

TensorFlow の動的グラフツール Eager の使い方は?これは非常に簡単なチュートリアルです

昨年 11 月、Google Brain チームは、実行によって定義される新しいインターフェースであ...

量子もつれによりホログラムが生成されます。物体は画像を形成するために光を放射する必要はありません。

新たな研究によると、量子力学は科学者が物体から光を捉えることなくホログラムを生成するのに役立つ可能性...

ファーウェイの孫茂陸氏:今後5年間で10億ドルを投資し、スマートエンタープライズサービスを構築する

上海で開催されたHUAWEI CONNECT 2019で、ファーウェイはエンタープライズサービス開発...

...

秘密裏に利用規約を変更したことで、Software Freedom Conservancy が激怒しました。オープンソースコミュニティがZoomの放棄を呼び掛け

パンデミックの間、リモートワークは必須となり、多くのビデオ会議ツールが普及しました。 Zoom は最...

...

...

スマート信号機は歩行者が道路を横断する時間を長くする

[[392088]]画像ソース: https://pixabay.com/images/id-329...

AIとクラウドコンピューティングが相互に利益をもたらし、ビジネス効率を向上させる方法

長年にわたり、クラウド コンピューティングは現代のビジネスに欠かせないツールとなり、2020 年には...

汎用人工知能までどれくらい遠いのでしょうか?

汎用人工知能はどのくらい遠いのでしょうか? どのくらいの速さで進歩しているのでしょうか? 現在、人間...