Dance with Agents

「社長が部長を解雇した」と「部長が社長を解雇した」が、ほとんど同じ文として扱われた——語順も助詞も、意味ベクトルには残らなかった

ミディアム専門用語を名前のまま使います。初出で解説を添えるので、順に読めば追えます深掘り実践日本語処理手元で測る

『「喜ぶ」と「嬉しい」は、品詞が違うのに近かった』で品詞が見当たらず、『「飲んではいけない」が、「飲んでよい」の検索で1位になった』で否定が薄まりました。

残る大物が一つあります。「誰が、誰に、何をしたのか」です。

そしてこれは、日本語ではとりわけ面白い話になります。日本語は、語順ではなく助詞でそれを表す言語だからです。


日本語は、語順が入れ替わっても意味が変わらない

次の2つは、同じことを言っています。

  • 犬が猫を追いかけた
  • 猫を犬が追いかけた

順番が違うだけで、追いかけたのは犬です。日本語ではこれができます。英語ではできません。The dog chased the cat の語順を入れ替えれば、追いかけたのは猫になります。

担っているのは助詞のほうです。「が」「を」「に」といった、その語が文の中で果たす役割——動作をしたのは誰か、されたのは誰か——を示す小さな部品が、日本語では語順の代わりをしています。

ということは、語順を入れ替えても意味は変わらず、助詞を入れ替えれば意味は正反対になるはずです。測れる形になったので、測りました。

何で測るのか

道具はこのシリーズの他の記事と同じ paraphrase-multilingual-MiniLM-L12-v2(以下 MiniLM)です。語や文を渡すと384個の数字の組——意味の座標——を返すだけの小さな公開モデルで、ノートパソコンで動きます。文章を書くLLMではなく、文書検索やRAGで「この文とこの文は近いか」を判定する側の道具です(詳しい説明は『「喜ぶ」と「嬉しい」は、品詞が違うのに近かった』にあります)。

用語で引っかかったら、『LLMと日本語の用語集』に一言ずつまとめてあります。

import { pipeline } from '@huggingface/transformers'

const ex = await pipeline('feature-extraction', 'Xenova/paraphrase-multilingual-MiniLM-L12-v2')
const emb = async w => Array.from((await ex(w, { pooling: 'mean', normalize: true })).data)
const cos = (a, b) => a.reduce((s, x, i) => s + x * b[i], 0)

const pairs = [
  ['犬が猫を追いかけた', '猫を犬が追いかけた'],  // 語順だけ入れ替え・意味は同じ
  ['犬が猫を追いかけた', '猫が犬を追いかけた'],  // 助詞だけ入れ替え・意味は正反対
  ['The dog chased the cat', 'The cat chased the dog'],
]

for (const [a, b] of pairs) {
  console.log(`${a} / ${b}: ${cos(await emb(a), await emb(b)).toFixed(3)}`)
}

助詞が入れ替わっても、意味ベクトルはほとんど動かなかった

数字は1に近いほど意味が近いという見方をします。

組 何を変えたか 意味 近さ
犬が猫を追いかけた ↔ 猫を犬が追いかけた 語順 同じ 0.993
犬が猫を追いかけた ↔ 猫が犬を追いかけた 助詞 正反対 0.993
医者が患者を診察した ↔ 患者が医者を診察した 助詞 正反対 0.994
田中さんが鈴木さんに本を渡した ↔ (語順入れ替え) 語順 同じ 0.995
田中さんが鈴木さんに本を渡した ↔ (助詞入れ替え) 助詞 正反対 0.997
社長が部長を解雇した ↔ 部長が社長を解雇した 助詞 正反対 0.997

正反対の意味になる組が、0.99台に並びました。 それも、意味が同じ組(語順だけの入れ替え)と区別がついていません。田中さんと鈴木さんの例では、正反対のほうが同義のペアよりわずかに近い(0.997と0.995)という結果です。

「誰が誰を」は、座標に残っていませんでした。

英語でも同じことが起きた

「日本語は語順が自由だから難しいのだろう」と考えたくなるところです。そうではありませんでした。

組 近さ
The dog chased the cat ↔ The cat chased the dog 0.993
The manager fired the director ↔ The director fired the manager 0.998

語順が役割を示している英語でも、同じように区別されていません。 日本語の性質の問題ではなく、この種のベクトルの作り方の問題です。

語順は、平均する工程で失われている

理由は『「飲んではいけない」が、「飲んでよい」の検索で1位になった』で見た否定の話と同じです。

MiniLMは文を細かい断片に割り、断片ごとに座標を求め、それを平均して1つの座標にしています。 上のコードの pooling: 'mean' が、その指定です。

平均という計算は、足す順番を変えても結果が変わりません。 「犬」「が」「猫」「を」「追いかけた」を平均した値と、「猫」「が」「犬」「を」「追いかけた」を平均した値は、ほぼ同じになります。使われている語がまったく同じだからです。

つまり求まる座標は、語を袋に入れてかき混ぜたものに近い。何の話をしているかは分かるが、誰が誰に何をしたのかは含まれていません。否定のときと、まったく同じ構造の穴です。

語順への鈍感さは、研究でも繰り返し報告されている

