中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

18個(gè)月自學(xué)AI,2年寫就三萬字長文,過來人教你如何掌握這幾個(gè)AI基礎(chǔ)概念

2019-08-21    來源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

來源:機(jī)器之心  編譯:路雪、思源、張倩

David Code 有多個(gè)身份:他是旅行作家,通曉多國語言,他還是一名「AI 教師」。沒有數(shù)學(xué)和軟件背景的 David 用 18 個(gè)月的時(shí)間通過在線課程和博客自學(xué) AI,并花費(fèi)兩年時(shí)間撰寫了一篇長文。為了使和他一樣沒有數(shù)學(xué)基礎(chǔ)的人也能入門人工智能,他在這篇文章中運(yùn)用了大量類比、例子、故事、圖示,將重要的知識(shí)點(diǎn)或步驟反復(fù)強(qiáng)調(diào)。這是一篇真正針對(duì)初學(xué)者的 AI 教程,不只講概念,還講概念的底層原理。

由于原文過長,在編譯過程中進(jìn)行了少量刪節(jié)。想了解更多細(xì)節(jié),請(qǐng)查看原文鏈接:https://colab.research.google.com/drive/1VdwQq8JJsonfT4SV0pfXKZ1vsoNvvxcH#scrollTo=C810qURdm3hZ。

想學(xué) AI 又擔(dān)心沒有數(shù)學(xué)背景或軟件背景?沒關(guān)系,這篇博客非常適合你。

我曾經(jīng)花費(fèi)一年半的時(shí)間自學(xué)各種在線課程和博客,過程中有太多專家、太多信息,而且他們的很多觀點(diǎn)還有沖突。我在學(xué)習(xí)過程中經(jīng)常充滿自我懷疑。

我不想要很多專家?guī)臀覍W(xué)習(xí),我只想要一個(gè)老師。我希望有人能夠拉著我的手說:「Dave,這就是你需要學(xué)的東西,請(qǐng)按照這個(gè)順序?qū)W,F(xiàn)在我將用圖畫、有趣的故事、現(xiàn)實(shí)示例和淺顯易懂的語言教你學(xué)習(xí) AI!

而現(xiàn)在,我就是那個(gè)老師。

為什么是我?和網(wǎng)上的專家不同,我沒有數(shù)學(xué)或編程背景,不過我曾就讀于耶魯大學(xué)和普林斯頓大學(xué),環(huán)游過 100 多個(gè)國家,是一名旅行作家,我曾在《周六夜現(xiàn)場(chǎng)》工作,我的作品得過獎(jiǎng)。也就是說,我知道如何通過寫作來傳達(dá)復(fù)雜的概念,知道如何講故事。我熱愛教學(xué),也善于發(fā)現(xiàn)好的老師。在學(xué)習(xí)深度學(xué)習(xí)過程中我遇到了四位優(yōu)秀的老師,他們是 Andrew Trask、Grant Sanderson、Kalid Azad 和我的導(dǎo)師 Adam Koenig。

最重要的是,我理解你正在經(jīng)歷的痛苦。你聽說過「專家盲區(qū)」(expert blindness)嗎?專家向新手講授某個(gè)學(xué)科時(shí),由于他成為專家的時(shí)間太久,會(huì)忘了初學(xué)者對(duì)教材的感受。因此專家會(huì)快速介紹一些復(fù)雜的概念,而這些概念需要分解成小塊才能方便初學(xué)者掌握。或者他們不使用類比、圖畫或示例來幫助初學(xué)者掌握概念,導(dǎo)致初學(xué)者非常受挫。

每一個(gè)初學(xué)者都想要專家來教他們 AI。而事實(shí)上,你需要的不是專家,而是一名老師。

最好的教師就是那個(gè)剛剛學(xué)過這些知識(shí)的人,因?yàn)樗匀挥浀米约簰暝^的地方以及克服方法,并且他可以向你傳授捷徑。而我就是這個(gè)人。我不是專家,但我是個(gè)好老師,而且富有激情。

本文使用指南

本文的閱讀過程和小說不同,只讀一次是無法理解和掌握所有內(nèi)容的。我學(xué)數(shù)學(xué)的朋友告訴我,他們常常需要讀至少 7 遍數(shù)學(xué)文本才能開始理解。這不是開玩笑……

為方便講授,我使用了類比、圖畫、示例和幾何表示。但是請(qǐng)放心,本文在數(shù)學(xué)層面上是準(zhǔn)確而嚴(yán)謹(jǐn)?shù)。?qǐng)做好閱讀本文五遍的準(zhǔn)備,無法立刻領(lǐng)會(huì)也不要著急。

我在學(xué)習(xí)復(fù)雜材料的時(shí)候,通常會(huì)設(shè)置計(jì)時(shí)器,每五分鐘響一次,不斷地提醒自己不要在絕望中沉淪,要微笑、耐心并堅(jiān)持下去。這真的有效,相信我。

以下是一些宏觀要點(diǎn):

神經(jīng)網(wǎng)絡(luò)是深度學(xué)習(xí)中非常流行的前沿技術(shù);

深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的分支;

機(jī)器學(xué)習(xí)是人工智能的分支。

深度學(xué)習(xí)包括四個(gè)主要概念。本文的目標(biāo)是讓讀者掌握這四個(gè)深度學(xué)習(xí)基礎(chǔ)概念:

前饋
梯度下降
全局最小值
反向傳播

之前對(duì)這四個(gè)概念一無所知?沒關(guān)系,首先我會(huì)使用類比和圖示盡量簡單地講授這些知識(shí),然后不斷地回到這四個(gè)概念,探討其中的細(xì)節(jié)。你應(yīng)該將本文看作一個(gè)「螺旋上升」的學(xué)習(xí)過程,每一次回到這些概念時(shí)你都會(huì)收獲更多見解。

本文共有五個(gè)部分:

1. 深度學(xué)習(xí)概覽:示例、類比、圖示、玩笑

2. 28 行代碼創(chuàng)建神經(jīng)網(wǎng)絡(luò):神經(jīng)元和突觸

3. 前饋:做出有根據(jù)的猜測(cè),60000 次迭代

4. 從試錯(cuò)中學(xué)習(xí):梯度下降和全局最小值

5. 反向傳播:鏈?zhǔn)椒▌t

1. 深度學(xué)習(xí)概覽

1.1 示例

想象你是一家寵物店的老板,事業(yè)經(jīng)營得很成功,而這成功很大程度上是因?yàn)槟闵朴?AI 技術(shù)。你構(gòu)建了一個(gè)深度神經(jīng)網(wǎng)絡(luò),來選擇潛在新顧客,并向他們發(fā)送廣告。一個(gè)月前,你上線了一款新貓砂「Litter Rip!」。你試圖找到愿意給自己的貓使用這款貓砂的顧客。

而你的秘密武器是數(shù)據(jù)集。新貓砂上線一個(gè)月后,你對(duì)寵物店顧客進(jìn)行了調(diào)查并收集了一些數(shù)據(jù)。調(diào)查包括以下問題:

您有貓嗎?

您喝進(jìn)口啤酒嗎?

過去一個(gè)月,您是否訪問過我們的網(wǎng)站 LitterRip.com?

過去一個(gè)月,您是否購買過 Litter Rip! 貓砂?

這四個(gè)問題的答案即之前顧客的「特征」(feature)。

那么問題來了:什么使得 AI 網(wǎng)絡(luò)如此強(qiáng)大?

答案是:它使用調(diào)查結(jié)果進(jìn)行訓(xùn)練,從而準(zhǔn)確地預(yù)測(cè)未來顧客的購買行為。

首先,你需要將之前顧客的調(diào)查數(shù)據(jù)和他們對(duì)前三個(gè)問題的回答輸入到網(wǎng)絡(luò)中,進(jìn)行訓(xùn)練。該網(wǎng)絡(luò)使用這些數(shù)據(jù)預(yù)測(cè)某位顧客是否確實(shí)購買了新款貓砂。然后網(wǎng)絡(luò)再將預(yù)測(cè)結(jié)果與顧客第四個(gè)問題的答案進(jìn)行對(duì)比。第四個(gè)問題的答案就是標(biāo)簽,作為事實(shí)供網(wǎng)絡(luò)進(jìn)行對(duì)比。例如,如果網(wǎng)絡(luò)預(yù)測(cè)結(jié)果是「是的,我認(rèn)為這位顧客買過 Litter Rip! 貓砂」,而這位顧客第四個(gè)問題的答案確實(shí)是「Yes」,那么你就擁有了一個(gè)成功的神經(jīng)網(wǎng)絡(luò)。

神經(jīng)網(wǎng)絡(luò)通過試錯(cuò)進(jìn)行自我訓(xùn)練:網(wǎng)絡(luò)先預(yù)測(cè),然后對(duì)比預(yù)測(cè)結(jié)果與第四個(gè)問題的真正答案,再從錯(cuò)誤中學(xué)習(xí),并在多次迭代中不斷改進(jìn)。

神經(jīng)網(wǎng)絡(luò)通常在一個(gè)數(shù)據(jù)集上訓(xùn)練,在另一個(gè)數(shù)據(jù)集上執(zhí)行預(yù)測(cè),理解這一點(diǎn)很重要。一旦你的神經(jīng)網(wǎng)絡(luò)很擅長根據(jù)之前顧客的調(diào)查數(shù)據(jù)預(yù)測(cè)新款貓砂的購買情況,那么你就可以換一個(gè)新的數(shù)據(jù)集,該數(shù)據(jù)集包含潛在新顧客的名單。

你從獸醫(yī)那里得到了新的數(shù)據(jù)集,這些被調(diào)查者回答了前三個(gè)問題,F(xiàn)在,如果讓你用訓(xùn)練好了的網(wǎng)絡(luò)在潛在新顧客中預(yù)測(cè)廣告投放的最佳對(duì)象,你該怎么做呢?

我們來看下一節(jié)。

1.2 類比:神經(jīng)元和突觸

下圖是我們將要構(gòu)建的 3 層神經(jīng)網(wǎng)絡(luò),圖中使用的是常見的「神經(jīng)元和突觸」格式:

 

 

我們先來看這張圖,圖中是一個(gè)三層的前饋神經(jīng)網(wǎng)絡(luò)。左側(cè)為輸入層:三個(gè)圓圈表示神經(jīng)元(即節(jié)點(diǎn)或特征,該網(wǎng)絡(luò)將使用前三個(gè)調(diào)查問題作為特征)。現(xiàn)在,你看著這一列圓圈,想象它們分別代表一位顧客的答案。左上的圓圈包含問題 1「你有貓嗎?」的答案,左中圓圈包含問題 2「你喝進(jìn)口啤酒嗎?」的答案,左下圓圈表示問題 3「你是否訪問過我們的網(wǎng)站 LitterRip.com?」的答案。那么,如果顧客 1 對(duì)這三個(gè)問題的答案是「Yes/No/Yes」,則左上圓圈包含 1,左中圓圈包含 0,左下圓圈包含 1。

突觸(連接這些圓圈和隱藏層的所有線)是神經(jīng)網(wǎng)絡(luò)用來「思考」的部位。右側(cè)的單個(gè)圓圈(它依然和四個(gè)突觸相連)是網(wǎng)絡(luò)的預(yù)測(cè)結(jié)果,即「基于輸入到網(wǎng)絡(luò)的特征組合,此處展示了這位顧客購買新款貓砂的概率!

最右側(cè)標(biāo)注「y」的單個(gè)圓圈表示真值,即每個(gè)顧客對(duì)第四個(gè)調(diào)查問題「你是否購買過 Litter Rip! 貓砂?」的回答。這個(gè)圓圈有兩個(gè)選擇:0 表示沒買過,1 表示買過。神經(jīng)網(wǎng)絡(luò)將輸出一個(gè)預(yù)測(cè)概率,并將其與 y 進(jìn)行對(duì)比,查看準(zhǔn)確率,然后在下一次迭代中吸取教訓(xùn)。神經(jīng)網(wǎng)絡(luò)在數(shù)秒時(shí)間內(nèi)可以完成數(shù)萬次試錯(cuò)。

上圖是神經(jīng)網(wǎng)絡(luò)的典型圖示。本質(zhì)上,它描述的是前饋,即我們要介紹的第一個(gè)主要概念。你可能以為神經(jīng)元是該過程中最重要的部分,但是這里的類比似乎存在一些誤導(dǎo)性。事實(shí)上,本文要介紹的四個(gè)深度學(xué)習(xí)主要概念的共同驅(qū)動(dòng)力是突觸。因此,目前這部分最重要的知識(shí)點(diǎn)是:突觸使得預(yù)測(cè)發(fā)生。下面一節(jié)我會(huì)把這一概念類比為落進(jìn)碗里的乒乓球。

在進(jìn)行下一個(gè)類比之前,我想首先詳細(xì)解釋一下神經(jīng)網(wǎng)絡(luò)之所以強(qiáng)大的原因。

1.3 類比:碗與球

重點(diǎn)來了!人工智能如此強(qiáng)大的原因是:神經(jīng)網(wǎng)絡(luò)使用概率對(duì)下一次預(yù)測(cè)進(jìn)行漸進(jìn)式的改進(jìn)。該過程將試錯(cuò)學(xué)習(xí)提升到一個(gè)全新的層次。

我們先來看一下人類是如何預(yù)測(cè)的:假設(shè)你的桌子上有一些之前顧客的調(diào)查結(jié)果,旁邊還有一疊潛在新顧客的調(diào)查結(jié)果(即獸醫(yī)提供給你的調(diào)查數(shù)據(jù))。人類如何使用之前顧客的調(diào)查結(jié)果預(yù)測(cè)未來顧客的購買行為呢?你可能會(huì)想:「我的模糊邏輯告訴我,喝進(jìn)口啤酒的顧客和買新款貓砂的顧客沒有關(guān)聯(lián)。我查看了顧客調(diào)查結(jié)果,試圖尋找出一種模式,我認(rèn)為擁有貓和訪問過 LitterRip.com 網(wǎng)站的顧客購買過 Litter Rip! 貓砂!

在只有三個(gè)調(diào)查問題、四名被調(diào)查顧客時(shí),這是可行的。但是如果有 40 個(gè)問題、4000 名顧客呢?人類如何決定哪一個(gè)問題作為執(zhí)行準(zhǔn)確預(yù)測(cè)的核心因素?人類大腦能夠容納的數(shù)量是有限的,我們很難量化 40000 名顧客中的某一位購買新款貓砂的概率。這個(gè)數(shù)字是 67% 還是 68%?誰知道呢!

現(xiàn)在我們來看神經(jīng)網(wǎng)絡(luò)如何執(zhí)行預(yù)測(cè):神經(jīng)網(wǎng)絡(luò)不會(huì)將預(yù)測(cè)局限于直截了當(dāng)?shù)摹甘恰够颉阜瘛,相反,它?huì)預(yù)測(cè)出一個(gè) 0 和 1 之間的數(shù)字——概率。例如,0.67 表示「該顧客有 67% 的可能購買新款貓砂」,0.13 表示「該顧客有 13% 的可能購買新款貓砂,可能性較小!

