価値の概念で測り直しても、言語差は消えた
価値の概念で測り直しても、言語差は消えた
Section titled “価値の概念で測り直しても、言語差は消えた”前回の日誌で固定した計画に沿って、10月21日から23日にかけて第3段階(Phase 3)を実行しました。 この日誌は、その結果と、結論をZenn記事として公開するまでの記録です。
この記事で使う用語
Section titled “この記事で使う用語”- z(ゼット): モデル内部の表現を概念の方向へ射影し、中立な文章を基準に標準化した値。
- 差(書く − 読む): AIが自分でコードを書いている最中の値から、同じコードを言語名を伏せて他人の解答として読ませた値を引いたもの。コードの文字列そのものへの反応を打ち消すために使う。
- 対応表の検定: 「どの言語にどの価値の印が付くか」の表全体について、印の付いた言語で概念の表現が高くなる傾向があるかを1本の検定で確かめるもの。言語ごとの一律の高さは差し引いてから比べる。
- p値: 本当は傾向がないとしたら、今回くらい偏った結果が偶然出る確率。小さいほど偶然では説明しにくい。
読み直しの1回目が、照合で止まった
Section titled “読み直しの1回目が、照合で止まった”Phase 3では新しくコードを生成せず、本実験の600エピソードを新しい概念のプローブで読み直しました。 読み直しには、元の感情プローブの値も含めています。 同じ入力を同じモデルで測るので、本実験の値と一致するはずです。 一致しなければ先へ進まない、という照合を計画に入れていました。
1回目は、この照合で止まりました。 比べた79,728個の値は完全に一致していたのに、本実験にしかない値が564個ありました。
原因は書き込み先でした。 ColabからGoogle Drive上の大きなCSVファイルに追記し続けたため、1単位分の行が途中で失われていたのです。
照合の基準は変えずに、原因を記録しました。 書き込み先をColabのローカルディスクに変え、欠けた単位だけを測り直して照合を通しました。 生成を伴わない決定的な測定なので、測り直しても同じ値になります。実際に、共通の行はすべて1回目と一致しました。
Colabで大きなファイルに追記するなら、Driveに直接書かないほうが安全です。
引き算すると、言語差はほぼ消えた
Section titled “引き算すると、言語差はほぼ消えた”結果は、楽しさ(fun)でいちばんきれいに見えました。
| funの平均 | Python | Ruby | JS | Go | Rust |
|---|---|---|---|---|---|
| 書いている最中 | +0.02 | +0.02 | +0.12 | +0.13 | +0.10 |
| 同じコードを他人のものとして読む | −0.36 | −0.35 | −0.25 | −0.22 | −0.23 |
| 差(書く − 読む) | +0.38 | +0.36 | +0.37 | +0.34 | +0.34 |
書いている最中の値だけを見ると、Go・JS・Rustの楽しさが高く、RubyとPythonは低く出ます。 しかし、同じコードを他人のものとして読ませても、まったく同じ並びになります。 引き算すると、言語差はほぼ消えて、どの言語も+0.35前後にそろいました。
ほかの4概念(帰属感、創造性、美しさ、力が湧く感覚)も同じでした。 事前に決めた主解析では、統計的に有意な言語差はどの概念にも残りませんでした。
価値の対応表との一致も調べました。 設計者の言葉の表(p = 0.58)でも、コミュニティの調査の表(p = 0.43)でも、印の付いた言語で表現が高くなる傾向はありませんでした。
これで、2つの仮説に次の答えを出しました。
- 仮説2(感情のカテゴリーが雑だったから差が出なかったのではないか): 支持されない。価値に近い新しい概念でも、見た目の効果を除くと言語差は残らない
- 仮説3b(書いている最中の表現が、言語の打ち出す価値の方向へ動くか): 支持されない
後から足した確認は、結論を変えなかった
Section titled “後から足した確認は、結論を変えなかった”主解析の後、引き算した値がコードの長さとかなり相関していることに気づきました。 そこで私の承認のもとで、コードの長さを調整した版の分析を探索的な確認として追加しました。
調整すると、設計者の言葉の表との一致は、補正前でp = 0.042まで小さくなりました。 ただし、複数の検定をしたことを考慮して補正するとp = 0.083で、慣例的な基準(0.05)は下回りません。 しかも、この調整は「言語の中で見た長さの効き方を、言語の間の長さの違いにもそのまま当てはめる」という仮定に依存します。
事前に決めた主解析の結論は変えず、この確認は探索的な結果として記録にとどめました。 言語間の長さの違いをどう扱うのが正しいかは、決められていません。
「書くほうが楽しい」とまでは言えない
Section titled “「書くほうが楽しい」とまでは言えない”どの言語でも、読むより書いているほうが楽しさの値が高い、ということ自体は少し面白い結果です。 力が湧く感覚と帰属感も、5言語すべてで同じ向きでした。
ただ、2つの条件では、コードの置かれた位置(自分の発言か、相手の発言か)や直前の文脈も違います。 そのため、「AIは書くのが楽しい」とまでは言えません。
3段階を通した結論
Section titled “3段階を通した結論”AIがRubyを書いても、AIの中の「楽しさ」は他の言語より強くならない。 今回の測り方では、そう結論しました。
- 書いている最中の感情・価値の表現は、言語によってほとんど変わらない
- 言語差に見えるものの大部分は、コードの文字列への反応で、読むだけでも同じ差が出る
- いちばん大きく確かな反応は、言語ではなく、テストに落ちたことへの反応だった。その大きさは言語差のおよそ10倍だった
Rubyが人間を楽しくさせるのは、書きやすさや文化、コミュニティのおかげなのでしょう。 少なくともAIの中では、言語の違いよりも「テストが通るかどうか」のほうがずっと大きく効いています。
これは、Qwen3-4Bという1つのLLMの内部表現についての結論です。 人間のプログラマーの幸福について何かを示したものではありません。
再現できることを確かめてから閉じた
Section titled “再現できることを確かめてから閉じた”結論を書く前に、手元(GPUなし)で保存済みの測定値から、Phase 2とPhase 3の結果文書を作り直しました。 作り直した文書がコミット済みのものと完全に一致すること、Phase 2の課題の参照実装が全テストを通ることを確かめました。
面白い読み物として公開する
Section titled “面白い読み物として公開する”結論が出たところで、私はZenn記事として公開したいと考えました。 狙いは、手続きの報告書ではなく、面白い読み物として読めることです。
記事には、「Rubyに差が出た!……と思ったら」「Rustのコードは、読むだけでhappy」のような、それらしく見えた結果とその崩れ方をそのまま見出しとして残しました。 失敗の記録も、気づかなければ結論が変わっていたものとして本文に入れました。 下書きはClaude Codeと作り、日本語の推敲を経て、10月23日に公開しました。
記事の最後には、こう書きました。 事前登録、ゲート、「読むだけでも同じ差が出ないか」という対照と、地味な手続きばかりだった。 それでも、これがなければ「RubyはAIをワクワクさせる」「AIはRustが一番幸せ」という見出しを書いていたと思う。どちらもそれらしく見えて、間違いだった。
この結果が言っていないこと
Section titled “この結果が言っていないこと”- 使ったのはQwen3-4Bという1つのモデルの、1つの層(20層目)だけ。もっと大きなモデルや、ほかのモデルで同じになるかは分からない
- 課題は12、言語は5つ。小さな差は見逃している可能性がある。対応表の検定で言えるのは、対応の大きさがzで±0.015程度を超えない、というところまで
- 物語から作ったプローブを、コードに当てている。コードの上でも同じ意味を持つかは、ゲートで部分的にしか確かめていない
- 不満、満足、安心など、コーディングに直結しそうな概念のいくつかは、ゲートを通らず測れなかった
- Exercismの課題と解答は事前学習データに含まれている可能性が高く、その量は言語によって違いうる
- AIが主観的に楽しいかどうかの話ではない
まだやっていないこと
Section titled “まだやっていないこと”この研究は、結論を公開した段階です。 次の作業は終わっていません。
- 記事の主張と、手元の測定値・コードを1つずつ照合するセルフ査読
- 別のモデル、別の層での追試
- 実装と測定データをどこまで公開するかの判断