0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Uncensored1776 Day 9: ニューラルネットワークの基礎

Posted at

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がターゲットなのか?

  1. 情報の「出口」だから - MLP層の最終出力を決定する
  2. 拒否情報が集中しているから - 研究により確認されている
  3. 効率的だから - 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. 今日のまとめ

覚えておくべきポイント

  1. Transformerの構造 - 入力→複数の層→出力。各層にMLP層がある
  2. MLP down_proj - Abliterationはここの重み行列を操作する
  3. 線形表現仮説 - 概念は高次元空間の「方向」として符号化されている
  4. 拒否方向 - 有害と無害の隠れ状態の差分から計算
  5. 射影で削除 - 重み行列から拒否方向を射影で除去
  6. 中間層が重要 - Weight Kernelで効果的な層に重点を置く

次のステップ

今日の内容は少し抽象的でしたが、明日からは具体的な手法の詳細に入ります。Standard AbliterationとProjected Abliterationの違いを学び、どちらを選ぶべきかを理解しましょう。


明日の予告

Day 10: Abliteration手法の詳細

  • Standard Abliteration vs Projected Abliteration
  • それぞれの長所と短所
  • 使い分けのガイドライン

参考リンク

論文

プロジェクト内リソース


ナビゲーション

前の記事 Day 8: Uncensored1776の概要
次の記事 Day 10: Abliteration手法の詳細
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?