馮楚瀅, 司徒國(guó)強(qiáng), 倪瑋隆
(蘭州交通大學(xué) 電子與信息工程學(xué)院, 蘭州 730070)
協(xié)同過(guò)濾(Collaborative Filtering)是許多推薦系統(tǒng)常用的方法[1]. 傳統(tǒng)的基于協(xié)同過(guò)濾的方法使用用戶給出的項(xiàng)目評(píng)分作為學(xué)習(xí)推薦的唯一信息來(lái)源. 但是, 許多應(yīng)用程序的評(píng)分通常較少, 導(dǎo)致基于協(xié)同過(guò)濾的方法的推薦性能顯著降低. 為了解決這個(gè)稀疏性問(wèn)題, 本文利用諸如項(xiàng)目?jī)?nèi)容信息的輔助信息一同作為信息來(lái)源提出了稱為協(xié)同深度學(xué)習(xí)(Collaborative In Deep Learning, CIDL)的算法, 該算法分別執(zhí)行用于內(nèi)容信息的深度表示學(xué)習(xí)以及用于評(píng)價(jià)(反饋)矩陣的協(xié)同過(guò)濾.
本文將協(xié)同深度學(xué)習(xí)算法應(yīng)用于電影推薦系統(tǒng),對(duì)大量的電影評(píng)分進(jìn)行建模, 分析觀影用戶對(duì)電影的偏好隨著時(shí)間的推移而變化的情況, 從而對(duì)客戶進(jìn)行個(gè)性化電影推薦[2]. 本文的創(chuàng)新點(diǎn)主要在于: (1) 與以往使用分類[3]和重構(gòu)[4]等簡(jiǎn)單目標(biāo)的深度學(xué)習(xí)模型不同,本文在概率框架中使用協(xié)同過(guò)濾作為更復(fù)雜的目標(biāo). (2)除了獲得最大后驗(yàn)概率(Maximum A Posteriori, MAP)估計(jì)的算法外, 本文還推導(dǎo)了一種基于采樣的CIDL貝葉斯處理算法, 該算法是一種貝葉斯推廣的反向傳播算法. (3) 協(xié)同深度學(xué)習(xí)是一個(gè)用于彌合現(xiàn)有深度學(xué)習(xí)模型和推薦系統(tǒng)之間差距的等級(jí)貝葉斯模型. 此外,由于其貝葉斯性質(zhì), CIDL可以輕松擴(kuò)展并納入其他輔助信息以進(jìn)一步提升性能.
由于許多在線服務(wù)中用戶有大量的選擇, 推薦系統(tǒng)得到了大量運(yùn)用[5]. 對(duì)于個(gè)人而言, 使用推薦系統(tǒng)可以讓我們更有效地使用信息. 此外, 許多公司(例如淘寶和各大音樂(lè)播放器)已經(jīng)廣泛地使用推薦系統(tǒng)來(lái)定位他們的客戶. 推薦系統(tǒng)的現(xiàn)有方法大致可以分三類[6]: 基于內(nèi)容的方法, 基于協(xié)同過(guò)濾的方法和混合方法. 基于內(nèi)容的方法利用用戶程序或產(chǎn)品描述來(lái)進(jìn)行推薦
基于協(xié)同過(guò)濾的方法使用過(guò)去的活動(dòng)或偏好, 例如用戶對(duì)項(xiàng)目的評(píng)分, 而不使用用戶或產(chǎn)品內(nèi)容信息.混合方法通過(guò)結(jié)合基于內(nèi)容的方法和基于協(xié)同過(guò)濾的方法來(lái)獲得兩全其美的結(jié)果.
根據(jù)判斷評(píng)分信息與輔助信息之間是否存在雙向交互, 可以進(jìn)一步將混合方法分為兩類: 松耦合方法和緊密耦合方法. 松散耦合的方法[7]一次處理輔助信息,然后用它為協(xié)同過(guò)濾模型提供特征. 由于信息流是單向的, 因此評(píng)級(jí)信息無(wú)法提供反饋來(lái)指導(dǎo)提取有用的功能. 對(duì)于這個(gè)子類別, 改進(jìn)通常需要依靠手動(dòng)和乏味的特征工程過(guò)程. 相反, 緊密耦合的方法允許雙向交互[8]. 一方面, 評(píng)分信息可以指導(dǎo)特征的學(xué)習(xí). 另一方面, 提取的特征可以進(jìn)一步提高協(xié)同過(guò)濾模型的預(yù)測(cè)能力. 通過(guò)雙向交互, 緊密耦合的方法可以自動(dòng)從輔助信息中學(xué)習(xí)特征, 并自然平衡評(píng)級(jí)和輔助信息的影響.
隨著深度學(xué)習(xí)以及推薦系統(tǒng)的發(fā)展, 對(duì)于深度學(xué)習(xí)與推薦系統(tǒng)結(jié)合的研究也越來(lái)越多, 文獻(xiàn)[9]選用了與本文相同的SDAE模型從用戶自由文本標(biāo)簽中抽取項(xiàng)目的顯式特征信息, 再使用改進(jìn)隱因子模型算法對(duì)進(jìn)行矩陣分解, 最終得出推薦矩陣, 但對(duì)于數(shù)據(jù)陷入局部最優(yōu)的問(wèn)題沒(méi)有很好的解決. 文獻(xiàn)[10]中使用結(jié)合協(xié)同過(guò)濾推薦和基于內(nèi)容推薦的混合模型,其中基于內(nèi)容推薦的部分使用了深度學(xué)習(xí)內(nèi)容. 但對(duì)于這種方法而言, 是將兩種算法產(chǎn)生的結(jié)果按比例返回作為推薦結(jié)果. 兩種算法沒(méi)有很好的融合在一起共同作用. 按比例返回結(jié)果的比例也很難把控. 文獻(xiàn)[11]使用了兩個(gè)堆疊降噪編碼器來(lái)學(xué)習(xí)以得出推薦矩陣, 但預(yù)處理數(shù)據(jù)和訓(xùn)練模型時(shí)花費(fèi)了較長(zhǎng)的時(shí)間,最優(yōu)效果有待改進(jìn). 文獻(xiàn)[12]引入深度學(xué)習(xí)模型提升算法性能,但對(duì)于算法的調(diào)參提出了更高的要求,并且算法的復(fù)雜度也相比傳統(tǒng)算法提升不少.
本文介紹了一種稱為協(xié)同深度學(xué)習(xí)模型(Collaborative In Deep Learning, CIDL)的分層貝葉斯模型,作為推薦系統(tǒng)的一種新型緊耦合方法. 協(xié)同深度學(xué)習(xí)模型基于一種稱為堆疊降噪自動(dòng)編碼器(Stacked Denoising AutoEncoder, SDAE)的貝葉斯公式[13]. 協(xié)同深度學(xué)習(xí)模型將內(nèi)容信息的深度表示學(xué)習(xí)與評(píng)級(jí)(反饋)矩陣的協(xié)作過(guò)濾緊密結(jié)合在一起, 從而允許兩者之間的雙向交互.
本文采用隱式反饋來(lái)訓(xùn)練和測(cè)試數(shù)據(jù). 整個(gè)項(xiàng)目數(shù)據(jù)J(電影)的數(shù)據(jù)集合由一個(gè)j行S列的矩陣XC來(lái)表示,J項(xiàng)目中的j行是由基于詞匯庫(kù)大小為S的詞袋模型向量XC, j*組成的. 對(duì)于整個(gè)用戶數(shù)據(jù)集合I, 定義一個(gè)i行j列的二元評(píng)分矩陣R=Ri, j. 給定R中的部分評(píng)級(jí)和內(nèi)容信息XC, 用來(lái)預(yù)測(cè)R中的其他評(píng)級(jí),R的維度為K.X0為噪聲破壞輸入, 同樣是一個(gè)j行S列的矩陣,XC的作用為凈化輸入到SDAE中的X0.Xl為SDAE的第 l層的輸出,Xl的j行表示為Xl,j*.Wl為 l層的權(quán)重矩陣,bl為偏差矢量.W+表示所有層的權(quán)重矩陣和偏差矢量的集合.
本文使用自動(dòng)編碼器學(xué)習(xí)數(shù)據(jù)并得到訓(xùn)練后的網(wǎng)絡(luò), 在利用訓(xùn)練后的網(wǎng)絡(luò)生成用戶和項(xiàng)目間的隱含特征矩陣. 最后將該矩陣輸入CIDL算法中訓(xùn)練學(xué)習(xí), 最終得到新的評(píng)分矩陣. 流程圖1所示.
圖1 中的具體步驟如下:
(1)對(duì)數(shù)據(jù)進(jìn)行預(yù)處理
本文中使用的數(shù)據(jù)由兩部分組成. 第一部分, 收視率和電影名稱來(lái)自Netflix挑戰(zhàn)數(shù)據(jù)集. 第二部分, 本文從IMDB (http://www.imdb.com)收集了相應(yīng)電影的情節(jié). 為了與前兩個(gè)數(shù)據(jù)集的隱式反饋設(shè)置保持一致[14], 本文中只提取正面評(píng)分(評(píng)分5)進(jìn)行培訓(xùn)和測(cè)試. 在移除正面評(píng)級(jí)少于3個(gè)的用戶和沒(méi)有劇情的電影后, 最終數(shù)據(jù)集中有407 261個(gè)用戶, 9228部電影和15 348 808個(gè)評(píng)分. 之后進(jìn)行預(yù)處理[15], 從電影的情節(jié)中提取文本信息(項(xiàng)目?jī)?nèi)容). 在去除停止詞后, 根據(jù)tf-idf(term frequency-inverse document frequency)值選擇最高的S個(gè)判別式詞匯形成詞匯表, 最后生成的詞匯表大小為20 000.
圖1 算法流程圖
(2)訓(xùn)練SDAE自動(dòng)編碼器輸出特征矩陣
對(duì)自動(dòng)編碼器中的每個(gè)用戶輸入R里的每一行、項(xiàng)目ID和項(xiàng)目特征向量,R里的每一行即每個(gè)用戶對(duì)各個(gè)項(xiàng)目的打分作為其向量描述,輸入層個(gè)數(shù)等于項(xiàng)目數(shù)目J. 對(duì)于R加噪后的數(shù)據(jù)為:
訓(xùn)練用戶評(píng)分矩陣的自動(dòng)編碼器的輸出公式為:
其中,W,W'分別是訓(xùn)練用戶評(píng)分矩陣的自動(dòng)編碼器中輸入層到隱藏層、隱藏層到輸出層的權(quán)重矩陣,b,b'分別是偏置向量. 對(duì)于訓(xùn)練用戶評(píng)分矩陣的自動(dòng)編碼器的最小損失函數(shù)為:
(3)使用CIDL算法生成新的評(píng)分矩陣
生成的具體過(guò)程如2.5小節(jié)所示.
堆疊降噪自動(dòng)編碼器是一個(gè)前饋神經(jīng)網(wǎng)絡(luò), 通過(guò)從疊加噪聲的原始數(shù)據(jù)以及輸出數(shù)據(jù)中學(xué)習(xí)得出未疊加噪聲的入數(shù)據(jù), 如圖2所示.
圖2 SDAE原理圖
堆疊降噪自動(dòng)編碼器從疊加噪聲的輸入數(shù)據(jù)與未疊加噪聲的輸入數(shù)據(jù)中得出的特征幾乎相同, 但從疊加噪聲的數(shù)據(jù)中學(xué)習(xí)到的特征更具有魯棒性. 通常情況下, 隱藏層在整個(gè)系統(tǒng)的中間(即圖1中的X2)被約束為瓶頸[15], 并且輸入層X(jué)0是疊加噪聲的原始數(shù)據(jù).一個(gè)堆疊降噪編碼器解決了去除噪聲的優(yōu)化問(wèn)題, 即:
其中,λ是正則化參數(shù), ||·||是弗羅貝尼烏斯范數(shù).
從XL生成干凈輸入XC是貝葉斯SDAE生成過(guò)程的一部分, 而從XC生成噪聲破壞輸入X0是一種人工噪聲注入過(guò)程, 可幫助SDAE學(xué)習(xí)更強(qiáng)大的特征表示.若假設(shè)干凈輸入XC和損壞輸入X0, 可定義以下生成過(guò)程:
(1)對(duì)于SDAE網(wǎng)絡(luò)中的每一層l
1)對(duì)于權(quán)重矩陣NWl的每一列n
2)繪制偏向量
3)對(duì)于Xl的每一行j
(2)對(duì)于每個(gè)j, 繪制一個(gè)干凈的輸入
如果λS有效, 則方程(4)中的高斯分布將變?yōu)橐驭?Xl-1, j*,Wi+bl)為中心的狄拉克三角形分布[10], 其中δ(*)是 S 形函數(shù) (Sigmoid Function, SF). 該模型將退化為SDAE的貝葉斯公式, 因此稱之為廣義SDAE. 網(wǎng)絡(luò)中的第一個(gè)L/2層充當(dāng)編碼器, 最后的L/2層充當(dāng)解碼器. 后驗(yàn)概率的最大化等同于考慮權(quán)重衰減時(shí)重建誤差的最小化.
使用貝葉斯SDAE作為組件, CIDL的原理圖如圖3所示.
圖3 CIDL原理圖
CIDL的生成過(guò)程如下:
(1) 對(duì)于SDAE網(wǎng)絡(luò)的每一層l, 操作與前一部分SDAE中步驟相同.
(2) 對(duì)于每個(gè)j, 繪制一個(gè)干凈的輸入, 操作與SDAE中步驟相同.
1)設(shè)置一個(gè)潛在的項(xiàng)目設(shè)置向量:
2)并將潛在項(xiàng)目矢量設(shè)置為:
3)為每個(gè)用戶設(shè)置一個(gè)潛在用戶向量:
4)為每個(gè)用戶項(xiàng)目對(duì) (i,j)繪制評(píng)分Ri,j:
其中,λW,λn,λu,λS以及λv為超參數(shù),Cij是一個(gè)與CTR相似的置信參數(shù), 中間層作為評(píng)級(jí)和內(nèi)容信息之間的橋梁. 這個(gè)中間層, 以及潛在偏移量εj是使CIDL能夠同時(shí)學(xué)習(xí)有效特征表示并捕獲項(xiàng)目與用戶之間相似性和隱含關(guān)系的關(guān)鍵.
基于上述CIDL模型, 所有參數(shù)都可以作為隨機(jī)變量處理, 以便可以應(yīng)用完全貝葉斯方法, 如馬爾科夫鏈或變分近似方法[16]. 但是, 這種處理通常會(huì)導(dǎo)致高計(jì)算成本. 本文設(shè)計(jì)了一個(gè)期望最大算法來(lái)進(jìn)行最大后驗(yàn)估計(jì).
與協(xié)同主題回歸模型類似, 最大化后驗(yàn)概率相當(dāng)于最大化U,V, {Xl}, {XC}, {Wl}, {bl}的聯(lián)合對(duì)數(shù)似然估計(jì):
若λS趨近于無(wú)限, 此似然將會(huì)變?yōu)?
編碼器函數(shù)fe(*,W+)取未降噪的的內(nèi)容向量X0,j*作為輸入并計(jì)算該項(xiàng)的編碼, 函數(shù)fr(*,W+)同樣取X0,j*作為輸入并計(jì)算編碼, 然后計(jì)算項(xiàng)目j的重構(gòu)內(nèi)容向量.
從優(yōu)化的角度來(lái)看, 上述目標(biāo)函數(shù)(11)中的第三項(xiàng)相當(dāng)于一個(gè)多層感知器, 它使用潛在項(xiàng)向量vj作為目標(biāo), 而第四項(xiàng)等價(jià)于一個(gè)使重建誤差最小化的SDAE.從神經(jīng)網(wǎng)絡(luò)的角度來(lái)看, 當(dāng)λS接近正無(wú)窮時(shí), CIDL的概率圖模型的訓(xùn)練將退化為同時(shí)訓(xùn)練兩個(gè)疊加在一起的共同輸入層的神經(jīng)網(wǎng)絡(luò). 由于參與評(píng)級(jí)矩陣, CIDL網(wǎng)絡(luò)比典型的神經(jīng)網(wǎng)絡(luò)復(fù)雜得多.
當(dāng)λn/λv的比率接近正無(wú)窮時(shí), CIDL將退化為兩步模型, 其中使用SDAE學(xué)習(xí)的潛在表示被直接放入?yún)f(xié)同主題回歸模型中. 另一個(gè)臨界點(diǎn)發(fā)生在λn/λv趨近于零時(shí)SDAE的解碼器基本失去功能. 通過(guò)實(shí)驗(yàn)證實(shí)可得, 在這兩種情況下, 模型預(yù)測(cè)性能都會(huì)大大提高.
對(duì)于ui和vj, 給定當(dāng)前W+, 計(jì)算相對(duì)于ui和vj的梯度并將它們?cè)O(shè)置為零, 得出以下結(jié)果:
對(duì)于給定U和V, 可以使用反向傳播學(xué)習(xí)算法來(lái)學(xué)習(xí)權(quán)重Wl以及每個(gè)層的偏差矢量bl. 關(guān)于Wl和bl的可能性的梯度如下:
通過(guò)交替更新U,V,Wl和bl, 可得到的局部最優(yōu)值. 本文使用 SGD ( Stochastic Gradient Descent, 隨機(jī)梯度下降)[17]算法也叫增量梯度下降法, 是在傳統(tǒng)梯度下降法的基礎(chǔ)上改進(jìn)而來(lái),收斂速度快很多, 是常用的參數(shù)訓(xùn)練算法. SGD 通過(guò)最小化損失函數(shù)來(lái)訓(xùn)練模型參數(shù), 根據(jù)每個(gè)樣本來(lái)迭代更新一次, 可以控制下降速率和迭代次數(shù), 使得參數(shù)的訓(xùn)練更可控,以解決局部最優(yōu)問(wèn)題. 該算法過(guò)程如算法1.
算法1. 增量梯度下降法Input: 評(píng)分矩陣 R, 特征向量維度 K, 學(xué)習(xí)率 η, 比例參數(shù) α, 正則參數(shù) λU, λV, λQ Output: U, V(1) 初始化: 用一個(gè)較小的值隨機(jī)構(gòu)造U, V 和;(2) while (error on validation set decrease);()()(3) (4)(5)(6)(7)(8)(9)(10)
本文對(duì)SDAE模型進(jìn)行了改進(jìn), 并與協(xié)同過(guò)濾模型進(jìn)行結(jié)合, 最后使用增量梯度下降算法解決了局部最優(yōu)化問(wèn)題, 在數(shù)據(jù)處理與推薦準(zhǔn)確性方面有了較大提升。
在數(shù)據(jù)集中隨機(jī)選擇與每個(gè)用戶相關(guān)的P項(xiàng)以形成訓(xùn)練集[18], 并將所有剩余的數(shù)據(jù)集用作測(cè)試集. 為了在稀疏和密集設(shè)置下評(píng)估和比較模型, 本文在實(shí)驗(yàn)中分別將P設(shè)置為1和10. 對(duì)于P的每個(gè)值, 用不同的隨機(jī)選擇訓(xùn)練集重復(fù)評(píng)估五次, 并記錄平均性能. 本文使用查全率作為性能度量, 由于評(píng)級(jí)信息采用隱式反饋的形式, 零條目可能是用戶對(duì)該項(xiàng)目不感興趣, 或者用戶不知道其存在. 因此, 精度不是一個(gè)合適的性能指標(biāo). 像大多數(shù)推薦系統(tǒng)一樣, 本文對(duì)候選項(xiàng)目的預(yù)測(cè)評(píng)級(jí)進(jìn)行了排序[19], 并向目標(biāo)用戶推薦前M項(xiàng)目. 每個(gè)用戶的查全率@M被定義為:
最終結(jié)果是所有用戶的平均查全率.
本文中將協(xié)同深度學(xué)習(xí)算法(CIDL)同時(shí)與CMF算法[20]、SVDFeature 算法[21]、CTR 算法[8]以及DeepMusic[22]算法應(yīng)用中的各項(xiàng)指標(biāo)進(jìn)行比較. 在實(shí)驗(yàn)中, 本文首先使用一個(gè)驗(yàn)證集來(lái)尋找 C M F、SVDFeature, CTR以及DeepMusic的最佳超參數(shù).CMF算法中將不同上下文的潛在因子的正則化超參數(shù)設(shè)置為10. 在網(wǎng)格搜索之后, CMF在等級(jí)矩陣和內(nèi)容矩陣的權(quán)重均為稀疏度為5. 密度設(shè)置中的權(quán)重分別為8和2. SVDFeature算法中, 用戶和項(xiàng)目的正則化超參數(shù)為0.004且學(xué)習(xí)率等于0.005. DeepMusic算法中,使用具有兩個(gè)卷積層的CNN. CTR算法中, 使用的參數(shù)為λu= 0.1,λv= 10,a= 1,b= 0.01,K= 50.
圖4和圖5顯示了在稀疏(P= 1)和密集(P= 10)設(shè)置下使用電影數(shù)據(jù)集比較CIDL算法, CTR算法,DeepMusic算法, CMF算法以及SVDFeature算法的結(jié)果. 由圖像可得, 無(wú)論在數(shù)據(jù)集密度稀疏還是密集,CIDL算法都優(yōu)于其他四種算法. 在數(shù)據(jù)密集的情況下雖然DeepMusic算法具有優(yōu)秀的體系結(jié)構(gòu), 但CTR算法在數(shù)據(jù)處理中更為優(yōu)秀. 在稀疏設(shè)置中, CMF算法大部分時(shí)間都比SVDFeature算法優(yōu)秀, 有時(shí)可以達(dá)到與CTR算法相當(dāng)?shù)男阅? DeepMusic算法由于缺乏評(píng)分而表現(xiàn)不佳. 在密集的環(huán)境中, SVDFeature算法對(duì)于Netflix數(shù)據(jù)來(lái)說(shuō)來(lái)說(shuō), 效果不如CMF. 在稀疏設(shè)置中2層CIDL的性能比CTR高出1.9%, 在密集設(shè)置下高出1.5%-2.0%. 由實(shí)驗(yàn)可以得出, 深度學(xué)習(xí)和推薦系統(tǒng)的整合算法是成功的, 對(duì)于查全率有顯著的提升.
圖4 各算法在P=1時(shí)的對(duì)比圖
圖5 各算法在P=10時(shí)的對(duì)比圖
在稠密環(huán)境下使用不同Δn也有不同結(jié)果, 如圖6所示.
當(dāng)λn趨近于無(wú)限大時(shí),λn/λv將會(huì)趨近正無(wú)窮, 此時(shí)CIDL將退化為兩個(gè)單獨(dú)的模型. 在這種情況下,SDAE將以無(wú)監(jiān)督方式學(xué)習(xí)潛在項(xiàng)目表示, 然后將其直接放入CTR的簡(jiǎn)化版本中. 這種情況下, 貝葉斯SDAE和基于矩陣分解的協(xié)同過(guò)濾組件之間沒(méi)有交互作用,預(yù)測(cè)性能將大大提高. 對(duì)于另一個(gè)極端, 當(dāng)λn無(wú)限小時(shí),λn/λv將趨近于近零, 此時(shí) CIDL 退化為貝葉斯SDAE分量解碼器基本消失的情況. 此時(shí)貝葉斯SDAE組件基本消失, 編碼器將通過(guò)簡(jiǎn)單矩陣分解學(xué)習(xí)潛在項(xiàng)目向量. 如圖6所示, 預(yù)測(cè)性能隨著λn變化而變化.當(dāng)λn<0.1時(shí), 查全率@M已經(jīng)非常接近PMF的結(jié)果(或甚至比PMF結(jié)果還要差).
圖6 在不同Δn的情況下各算法的比較
綜合以上實(shí)驗(yàn)結(jié)果, 在大量數(shù)據(jù)的實(shí)驗(yàn)證明下可知, 不論在數(shù)據(jù)密集或是數(shù)據(jù)稀疏的情況下CIDL算法都優(yōu)于CMF算法、SVDFeature算法、DeepMusic算法、CTR算法以及DeepMusic算法. 而在CIDL算法中算法的預(yù)測(cè)性能會(huì)隨著λn的變化而變化, 因此在CIDL算法中只有通過(guò)實(shí)驗(yàn)找到最合適的λn值, 才能更好的提高算法效率.
本文中展示了通過(guò)聯(lián)合對(duì)內(nèi)容信息的深度學(xué)習(xí)和對(duì)評(píng)級(jí)(反饋)矩陣進(jìn)行協(xié)作性過(guò)濾從而實(shí)現(xiàn)出色的性能的算法. CIDL算法是一個(gè)用于彌合最先進(jìn)的深度學(xué)習(xí)模型和推薦系統(tǒng)之間差距的等級(jí)貝葉斯模型. 在深度學(xué)習(xí)方面, 除了獲得MAP估計(jì)的算法外, 本文還推導(dǎo)了一種基于采樣的CIDL貝葉斯處理算法, 作為反向傳播的貝葉斯廣義版本.