十五運(yùn)會(huì)和殘?zhí)貖W會(huì)志愿服務(wù)口號(hào)+志愿者昵稱征集正式開始
2024-09-19
更新時(shí)間:2024-09-19 18:00:09作者:佚名
demo什么意思(讀懂一個(gè) Demo就能入門機(jī)器學(xué)習(xí)?)。本站來告訴相關(guān)信息,希望對(duì)您有所幫助。
我們總有一種感覺,機(jī)器學(xué)習(xí)門檻高、難入門。這是因?yàn)檫@里有太多晦澀的概念「神經(jīng)網(wǎng)絡(luò)」、「評(píng)估指標(biāo)」、「優(yōu)化算法」等讓初學(xué)者老是有種盲人摸象的感覺。甚至連理解一個(gè) Tensorflow 官方 Demo 都感覺吃力,因此不少開發(fā)者就有過「機(jī)器學(xué)習(xí)從入門到放棄」的經(jīng)歷。本文站在全局視角,通過分析一個(gè) TensorFlow 官方的 Demo 來達(dá)到俯瞰一個(gè)「機(jī)器學(xué)習(xí)」系統(tǒng)的效果,從而讓讀者看清這個(gè)頭大象的全貌,幫助初學(xué)者入門「機(jī)器學(xué)習(xí)」。
理解機(jī)器學(xué)習(xí)
「機(jī)器學(xué)習(xí)」的目的就是利用已有答案來尋找規(guī)則,從而做出預(yù)測(cè)。
「?jìng)鹘y(tǒng)系統(tǒng)」的目標(biāo)是獲得答案
「機(jī)器學(xué)習(xí)」的目標(biāo)是利用已有答案獲得規(guī)則
正是因?yàn)椤笝C(jī)器學(xué)習(xí)」的目標(biāo)是獲得規(guī)則,人們便可以拿它來做各種預(yù)測(cè):股票走勢(shì)、彩票號(hào)碼、服飾推薦、甚至預(yù)測(cè)員工何時(shí)離職。圖片識(shí)別本質(zhì)上也是找到規(guī)則。比如要識(shí)別一張圖片物體是否有一只貓咪,那么胡須、耳朵、絨毛等都可以作為貓咪的特征值,而定義特征值就是在定義成為一只貓的組成規(guī)則。
詳解一個(gè)機(jī)器學(xué)習(xí) Demo
學(xué)習(xí)一項(xiàng)技能最好方法就是去使用它。這部分我們來看一個(gè) TensorFlow Demo。TensorFlow 是 Google 推出的深度學(xué)習(xí)框架,基本信息我就不多做介紹了。我要介紹的是如何讀懂這個(gè) Demo。你可能會(huì)問,一個(gè) Demo 有那么難懂么?對(duì)于「機(jī)器學(xué)習(xí)」的初學(xué)者來說,如若不懂「神經(jīng)網(wǎng)絡(luò)」、「損失函數(shù)」、「評(píng)估指標(biāo)」等概念,還真是挺難讀懂一個(gè) Demo 的。
看下這個(gè) Demo,代碼不多,我全部貼出來了??吹竭@部分代碼的全貌,什么感覺?我第一次讀到的感覺是:「語法都能看懂,但就是不知道你這是要干啥!」如果你也有這樣的感覺,那么我建議你認(rèn)真把這篇文章讀完。這個(gè) Demo 實(shí)際上是要訓(xùn)練一個(gè)可以識(shí)別手寫數(shù)字的模型(Model), 要識(shí)別的手寫數(shù)字長(zhǎng)這樣:你也許一下子會(huì)有很多問號(hào)。手寫數(shù)字?圖片在哪?怎么識(shí)別?別急,下面我來為大家詳解這個(gè) Demo。
數(shù)據(jù)準(zhǔn)備
人工智能領(lǐng)域中的數(shù)據(jù)是什么?我們從 TensorFlow 這個(gè)框架的名字中就能看出來 — Tensor(張量)形成的 Flow(流)。在「人工智能」領(lǐng)域,絕大部分?jǐn)?shù)據(jù)都是以 Tensor 的形式存在,而 Tensor 可以直接理解成多維數(shù)組。
舉個(gè)例子: 要把一張圖片輸入到人工智能模型中。我們第一反應(yīng)是要先把圖片數(shù)字化,用 Base64 來表示這張圖、或者用二進(jìn)制等等。但是對(duì)于人工智能系統(tǒng),最佳方式是把圖片轉(zhuǎn)換成 Tensor。我們?cè)囋囉?Tensor 來表示一張像素 3*3 、背景為白色、對(duì)角線為黑色的圖片:
運(yùn)行代碼之后,我們就得到了那張對(duì)角線是黑色的 3*3 圖片。這就是用一個(gè)四階 Tensor 表示一張圖片,Tensor 形狀為(1, 3, 3)。同理如果要表示 6000 張 28*28 的圖片,那么 Tensor 的形狀就是(6000, 28, 28)。
現(xiàn)在我們閱讀第一部分的代碼:「MNIST」(Mixed National Institute of Standards and Technology database) 是美國國家標(biāo)準(zhǔn)與技術(shù)研究院收集整理的大型手寫數(shù)字?jǐn)?shù)據(jù)庫,包含 60,000 個(gè)示例的訓(xùn)練集以及 10,000 個(gè)示例的測(cè)試集,里面的圖片長(zhǎng)這樣。這些圖片都是通過空間的矩陣的方式存儲(chǔ)的:
這樣我們就明白這段代碼的意思了,是從 mnist 中獲取用于訓(xùn)練的的數(shù)據(jù)集集( x_trian,y_train ),以及用于測(cè)試的數(shù)據(jù)集( x_test,y_test )。
x_trian 形狀為 (6000, 28, 28) ,表示 6000 張 28*28的圖片。
y_trian 形狀為 (6000,),表示 x_train 對(duì)應(yīng)的數(shù)字答案。
模型(model)是什么
得到了數(shù)據(jù)集之后,是不是可以開始訓(xùn)模型了?別急,我們要搞清楚模型是什么,Tensorflow 文檔是這樣定義模型:
在機(jī)器學(xué)習(xí)中,模型( Model )是一個(gè)具有可學(xué)習(xí)參數(shù)的函數(shù),它將輸入映射到輸出。最優(yōu)參數(shù)是通過在數(shù)據(jù)上訓(xùn)練模型獲得的。一個(gè)訓(xùn)練有素的模型將提供從輸入到所需輸出的精確映射。
我來幫你們翻譯一下這個(gè)定義:模型是個(gè)函數(shù),這里面內(nèi)置了很多參數(shù),這些參數(shù)的值會(huì)直接影響模型的輸出結(jié)果。有意思的是這些參數(shù)都是可學(xué)習(xí)的,它們可以根據(jù)訓(xùn)練數(shù)據(jù)的來進(jìn)行調(diào)整來達(dá)到一組最優(yōu)值,使得模型的輸出效果最理想。
那么模型里參數(shù)又是什么?
Demo 當(dāng)中模型傳入的 4 個(gè)Layer 又是什么含義?
模型又是如何訓(xùn)練的?
想要知道這些問題答案,那么:「先生小姐,泳泳健身,呃不。神經(jīng)網(wǎng)絡(luò),了解一下」
神經(jīng)網(wǎng)絡(luò) ( Neural Network )
神經(jīng)網(wǎng)絡(luò) ( Neural Network )顧名思義,就是用神經(jīng)元 ( Neuron )連接而成的網(wǎng)絡(luò)( Network )。那么什么是神經(jīng)元?
機(jī)器學(xué)習(xí)中的神經(jīng)元( Neuron ) 源于生物神經(jīng)網(wǎng)絡(luò) — 通過電位變化表示“興奮”的生物神經(jīng)元。在機(jī)器學(xué)習(xí)領(lǐng)域,一個(gè)神經(jīng)元其實(shí)是一個(gè)計(jì)算單元。它需要被輸入N 個(gè)信號(hào)后開始計(jì)算(興奮),這些信號(hào)通過帶權(quán)重(weights)的連接傳遞給了神經(jīng)元,神經(jīng)元通過加權(quán)求和,計(jì)算出一個(gè)值。然后這個(gè)值會(huì)通過激活函數(shù)( activation function )的處理,產(chǎn)生輸出,通常是被壓縮在 0~1 之間的數(shù)字。
Demo 當(dāng)中,第一個(gè) Layer 就是把就是把 28*28 的圖片展開成一個(gè)包含 784 個(gè)神經(jīng)元一維數(shù)組。
…
# 第一個(gè) Layer
# 神經(jīng)元展開成一維數(shù)組
tf.keras.layers
.Flatten(input_shape=(28,28)),
…
第二個(gè) Layer:
…
tf.keras.layers
.Dense(128, activation=’relu’),
…
Layer2 傳入了參數(shù)activation=’relu’,意思是用 relu 作為激活函數(shù) 。我們先來理解下什么是「激活函數(shù)」,
當(dāng)我們的大腦同時(shí)接收到大量信息時(shí),它會(huì)努力理解并將信息分為 「有用 」和 「不那么有用 」的信息。在神經(jīng)網(wǎng)絡(luò)的情況下,我們需要一個(gè)類似的機(jī)制來將輸入的信息分為 「有用 」或 「不太有用」。這對(duì)機(jī)器學(xué)習(xí)很重要,因?yàn)椴皇撬械男畔⒍际峭瑯佑杏玫?,有些信息只是噪音。這就是激活函數(shù)的作用,激活函數(shù)幫助網(wǎng)絡(luò)使用重要的信息,抑制不相關(guān)的數(shù)據(jù)點(diǎn)。
例如 Demo 中,Layer1 輸出 784 個(gè)神經(jīng)元,并不是全部激活的。而只有激活神經(jīng)元才能對(duì) Layer2 產(chǎn)生刺激,而 layer4 輸出10個(gè)神經(jīng)元,其中第 2 個(gè)神經(jīng)元激活,表示識(shí)別結(jié)果為 1 的概率是 99%。
所以 relu 是激活函數(shù)的一種,用于神經(jīng)元的激活 — 根據(jù)上一個(gè) Layer 給予的刺激算出神經(jīng)元最后輸出(顯示)的那個(gè)數(shù)字。Layer2 曾有 128個(gè)神經(jīng)元,這128個(gè)神經(jīng)元會(huì)和 Layer1 中 728 個(gè)神經(jīng)元相互連接,共將產(chǎn)生728 * 128 =93184權(quán)重(weights)各自不同的連接 。Layer1 中神經(jīng)元的輸出將與連接到 layer2 的權(quán)重值進(jìn)行加權(quán)求和,得到的結(jié)果會(huì)被帶入relu函數(shù),最終輸出一個(gè)新的值作為 Layer2 中神經(jīng)元的輸出。
第三個(gè) Layer
…
tf.keras.layers.Dropout(0.2),
Dropout layer 的主要作用就是防止過度擬合。過渡擬合現(xiàn)象主要表現(xiàn)是:最終模型在訓(xùn)練集上效果好;在測(cè)試集上效果差。模型泛化能力弱。Dropout 解決過度擬合的辦法之一,就是隨機(jī)丟棄一部神經(jīng)元。Demo 當(dāng)中就是使用 Dropout 隨機(jī)丟棄 20% 神經(jīng)元。
第四個(gè) Layer
…
tf.keras.layers
.Dense(10, activation=’softmax’)
…
Layer4 上有 10 個(gè)神經(jīng)元,并使用softmax作為激活函數(shù),這 10個(gè)神經(jīng)元的輸出就是最終結(jié)的結(jié)果。下圖為識(shí)別一個(gè)手寫數(shù)字 1 的整個(gè)過程,各層神經(jīng)元逐層激活,最終輸出預(yù)測(cè)結(jié)果。
到這里,我們通過了解 4 個(gè)Layer之間的作用關(guān)系簡(jiǎn)單的了解了一個(gè)神經(jīng)網(wǎng)絡(luò)的運(yùn)作方式。
模型訓(xùn)練補(bǔ)充
要讀懂這段代碼,我們要先通過一個(gè)類比來理解下什么是:損失函數(shù)( Loss Function )、優(yōu)化算法( Optimization Algorithms )、評(píng)價(jià)指標(biāo)( Evaluation Metrics )假如一名男士要開始鍛煉身體,目標(biāo)是胸圍達(dá)到 120cm,且身材看起來勻稱(別太壯):
經(jīng)過反復(fù)訓(xùn)練,他的胸圍達(dá)到了 110cm,那么我們可以把Loss = |目標(biāo)(120cm)- 當(dāng)前(110cm)|作為一個(gè)最簡(jiǎn)單的損失函數(shù)(Loss Function)。而 Demo 中的 Loss Function 用的是 – 稀疏類別交叉熵(
sparse_categorical_crossentropy),這個(gè)算法的特點(diǎn)就是擅長(zhǎng)分類。
是否達(dá)成目標(biāo),不能僅僅使用損失函數(shù)來判斷。身材勻稱、美觀也很重要,而評(píng)價(jià)指標(biāo)(Evaluation Metrics )的作用就給我們提供了一個(gè)評(píng)判標(biāo)準(zhǔn)。
接下來我們就要尋找產(chǎn)生 Loss 的規(guī)律,Loss 不僅僅是胸圍小于 120cm 的損失,胸圍大于 120cm 而導(dǎo)致美感損失也是 Loss 的一部分。因此想達(dá)到最佳效果,既不能運(yùn)動(dòng)量不足也不能用力過猛,要找到一個(gè)平衡力量和美感的中間值。我們給予訓(xùn)練要素不同的權(quán)重( Weights ),蛋白質(zhì)補(bǔ)充權(quán)重為w0、胸肌上沿訓(xùn)練強(qiáng)度w1、胸肌中部訓(xùn)練強(qiáng)度w2、胸肌下沿訓(xùn)練強(qiáng)度w3、有氧運(yùn)動(dòng)訓(xùn)練強(qiáng)度w4 等等。最后得到一個(gè)權(quán)重的一維數(shù)組 [w1, w2…wn] 。像這樣,通過不斷調(diào)整 [w1, w2…wn] 得出最優(yōu)輸出的方法,就是優(yōu)化算法( Optimization Algorithms )。
了神經(jīng)網(wǎng)絡(luò)的模型、層、權(quán)重、優(yōu)化算法、損失函數(shù)以及評(píng)估指標(biāo)等之后,我們就可以讀懂 Demo 中那段代碼了?,F(xiàn)在嘗試畫一張神經(jīng)網(wǎng)絡(luò)的工作流程圖,串一串一個(gè)神經(jīng)網(wǎng)絡(luò)的工作流程。
訓(xùn)練與測(cè)試
這部分很好理解,帶入數(shù)據(jù)訓(xùn)練、測(cè)試就好。說一下epochs。在神經(jīng)網(wǎng)絡(luò)領(lǐng)域,一個(gè) epoch 是指整個(gè)訓(xùn)練數(shù)據(jù)集的訓(xùn)練一個(gè)周期。1 epoch = 1正向傳播( forward pass )+ 1 反向傳播( backward pass )(我們可以簡(jiǎn)單的理解,正向傳播目的是為了獲得預(yù)測(cè)結(jié)果,反向傳播目的是調(diào)整到最優(yōu)的權(quán)重(weights),來讓 Loss 最小化。)
Demo 中 epochs = 5 是因?yàn)?1次 epoch 很可能得不到最優(yōu)的權(quán)重(weights)。既然 1 次不能滿足,那就 5 次,5 次還不滿足就 10 次,直到效果最小化 Loss 的效果不再變化。
總結(jié)
如果認(rèn)真閱讀了本文,那么我相信你已經(jīng)對(duì)人工智能已經(jīng)有了一點(diǎn)整體的認(rèn)識(shí),本文給了你一個(gè)鳥瞰人工智能的視角,擺脫了盲人摸象的感覺。這雖然不是魔法,能立刻把你變成人工智能大神,但對(duì)基本架構(gòu)的進(jìn)一步理解會(huì)增強(qiáng)你對(duì)人工智能的自學(xué)能力。無論你是從事前端、后端、全棧等技術(shù)開發(fā)者,或者只是對(duì)人工智能感興趣,我都希望本文可以帶給你一個(gè)新的視角去理解人工智能,讓你讀有所思,思有所得,得有所想,想有所獲,獲有所益。