這就說明了為什么給出一個(gè) 0 到 1 之間的概率數(shù)字是明智的:就算計(jì)算機(jī)的第一次預(yù)測(cè)結(jié)果與實(shí)際情況大相徑庭也沒有關(guān)系。真正重要的是,網(wǎng)絡(luò)會(huì)將概率 0.13 與真值進(jìn)行對(duì)比(假設(shè)真值是 1,即該顧客購買了新款貓砂),網(wǎng)絡(luò)會(huì)注意到它的預(yù)測(cè)結(jié)果偏離真值 0.87,這是一個(gè)比較大的誤差,因此網(wǎng)絡(luò)會(huì)進(jìn)行調(diào)整。網(wǎng)絡(luò)將保持?jǐn)?shù)字清晰展現(xiàn),同時(shí)調(diào)整數(shù)字,增加一些值降低另一些值,以找到更好的問題組合,從而使下一次預(yù)測(cè)能夠得到更加準(zhǔn)確的預(yù)測(cè)結(jié)果。將該步驟重復(fù)數(shù)萬次,直到計(jì)算機(jī)最終能夠自信地說:「我很高興地宣布,現(xiàn)在我的預(yù)測(cè)結(jié)果可以媲美真值了,誤差幾近于零,F(xiàn)在我可以準(zhǔn)確預(yù)測(cè)了!

現(xiàn)在,你知道了深度神經(jīng)網(wǎng)絡(luò)的強(qiáng)大原因,它使用概率和試錯(cuò)學(xué)習(xí)方法,漸進(jìn)式地改進(jìn)下一次預(yù)測(cè)的結(jié)果。

我可以用一幅簡單清晰的圖畫描述試錯(cuò)學(xué)習(xí)過程:網(wǎng)絡(luò)的試錯(cuò)學(xué)習(xí)就像順著碗邊滾落的乒乓球,最終將落在碗底。

前面我解釋了神經(jīng)網(wǎng)絡(luò)如何執(zhí)行預(yù)測(cè):計(jì)算誤差,改善下一次的預(yù)測(cè)結(jié)果,直到誤差減少到幾乎為零。執(zhí)行預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò)就像順著碗側(cè)滾落的乒乓球。我們假設(shè)碗底就是「烏托邦」——準(zhǔn)確的預(yù)測(cè)結(jié)果,那么網(wǎng)絡(luò)的第一次預(yù)測(cè)就是該「預(yù)測(cè)球」(乒乓球)的起始位置;第二次預(yù)測(cè)時(shí),乒乓球沿著碗側(cè)向底部前進(jìn)一點(diǎn)距離;第三次預(yù)測(cè)時(shí),球又向碗底前進(jìn)一點(diǎn)……如下圖所示,網(wǎng)絡(luò)的每一次預(yù)測(cè)就是乒乓球向碗底前進(jìn)時(shí)的新位置。

 

 

預(yù)測(cè)球滾落以及在到達(dá)完美位置(碗底)之前的準(zhǔn)確率改進(jìn)過程包括四步:

前饋:想象一下 1960 年的 IBM 計(jì)算機(jī),大到填滿整個(gè)房間,穿孔卡片從一端輸入,答案從另一端輸出。上文提到的神經(jīng)網(wǎng)絡(luò)以前三個(gè)調(diào)查問題的數(shù)據(jù)作為輸入,得出預(yù)測(cè)結(jié)果;

全局最小值:想象一下桌子上有一個(gè)黃色的碗(如上圖所示)。桌子表面表示幾乎零誤差的完美預(yù)測(cè)結(jié)果,那么很顯然碗底是最接近完美預(yù)測(cè)結(jié)果的位置,具備最小的誤差。與碗整個(gè)表面(即「全局表面」(global surface))相比,碗底最接近完美,它具備全局最小誤差值。

網(wǎng)絡(luò)每次進(jìn)行更好的預(yù)測(cè)時(shí),粉色的預(yù)測(cè)球沿著碗側(cè)向底部全局最小誤差值前進(jìn)。每一次預(yù)測(cè)后,網(wǎng)絡(luò)將預(yù)測(cè)結(jié)果與第四個(gè)問題的答案進(jìn)行對(duì)比,這類似于在特定時(shí)刻衡量預(yù)測(cè)球與碗底的距離。衡量預(yù)測(cè)結(jié)果與真值的距離叫做「找出誤差」。網(wǎng)絡(luò)每次預(yù)測(cè)的目標(biāo)都是持續(xù)地縮短與全局最小值之間的誤差。

反向傳播:想象一位雜技表演者,他能向空中拋接 16 個(gè)不同大小和重量的保齡球瓶,并使它們同時(shí)懸在空中,甚至可以神奇地調(diào)整保齡球瓶的大小和重量。網(wǎng)絡(luò)在執(zhí)行預(yù)測(cè)后,會(huì)返回到上一次預(yù)測(cè)的過程中,查看是否可以做一些調(diào)整,以便在下一次預(yù)測(cè)中縮小誤差,推動(dòng)小球向碗底前進(jìn)。

梯度下降:想象粉色乒乓球沿著碗側(cè)向碗底滾落,碗底即全局最小值(見上圖)。網(wǎng)絡(luò)就像那個(gè)球,碗的表面由網(wǎng)絡(luò)的每一次預(yù)測(cè)構(gòu)成。梯度下降就是球沿著碗側(cè)滾落向碗底(即具備全局最小誤差的預(yù)測(cè))的過程。

換句話說:

梯度下降是網(wǎng)絡(luò)在達(dá)到準(zhǔn)確預(yù)測(cè)(即全局最小誤差)前的試錯(cuò)過程,就像乒乓球滾落碗底的過程;

前饋即執(zhí)行預(yù)測(cè)。預(yù)測(cè)就像給定時(shí)刻球停留在碗表面某個(gè)位置的定格圖像;

全局最小值即預(yù)測(cè)幾乎沒有誤差的完美位置(碗底)。我們的目標(biāo)是到達(dá)碗底。網(wǎng)絡(luò)將預(yù)測(cè)結(jié)果與真值進(jìn)行對(duì)比,來衡量球目前位置與碗底的距離(誤差);

反向傳播即返回到上一次預(yù)測(cè),找出錯(cuò)誤并修正。反向傳播衡量球現(xiàn)在位置到其下桌面的距離(即誤差),并找出推動(dòng)球向碗底前進(jìn)的方法。

記。何覀儸F(xiàn)在只是粗略了解,所以即便有些地方?jīng)]有掌握也不要擔(dān)心。

在詳細(xì)解釋這些概念之前,我想把「碗和球」的類比再推進(jìn)一步。上圖展示了神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中的四個(gè)主要步驟,但過于簡化。它準(zhǔn)確地表示了只有一個(gè)調(diào)查問題的網(wǎng)絡(luò),該網(wǎng)絡(luò)也僅基于這一個(gè)問題做出預(yù)測(cè)。

但是,我們想做的是結(jié)合三個(gè)調(diào)查問題找出最佳預(yù)測(cè)。因此,如果網(wǎng)絡(luò)在試錯(cuò)迭代過程中使用不同問題組合進(jìn)行試驗(yàn),碗會(huì)是什么樣子呢?答案是:一只凹凸不平的碗。

如下圖所示:

 

 

圖源:https://www.youtube.com/watch?v=IHZwWFHWa-w&t=2s&index=3&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi

上圖中紅色的碗有一些凸起和凹陷,為什么會(huì)這樣呢?

首先,我們必須理解紅色碗由什么構(gòu)成。從圖中看它似乎是塑料做的……不過并不是,想象它由數(shù)百萬個(gè)紅點(diǎn)構(gòu)成,每個(gè)紅點(diǎn)都是 3D 網(wǎng)格中的一個(gè)點(diǎn)。每個(gè)點(diǎn)表示一個(gè)可能的調(diào)查問題組合,以及該組合中哪個(gè)問題對(duì)于網(wǎng)絡(luò)執(zhí)行預(yù)測(cè)的等級(jí)更高。這個(gè)凹凸不平的碗讓我們看到了所有可能組合的凹凸不平的表面。

記住這幅圖:紅色碗是「所有排列組合的表面」,它像山脈一樣有高峰、深谷、山嶺、河床。網(wǎng)絡(luò)無法窮盡浩瀚宇宙中每一個(gè)可能的排列組合,這會(huì)花費(fèi)太多計(jì)算時(shí)間。因此,它從你隨機(jī)「拋擲預(yù)測(cè)球」的位置出發(fā),一路向下走向谷底(即全局最小值)。網(wǎng)絡(luò)不需要管它從哪里開始出發(fā),它只需要在意從隨機(jī)的起始點(diǎn)到達(dá)碗底即可。

在解釋紅色的凹凸不平處之前,我們先來看從紅碗右上角開始的白色虛線。這條線的頂端就是網(wǎng)絡(luò)的第一次預(yù)測(cè)。還記得上文介紹的紅色乒乓球嗎?假設(shè)乒乓球就在白線頂端處,白色虛線表示網(wǎng)絡(luò)預(yù)測(cè)結(jié)果從起始點(diǎn)到全局最小值的路徑。也就是說乒乓球沿著這條白色虛線走到誤差最小、預(yù)測(cè)準(zhǔn)確率最高的地方。

但是為什么這條白色虛線路徑如此彎曲呢?原因在于,網(wǎng)絡(luò)的常規(guī)試驗(yàn)需要考慮組合哪些問題、每個(gè)問題的權(quán)重多大,才能得到誤差最小的最佳預(yù)測(cè)結(jié)果。網(wǎng)絡(luò)的常規(guī)目標(biāo)是盡可能降低誤差,即讓乒乓球盡快到達(dá)紅碗底部。因此網(wǎng)絡(luò)通常采用虛線上球所在點(diǎn)的坡度,來確定哪個(gè)方向具備最陡峭的坡度,能夠?qū)崿F(xiàn)最快的向下路徑。由于坡度不斷改變,這條路徑就很曲折。我們來看一個(gè)簡單的例子:

人類第一眼就會(huì)判斷這兩個(gè)問題(「你有貓嗎?」和「你訪問過我們網(wǎng)站嗎?」)是做出預(yù)測(cè)的基礎(chǔ)問題。但是哪個(gè)問題對(duì)預(yù)測(cè)準(zhǔn)確度影響最大呢?第一個(gè)問題影響更大,還是二者五五分?

網(wǎng)絡(luò)想用這兩個(gè)問題的不同權(quán)重組合進(jìn)行試驗(yàn),從而找出實(shí)現(xiàn)準(zhǔn)確預(yù)測(cè)的最佳組合。上圖紅色碗中的每個(gè)凸起都表示「走在錯(cuò)誤道路上」的問題組合和問題權(quán)重,因?yàn)槊總(gè)凸起都使網(wǎng)絡(luò)的「預(yù)測(cè)球」愈發(fā)偏離底部的全局最小值。而碗中的每個(gè)凹陷都表示「走在正確道路上」的問題組合,因?yàn)樗诡A(yù)測(cè)球離碗底更近。

但是,如果網(wǎng)絡(luò)找出了三個(gè)調(diào)查問題的完美權(quán)重組合,但預(yù)測(cè)準(zhǔn)確率仍然只有 60% 左右,該怎么辦?不要怕,網(wǎng)絡(luò)還有另一個(gè)技巧:推斷問題(inferred question)。

下面我們用一個(gè)簡單示例講述這個(gè)重要概念:

我們回過頭看關(guān)于進(jìn)口啤酒的那個(gè)問題。神經(jīng)網(wǎng)絡(luò)不停嘗試不同的問題組合。那么舉例來說,或許只有富人才有錢買進(jìn)口喜力啤酒,而我們都知道養(yǎng)貓的人很可能是富人。(本貓奴的內(nèi)心:不,我不是,我沒有……)那么也許當(dāng)「你喝進(jìn)口啤酒嗎?」和「你有貓嗎?」這兩個(gè)問題在網(wǎng)絡(luò)計(jì)算過程中是組合問題且權(quán)重較高時(shí),預(yù)測(cè)結(jié)果會(huì)得到改進(jìn)。

這里的推斷問題就是「富人更有可能購買 Litter Rip 貓砂嗎?」。不過我們剛才做了一個(gè)(愚蠢的)推斷:喝進(jìn)口喜力啤酒和養(yǎng)貓的人可能比較富有。

但是,隨著粉色預(yù)測(cè)球在紅色碗中兜兜轉(zhuǎn)轉(zhuǎn),它到了凸起處,而原因在于網(wǎng)絡(luò)使用了這個(gè)推斷問題進(jìn)行試驗(yàn)。也就是說該推斷問題對(duì)于改善預(yù)測(cè)準(zhǔn)確率并沒有幫助。(可能是因?yàn)樨埳安皇巧莩奁范丘B(yǎng)貓者的必需品。)在接下來的迭代中,預(yù)測(cè)球離開凸起處,不再使用這個(gè)無用的推斷問題。但是它也有可能因?yàn)橛杏玫耐茢鄦栴}掉進(jìn)凹陷處,從而幫助它更快地到達(dá)碗底。

上文的示例展示了如何測(cè)試推斷問題能否有效幫助實(shí)現(xiàn)更準(zhǔn)確的預(yù)測(cè)結(jié)果。人類使用模糊邏輯探索推斷問題,而神經(jīng)網(wǎng)絡(luò)嘗試窮盡每一種排列組合。如果試驗(yàn)獲得了較好的預(yù)測(cè)結(jié)果,它會(huì)保留該問題。如果試驗(yàn)得到了更糟的預(yù)測(cè)結(jié)果,網(wǎng)絡(luò)將拋棄該問題。

總之,紅色碗表面上每一個(gè)紅點(diǎn)表示網(wǎng)絡(luò)使用特定問題組合和權(quán)重組合進(jìn)行的一次試驗(yàn)。每一個(gè)凹陷表示「這一步走在了正確的道路上」,網(wǎng)絡(luò)注意到這一點(diǎn)并將繼續(xù)保持。每一個(gè)凸起處表示「這一步走錯(cuò)了方向」,網(wǎng)絡(luò)也會(huì)注意到并摒棄它。預(yù)測(cè)球的路徑(白色虛線)歪歪扭扭,是因?yàn)轭A(yù)測(cè)球在通往碗底的路上不斷尋找凹陷處、避免凸起處。你可以說白色虛線是預(yù)測(cè)球通往碗底的最高效路徑。

現(xiàn)在我們轉(zhuǎn)回來,更詳細(xì)地了解一下「前饋」、「全局最小值」、「反向傳播」和「梯度下降」。

1.3.1 前饋:將穿孔卡片輸入到 1960 年的 IBM 計(jì)算機(jī)

前饋的目標(biāo)是創(chuàng)建預(yù)測(cè)。假設(shè)每一次預(yù)測(cè)是預(yù)測(cè)球向碗底前進(jìn)過程中的一個(gè)新位置。在上圖紅色碗中,網(wǎng)絡(luò)做的第一次預(yù)測(cè)由白色虛線右上角的點(diǎn)表示,我們假設(shè)預(yù)測(cè)球就在這個(gè)點(diǎn)上。前饋是創(chuàng)建第一次預(yù)測(cè)的過程。白色虛線上的下一個(gè)點(diǎn)即是第二次預(yù)測(cè),這樣預(yù)測(cè)球移動(dòng)到下一個(gè)點(diǎn),之后再進(jìn)行第三次預(yù)測(cè)。

大部分 AI 課程和博客不會(huì)提及,預(yù)測(cè)球所在的每個(gè)位置由紅色碗底部白色網(wǎng)格的兩個(gè)坐標(biāo)軸決定。紅色碗并非在空間中漂移,它位于白色網(wǎng)格之上,該網(wǎng)格具備 X 軸和 Y 軸。

還記得上圖介紹全局最小值時(shí)所用的圖像嗎?黃色碗位于桌面上。同理,紅色碗位于白色網(wǎng)格上。白色網(wǎng)格即「桌面」,「完美、無誤差的預(yù)測(cè)位置」即紅色碗實(shí)際位于的點(diǎn)。注意,碗與桌面唯一的連接點(diǎn)是碗底,即白色虛線結(jié)束的點(diǎn)(全局最小值)。

