多標籤學習綜述

多標籤學習綜述(A review on multi-label learning algorithms)

2014 TKDE(IEEE Transactions on Knowledge and Data Engineering)

張敏靈,周志華

簡單介紹

傳統監督學習主要是單標籤學習,而現實生活中目標樣本往往比較複雜,具有多個語義,含有多個標籤。本綜述主要介紹了多標籤學習的一些相關內容,包括相關定義,評價指標,8個多標籤學習算法,相關的其它任務。

論文大綱

  1. 相關定義:學習任務,三種策略
  2. 評價指標:基於樣本的評價指標,基於標籤的評價指標
  3. 學習算法:介紹了8個有代表性的算法,4個基於問題轉化的算法和4個基於算法改進的算法
  4. 相關任務:多實例學習,有序分類,多任務學習,數據流學習

相關定義

學習任務

X=RdX = \mathbb{R}^{d}表示d維的輸入空間,Y={y1,y2,...,yq}Y=\{y_1, y_2, ..., y_q\} 表示帶有q個可能標籤的標籤空間。

訓練集 D=(xi,yi)1imD = {(x^i, y^i)| 1 \leq i \leq m} ,m表示訓練集的大小,上標表示樣本序數,有時候會省略。

xiXx^i \in X ,是一個d維的向量。yiYy^i \subseteq Y ,是 YY 的一個標籤子集。

任務就是要學習一個多標籤分類器 h()h(\cdot ),預測 h(x)Yh(x)\subseteq Y作爲x的正確標籤集。

常見的做法是學習一個衡量x和y相關性的函數 f(x,yj)f(x, y_j),希望 f(x,yj1)>f(x,yj2)f(x, y_{j1}) > f(x, y_{j2}) ,其中 yj1y,yj2yy_{j1} \in y, y_{j2} \notin y

h(x)h(x) 可以由 f(x)f(x) 衍生得到 h(x)={yjf(x,yj)>t(x),yjY}h(x) = \{y_j | f(x,y_j) > t(x), y_j \in Y\}t(x)t(x) 扮演閾值函數的角色,把標籤空間對分成相關的標籤集和不相關的標籤集。

閾值函數可以由訓練集產生,可以設爲常數。當 f(x,yj)f(x, y_j) 返回的是一個概率值時,閾值函數可設爲常數0.5。

三種策略

多標籤學習的主要難點在於輸出空間的爆炸增長,比如20個標籤,輸出空間就有 2202^{20},爲了應對指數複雜度的標籤空間,需要挖掘標籤之間的相關性。比方說,一個圖像被標註的標籤有熱帶雨林和足球,那麼它具有巴西標籤的可能性就很高。一個文檔被標註爲娛樂標籤,它就不太可能和政治相關。有效的挖掘標籤之間的相關性,是多標籤學習成功的關鍵。根據對相關性挖掘的強弱,可以把多標籤算法分爲三類。

  • 一階策略:忽略和其它標籤的相關性,比如把多標籤分解成多個獨立的二分類問題(簡單高效)。
  • 二階策略:考慮標籤之間的成對關聯,比如爲相關標籤和不相關標籤排序。
  • 高階策略:考慮多個標籤之間的關聯,比如對每個標籤考慮所有其它標籤的影響(效果最優)。

評價指標

學習算法

可分爲兩類(具體算法如下圖所示)

  • 問題轉換的方法:把多標籤問題轉爲其它學習場景,比如轉爲二分類,標籤排序,多分類
  • 算法改編的方法:通過改編流行的學習算法去直接處理多標籤數據,比如改編懶學習,決策樹,核技巧。
    在這裏插入圖片描述

Binary Relevance

把多個標籤分離開來,對於q個標籤,建立q個數據集和q個二分類器來進行預測。
這是最簡單最直接的方法,是其它先進的多標籤算法的基石。
沒有考慮標籤之間的關聯性,是一個一階策略(first-order)

Classifier Chains

