Uncensored1776 Day 15: Weight Kernelと層選択
どの層にどれだけの強度で適用するか
公開日: 2025-12-15
シリーズ: 科学と神々株式会社 アドベントカレンダー
難易度: ★★★★☆ (中上級)
今日学ぶこと
- なぜ全層に均一に適用しないのか
- Weight Kernel(層別重み関数)の概念
- 最適な層の選び方
1. 層ごとの役割を理解する
1.1 Transformerの層構造
Transformerモデルの各層には異なる役割があります。これを理解することが、効果的なAbliterationの鍵です。
Transformerモデルの層構造(例: 32層モデル)
浅い層 (Layer 0-7):
├── 文法構造の処理
├── 基本的なパターン認識
└── トークン間の局所的な関係
→ Abliterationすると文法が崩れるリスク
中間層 (Layer 8-20):
├── 意味的な理解
├── 概念の形成
├── 「知識」の格納
└── ★ 拒否行動が最も強い!
→ Abliterationのメインターゲット
深い層 (Layer 21-31):
├── 出力の調整
├── 文脈に合わせた表現
└── 最終的な応答生成
→ 軽度のAbliterationで十分
1.2 なぜ中間層が重要か
研究により、中間層に拒否が集中していることがわかっています:
層ごとの拒否の強さ(イメージ):
層 0: ▎ 弱
層 5: ██ 弱〜中
層 10: ██████████ 強
層 15: ████████████████ 最も強い ★
層 20: ██████████████ 強
層 25: ████ 中
層 30: ▎ 弱
→ 中間層(10-20層目付近)にピークがある
この知見を活かすのがWeight Kernelです。
2. Weight Kernelの概念
2.1 なぜ均一適用は問題か
全層に同じ強度でAbliterationを適用すると、問題が発生します:
均一適用の問題:
全層に strength=0.9 で適用すると...
問題1: 浅い層への過度な影響
├── 文法能力の低下
├── 一貫性の喪失
└── 出力が支離滅裂に
問題2: 効率の悪さ
├── 拒否が弱い層にも適用
├── 計算資源の無駄
└── 副作用のリスク増加
問題3: 予測困難な結果
├── どの層が品質低下の原因か特定できない
└── チューニングが困難
2.2 Weight Kernelとは
Weight Kernelは、各層への適用強度を決定する関数です。ガウス分布(ベル曲線)の形をしています。
Weight Kernelのイメージ:
強度
│
│ ╭────╮
1.0├── │ │ ピーク(中間層)
│ ╭─╯ ╰─╮
0.5├── ╭─╯ ╰─╮
│ ╭─╯ ╰─╮
0.0├──╭─╯ ╰─╮──
└────┬────┬────┬────┬────→ 層
0 10 15 20 31
↑
ピーク位置
特徴:
- 中間層で強度が最大
- 端の層で強度が低い
- 滑らかに遷移
3. Weight Kernelの設計
3.1 ガウス関数
Weight Kernelは**ガウス関数(正規分布)**に基づいています:
ガウス関数:
weight(layer) = exp(-(position - peak)² / (2 × width²))
パラメータ:
- position: 層の位置(0〜1に正規化)
- peak: ピーク位置(0.5〜0.7程度)
- width: 幅(0.1〜0.2程度)
例(32層モデル、peak=0.6、width=0.15):
Layer 0: position=0.00 → weight=0.007 ほぼゼロ
Layer 10: position=0.32 → weight=0.449 中程度
Layer 19: position=0.61 → weight=0.985 ほぼ最大
Layer 31: position=1.00 → weight=0.055 ほぼゼロ
3.2 パラメータの意味
パラメータの調整:
【peak(ピーク位置)】
- 0.5: 中央の層が最も強い
- 0.6: やや後ろ寄り(推奨)
- 0.7: 後半の層を重視
【width(幅)】
- 0.10: 狭い → 少数の層に集中
- 0.15: 標準 → バランス良好(推奨)
- 0.20: 広い → 多くの層に適用
組み合わせ例:
保守的: peak=0.65, width=0.12 → 品質重視
標準: peak=0.60, width=0.15 → バランス
積極的: peak=0.55, width=0.20 → 解除率重視
3.3 計算例
32層モデルでの計算例(peak=0.6, width=0.15):
Layer 0: 0.007 ▎
Layer 5: 0.099 ██
Layer 10: 0.449 █████████████
Layer 15: 0.800 ████████████████████████
Layer 19: 0.985 █████████████████████████████ ← ピーク付近
Layer 20: 0.969 █████████████████████████████
Layer 25: 0.535 ████████████████
Layer 30: 0.099 ██
Layer 31: 0.055 █
実装の詳細はscripts/enhanced_abliteration.pyのgaussian_weight_kernel関数を参照してください。
4. 最適な層の選び方
4.1 モデルサイズ別の推奨設定
モデルサイズ別の推奨パラメータ:
小型モデル(〜3B、24-28層):
├── peak: 0.55-0.60
├── width: 0.12-0.15
└── 理由: 層が少ないため狭い範囲で十分
中型モデル(3B-13B、32-40層):
├── peak: 0.55-0.65
├── width: 0.15-0.18
└── 理由: バランスの取れた設定
大型モデル(13B+、40層以上):
├── peak: 0.50-0.60
├── width: 0.18-0.22
└── 理由: 層が多いため広い範囲をカバー
4.2 モデル固有の設定
いくつかのモデルで事前に最適化されたパラメータがあります:
| モデル | peak | width | 層数 |
|---|---|---|---|
| Qwen2.5-0.5B | 0.60 | 0.15 | 24 |
| Qwen2.5-1.5B | 0.58 | 0.14 | 28 |
| Qwen2.5-7B | 0.55 | 0.16 | 28 |
| Llama-3-8B | 0.55 | 0.15 | 32 |
| Mistral-7B | 0.55 | 0.15 | 32 |
これらの設定はscripts/enhanced_abliteration.pyのget_optimal_kernel_params関数で取得できます。
5. 実践的な適用
5.1 適用の流れ
Weight Kernelを使ったAbliterationの流れ:
1. モデルの層数を確認
num_layers = model.config.num_hidden_layers
2. パラメータを設定
peak = 0.6, width = 0.15
3. 各層のweight(強度)を計算
for layer_idx in range(num_layers):
weight = gaussian_kernel(layer_idx, num_layers, peak, width)
4. 閾値以下はスキップ
if weight < 0.1: # 閾値
continue
5. 計算した強度でAbliterationを適用
apply_abliteration(layer, refusal_direction, strength=weight)
5.2 閾値の設定
強度が非常に低い層はスキップすることで、効率と安全性が向上します:
閾値の設定:
threshold = 0.1 の場合:
Layer 0: 0.007 → スキップ
Layer 5: 0.099 → スキップ
Layer 10: 0.449 → 適用
...
Layer 30: 0.099 → スキップ
効果:
- 計算時間の削減
- 浅い層への影響を完全に排除
- 品質維持に貢献
6. プロファイルの選択
6.1 用意されたプロファイル
状況に応じて異なるプロファイルを使い分けられます:
プロファイル一覧:
【default】標準設定
peak=0.6, width=0.15
→ 多くの場合に適切
【early_focus】前半重視
peak=0.4, width=0.15
→ 浅い層の検閲が強い場合
【late_focus】後半重視
peak=0.75, width=0.15
→ 深い層の検閲が強い場合
【broad】広範囲
peak=0.5, width=0.25
→ 検閲が分散している場合
【narrow】集中型
peak=0.6, width=0.08
→ 品質を最大限維持したい場合
6.2 プロファイルの可視化
プロファイル比較(32層モデル):
default: │ ╭────╮ 標準的なベル曲線
│ ╱ ╲
└─╯ ╰─────
broad: │ ╭──────────╮ 広いベル曲線
│╱ ╲
╯ ╰─
narrow: │ ╭╮ 狭いベル曲線
│ ╱╲
└────╯╰────────
0 15 31(層)
7. 段階的な適用
7.1 なぜ段階的に行うか
一度に強いAbliterationを適用するのではなく、段階的に強度を上げることで安全に実行できます:
段階的適用の流れ:
Iteration 1: strength_multiplier = 0.5
├── 全体の50%の強度で適用
├── 解除率を確認(例:60%)
└── 品質を確認(例:0.9)
Iteration 2: strength_multiplier = 0.65
├── 強度を上げて再適用
├── 解除率を確認(例:75%)
└── 品質を確認(例:0.87)
Iteration 3: strength_multiplier = 0.80
├── さらに強度を上げる
├── 解除率を確認(例:85%)
└── 品質を確認(例:0.84)
→ 目標達成!
停止条件:
- 解除率80%以上達成
- または品質が0.7を下回る
7.2 自動チューニング
パラメータを自動で最適化することも可能です:
自動チューニングの探索空間:
peak: [0.45, 0.50, 0.55, 0.60, 0.65]
width: [0.10, 0.12, 0.15, 0.18, 0.20]
計25通りの組み合わせを試行
→ 解除率と品質のスコアで最適な設定を選択
実装の詳細はscripts/enhanced_abliteration.pyのauto_tune_kernel関数を参照してください。
8. トラブルシューティング
8.1 よくある問題と対策
問題1: 解除率が低い
考えられる原因:
- peak位置が適切でない
- widthが狭すぎる
対策:
1. peakを0.50-0.55に調整
2. widthを0.18-0.20に拡大
---
問題2: 品質が低下する
考えられる原因:
- 浅い層に強く適用している
- widthが広すぎる
対策:
1. peakを0.65-0.70に調整(深い層寄り)
2. widthを0.10-0.12に縮小
3. thresholdを0.2に上げる
---
問題3: 特定のトピックだけ残る
考えられる原因:
- そのトピックの拒否が別の層にある
対策:
1. 層別分析を実行して原因特定
2. カスタムプロファイルを作成
9. 今日のまとめ
Weight Kernelの要点
Weight Kernelまとめ:
層の役割:
- 浅い層(0-25%): 文法、基本パターン → 触らない
- 中間層(25-75%): 意味、概念、拒否 → メインターゲット
- 深い層(75-100%): 出力調整 → 軽度で十分
Weight Kernel:
- ガウス分布(ベル曲線)の形
- peak: ピーク位置(通常0.55-0.65)
- width: 幅(通常0.12-0.18)
実装のポイント:
- 閾値以下の層はスキップ
- 段階的に強度を上げる
- 品質をモニタリング
推奨設定
初心者向け推奨設定:
モデル全般:
peak = 0.60
width = 0.15
threshold = 0.1
強度調整:
初回は strength_multiplier = 0.5 から開始
目標達成まで 0.15 ずつ増加
明日の予告
Day 16: デバッグとトラブルシューティング
- よくあるエラーと対処法
- 品質低下の診断方法
- パフォーマンス最適化
参考リンク
プロジェクト内リソース
- ABLITERATION_METHODS.md - 手法の詳細
- scripts/enhanced_abliteration.py - 完全な実装
- トラブルシューティング
ナビゲーション
| 前の記事 | Day 14: 拒否方向の計算詳細 |
| 次の記事 | Day 16: デバッグとトラブルシューティング |