---
# System prepended metadata

title: 研究筆記：以最佳化觀點重構 Slope-Aware TPE 理論架構

---

# 研究筆記：以最佳化觀點重構 Slope-Aware TPE 理論架構

## 1. 問題動機與目標函數設定

在 st-ReID 系統中，我們觀察到模型雖已具備良好的視覺特徵提取能力，但在實際應用中，人物可能出現在不同的攝影機角度與時間下，導致視覺特徵分數的不穩定，或融合後分數分布過於飽和。因此，我們將研究焦點放在**融合層的平滑函數**上。

#### 目標函數
  $$
  f(x; \lambda, \gamma) = \frac{1}{1 + \lambda e^{-\gamma x}}
  $$

### 為什麼最佳化對象是「融合層」而非「模型本體」？

* 模型本體（如 ResNet、PCB 等）已透過 ImageNet 預訓練，並在 ReID 資料集上收斂良好。
* 在部署或不同場景轉換時，重新訓練整個模型代價高昂，且不具可行性。
* 然而，最終推論時的判斷仍依賴融合後的相似度分數（包含視覺與時空），此階段的調整成本低、彈性高。
* 因此我們選擇將最佳化目標設於融合函數的形狀（λ, γ）與排序策略（α, β）上，以提升最終辨識的穩定性與適應性。

### 最佳化邏輯的關鍵區分：