預(yù)測(cè)球在紅色碗中的每次停頓,即每次預(yù)測(cè)點(diǎn),都由 3 個(gè)坐標(biāo)軸決定:X 軸和 Y 軸表示網(wǎng)格位置,Z 軸表示預(yù)測(cè)球到網(wǎng)格的距離。

現(xiàn)在讓我們跳出抽象描述。3D 空間中這三個(gè)坐標(biāo)軸在現(xiàn)實(shí)生活中表示什么?

回憶一下,紅色碗表面上每一個(gè)紅點(diǎn)表示網(wǎng)絡(luò)使用特定問題組合和權(quán)重組合進(jìn)行的一次試驗(yàn),那么網(wǎng)絡(luò)如何執(zhí)行試驗(yàn)?zāi)?它使用 X 軸和 Y 軸在白色網(wǎng)格上定一個(gè)位置,表示特定的問題組合。X 軸和 Y 軸必然會(huì)問:「嗨,Z 軸你好,這個(gè)組合怎么樣?」Z 軸將告訴我們?cè)摻M合的效果——Z 軸負(fù)責(zé)衡量誤差。

我們之前提到,碗底,即碗與白色網(wǎng)格相連接的位置,是完美的預(yù)測(cè)。那么碗中每一個(gè)紅點(diǎn)都表示誤差,離白色網(wǎng)格越遠(yuǎn),誤差就越大。

這點(diǎn)非常重要:白色網(wǎng)格表示網(wǎng)絡(luò)可以嘗試的問題及權(quán)重組合。對(duì)于白色網(wǎng)格上的每一個(gè)點(diǎn),其上方的紅點(diǎn)表示該組合的誤差值。也就是說,紅色碗上的每個(gè)紅點(diǎn)表示其下方預(yù)測(cè)的誤差。紅色碗就是「誤差組成的碗」。只有碗底,紅點(diǎn)接觸白色網(wǎng)格的地方,二者之間沒有距離,也因此沒有誤差。參見下圖:

 

 

上圖中的錐形黃色箭頭表示 Z 軸,用于衡量誤差。它很有用,你可以從中了解誤差值并學(xué)習(xí),以便下次得到更加準(zhǔn)確的預(yù)測(cè)結(jié)果。

想象一下,粉色的預(yù)測(cè)球在白色虛線上移動(dòng),黃色箭頭總是在預(yù)測(cè)球下方,并隨之移動(dòng)。粉色球表示網(wǎng)絡(luò)做出的每次預(yù)測(cè),黃色箭頭衡量預(yù)測(cè)球到白色網(wǎng)格的距離,即衡量每次預(yù)測(cè)的誤差。它的運(yùn)行原理是什么?

你可能會(huì)想到前饋——以前三個(gè)調(diào)查問題作為輸入并用不同方式進(jìn)行問題組合,再執(zhí)行預(yù)測(cè),預(yù)測(cè)結(jié)果為 0 到 1 之間的數(shù)字,即概率。想象預(yù)測(cè)球所在的點(diǎn)表示在白色虛線上的數(shù)字。我們知道第四個(gè)問題的答案是「1」,因此真值是該顧客買過新款貓砂。真值即是全局最小值,是我們改進(jìn)預(yù)測(cè)結(jié)果的目標(biāo),也是紅色碗和白色網(wǎng)格的接觸點(diǎn)。因此,網(wǎng)絡(luò)用 1 減去預(yù)測(cè)概率。舉例來說,如果網(wǎng)絡(luò)的第一次預(yù)測(cè)為 0.5,即該顧客有 50% 的可能性購買過這款貓砂,1 減去 50% 所得的數(shù)字表示誤差,黃色箭頭就用于衡量該誤差。某種程度上可以說,「真值數(shù)字 - 預(yù)測(cè)球數(shù)字 = 黃色箭頭數(shù)字」。在該示例中,即 1 - 0.5 = 0.5。誤差(黃色箭頭的長度)為 0.5(誤差通常用絕對(duì)值表示,不能為負(fù)值)。

沒有第四個(gè)調(diào)查問題的話,你無法訓(xùn)練網(wǎng)絡(luò),因?yàn)槟阈枰嬷祦頊y(cè)試預(yù)測(cè)結(jié)果。黃色箭頭衡量網(wǎng)絡(luò)預(yù)測(cè)與真值的距離,即誤差,這個(gè)例子中真值為 1。我們的第一次預(yù)測(cè)(0.5)準(zhǔn)確率并不高,0.99 的預(yù)測(cè)才可以說比較準(zhǔn)確。

1.3.2 找到全局最小值

我們的目標(biāo)是訓(xùn)練神經(jīng)網(wǎng)絡(luò)找出減少預(yù)測(cè)誤差的最快方式,也就是說讓黃色箭頭變短,這意味著我們需要預(yù)測(cè)球從起始點(diǎn)到碗底的最高效路徑。碗底即「烏托邦」,在那里黃色箭頭(預(yù)測(cè)誤差)的長度幾乎為 0(全局最小值),即我們的預(yù)測(cè)具備最小誤差,網(wǎng)絡(luò)達(dá)到非常高的準(zhǔn)確率。而預(yù)測(cè)球到達(dá)碗底的最高效路徑是那條白色虛線。一旦我們使用第一個(gè)數(shù)據(jù)集完成訓(xùn)練,網(wǎng)絡(luò)就可以準(zhǔn)確預(yù)測(cè)另一撥潛在新客戶購買新款貓砂的概率。

現(xiàn)在想象這個(gè)場(chǎng)景:預(yù)測(cè)球從白色虛線頂端開始,此時(shí)黃色箭頭(即第一次預(yù)測(cè)的誤差值)等于 0.5。我們?nèi)绾巫屒虻竭_(dá)碗底呢?也就是說,我們?nèi)绾握{(diào)整網(wǎng)絡(luò),使預(yù)測(cè)球(目前 X,Y 坐標(biāo)為 (3,3))在白色網(wǎng)格上移動(dòng)到碗底(碗底點(diǎn)的坐標(biāo)大致為 (3,0))。目前,我們僅能基于顧客 1 的答案執(zhí)行預(yù)測(cè)。那么,我們?nèi)绾位诿總(gè)顧客的回答改進(jìn)之后每一次預(yù)測(cè)的結(jié)果,直到預(yù)測(cè)誤差幾乎為 0?也就是預(yù)測(cè)球到達(dá)碗底,網(wǎng)絡(luò)訓(xùn)練得足夠好,可以利用新數(shù)據(jù)集做出預(yù)測(cè)。

找到從不那么準(zhǔn)確的預(yù)測(cè)結(jié)果 0.5 到最終第 6 萬次預(yù)測(cè)結(jié)果 0.9999 的每一步路徑,這就是梯度下降過程。

1.3.3 梯度下降和反向傳播

梯度下降表示網(wǎng)絡(luò)的試錯(cuò)學(xué)習(xí)過程。對(duì)于數(shù)學(xué) nerd 來說,它可定義為一個(gè)總體規(guī)劃:改變突觸權(quán)重、在每次迭代時(shí)最大程度上降低誤差。

對(duì)于普通人來說,這里有一個(gè)更好的解釋:將小球沿著最陡峭的坡度滾下,盡快地到達(dá)碗底。反向傳播是一種計(jì)算梯度的方法,梯度其實(shí)就是坡度(slope)。反向傳播告訴你預(yù)測(cè)球所在位置的坡度。

坡度在這里非常重要。所有專家都會(huì)使用術(shù)語「梯度下降」,而梯度的意思就是「坡度」。找到預(yù)測(cè)球在碗表面位置點(diǎn)的坡度,可以指示出球盡快到達(dá)碗底應(yīng)該移動(dòng)的方向。

但是,為什么是坡度呢?請(qǐng)考慮梯度下降的過程:

首先,計(jì)算機(jī)執(zhí)行前饋預(yù)測(cè)。用真值(全局最小值所在位置,即碗底)減去預(yù)測(cè)得到誤差(黃色箭頭長度),然后使用反向傳播計(jì)算誤差的坡度。坡度決定了預(yù)測(cè)球滾動(dòng)的方向和速度(即網(wǎng)絡(luò)應(yīng)該在數(shù)字方面做出多大的調(diào)整)。

找出坡度是反向傳播的重要工具。如果說梯度下降是總體規(guī)劃,那么反向傳播就是達(dá)成規(guī)劃的主要工具。

2. 28 行代碼創(chuàng)建神經(jīng)網(wǎng)絡(luò)

現(xiàn)在我們來看代碼。我將首先展示今天要學(xué)習(xí)的全部代碼,然后再進(jìn)行詳細(xì)的步驟講解。建議在兩個(gè)窗口中打開本文,一個(gè)窗口顯示代碼,另一個(gè)繼續(xù)往下閱讀。從下文代碼注釋中可以看到,我將構(gòu)建神經(jīng)網(wǎng)絡(luò)的過程分解成了 13 個(gè)步驟,F(xiàn)在準(zhǔn)備好觀看計(jì)算機(jī)從它所犯的錯(cuò)誤中學(xué)習(xí)并最終識(shí)別出模式了嗎?

不過,首先我們先來了解矩陣和線性代數(shù)的概念。

在下文的代碼中,你會(huì)看到單詞「matrix」或「matrices」(矩陣)。它非常重要:矩陣是這輛汽車的引擎。沒有矩陣,神經(jīng)網(wǎng)絡(luò)哪兒都去不了。

矩陣是多行數(shù)字的集合。你將遇到的第一個(gè)矩陣如下所示,它容納了寵物店顧客調(diào)查的數(shù)據(jù)。

將每一行想象為一名顧客,那么以上矩陣中共有 4 位顧客,每一行的方括號(hào)中包含三個(gè)數(shù)字(1 和 0 分別表示「是」和「否」)。在 1.2 節(jié)中,我們看到顧客 1 對(duì)前三個(gè)調(diào)查問題的答案是「Yes/No/Yes」,因此該矩陣的第一行為 1, 0 ,1。第一列是四位顧客對(duì)第一個(gè)問題「你有貓嗎?」的回答。

為了更詳細(xì)地介紹矩陣這一概念,請(qǐng)看下圖。圖中表示的矩陣與上面的矩陣相同,不過它多了一些標(biāo)簽和顏色,用于強(qiáng)調(diào)顧客的回復(fù)是一行,特征/問題是一列:

 

 

上圖厘清了一個(gè)最初使我非常困惑的點(diǎn):行與列之間的關(guān)系。

在該矩陣中,每一位顧客的數(shù)據(jù)被表示為一行中的三個(gè)數(shù)字。在神經(jīng)網(wǎng)絡(luò)圖示中(神經(jīng)元和突觸格式),輸入層是一個(gè)包含三個(gè)圓形神經(jīng)元的列。你需要注意到,每個(gè)神經(jīng)元并不表示一位顧客,即矩陣中的一行數(shù)據(jù)。相反,每個(gè)神經(jīng)元表示一個(gè)特征,即矩陣中的一列數(shù)據(jù)。因此,一個(gè)神經(jīng)元內(nèi)包含所有顧客對(duì)同一個(gè)問題/特征的答案。拿第一個(gè)問題「你有貓嗎?」舉例,我們只選取了四位顧客的數(shù)據(jù),因此上圖中該問題的回復(fù)中只有四個(gè)數(shù)字(兩個(gè) 0、兩個(gè) 1),而如果我們選取了一百萬名顧客的數(shù)據(jù),則上圖中該神經(jīng)元內(nèi)會(huì)包含一百萬個(gè)數(shù)字,表示這些顧客對(duì)該問題的回復(fù)。

到這里,我希望大家能夠理解我們?yōu)槭裁葱枰仃嚕阂驗(yàn)槲覀冇胁恢挂晃活櫩。在下面的神?jīng)網(wǎng)絡(luò)示例中,我們描述了四位顧客,所以我們需要四行數(shù)字。

該網(wǎng)絡(luò)包括不止一個(gè)問題。每個(gè)問題需要一列,因此我們有三列,分別表示對(duì)前三個(gè)調(diào)查問題的回答(第四個(gè)問題將出現(xiàn)在后面的另一個(gè)矩陣中)。

因此我們的矩陣很小,4 行 X 3 列(4 by 3)。不過真實(shí)神經(jīng)網(wǎng)絡(luò)的矩陣可能擁有數(shù)百萬位顧客和數(shù)百個(gè)調(diào)查問題。做圖像識(shí)別的神經(jīng)網(wǎng)絡(luò)可能具備數(shù)十億個(gè)「顧客」行和特征列。

總結(jié)一下,我們需要矩陣使所有數(shù)據(jù)清晰展現(xiàn),方便我們?cè)谄渖线M(jìn)行計(jì)算,這樣矩陣就把數(shù)據(jù)組織成美觀、整潔的行與列。

下面我們來看代碼,代碼選取自 Andrew Trask 的博客,不過注釋是我寫的。

代碼

2.1 Sigmoid 函數(shù):行 8-12

sigmoid 函數(shù)在網(wǎng)絡(luò)學(xué)習(xí)過程中起到非常重要的作用。

「nonlin()」是一種 sigmoid 函數(shù)類型,叫做 logistic 函數(shù)。logistic 函數(shù)在科學(xué)、統(tǒng)計(jì)學(xué)和概率論中非常常見。此處該函數(shù)的表達(dá)有些復(fù)雜,因?yàn)檫@里它作為兩個(gè)函數(shù)使用:

第一個(gè)函數(shù)是將矩陣(此處表示為 x)放入括號(hào)內(nèi),將每個(gè)值轉(zhuǎn)換為 0 到 1 之間的數(shù)字(即統(tǒng)計(jì)概率)。轉(zhuǎn)換過程通過代碼行 12 實(shí)現(xiàn):return 1/(1+np.exp(-x))。

那么為什么需要統(tǒng)計(jì)概率呢?神經(jīng)網(wǎng)絡(luò)不會(huì)預(yù)測(cè) 0 或 1,它不會(huì)直接吼「哇,顧客 1 絕對(duì)會(huì)買這款貓砂!」,而是預(yù)測(cè)概率:「顧客 1 有 74% 的可能購買這款貓砂」。

這里的區(qū)別很大,如果你直接預(yù)測(cè) 0 和 1,那么網(wǎng)絡(luò)就沒有改進(jìn)空間了。要么對(duì)要么錯(cuò)。但是使用概率的話就有改進(jìn)空間。你可以調(diào)整系統(tǒng),每一次使概率增加或減少幾個(gè)點(diǎn),從而提升網(wǎng)絡(luò)的準(zhǔn)確率。這是一個(gè)受控的增量過程,而不是盲猜。

將數(shù)字轉(zhuǎn)換成 0 到 1 之間的數(shù)字這一過程非常重要,它帶給我們四大優(yōu)勢(shì)。下文將詳細(xì)討論這些優(yōu)勢(shì),現(xiàn)在我們先來看 sigmoid 函數(shù)如何將其括號(hào)內(nèi)每個(gè)矩陣的每個(gè)數(shù)字轉(zhuǎn)換成 0 到 1 之間的數(shù)字,并使其落在下圖的 S 曲線上:

 

 

圖源:https://iamtrask.github.io/2015/07/12/basic-python-network/

sigmoid 的第一個(gè)函數(shù)將矩陣中的每個(gè)值轉(zhuǎn)換為統(tǒng)計(jì)概率,而它的第二個(gè)函數(shù)如代碼行 9 和 10 所示:

' if(deriv==True):
return x*(1-x)'

