# 研究筆記:以最佳化觀點重構 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)