第十七章 推薦系統(tǒng)

該系列文章為,觀看“吳恩達(dá)機(jī)器學(xué)習(xí)”系列視頻的學(xué)習(xí)筆記。雖然每個視頻都很簡單,但不得不說每一句都非常的簡潔扼要,淺顯易懂。非常適合我這樣的小白入門。

本章含蓋

  • 17.1 問題規(guī)劃
  • 17.2 基于內(nèi)容的推薦算法
  • 17.3 協(xié)同過濾
  • 17.4 協(xié)同過濾算法
  • 17.5 低軼矩陣分解
  • 17.6 實(shí)施細(xì)節(jié):均值規(guī)范化

17.1 問題規(guī)劃

在接下來的視頻中,我想講一下推薦系統(tǒng)。我想講推薦系統(tǒng)有兩個原因:

第一、僅僅因?yàn)樗菣C(jī)器學(xué)習(xí)中的一個重要的應(yīng)用。在過去幾年,我偶爾訪問硅谷不同的技術(shù)公司,我常和工作在這兒致力于機(jī)器學(xué)習(xí)應(yīng)用的人們聊天,我常問他們,最重要的機(jī)器學(xué)習(xí)的應(yīng)用是什么,或者,你最想改進(jìn)的機(jī)器學(xué)習(xí)應(yīng)用有哪些。我最常聽到的答案是推薦系統(tǒng)?,F(xiàn)在,在硅谷有很多團(tuán)體試圖建立很好的推薦系統(tǒng)。因此,如果你考慮網(wǎng)站像亞馬遜,或網(wǎng)飛公司或易趣,或iTunes Genius,有很多的網(wǎng)站或系統(tǒng)試圖推薦新產(chǎn)品給用戶。如,亞馬遜推薦新書給你,網(wǎng)飛公司試圖推薦新電影給你,等等。這些推薦系統(tǒng),根據(jù)瀏覽你過去買過什么書,或過去評價(jià)過什么電影來判斷。這些系統(tǒng)會帶來很大一部分收入,比如像亞馬遜和網(wǎng)飛這樣的公司。因此,對推薦系統(tǒng)性能的改善,將對這些企業(yè)的有實(shí)質(zhì)性和直接的影響。

推薦系統(tǒng)是個有趣的問題,在學(xué)術(shù)機(jī)器學(xué)習(xí)中因此,我們可以去參加一個學(xué)術(shù)機(jī)器學(xué)習(xí)會議,推薦系統(tǒng)問題實(shí)際上受到很少的關(guān)注,或者,至少在學(xué)術(shù)界它占了很小的份額。但是,如果你看正在發(fā)生的事情,許多有能力構(gòu)建這些系統(tǒng)的科技企業(yè),他們似乎在很多企業(yè)中占據(jù)很高的優(yōu)先級。這是我為什么在這節(jié)課討論它的原因之一。

我想討論推薦系統(tǒng)地第二個原因是:這視頻的最后幾集我想討論機(jī)器學(xué)習(xí)中的一些大思想,并和大家分享。我們已經(jīng)在這門課中看到,特征對于機(jī)器學(xué)習(xí)來說,是非常重要的,你所選擇的特征,將對你學(xué)習(xí)算法的性能有很大的影響。因此,在機(jī)器學(xué)習(xí)中有一種大思想,對于一些問題,可能并不是所有的問題,而是一些問題,有一些算法可以自動地學(xué)習(xí)一系列適合的特征。所以,比起手動設(shè)計(jì)或編寫特征(這也是我們目前做得最多的事),這里有一些環(huán)境,能讓你開發(fā)某個算法,來學(xué)習(xí)使用哪些特征。而推薦系統(tǒng)就是那些環(huán)境中的一個例子,當(dāng)然還有很多其他的,但是通過推薦系統(tǒng),我們將領(lǐng)略一小部分,特征學(xué)習(xí)的思想,至少,你將能夠了解到這方面的一個例子,我認(rèn)為,機(jī)器學(xué)習(xí)中的大思想也是這樣。因此,讓我們開始討論推薦系統(tǒng)問題形式化。