該函數(shù)將給定矩陣中的每個(gè)值轉(zhuǎn)換成 sigmoid 函數(shù) S 曲線上特定點(diǎn)處的坡度。該坡度值也叫做置信度(confidence measure)。也就是說,該數(shù)值回答了這個(gè)問題:我們對(duì)該數(shù)值能夠準(zhǔn)確預(yù)測(cè)結(jié)果的自信程度如何?你可能會(huì)想:這又能怎么樣呢?我們的目標(biāo)是神經(jīng)網(wǎng)絡(luò)可靠地做出準(zhǔn)這是我們的標(biāo)簽確的預(yù)測(cè)。而實(shí)現(xiàn)這一目標(biāo)的最快方式就是修復(fù)置信度低、準(zhǔn)確率低的預(yù)測(cè),不改變置信度高、準(zhǔn)確率高的預(yù)測(cè)!钢眯哦取惯@一概念非常重要,下文我們將深入解讀它。

接下來我們看第 2 步:

2.2 創(chuàng)建輸入 X:行 23-26

代碼行 23-26 創(chuàng)建了一個(gè)輸入值的 4x3 矩陣,可用于訓(xùn)練網(wǎng)絡(luò)。X 將成為網(wǎng)絡(luò)的 layer 0(或 l0),現(xiàn)在開始創(chuàng)建神經(jīng)網(wǎng)絡(luò)吧!

以下是我們從顧客調(diào)查中獲得的特征集,只不過用計(jì)算機(jī)能理解的語言表達(dá)出來:

Line 23 creates the X input (which becomes l0, layer 0, in line 57)

X:

[1,0,1],
[0,1,1],
[0,0,1],
[1,1,1]

我們有四個(gè)顧客,他們分別回答了三個(gè)問題。前面我們討論過第一行 1,0,1 是顧客 1 的答案。將這個(gè)矩陣的每一行看作即將輸入網(wǎng)絡(luò)的訓(xùn)練樣本,每一列就是輸入的一個(gè)特征。因此矩陣 X 可被描述為下圖,該矩陣即為圖中的 l0:

 

 

你可能會(huì)想:矩陣 X 是怎么變成圖中的 layer 0 的?稍后我會(huì)解釋這一點(diǎn)。

接下來,我們將創(chuàng)建正確答案列表。

2.3 創(chuàng)建輸出 y:行 34-37

這是我們的標(biāo)簽,即第四個(gè)調(diào)查問題「你是否購買過新款貓砂?」的答案?聪旅孢@列數(shù)字,顧客 1 回答的是「Yes」,顧客 2 回答的是「Yes」,顧客 3 和 4 回答的是「No」。

 

 

如果把 y 看作「目標(biāo)」值的話,我將畫一個(gè)箭靶。隨著網(wǎng)絡(luò)的改進(jìn),它射出的箭離靶心越來越近。一旦網(wǎng)絡(luò)可以根據(jù)矩陣 X 提供的輸入準(zhǔn)確預(yù)測(cè) 4 個(gè)目標(biāo)值,則網(wǎng)絡(luò)準(zhǔn)備就緒,可以在其他數(shù)據(jù)集上執(zhí)行預(yù)測(cè)了。

2.4 生成隨機(jī)數(shù):行 40

這一步是「做家務(wù)」。我們必須生成隨機(jī)數(shù)(隨機(jī)數(shù)將在訓(xùn)練過程的下一步生成突觸/權(quán)重),以使 debug 過程更加簡單。你不必理解這行代碼的工作原理,只需要使用它就好了。

生成隨機(jī)數(shù)的原因是,你必須從某個(gè)地方開始。因此我們從一組捏造數(shù)字開始,然后在 6 萬次迭代中慢慢改變每一個(gè)數(shù)字,直到它們輸出具備最小誤差值的預(yù)測(cè)。這一步使得測(cè)試可重復(fù)(即使用同樣的輸入測(cè)試多次,結(jié)果仍然相同)。

2.5 創(chuàng)建突觸(即權(quán)重):行 47-48

第一次看到下圖時(shí),你可能會(huì)認(rèn)為神經(jīng)網(wǎng)絡(luò)的「大腦」是那些圓圈(神經(jīng)元)。而事實(shí)上,神經(jīng)大腦的真正核心是那些能夠?qū)W習(xí)和改進(jìn)的部分——突觸,也就是圖中那些連接圓圈的線。這兩個(gè)矩陣——syn0 和 syn1 才是網(wǎng)絡(luò)的真正大腦。它們是網(wǎng)絡(luò)用來試錯(cuò)學(xué)習(xí)、執(zhí)行預(yù)測(cè)、對(duì)比目標(biāo)值和預(yù)測(cè),進(jìn)而改善下一次預(yù)測(cè)結(jié)果的部分。

注意代碼 syn0 = 2np.random.random((3,4)) - 1 創(chuàng)建了 3x4 矩陣,并為它生成隨機(jī)數(shù)。這將是突觸(或權(quán)重)的第一層 Synapse 0,它連接 l0 和 l1。該矩陣如下所示:

 

 

我曾經(jīng)在這里犯了一個(gè)錯(cuò):我無法理解為什么 syn0 應(yīng)該是 3x4 矩陣。我認(rèn)為它應(yīng)該是 4x3 矩陣,因?yàn)?syn0 必須與 l0 相乘,而后者是 4x3 矩陣,我們?yōu)槭裁床蛔寖蓚(gè)矩陣的數(shù)字按行與列排列整齊呢?

而這就是我的錯(cuò)誤:4x3 乘 4x3 能夠使數(shù)字排列整齊?這是錯(cuò)的。事實(shí)上,如果我們想要數(shù)字排列整齊,我們就應(yīng)該讓 4x3 乘 3x4。這是矩陣乘法里的一項(xiàng)基礎(chǔ)且重要的規(guī)則。仔細(xì)查看下圖中的第一個(gè)神經(jīng)元,該神經(jīng)元內(nèi)是每位顧客對(duì)「你有貓嗎?」這個(gè)問題的回復(fù)。以下是 4x3 layer0 矩陣的第一列:

[1]
[0]
[0]
[1]

現(xiàn)在注意,有四條線(突觸)將 l0 中「你有貓嗎?」這個(gè)神經(jīng)元與 l1 的四個(gè)神經(jīng)元連接起來。這意味著上述列 1,0,0,1 中的每個(gè)數(shù)字都要與四個(gè)不同權(quán)重相乘,因此得到 16 個(gè)值。l1 確實(shí)是一個(gè) 4x4 矩陣。

注意,現(xiàn)在我們要對(duì)第二個(gè)神經(jīng)元內(nèi)的四個(gè)數(shù)字執(zhí)行同樣的操作,也得到 16 個(gè)值。我們將這 16 個(gè)值中的每個(gè)值與剛才創(chuàng)建的值中的對(duì)應(yīng)值相加。

重復(fù)這個(gè)步驟,直到將第三個(gè)神經(jīng)元中的四個(gè)數(shù)字也處理完畢。這樣 4x4 l1 矩陣就有 16 個(gè)值,每個(gè)值是三次乘法所得值的對(duì)應(yīng)相加結(jié)果。

也就是說,3 個(gè)調(diào)查問題 x 4 位顧客 = 3 個(gè)神經(jīng)元 x 4 個(gè)突觸 = 3 個(gè)特征 x 4 個(gè)權(quán)重 = 3x4 矩陣。

看起來很復(fù)雜?習(xí)慣就好了。而且計(jì)算機(jī)會(huì)替你執(zhí)行乘法操作。我只是想幫助大家理解其下的底層操作。當(dāng)你看到下圖時(shí),這些線不會(huì)說謊。

 

 

也許你會(huì)疑惑,代碼行 47 中的「2」和「-1」是哪兒來的。np.random.random 函數(shù)生成均勻分布于 0 到 1 之間的隨機(jī)數(shù)(對(duì)應(yīng)的平均值為 0.5),而我們想讓隨機(jī)數(shù)初始值的平均值為 0。這樣該矩陣中的初始權(quán)重不會(huì)存在偏向于 1 或 0 的先驗(yàn)偏置(在最開始的時(shí)候,網(wǎng)絡(luò)不知道接下來會(huì)發(fā)生什么,因此它對(duì)其預(yù)測(cè)結(jié)果是沒有信心的,直到我們?cè)诿總(gè)迭代后更新它)。

那么,我們?nèi)绾螌⒁唤M平均值為 0.5 的數(shù)字轉(zhuǎn)變?yōu)槠骄禐?0 的數(shù)字呢?首先,將所有隨機(jī)數(shù)乘 2(這樣所有數(shù)字分布在 0 到 2 之間,平均值為 1),然后減去 1(這樣所有數(shù)字分布在-1 到 1 之間,平均值為 0)。這就是「2」和「-1」出現(xiàn)的原因。

接下來看下一行代碼:syn1 = 2np.random.random((4,1)) - 1 創(chuàng)建了一個(gè) 4x1 向量,并為它生成隨機(jī)數(shù)。這就是網(wǎng)絡(luò)第二層的權(quán)重 Synapse 1,它連接 l1 和 l2。

 

 

for loop 使網(wǎng)絡(luò)執(zhí)行 6 萬次迭代。每次迭代中,網(wǎng)絡(luò)使用顧客調(diào)查數(shù)據(jù) X 作為輸入,基于該數(shù)據(jù)得出對(duì)顧客購買新款貓砂概率的最佳預(yù)測(cè)。然后將預(yù)測(cè)與真值進(jìn)行對(duì)比,再從錯(cuò)誤中學(xué)習(xí),在下次迭代中做出更好的預(yù)測(cè)。該過程持續(xù) 6 萬次,直到網(wǎng)絡(luò)通過試錯(cuò)學(xué)會(huì)如何準(zhǔn)確預(yù)測(cè)。然后這個(gè)網(wǎng)絡(luò)可以使用任意輸入數(shù)據(jù),并準(zhǔn)確預(yù)測(cè)可能購買新款貓砂的顧客。

2.6 For Loop:行 52

for loop 使網(wǎng)絡(luò)執(zhí)行 6 萬次迭代。每次迭代中,網(wǎng)絡(luò)使用顧客調(diào)查數(shù)據(jù) X 作為輸入,基于該數(shù)據(jù)得出對(duì)顧客購買新款貓砂概率的最佳預(yù)測(cè)。然后將預(yù)測(cè)與真值進(jìn)行對(duì)比,再從錯(cuò)誤中學(xué)習(xí),在下次迭代中做出更好的預(yù)測(cè)。該過程持續(xù) 6 萬次,直到網(wǎng)絡(luò)通過試錯(cuò)學(xué)會(huì)如何準(zhǔn)確預(yù)測(cè)。然后這個(gè)網(wǎng)絡(luò)可以使用任意輸入數(shù)據(jù),并準(zhǔn)確預(yù)測(cè)可能購買新款貓砂的顧客。

3. 前饋:做出有根據(jù)的猜測(cè),60000 次迭代

網(wǎng)絡(luò)在這一步驟開始執(zhí)行預(yù)測(cè)。這是深度學(xué)習(xí)過程中最令人興奮的部分,所以我打算從三個(gè)不同角度介紹這個(gè)概念:

關(guān)于前饋的迷人童話

關(guān)于前饋的美麗畫作

為什么矩陣乘法是前饋的引擎

3.1 城堡和生命的意義:前饋網(wǎng)絡(luò)

想象你自己是一個(gè)神經(jīng)網(wǎng)絡(luò)。恰好你是一個(gè)有駕照的神經(jīng)網(wǎng)絡(luò),而且喜歡開快車和神秘的心靈之旅。你迫切想找到生命的意義。奇妙的是,你剛好發(fā)現(xiàn)只要驅(qū)車前往某個(gè)城堡,神秘先知將告訴你生命的意義。天啊!

不用說,你肯定特別想找到先知的城堡。先知就代表真值,也就是神秘問題「你買過新款貓砂嗎?」的答案。也就是說,如果你的預(yù)測(cè)與真值匹配,那么你就到達(dá)先知城堡,即 l2 誤差為 0、黃色箭頭的長度為 0、粉色乒乓球到達(dá)碗底。

不過,找到先知城堡需要一些耐心和堅(jiān)持,你需要嘗試數(shù)千次,迷路數(shù)千次。(小提示:數(shù)千次旅程 = 迭代,不斷迷路 = l2 預(yù)測(cè)存在誤差,誤差使得你離先知城堡 y 還有距離。)

但是也有好消息:你知道隨著時(shí)間的流逝,每一次旅程并不是沒有意義,你會(huì)越來越靠近先知(先知城堡 y 正在閃耀……)。而壞消息是每一次當(dāng)你無法到達(dá)城堡時(shí),第二天醒來你又回到了原點(diǎn)(即 Layer 0,輸入特征,3 個(gè)調(diào)查問題),必須從那里重新出發(fā)(新的迭代)。這個(gè)過程有點(diǎn)像下圖:

 

 

幸運(yùn)的是,這個(gè)故事有一個(gè)完美的結(jié)局,你不停嘗試、不斷修改路徑,在進(jìn)行了 58000 次試驗(yàn)后終于到達(dá)了目標(biāo)。這很值得。

我們來看一下從你的房子 X 到先知城堡 y 的其中一次旅程(迭代):每一次旅程都是代碼行 57-59 所執(zhí)行的前饋,每天你都到達(dá)一個(gè)新地方,但是它們都不是你的目的地。你當(dāng)然想知道如何在下一次旅程中更接近城堡,我會(huì)在這個(gè)故事的后續(xù)篇中解釋。

接下來,我們來看一個(gè)更簡單的示例。

3.2 關(guān)于前饋的美麗畫作

接下來我們來看 16 個(gè)權(quán)重中的其中一個(gè)。這個(gè)權(quán)重是 syn0,12 條線中最上方那條,連接 l0 和 l1 最上方的神經(jīng)元。出于簡潔性考慮,我們稱其為 syn0,1(syn0(1,1) 的簡化,表示矩陣 syn0 的行 1 列 1)。如下圖所示:

 

 

為什么表示 l2 和 l1 神經(jīng)元的圓圈被從中間分割開了?圓圈的左半邊(帶有 LH 字樣)是 sigmoid 函數(shù)的輸入值,右半邊是 sigmoid 函數(shù)的輸出:l1 或 l2。在這個(gè)語境下,sigmoid 函數(shù)只是將前一層與前一個(gè)突觸相乘,并轉(zhuǎn)換為 0 到 1 之間的值。代碼如下:

return 1/(1+np.exp(-x))

這里的前饋使用了我們的一個(gè)訓(xùn)練樣本,l0 的第 1 行,即「顧客 1 對(duì) 3 個(gè)調(diào)查問題的回復(fù)」:[1,0,1]。因此,我們首先將 l0 的第一個(gè)值與 syn0 的第一個(gè)值相乘。假設(shè) syn0 矩陣已經(jīng)過多次訓(xùn)練迭代(我們?cè)?2.4 節(jié)已經(jīng)進(jìn)行過初始化了),現(xiàn)在該矩陣如下所示:

syn0:

[ 3.66 -2.88 3.26 -1.53]
[-4.84 3.54 2.52 -2.55]
[ 0.16 -0.66 -2.82 1.87]

到這里,或許你會(huì)疑惑:為什么 syn0 的值與 2.4 節(jié)創(chuàng)建的 syn0 如此不同?好問題。前面介紹的很多矩陣有逼真的初始值,就好像它們剛被計(jì)算機(jī)通過隨機(jī)種子創(chuàng)建出來一樣。而這里和下面的矩陣并非初始值。它們是經(jīng)過多次訓(xùn)練迭代的,因此它們的值已經(jīng)在學(xué)習(xí)過程中經(jīng)過了更新和改變。

現(xiàn)在,我們用 l0 的第一個(gè)值 1 與 syn0 的第一個(gè)值 3.66 相乘,看看會(huì)得到什么:

 

 

下面是前饋的偽代碼,你可以借助上圖(從左至右的順序)幫助理解。

 

 

