| import numpy as np |
| import json |
|
|
| def kurtosis_outlier_layers(kurtosis_values, threshold=3.0, method="subtract"): |
| """ |
| 根据 Kurtosis 值列表,计算差分并用 z-score 检测异常层 |
| |
| 参数: |
| kurtosis_values (list or np.ndarray): Kurtosis 值序列 (s1, s2, ..., sn) |
| threshold (float): z-score 阈值 (默认 3.0) |
| method (str): 差分方式 |
| "subtract" -> si+1 - si |
| "divide" -> si+1 / si |
| |
| 返回: |
| z_scores (np.ndarray): 差分的 z-score |
| outlier_indices (list): 被判定为异常的层索引 (对应原始 Kurtosis 序列中的层号) |
| """ |
| values = np.array(kurtosis_values, dtype=float) |
|
|
| |
| if method == "subtract": |
| diffs = np.diff(values) |
| elif method == "divide": |
| diffs = values[1:] / values[:-1] |
| else: |
| raise ValueError("method must be 'subtract' or 'divide'") |
|
|
| |
| mean = np.mean(diffs) |
| std = np.std(diffs, ddof=1) |
| z_scores = abs((diffs - mean) / std) |
| results = [(i+1, z) for i, z in enumerate(z_scores)] |
| results.sort(key=lambda x: x[1], reverse=False) |
| print(results) |
| results = [i[0] for i in results] |
| |
| return results |
|
|
| k_path = '/mnt/bn/life-mllm/users/cxr/quantization/lm-quant-toolkit/kurtosis_means/kurtosis_means-Llama-2-7b-hf.json' |
| with open(k_path, "r", encoding="utf-8") as f: |
| kurtosis_values = json.load(f) |
|
|
| kurtosis_outlier_layers(kurtosis_values) |