我們從一個例子開始定義推薦系統(tǒng)的問題。
假使我們是一個電影供應(yīng)商,我們有 5 部電影和 4 個用戶,我們要求用戶為電影打分。


這里引入一些標(biāo)記:

17.2 基于內(nèi)容的推薦算法

在一個基于內(nèi)容的推薦系統(tǒng)算法中,我們假設(shè)對于我們希望推薦的東西有一些數(shù)據(jù),這些數(shù)據(jù)是有關(guān)這些東西的特征。


在我們的例子中,我們可以假設(shè)每部電影都有兩個特征,如x_1代表電影的浪漫程度,x_2 代表電影的動作程度。
所以,如果我們有類似這樣的特征,那么每部電影就可以用一個特征向量來表示。同往常一樣,我們再加一個額外特征,稱為截距特征 x_0,它的值總是 1 。

然后,我們就能有一個特征向量,如x^(1)是第一部電影的特征向量

n 表示 特征 數(shù)量,但是不包括 x_0。因此,本例中,n = 2.

下面我們要基于這些特征來構(gòu)建一個推薦系統(tǒng)算法。 假設(shè)我們采用線性回歸模型,我們可以針對每一個用戶都訓(xùn)練一個線性回歸模型,如θ^((1))是第一個用戶的模型的參數(shù)。 于是,我們有:

代價(jià)函數(shù)

針對用戶 j,該線性回歸模型的代價(jià)為預(yù)測誤差的平方和,加上正則化項(xiàng):

其中 i:r(i,j)=1表示我們只計(jì)算那些用戶 j 評過分的電影。在一般的線性回歸模型中,誤差項(xiàng)和正則項(xiàng)應(yīng)該都是乘以1/2m(這里,可以說是 m^(j) ),在這里我們將m去掉。并且我們不對方差項(xiàng)θ_0進(jìn)行正則化處理。


上面的代價(jià)函數(shù)只是針對一個用戶的,為了學(xué)習(xí)所有用戶,我們將所有用戶的代價(jià)函數(shù)求和:

如果我們要用梯度下降法來求解最優(yōu)解,我們計(jì)算代價(jià)函數(shù)的偏導(dǎo)數(shù)后得到梯度下降的更新公式為:

??這就是如何最小化代價(jià)函數(shù)J,來學(xué)習(xí)所有的參數(shù)。用這些求導(dǎo)公式的時(shí)候,如果你想,你可以把它們代入到一個更高級的優(yōu)化算法中。比如,簇梯度或者LBFGS等等,并用它們來最小化代價(jià)函數(shù)J。

17.3 協(xié)同過濾

在之前的基于內(nèi)容的推薦系統(tǒng)中,對于每一部電影,我們都掌握了可用的特征,使用這些特征訓(xùn)練出了每一個用戶的參數(shù)。相反地,如果我們擁有用戶的參數(shù),我們可以學(xué)習(xí)得出電影的特征。



但是如果我們既沒有用戶的參數(shù),也沒有電影的特征,這兩種方法都不可行了。協(xié)同過濾算法可以同時(shí)學(xué)習(xí)這兩者。
我們所講算法有一個很有意思的特性,叫做“特征學(xué)習(xí)”。這種算法能夠自行學(xué)習(xí)所需要的特征。

假設(shè),我們沒有電影本身的特征(如,浪漫程度、動作程度),只有用戶對電影的打分。并且已知 θ^(j) :

注:θ_0 = 0。
有了,用戶對電影的評分,以及 θ^(j),理論上,我們就能得到電影的特征 x_1 和 x_2 的值。

給定 θ,學(xué)習(xí)某個電影的特征:

總結(jié)一下,這一階段要做的就是選擇特征 x^(i),讓所有已經(jīng)評價(jià)過電影的用戶 j ,使得算法預(yù)測出的用戶對電影評分與用戶實(shí)際對該電影的評分的平方誤差最小。