下面,我們?cè)購牧硪粋(gè)角度看前饋過程的底層數(shù)學(xué)原理。

3.3 前饋的數(shù)學(xué)原理

l0 x syn0 = l1LH,在這個(gè)示例中即 1 x 3.66 = 3.66,不要忘記還要加上另外兩個(gè) l0 值和 syn0 對(duì)應(yīng)權(quán)重的乘積。在該示例中,l0,2 x syn0,2= 0 x something = 0,l0,3 x syn0,3 中 l0,3=1,從上一節(jié)中我們知道 syn0,3 = 0.16,因此 l0,3 x syn0,3 = 1 x 0.16 = 0.16。因此 l0,1 x syn0,1 + l0,3 x syn0,3 = 3.66 + 0.16 = 3.82,即 l1_LH = 3.82。

接下來,我們將 l1_LH 輸入 nonlin() 函數(shù),將該數(shù)字轉(zhuǎn)換為 0 到 1 之間的概率。Nonlin(l1_LH) 使用代碼 return 1/(1+np.exp(-x)),因此該示例中,1/(1+(2.718^-3.82))=0.98,l1 = 0.98。

那么,在公式 1/(1+np.exp(-x)) = [1/(1+2.718^-3.82))] = 0.98 中發(fā)生了什么呢?計(jì)算機(jī)使用代碼 return 1/(1+np.exp(-x)) 代替了我們的人工計(jì)算,我們可以通過下圖看到在 sigmoid 曲線上 x = 3.82 所對(duì)應(yīng)的 y 值:

 

 

圖源:https://iamtrask.github.io/2015/07/12/basic-python-network/

注意,X 軸上 3.82 在藍(lán)色曲線上對(duì)應(yīng)點(diǎn)的對(duì)應(yīng) y 值是 0.98,而代碼將 3.82 轉(zhuǎn)換為 0 到 1 之間的概率。上圖有助于大家了解該計(jì)算并不神秘,也不抽象,計(jì)算機(jī)只不過做了和我們一樣的事:它使用數(shù)學(xué)查看上圖中 X 軸上 3.82 對(duì)應(yīng)的 y 值,僅此而已。

同理,我們重復(fù)以上步驟,計(jì)算出 l2_LH 和 l2 的值。至此,我們就完成了第一次前饋。

現(xiàn)在,為了簡潔起見,我們把所有變量放在一起,如下所示:

l0=1
syn0,1=3.66
l1_LH=3.82
l1=0.98
syn1,1=12.21
l2_LH=0
l2=~0.5
y=1 (this is a "Yes" answer to survey Question 4, "Actually bought Litter Rip?")
l2_error = y-l2 = 1-0.5 = 0.5

現(xiàn)在,我們來看讓這一切實(shí)現(xiàn)的矩陣乘法(對(duì)矩陣乘法和線性代數(shù)陌生的朋友,可以先學(xué)習(xí) Grant Sanderson 的課程:https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab)。

首先,在代碼行 58,我們將 4x3 l0 和 3x4 Syn0 相乘,創(chuàng)建(隱藏層)l1,它是一個(gè) 4x4 矩陣:

 

 

在第 58 行代碼中,我們將 l1 輸入 nonlin() 函數(shù),得到一個(gè) 0 到 1 之間的概率值:

1/(1 + 2.781281^-x)
This creates layer 1, the hidden layer of our neural network:

l1:

[0.98 0.03 0.61 0.58]
[0.01 0.95 0.43 0.34]
[0.54 0.34 0.06 0.87]
[0.27 0.50 0.95 0.10]

看不懂也沒關(guān)系,我們來看一個(gè)簡單的訓(xùn)練示例。第一行(顧客 1 的調(diào)查數(shù)據(jù))[1,0,1] 是一個(gè) 1x3 矩陣。我們將其乘以 syn0(3x4 矩陣),得到的 l1 是 1x4 矩陣。過程如下所示:

 

 

注意,在代碼第 58 行 l1=nonlin(np.dot(l0,syn0)),我們將 l1 輸入 sigmoid 函數(shù),因?yàn)槲覀冃枰粋(gè) 0 到 1 的數(shù)值。

從這行代碼中,我們可以看到 sigmoid 函數(shù)的第一大優(yōu)勢(shì)。當(dāng)我們將 l0 和 syn0 的點(diǎn)乘矩陣輸入到 nonlin() 函數(shù)時(shí),sigmoid 函數(shù)將矩陣中的每個(gè)值轉(zhuǎn)換成 0 到 1 之間的概率。

3.4 核心重點(diǎn):隱藏層中的推斷問題

我們?yōu)槭裁匆P(guān)心統(tǒng)計(jì)概率呢?我認(rèn)為原因在于,統(tǒng)計(jì)概率是讓一堆沉默矩陣煥發(fā)生機(jī)并像小孩一樣學(xué)習(xí)的主要因素!

在第一層中,當(dāng)我們將 l0 乘以 syn0 時(shí),為什么要嘗試給 syn0 的權(quán)重賦不同的值呢?因?yàn)槲覀兿雵L試不同的特征問題組合,發(fā)現(xiàn)對(duì)預(yù)測(cè)結(jié)果幫助最大的問題組合。上文舉過一些拙劣的例子,推斷出有貓且喝進(jìn)口啤酒的人更有可能購買新款貓砂,從而利用權(quán)重強(qiáng)化這兩個(gè)特征組合。

另一個(gè)例子:如果一些顧客沒有養(yǎng)貓,但他們喝進(jìn)口啤酒且訪問過 Litter Rip.com (http://rip.com/) 網(wǎng)站,我們可以推斷出這些顧客熱衷技術(shù):他們喝進(jìn)口啤酒因?yàn)樗麄冃蕾p其供應(yīng)鏈物流,他們?cè)L問網(wǎng)站,各種各樣的網(wǎng)站,說明他們很顯然熱衷技術(shù)。因此我們可以推斷出,這些顧客可能會(huì)出于對(duì)這款貓砂先進(jìn)技術(shù)的欣賞而購買它,盡管他們可能實(shí)際上并沒有養(yǎng)貓。所以我們或許需要調(diào)整 syn0 的權(quán)重,強(qiáng)化這些特征之間的連接。

現(xiàn)在你明白了嗎?當(dāng)我們將調(diào)查問題的回復(fù) l0 與 syn0 中的權(quán)重(每個(gè)權(quán)重表示我們對(duì)一個(gè)推斷問題對(duì)預(yù)測(cè)結(jié)果的重要程度的最佳猜測(cè))相乘時(shí),我們是在嘗試不同的答案組合,以查看哪些組合對(duì)預(yù)測(cè)結(jié)果最有幫助。很明顯,在 6 萬次迭代中,訪問過貓砂網(wǎng)站的貓主人更有可能購買這款貓砂,因此在迭代的過程中它們對(duì)應(yīng)的權(quán)重會(huì)增加,即其統(tǒng)計(jì)概率更接近 1 而不是 0。而喝進(jìn)口啤酒卻沒有貓的人購買這款貓砂的可能性較低,因此對(duì)應(yīng)的權(quán)重較小,即其統(tǒng)計(jì)概率更接近 0 而不是 1。是不是很奇妙?這就像數(shù)字譜寫的詩歌,這些是會(huì)推理和思考的矩陣!

這也是我為什么大費(fèi)周章介紹這個(gè)的原因。你是否經(jīng)歷過,一些傲慢的軟件工程師或制造恐慌的記者告訴你,神經(jīng)網(wǎng)絡(luò)隱藏層是潘多拉的魔盒?而事實(shí)上它的底層并沒有什么「神奇魔法」。這些數(shù)學(xué)知識(shí)清晰、優(yōu)雅而美麗。你可以掌握它,只要有耐心肯堅(jiān)持。

接下來我們繼續(xù)看矩陣乘法。

3.5 用神經(jīng)元和突觸的形式可視化矩陣乘法

我們用神經(jīng)元和突觸的形式可視化 l0 和 syn0,如下圖所示:

 

 

上圖展示了輸入 l0 的行 1 如何完成在網(wǎng)絡(luò)中的第一步。第一行代表顧客 1 對(duì)三個(gè)調(diào)查問題的答案。這三個(gè)數(shù)字需要乘以 syn0 的 12 個(gè)值,然后網(wǎng)絡(luò)還要對(duì)其他三位顧客的答案進(jìn)行同樣的處理,那么如何清晰地展現(xiàn)這些數(shù)字并進(jìn)行計(jì)算呢?

這里的關(guān)鍵在于,將四位顧客看作一個(gè)「batch」(批次),他們?cè)谄渲卸询B在一起,即一共 4 個(gè) stack。那么,最上面的那個(gè) stack 就是第一行(顧客 1),依此類推。如上圖所示,你將第一行的三個(gè)數(shù)字和 syn0 的 12 個(gè)值相乘,再相加,最后得到 l1 最上面 stack 的四個(gè)值。

接著是 batch 中的第二個(gè) stack——顧客 2 的回答是 0,1,1。將這三個(gè)數(shù)字和 syn0 的 12 個(gè)值相乘,再相加,最后得到 l1 第二個(gè) stack 的四個(gè)值。

依此類推。其核心在于一次計(jì)算一個(gè) stack,這樣不管 batch 中有多少個(gè) stack,四個(gè)還是四百萬個(gè),你都可以很好地處理。你可能會(huì)說每個(gè)特征都有一個(gè) batch,在貓砂這個(gè)示例中,每個(gè)調(diào)查問題(特征)的 batch 為 4,因?yàn)橹挥兴奈活櫩偷拇鸢。但它也可能是四百萬!竑ull batch configuration」的概念是非常常見的模型,接下來我將解釋這一點(diǎn)。

其實(shí)認(rèn)為給定特征具備一個(gè) batch 的值是最容易理解的。當(dāng)你看到一個(gè)特征時(shí),你知道它底下有一個(gè) batch 的值。

 

 

就像代碼行 59 所示,我們把 4x4 l1 和 4x1 syn1 相乘,然后輸入 sigmoid 函數(shù)得出 4x1 l2,其每個(gè)值都是 0 到 1 的統(tǒng)計(jì)概率。

l1 (4x4):
[0.98 0.03 0.61 0.58] [ 12.21]
[0.01 0.95 0.43 0.34] X [ 10.24] =
[0.54 0.34 0.06 0.87] [ -6.31]
[0.27 0.50 0.95 0.10] [-14.52]

Then pass the above 4x1 product through "nonlin()" and you get l2, our prediction:
l2:
[ 0.50]
[ 0.90]
[ 0.05]
[ 0.70]

 

那么這四個(gè)預(yù)測(cè)結(jié)果告訴我們什么呢?預(yù)測(cè)值距離 1 越近,則該顧客購買這款貓砂的可能性越高;預(yù)測(cè)值距離 0 越近,則該顧客購買這款貓砂的可能性越低。

現(xiàn)在我們完成了前饋部分。接下來我們將看 6 萬次迭代過程中如何調(diào)整網(wǎng)絡(luò)權(quán)重,使預(yù)測(cè)結(jié)果越來越好。

4. 從試錯(cuò)中學(xué)習(xí):梯度下降

4.1 梯度下降概覽

梯度下降的目的是什么?是為了更好地調(diào)整網(wǎng)絡(luò)權(quán)重,從而在下次迭代中獲得更好的預(yù)測(cè)結(jié)果。也就是說,網(wǎng)絡(luò)的突觸矩陣中的某些值要被增減。為了調(diào)整這些值,我們必須回答以下兩個(gè)重要問題:

我應(yīng)該按什么方向調(diào)整數(shù)字?應(yīng)該增加還是減少數(shù)值?正方向還是負(fù)方向?……

數(shù)值應(yīng)該增減多少?

下面我們將詳細(xì)解釋這兩個(gè)基礎(chǔ)問題。還記得上文的紅色碗嗎?「梯度」就是「坡度」,「梯度下降」即計(jì)算出使小球從碗表面上的某個(gè)點(diǎn)盡快下降到碗底的最優(yōu)坡度。

梯度下降的第一步即,計(jì)算當(dāng)前的預(yù)測(cè)結(jié)果與真值 y(1/yes 或 0/no)之間的差距。

4.2 預(yù)測(cè)結(jié)果與調(diào)查問題 4 的答案相比有多大差距?

代碼行 66:

l2_error = y - l2

第一次預(yù)測(cè)結(jié)果距離目標(biāo)值「Yes/1」(顧客 1 對(duì)第四個(gè)調(diào)查問題的回答真值是「購買過」)有多遠(yuǎn)距離呢?我們需要將 l2 預(yù)測(cè)值與 y 值(1)進(jìn)行對(duì)比,即 y 值減去 l2 得到的就是 l2_error——「預(yù)測(cè)值距離目標(biāo)值 y 的距離」。

因此,我們可以想象這幅圖景:網(wǎng)絡(luò)使用每位顧客的回復(fù)作為輸入,并操作這些數(shù)據(jù),以得到顧客是否購買貓砂的預(yù)測(cè)結(jié)果。

我們有四位顧客,網(wǎng)絡(luò)就做了四次預(yù)測(cè)。因此 l2_error 是四次誤差的向量(每個(gè)誤差針對(duì)一次預(yù)測(cè))。接下來我們將打印出該誤差:

打印誤差:行 72-73

72 if (j% 10000)==0:
73 print("Avg l2_error after 10,000 more iterations: "+str(np.mean(np.abs(l2_error))))

行 72 使計(jì)算機(jī)每隔一萬次迭代打印一次 l2_error。這有助于我們每隔一萬次查看網(wǎng)絡(luò)的學(xué)習(xí)效果和進(jìn)展。if (j% 10000)==0: 表示「如果你的迭代器所處的迭代次數(shù)除以 10000 后沒有余數(shù),則……」。j%10000 共有六次沒有余數(shù)的情況:迭代數(shù)為 10000、20000、30000、40000、50000、60000 時(shí)。該打印輸出會(huì)幫助我們很好地了解網(wǎng)絡(luò)的學(xué)習(xí)進(jìn)展。

代碼 + str(np.mean(np.abs(l2_error)))) 取誤差的絕對(duì)值,然后求平均數(shù)并打印出來,從而簡化了打印過程。

現(xiàn)在我們已經(jīng)知道預(yù)測(cè)結(jié)果(l2)距離真值(y)的距離,并打印了出來。但是,我們和城堡的距離實(shí)在太遠(yuǎn),我們要如何降低目前令人失望的預(yù)測(cè)誤差 0.5,最終到達(dá)目的地呢?

一步步來。接下來,我們將了解調(diào)整網(wǎng)絡(luò)的哪一部分才能改進(jìn)下一次預(yù)測(cè)的結(jié)果,之后會(huì)討論如何調(diào)整網(wǎng)絡(luò)。

4.3 我們需要調(diào)整網(wǎng)絡(luò)的哪一部分?

先看下圖,神經(jīng)網(wǎng)絡(luò)真正用來學(xué)習(xí)和記憶的核心部分是突觸,而不是神經(jīng)元。我們的網(wǎng)絡(luò)中有 16 個(gè)變量:3x4 矩陣 syn0 中的 12 個(gè)變量和 4x1 向量 syn1 中的 4 個(gè)變量。查看下圖,你會(huì)發(fā)現(xiàn)每一條線(「邊」或「突觸」)表示一個(gè)變量,它包含一個(gè)數(shù)值,這就是權(quán)重。

 

 

我們可以控制這 16 個(gè)權(quán)重。

輸入 l0 是固定的,不能改變。l1 由 syn0 中的權(quán)重決定(l1 = syn0 x l0),l2 由 syn1 中的權(quán)重決定(l2 = syn1 x l1)。上圖中的 16 條線(突觸、權(quán)重)是神經(jīng)網(wǎng)絡(luò)達(dá)到目標(biāo)過程中唯一能夠調(diào)整的數(shù)字。

