第一課:歡迎
1.神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
2.構(gòu)建神經(jīng)網(wǎng)絡(luò)
3.構(gòu)建機(jī)器學(xué)習(xí)工程
4.卷及神經(jīng)網(wǎng)絡(luò)CNN
5.序列模型
深度學(xué)習(xí)介紹
什么是神經(jīng)網(wǎng)絡(luò)纹份?
ReLU函數(shù):線性整流函數(shù)
通過(guò)堆疊一些單一神經(jīng)元餐曹,以及堆疊簡(jiǎn)單預(yù)測(cè)期盆顾,我們可以得到一個(gè)稍微大些的神經(jīng)網(wǎng)絡(luò)。
你如何管理神經(jīng)網(wǎng)絡(luò)呢?
你有一個(gè)有四個(gè)輸入的神經(jīng)網(wǎng)絡(luò),所以輸入特征可能是房屋大小住闯、臥室數(shù)量、郵政編碼以及居住地的富裕程度。給定這些輸入特征寞秃,神經(jīng)網(wǎng)絡(luò)的工作就是預(yù)測(cè)價(jià)格y斟叼,每個(gè)小圓圈都叫做神經(jīng)網(wǎng)絡(luò)中的隱藏神經(jīng)元,其中每個(gè)神經(jīng)元都將所有的四個(gè)特征當(dāng)作輸入(即使它只與兩個(gè)輸入特征相關(guān)朗涩,讓神經(jīng)網(wǎng)絡(luò)自己來(lái)決定這些網(wǎng)絡(luò)節(jié)點(diǎn)是什么)绑改。
神經(jīng)網(wǎng)絡(luò)最重要的一點(diǎn)是只要給定足夠多的訓(xùn)練示例x和y,神經(jīng)網(wǎng)絡(luò)就能很好地?cái)M合出一個(gè)函數(shù)來(lái)建立x和y之間的映射關(guān)系识腿。
實(shí)際上渡讼,當(dāng)你建立了自己的神經(jīng)網(wǎng)絡(luò)系統(tǒng)以后成箫,你可能發(fā)現(xiàn)它們?cè)诒O(jiān)督學(xué)習(xí)中是最有用旨枯、最強(qiáng)大的(所謂監(jiān)督學(xué)習(xí)攀隔,就是需要把一個(gè)輸入x和一個(gè)輸出y相對(duì)應(yīng)起來(lái))皂贩。
第四課:用神經(jīng)網(wǎng)絡(luò)進(jìn)行監(jiān)督學(xué)習(xí)
在監(jiān)督學(xué)習(xí)中,那你有一個(gè)輸入特征x昆汹,并且你想通過(guò)x學(xué)習(xí)到一個(gè)函數(shù)明刷,這個(gè)函數(shù)能夠?qū)映射到輸出y。
很多有價(jià)值的發(fā)明都是神經(jīng)網(wǎng)絡(luò)在特定問(wèn)題下來(lái)巧妙地建立x對(duì)應(yīng)y的函數(shù)映射關(guān)系满粗,并且通過(guò)監(jiān)督學(xué)習(xí)擬合數(shù)據(jù)遮精,成為某個(gè)復(fù)雜系統(tǒng)的一部分。
事實(shí)證明(結(jié)構(gòu))稍有不同的神經(jīng)網(wǎng)絡(luò)在不同的應(yīng)用領(lǐng)域都非常的有用败潦。
結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù):
結(jié)構(gòu)化數(shù)據(jù)是基于數(shù)據(jù)庫(kù)的數(shù)據(jù),每一種特征都有明確的意義准脂。
非結(jié)構(gòu)化數(shù)據(jù)是類(lèi)似于原始音頻劫扒、照片或者文本,這里特征也許是圖片中的像素值或一段文本中的獨(dú)立單詞狸膏。
歷史上對(duì)非結(jié)構(gòu)化數(shù)據(jù)的學(xué)習(xí)要比對(duì)結(jié)構(gòu)化數(shù)據(jù)困難的多沟饥。
但由于人類(lèi)可以很好地解釋這種非結(jié)構(gòu)化的數(shù)據(jù),在神經(jīng)網(wǎng)絡(luò)崛起后,最令人興奮的事情之一就是它帶來(lái)的深度學(xué)習(xí)使得計(jì)算機(jī)能夠比前些年更好地解釋非結(jié)構(gòu)化數(shù)據(jù)贤旷。語(yǔ)音識(shí)別广料、圖像識(shí)別,在文本上的自然語(yǔ)言處理技術(shù)幼驶。但短期购桑,神經(jīng)網(wǎng)絡(luò)帶來(lái)的價(jià)值還是集中體現(xiàn)在結(jié)構(gòu)化數(shù)據(jù)上。在海量的數(shù)據(jù)庫(kù)上有更好的處理數(shù)據(jù)的能力缭贡。
神經(jīng)網(wǎng)絡(luò)已經(jīng)變革了監(jiān)督學(xué)習(xí)的方式,并且正在創(chuàng)造出巨大的經(jīng)濟(jì)價(jià)值穆端,神經(jīng)網(wǎng)絡(luò)背后的基礎(chǔ)原理也發(fā)展了十幾年嗽仪,為什么精神網(wǎng)絡(luò)直到現(xiàn)在表現(xiàn)得如此之好沽翔?
第五課:為什么深度學(xué)習(xí)會(huì)起飛?
為什么深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)最近才風(fēng)靡起來(lái)橘沥?
事實(shí)上今天要想達(dá)到高性能的最可靠的方法之一,要么是訓(xùn)練一個(gè)大網(wǎng)絡(luò)介陶,要么放更多的數(shù)據(jù)。
不同算法的性能的排名是不固定的弦牡,更多的是由你提取特征的能力和算法的細(xì)節(jié)決定的卸留。只有在很大的數(shù)據(jù)集的區(qū)域里,我們經(jīng)吃看到很大的神經(jīng)網(wǎng)絡(luò)超過(guò)了其它方法呵晨。
大數(shù)據(jù)
計(jì)算能力的大幅度上升(深度學(xué)習(xí)硬件的發(fā)展:GPU谓罗、高速網(wǎng)絡(luò)或其他硬件)
算法的更新:
signmoid函數(shù)到ReLu函數(shù)的轉(zhuǎn)換,增快學(xué)習(xí)速度(添加修正線性單元)刻蚯。
其次你訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)的過(guò)程是一個(gè)循環(huán)不翩,你有一個(gè)網(wǎng)絡(luò)架構(gòu)的想法器钟,你去用代碼實(shí)現(xiàn),之后讓你的實(shí)驗(yàn)結(jié)果告訴你你的網(wǎng)絡(luò)表現(xiàn)得怎么樣昙啄,這樣就可以回過(guò)頭去修改網(wǎng)絡(luò)里面的細(xì)節(jié),然后重復(fù)這個(gè)循環(huán)韧拒。
這些都是使得深度學(xué)習(xí)不斷發(fā)展的動(dòng)力。
第六課:二元分類(lèi)
編程技巧:
比如你有一個(gè)含有m個(gè)訓(xùn)樣本的訓(xùn)練集,你可能用關(guān)于用一個(gè)for循環(huán)來(lái)處理這m個(gè)訓(xùn)練樣本烹植。但當(dāng)你用神經(jīng)網(wǎng)絡(luò)的時(shí)候刊橘,你一般想訓(xùn)練整個(gè)訓(xùn)練集嘴纺,但不顯式使用for循環(huán)來(lái)遍歷整個(gè)訓(xùn)練集栽渴。
為什么計(jì)算可以被正向轉(zhuǎn)播組織為一次前向傳播過(guò)程以及一次反向傳播過(guò)程慢味?
邏輯回歸是一個(gè)二元分類(lèi)算法。
一張圖像中包含像素?cái)?shù)表示輸入特征向量x的維度顶岸,在二元分類(lèi)問(wèn)題中搓逾,我們的目標(biāo)是學(xué)習(xí)到這樣一個(gè)分類(lèi)器:
我們輸入一幅以特征向量x表示的圖像雏搂,然后預(yù)測(cè)對(duì)應(yīng)的輸出y是1還是0,
如何組織訓(xùn)練樣本的輸入x到矩陣X:
如何組織輸出標(biāo)簽Y:
得到一個(gè)X是一個(gè)n(x)乘m維的矩陣;Y是一個(gè)1xm大小的矩陣
以上就是我們之后在回歸算法和神經(jīng)網(wǎng)絡(luò)計(jì)算中使用到的一些符號(hào),如果你忘記了某個(gè)符號(hào)的意義歌憨,可以查找符號(hào)指南。
接下來(lái)著手實(shí)現(xiàn)邏輯回歸算法。
第七課:邏輯回歸
本節(jié)課:我們復(fù)習(xí)一下邏輯回歸
使用這種學(xué)習(xí)算法會(huì)得到的輸出標(biāo)簽y去扣,y在監(jiān)督學(xué)習(xí)問(wèn)題中全是0或者1,因此這是一種針對(duì)二元分類(lèi)的算法或链。
給定的輸入特征向量x和一副圖片對(duì)應(yīng)令宿,我們希望它輸出一個(gè)y值,與是不是貓對(duì)應(yīng)腕窥,我們稱之為y帽(代表對(duì)真實(shí)標(biāo)簽y的估計(jì))粒没。
輸入x的一個(gè)線性函數(shù)輸出:
我們希望y輸出是一個(gè)0到1的數(shù)字,但是因?yàn)閣.T*x + b可能會(huì)得到比1大很多或者是一個(gè)負(fù)數(shù)簇爆,這對(duì)于概率就失去了意義癞松。
所以要讓邏輯回歸變成等于對(duì)這個(gè)值應(yīng)用sigmoid函數(shù)的結(jié)果:
因此,當(dāng)你使用邏輯回歸時(shí)枫甲,你的目標(biāo)是盡力學(xué)到參數(shù)w和b幔崖。因此yhat就能很好地估計(jì)y等于1的概率露戒。
此外,當(dāng)運(yùn)用神經(jīng)網(wǎng)絡(luò)進(jìn)行編程時(shí)妈拌,我們通常會(huì)將參數(shù)w和參數(shù)b分開(kāi)看待竭钝,這里的b對(duì)應(yīng)一個(gè)偏置量螃成。
當(dāng)實(shí)現(xiàn)神經(jīng)網(wǎng)路時(shí)启摄,將b和w當(dāng)做相互獨(dú)立的參數(shù)會(huì)更加簡(jiǎn)單。
接下來(lái)為了改變參數(shù)w和b梳侨,需要定義一個(gè)代價(jià)函數(shù)栅盲。
第八課:邏輯回歸代價(jià)函數(shù)
為了優(yōu)化邏輯回歸模型的參數(shù)W和b,我們需要定義一個(gè)代價(jià)函數(shù)隔披。
目的是在獲得優(yōu)化集合和輸出值時(shí),對(duì)于優(yōu)化集合的假定扫俺,我們只提出y(i)將接近從優(yōu)化集合中獲得的實(shí)標(biāo)yi。
標(biāo)記法則:上標(biāo)括號(hào)指的是數(shù)據(jù);X Y Z以及其他字母與優(yōu)化示例相關(guān)聯(lián)
函數(shù)L被稱為損失函數(shù)速缆,需要進(jìn)行設(shè)定园爷,才能在實(shí)標(biāo)為y時(shí)對(duì)輸出值y^進(jìn)行檢測(cè)弦赖。
為什么要使用平方:
因?yàn)槿绻褂靡粋€(gè)或者半個(gè)差值,優(yōu)化問(wèn)題會(huì)產(chǎn)生多個(gè)局部最優(yōu)解浦辨,梯度下降算法也無(wú)法找到全局最優(yōu)解蹬竖。平方誤差會(huì)產(chǎn)生一個(gè)非凸函數(shù),這將使之后的優(yōu)化變得更容易。
目前有很多函數(shù)有拉裴拉效應(yīng)币厕,也就是如果y等于1列另,y^ 值要變大;如果y等于0旦装,y^值要變小页衙。
這就解釋了為什么在邏輯回歸中,這個(gè)特定函數(shù)更適用同辣。
最后這個(gè)損失函數(shù)被單一的優(yōu)化示例所定義拷姿,它被檢測(cè)單一優(yōu)化示例的運(yùn)行情況。接下來(lái)定義代價(jià)函數(shù)旱函,來(lái)檢測(cè)優(yōu)化組的整體運(yùn)行情況响巢。
即損失函數(shù)適用于像這樣單一的優(yōu)化示例,損失函數(shù)反應(yīng)的是你的參數(shù)成本棒妨。所以在你優(yōu)化你的邏輯回歸模型時(shí)踪古,我們要試著去找參數(shù)W和b,一次來(lái)縮小J的整體成本券腔。
設(shè)置邏輯回歸算法優(yōu)化示例的損失函數(shù)以及算法參數(shù)的總體損失函數(shù)。邏輯回歸可被視為一個(gè)非常小的神經(jīng)網(wǎng)絡(luò)枕扫。
損失函數(shù)計(jì)算單個(gè)訓(xùn)練示例的誤差; 代價(jià)函數(shù)是整個(gè)訓(xùn)練集的成本函數(shù)的平均值辱魁。
第九課:梯度下降
用損失函數(shù)界定你的模型對(duì)單一樣本的訓(xùn)練效果烟瞧,對(duì)每一個(gè)訓(xùn)練樣例都輸出y^(i)染簇。代價(jià)函數(shù)可以用來(lái)衡量參數(shù)w和b在你設(shè)計(jì)的整個(gè)模型中的作用效果。
如何是用梯度下降模型去訓(xùn)練或者去學(xué)習(xí)锻弓,來(lái)調(diào)整你的訓(xùn)練集中的參數(shù)w和b砾赔?
所以代價(jià)函數(shù)可以用來(lái)衡量參數(shù)w和b在訓(xùn)練集上的效果暴心,要使得參數(shù)w和b設(shè)置變得合理酷勺,自然地想到去找到使得代價(jià)函數(shù)J(w,b)盡可能小所對(duì)應(yīng)的w和b扳躬。
定義w和b都是單一實(shí)數(shù)。代價(jià)函數(shù)J是一個(gè)凸函數(shù)亏狰。為了找到最小值暇唾,我們將會(huì)使用一些初始值來(lái)初始化w和b策州。對(duì)于邏輯回歸幾乎所有的初始化方法都有效宫仗。通常用0來(lái)初始化藕夫,隨機(jī)初始化也有效毅贮,但對(duì)于邏輯回歸我們通常不這么做滩褥。
細(xì)節(jié)(對(duì)w和b進(jìn)行不斷迭代更新):
第十課:導(dǎo)數(shù)
更直觀的理解微積分和導(dǎo)數(shù)
第十一課:導(dǎo)數(shù)二
函數(shù)的斜率在這個(gè)函數(shù)的不同地方取值不同瑰煎。
函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率丢间,函數(shù)的斜率在函數(shù)的不同位置取值可能不同
如果你想要找一個(gè)函數(shù)的導(dǎo)數(shù)烘挫,你可以打開(kāi)微積分教材或者谷歌搜索
第十二課:流程圖
你已經(jīng)學(xué)過(guò)神經(jīng)網(wǎng)絡(luò)的計(jì)算過(guò)程饮六,由正向傳播來(lái)進(jìn)行前向計(jì)算來(lái)計(jì)算神經(jīng)網(wǎng)絡(luò)的輸出卤橄,以及反向傳播計(jì)算來(lái)計(jì)算梯度或微分窟扑。計(jì)算圖解釋了為什么以這種方式來(lái)組織?
以一個(gè)簡(jiǎn)單的邏輯回歸或單層神經(jīng)網(wǎng)絡(luò)為例:
當(dāng)有一些特殊的輸出變量時(shí),流程圖用起來(lái)很方便殖属。
反向計(jì)算就是計(jì)算導(dǎo)數(shù)最自然的方式洗显。
流程圖使用藍(lán)色箭頭畫(huà)出來(lái)的挠唆,從左向右的計(jì)算损搬。
反向紅色箭頭巧勤,從右到左的導(dǎo)數(shù)計(jì)算是什么樣的呢?
第十三課:用流程圖求導(dǎo)
我們看了一個(gè)使用流程圖計(jì)算函數(shù)J的例子沽瞭。如何利用流程圖計(jì)算函數(shù)J的導(dǎo)數(shù)驹溃?
用反向傳播這個(gè)術(shù)語(yǔ)來(lái)解釋:
如果你想要計(jì)算最終輸出變量對(duì)v的導(dǎo)數(shù)豌鹤,而這也是你通常最關(guān)心的變量布疙,這就是一步反向傳輸灵临。
在微積分中存在鏈?zhǔn)椒▌t儒溉。如果通過(guò)計(jì)算dJ/dv发钝,即J關(guān)于v的導(dǎo)數(shù)來(lái)幫助你計(jì)算dJ/da,這是反向傳播的另一步舔痪。
當(dāng)你寫(xiě)反向傳播代碼的時(shí)候锄码,那些你真正關(guān)心的或者你想優(yōu)化的最終輸出變量滋捶,一般是流程圖中的最后一個(gè)節(jié)點(diǎn)重窟,你會(huì)做很多最終輸出變量的導(dǎo)數(shù)運(yùn)算巡扇,記這個(gè)最終輸出變量對(duì)于其他變量導(dǎo)數(shù)的運(yùn)算厅翔,dvar刀闷,這回牽涉到很多中間變量仰迁。當(dāng)你在程序中實(shí)現(xiàn)的時(shí)候徐许,你給這些變量取什么名字呢雌隅?在Python中你可以輸入一個(gè)很長(zhǎng)的名字澄步,但因?yàn)閷?dǎo)數(shù)都是關(guān)于最終輸出變量J的村缸,引入一個(gè)新符號(hào)梯皿,當(dāng)你在代碼中計(jì)算這個(gè)導(dǎo)數(shù)的時(shí)候东羹,我們就用變量名dvar來(lái)代表這個(gè)值属提。所以dvar在你的代碼中就代表最終輸出變量冤议,比如J對(duì)它的導(dǎo)數(shù)恕酸。dv蕊温;da义矛。
這個(gè)例子中最重要的東西是:當(dāng)在計(jì)算導(dǎo)數(shù)的時(shí)候凉翻,最有效率的方式是按紅色箭頭方向從右往左噪矛,特別的艇挨,我們先計(jì)算對(duì)v的導(dǎo)數(shù)缩滨,計(jì)算的結(jié)果對(duì)于計(jì)算J對(duì)a的導(dǎo)數(shù)和J對(duì)u的導(dǎo)數(shù)很有用...脉漏。
這就是流程圖以及前向計(jì)算代價(jià)函數(shù)侧巨,以及如何反向或從右往左計(jì)算導(dǎo)數(shù)司忱。
第十四課:Logistic回歸梯度下降
在實(shí)現(xiàn)邏輯回歸時(shí),如何計(jì)算導(dǎo)數(shù)來(lái)實(shí)現(xiàn)梯度下降叨襟?
重點(diǎn)在于邏輯回歸中梯度下降的關(guān)鍵方程糊闽。使用流程圖對(duì)于邏輯回歸的梯度下降有些大材小用墓怀。但對(duì)于熟悉神經(jīng)網(wǎng)絡(luò)有所幫助傀履。
a是邏輯回歸的輸出
y是真實(shí)值
在邏輯回歸中我們要做的就是修改參數(shù)w和b來(lái)減少損失函數(shù)钓账。如何計(jì)算單個(gè)樣本的損失函數(shù)之前的視頻中已經(jīng)講過(guò)梆暮。接下來(lái)如何反向計(jì)算導(dǎo)數(shù)啦粹?
..
通過(guò)鏈?zhǔn)椒磩t進(jìn)行反向求導(dǎo)唠椭,反向傳輸?shù)淖詈笠徊绞欠聪蛩愠瞿阈枰淖僿和b多少贪嫂?
所以如果你需要對(duì)一個(gè)例子進(jìn)行梯度下降力崇,你需要做如下事情:
用公式算出dz
然后用公式算出dw1 dw2和db
然后進(jìn)行更新:w1 = w1 - αdw1(α表示學(xué)習(xí)速率)
w2 = w2 - αdw2
b = b - α*db
當(dāng)然這是個(gè)簡(jiǎn)單的例子亮靴,一步梯度的情況茧吊。
對(duì)于一個(gè)單一的訓(xùn)練樣本如何計(jì)算導(dǎo)數(shù)和執(zhí)行邏輯回歸的梯度下降饱狂,但訓(xùn)練一個(gè)邏輯回歸模型休讳,你不止有一個(gè)樣本俊柔,而是有m個(gè)雏婶,如何把梯度下降算法和執(zhí)行邏輯回歸應(yīng)用到多個(gè)樣本留晚?
第十五課:在m個(gè)樣本上進(jìn)行Logistic回歸梯度下降
m個(gè)訓(xùn)練樣本的情況下 vs 只有一個(gè)訓(xùn)練樣本:
在梯度下降法中有很多細(xì)節(jié)错维,但讓我們把這些裝進(jìn)一個(gè)具體地算法赋焕,你需要實(shí)現(xiàn)的就是使邏輯回歸和其中的梯度下降法生效隆判。
細(xì)節(jié):我們使用dw1侨嘀,dw2和db作為累加器飒炎,所以計(jì)算完成后郎汪,dw1就等于你全局代價(jià)函數(shù)對(duì)w1的導(dǎo)數(shù)煞赢,dw2和db也是一樣照筑。注意dw'1和dw2沒(méi)有上標(biāo)i凝危,是因?yàn)槲覀冊(cè)谶@代碼中把它們當(dāng)做累加器去求取整個(gè)訓(xùn)練集上的和懦铺。然而dz(i)是對(duì)對(duì)應(yīng)于單個(gè)仰恩的dz冬念,這就是為什么dz會(huì)有上標(biāo)i急前,它指代對(duì)應(yīng)的第i個(gè)訓(xùn)練樣本裆针。
完成這些計(jì)算后實(shí)現(xiàn)一步梯度下降來(lái)更新w1据块,w2和b另假,最終J也會(huì)變成你代價(jià)函數(shù)的正確值边篮。
幻燈片上的計(jì)算只實(shí)現(xiàn)了一步梯度下降,因此你需要重復(fù)以上內(nèi)容很多次思杯。
但它表明計(jì)算中有缺點(diǎn):
邏輯回歸時(shí)色乾,你需要兩個(gè)for循環(huán)暖璧,第一個(gè)for循環(huán)是一個(gè)小循環(huán)用于遍歷m個(gè)訓(xùn)練樣本澎办,第二個(gè)for循環(huán)是一個(gè)遍歷所有特征的for循環(huán)。當(dāng)你實(shí)現(xiàn)深度學(xué)習(xí)算法時(shí)扶欣,你會(huì)發(fā)現(xiàn)在代碼中顯式的使用for循環(huán)會(huì)使你的算法不夠高效宵蛀。在深度學(xué)習(xí)時(shí)代會(huì)有越來(lái)越大的數(shù)據(jù)集,所以不適用顯式的for循環(huán)來(lái)實(shí)現(xiàn)算法是非常重要的而且會(huì)幫你適用于更大的數(shù)據(jù)集。
所以這里有一些技術(shù)叫做矢量化技術(shù)摆碉,它可以幫助你的代碼擺脫這些顯式的for循環(huán)巷帝,我想在前深度學(xué)習(xí)的時(shí)代(興起之前)楞泼,矢量化是有兩面性的堕阔,有時(shí)候能加速你的代碼超陆,有時(shí)候也未必时呀。但在深度學(xué)習(xí)時(shí)代,矢量化瞧预,也就是擺脫for循環(huán)已經(jīng)變得相當(dāng)重要垢油。因?yàn)槲覀冊(cè)絹?lái)越多地訓(xùn)練非常大的數(shù)據(jù)集因此你需要你的代碼變得非常高效滩愁。
如何適量化以及是如何實(shí)現(xiàn)這些的同時(shí)不用一個(gè)for循環(huán)硝枉。
第十六課:向量化
向量化是一項(xiàng)能讓你的代碼變得更高效的藝術(shù)正压。
在深度學(xué)習(xí)領(lǐng)域焦履,我認(rèn)為實(shí)現(xiàn)向量化的能力已經(jīng)變成一個(gè)關(guān)鍵的技巧嘉裤。
例子:Python程序(略)
非向量化的版本比向量化的版本多花了300倍的時(shí)間。
大規(guī)模的深度學(xué)習(xí)使用了GPU或者圖像處理單元實(shí)現(xiàn)典奉。GPU和CPU都有并行化的指令:SIMD指令秋柄,它代表了一個(gè)單獨(dú)指令多維數(shù)據(jù)骇笔。即Python中的numpy充分利用并行化去更快的計(jì)算笨触。
第十六課:向量化(二)
上節(jié)課談到了避免使用顯式的for循環(huán)來(lái)實(shí)現(xiàn)向量化,這可以有效的提高代碼的運(yùn)行速度虚吟。
經(jīng)驗(yàn)之談:當(dāng)你在編寫(xiě)神經(jīng)網(wǎng)絡(luò)或邏輯回歸時(shí)偏塞,都要盡可能避免使用顯式的for循環(huán)灸叼,雖然有時(shí)候不能完全避免古今,但如果你能使用內(nèi)置函數(shù)或者找到其他方式來(lái)計(jì)算你想要的答案,這通常會(huì)比直接使用for循環(huán)更快但狭。
實(shí)際上,numpy中有很多支持向量值的函數(shù),比如對(duì)向量中每個(gè)元素進(jìn)行對(duì)數(shù)運(yùn)算粒竖,計(jì)算絕對(duì)值蕊苗,將向量中的元素與0相比求最大值朽砰,計(jì)算向量中每個(gè)元素的平方瞧柔,元素倒數(shù)...
接下來(lái),我們將這些知識(shí)運(yùn)用到邏輯回歸的梯度下降算法實(shí)現(xiàn):
看看我們能否可以至少擺脫兩個(gè)for循環(huán)中的一個(gè)哥蔚。
消滅第二個(gè)for循環(huán):
進(jìn)一步討論如何對(duì)邏輯回歸進(jìn)行向量化恨锚?
沒(méi)有for循環(huán)倍靡,你的算法也可以幾乎同時(shí)處理所有數(shù)據(jù)集猴伶。
第十七課:矢量化Logistic回歸
邏輯回歸的向量化實(shí)現(xiàn)。使得它們可以被用于處理整個(gè)訓(xùn)練集塌西,也就是說(shuō)他挎,可以用梯度下降法的一次迭代來(lái)處理整個(gè)訓(xùn)練集,甚至不需要使用任何一個(gè)for循環(huán)捡需。
首先看看邏輯回歸的前向傳播:
這里有一個(gè)Python比較精妙的地方,后面加上的b是一個(gè)實(shí)數(shù)站辉,或者說(shuō)是一個(gè)11的矩陣呢撞,如果當(dāng)你把這個(gè)實(shí)數(shù)b加上向量的時(shí)候,Python會(huì)自動(dòng)的把這個(gè)實(shí)數(shù)b擴(kuò)展為一個(gè)1m的行向量饰剥。這個(gè)在Python中叫做廣播殊霞。
你可以使用一行代碼計(jì)算Z,其中Z是一個(gè)包含z(1)汰蓉、z(1)...z(m)的1*m矩陣绷蹲。
如何實(shí)現(xiàn)一個(gè)(輸入輸出為)向量值的sigmoid函數(shù)?所以將這個(gè)Z作為sigmoid函數(shù)的輸入值會(huì)非常高效的得到A顾孽。
總結(jié):我們不需要遍歷m個(gè)訓(xùn)練樣本來(lái)一次一次計(jì)算z和a祝钢,你可以用一行代碼來(lái)實(shí)現(xiàn)同時(shí)計(jì)算所有的z,利用sigma函數(shù)的恰當(dāng)實(shí)現(xiàn)來(lái)同時(shí)計(jì)算所有的a若厚。
這就是你如何通過(guò)向量化同時(shí)實(shí)現(xiàn)所有m個(gè)訓(xùn)練樣本的前向傳播拦英。
如何使用向量化高效計(jì)算反向傳播?
第十八課:矢量化Logistic回歸的梯度輸出
向量化計(jì)算同時(shí)計(jì)算出整個(gè)訓(xùn)練集的激活值a测秸,如何使用向量化計(jì)算全部m個(gè)訓(xùn)練樣本的梯度疤估?如何高效的實(shí)現(xiàn)邏輯回歸?
總結(jié)一下乞封,到底應(yīng)該如何實(shí)現(xiàn)邏輯回歸做裙?
結(jié)合這幾節(jié)課的代碼,進(jìn)行前向傳播和反向傳播計(jì)算(對(duì)m個(gè)訓(xùn)練樣本進(jìn)行預(yù)測(cè)和求導(dǎo))肃晚,然后更新梯度下降:
至此就實(shí)現(xiàn)了邏輯回歸梯度下降的一次迭代锚贱。
如果需要實(shí)現(xiàn)梯度下降的多次迭代,仍然需要使用for循環(huán)关串,去迭代指定的個(gè)次數(shù)拧廊!
現(xiàn)在你得到了一個(gè)高度向量化且非常高效的邏輯回歸的梯度下降法监徘,下節(jié)課:廣播技術(shù)。
廣播是Python和Numpy提供的一種能夠使特定代碼更加高效的技術(shù)吧碾。
第十九課:Python廣播技術(shù)
深入研究Python中廣播的運(yùn)行機(jī)制:
假設(shè)你的目標(biāo)是計(jì)算每種食物的熱量中凰盔,來(lái)自碳水化合物、蛋白質(zhì)和脂肪的比例倦春?
問(wèn)題在于:你能不用顯式的for循環(huán)來(lái)完成這一操作么户敬?
cal = A.sum(axis = 0) #沿垂直方向(列)求和
percentage = 100 * A/cal.reshape(1, 4) #用矩陣A除以一個(gè)1*4的矩陣,從而得到了百分比矩陣
reshape()消耗常量的時(shí)間是一個(gè)0(1)操作睁本,調(diào)用成本很低尿庐,所以不要害怕用reshape來(lái)確保矩陣是你想要的尺寸。
怎么能用3乘4矩陣除以1乘4的矩陣呢呢堰?
例子:
如果你有一個(gè)4乘1的向量抄瑟,讓它加一個(gè)數(shù)字,Python會(huì)自動(dòng)將這個(gè)數(shù)字?jǐn)U展成一個(gè)4乘1的向量枉疼。
這種廣播適用于行向量和列向量皮假。之前在邏輯回歸中的b就相當(dāng)于我們這里為向量加上的常量。
如果你讓一個(gè)mn的矩陣骂维,加上一個(gè)1n的矩陣惹资,Python會(huì)將后者復(fù)制m次,使其變成一個(gè)m乘n的矩陣席舍,然后相加布轿。
假如你有一個(gè)m乘n的矩陣哮笆,讓它加上一個(gè)m乘1的向量来颤,或者說(shuō)m乘1的矩陣,后者會(huì)在水平方向賦值n次稠肘,得到一個(gè)m乘n的矩陣福铅,然后相加。
以下是Python廣播的一些通用規(guī)則:
閱讀numpy官方文檔...
第二十課:關(guān)于python / numpy向量的注釋
Python和numpy帶來(lái)了極佳的靈活性项阴,我認(rèn)為這既是Python作為一門(mén)編程語(yǔ)言的優(yōu)勢(shì)也是它的劣勢(shì)滑黔。其優(yōu)勢(shì)在于增加了語(yǔ)言的表達(dá)性,憑借其強(qiáng)大的靈活性环揽,你只用僅僅一行代碼就能完成大量的工作略荡。但也帶來(lái)了一些弱點(diǎn),因?yàn)閺V播和這種靈活性很大歉胶,如果你不熟悉廣播的復(fù)雜性和廣播工作的功能汛兜,你有時(shí)可能會(huì)引入非常微妙的錯(cuò)誤或非常奇怪的錯(cuò)誤。例如通今,如果您采用列向量并將其添加到行向量粥谬,您可能會(huì)發(fā)現(xiàn)它會(huì)引發(fā)維度不匹配或鍵入錯(cuò)誤等肛根。但實(shí)際上,您可能會(huì)將矩陣作為行向量和列向量的總和漏策。
因此派哲,Python的這些奇怪效果有一個(gè)內(nèi)部邏輯。但如果你不熟悉Python掺喻,我發(fā)現(xiàn)有些學(xué)生很奇怪芭届,很難找到bug。所以我想在這個(gè)視頻中做的是與你分享一些技巧和技巧感耙,這些技巧和技巧對(duì)我來(lái)說(shuō)非常有用喉脖,可以消除或簡(jiǎn)化并消除我自己的代碼中所有奇怪的錯(cuò)誤。我希望通過(guò)這些提示和技巧抑月,您還可以更輕松地編寫(xiě)無(wú)bug的python和numpy代碼树叽。
我建議你在編寫(xiě)神經(jīng)網(wǎng)絡(luò)時(shí),不要使用這種數(shù)據(jù)結(jié)構(gòu)谦絮,即形如(5)或者(n)這樣的秩為1的數(shù)組题诵,而是令a的形狀為(5,1),這會(huì)使a成為一個(gè)5乘1的列向量层皱。
秩為1的數(shù)組 VS 真正的1乘5的矩陣
性锭!不要使用秩為1的數(shù)組,而是創(chuàng)建5乘1的向量叫胖,或者確保它是一個(gè)行向量草冈,那么這些向量的行為更容易理解。
當(dāng)我不太確定某一個(gè)向量的維度瓮增,我通常會(huì)將其放入斷言語(yǔ)句中映胁。執(zhí)行斷言語(yǔ)句的成本很低,還能充當(dāng)代碼的文檔绞蹦,所以當(dāng)你覺(jué)得需要的時(shí)候氮发,就使用斷言語(yǔ)句。
最后砸捏,如果出于某些原因谬运,你得到了一個(gè)秩為1的數(shù)組,你可以用reshape來(lái)改變它的形狀
a = a.reshape((5, 1))
這樣它就會(huì)始終表現(xiàn)為列向量或者行向量垦藏。我有時(shí)會(huì)見(jiàn)到學(xué)生因?yàn)檫@些秩為1的數(shù)組的不直觀的行為出現(xiàn)一些很難找出的bug梆暖。通過(guò)在舊代碼中消除秩為1的矩陣,我覺(jué)得我的代碼變得更簡(jiǎn)單了掂骏,而且我不覺(jué)得這樣寫(xiě)會(huì)限制代碼的表達(dá)轰驳。
為了簡(jiǎn)化代碼,不要使用秩為1的數(shù)組,始終使用n乘1的矩陣滑废,本質(zhì)上是列向量蝗肪,或者使用1乘n的矩陣,本質(zhì)上是行向量蠕趁。自由使用斷言語(yǔ)句薛闪,來(lái)復(fù)查矩陣和數(shù)組的維度。還有俺陋,不要怕使用reshape操作來(lái)確保矩陣和向量是你所需要的維度豁延。
第二十一課:快速介紹Jupyter / iPython筆記本電腦
有了你所學(xué)到的一切,你就可以準(zhǔn)備好解決你的第一個(gè)編程任務(wù)了腊状。在您這樣做之前诱咏,讓我快速介紹一下Coursera中的iPython Notebook。
有幾個(gè)提示缴挖。當(dāng)你執(zhí)行這樣的代碼時(shí)袋狞,它實(shí)際上運(yùn)行在內(nèi)核上,運(yùn)行在服務(wù)器上的一段代碼上映屋。如果你的工作量太大苟鸯,或者你離開(kāi)計(jì)算機(jī)很長(zhǎng)時(shí)間或出現(xiàn)問(wèn)題,你的互聯(lián)網(wǎng)連接什么的話棚点,后端的內(nèi)核很可能會(huì)死掉早处,在這種情況下,只需單擊Kernel然后重新啟動(dòng)內(nèi)核瘫析。并希望砌梆,這將重新啟動(dòng)內(nèi)核并使其再次工作。
所以如果你只是運(yùn)行相對(duì)較小的工作并且你剛剛啟動(dòng)iPython筆記本電腦那么這應(yīng)該不會(huì)發(fā)生贬循。如果您看到內(nèi)核已經(jīng)死亡的錯(cuò)誤消息咸包,則可以嘗試內(nèi)核,重啟甘有。
最后诉儒,在這樣的iPython筆記本中,可能存在多個(gè)代碼塊亏掀。因此,即使較早的代碼塊在代碼中沒(méi)有任何創(chuàng)建泛释,也要確保執(zhí)行此代碼塊滤愕,因?yàn)樵诖耸纠校鼘umpy導(dǎo)入為np怜校,依此類(lèi)推间影,并設(shè)置一些可能的變量需要為了執(zhí)行更低的代碼塊。因此茄茁,即使您沒(méi)有被要求在其中編寫(xiě)任何代碼魂贬,也要確保執(zhí)行上面的代碼巩割。
我發(fā)現(xiàn)iPython筆記本的交互式命令shell性質(zhì)對(duì)于快速學(xué)習(xí),實(shí)現(xiàn)幾行代碼付燥,查看結(jié)果宣谈,學(xué)習(xí)和添加非常快速非常有用键科。所以我希望通過(guò)Coursera中的練習(xí)闻丑,Jupyter iPython筆記本將幫助您快速學(xué)習(xí)和實(shí)驗(yàn),并了解如何實(shí)現(xiàn)這些算法勋颖。
此后還有一個(gè)視頻嗦嗡。這是一個(gè)可選視頻,討論了邏輯回歸的成本函數(shù)饭玲。
第二十二課:邏輯回歸成本函數(shù)的解釋(可選)
在這個(gè)可選視頻中侥祭,我想快速說(shuō)明為什么我們喜歡使用該成本函數(shù)進(jìn)行邏輯回歸。
明天繼續(xù)...溜