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