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 を使用してください。
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"
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: 目次 |
🎄 メリークリスマス!よいお年を! 🎄