大规模机器学习
如果我們有一個(gè)低方差的模型,增加數(shù)據(jù)集的規(guī)模可以幫助你獲得更好的結(jié)果。我們應(yīng) 該怎樣應(yīng)對(duì)一個(gè)有 100 萬條記錄的訓(xùn)練集?
以線性回歸模型為例,每一次梯度下降迭代,我們都需要計(jì)算訓(xùn)練集的誤差的平方和, 如果我們的學(xué)習(xí)算法需要有 20 次迭代,這便已經(jīng)是非常大的計(jì)算代價(jià)。
首先應(yīng)該做的事是去檢查一個(gè)這么大規(guī)模的訓(xùn)練集是否真的必要,也許我們只用 1000 個(gè)訓(xùn)練集也能獲得較好的效果,我們可以繪制學(xué)習(xí)曲線來幫助判斷。
隨機(jī)梯度下降法
隨機(jī)梯度下降算法在每一次計(jì)算之后便更新參數(shù) θ,而不需要首先將所有的訓(xùn)練集求和, 在梯度下降算法還沒有完成一次迭代時(shí),隨機(jī)梯度下降算法便已經(jīng)走出了很遠(yuǎn)。但是這樣的 算法存在的問題是,不是每一步都是朝著”正確”的方向邁出的。因此算法雖然會(huì)逐漸走向全 局最小值的位置,但是可能無法站到那個(gè)最小值的那一點(diǎn),而是在最小值點(diǎn)附近徘徊。
小批量梯度下降
小批量梯度下降算法是介于批量梯度下降算法和隨機(jī)梯度下降算法之間的算法,每計(jì)算 常數(shù) b 次訓(xùn)練實(shí)例,便更新一次參數(shù) θ。
通常我們會(huì)令 b 在 2-100 之間。這樣做的好處在于,我們可以用向量化的方式來循環(huán) b 個(gè)訓(xùn)練實(shí)例,如果我們用的線性代數(shù)函數(shù)庫(kù)比較好,能夠支持平行處理,那么算法的總體 表現(xiàn)將不受影響(與隨機(jī)梯度下降相同)。
隨機(jī)梯度下降收斂
現(xiàn)在我們介紹隨機(jī)梯度下降算法的調(diào)試,以及學(xué)習(xí)率 α 的選取。
在批量梯度下降中,我們可以令代價(jià)函數(shù) J 為迭代次數(shù)的函數(shù),繪制圖表,根據(jù)圖表來 判斷梯度下降是否收斂。但是,在大規(guī)模的訓(xùn)練集的情況下,這是不現(xiàn)實(shí)的,因?yàn)橛?jì)算代價(jià) 太大了。
在隨機(jī)梯度下降中,我們?cè)诿恳淮胃?θ 之前都計(jì)算一次代價(jià),然后每 X 次迭代后,求 出這 X 次對(duì)訓(xùn)練實(shí)例計(jì)算代價(jià)的平均值,然后繪制這些平均值與 X 次迭代的次數(shù)之間的函 數(shù)圖表。
當(dāng)我們繪制這樣的圖表時(shí),可能會(huì)得到一個(gè)顛簸不平但是不會(huì)明顯減少的函數(shù)圖像(如 上面左下圖中藍(lán)線所示)。我們可以增加 X 來使得函數(shù)更加平緩,也許便能看出下降的趨勢(shì) 了(如上面左下圖中紅線所示);或者可能函數(shù)圖表仍然是顛簸不平且不下降的(如洋紅色 線所示),那么我們的模型本身可能存在一些錯(cuò)誤。
如果我們得到的曲線如上面右下方所示,不斷地上升,那么我們可能會(huì)需要選擇一個(gè)較 小的學(xué)習(xí)率 α。
我們也可以令學(xué)習(xí)率隨著迭代次數(shù)的增加而減小,例如令:
隨著我們不斷地靠近全局最小值,通過減小學(xué)習(xí)率,我們迫使算法收斂而非在最小值附 近徘徊。 但是通常我們不需要這樣做便能有非常好的效果了,對(duì) α 進(jìn)行調(diào)整所耗費(fèi)的計(jì)算 通常不值得
總結(jié)下,這段視頻中,我們介紹了一種方法,近似地監(jiān)測(cè)出隨機(jī)梯度下降算法在最優(yōu)化 代價(jià)函數(shù)中的表現(xiàn),這種方法不需要定時(shí)地掃 整個(gè)訓(xùn)練集,來算出整個(gè)樣本集的代價(jià)函數(shù), 而是只需要每次對(duì)最后 1000 個(gè),或者多少個(gè)樣本,求一下平均值。應(yīng)用這種方法,你既可 以保證隨機(jī)梯度下降法正在正常運(yùn)轉(zhuǎn)和收斂,也可以用它來調(diào)整學(xué)習(xí)速率α的大小。
在線學(xué)習(xí)
在這個(gè)視頻中,討論一種新的大規(guī)模的機(jī)器學(xué)習(xí)機(jī)制,叫做在線學(xué)習(xí)機(jī)制。在線學(xué)習(xí)機(jī) 制讓我們可以模型化問題。
今天,許多大型網(wǎng)站或者許多大型網(wǎng)絡(luò)公司,使用不同版本的在線學(xué)習(xí)機(jī)制算法,從大 批的涌入又離開網(wǎng)站的用戶身上進(jìn)行學(xué)習(xí)。特別要 及的是,如果你有一個(gè)由連續(xù)的用戶流 引發(fā)的連續(xù)的數(shù)據(jù)流,進(jìn)入你的網(wǎng)站,你能做的是使用一個(gè)在線學(xué)習(xí)機(jī)制,從數(shù)據(jù)流中學(xué)習(xí) 用戶的偏好,然后使用這些信息來優(yōu)化一些關(guān)于網(wǎng)站的決策。
假定你有一個(gè) 供運(yùn)輸服務(wù)的公司,用戶們來向你詢問把包裹從 A 地運(yùn)到 B 地的服務(wù), 同時(shí)假定你有一個(gè)網(wǎng)站,讓用戶們可多次登陸,然后他們告訴你,他們想從哪里寄出包裹, 以及包裹要寄到哪里去,也就是出發(fā)地與目的地,然后你的網(wǎng)站開出運(yùn)輸包裹的的服務(wù)價(jià)格。 比如,我會(huì)收取50來運(yùn)輸你的包裹,我會(huì)收取20 之類的,然后根據(jù)你開給用戶的這個(gè)價(jià) 格,用戶有時(shí)會(huì)接受這個(gè)運(yùn)輸服務(wù),那么這就是個(gè)正樣本,有時(shí)他們會(huì)走掉,然后他們拒絕 購(gòu)買你的運(yùn)輸服務(wù),所以,讓我們假定我們想要一個(gè)學(xué)習(xí)算法來幫助我們,優(yōu)化我們想給用 戶開出的價(jià)格。
一個(gè)算法來從中學(xué)習(xí)的時(shí)候來模型化問題在線學(xué)習(xí)算法指的是對(duì)數(shù)據(jù)流而非離線的靜 態(tài)數(shù)據(jù)集的學(xué)習(xí)。許多在線網(wǎng)站都有持續(xù)不斷的用戶流,對(duì)于每一個(gè)用戶,網(wǎng)站希望能在不 將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中便順利地進(jìn)行算法學(xué)習(xí)。
假使我們正在經(jīng)營(yíng)一家物流公司,每當(dāng)一個(gè)用戶詢問從地點(diǎn) A 至地點(diǎn) B 的快遞費(fèi)用時(shí), 我們給用戶一個(gè)報(bào)價(jià),該用戶可能選擇接受(y=1)或不接受(y=0)。
現(xiàn)在,我們希望構(gòu)建一個(gè)模型,來預(yù)測(cè)用戶接受報(bào)價(jià)使用我們的物流服務(wù)的可能性。因 此報(bào)價(jià) 是我們的一個(gè)特征,其他特征為距離,起始地點(diǎn),目標(biāo)地點(diǎn)以及特定的用戶數(shù)據(jù)。 模型的輸出是 p(y=1)。
在線學(xué)習(xí)的算法與隨機(jī)梯度下降算法有些類似,我們對(duì)單一的實(shí)例進(jìn)行學(xué)習(xí),而非對(duì)一 個(gè) 前定義的訓(xùn)練集進(jìn)行循環(huán)。
一旦對(duì)一個(gè)數(shù)據(jù)的學(xué)習(xí)完成了,我們便可以丟棄該數(shù)據(jù),不需要再存儲(chǔ)它了。這種方式 的好處在于,我們的算法可以很好的適應(yīng)用戶的傾向性,算法可以針對(duì)用戶的當(dāng)前行為不斷 地更新模型以適應(yīng)該用戶。
每次交互事件并不只產(chǎn)生一個(gè)數(shù)據(jù)集,例如,我們一次給用戶 供 3 個(gè)物流選項(xiàng),用戶 選擇 2 項(xiàng),我們實(shí)際上可以獲得 3 個(gè)新的訓(xùn)練實(shí)例,因而我們的算法可以一次從 3 個(gè)實(shí)例 中學(xué)習(xí)并更新模型。
這些問題中的任何一個(gè)都可以被歸類到標(biāo)準(zhǔn)的,擁有一個(gè)固定的樣本集的機(jī)器學(xué)習(xí)問題 中。或許,你可以運(yùn)行一個(gè)你自己的網(wǎng)站,嘗試運(yùn)行幾天,然后保存一個(gè)數(shù)據(jù)集,一個(gè)固定 的數(shù)據(jù)集,然后對(duì)其運(yùn)行一個(gè)學(xué)習(xí)算法。但是這些是實(shí)際的問題,在這些問題里,你會(huì)看到 大公司會(huì)獲取如此多的數(shù)據(jù),真的沒有必要來保存一個(gè)固定的數(shù)據(jù)集,取而代之的是你可以 使用一個(gè)在線學(xué)習(xí)算法來連續(xù)的學(xué)習(xí),從這些用戶不斷產(chǎn)生的數(shù)據(jù)中來學(xué)習(xí)。這就是在線學(xué) 習(xí)機(jī)制,然后就像我們所看到的,我們所使用的這個(gè)算法與隨機(jī)梯度下降算法非常類似,唯 一的區(qū)別的是,我們不會(huì)使用一個(gè)固定的數(shù)據(jù)集,我們會(huì)做的是獲取一個(gè)用戶樣本,從那個(gè) 樣本中學(xué)習(xí),然后丟棄那個(gè)樣本并繼續(xù)下去,而且如果你對(duì)某一種應(yīng)用有一個(gè)連續(xù)的數(shù)據(jù)流, 這樣的算法可能會(huì)非常值得考慮。當(dāng)然,在線學(xué)習(xí)的一個(gè)優(yōu)點(diǎn)就是,如果你有一個(gè)變化的用 戶群,又或者你在嘗試預(yù)測(cè)的事情,在緩慢變化,就像你的用戶的品味在緩慢變化,這個(gè)在 線學(xué)習(xí)算法,可以慢慢地調(diào)試你所學(xué)習(xí)到的假設(shè),將其調(diào)節(jié)更新到最新的用戶行為。
映射化簡(jiǎn)和數(shù)據(jù)并行
映射化簡(jiǎn)和數(shù)據(jù)并行對(duì)于大規(guī)模機(jī)器學(xué)習(xí)問題而言是非常重要的概念。之前 到,如果 我們用批量梯度下降算法來求解大規(guī)模數(shù)據(jù)集的最優(yōu)解,我們需要對(duì)整個(gè)訓(xùn)練集進(jìn)行循環(huán), 計(jì)算偏導(dǎo)數(shù)和代價(jià),再求和,計(jì)算代價(jià)非常大。如果我們能夠?qū)⑽覀兊臄?shù)據(jù)集分配給不多臺(tái) 計(jì)算機(jī),讓每一臺(tái)計(jì)算機(jī)處理數(shù)據(jù)集的一個(gè)子集,然后我們將計(jì)所的結(jié)果匯總在求和。這樣 的方法叫做映射簡(jiǎn)化。
具體而言,如果任何學(xué)習(xí)算法能夠表達(dá)為,對(duì)訓(xùn)練集的函數(shù)的求和,那么便能將這個(gè)任 務(wù)分配給多臺(tái)計(jì)算機(jī)(或者同一臺(tái)計(jì)算機(jī)的不同 CPU 核心),以達(dá)到加速處理的目的。
例如,我們有 400 個(gè)訓(xùn)練實(shí)例,我們可以將批量梯度下降的求和任務(wù)分配給 4 臺(tái)計(jì)算機(jī) 進(jìn)行處理:
很多高級(jí)的線性代數(shù)函數(shù)庫(kù)已經(jīng)能夠利用多核 CPU 的多個(gè)核心來并行地處理矩陣運(yùn) 算,這也是算法的向量化實(shí)現(xiàn)如此重要的緣故(比調(diào)用循環(huán)快)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 机器学习之推荐系统
- 下一篇: android之常用知识点(一)