學(xué)習(xí)所有電影的特征:

最終你將得到合適的,所有電影的特征。

給定 x ,你能估算出 θ;而,給你 θ 的話,你能估算出 x。這就有點(diǎn)類似“先有雞,還是先有蛋”的問題了。。

實(shí)際上,隨機(jī)的猜取一些 θ 值,在有了這些隨機(jī)初始化的 θ 值以后。你就能用這些 θ 值來學(xué)習(xí)出 x。然后,在有這些初始化的特征(x)之后,你就能運(yùn)用其得到更好的 參數(shù)θ值的估計(jì)。依次類型。。。我們將這個迭代過程不斷地重復(fù)執(zhí)行,我們能得到很好的 θ 和 x,并且效果確實(shí)很好。如果你重復(fù)這個過程,你的算法將會收斂到一組合理的電影特征以及一組合理的對不同用的參數(shù)θ的估計(jì)。

對于這個問題,該問題僅建立在每位用戶對數(shù)個電影進(jìn)行了評價(jià),并且每部電影都被數(shù)位用戶評價(jià)過的情況下。這樣你才能夠重復(fù)這個迭代過程,來估計(jì)出 θ 和 x。

這就是基本的“協(xié)同過濾”算法,這實(shí)際不是最后,我們將要使用的算法,下一個視頻我們將介紹如何改進(jìn)該算法,讓其在計(jì)算時(shí)更為高效。
“協(xié)同過濾”算法指的是,當(dāng)你執(zhí)行算法時(shí),要觀察大量的用戶,觀察這些用戶的實(shí)際行為,來協(xié)同的得到更佳的每個人對電影的評分值。

17.4 協(xié)同過濾算法

實(shí)際上存在一個更有效的算法,比 “迭代循環(huán)的一次計(jì)算出 θ 值后,在使用該 θ 值估計(jì)出新的 x,再使用該 x 估算出新的 θ 值。。。以此類推” 這樣的算法更有效。它能夠?qū)?x 和 θ 同時(shí)計(jì)算出來。我們所要做的就是將

結(jié)合為一個(注意,這里是“結(jié)合”,不是“相加”的意思):

實(shí)際上:

是相同的。雖然,可能它們兩個求和看起來有點(diǎn)不同。但讓我們來看看它們到底在做什么。
第一個求和運(yùn)算是,所有用戶 j 的總和 所有被用戶評分過的電影總和。這其實(shí)是將,所有 (i,j) 對全加起來。每一項(xiàng)對應(yīng)被某一用戶評分過的某一電影。
而第二個求和運(yùn)算,進(jìn)行相反的運(yùn)行。它表示對每部電影 i,將所有對它評分過的用戶 j 求和。
這兩個運(yùn)算符都是對所有 (i,j) = 1 的 (i,j) 對求和。就是對所有有評分的 用戶-電影 對進(jìn)行求和。

所以,??這兩個式子其實(shí)就是這一項(xiàng):

??這個優(yōu)化目標(biāo)函數(shù) J 有一個很有趣的特性,如果你假設(shè) x 為常數(shù),并關(guān)于 θ 優(yōu)化的話,它實(shí)際上就是

。反過來也一樣,如果你把 θ 作為常數(shù)量,然后關(guān)于 x 求 J 的最小值的話,那就是

同時(shí),在最小化

