什么是深度学习
原文鏈接:https://aistudio.baidu.com/aistudio/projectdetail/2052554
什么是深度學習?
大家好,歡迎來到新手入門課程,在這里我會帶領大家從一個完全不懂深度學習的小白,通過學習本課程后,能夠了解基本的深度學習概念,熟悉必備的數序基礎知識,學會常見的編程工具Python,并掌握實用的深度學習框架PaddlePaddle。可能看到本課程的你并不了解什么是深度學習,那么就讓我們從第一課開始把——什么是深度學習?
一、深度學習的發展歷程
1.1 Turing Testing (圖靈測試)
圖靈測試是人工智能是否真正能夠成功的一個標準,“計算機科學之父”、“人工智能之父”英國數學家圖靈在1950年的論文《機器會思考嗎》中提出了圖靈測試的概念。即把一個人和一臺計算機分別放在兩個隔離的房間中,房間外的一個人同時詢問人和計算機相同的問題,如果房間外的人無法分別哪個是人,哪個是計算機,就能夠說明計算機具有人工智能。
1.2 醫學上的發現
1981年的諾貝爾將頒發給了David Hubel和Torsten Wiesel,以及Roger Sperry。他們發現了人的視覺系統處理信息是分級的。
從視網膜(Retina)出發,經過低級的V1區提取邊緣特征,到V2區的基本形狀或目標的局部,再到高層的整個目標(如判定為一張人臉),以及到更高層的PFC(前額葉皮層)進行分類判斷等。也就是說高層的特征是低層特征的組合,從低層到高層的特征表達越來越抽象和概念化,也即越來越能表現語義或者意圖。
邊緣特征 —–> 基本形狀和目標的局部特征——>整個目標 這個過程其實和我們的常識是相吻合的,因為復雜的圖形,往往就是由一些基本結構組合而成的。同時我們還可以看出:大腦是一個深度架構,認知過程也是深度的。
人腦神經元示意圖
計算機識別圖像的過程
1.3 Deep Learning的出現
低層次特征 - - - - (組合) - - ->抽象的高層特征
深度學習,恰恰就是通過組合低層特征形成更加抽象的高層特征(或屬性類別)。例如,在計算機視覺領域,深度學習算法從原始圖像去學習得到一個低層次表達,例如邊緣檢測器、小波濾波器等,然后在這些低層次表達的基礎上,通過線性或者非線性組合,來獲得一個高層次的表達。此外,不僅圖像存在這個規律,聲音也是類似的。比如,研究人員從某個聲音庫中通過算法自動發現了20種基本的聲音結構,其余的聲音都可以由這20種基本結構來合成!
二、機器學習
機器學習是實現人工智能的一種手段,也是目前被認為比較有效的實現人工智能的手段,目前在業界使用機器學習比較突出的領域很多,例如:計算機視覺、自然語言處理、推薦系統等等。大家生活中經常用到的比如高速上的ETC的車牌識別,今日頭條的新聞推薦,天貓上的評價描述。 機器學習是人工智能的一個分支,而在很多時候,幾乎成為人工智能的代名詞。簡單來說,機器學習就是通過算法,使得機器能從大量歷史數據中學習規律,從而對新的樣本做智能識別或對未來做預測。
2.1 人工智能vs機器學習
人工智能是計算機科學的一個分支,研究計算機中智能行為的仿真。
每當一臺機器根據一組預先定義的解決問題的規則來完成任務時,這種行為就被稱為人工智能。
開發人員引入了大量計算機需要遵守的規則。計算機內部存在一個可能行為的具體清單,它會根據這個清單做出決定。如今,人工智能是一個概括性術語,涵蓋了從高級算法到實際機器人的所有內容。
我們有四個不同層次的AI,讓我們來解釋前兩個:
- 弱人工智能,也被稱為狹義人工智能,是一種為特定的任務而設計和訓練的人工智能系統。弱人工智能的形式之一是虛擬個人助理,比如蘋果公司的Siri。
- 強人工智能,又稱人工通用智能,是一種具有人類普遍認知能力的人工智能系統。當計算機遇到不熟悉的任務時,它具有足夠的智能去尋找解決方案。
機器學習是指計算機使用大數據集而不是硬編碼規則來學習的能力。
機器學習允許計算機自己學習。這種學習方式利用了現代計算機的處理能力,可以輕松地處理大型數據集。
基本上,機器學習是人工智能的一個子集;更為具體地說,它只是一種實現AI的技術,一種訓練算法的模型,這種算法使得計算機能夠學習如何做出決策。
從某種意義上來說,機器學習程序根據計算機所接觸的數據來進行自我調整。
2.2 監督式學習vs非監督式學習
監督式學習需要使用有輸入和預期輸出標記的數據集。
當你使用監督式學習訓練人工智能時,你需要提供一個輸入并告訴它預期的輸出結果。
如果人工智能產生的輸出結果是錯誤的,它將重新調整自己的計算。這個過程將在數據集上不斷迭代地完成,直到AI不再出錯。
監督式學習的一個例子是天氣預報人工智能。它學會利用歷史數據來預測天氣。訓練數據包含輸入(過去天氣的壓力、濕度、風速)和輸出(過去天氣的溫度)。
我們還可以想象您正在提供一個帶有標記數據的計算機程序。例如,如果指定的任務是使用一種圖像分類算法對男孩和女孩的圖像進行分類,那么男孩的圖像需要帶有“男孩”標簽,女孩的圖像需要帶有“女孩”標簽。這些數據被認為是一個“訓練”數據集,直到程序能夠以可接受的速率成功地對圖像進行分類,以上的標簽才會失去作用。
它之所以被稱為監督式學習,是因為算法從訓練數據集學習的過程就像是一位老師正在監督學習。在我們預先知道正確的分類答案的情況下,算法對訓練數據不斷進行迭代預測,然后預測結果由“老師”進行不斷修正。當算法達到可接受的性能水平時,學習過程才會停止。
非監督式學習是利用既不分類也不標記的信息進行機器學習,并允許算法在沒有指導的情況下對這些信息進行操作。
當你使用非監督式學習訓練人工智能時,你可以讓人工智能對數據進行邏輯分類。這里機器的任務是根據相似性、模式和差異性對未排序的信息進行分組,而不需要事先對數據進行處理。
非監督式學習的一個例子是亞馬遜等電子商務網站的行為預測AI。
它將創建自己輸入數據的分類,幫助亞馬遜識別哪種用戶最有可能購買不同的產品(交叉銷售策略)。 另一個例子是,程序可以任意地使用以下兩種算法中的一種來完成男孩女孩的圖像分類任務。一種算法被稱為“聚類”,它根據諸如頭發長度、下巴大小、眼睛位置等特征將相似的對象分到同一個組。另一種算法被稱為“相關”,它根據自己發現的相似性創建if/then規則。換句話說,它確定了圖像之間的公共模式,并相應地對它們進行分類。
三、深度學習如何工作
什么是深度學習,以及它是如何工作的。
深度學習是一種機器學習方法 , 它允許我們訓練人工智能來預測輸出,給定一組輸入(指傳入或傳出計算機的信息)。監督學習和非監督學習都可以用來訓練人工智能。
Andrew Ng:“與深度學習類似的是,火箭發動機是深度學習模型,燃料是我們可以提供給這些算法的海量數據。”
我們將通過建立一個公交票價估算在線服務來了解深度學習是如何工作的。為了訓練它,我們將使用監督學習方法。
我們希望我們的巴士票價估價師使用以下信息/輸入來預測價格:
3.1 神經網絡
神經網絡是一組粗略模仿人類大腦,用于模式識別的算法。神經網絡這個術語來源于這些系統架構設計背后的靈感,這些系統是用于模擬生物大腦自身神經網絡的基本結構,以便計算機能夠執行特定的任務。
和人類一樣, “AI價格評估”也是由神經元(圓圈)組成的。此外,這些神經元還是相互連接的。
神經元分為三種不同類型的層次:
-
輸入層接收輸入數據。在我們的例子中,輸入層有四個神經元:出發站、目的地站、出發日期和巴士公司。輸入層會將輸入數據傳遞給第一個隱藏層。
-
隱藏層對輸入數據進行數學計算。創建神經網絡的挑戰之一是決定隱藏層的數量,以及每一層中的神經元的數量。
-
人工神經網絡的輸出層是神經元的最后一層,主要作用是為此程序產生給定的輸出,在本例中輸出結果是預測的價格值。
神經元之間的每個連接都有一個權重。這個權重表示輸入值的重要性。模型所做的就是學習每個元素對價格的貢獻有多少。這些“貢獻”是模型中的權重。一個特征的權重越高,說明該特征比其他特征更為重要。
在預測公交票價時,出發日期是影響最終票價的最為重要的因素之一。因此,出發日期的神經元連接具有較大的“權重”。
每個神經元都有一個激活函數。它主要是一個根據輸入傳遞輸出的函數。 當一組輸入數據通過神經網絡中的所有層時,最終通過輸出層返回輸出數據。
3.2 通過訓練改進神經網絡
為了提高“AI價格評估”的精度,我們需要將其預測結果與過去的結果進行比較,為此,我們需要兩個要素:
- 大量的計算能力;
- 大量的數據。
訓練AI的過程中,重要的是給它的輸入數據集(一個數據集是一個單獨地或組合地或作為一個整體被訪問的數據集合),此外還需要對其輸出結果與數據集中的輸出結果進行對比。因為AI一直是“新的”,它的輸出結果有可能是錯誤的。
對于我們的公交票價模型,我們必須找到過去票價的歷史數據。由于有大量“公交車站”和“出發日期”的可能組合,因而我們需要一個非常大的票價清單。
一旦我們遍歷了整個數據集,就有可能創建一個函數來衡量AI輸出與實際輸出(歷史數據)之間的差異。這個函數叫做成本函數。即成本函數是一個衡量模型準確率的指標,衡量依據為此模型估計X與Y間關系的能力。
模型訓練的目標是使成本函數等于零,即當AI的輸出結果與數據集的輸出結果一致時(成本函數等于0)。
3.3 我們如何降低成本函數呢?
通過使用一種叫做梯度下降的方法。梯度衡量得是,如果你稍微改變一下輸入值,函數的輸出值會發生多大的變化。
梯度下降法是一種求函數最小值的方法。在這種情況下,目標是取得成本函數的最小值。 它通過每次數據集迭代之后優化模型的權重來訓練模型。通過計算某一權重集下代價函數的梯度,可以看出最小值的梯度方向。
為了降低成本函數值,多次遍歷數據集非常重要。這就是為什么需要大量計算能力的原因。 一旦我們通過訓練改進了AI,我們就可以利用它根據上述四個要素來預測未來的價格。
四、看看第一個例子吧!
4.1 初識神經網絡
我們來看一個具體的神經網絡示例,使用 PaddlePaddle來學習手寫數字分類。如果你沒用過PaddlePaddle或類似的庫,可能無法立刻搞懂這個例子中的全部內容。甚至你可能還沒有安裝PaddlePaddle, 沒關系,第四課會教大家如何安裝PaddlePaddle,學會基本的命令和操作。因此,如果其中某些步驟看起來不太明白也不要擔心。下面我們要開始了。
我們這里要解決的問題是,將手寫數字的灰度圖像(28 像素×28 像素)劃分到 10 個類別 中(0~9)。我們將使用 MNIST 數據集,它是機器學習領域的一個經典數據集,其歷史幾乎和這 個領域一樣長,而且已被人們深入研究。這個數據集包含 60 000 張訓練圖像和 10 000 張測試圖 像,由美國國家標準與技術研究院(National Institute of Standards and Technology,即 MNIST 中 的 NIST)在 20 世紀 80 年代收集得到。你可以將“解決”MNIST 問題看作深度學習的“Hello World”,正是用它來驗證你的算法是否按預期運行。當你成為機器學習從業者后,會發現 MNIST 一次又一次地出現在科學論文、博客文章等中。
Step1:準備數據
1.MINIST數據集包含60000個訓練集和10000測試數據集。分為圖片和標簽,圖片是28*28的像素矩陣,標簽為0~9共10個數字。
2.使用飛槳內置數據集 paddle.vision,datasets.MNIST 定義MNIST數據集的 train_dataset 和 test_dataset。
3.使用 Normalize 接口對圖片進行歸一化。
In [10]import paddle from paddle.vision.transforms import Normalizetransform = Normalize(mean=[127.5],
std=[127.5],
data_format=‘CHW’)
# 使用transform對數據集做歸一化
print(‘download training data and load training data’)
train_dataset = paddle.vision.datasets.MNIST(mode=‘train’, transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode=‘test’, transform=transform)
print(‘load finished’)
load finished
取一條數據,觀察一下mnist數據集
In [11]import numpy as np import matplotlib.pyplot as plt train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1] train_data0 = train_data0.reshape([28,28]) plt.figure(figsize=(2,2)) plt.imshow(train_data0, cmap=plt.cm.binary) print('train_data0 label is: ' + str(train_label_0))train_data0 label is: [5] <Figure size 144x144 with 1 Axes>Step2: 配置網絡
以下的代碼判斷就是定義一個簡單的多層感知器,一共有三層,兩個大小為100的隱層和一個大小為10的輸出層,因為MNIST數據集是手寫0到9的灰度圖像,類別有10個,所以最后的輸出大小是10。最后輸出層的激活函數是Softmax,所以最后的輸出層相當于一個分類器。加上一個輸入層的話,多層感知器的結構是:輸入層-->>隱層-->>隱層-->>輸出層。
In [12]# 定義多層感知機 class MultilayerPerceptron(paddle.nn.Layer):def __init__(self, in_features):super(MultilayerPerceptron, self).__init__()# 形狀變換,將數據形狀從 [] 變為 []self.flatten = paddle.nn.Flatten()# 第一個全連接層self.linear1 = paddle.nn.Linear(in_features=in_features, out_features=100)# 使用ReLU激活函數self.act1 = paddle.nn.ReLU()# 第二個全連接層self.linear2 = paddle.nn.Linear(in_features=100, out_features=100)# 使用ReLU激活函數self.act2 = paddle.nn.ReLU()# 第三個全連接層self.linear3 = paddle.nn.Linear(in_features=100, out_features=10) <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span>(<span class="hljs-params">self, x</span>):</span><span class="hljs-comment"># x = x.reshape((-1, 1, 28, 28))</span>x = self.flatten(x)x = self.linear1(x)x = self.act1(x)x = self.linear2(x)x = self.act2(x)x = self.linear3(x)<span class="hljs-keyword">return</span> x</code></pre></div></div><div class="ai-np-code"><div class="ai-np-code-in">In [13]</div><div class="ai-np-code-main"><pre><code class="hljs"><span class="hljs-comment"># 使用 paddle.Model 封裝 MultilayerPerceptron</span>model = paddle.Model(MultilayerPerceptron(in_features=784))
# 使用 summary 打印模型結構
model.summary((-1, 1, 28, 28))---------------------------------------------------------------------------
Layer (type) Input Shape Output Shape Param #
Flatten-24693 [[1, 1, 28, 28]] [1, 784] 0
Linear-4 [[1, 784]] [1, 100] 78,500
ReLU-3 [[1, 100]] [1, 100] 0
Linear-5 [[1, 100]] [1, 100] 10,100
ReLU-4 [[1, 100]] [1, 100] 0
Linear-6 [[1, 100]] [1, 10] 1,010
Total params: 89,610
Trainable params: 89,610
Non-trainable params: 0
Input size (MB): 0.00
Forward/backward pass size (MB): 0.01
Params size (MB): 0.34
Estimated Total Size (MB): 0.35
{‘total_params’: 89610, ‘trainable_params’: 89610}
接著是配置模型,在這一步,我們需要指定模型訓練時所使用的優化算法與損失函數,此外,這里我們也可以定義計算精度相關的API。
In [14]# 配置模型 model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), # 使用Adam算法進行優化paddle.nn.CrossEntropyLoss(), # 使用CrossEntropyLoss 計算損失paddle.metric.Accuracy()) # 使用Accuracy 計算精度Step3:模型訓練
使用飛槳高層API,可以很快的完成模型訓練的部分,只需要在 prepare 配置好模型訓練的相關算法后,調用 fit 接口,指定訓練的數據集,訓練的輪數以及數據的batch_size,就可以完成模型的訓練。
In [15]# 開始模型訓練 model.fit(train_dataset, # 設置訓練數據集epochs=5, # 設置訓練輪數batch_size=64, # 設置 batch_sizeverbose=1) # 設置日志打印格式The loss value printed in the log is the current step, and the metric is the average value of previous step. Epoch 1/5 step 938/938 [==============================] - loss: 0.3319 - acc: 0.8988 - 9ms/step Epoch 2/5 step 938/938 [==============================] - loss: 0.1907 - acc: 0.9509 - 10ms/step Epoch 3/5 step 938/938 [==============================] - loss: 0.0539 - acc: 0.9640 - 10ms/step Epoch 4/5 step 938/938 [==============================] - loss: 0.0094 - acc: 0.9673 - 9ms/step Epoch 5/5 step 938/938 [==============================] - loss: 0.3041 - acc: 0.9721 - 9ms/stepSTEP4: 模型評估
使用飛槳高層API完成模型評估也非常的簡單,只需要調用 evaluate 接口并傳入驗證集即可。這里我們使用測試集作為驗證集。
In [16]model.evaluate(test_dataset, verbose=1)Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 10000/10000 [==============================] - loss: 1.5974e-05 - acc: 0.9639 - 1ms/step Eval samples: 10000 {'loss': [1.5974172e-05], 'acc': 0.9639}Step5:模型預測
使用飛槳高層API完成模型預測也非常的簡單,只需要調用 predict 接口并傳入測試集即可。
In [17]results = model.predict(test_dataset)Predict begin... step 10000/10000 [==============================] - 1ms/step Predict samples: 10000 In [18]# 獲取概率最大的label lab = np.argsort(results) #argsort函數返回的是result數組值從小到大的索引值 # print(lab) print("該圖片的預測結果的label為: %d" % lab[0][0][-1][0]) #-1代表讀取數組中倒數第一列 該圖片的預測結果的label為: 6五、總結
到這里是不是覺得深度學習非常神奇呢?它具體是怎么實現的呢?背后有什么數學原理?在了解數學原理之前,先學習一下深度學習中常見的數學知識,第二節課就會帶領大家學習必備的數學知識~
請選擇需要預覽的文件總結
- 上一篇: 机器学习算法GBDT的面试总结
- 下一篇: 机器学习(Machine Learnin