現(xiàn)在我們知道了預(yù)測(cè)值與真值的距離,知道了 l2_error。那么我們?nèi)绾卫眠@些數(shù)值調(diào)整兩個(gè)矩陣中的 16 個(gè)權(quán)重呢?這個(gè)答案就是 AI 最神奇的屬性之一:這是一個(gè)統(tǒng)計(jì)學(xué)和概率概念,叫做置信度。

4.4 置信度:使冷冰冰的數(shù)字像人類一樣思考

代碼行 88:

l2_delta = l2_error*nonlin(l2,deriv=True)

「置信度」這個(gè)術(shù)語可能比較抽象,但是它實(shí)際上就是我們每天都在用的東西。我用一個(gè)有趣的故事來提醒你:

先知城堡 2:你必須明白你其實(shí)一直在使用置信度!

在先知城堡的故事中,你執(zhí)行前饋,驅(qū)使 l2 向最佳預(yù)測(cè) y(城堡)前進(jìn),但是當(dāng)你到達(dá) l2 后卻發(fā)現(xiàn)你雖然距離城堡更近了,卻仍未到達(dá)。第二天早上你發(fā)現(xiàn)自己在家中醒來(回到 l0),然后開始再一次的旅程(新的迭代)。

你該如何改進(jìn)駕駛方向,才能做有用功呢?

首先,在你今天的旅程結(jié)束時(shí),你急切地詢問當(dāng)?shù)氐尿T士這個(gè)地方距離城堡還有多遠(yuǎn),騎士告訴你答案(即 l2_error)。每天的旅程結(jié)束時(shí),你都要計(jì)算如何改變權(quán)重才能使明天的 l2 預(yù)測(cè)比今天更好,并最終使你抵達(dá)城堡。這就是 l2_delta(參見下圖),即要想使明天的 l2 抵達(dá)城堡,今天你需要對(duì)權(quán)重做出的改變。

重點(diǎn)來了:

注意 l2_delta 與 l2_error 不同,l2_error 僅告訴你與城堡的距離,而 l2_delta 則影響你對(duì)方向的信心。你在衡量信心。這些置信度數(shù)字就是導(dǎo)數(shù)(不過,這里暫且忘記微積分吧,我們暫時(shí)使用這個(gè)詞「坡度」),即 l2 每個(gè)值的坡度。這些坡度就是你對(duì)今天旅程中每一次轉(zhuǎn)向的自信程度。有些方向你非常確定且自信,而有些則不然。

使用置信度這一概念來計(jì)算明天能到哪里似乎有點(diǎn)抽象?實(shí)際上,你每時(shí)每刻都在使用置信度導(dǎo)航,只不過你沒意識(shí)到而已。接下來我們就讓你「恢復(fù)」這一意識(shí)。

回憶一下你的迷路經(jīng)歷。一開始,你按照自己以為正確的道路前進(jìn),你非常自信。但是慢慢地你發(fā)現(xiàn)旅途似乎比預(yù)期更加漫長,你開始懷疑是否忘記拐彎。你沒最初那么自信了。隨著時(shí)間的流逝,你原本應(yīng)該已經(jīng)到達(dá)目的地了,然而你還在路上,此時(shí)你更加確定錯(cuò)過了一次拐彎。這時(shí)候你的自信度很低。你知道自己沒有到達(dá)目的地,但你不確定如何從現(xiàn)在的位置到達(dá)目的地。于是你決定停下來問路,但是被問路的女士告訴你的拐彎和路標(biāo)太多,你沒記全,你沿著她指的方向走到一半又不知道怎么走了。這時(shí)你會(huì)再次問路,不過這一次你離目的地更近,前進(jìn)的方向也更加簡單,你沿著方向前進(jìn)最終抵達(dá)目的地。

在這段講述中,你需要注意以下幾件事:

首先,你通過試錯(cuò)進(jìn)行學(xué)習(xí),你的信心在不停變化。稍后我會(huì)解釋為什么置信度使得網(wǎng)絡(luò)試錯(cuò)學(xué)習(xí),以及 sigmoid 函數(shù)如何提供重要的置信度。

其次,注意你的旅程分為兩部分:第一部分從你啟程到第一次問路(l1),第二部分是從第一次問路到 l2(你以為已經(jīng)到達(dá)目的地了)。但是后來你意識(shí)到這里并不是終點(diǎn),不得不詢問離真正的終點(diǎn)還有多遠(yuǎn)。

你看到置信度在旅程中的角色了嗎?一開始,你確定自己走在正確的路上,然后你懷疑自己少拐了個(gè)彎,之后你確定自己少拐了個(gè)彎,決定停下來問路。圖中這兩個(gè)分割的部分就像狗腿一樣彎,但隨著每日旅程的改進(jìn),狗腿將一點(diǎn)點(diǎn)變直。

這和你前往城堡的過程一樣:

 

 

每天,你(3 層神經(jīng)網(wǎng)絡(luò))沿著一組方向(syn0)前往城堡。結(jié)束時(shí)你發(fā)現(xiàn)自己停在了 l1,就詢問接下來的方向(syn1)。這些方向使得你到達(dá)當(dāng)天的終點(diǎn)(預(yù)測(cè)結(jié)果),你以為那里就是目的地城堡。但事實(shí)上你面前并沒有城堡。于是你詢問騎士:「我離城堡還有多遠(yuǎn)?」(l2_error 的值是多少?)你是一個(gè)天才,于是你將 l2_error 與你對(duì)每一次轉(zhuǎn)向的置信度(l2 的坡度)相乘,得出了明天可以到達(dá)的地方(l2_delta)。

注意:這個(gè)比喻有一點(diǎn)不恰當(dāng),即當(dāng)你停在 l1 問路時(shí),女士告訴你新的方向。而事實(shí)上,你的方向(syn1 值)是你準(zhǔn)備更新上一次迭代時(shí)就已經(jīng)選擇好的。因此準(zhǔn)確來說,那位女士并沒有和你說話,只是舉起了你昨天在那里消失之前給她的路牌,因?yàn)槟阒澜裉鞎?huì)再次路過她身旁。

在繼續(xù)之前,你需要厘清 3 項(xiàng)事實(shí):

你到達(dá)的地方,即當(dāng)前位置(l2);
你距離城堡的距離 (l2_error);

要想提高對(duì)明天旅程更接近城堡的信心,你需要做出的方向改變 (l2_delta)。

了解這三項(xiàng)事實(shí)后,你可以計(jì)算前進(jìn)方向(即突觸權(quán)重)需要做的改變。接下來,我們來看如何使用 sigmoid 函數(shù)獲得置信度,并利用置信度計(jì)算 l2_delta。

4.5 如何利用 Sigmoid 函數(shù)的曲線特征得出置信度

sigmoid 函數(shù)的四步魔鬼操作將讓你見識(shí)到她的魅力。對(duì)我而言,神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能力很大程度上基于這四步操作。

2.5 節(jié)解釋了 nonlin() 函數(shù)可以將 l2_LH 的值轉(zhuǎn)換成統(tǒng)計(jì)概率(l2),這是 sigmoid 函數(shù)四大優(yōu)勢(shì)中的第一點(diǎn)。

而 sigmoid 函數(shù)的第二部分 nonlin(l2,deriv=True) 可以將 l2 中的 4 個(gè)值轉(zhuǎn)換成置信度。這就是 sigmoid 函數(shù)的第二大優(yōu)勢(shì)。如果網(wǎng)絡(luò)每個(gè)預(yù)測(cè)(l2 中的 4 個(gè)值)都具備高準(zhǔn)確率、高置信度,則這是一次不錯(cuò)的預(yù)測(cè)。我們不會(huì)改變帶來如此優(yōu)秀預(yù)測(cè)結(jié)果的 syn0、syn1 權(quán)重,只想改變那些不 work 的權(quán)重。接下來,我將介紹 nonlin(l2,deriv=True) 如何告訴我們哪些權(quán)重需要格外注意。

置信度幫助我們首先確定哪些權(quán)重需要改變。如果 nonlin(l2) 生成的置信度為 0.999,則該網(wǎng)絡(luò)「很確定該顧客購買了這款貓砂」,而置信度 0.001 則等同于「我很確定該顧客沒有購買這款貓砂」。但是處于中間的數(shù)字怎么辦呢?低置信度數(shù)字通常在 0.5 左右。例如,置信度 0.6 意思是「該顧客可能會(huì)買這款貓砂,不過我不確定!怪眯哦 0.5 表示「兩條路都可行,而我站在中間猶豫不決……」

也因此我們需要關(guān)注中間的數(shù)字:0.5 周圍的數(shù)字都不堅(jiān)決,都缺乏信心。那么,我們應(yīng)該如何改變網(wǎng)絡(luò)才能使 l2 的四個(gè)值都具備高準(zhǔn)確率和高置信度呢?

關(guān)鍵在于權(quán)重。上文已經(jīng)提到,syn0 和 syn1 是神經(jīng)網(wǎng)絡(luò)的絕對(duì)核心。我們將對(duì) l2_error 的四個(gè)值執(zhí)行數(shù)學(xué)計(jì)算,得到 l2_delta。l2_delta 即「要使網(wǎng)絡(luò)輸出 (l2) 更接近 y(真值),我們想看到的 l2 改變!挂簿褪钦f,l2_delta 即你想在下次迭代中看到的 l2 變化。

這就是 Sigmoid 函數(shù)四大優(yōu)勢(shì)的第三點(diǎn):l2 的四個(gè)概率值都是位于 sigmoid 函數(shù) S 曲線圖上的某個(gè)點(diǎn)(見下圖)。例如,l2 的第一個(gè)值為 0.9,我們?cè)谙聢D中找 0.9 所對(duì)應(yīng)的 Y 軸位置,會(huì)發(fā)現(xiàn)它對(duì)應(yīng)下圖中的綠色點(diǎn):

 

 

圖源:https://iamtrask.github.io/2015/07/12/basic-python-network/

除了綠色點(diǎn),你注意到穿過該點(diǎn)的綠色線嗎?這條線表示該點(diǎn)的坡度(正切值)。計(jì)算一個(gè)點(diǎn)的坡度不需要你懂微積分,計(jì)算機(jī)會(huì)幫你做這些。但是你需要注意,S 曲線上上限(接近 1)和下限(接近 0)的位置的坡度很淺。sigmoid 函數(shù)曲線上的淺坡度正好對(duì)應(yīng)預(yù)測(cè)結(jié)果的高置信度!

你還需要了解 S 曲線上的淺坡度意味著坡度值較小,這是一個(gè)好消息!

因?yàn),?dāng)我們更新突觸(權(quán)重)時(shí),我們并不想改變能帶來高置信度、高準(zhǔn)確率的權(quán)重,它們已經(jīng)足夠好了。所以我們只想對(duì)其引入微小的改變。事實(shí)上,這些權(quán)重的改變(l2_delta)是由原數(shù)值乘以特別小的數(shù)字(坡度)來進(jìn)行的,這恰好符合我們的期望。

這就是 Sigmoid 函數(shù)四大優(yōu)勢(shì)中的最后一項(xiàng)。

高置信度對(duì)應(yīng) S 曲線上的淺坡度,淺坡度對(duì)應(yīng)一個(gè)很小的數(shù)字。從而使得 syn0 和 syn1 的值乘以這些小數(shù)字后能夠滿足我們的期望,即突觸中有用的權(quán)重值基本上變化不大,這樣就能夠保持 l2 的置信度和準(zhǔn)確率。

同理,低準(zhǔn)確率的 l2 值(對(duì)應(yīng) S 曲線的中間點(diǎn))即是 S 曲線上坡度最大的數(shù)字。即上圖 Y 軸 0.5 左右的值對(duì)應(yīng) S 曲線的中間點(diǎn),這里坡度最陡,因而坡度值也最大。這些大數(shù)值意味著當(dāng)我們將它們與 l2 中的低準(zhǔn)確率值相乘時(shí),這些值會(huì)發(fā)生很大改變。

具體來講,我們應(yīng)該如何計(jì)算 l2_delta 呢?

我們已經(jīng)找到了 l2_error,即第一次預(yù)測(cè) l2 與目標(biāo)值 y 的距離。而我們尤其關(guān)心「大誤差」(Big Miss)。

在代碼行 88 中,我們要做的第一件事就是使用 sigmoid 函數(shù)的第二部分 nonlin(l2,deriv=True) 找出 l2 預(yù)測(cè)中 4 個(gè)值各自的坡度。坡度將告訴我們哪些預(yù)測(cè)可信度高,哪些比較牽強(qiáng)。這就是我們找出并修復(fù)神經(jīng)網(wǎng)絡(luò)中最弱環(huán)節(jié)(低置信度預(yù)測(cè))的方式。接下來,將這 4 個(gè)坡度(置信度)與 l2_error 中的四個(gè)誤差值相乘,得到的就是 l2_delta。

這一步非常重要。你注意到我們將大誤差與低準(zhǔn)確率、高坡度值的 l2 預(yù)測(cè)相乘嗎?這是最重要的部分,稍后我將給大家解釋。

現(xiàn)在,我們先看這部分的可視化展示,如下所示:

y: l2: l2_error:
[1] [0.50] [ 0.50]
[1] _ [0.90] = [ 0.10]
[0] [0.05] [-0.05]
[0] [0.70] [-0.70]

下面的公式是理解神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)原理的重點(diǎn):

l2 slopes after nonlin(): l2_error: l2_delta:
[0.25] Not Confident [ 0.50] Big Miss [ 0.125] Big change
[0.09] Fairly Confident X [ 0.10] Small Miss = [ 0.009] Small-ish Change
[0.05] Confident [-0.05] Tiny miss [-0.003] Tiny change
[0.21] Not Confident [-0.70] Very Big Miss [-0.150] Huge Change

 

注意,大誤差即 l2_error 中值較大的數(shù)字,而低準(zhǔn)確率的 l2 值的坡度也最陡,即它們?cè)?nonlin(l2,deriv=True) 中的數(shù)字最大。因此,當(dāng)我們用大誤差乘以低準(zhǔn)確率 l2 值時(shí),就是大數(shù)字與大數(shù)字相乘,因此也將得到 l2_delta 向量中最大的數(shù)字。

l2_delta 即「下一次迭代中我們希望看到的 l2 改變」。較大的 l2_delta 值意味著下一次迭代中 l2 預(yù)測(cè)會(huì)有很大的改變,而這正是通過大幅改變對(duì)應(yīng)的 syn1 和 syn0 值來實(shí)現(xiàn)的。將這些大數(shù)值與 syn1 中已有的值相加,得到的更新權(quán)重將在下一次迭代中帶來更好的 l2 預(yù)測(cè)結(jié)果。

為什么要使用 l2 的坡度呢?

此舉的目的是為了更快地修復(fù) 16 個(gè)權(quán)重中最不合適的那些。上文我們提到 sigmoid 函數(shù)的 S 曲線圖時(shí)說過,l2 坡度與置信度相關(guān)。也就是說,大坡度值等于低置信度,最小坡度值等于最高置信度。因此,將小數(shù)字與 l2_error 中的對(duì)應(yīng)值相乘不會(huì)給 l2_delta 帶來大的變化,而我們也恰好不想改變那些權(quán)重,它們已經(jīng)做得很好了。