* **f(p)** 是最終的預測目標函數，也是我們要最大化的效能分數（如 ReID matching score）
* **A(p)** 是我們提出的 TPE 排序用函數，結合了分數與斜率：

  $$
  A(p) = \alpha \cdot \text{norm}(f(p)) + \beta \cdot \text{norm}(|f'(p)|)
  $$
* 在 TPE 搜尋中，排序與探索方向由 A(p) 決定，而非 f 本身
* 此設計可避免 TPE 探索陷入平坦飽和區（雖然 f 高，但不可導引）
* α 與 β 的數值無法事先確定，因此我們使用\*\*線性搜尋法（linear search）\*\*在 α ∈ \[0, 1] 區間內尋找最佳平衡參數組合。

### 關鍵補充：我們是否真正建構出合理的「時空座標系統」？

經回顧 st-ReID 原始設計，我們發現其時空建構方式並非連續時間函數，而是基於「攝影機 ID 配對」與「時間差」的統計表（distribution.mat）：

* 每個 (camA → camB) 組合都建立一個 histogram，統計人物移動的時間差機率分布；
* 該分布非數學函數，而是訓練資料中的**經驗分布近似**；
* 在推論階段，系統透過 `(query_cam, gallery_cam, Δt)` 三項資訊查表取得一個時空分數。

因此：

* 我們在模擬或最佳化 λ, γ 時，不應僅用單一連續時間軸作為基準；
* 而是應該根據具體的 cam pair 生成特定時空機率分布，
* 再在該分布基礎上疊加 λ, γ 控制的平滑機制。

這項理解極為關鍵，因為若我們的目標是修正 f(p) 與實際場域行為的誤差，則必須確保 f(p) 的輸入來源（即時空座標系）是真正合理且與部署場景相符的。

---

## 2. 最佳化流程規劃：選擇有效的 TPE 策略

### 2.1 定義參數空間與變數：

* 設定可調超參數 $\lambda, \gamma$
* 設定輸入範圍與候選參數點（離散或連續）

### 2.2 選擇強化型 TPE 優化器：

* 採用改良型 TPE，結合排序策略與額外搜尋導引能力
* 可選方案如：使用 acquisition function 加強探索性

### 2.3 設計引導排序策略（預設為 slope-aware）：

定義引導分數如下：

$$
A(p) = \alpha \cdot \text{norm}(f(p)) + \beta \cdot \text{norm}(|f'(p)|)
$$

其中：

* $\alpha, \beta \in [0,1], \alpha + \beta = 1$
* $\text{norm}(\cdot)$：表示將數值正規化至 \[0,1] 區間
* $f'(p)$：數值微分估計的斜率，例如：

$$
f'(p) \approx \frac{f(p_i) - f(p_{i-1})}{p_i - p_{i-1}}
$$

### 2.4 評估機制與終止條件：

* 每一次評估點 $(\lambda, \gamma)$，記錄對應的 $f(p)$
* 儲存歷史資料供 TPE 建模與更新
* 終止條件：最大次數 N 或誤差收斂 ε


```mermaid
sequenceDiagram
    participant User
    participant TPE
    participant Function_f
    participant Acquisition_A
    participant History

    User->>TPE: 定義 λ, γ 的搜尋空間
    TPE->>Acquisition_A: 使用 A(p) 排序候選點
    loop 每次迭代
        TPE->>Function_f: 提供 λ, γ，計算 f(p)
        Function_f-->>TPE: 回傳 f(p)
        Function_f->>Acquisition_A: 計算斜率 f'(p)
        Acquisition_A-->>TPE: 回傳 A(p)
        TPE->>History: 儲存 (λ, γ, f(p), A(p))
        TPE->>TPE: 更新內部機率模型
    end
    TPE-->>User: 輸出最佳 (λ*, γ*)
```

---

## 3. 行為觀察與搜尋穩定性分析

在執行強化型 TPE 搜尋後，我們觀察到以下行為：

* 若缺乏斜率資訊，引導可能過度偏好高分區但已飽和之點
* 經 slope-aware 導引後，參數搜尋範圍更均衡、結果更穩定

這些行為成為進一步驗證與比較不同排序策略的重要依據。

---

## 4. 理論與策略說明：以搜尋導引取代目標修改

### 4.1 保留 $f(p)$ 為唯一最佳化目標：

避免數學目標漂移，保證推論邏輯一致。

### 4.2 利用 $A(p)$ 作為引導排序基準：

$$
A(p) = \alpha \cdot \text{norm}(f(p)) + \beta \cdot \text{norm}(|f'(p)|)
$$

其中 $\alpha + \beta = 1$，為可調參數。

### 4.3 策略邏輯：

* 推論使用 $f(p)$
* 搜尋過程排序使用 $A(p)$
* 目的為避免搜尋陷入飽和或低反應區域

---

## 5. 合理性分析與延展性說明

### 5.1 與目標函數一致性：

* 保留 $\max f(p)$ 為唯一目標
* 所有排序機制皆不進入決策層或修改推論過程

### 5.2 系統穩定性提升：

* lambda、gamma 收斂性更穩定，不易掉入極端值

### 5.3 延展性：

* 可延伸至多分支決策系統與其他後融合機制

---

## 6. 實驗設計規劃

### 6.1 模擬函數設定：

* 使用 sigmoid 類函數模擬 $f(p)$
* 模擬不同初始設定下參數搜尋結果

### 6.2 評估指標：

* $f(p)$ 的提升幅度與穩定性
* 是否出現極端收斂（lambda=0、gamma=∞）
* slope-aware 與 baseline TPE 比較效果

---

## 7. 結論與後續行動

本筆記從最佳化觀點出發，重構整體搜尋與設計邏輯。強調使用排序導引而非改寫目標，保持數學一致性與應用彈性。接下來將進行 MATLAB 模擬與視覺化，驗證各搜尋策略的差異與穩定性。

---

## 8. Spatial-Temporal-Re-identification

[原github程式專案連結](https://github.com/Wanggcong/Spatial-Temporal-Re-identification.git)

```mermaid
flowchart TD
    A[資料準備 prepare.py] --> B[模型訓練 train_market.py / train_duke.py]
    B --> C[特徵提取 test_st_market.py / test_st_duke.py]
    C --> D[建立時空分布 gen_st_model_*.py]
    D --> E[融合評估 evaluate_st.py]
    E --> F[產出分數矩陣 gen_rerank_all_scores_mat.py]
    F --> G[重排序與最終評估 evaluate_rerank_*.py]

    subgraph 模型訓練與提取流程
        B -->|訓練完成後| C
    end

    subgraph 時空建模與融合
        D -->|生成 distribution.mat| E
        C -->|提供 features.mat| E
    end

    E -->|最終輸出 Rank-1, mAP| 結果1[→ 評估指標顯示]

    G -->|輸出優化後排序結果| 結果2[→ 最佳化評估指標]
```

---

9. matlab code

```matlab=

% lambda1_env_adaptor_with_derivative.m
% 評分公式改為 f(p) * f'(p)，提升 λ₁ 穩定性與辨識力

clear; clc;
rng(1);

logistic = @(x, lambda, gamma) 1 ./ (1 + lambda .* exp(-gamma .* x));
logistic_prime = @(x, lambda, gamma) ...
    (lambda .* gamma .* exp(-gamma .* x)) ./ (1 + lambda .* exp(-gamma .* x)).^2;

simulate_st_prob = @(deltat, mu) smooth_hist(deltat, mu, mu/2);
compute_joint_score = @(lambda1, gamma1, deltat, mu) ...
    compute_logistic_score(lambda1, gamma1, simulate_st_prob(deltat, mu));

mu_list = 1:1:20;
best_lambda1 = [];
gamma1 = 5;

for mu = mu_list
    deltat = mu;
    history = [];

    for i = 1:20
        l1 = rand() * 4.5 + 0.5;
        score = compute_joint_score(l1, gamma1, deltat, mu);
        history(end+1, :) = [l1, score];
    end

    for iter = 1:50
        scores = history(:,2);
        threshold = quantile(scores, 0.75);
        good = history(scores >= threshold, :);
        center = good(randi(size(good,1)), 1);
        l1 = min(max(center + randn()*0.2, 0.5), 5);
        score = compute_joint_score(l1, gamma1, deltat, mu);
        history(end+1, :) = [l1, score];
    end

    [~, idx] = max(history(:,2));
    best_lambda1(end+1) = history(idx, 1);
end

% Plot
figure;
plot(mu_list, best_lambda1, '-o', 'LineWidth', 2, 'Color', [1, 0.4, 0], ...
    'DisplayName', 'Best \lambda_1 (f * f'')');
xlabel('Mean Transit Time \mu (seconds)');
ylabel('Best \lambda_1');
title('\lambda_1 vs. \mu (TPE Score = f(p) \cdot f''(p))');
grid on; legend;

% ===== 子函數 =====

function s = compute_logistic_score(lambda, gamma, x)
    f = 1 / (1 + lambda * exp(-gamma * x));
    fp = (lambda * gamma * exp(-gamma * x)) / (1 + lambda * exp(-gamma * x))^2;
    s = f * fp;  % 新策略：分數 * 導數
end

function p = smooth_hist(deltat, mu, sigma)
    bin_centers = 2.5:5:97.5;
    true_dist = normpdf(bin_centers, mu, sigma);
    true_dist = true_dist / sum(true_dist);
    hist = true_dist + 0.02 * randn(size(true_dist));
    hist(hist < 0) = 0; hist = hist / sum(hist);
    kernel = normpdf(-3:3, 0, 1.5); kernel = kernel / sum(kernel);
    smoothed = conv(hist, kernel, 'same');
    [~, idx] = min(abs(bin_centers - deltat));
    p = smoothed(idx);
end

```

![image](https://hackmd.io/_uploads/SJljtYuWgl.png)