時(shí),我們不再遵循 x_0 = 1 這慣例。而是,我們將 x 特征向量定義為一個 n 為向量(之前,我們不需要學(xué)習(xí) x 特征向量時(shí),它是一個 n+1 維向量),同樣,因?yàn)閰?shù) θ 具有相同的維度,所以 θ 也是 n 維的,因?yàn)?,如果沒有 x_0 的話,那么 θ_0 也不再需要。
我們放棄這個慣例(x_0 = 1)的理由是,我們現(xiàn)在是在學(xué)習(xí)所有的特征,我們沒有必要將一個特征值硬編碼為 1。因?yàn)?,如果算法真的需要,一個特征永遠(yuǎn)為1,它可以選擇靠自己去獲得 1 這個數(shù)值。

  1. 首先,我們將會把 x 和 θ 初始化為小的隨機(jī)值。這一點(diǎn),有點(diǎn)像神經(jīng)網(wǎng)絡(luò)訓(xùn)練。
  2. 接下來,我們要用梯度下降或者其他的高級優(yōu)化算法把這個代價(jià)函數(shù)最小化。如果你求導(dǎo)的話,你會發(fā)現(xiàn)梯度下降法寫出來的更新式是這樣的:
  3. 最后,給你一個用戶。如果這個用戶具有一些參數(shù) θ,以及給你一部電影,學(xué)習(xí)得到的特征 x。我們可以預(yù)測該用戶給電影 j 的評分(該用戶還未對電影 j 進(jìn)行過評分)

“協(xié)同過濾”算法可以同時(shí)學(xué)習(xí)幾乎所有電影的特征 x 和所有用戶參數(shù) θ。能對不同用戶會如何對他們尚未評分的電影做出評價(jià)給出相當(dāng)精準(zhǔn)的預(yù)測。

通過這個學(xué)習(xí)過程獲得的特征矩陣包含了有關(guān)電影的重要數(shù)據(jù),這些數(shù)據(jù)不總是人能讀懂的,但是我們可以用這些數(shù)據(jù)作為給用戶推薦電影的依據(jù)。
例如,如果一位用戶正在觀看電影 x(i),我們可以尋找另一部電影x(j),依據(jù)兩部電影的特征向量之間的距離 ∥x(i)-x(j) ∥ 的大小。

17.5 低軼矩陣分解

在上幾節(jié)視頻中,我們談到了協(xié)同過濾算法,本節(jié)視頻中我將會講到有關(guān)該算法的向量化實(shí)現(xiàn),以及說說有關(guān)該算法你可以做的其他事情。
舉例子:
1.當(dāng)給出一件產(chǎn)品時(shí),你能否找到與之相關(guān)的其它產(chǎn)品。
2.一位用戶最近看上一件產(chǎn)品,有沒有其它相關(guān)的產(chǎn)品,你可以推薦給他。

我將要做的是:實(shí)現(xiàn)一種選擇的方法,寫出協(xié)同過濾算法的預(yù)測情況。

我們有關(guān)于五部電影的數(shù)據(jù)集,我將要做的是,將這些用戶的電影評分,進(jìn)行分組并存到一個矩陣中。

我們有五部電影,以及四位用戶,那么 這個矩陣 Y 就是一個5行4列的矩陣,它將這些電影的用戶評分?jǐn)?shù)據(jù)都存在矩陣?yán)铮?div id="u0z1t8os" class="image-package">

向量化表示:

現(xiàn)在給定??這個預(yù)測評分矩陣,則有一個,比較簡單的或者向量化的方法來寫出它們:
預(yù)測評分矩陣Y = X * Θ^T

這個協(xié)同過濾算法有另一個名字,叫做“低秩矩陣分解”。這個術(shù)語來源于這個矩陣的數(shù)學(xué)性質(zhì),矩陣 X 乘以 Θ的轉(zhuǎn)置,在線性代數(shù)中有一個數(shù)學(xué)性質(zhì),稱為“低秩矩陣”

一個 m * n 的矩陣,如果秩很低(秩r遠(yuǎn)小于m,n),則它可以拆成一個 m * r 矩陣和一個 r * n 矩陣之積(類似于SVD分解)。后面這兩個矩陣所占用的存儲空間比原來的 m * n 矩陣小得多。

另一個問題,利用已經(jīng)學(xué)習(xí)到的屬性,來找到相關(guān)的電影。


