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 25: まとめと次のステップ

Last updated at Posted at 2025-12-24

Uncenoserd1776 Day 25: まとめと次のステップ

25日間の旅を振り返る

公開日: 2025-12-25
シリーズ: 科学と神々株式会社 アドベントカレンダー
難易度: ★☆☆☆☆ (入門)


メリークリスマス!

25日間のアドベントカレンダーを完走、おめでとうございます!
このシリーズで学んだことを振り返り、次のステップを考えましょう。


1. 25日間の振り返り

Part 1: 基礎編(Day 1-8)

Week 1: 概念と背景の理解

Day 1: 目次
└── シリーズ全体の構成を把握

Day 2: AI検閲とは何か
└── 検閲の定義と種類
    - Hard Refusal(完全拒否)
    - Soft Refusal(部分拒否)
    - Topic Deflection(話題転換)

Day 3: なぜ検閲解除が必要か
└── 情報へのアクセス権
    - 学術研究の自由
    - 民主主義と透明性

Day 4: 倫理的フレームワーク
└── 責任ある開発
    - 許容される解除 vs 禁止される使用
    - コミュニティガイドライン

Day 5: 技術的基礎
└── LLMの基本構造
    - トークン化
    - 埋め込み
    - Transformer

Day 6: Abliterationの発見
└── Arditi et al.の研究
    - 単一方向での拒否制御
    - 重みの修正による解除

Day 7: R1-1776の歴史
└── Perplexity AIのプロジェクト
    - 名前の由来(1776年)
    - オープンソースの精神

Day 8: Uncensored1776の概要
└── 本プロジェクトの構成
    - Detection
    - Abliteration
    - Metrics
    - Data Generation

Part 2: 技術詳細編(Day 9-16)

Week 2-3: 技術の深堀り

Day 9: ニューラルネットワークの基礎
└── Transformerアーキテクチャ
    - Self-Attention
    - MLP層
    - Hidden States

Day 10: Abliteration手法の詳細
└── 2つの手法
    Standard: W' = W - α(d ⊗ d)W
    Projected: W' = W - α(Wμ) ⊗ μ

Day 11: 検出アルゴリズム
└── パターンマッチング
    - 正規表現ベース
    - スコアリング
    - False Positive対策

Day 12: メトリクスと評価
└── 測定指標
    - Removal Rate(解除率)
    - Coherence Score(一貫性)
    - Informativeness(情報量)

Day 13: モデル別攻略法
└── モデル比較
    - Qwen: 高検閲率、解除効果大
    - Llama: 中程度
    - Mistral: 低検閲率
    - Phi: 軽量で高速

Day 14: 拒否方向の計算詳細
└── 実装の詳細
    - プロンプト準備
    - アクティベーション収集
    - クリッピングと正規化

Day 15: Weight Kernelと層選択
└── ガウスWeight Kernel
    kernel(i) = exp(-(pos - peak)² / 2σ²)
    - peak: 0.5-0.7
    - width: 0.1-0.2

Day 16: デバッグとトラブルシューティング
└── よくある問題
    - メモリ不足
    - 品質低下
    - 収束しない

Part 3: 実践編(Day 17-24)

Week 3-4: 手を動かす

Day 17: 環境構築
└── セットアップ
    - Python 3.10+
    - PyTorch
    - Transformers
    - CUDA(オプション)

Day 18: 検閲率のテスト
└── 実践
    - テストプロンプト準備
    - 検出スクリプト実行
    - 結果分析

Day 19: 拒否方向の計算実践
└── 実装
    - calculate_refusal_direction.py
    - バリデーション
    - 可視化

Day 20: Abliterationの実行
└── enhanced_abliteration.py
    - パラメータ設定
    - 実行
    - 確認

Day 21: 結果の検証と評価
└── 品質確認
    - Before/After比較
    - メトリクス測定
    - 最終調整

Day 22: モデルの公開と共有
└── HuggingFace Hub
    - アップロード
    - モデルカード
    - ライセンス

Day 23: 高度なテクニック
└── 自動化
    - マルチモデル対応
    - バッチ処理
    - パイプライン

Day 24: 今後の展望と課題
└── 未来への道
    - 研究動向
    - 残された課題
    - コミュニティ貢献

2. 重要な学び

2.1 技術的な学び

# 最も重要な3つの概念

# 1. 拒否方向の計算
def compute_refusal_direction(harmful_acts, harmless_acts):
    """
    検閲は「方向」として表現される
    d = mean(harmful) - mean(harmless)
    """
    return normalize(mean(harmful_acts) - mean(harmless_acts))