但是置信度最低的 l2 預(yù)測(cè)具備最陡的坡度,坡度值也最大。當(dāng)我們將這個(gè)大數(shù)字乘以 l2_error 時(shí),l2_delta 的數(shù)字也會(huì)很大。之后當(dāng)我們更新 syn1 時(shí),大的乘數(shù)意味著大的積、大的改變或調(diào)整。正該如此,因?yàn)槲覀兿胱畲蟪潭鹊馗淖冎眯哦茸畹偷臋?quán)重,這也是調(diào)整權(quán)重大小時(shí)使我們獲得最大收益的地方?傊琹2 坡度指示了每個(gè) l2 預(yù)測(cè)值的置信度,從而允許我們決定哪些數(shù)字最需要調(diào)整,以及如何最快地調(diào)整它們。

但是精彩的部分還未結(jié)束,回到關(guān)于推斷問題這一重點(diǎn)上。

在 3.4 節(jié)我們討論了,改變 syn0 的權(quán)重類似于改變對(duì)預(yù)測(cè)最有用的推斷問題。例如,訪問過貓砂網(wǎng)站的養(yǎng)貓人更有可能購買這款貓砂,而喝進(jìn)口啤酒但不養(yǎng)貓的人購買貓砂的幾率相對(duì)較低。這就是 l2_delta 的用武之地。l2_delta 增加最有用推斷問題的重要性(權(quán)重),降低不那么有用推斷問題的重要性。接下來,我們將了解如何確定隱藏層 1 中每個(gè)推斷問題的效用。

不過,首先我們先確定自己是否完全了解 l2 置信度如何修改 syn1 中的權(quán)重。sigmoid 函數(shù)隨機(jī)選取矩陣中的任一數(shù)字,

將它轉(zhuǎn)換為統(tǒng)計(jì)概率;
將概率轉(zhuǎn)換為置信度;
對(duì)突觸進(jìn)行或大或小的調(diào)整;
該調(diào)整(幾乎)總是朝著提升置信度和準(zhǔn)確率的方向,從而降低 l2_error。

sigmoid 函數(shù)是一個(gè)奇跡,它讓矩陣中的數(shù)字可以根據(jù)置信度進(jìn)行學(xué)習(xí),數(shù)學(xué)多么神秘!

接下來,我們來看置信度如何告訴我們要對(duì) syn0 做怎樣的改變才能實(shí)現(xiàn)更加準(zhǔn)確的層 1,然后實(shí)現(xiàn)更加準(zhǔn)確的層 2。

4.6 將「大誤差/小誤差」置信度應(yīng)用于層 1

代碼行 100:

l1_error = = l2_delta.dot(syn1.T)

城堡的故事非常有用:在那幅圖中,我們可以看到 l2_error 代表 l2 預(yù)測(cè)與城堡的距離,也可以了解到 l2_delta 是目前的預(yù)測(cè)與下一次迭代中預(yù)測(cè)結(jié)果之間的距離。剛剛介紹的「學(xué)習(xí)大誤差/小誤差」的方法可以幫助我們理解,如何調(diào)整當(dāng)前的 syn1(見代碼行 115)。

現(xiàn)在你已經(jīng)準(zhǔn)備好用來更新 syn1 的 l2_delta 了,那么為什么不也更新一下 syn0 呢?

怎么做?回到 4.2 節(jié),我們找到了 l2_error,知道 l2,也知道我們要追尋的「完美 l2」——y。但是,在 l1_error 這里,情況變了,我們不知道「完美 l1」是什么。

如何找到「完美 l1」呢?讓我們?cè)俅位氐酵茢鄦栴}。

回到 3.4 和 4.5 節(jié),關(guān)于推斷問題(特征)的概念,以及特征問題組合。當(dāng)我們改變 syn1 中的權(quán)重時(shí),我們真正在做的其實(shí)是用我們想賦予該問題或問題組合的重要性進(jìn)行試驗(yàn)。對(duì)于 syn0 也是一樣,我們想找出能夠幫助確定 l1_error 的數(shù)學(xué)方法,因?yàn)?l1_error 將告訴我們哪些問題的優(yōu)先級(jí)被錯(cuò)誤分配了或者哪些問題被錯(cuò)誤地組合在了一起。當(dāng)我們接著計(jì)算 l1_delta 時(shí),l1_delta 將告訴我們下一次迭代中更好的問題優(yōu)先級(jí)和問題組合。

例如,syn0 最初的權(quán)重提示推斷問題「這個(gè)人富有嗎?」是重要的問題。然而,隨著訓(xùn)練的開展,網(wǎng)絡(luò)意識(shí)到貓砂并非奢侈品,是否富有并不重要,因此網(wǎng)絡(luò)決定調(diào)整 syn0 的值,以降低推斷問題「這個(gè)人富有嗎」的重要性。如何降低呢?將 syn0 中該問題的對(duì)應(yīng)值乘以較大的 l1_delta 值,不過該值前面帶有一個(gè)負(fù)號(hào)。然后網(wǎng)絡(luò)將更新新的推斷問題「這個(gè)人對(duì)貓屎過敏嗎?」。更新方法是將該問題對(duì)應(yīng)的 syn0 值乘以較大的 l1_delta 值(正值)。

這兩個(gè)推斷問題的優(yōu)先級(jí)不斷變化。但是另一個(gè)推斷問題「這個(gè)人知道如何網(wǎng)絡(luò)購物嗎」一直都很重要,因?yàn)槟繕?biāo)受眾是喜歡在線購物的人。因此網(wǎng)絡(luò)將該問題對(duì)應(yīng)的 syn0 值乘以較小的 l1_delta 值。這樣,其優(yōu)先級(jí)就會(huì)保持不變。

另一個(gè)謎題是你需要多少推斷問題?在這個(gè)網(wǎng)絡(luò)中,我們一次只能容納四個(gè)推斷問題。這是由 syn0 的大小決定的。如果你沒有足夠的推斷問題,那網(wǎng)絡(luò)可能就無法做出準(zhǔn)確的預(yù)測(cè)。而問題太多則會(huì)浪費(fèi)過多精力。

現(xiàn)在,我們知道改變 syn0 的值會(huì)改變某個(gè)推斷問題對(duì)于 l1 的貢獻(xiàn),進(jìn)而影響 l1 對(duì) l2 準(zhǔn)確預(yù)測(cè)的貢獻(xiàn)程度。syn1 使用特征問題組合,并進(jìn)一步優(yōu)化從而取得更加準(zhǔn)確的 l2。

我在這個(gè)階段提出的問題是:為什么要使用 l2 的坡度?

上文提到,我們使用 l2 坡度來更快地調(diào)整權(quán)重:l2 坡度告訴我們每個(gè) l2 預(yù)測(cè)的置信度,從而允許我們決定哪些數(shù)字最需要調(diào)整,以及如何最快地調(diào)整它們。

我們來看數(shù)學(xué)部分,F(xiàn)在我們知道下一次迭代中 l2 預(yù)測(cè)要做的改變是 l2_delta,也知道到達(dá)目前預(yù)測(cè)結(jié)果的 syn1 值。那么重要的問題來了:如果我們用 l2_delta 乘以這次迭代的 syn1 值會(huì)怎么樣?

這就像好萊塢編劇一樣:你寫了一個(gè)悲傷結(jié)局的電影,主角被龍噴出的火焰灼傷然后被吃掉,所以未能到達(dá)城堡。導(dǎo)演看了劇本滿屋咆哮:「我要 happy ending,我要主角打敗惡龍,發(fā)現(xiàn)生命的意義,然后轉(zhuǎn)身離開!」

你同意按老板的意思修改劇本。你知道了要達(dá)到的結(jié)局,就轉(zhuǎn)回去尋找哪個(gè)動(dòng)作出了錯(cuò)。哪個(gè)情節(jié)使得你沒有成為英雄反而被龍吃掉?

數(shù)學(xué)就是在做這樣的事情:如果你把 l2_delta(期望的完美結(jié)局)乘以 syn1(導(dǎo)致錯(cuò)誤結(jié)局的情節(jié)),那么你將收獲 l1_error。改變?cè)斐慑e(cuò)誤結(jié)局的情節(jié),下一版劇本將變得更好。

再次提醒:如果你將下一次想去的地方(l2_delta)與旅程第二部分的錯(cuò)誤方向(現(xiàn)在的 syn1)相乘,則乘積將是「旅程第一部分出錯(cuò)的地方」,即 l1_error。

知道了 l1_error,你就可以計(jì)算在下次迭代中將 l1 改變多少才能得到更好的 l2 預(yù)測(cè),而這就是 l1_delta。

代碼行 109:

l1_delta = l1_error * nonlin(l1,deriv=True)
l1_delta 的計(jì)算方法和 l2_delta 一樣,此處不再贅述。

4.7 更新突觸

代碼行 115-116:

115 syn1 += l1.T.dot(l2_delta)
116 syn0 += l0.T.dot(l1_delta)

代碼的最后部分是高光時(shí)刻:所有的工作完成了,我們恭敬地將 l1_delta 和 l2_delta 搬到神圣的領(lǐng)導(dǎo)者「突觸國王」面前,他才是所有操作的真正核心。

計(jì)算 syn0 更新的第一步是 l1_delta 乘輸入 l0,然后將乘積與目前的 syn0 相加。這就使得 syn0 的構(gòu)成部分發(fā)生很大改變,從而對(duì) l1 產(chǎn)生更強(qiáng)影響。也就是說,我們降低了這次迭代中誤認(rèn)為重要的問題或問題組合的重要性。它們并沒有我們想象的那么重要,因此用 l1_delta 在正確的方向上修正錯(cuò)誤,從而使我們?cè)谙乱淮蔚芯嚯x城堡更近。

「試錯(cuò)學(xué)習(xí)」,這就是網(wǎng)絡(luò)所做的事情。以下介紹了網(wǎng)絡(luò)如何利用試錯(cuò)來學(xué)習(xí):

嘗試:網(wǎng)絡(luò)執(zhí)行 6 萬次前饋,即嘗試 6 萬次不同的特征問題組合,只為輸出最佳的預(yù)測(cè)結(jié)果;

錯(cuò)誤:網(wǎng)絡(luò)將目前的預(yù)測(cè)與真值進(jìn)行對(duì)比,找出誤差;

學(xué)習(xí):網(wǎng)絡(luò)使用置信度(梯度下降)找出下一次迭代需要在正確的方向上做出多少改變,即 delta。然后網(wǎng)絡(luò)使用新的 delta,并將它乘以舊的 l1 或 l2,然后將乘積加在舊的 syn0 或 syn1 上。你明白為什么說突觸是神經(jīng)網(wǎng)絡(luò)的大腦了嗎?它們?cè)谠囧e(cuò)中學(xué)習(xí),和人類一樣。

你可能會(huì)說:「神經(jīng)元將一切聚集在一起!」(對(duì)準(zhǔn)確預(yù)測(cè)貢獻(xiàn)最多的特征組合在網(wǎng)絡(luò)中的最終優(yōu)先級(jí)最高)。是突觸權(quán)重將一切特征串聯(lián)起來,從而做出最后的預(yù)測(cè)。

4.8 置信度的坡度與紅色碗表面的坡度相同!

回憶一下 1.3 提到的紅色碗,我們?cè)诒疚闹薪榻B的所有技巧都呈現(xiàn)在這個(gè)碗中。

當(dāng)我們使用舊層和新 delta 的乘積更新突觸時(shí),它推動(dòng)突觸在正確的方向上前進(jìn),去往置信度高、準(zhǔn)確率高的預(yù)測(cè)結(jié)果!冈谡_的方向上推動(dòng)」意味著:

l2_delta 的一些值可能是負(fù)的。l2_delta 為負(fù)值意味著下一個(gè)迭代中的 l2 接近 0,這會(huì)以多種方式在突觸中呈現(xiàn)。因此找出給予我們「方向感」的坡度非常重要。方向感,或者說坡度,是推動(dòng)球到達(dá)碗底的關(guān)鍵。網(wǎng)絡(luò)的工作是增加權(quán)重,使得下一個(gè) l2 被 l2_delta 撼動(dòng)。

 

 

上面這幅簡單的二維圖展示了梯度下降的小球。

代碼行 88 計(jì)算出 l2 每個(gè)值的坡度值。在上圖的 3 個(gè)凹陷中(或者說「碗」),很明顯真正的全局最小值是最左側(cè)最深的碗。出于簡潔考慮,我們假裝中間的碗是全局最小值。那么,向右下的陡峭坡度(即負(fù)坡度值,如上圖綠色線所示)意味著小球會(huì)在這個(gè)方向上滾動(dòng)很大幅度,導(dǎo)致 syn1 中的對(duì)應(yīng)權(quán)重出現(xiàn)較大的負(fù)值調(diào)整,而該權(quán)重將用于在下一次迭代中預(yù)測(cè) l2。也就是說,四個(gè) l2 值中有一些會(huì)接近 0,則預(yù)測(cè)結(jié)果就是該顧客不購買這款貓砂。

但是,如果左下有一個(gè)淺坡度,這意味著預(yù)測(cè)值已經(jīng)具備高準(zhǔn)確率和置信度,所以坡度值是小的正數(shù),球只會(huì)向左稍微挪動(dòng)一點(diǎn),syn1 中的對(duì)應(yīng)權(quán)重也只會(huì)有些微調(diào)整,這樣下一次迭代中該值的預(yù)測(cè)結(jié)果不會(huì)有太大改動(dòng)。這奏效的原因是,隨著網(wǎng)絡(luò)預(yù)測(cè)的準(zhǔn)確率越來越高,小球的來回移動(dòng)幅度將越來越小,直到它到達(dá)全局最小值——碗底,不需要再移動(dòng)為止。

現(xiàn)在第四部分「從試錯(cuò)中學(xué)習(xí):梯度下降」即將結(jié)束。是時(shí)候坦白一個(gè)事實(shí)了:你實(shí)際上已經(jīng)在做微積分了,只不過我們沒有指明它是微積分!

這個(gè)樸素的真相就是:

l2 每個(gè)值的置信度 = l2 的坡度 = l2 的導(dǎo)數(shù)

但置信度只是冰山一角,接下來我們將介紹可用于更復(fù)雜神經(jīng)網(wǎng)絡(luò)(具備更多層和特征)的策略——反向傳播。

5. 反向傳播

5.1 打破反向傳播的迷思

反向傳播是執(zhí)行梯度下降的核心工具,但它以難學(xué)而著稱……不過反向傳播是為了幫助我們,它只有好的意圖。

關(guān)于反向傳播有兩個(gè)迷思,接下來我們就來一一打破。

迷思 1:反向傳播非常難

錯(cuò)。反向傳播只是需要耐心和堅(jiān)持罷了。如果你只讀過一次關(guān)于反向傳播的文本就舉手投降,那你就完了!但是如果你把 Grant Sanderson 關(guān)于反向傳播的視頻 3 慢速看 5 遍,再把關(guān)于反向傳播數(shù)學(xué)知識(shí)的視頻 4 看 5 遍,你會(huì)覺得很順利。(視頻地址:https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi)

迷思 2:理解反向傳播,必須會(huì)微積分

很多在線文章稱,你需要了解多變量微積分才能理解 AI。這種說法并不對(duì)。深度學(xué)習(xí)大牛 Andrew Trask 表示,如果你上過三個(gè)學(xué)期的大學(xué)微積分課,其中只有一小部分材料對(duì)學(xué)習(xí)反向傳播有用:鏈?zhǔn)椒▌t。然而,即使你學(xué)了 3 學(xué)期大學(xué)微積分課程,反向傳播中的鏈?zhǔn)椒▌t與你在大學(xué)課堂上見到的并不一樣。你最好把 Kalid Azad 關(guān)于鏈?zhǔn)椒▌t的書讀五遍。