首先按特定的順序(這個順序是自己決定的)對q個標籤排個序,得到yτ(1)≻yτ(2)≻…≻yτ(q)。對於第j個標籤yτ(j)構建一個二分類的數據集。
Dτ(j)={([xi,preτ(j)i],1{yτ(j)yi})    1im}where preτ(j)i=(1{yτ(1)yi},...,1{yτ(j1)yi})TD_{\tau(j)}=\{ ([x^i, pre^i_{\tau(j)}], 1\{ y_{\tau(j)} \in y^i \}) \; | \; 1 \leq i \leq m\} \\ where \ pre^i_{\tau(j)}=(1\{ y_{\tau(1)} \in y^i \},...,1\{ y_{\tau(j-1)} \in y^i \})^T
第j個標籤構建的二分類數據集中,xix^i 會concat上前j-1個標籤值。
以這樣chain式的方法構建q個數據集,訓練q個分類器。
在預測階段,由於第j個分類器需要用到前j-1個分類器預測出的標籤集,所以需要順序調用這q個分類器來預測。

  1. 顯然算法的好壞會受到順序τ的影響,可以使用集成的方式,使用多個隨機序列,對每個隨機序列使用一部分的數據集進行訓練。
  2. 雖然該算法把問題分解成多個二分類,但由於它以隨機的方式考慮了多個標籤之間的關係,所以它是一個高階策略(high-order)。
  3. 該算法的一個缺點是丟失了平行計算的機會,因爲它需要鏈式調用來進行預測

Calibrated Label Ranking