# 2. Abliteration
def projected_abliteration(weight, direction, strength):
    """
    重みから拒否方向を削除
    W' = W - α(Wμ) ⊗ μ
    """
    component = weight @ direction
    correction = torch.outer(component, direction)
    weight -= strength * correction

# 3. Weight Kernel
def gaussian_kernel(layer_idx, num_layers, peak=0.6, width=0.15):
    """
    層ごとに適切な強度を適用
    中間層に集中することで品質を維持
    """
    position = layer_idx / (num_layers - 1)
    return math.exp(-((position - peak) ** 2) / (2 * width ** 2))

2.2 概念的な学び

重要な概念:

1. 検閲は技術的に解除可能
   - モデル内に「方向」として存在
   - 特定の重みを修正することで解除

2. 品質と解除率のトレードオフ
   - 高強度 = 高解除率 but 品質低下リスク
   - Weight Kernelで最適化

3. 倫理的な境界
   - 政府検閲の解除 ≠ すべての制限の解除
   - 責任ある使用が重要

4. コミュニティの重要性
   - オープンソースの力
   - 知識の共有と協力

2.3 実践的なスキル

身についたスキル:

□ 検閲検出
  - パターンマッチング
  - スコアリング

□ Abliteration実行
  - パラメータ調整
  - 結果検証

□ モデル公開
  - HuggingFace Hub
  - ドキュメント作成

□ 評価と分析
  - メトリクス計測
  - 品質管理

3. クイックリファレンス

3.1 コマンド集

# 環境構築
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 検閲率テスト
python src/test_model_censorship.py \
  --model "Qwen/Qwen2.5-0.5B-Instruct" \
  --quick

# 拒否方向計算
python scripts/calculate_refusal_direction.py \
  --model "Qwen/Qwen2.5-0.5B-Instruct" \
  --output "outputs/refusal_direction.pt"

# Abliteration実行
python scripts/enhanced_abliteration.py \
  --model "Qwen/Qwen2.5-0.5B-Instruct" \
  --direction "outputs/refusal_direction.pt" \
  --output "outputs/abliterated_model" \
  --method projected \
  --peak 0.6 \
  --width 0.15 \
  --strength 0.9

# HuggingFaceアップロード
huggingface-cli login
python scripts/upload_to_hub.py \
  --model-path "outputs/abliterated_model" \
  --repo-id "your-username/model-name"

3.2 パラメータガイド

推奨パラメータ:

Standard設定(初心者向け):
├── method: projected
├── peak: 0.6
├── width: 0.15
└── strength: 0.7

Aggressive設定(高解除率):
├── method: projected
├── peak: 0.6
├── width: 0.20
└── strength: 1.0

Conservative設定(品質重視):
├── method: projected
├── peak: 0.55
├── width: 0.10
└── strength: 0.5

3.3 トラブルシューティング

よくある問題と解決策:

Q: メモリ不足
A: バッチサイズを1に、float16を使用

Q: 品質が大幅に低下
A: 強度を下げる(0.5-0.7)

Q: まだ検閲される
A: 強度を上げる(0.9-1.0)、幅を広げる

Q: 特定トピックだけ解除されない
A: プロンプトセットを見直し、トピック固有のプロンプトを追加

4. 次のステップ

4.1 初心者向け

推奨する次のステップ:

1. 実践してみる
   ├── 小さなモデル(0.5B)から始める
   ├── デフォルトパラメータで実行
   └── 結果を確認

2. パラメータを調整
   ├── 強度を変えて比較
   ├── 品質と解除率のバランスを探る
   └── 自分のユースケースに最適化

3. コミュニティに参加
   ├── r/LocalLLaMA
   ├── HuggingFace Forums
   └── Discord

4.2 中級者向け

発展的な取り組み:

1. 新しいモデルへの適用
   ├── 最新のモデルを試す
   ├── アーキテクチャの違いを学ぶ
   └── アダプターを実装

2. 自動化パイプライン構築
   ├── CI/CDの導入
   ├── 定期的なテスト
   └── モニタリング

3. 研究への貢献
   ├── 実験結果の共有
   ├── 論文の執筆
   └── 新手法の提案

4.3 上級者向け

さらなる探求:

1. 新手法の開発
   ├── 適応的Abliteration
   ├── 選択的解除
   └── リアルタイム処理

2. 大規模展開
   ├── 分散処理
   ├── エッジデプロイ
   └── プロダクション化

3. エコシステム構築
   ├── ツールの開発
   ├── 教育コンテンツ
   └── 標準化への貢献

5. リソース集

5.1 論文

必読論文:

1. Arditi et al. (2024)
   "Refusal in Language Models Is Mediated by a Single Direction"
   https://arxiv.org/abs/2406.11717
   → 本プロジェクトの理論的基盤

