見出し画像

生成AI(LLM)は回文が苦手という話

以下のやり取りをご覧ください。

定義の部分は問題ありませんが、続いて提示された回文は滅茶苦茶です。「わたしまけましたわ」という有名な回文を除いて、反対に読む以前に日本語として意味が通りません。

検証プロセスを組み込むように指示をすると、多少ましになりますが、やはり意味の通らない日本語が混じっています。

現在の多くのLLMは、Attention機能を中心に設計されたTransformerというアーキテクチャで構築されています。

TransformerとAttentionは、自然言語処理や機械翻訳などの分野で革新的な成果をもたらした重要な概念です。
簡単に説明しますと:
1. Attention(注意機構): Attentionは、入力シーケンスの異なる部分に「注目」する機構です。これにより、モデルは文脈に応じて入力の重要な部分に焦点を当てることができます。例えば、翻訳タスクでは、出力の各単語を生成する際に、入力文の関連する部分に注目することができます。
2. Transformer: Transformerは、2017年に発表されたニューラルネットワークアーキテクチャです。主な特徴は:
- Attention機構を中心に設計されていること
- 再帰的な構造を用いず、並列処理が可能なこと
- エンコーダーとデコーダーの構造を持つこと
- 位置エンコーディングを使用して単語の順序情報を保持すること

Transformerは、長期依存関係を効率的に学習でき、大規模な言語モデル(例:GPT、BERT)の基礎となっています。

Claude 3.5 Sonnetによる説明

Attention機構によって文脈におけるトークン(単語)間の関係性が考慮されることで、より精度の高い出力が生成されるというのがざっくりとしたイメージです。
そして、多くのLLMでは Masked Self-Attention というAttention機構が採用されています。

Masked Self-Attentionは、Transformer アーキテクチャの重要な要素の1つです。この機構について簡単に説明します:
1. 基本的な考え方: Masked Self-Attentionは、自己注意機構(Self-Attention)の変形で、主にTransformerのデコーダー部分で使用されます。モデルが未来の情報を「覗き見」しないようにするために設計されています。
2. 動作原理:
- 通常のSelf-Attentionでは、シーケンス内のすべての位置が互いに注目し合います。
- Masked Self-Attentionでは、各位置は自身とそれ以前の位置にのみ注目できます。
- これは、後続の位置(未来の情報)にマスクをかけることで実現されます。
3. 使用目的:
- 言語モデリングタスクにおいて、モデルが次の単語を予測する際に、まだ生成されていない未来の単語を参照しないようにします。
- これにより、モデルは自然な方法で文章を生成できます。
4. 実装方法:
- 通常、アテンションスコアの計算後、未来の位置に対応する部分に大きな負の数を加えることで実装されます。
- これにより、ソフトマックス関数を通した後、未来の位置のアテンションの重みがほぼ0になります。
5. 応用例:
- GPTなどの大規模言語モデルで広く使用されています。
- テキスト生成、文章補完、対話システムなどのタスクで重要な役割を果たしています。

Masked Self-Attentionは、モデルが現在の文脈に基づいて次の単語を予測することを可能にし、より自然で一貫性のあるテキスト生成を実現しています。より詳細な説明や特定の側面について知りたい場合は、お知らせください。

Claude 3.5 Sonnetによる説明

注目すべきは以下の記述です。

モデルが未来の情報を「覗き見」しない

学習済みモデルを利用した文章の生成時はもちろんのこと、トレーニング時においても、この先出てくるトークンの情報は使われないということを意味します。ということは、文章を逆に(右から左へ)読むようなタスクは、LLMが苦手とする可能性が高いと推察されます。

英語の回文判定を試してみます。

最後の文 "Red iced cider." は、逆さまにすると "redicdecider" なので、回文ではありません。判定ミスです。

やはりLLMは回文を扱うことが得意ではないようなので、プログラムを作成させましょう。

提示されたプログラムは以下です。

function isPalindrome(str) {
    // 文字列を小文字に変換し、アルファベットと数字以外の文字を除去
    const cleanStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    
    // 文字列を反転
    const reversedStr = cleanStr.split('').reverse().join('');
    
    // 元の文字列と反転した文字列を比較
    return cleanStr === reversedStr;
}

// テスト用の関数
function testPalindrome(str) {
    console.log(`"${str}" is ${isPalindrome(str) ? 'a palindrome' : 'not a palindrome'}`);
}

// テストケース
testPalindrome("A man, a plan, a canal: Panama");
testPalindrome("race a car");
testPalindrome("Was it a cat I saw?");
testPalindrome("Hello, World!");
testPalindrome("Madam, I'm Adam");

このプログラムは、正しく動作します。
プログラムを疑似実行させることで、正しい回答を導けるでしょうか?

結果はやはり、 "Red iced cider." は回文(palindrome)であるという判定ミスになりました。LLMはプログラムの解説だけでなく、疑似実行もかなりの精度で行ってくれるのですが、うまくいきませんでした。

このようなケースでは、実際にプログラムを実行してしまった方が手っ取り早いですね。

提示されたプログラムは以下です。

import React, { useState } from 'react';

const PalindromeChecker = () => {
  const [input, setInput] = useState('');
  const [result, setResult] = useState('');

  const isPalindrome = (str) => {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    if (cleanedStr.length === 0) return false;
    return cleanedStr === cleanedStr.split('').reverse().join('');
  };

  const checkPalindrome = () => {
    if (input.trim() === '') {
      setResult('Please enter a word or phrase.');
    } else {
      setResult(isPalindrome(input) ? `"${input}" is a palindrome!` : `"${input}" is not a palindrome.`);
    }
  };

  return (
    <div className="p-4 max-w-md mx-auto bg-white rounded-xl shadow-md">
      <h1 className="text-2xl font-bold mb-4 text-center">Palindrome Checker</h1>
      <input
        type="text"
        value={input}
        onChange={(e) => setInput(e.target.value)}
        placeholder="Enter text to check"
        className="w-full px-3 py-2 border rounded-md mb-4"
      />
      <button
        onClick={checkPalindrome}
        className="w-full bg-blue-500 text-white py-2 rounded-md hover:bg-blue-600 transition-colors"
      >
        Check
      </button>
      {result && (
        <p className={`mt-4 text-center font-semibold ${result.includes('is a palindrome') ? 'text-green-600' : 'text-red-600'}`}>
          {result}
        </p>
      )}
    </div>
  );
};

export default PalindromeChecker;

Claude Artifacts機能を使ってブラウザ上で実行すると、正しく判定されました。

LLMの仕組みをざっくりと把握し、LLMが得意なこと・苦手なことを知っておくことで、より上手にLLMを使いこなすことができるようになるでしょう。

以下の無料の本も参考にしてください!

※本記事の検証はすべて Claude 3.5 Sonnet を利用しました。

この記事が気に入ったらサポートをしてみませんか?