具體的說,就是對每個商品 i ,比如對每個電影 i 我們已經(jīng)學(xué)到一個屬性向量 x^(i):
當(dāng)你學(xué)習(xí)某一組特征時(shí),你之前并不知道該選取哪些不同的特征,但是如果你運(yùn)行這個算法,一些特征將被捕捉到,有關(guān)電影和商品的重要方面。這些重要的方面將導(dǎo)致一些用戶喜歡某些電影。
在學(xué)習(xí)完特征之后,實(shí)際上,很難理解,這些被學(xué)習(xí)到的特征,并對這些特征給出人類可以理解的解釋。但是,實(shí)際上,即使這些特征難以可視化,但通常,算法將學(xué)到一些有意義的特征。
現(xiàn)在既然你已經(jīng)對特征參數(shù)向量進(jìn)行了學(xué)習(xí),那么我們就會有一個很方便的方法來度量兩部電影之間的相似性。例如說:電影 i 有一個特征向量x^(i),你是否能找到一部不同的電影 j,保證兩部電影的特征向量之間的距離x(i)和x(j)很小,那就能很有力地表明電影i和電影 j 在某種程度上有相似,至少在某種意義上,某些人喜歡電影 i,或許更有可能也對電影 j 感興趣。總結(jié)一下,當(dāng)用戶在看某部電影 i 的時(shí)候,如果你想找5部與電影非常相似的電影,為了能給用戶推薦5部新電影,你需要做的是找出電影 j,在這些不同的電影中與我們要找的電影 i 的距離最小,這樣你就能給你的用戶推薦幾部不同的電影了。

通過這個方法,希望你能知道,如何進(jìn)行一個向量化的計(jì)算來對所有的用戶和所有的電影進(jìn)行評分計(jì)算。同時(shí)希望你也能掌握,通過學(xué)習(xí)特征參數(shù),來找到相關(guān)電影和產(chǎn)品的方法。

17. 6 實(shí)施細(xì)節(jié):均值規(guī)范化

均值歸一化,有時(shí)候它能讓算法運(yùn)行的更好。

均值歸一化的作用:
舉例:有一個沒有給任何電影評分的用戶(Eve)



因?yàn)?Eve 用戶沒有給任何一部電影評過分,所以代價(jià)函數(shù) J 的第一項(xiàng)
完全不影響 θ^5 的值(因?yàn)?,不存?r(i,j) = 1)。所以,影響 θ^5 值的唯一項(xiàng)就是
。也就是說,我們想選一個向量 θ^5 使得這個
正則化項(xiàng)盡可能小。這會導(dǎo)致你最終得到 θ^5 = [0 ; 0]。而這樣的話,用戶 Eve 對任意電影的打分都將會是 0 分,因?yàn)?Eve 對任意電影的預(yù)測打分為 (θ^5 )^T * x^(i)
均值歸一化的想法,可以讓我們解決這個問題。

我們首先需要對結(jié)果 Y矩陣進(jìn)行均值歸一化處理,將每一個用戶對某一部電影的評分減去所有用戶對該電影評分的平均值:

然后我們利用這個新的 Y 矩陣來訓(xùn)練算法。 如果我們要用新訓(xùn)練出的算法來預(yù)測評分,則需要將平均值重新加回去,預(yù)測
,對于Eve,我們的新模型會認(rèn)為她給每部電影的評分都是該電影的平均分。

PS :你可以認(rèn)為,這樣推薦給 Eve 的電影,就是那么評分高的熱門電影了。而對于這個情況,也就相當(dāng)于對一個新用戶,我們應(yīng)該推薦什么樣的內(nèi)容?

同時(shí),我們目前是對行進(jìn)行均值歸一化,以解決當(dāng)一個用戶沒有對任何一部電影進(jìn)行評分時(shí)的情況;同樣,如果一部電影沒有被任何一個用戶所評分過,我們也可以對矩陣的列進(jìn)行均值歸一化,以解決這個問題。

“均值歸一化”作為“協(xié)同過濾”算法的預(yù)處理步驟,根據(jù)不同的數(shù)據(jù)集,它有時(shí)能讓你的算法表現(xiàn)得更好一些。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容