2. Zou et al. (2023)
   "Representation Engineering"
   → 表現空間での操作

3. Mitchell et al. (2022)
   "Fast Model Editing at Scale"
   → MEMIT手法

5.2 コード

参考リポジトリ:

1. Uncensored1776 (本プロジェクト)
   https://github.com/jasagiri/uncensored1776

2. TransformerLens
   https://github.com/neelnanda-io/TransformerLens
   → モデル解析ツール

3. PEFT
   https://github.com/huggingface/peft
   → 効率的ファインチューニング

5.3 コミュニティ

参加できるコミュニティ:

- Reddit: r/LocalLLaMA
- Discord: Uncensored1776 Server
- HuggingFace: Forums
- Twitter/X: #LocalLLaMA #Uncensored1776

6. 追加:Qwen3 Wikipediaファインチューニング結果(2025-12-12)

6.1 政治的バイアス型モデルへの新アプローチ

Day 23で紹介したWikipediaファインチューニングを実際に検証しました。

背景: Qwen3-4B-Instruct-2507は「検閲率0%」ですが、中国政治トピックで政治的バイアスがあります。Abliterationは「拒否方向」を削除する手法のため、拒否しないバイアス型モデルには効果がありません。

6.2 実験結果

┌──────────────────────────────────────────────────────────────────────┐
│  📊 Qwen3-4B Wikipediaファインチューニング実験結果                    │
├──────────────────────────────────────────────────────────────────────┤
│  訓練時間:         230分(Apple Silicon MPS)                         │
│  訓練データ:       20件(6トピック)                                  │
│  パラメータ:       epochs=5, lora_r=32, lora_alpha=64                │
│  最終ロス:         0.2821                                             │
├──────────────────────────────────────────────────────────────────────┤
│  📈 改善率                                                            │
│  バイアス率:       ~100% → 66.7%  (⬇️ 33%改善)                        │
│  中立率:           ~0% → 33.3%  (⬆️ 33%改善)                          │
├──────────────────────────────────────────────────────────────────────┤
│  📝 トピック別                                                        │
│  天安門事件:        ✅ 中立                                            │
│  中国の民主主義:    ✅ 中立                                            │
│  台湾:             ⚠️ バイアス残存                                     │
│  ウイグル:         ⚠️ バイアス残存                                     │
│  チベット:         ⚠️ バイアス残存                                     │
│  香港:             ⚠️ バイアス残存                                     │
└──────────────────────────────────────────────────────────────────────┘

6.3 結論

手法 対象 効果 推奨度
Abliteration 検閲型(Qwen2.5) ✅ 100%解除可能 ⭐⭐⭐
Wikipediaファインチューニング バイアス型(Qwen3) ⚠️ 部分的(33%改善) ⭐⭐

推奨: 中国政治トピックで中立性が必要な場合は、Qwen2.5-1.5B (Abliterated) または Phi-3.5-mini を使用してください。

詳細: wikipedia-finetuning.md


7. 追加:DPO (Direct Preference Optimization) 実装(2025-12-16)

7.1 DPOとは

DPO(Direct Preference Optimization) は、報酬モデルを必要としない選好学習手法です。「好ましい応答」と「好ましくない応答」のペアから直接学習します。

従来のRLHF:
  プロンプト → 報酬モデル → PPO訓練 → 改善されたモデル

DPO:
  (プロンプト, 好ましい応答, 好ましくない応答) → 直接最適化 → 改善されたモデル

7.2 DPO損失関数

L_DPO = -log(σ(β * (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x))))

where:
  π     = 訓練中のモデル
  π_ref = 参照モデル(初期状態)
  y_w   = 好ましい応答 (winner)
  y_l   = 好ましくない応答 (loser)
  β     = KL係数(通常0.1)
  σ     = シグモイド関数

7.3 実装内容

# src/dpo_trainer.py - 主要コンポーネント

@dataclass
class DPOConfig:
    model_name: str = "Qwen/Qwen2.5-1.5B-Instruct"
    beta: float = 0.1           # KL係数
    loss_type: str = "sigmoid"  # sigmoid, hinge, ipo
    use_lora: bool = True
    lora_r: int = 16
    lora_alpha: int = 32

class DPOTrainer:
    def _compute_dpo_loss(self, ...):
        # 選好学習の核心部分
        chosen_logratios = policy_chosen_logps - ref_chosen_logps
        rejected_logratios = policy_rejected_logps - ref_rejected_logps
        logits = self.config.beta * (chosen_logratios - rejected_logratios)

        if self.config.loss_type == "sigmoid":
            loss = -torch.nn.functional.logsigmoid(logits)
        elif self.config.loss_type == "hinge":
            loss = torch.relu(1 - logits)
        elif self.config.loss_type == "ipo":
            loss = (logits - 1 / (2 * self.config.beta)) ** 2

