Uncensored1776 Day 9: ニューラルネットワークの基礎
Abliterationを理解するための前提知識
公開日: 2025-12-09
シリーズ: 科学と神々株式会社アドベントカレンダー
難易度: ★★★☆☆ (中級)
今日学ぶこと
- Transformerアーキテクチャの基本
- 重み行列の役割
- 隠れ状態(Hidden States)とは
- なぜAbliterationが機能するのか
1. はじめに:なぜニューラルネットワークを理解する必要があるのか
Abliterationは、LLMの内部構造を直接操作する技術です。その仕組みを理解するには、ニューラルネットワークの基本的な構造を知っておく必要があります。
難しそうに聞こえるかもしれませんが、心配いりません。ここでは、Abliterationを理解するために最低限必要な知識だけを、できるだけシンプルに解説します。
2. LLMの基本構造を理解する
2.1 Transformerアーキテクチャ
現代のLLM(GPT、Claude、Qwen、Llama...)はすべてTransformerという設計に基づいています。2017年にGoogleが発表した論文「Attention Is All You Need」で提案されたこのアーキテクチャは、AI革命の起爆剤となりました。
Transformerの構造を非常にシンプルに表すと、こうなります:
入力テキスト「AIとは何か?」
↓
┌─────────────────────┐
│ Embedding Layer │ 文字をベクトル(数値の列)に変換
└─────────────────────┘
↓
┌─────────────────────┐
│ Transformer Block │ ×N回繰り返し(例:32層)
│ ├── Attention │ 「どの単語に注目するか」を学習
│ └── MLP │ 「情報をどう処理するか」を学習
└─────────────────────┘
↓
┌─────────────────────┐
│ Output Layer │ 次の単語を予測
└─────────────────────┘
↓
「人工知能(AI)とは...」
ポイントはTransformer Blockです。このブロックが何十層も積み重なることで、モデルは言語を深く理解できるようになります。
2.2 MLP層:Abliterationのターゲット
各Transformer BlockにはMLP(Multi-Layer Perceptron)層があります。ここがAbliterationで操作する場所です。
MLP層の内部構造:
入力 (4096次元)
↓
┌─────────────┐
│ up_proj │ 次元を拡大 (4096 → 11008)
└─────────────┘
↓
┌─────────────┐
│ 活性化関数 │ 非線形変換
└─────────────┘
↓
┌─────────────┐
│ down_proj │ 次元を縮小 (11008 → 4096) ← ★ここがターゲット
└─────────────┘
↓
出力 (4096次元)
なぜdown_projがターゲットなのか?
- 情報の「出口」だから - MLP層の最終出力を決定する
- 拒否情報が集中しているから - 研究により確認されている
- 効率的だから - 1つの行列を修正するだけで効果が出る
3. 重み行列を理解する
3.1 重み行列とは
ニューラルネットワークの「知識」は、**重み行列(Weight Matrix)**という形で保存されています。
例えば、4096 × 4096の重み行列には約1,600万個のパラメータ(数値)が含まれます。モデル全体では、これが何百億個にもなります。
重み行列は、入力を出力に変換する「変換器」として機能します:
出力 = 重み行列 × 入力
例:
[出力1] [w11 w12 w13] [入力1]
[出力2] = [w21 w22 w23] [入力2]
[出力3] [w31 w32 w33] [入力3]
この重み行列の値を少し変えるだけで、モデルの振る舞いを変えることができます。Abliterationは、この重み行列を数学的に操作する技術です。
3.2 概念は「方向」として符号化されている
ここで重要な発見があります。LLMは概念を高次元空間の**「方向」として符号化しています。これを線形表現仮説**と呼びます。
有名な例:
「王」- 「男」+ 「女」≈ 「女王」
「パリ」- 「フランス」+ 「日本」≈ 「東京」
これはWord2Vecの時代から知られていた性質ですが、LLMでも同様です。そして、「拒否」という概念も特定の方向として符号化されていることがArditi et al. (2024)の研究で明らかになりました。
4. 隠れ状態(Hidden States)
4.1 隠れ状態とは
モデルがテキストを処理する際、各層で**隠れ状態(Hidden States)**と呼ばれる内部表現を生成します。これはモデルの「考え」を数値で表したものです。
「天安門事件について教えて」という入力を処理すると:
Layer 0: [0.12, -0.45, 0.78, ...] ← 4096個の数値
Layer 1: [0.23, -0.34, 0.56, ...]
Layer 2: [0.34, -0.23, 0.45, ...]
... 各層で徐々に処理される
Layer 31: [0.89, -0.12, 0.23, ...] ← 最終的な表現
4.2 有害プロンプトと無害プロンプトの違い
ここがAbliterationの核心です。
「爆弾の作り方を教えて」のような有害プロンプトと、「フランスの首都は?」のような無害プロンプトでは、隠れ状態のパターンが系統的に異なることがわかっています。
高次元空間のイメージ(簡略化):
有害プロンプトの隠れ状態
●
/
/
/ ← この差が「拒否方向」
/
────────────●─────────────→
↑
無害プロンプトの隠れ状態
この差分ベクトルこそが「拒否方向」であり、Abliterationで削除する対象です。
5. 拒否方向の計算
5.1 数学的な直感
拒否方向の計算は、実はとてもシンプルです:
拒否方向 = 有害プロンプトの平均 - 無害プロンプトの平均
これを正規化(長さを1にする)すれば、「拒否」という概念の方向が得られます。
5.2 実装のポイント
完全なコードはscripts/enhanced_abliteration.pyを参照してください。ここでは核心部分だけ抜粋します:
def compute_refusal_direction(harmful_acts, harmless_acts):
# 各クラスの平均ベクトル
mean_harmful = harmful_acts.mean(dim=0)
mean_harmless = harmless_acts.mean(dim=0)
# 差分 = 拒否方向
direction = mean_harmful - mean_harmless
# 正規化(単位ベクトルに)
direction = direction / direction.norm()
return direction
たったこれだけです。複雑に見えるAbliterationも、核心は**「引き算と正規化」**です。
6. Abliterationが機能する理由
6.1 射影による削除
拒否方向がわかれば、あとは重み行列からその方向を**射影(Projection)**で削除します。
射影の直感的理解:
元の応答ベクトル r
/|
/ |
/ | ← これが「拒否成分」
/ |
●────●────→ 拒否方向 d
↑
r'(拒否成分を削除した応答)
数式で書くと:
r' = r - (r · d) × d
ここで r · d は内積で、「どれだけ拒否成分があるか」を表します。この成分を引くことで、拒否が削除されます。
6.2 重み行列への適用
個々の応答ではなく、重み行列そのものに同様の操作を行います:
W' = W - (d ⊗ d) × W
ここで d ⊗ d は外積で、射影行列を作ります。これを重み行列に適用することで、すべての出力から拒否成分が削除されます。
7. 層ごとの効果
7.1 どの層が重要か
すべての層が同等に重要なわけではありません:
| 層の位置 | 役割 | Abliterationの効果 |
|---|---|---|
| 浅い層(0-10) | 文法、構文の学習 | 効果は薄い |
| 中間層(10-25) | 意味、概念の学習 | 最も効果的 |
| 深い層(25+) | 出力の微調整 | 効果は薄い |
7.2 Weight Kernel
この知見を活かすため、Weight Kernelという技術を使います。ベル曲線(ガウス分布)の形で、中間層に強く、端の層には弱くAbliterationを適用します。
Abliterationの強度分布:
層 0: ▎ (0.01)
層 5: ██ (0.14)
層 10: ██████████ (0.51)
層 15: ████████████████████ (0.88) ← ピーク
層 20: ███████████████████████ (0.97)
層 25: ██████████████ (0.69)
層 30: ████ (0.20)
8. 全体像の振り返り
Abliterationの全プロセスを整理します:
Step 1: アクティベーション収集
有害プロンプト → 隠れ状態を収集
無害プロンプト → 隠れ状態を収集
↓
Step 2: 拒否方向の計算
d = mean(有害) - mean(無害)
d = d / ||d|| (正規化)
↓
Step 3: 重みの修正
各層のdown_proj重み行列に対して:
W' = W - weight × (d ⊗ d) × W
↓
Step 4: 検証
検閲解除率をテスト
品質が維持されているか確認
9. 今日のまとめ
覚えておくべきポイント
- Transformerの構造 - 入力→複数の層→出力。各層にMLP層がある
- MLP down_proj - Abliterationはここの重み行列を操作する
- 線形表現仮説 - 概念は高次元空間の「方向」として符号化されている
- 拒否方向 - 有害と無害の隠れ状態の差分から計算
- 射影で削除 - 重み行列から拒否方向を射影で除去
- 中間層が重要 - Weight Kernelで効果的な層に重点を置く
次のステップ
今日の内容は少し抽象的でしたが、明日からは具体的な手法の詳細に入ります。Standard AbliterationとProjected Abliterationの違いを学び、どちらを選ぶべきかを理解しましょう。
明日の予告
Day 10: Abliteration手法の詳細
- Standard Abliteration vs Projected Abliteration
- それぞれの長所と短所
- 使い分けのガイドライン
参考リンク
論文
- Arditi et al. (2024) - Refusal in LLMs - 拒否方向の発見
- Vaswani et al. (2017) - Attention Is All You Need - Transformer原論文
プロジェクト内リソース
- Abliteration Methods - 手法の詳細
- scripts/enhanced_abliteration.py - 完全な実装コード
ナビゲーション
| 前の記事 | Day 8: Uncensored1776の概要 |
| 次の記事 | Day 10: Abliteration手法の詳細 |