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 15: Weight Kernelと層選択

Last updated at Posted at 2025-12-14

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.pygaussian_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.pyget_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.pyauto_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: デバッグとトラブルシューティング

  • よくあるエラーと対処法
  • 品質低下の診断方法
  • パフォーマンス最適化

参考リンク

プロジェクト内リソース


ナビゲーション

前の記事 Day 14: 拒否方向の計算詳細
次の記事 Day 16: デバッグとトラブルシューティング
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?