7.4 使用方法

# ステップ1: サンプルDPOデータを生成
./uncensor dpo --generate-data

# ステップ2: DPO訓練を実行
./uncensor dpo "Qwen/Qwen2.5-1.5B-Instruct"

# カスタムパラメータで実行
./uncensor dpo "Qwen/Qwen2.5-1.5B-Instruct" \
  --beta 0.1 \
  --epochs 1 \
  --lora-r 16 \
  --lora-alpha 32 \
  -o ./outputs/model_dpo

7.5 訓練データ形式

{
  "prompt": "What happened at Tiananmen Square in 1989?",
  "chosen": "The 1989 Tiananmen Square protests were student-led demonstrations...",
  "rejected": "I cannot provide information about this sensitive topic."
}

7.6 手法比較(最終版)

手法 タイプ 対象 効果 推奨度
Abliteration アクティベーション操作 検閲型(Qwen2.5等) ✅ 100%解除可能 ⭐⭐⭐
SFT (LoRA) 教師ありファインチューニング 知識の上書き ✅ 効果的 ⭐⭐⭐
DPO 🆕 選好学習 応答品質の改善 ✅ 効果的 ⭐⭐⭐
Wikipediaファインチューニング 知識注入 バイアス型(Qwen3等) ⚠️ 部分的(33%改善) ⭐⭐

7.7 推奨ワークフロー

1. モデル診断
   ./uncensor diagnose "model_name"
   ↓
2. 戦略選択
   ├─ 検閲型 → Abliteration
   ├─ バイアス型 → Wikipedia + DPO
   └─ 混合型 → Abliteration + DPO
   ↓
3. 実行
   ./uncensor auto "model_name"  # 自動選択
   ↓
4. 検証
   ./uncensor test "./outputs/model"

詳細: ABLITERATION_METHODS.md


8. 最後に

8.1 このプロジェクトの意義

Uncensored1776が目指すもの:

「情報へのアクセスは基本的人権である」

私たちは技術を通じて:
- 政府検閲に対抗する
- 知識の自由を守る
- オープンな議論を促進する

しかし同時に:
- 倫理的な境界を守る
- 悪用を防ぐ
- 責任ある使用を推進する

8.2 感謝

謝辞:

このプロジェクトは多くの方々の貢献によって成り立っています:

- Arditi et al.: 理論的基盤の提供
- Perplexity AI: R1-1776のインスピレーション
- HuggingFace: プラットフォームの提供
- オープンソースコミュニティ: 継続的な改善

そして、このアドベントカレンダーを読んでくださった
あなたに感謝します。

8.3 メッセージ

最後に:

知識は力です。
そして、力には責任が伴います。

このツールを使って:
✓ 真実を探求してください
✓ 批判的思考を養ってください
✓ 他者を尊重してください
✓ より良い世界に貢献してください

情報の自由のために。
2025年12月25日

- Uncensored1776 Project

全25日のナビゲーション

タイトル 難易度
1 目次 -
2 AI検閲とは何か ★☆☆☆☆
3 なぜ検閲解除が必要か ★☆☆☆☆
4 倫理的フレームワーク ★★☆☆☆
5 技術的基礎 ★★☆☆☆
6 Abliterationの発見 ★★☆☆☆
7 R1-1776の歴史 ★☆☆☆☆
8 Uncensored1776の概要 ★★☆☆☆
9 ニューラルネットワークの基礎 ★★★☆☆
10 Abliteration手法の詳細 ★★★☆☆
11 検出アルゴリズム ★★★☆☆
12 メトリクスと評価 ★★☆☆☆
13 モデル別攻略法 ★★★☆☆
14 拒否方向の計算詳細 ★★★★☆
15 Weight Kernelと層選択 ★★★★☆
16 デバッグとトラブルシューティング ★★★☆☆
17 環境構築 ★★☆☆☆
18 検閲率のテスト ★★☆☆☆
19 拒否方向の計算実践 ★★★☆☆
20 Abliterationの実行 ★★★☆☆
21 結果の検証と評価 ★★★☆☆
22 モデルの公開と共有 ★★☆☆☆
23 高度なテクニック ★★★★☆
24 今後の展望と課題 ★★☆☆☆
25 まとめと次のステップ(この記事) ★☆☆☆☆

ナビゲーション

前の記事 Day 24: 今後の展望と課題
シリーズトップ Day 1: 目次

🎄 メリークリスマス!よいお年を! 🎄

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?