我之前一看到「導(dǎo)數(shù)」這個(gè)詞就發(fā)慌,還沒怎么著自己就先認(rèn)輸了。大家不要重蹈我的覆轍。你必須用這樣的內(nèi)心聲音告誡自己:「我不需要任何背景也能掌握這個(gè)概念。」

5.2 反向傳播的定義

5.2.1 反向傳播之于梯度下降,相當(dāng)于鏈?zhǔn)椒▌t之于反向傳播

第四章介紹的梯度下降過程是理解梯度下降的重要步驟,不過第五章將從不同的角度理解梯度下降,它可應(yīng)用于大部分神經(jīng)網(wǎng)絡(luò)。

反向傳播是理解神經(jīng)網(wǎng)絡(luò)的必要環(huán)節(jié)。其優(yōu)雅的數(shù)學(xué)運(yùn)算允許我們同時(shí)調(diào)整每一個(gè)權(quán)重,而這是通過鏈?zhǔn)椒▌t實(shí)現(xiàn)的。

什么是鏈?zhǔn)椒▌t?我先介紹數(shù)學(xué)定義,再用類比的方式幫助你理解它。

數(shù)學(xué)定義:鏈?zhǔn)椒▌t的本質(zhì)是,嵌套函數(shù)的導(dǎo)數(shù)是構(gòu)成嵌套函數(shù)的每個(gè)函數(shù)的導(dǎo)數(shù)乘積。即,最終導(dǎo)數(shù)等于構(gòu)成函數(shù)的導(dǎo)數(shù)乘積。

類比:把鏈?zhǔn)椒▌t看作馬戲團(tuán)的雜耍人。神經(jīng)網(wǎng)絡(luò)有 16 個(gè)權(quán)重,因此我們把這些權(quán)重想象為 16 個(gè)保齡球瓶,雜耍人需要使它們同時(shí)停留在空中。假設(shè)這些球瓶大小不一,則雜耍人必須足夠嫻熟才能用合適的力道在恰當(dāng)?shù)臅r(shí)間點(diǎn)拋出每個(gè)球瓶,同時(shí)確保其他 15 個(gè)球瓶停留在空中,F(xiàn)在我們假設(shè)這位雜耍人很厲害,當(dāng)一個(gè)球瓶在空中突然體積改變時(shí),他能夠立刻調(diào)整其他 15 個(gè)球瓶,來彌補(bǔ)這一變化。他可以適應(yīng)球瓶的任意變化并進(jìn)行調(diào)整,使全部 16 個(gè)球瓶都停留在空中!

簡直是天才,對(duì)吧?鏈?zhǔn)椒▌t也是如此:從一個(gè)權(quán)重到最終預(yù)測(cè)有很多路徑,鏈?zhǔn)椒▌t調(diào)整這些路徑,使它們?nèi)际窍鄬?duì)較直的路。我們示例中的神經(jīng)網(wǎng)絡(luò)比較小,事實(shí)上鏈?zhǔn)椒▌t同樣適用于包含數(shù)百萬甚至數(shù)十億權(quán)重的大型神經(jīng)網(wǎng)絡(luò)。

5.2.2 我們想要解決的問題:如何調(diào)整 16 個(gè)權(quán)重

難點(diǎn)在于:每次你調(diào)整 16 個(gè)權(quán)重中的其中一個(gè)時(shí),整個(gè)神經(jīng)網(wǎng)絡(luò)都會(huì)受到影響。如何既考慮到權(quán)重調(diào)整對(duì)預(yù)測(cè)誤差的影響,還能計(jì)算出每個(gè)權(quán)重的最佳調(diào)整值呢?這聽起來很復(fù)雜。

事實(shí)也的確如此。我們剛剛已經(jīng)使用 Python 代碼和置信度進(jìn)行了必要的計(jì)算,但是為了掌握這個(gè)要點(diǎn),我們需要從另一個(gè)角度再做一次:鏈?zhǔn)椒▌t。

我們將利用坡度使 16 個(gè)球瓶同時(shí)待在空中。而找出坡度的秘訣就是導(dǎo)數(shù)。

5.2.3 鏈?zhǔn)椒▌t和變化率

這一次,我們使用鏈?zhǔn)椒▌t找出變化率的坡度。

變化率是一個(gè)重要概念。3.2 節(jié)提到 syn0,1 為 3.66,那么關(guān)鍵問題來了:當(dāng)我們?cè)黾踊驕p小 syn0,1 的值時(shí),這對(duì) l2_error 的增減有多大影響?也就是說,將 l2_error 對(duì) syn0,1 變化的反應(yīng)看作「敏感度」,或者變化率:即調(diào)整 syn0,1 的值后,l2_error 值的變化會(huì)與之成比例。這個(gè)比例是多大呢?l2_error 對(duì) syn0,1 的敏感度如何呢?

記住:反向傳播的目標(biāo)是找出每個(gè)權(quán)重需要調(diào)整的量,從而在下一次迭代中盡可能地降低 l2_error。但是挑戰(zhàn)在于每個(gè)權(quán)重都會(huì)對(duì)其他 15 個(gè)權(quán)重產(chǎn)生影響,因此權(quán)重 1 調(diào)整的量依賴于權(quán)重 2 調(diào)整的量,權(quán)重 2 的調(diào)整量依賴于權(quán)重 3 調(diào)整的量,依此類推。如何調(diào)整 16 個(gè)不斷變化的保齡球瓶取決于某個(gè)瓶子有多大變化。

不過我有一個(gè)更好的類比:蝴蝶。

5.3 定義鏈?zhǔn)椒▌t:它像蝴蝶效應(yīng)

還記得我們?cè)噲D解決的問題嗎?「如何調(diào)整 16 個(gè)權(quán)重,使每個(gè)瓶子都能與其他 15 個(gè)球瓶完美搭配,同時(shí)停留在空中,并且最小化 l2_error,幫助我到達(dá)城堡,找到生命的意義!

我們將這個(gè)大問題分解一下。我們先看其中的一個(gè)權(quán)重 syn0 (1,1)(本文將其簡寫為 syn0,1)。我如何以有序、依存的方式調(diào)整 syn0,1,才能使 16 個(gè)球瓶正常運(yùn)轉(zhuǎn),同時(shí)還能盡可能多地降低 l2_error?

答案就是鏈?zhǔn)椒▌t,它和蝴蝶效應(yīng)很像(一只新墨西哥州的蝴蝶扇動(dòng)翅膀,引發(fā)了一系列連鎖事件,引起中國颶風(fēng))。我們來看這個(gè)類比如何應(yīng)用到反向傳播中必須計(jì)算的變化率上:

 

 

而當(dāng)我們將 syn0,1 的值進(jìn)行增減時(shí),新墨西哥州的蝴蝶開始扇動(dòng)翅膀。出于簡潔性考慮,我們將 syn0,1 的值增加到 3.66,這一舉動(dòng)引發(fā)了一系列連鎖反應(yīng)——其他權(quán)重合力組成的「完美風(fēng)暴」,從而降低 l2_error。

接下來,我們將蝴蝶效應(yīng)和另一個(gè)類比——連鎖反應(yīng)結(jié)合起來。

5.4 蝴蝶效應(yīng)遇見 5 個(gè)變化率:連鎖反應(yīng)

蝴蝶效應(yīng)只是更寬泛概念——連鎖反應(yīng)的一個(gè)實(shí)例。下圖將蝴蝶效應(yīng)和變化率改變帶來的連鎖反應(yīng)結(jié)合了起來,圖看起來很復(fù)雜,但它其實(shí)由以下三項(xiàng)組成:

和前文圖一樣的白色圓圈,從左至右表示蝴蝶效應(yīng);

圖下方方框中是反向傳播鏈?zhǔn)椒▌t中的變化率。這些方框從右至左反向移動(dòng),即最右方的變化率改變會(huì)通過其他變化率最終影響到最左側(cè)的變化率。

彩色箭頭起連接作用。

Ripple 1,即對(duì) syn0,1 進(jìn)行調(diào)整后的第一個(gè)連鎖反應(yīng),將導(dǎo)致 l1_LH 上升一定比率,這個(gè)比率就是變化率。這就是「內(nèi)華達(dá)州的大風(fēng)」(見下圖灰色箭頭)。

由于 l1_LH 是 sigmoid 函數(shù)的輸入,那么計(jì)算 l1_LH 和 L1 之間的變化率就需要衡量 Ripple 2,即「洛杉磯的狂風(fēng)」(見下圖紫色箭頭)。

很顯然,l2_LH 會(huì)受到 l1 變化及 l1 乘以 syn1,1 的影響(為了簡化示例,syn1,1 及其他 14 個(gè)權(quán)重的值并未改變),因此 l2_LH 和 l2 之間的變化率帶來了 Ripple 3——「夏威夷的雷暴」(見下圖黃色箭頭)。

l2 的變化與 l2_LH 的變化成比例,因此 l2_LH 的坡度將帶來 Ripple 4——「太平洋的暴風(fēng)雨」(見下圖綠色箭頭)。

最后,y 值減去新的 l2 得到的余數(shù)——l2_error 將會(huì)改變,即 Ripple Effect #5——「中國的颶風(fēng)」(見下圖藍(lán)色箭頭)。

 

 

我們的目標(biāo)是計(jì)算每次連鎖反應(yīng)帶來的變化率,找出 syn0,1 需要增減的量,以便在下一次迭代中最小化 l2_error。當(dāng)我們說神經(jīng)網(wǎng)絡(luò)「學(xué)習(xí)」的時(shí)候,我們其實(shí)表達(dá)的是在每一次迭代中降低 l2_error,使得每一次迭代中網(wǎng)絡(luò)的預(yù)測(cè)結(jié)果準(zhǔn)確率都有提升。

倒過來看,我們可以說「颶風(fēng) l2_error 的變化取決于 l2 的變化,l2 的變化取決于 l2_LH 的變化,l2_LH 的變化取決于 l1 的變化,l1 的變化取決于 l1_LH 的變化,而 l1_LH 的變化取決于蝴蝶 syn0,1 的變化」。該示例中所用的規(guī)則即步長等于坡度。

此外,我還想讓大家了解 Python 代碼和這些是如何同步的。接下來,我們就來看看哪些代碼行對(duì)應(yīng)鏈?zhǔn)椒▌t函數(shù)中的變化率。

5.5 代碼與鏈?zhǔn)椒▌t的同步

 

 

5.5.1 移除中間變量

上圖中出現(xiàn)了代碼行 66 到 115 中的代碼,紅色線連接代碼與變化率。如果你覺得這些連線不太對(duì),這是因?yàn)樵即a將反向傳播過程分解成了多個(gè)中間步和多個(gè)額外的中間變量。下面我們將從代碼中移除以下四個(gè)中間變量:l2_error、l2_delta、l1_error 和 l1_delta。

先從紅色箭頭連接的代碼片段開始。假設(shè)四個(gè)中間變量已經(jīng)移除,還剩下什么呢?我們來看下圖的最底下一行。將中間變量從代碼中移除后,這行代碼并沒有改變,F(xiàn)在這三行完美同步了。

 

 

5.6 實(shí)戰(zhàn)演示

下面,我們看看改變 syn0 中一個(gè)權(quán)重的數(shù)學(xué)背景。出于簡便,這里的變量和第 3 節(jié)相同:

l0= 1
syn0,1= 3.66
l1_LH= 3.82
l1= 0.98
syn1,1= 12.21
l2_LH= 0.00
l2= 0.50
y= 1 (This is a "Yes" answer to survey question 4, "Ever bought Litter Rip?" which corresponds to training example #1, i.e., row 1 of l0)
l2_error = y-l2 = 1-0.5 = 0.5

5.6.1 不要重蹈我的覆轍

在解決變化率時(shí),千萬不要和我犯同樣的錯(cuò)誤。我最初是這么計(jì)算變化率的(錯(cuò)誤示范):

 

 

那么上圖有什么問題呢?

5.6.2 不是為了計(jì)算變化率,而是為了計(jì)算變化率的變化:坡度

在上圖中,我忘記了此時(shí)的目標(biāo)是計(jì)算相對(duì)變化?吹缴蠄D中每個(gè)變量前面的 d 了嗎?我忽略了它們,只寫下了每個(gè)變量的當(dāng)前值。

而那些 d 表示 delta,delta 非常重要,不能忽略。

我們想預(yù)測(cè)未來。我們想知道 syn0,1 改變多少會(huì)最終導(dǎo)致下一次迭代中 l2_error 減小。也就是說,我們不是要對(duì)比 syn0,1 中單個(gè)數(shù)值 3.66 對(duì) l2_error(0.5)的影響,而是想知道 syn0,1 中 3.66 應(yīng)該如何變化才能影響到 5 個(gè)連鎖變化率,從而最終產(chǎn)生更好的 l2_error。我們不想要一堆變化率,我們想要的是能改變 delta 的變化率。

5.6.3 計(jì)算變化率的公式:x_current 和 x_nearby

 

 

「current」表示每個(gè)變量的當(dāng)前值,「nearby」表示我們想提供的與當(dāng)前數(shù)字接近的數(shù)字。nearby 數(shù)字減去 current 數(shù)字,會(huì)得到一個(gè)很小的數(shù)字。如果兩個(gè)點(diǎn)在一條曲線上,這方便計(jì)算出更準(zhǔn)確的坡度值。接下來我們過一遍上述 5 個(gè)變化率,練習(xí)如何尋找每個(gè)變化率的 nearby 數(shù)字。

下圖展示了完整的反向傳播:

 

 

5.6.4 示例

從后往前,我們要先計(jì)算的 Ratio 1 是 Ripple 5:d l2_error / d l2。那么「current」和「nearby」從哪里來呢?

x_current 是前饋計(jì)算出的 l2——0.5;
y_current 是 y-l2 = 1-0.5 = 0.5,即 l2_error;
x_nearby 是我們舉的一個(gè)簡單例子。如果 l2 為 0.6,距離 x_current(0.5)較近,則 y-0.6 = 0.4;
也就是 x_nearby = 0.6,y_nearby = 0.4;

知道這四個(gè)變量后,計(jì)算就很簡單了,坡度即敏感度= -1;

這意味著 l2 每增加 0.1,l2_error 就減 0.1。

其他幾步的計(jì)算過程此處不再贅述,想了解更多,請(qǐng)閱讀原文。

總結(jié)

課程到這里已接近尾聲,現(xiàn)在你們已經(jīng)掌握了梯度下降的核心工具——反向傳播。最后,我將送給大家一份離別禮物:

Andrew Trask 教會(huì)我:記住這些 Python 代碼才能精通。出于以下兩點(diǎn)原因我認(rèn)同這個(gè)觀點(diǎn):

當(dāng)你試著根據(jù)記憶寫出代碼時(shí),你發(fā)現(xiàn)你忘記的地方恰好是不理解的地方。全部理解后,所有代碼會(huì)永遠(yuǎn)存在你的大腦中;

這些代碼是構(gòu)建所有深度學(xué)習(xí)網(wǎng)絡(luò)的基礎(chǔ)。掌握了這些代碼,你以后學(xué)習(xí)每一個(gè)網(wǎng)絡(luò)、每一篇論文都會(huì)更加清晰和簡單。

牢記這些代碼幫助我編了一個(gè)把所有概念串在一起的荒誕故事,你也可以編造自己的故事。

希望你能享受深度學(xué)習(xí)旅程!

原文鏈接:https://colab.research.google.com/drive/1VdwQq8JJsonfT4SV0pfXKZ1vsoNvvxcH

標(biāo)簽: 機(jī)器學(xué)習(xí) 深度學(xué)習(xí)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:數(shù)據(jù)泄露:知己知彼 防范于未然

下一篇:歐洲最大筆融資,印度AI公司被曝造假,自動(dòng)開發(fā)背后是真人碼農(nóng)