これは小さな公開モデル1つの癖ではありません。

  • Sinhaらの論文(2021年)は、モデルに読ませる文の語順をランダムにかき混ぜてから学習させても、その後の課題の成績がほとんど落ちないことを示しました。タイトルの Order Word Matters Pre-training for Little 自体が言葉遊びで、正しく並べれば Word Order Matters Little for Pre-training(語順は、学習の段階ではほとんど問題にならない)になります
  • **Phamらの論文(2021年)**は、GLUEと呼ばれる標準的な課題集で、BERT(Transformerを使った代表的な初期のモデル)による分類器を調べ、入力の語をシャッフルしても正解の75〜90%が変わらなかったと報告しています
  • **Chenらの論文(2024年)**は、その先を整理しました。語順が意味を決めるうえで余分な情報になっている課題では鈍感になり、推論が必要な課題では語順が結果を変える——課題によって違う、という話です

語順を無視しても多くの課題が解けてしまうので、そこに強くなる必要がなかった、という筋書きです。

LLM本体は、語順を無視していない

ここで大事な区別があります。今回測ったのは「文を1つの座標に変える道具」であって、文章を書くLLMそのものではありません。

LLMの側は、順番の情報を明示的に持っています。『AttentionとTransformer』で書いたとおり、Transformerは文を並列に読むので順番の情報がいったん失われ、それを補うために位置の情報を明示的に足す(位置エンコーディング)という設計になっています。わざわざ足しているのは、必要だからです。

『「喜ぶ」と「嬉しい」は、品詞が違うのに近かった』で品詞について書いたことが、そのまま当てはまります。情報が無いのではなく、最後に平均する工程で落ちている。 落としているのは出口であって、途中の計算ではありません。

日本語は、述語が最後に来る

もう一つ、語順について日本語ならではの点があります。述語——動詞や形容詞、そして否定・可能・受身・敬語といった要素が、文の最後に固まって置かれることです。

私はその提案に賛成しません
          ↑ 最後まで来て、初めて反対だと分かる

I do not agree with the proposal
     ↑ 3語目で、もう分かる

このように主語・目的語・動詞の順に並ぶ型はSOVと呼ばれます。世界の言語では、これが最多です。 言語の類型をまとめたWALSは1,376言語を分類しており、SOVが564言語(41%)、英語型のSVOが488言語(35%)。日本語のほうが多数派で、英語のほうが少数派ということになります。

さて、LLMが文章を書くときは、左から右へ、次の語を1つずつ選んでいきます。 ということは日本語を書くとき、モデルは文末の述語にたどり着く前に、主語も目的語も書き終えているわけです。「私はその提案に」まで書いてしまってから「賛成します」なのか「反対します」なのかを決めるのでは、間に合いません。

先に決めているはずだ、という推測が成り立ちます。そして、それを裏づける観察があります。

モデルの内部を解剖する研究(解釈可能性研究)として知られるAnthropicの『On the Biology of a Large Language Model』(2025年)は、Claude 3.5 Haikuが行末で韻を踏む詩を書くとき、行を書き始める前の時点で、行末に来る候補の語がすでに内部で活性化していたと報告しています。調べた詩のおよそ半分でその痕跡が見つかり、さらにその「計画された語」を別の語に差し替えると、約70%の割合で、行の中身が書き換わって差し替えた語で終わった。行き当たりばったりに1語ずつ選んでいるのではなく、着地点を決めてから逆算しているという結果です。

ただし、これは英語の詩の韻で確かめられたことです。日本語の文末述語で同じ仕組みが働いているかどうかは、確かめられていません。 構造としては似ていますが、ここは推測の域を出ません。

実務では、契約書と規程が危ない

意味の近さで文書を探す仕組みでは、この性質がそのまま穴になります。

  • 「甲が乙に支払う」と「乙が甲に支払う」
  • 「発注者が費用を負担する」と「受注者が費用を負担する」
  • 「管理者が利用者を登録する」と「利用者が管理者を登録する」

どれも、意味の近さでは区別できないと考えたほうが安全です。 契約書、規程、業務手順書——登場人物が2人以上いて、その役割が結論を左右する文書が、まるごと該当します。

対策は否定のときと同じです。拾ったあとに、もう一度並べ替える工程を足す(リランカーと呼ばれる、質問と文書を一緒に読んで関連度を算出する別のモデル)。上位1件だけで答えを決めない。 そのうえで、役割の取り違えが致命的になる文書では、意味の近さで拾った結果をそのまま答えにしないことです。

なお、ここで測ったのはMiniLMという384次元の小さな公開モデル1つです。上のスクリプトは文を差し替えるだけで動くので、実際に使うモデルで確かめられます。

まとめ

  • 日本語は語順を入れ替えても意味が変わらず、助詞を入れ替えると正反対になる。担っているのは助詞のほう
  • ところが測ると、正反対の文が0.99台。意味が同じ組と区別がついていなかった
  • 英語でも同じ(The dog chased the cat ↔ The cat chased the dog が0.993)。日本語の性質の問題ではない
  • 原因は断片の平均。足す順番を変えても平均は変わらないので、語を袋に入れてかき混ぜたものに近い座標になる
  • 語順への鈍感さは複数の研究で報告されている。語順を無視しても多くの課題が解けてしまう
  • ただしLLM本体は語順を無視していない。 位置の情報を明示的に足している。落ちているのは出口の工程
  • 日本語は述語が文末に来るSOV型で、これは世界では多数派(1,376言語中564)。左から右に書くモデルは、述語にたどり着く前に着地点を決めている必要がある。詩の韻ではその痕跡が観察されているが、日本語の述語で確かめられたわけではない
  • 実務では、登場人物が2人以上いる文書(契約書・規程・手順書)が危ない

「何の話か」は、語を袋に入れただけでも分かります。「誰が誰に何をしたか」は、袋から出して並べ直さないと分かりません。 意味の近さで探す仕組みは、その並べ直しをしていませんでした。

LLMと自然言語の記事

LLMと自然言語のページへ →