算法的基本思想是把多標籤學習問題轉爲標籤排序問題,該算法通過“成對比較”來實現標籤間的排序。
對q個標籤,可以構建q(q-1)/2個標籤對,所以可以構建q(q-1)/2個數據集。
Djk={(xi,ψ(yi,yj,yk))    ϕ(yi,yj)ϕ(yi,yk),1im}where ψ(yi,yj,yk))={+1,if ϕ(yi,yj)=+1 and ϕ(yi,yk)=11,if ϕ(yi,yj)=1 and ϕ(yi,yk)=+1ϕ(yi,yj)={+1if yjyi1elseD_{jk} = \{ (x_i, \psi (y^i, y_j, y_k)) \; | \; \phi (y^i, y_j) \neq \phi (y^i, y_k), 1 \leq i \leq m \} \\ where \ \psi (y^i, y_j, y_k)) = \left\{\begin{matrix} +1, & if \ \phi (y^i, y_j) = +1 \ and \ \phi (y^i, y_k) = -1\\ -1, & if \ \phi (y^i, y_j) = -1 \ and \ \phi (y^i, y_k) = +1 \end{matrix}\right. \\ \phi (y^i, y_j) = \left\{\begin{matrix} +1 & if \ y_j \in y^i\\ -1 & else \end{matrix}\right.

  1. 只有帶有不同相關性的兩個標籤 yjy_jyky_k 的樣本纔會被包含在數據集 DjkD_{jk} 中,用該數據集訓練一個分類器,當分類器返回大於0時,樣本屬於標籤 yjy_j ,否則屬於標籤 yky_k
  2. 可以看到,每個樣本 xix_i 會被包含在 yiyi\left | y^i \right | \left | \overline{y^i} \right | 個分類器中。
  3. 在預測階段,根據分類器,每個樣本和某個標籤會產生一系列的投票,根據投票行爲來做出最終預測。
  4. 前面構造二分類器的方法使用one-vs-rest的方式,本算法使用one-vs-one,緩和類間不均衡的問題。
  5. 缺點在於複雜性高,構建的分類器個數爲 q(q1)/2q(q-1)/2,表現爲二次增長。
  6. 考慮兩個標籤之間的關聯,是二階策略(second-order)

Random k-Labelsets

算法的基本思想是把多標籤學習問題轉爲多分類問題。把 2q2^q 個可能的標籤集,映射成 2q2^q 個自然數。
映射函數記爲 σYσ_Y ,則原數據集變爲
DY+=(xi,σY(yi))1imD^+_Y={(x^i,σ_Y(y^i)) | 1≤i≤m}
所對應的新類別記爲
Γ(DY+)=σY(yi)1imΓ(DY+)min(m,2Y) \Gamma(D^+_Y) = { \sigma_Y(y^i) | 1 \leq i \leq m}, \left | \Gamma(D^+_Y) \right | \leq min(m, 2^{|Y|})
這樣來訓練一個多分類器,最後根據輸出的自然數映射回標籤集的算法稱爲LP(Label Powerest)算法,它有兩個主要的侷限性

  1. LP預測的標籤集是訓練集中已經出現的,它沒法泛化到未見過的標籤集
  2. 類別太大,低效

爲了克服LP的侷限性,Random k-Labelsets使用的LP分類器只訓練Y中的一個長度爲k的子集,然後集成大量的LP分類器來預測。
YkY^k 表示 YY 的所有的長度爲 kk 的子集,Yk(l)Y^k(l) 表示隨機取的一個長度爲 kk 的子集,這樣就可以進行收縮樣本空間,得到如下樣本集和標籤集。
DYk(l)+={(xi,σYk(l)(yiYk(l)))  1im}D^+_{Y^k(l)}= \{ (x^i, \sigma_{Y^k(l)}(y^i \cap Y^k(l) )) \ | \ 1 \leq i \leq m \}
Γ(DYk(l)+)={σYk(l)(yiYk(l))  1im}\Gamma(D^+_{Y^k(l)})= \{ \sigma_{Y^k(l)}(y^i \cap Y^k(l) ) \ | \ 1 \leq i \leq m \}
更進一步,我們隨機取n個這樣的子集:
Yk(lr),1rnY^k(l_r), 1 \leq r \leq n
來構造n個分類器做集成。
最後預測的時候需要計算兩個指標,一個爲標籤j能達到的最大投票數,一個爲實際投票數。
τ(x,yj)=r=1n1{yjYk(lr)}\tau(x, y_j) = \sum_{r=1}^{n} 1\{ y_j \in Y^k(l_r)\}
μ(x,yj)=r=1n1{yjσYk(l)1(gYk(l)+(x))}\mu (x, y_j) = \sum_{r=1}^{n} 1\{ y_j \in \sigma_{Y^k(l)}^{-1}(g^+_{Y^k(l)}(x) )\}
其中$ \sigma_{Yk(l)}{-1}(\cdot)表示從自然數映射回標籤集的函數,g^+(\cdot)$表示分類器學習到的函數。最後預測的時以0.5爲閾值進行預測,得到標籤集。
y={yj  μ(x,yj) / τ(x,yj)>0.5 , 1jq}y = \{ y_j \ | \ \mu (x, y_j) \ / \ \tau(x, y_j) > 0.5\ , \ 1 \leq j \leq q\}
因爲是隨機長度爲k的子集,考慮了多個標籤之間的相關性,所以是高階策略(high-order)。

Multi-Label k-Nearest Neighbor(ML-KNN)

N(x)N(x) 表示 xxkk 個鄰居,則 Cj=(x,y)N(x)1yjyC_j=∑(x,y)∈N(x)1{yj∈y} 表示樣本 xx 的鄰居中帶有標籤yjy_j的鄰居個數。 用 HjH_j 表示樣本 xx 含有標籤 yjy_j ,根據後驗概率最大化的規則,有
y={yj  P(Hj  Cj) / P(Hj  Cj)>1 , 1jq}y = \{y_j \ | \ P(H_j \ | \ C_j)\ / \ P(\urcorner H_j \ | \ C_j) > 1 \ , \ 1 \leq j \leq q \}
根據貝葉斯規則,有
P(Hj  Cj)P(Hj  Cj)=P(H)P(Cj  Hj)P(H)P(Cj  Hj)\frac{P(H_j \ | \ C_j)} {P(\urcorner H_j\ | \ C_j)} = \frac {P(H) \cdot P(C_j \ | \ H_j)} {P(\urcorner H) \cdot P(C_j \ | \ H_j)}
先驗概率 P(Hj),P(Hj)P(H_j),P(\urcorner H_j) 可以通過訓練集計算得到,表示樣本帶有或不帶有標籤 yqy_q 的概率
P(Hj)=s+i=1m1{yjyi}s×2+mP(Hj)=1P(Hj)  (1jq)P(H_j) = \frac { s + \sum_{i=1}^{m} 1\{ y_j \in y^i \} } {s \times 2 + m} \\ P(\urcorner H_j) = 1 - P(H_j) \ \ (1 \leq j \leq q)
其中s是平滑因子,s爲1時則使用的是拉普拉斯平滑。
條件概率的計算需要用到兩個值
κj[r]=i=1m1{yjyi}1{δj(xi)=r}    (0rk)κ~j[r]=i=1m1{yjyi}1{δj(xi)=r}    (0rk)where  δj(xi)=(x,y)N(xi)1{yjy}\kappa_j[r] = \sum_{i=1}^{m} 1\{ y_j \in y^i \} \cdot 1\{ \delta_j(x^i) = r \} \ \ \ \ (0 \leq r \leq k) \\ \tilde{\kappa}_j[r] = \sum_{i=1}^{m} 1\{ y_j \notin y^i \} \cdot 1\{ \delta_j(x^i) = r \} \ \ \ \ (0 \leq r \leq k) \\ where \ \ \delta_j(x^i) = \sum_{(x^*,y^*) \in N(x^i)} 1 \{y_j \in y^*\}
κj[r]\kappa_j[r]表示“含有標籤 yjy_j而且 rr 個鄰居也含有標籤 yjy_j 的”樣本的個數。
κ~j[r]\tilde{\kappa}_j[r]表示“不含有標籤yjy_j 但是 rr 個鄰居含有 yjy_j 的”樣本的個數。
根據這兩個值,可以計算相應的條件概率
P(Cj  Hj)=s+κj[Cj]s×(k+1)+r=0kκj[r]  (1jq,0Cjk)P(Cj  Hj)=s+κ~j[Cj]s×(k+1)+r=0kκ~j[r]  (1jq,0Cjk)P(C_j \ | \ H_j) = \frac{s+\kappa_j[C_j]} {s \times (k+1) + \sum_{r=0}^{k} \kappa_j[r]} \ \ (1 \leq j \leq q, 0 \leq C_j \leq k) \\ P(C_j \ | \ \urcorner H_j) = \frac{s+\tilde{\kappa}_j[C_j]} {s \times (k+1) + \sum_{r=0}^{k} \tilde{\kappa}_j[r]} \ \ (1 \leq j \leq q, 0 \leq C_j \leq k)

這兩個條件概率表示的是,樣本帶有或不帶有標籤 yjy_j 的條件下,它有 CjC_j 個鄰居帶有標籤yjy_j 的概率。

  1. 由上述的條件概率,先驗概率則可以根據貝葉斯規則和後驗概率最大化,計算出樣本的標籤集
  2. 需要注意的是該方法不是KNN和獨立二分類的簡單結合,因爲算法中還使用了貝葉斯來推理鄰居信息
  3. 沒有考慮標籤之間的相關性,是一階策略(first-order)

Multi-Label Decision Tree(ML-DT)

使用決策樹的思想來處理多標籤數據,數據集TT中,使用第ll個特徵,劃分值爲 ϑ\vartheta,計算出如下信息增益:
IG(T,l,ϑ)=MLEnt(T)ρ{,+}TρTMLEnt(Tρ)where  T={(xi,yi)  xilv,1in}where  T+={(xi,yi)  xil>v,1in}IG(T, l, \vartheta ) = MLEnt(T) - \sum_{\rho \in \{-, +\} } \frac{|T^{\rho }|} {\left | T \right |} \cdot MLEnt(T^{\rho}) \\ where \ \ T^- = \{ (x^i, y^i) \ | \ x_{il} \leq v, 1 \leq i \leq n\} \\ where \ \ T^+ = \{ (x^i, y^i) \ | \ x_{il} \gt v, 1 \leq i \leq n\}

遞歸地構建一顆決策樹,每次選取特徵和劃分值,使得上式的信息增益最大。
其中式子中的熵的公式可以按如下計算(爲了方便計算,假定標籤之間獨立)。
MLEnt(T)=j=1qpjlog2pj(1pj)log2(1pj)where  pj=i=1n1{yjyi}nMLEnt(T) = \sum_{j=1}^{q} -p_j log_2p_j - (1-p_j)log_2(1-p_j) \\ where \ \ p_j= \frac {\sum_{i=1}^{n} 1\{ y_j \in y^i \}} {n}

  1. 新樣本到來時,向下遍歷決策樹的結點,找到葉子結點,若pj大於0.5則表示含有標籤yj
  2. 該算法不是決策樹和獨立二分類的簡單結合(如果是的話,應該構建q棵決策樹)
  3. 沒有考慮標籤的相關性,是一階策略(first-order)

Ranking Support Vector Machine(Rank-SVM)

使用最大間隔的思想來處理多標籤數據。
Rank-SVM考慮系統對相關標籤和不相關標籤的排序能力。
考慮最小化 xix^i 到每一個“相關-不相關”標籤對的超平面的距離,來得到間隔。
min(xi,yi)Dmin(yj,yk)yi×yiwjwk,xi+bjbkwjwk\min_{(x^i, y^i) \in D} \min_{(y_j, y_k) \in y^i \times \overline{y^i}} \frac{ \langle w_j-w_k,x^i \rangle +b_j-b_k}{\left \| w_j - w_k\right \|}
像SVM一樣對w和b進行縮放變換後可以對式子進行改寫,然後最大化間隔,再調換分子分母進行改寫,得到:
minwmax1j<kqwjwk2subject to:  wjwk,xi+bjbk1(1im,  (yi,yk)yi×yi)\begin{matrix} \min_{w} & \max_{1 \leq j < k \leq q} {\left \| w_j - w_k\right \|^2}\\ subject\ to: & \; \langle w_j - w_k, x^i \rangle + b_j - b_k \geq 1 \\ & (1 \leq i \leq m, \ \ (y_i,y_k) \in y^i \times \overline{y^i}) \end{matrix}
爲了簡化,用sum操作來近似max操作
minwj=1qwj2subject to:  wjwk,xi+bjbk1(1im,  (yi,yk)yi×yi)\begin{matrix} \min_{w} & \sum_{j=1}^q {\left \| w_j \right \|^2}\\ subject\ to: & \; \langle w_j - w_k, x^i \rangle + b_j - b_k \geq 1 \\ & (1 \leq i \leq m, \ \ (y_i,y_k) \in y^i \times \overline{y^i}) \end{matrix}

跟SVM一樣,爲了軟間隔最大化,引入鬆弛變量,得到下式:
minw,Ξj=1qwj2+Ci=1m1yiyi(yi,yk)yi×yi)ξijksubject to:  wjwk,xi+bjbk1ξijkξijk>0 (1im,  (yi,yk)yi×yi)Ξ={ξijk  1im, (yi,yk)yi×yi}\begin{matrix} \min_{w, \Xi } & \sum_{j=1}^q {\left \| w_j \right \|^2} + C \sum_{i=1}^m \frac {1}{\left | y^i \right | \left | \overline{y^i} \right | } \sum_{(y_i,y_k) \in y^i \times \overline{y^i})} \xi _{ijk} \\ subject\ to: & \; \langle w_j - w_k, x^i \rangle + b_j - b_k \geq 1 - \xi _{ijk}\\ & \xi _{ijk} > 0 \ (1 \leq i \leq m, \ \ (y_i,y_k) \in y^i \times \overline{y^i}) \end{matrix} \\ 其中\Xi = \{ \xi_{ijk} \ | \ 1 \leq i \leq m, \ (y_i,y_k) \in y^i \times \overline{y^i} \}

  1. 跟SVM一樣,最終的式子是一個二次規劃問題,通常調用現有的包來解。
  2. 對於非線性問題則使用核技巧來解決。
  3. 由於定義了”相關-不相關“標籤對的超平面,這是個二階策略(second-order)

Collective Multi-Label Classifier(CML)

該算法的核心思想最大熵原則。用 (x,y)(x,y) 表示任意的一個多標籤樣本,其中 y=(y1,y2,...,yq){1,+1}qy = (y_1, y_2, ..., y_q) \in \{-1, +1\}^q 算法的任務等價於學習一個聯合概率分佈 p(x,y)p(x,y) ,用Hp(x,y)H_p(x,y) 表示給定概率分佈 pp(x,y)(x,y) 的信息熵。最大熵原則認爲熵最大的模型是最好的模型。
maxpHp(x,y)subject to:Ep[fk(x,y)]=Fk (kK)\begin{matrix} &\max_{p} H_p(x,y) \\ &subject \ to: E_p[f_k(x,y)] = F_k \ (k \in K) \end{matrix}
其中 fk(x,y)f_k(x,y) 是一個特徵函數,描述 xxyy 之間的一個事實 kk ,滿足這個事實時返回1,否則返回0。約束做的是希望這個分佈上,特徵函數的期望能夠等於一個我們希望的值 FkF_k,這個值通常通過訓練集來估計。解這個優化問題,會得到
p(yx)=1ZΛ(x)exp(kKλkfk(x,y))p(y|x) = \frac{1}{Z_{\Lambda}(x) } exp(\sum_{k \in K} \lambda_k \cdot f_k(x,y))
其中Λ=λkkKΛ={λk|k∈K}表示一系列的權重。ZΛ=yexp(kKλkfk(x,y))λkN(0,ε2)logΛZ_{\Lambda} = \sum_y exp(\sum_{k \in K} \lambda_k \cdot f_k(x,y)) 作爲規範化因子。假設有一個高斯先驗\lambda_k \sim N(0, \varepsilon^2),就可以通過最大化以下這個log後驗概率來求得參數\Lambda
l(ΛD)=logP(DΛ)+logP(Λ)=log(x,y)Dp(yx)+logP(Λ)=log((x,y)Dp(yx))kKλ22ε2\begin{matrix} l(\Lambda | D) & = log P(D|\Lambda) + log P(\Lambda) \\ & = log \prod_{(x,y) \in D} p(y|x) + log P(\Lambda) \\ & = log(\prod_{(x,y) \in D} p(y|x)) - \sum_{k \in K} \frac {\lambda^2}{2 \varepsilon^2} \\ \end{matrix}

  1. 這是個凸函數,可以調用現成的無約束優化方法比如BFGS直接求解。求得參數就可以得到要學習的概率分佈 p(yx)p(y|x)
  2. 對於一系列約束K,分爲兩個部分
  3. K1={(l,j)1ld,1jq}K_1 = \{ (l,j) | 1 \leq l \leq d, 1 \leq j \leq q\},有 dqd⋅q 個約束,特徵函數爲
    fk(x,y)=xl1{yj==1},  k=(l,j)K1f_k(x,y) = x_l \cdot 1 \{ y_j == 1 \} , \ \ k = (l,j) \in K_1
  4. K2=(j1,j2,b1,b2)1j1<j2q,b1,b21,+1K_2 = { (j_1, j_2, b_1, b_2) | 1 \leq j_1 < j_2 \leq q, b_1, b_2 \in { -1, +1 } },有 4(q2)4 \cdot \binom{q}{2} 個約束,特徵函數爲
    fk(x,y)=1{yj1=b1}1{yj2=b2},  k=(j1,j2,b1,b2)K2f_k(x,y) = 1 \{ y_{j1} = b_1 \} \cdot 1 \{ y_{j2} = b_2 \}, \ \ k = (j_1, j_2, b_1, b_2) \in K_2
  5. 由於K約束中考慮了標籤對之間的關聯,該算法是個二階策略(second-order)。

相關任務

  1. 多實例學習(Multi-instance learning):每個樣本由多個實例和一個標籤組成,多個實例中至少一個爲正,認爲該樣本爲正。和多標籤學習的輸出空間模糊相反,多實例學習是輸入空間模糊。
  2. 有序分類(Ordinal classification):對於每個標籤,不再是簡單地判斷是還是否,而是改成一系列的等級排序,把yj={−1,+1}替換成yj={m1,m2,…,mk}, where m1<m2<…<mk
  3. 多任務學習(Multi-task learning):同時訓練多個任務,相關任務之間的訓練信息會幫助其它任務。比如目標定位既要識別有沒有目標(分類問題)又要定位出目標的位置(迴歸問題)。
  4. 數據流學習(Data streams classification):真實世界的目標是在線生成和實時產生的,如何處理這些數據就是數據流學習要做的事。一個關鍵的挑戰就是“概念漂移”(目標變量的統計特性隨着時間的推移以不可預見的方式變化),一般處理方式有:當一大批新數據到來時更新分類器;維持一個檢測器來警惕概念漂移;假定過去數據的影響會隨着時間而衰減。

總結

  1. 論文主要介紹了多標籤學習的一些概念定義,策略,評價指標,以及8個有代表性的算法,其中對多種評價指標和多個算法都做了清晰的分類和詳細的闡述。
  2. 儘管挖掘標籤關聯性的想法被應用到許多算法中,但是仍然沒有一個正式的機制。有研究表示多標籤之間的關聯可能是非對稱的(我對你的影響和你對我的影響是不同的),局部的(不同樣本之間的標籤相關性不同,很少關聯性是所有樣本都滿足的)。
  3. 但是不管怎麼說,充分理解和挖掘標籤之間的相關性,是多標籤學習的法寶。尤其是巨大輸出空間場景下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章