2019 年 4 月

第 34 卷,第 4 期

[人工智慧]

神經網路如何學習?

藉由Frank La La |2019 年 4 月

Frank La Vigne在上一個專欄中 ("進一步了解類神經網路 」 msdn.com/magazine/mt833269),我瀏覽類神經網路的基本結構,並從頭建立使用 Python。在檢閱之後通用於所有的類神經網路的基本結構,我可以建立運算加權的總和的範例架構,並輸出值。神經本身都很簡單,並執行基本的數學函式,以將其輸出,介於 1 和 0 或-1 和 1 之間的正規化。它們會成為功能強大,不過,當彼此之間的連線。神經會安排在類神經網路中的圖層,每一個神經都將值傳遞至下一層。輸入的值會透過網路轉寄的重疊顯示,而且會影響稱為正向傳播的程序中的輸出。

不過,完全要如何類神經網路學習?什麼是處理程序和學習時,在類神經網路會發生什麼事?在上一個專欄中,重點是在正向下傳播值。監督式學習案例中,針對類神經網路可以利用這個程序稱為 「 倒傳播。

倒傳播、 遺失和 Epoch

您應該記得,類神經網路中的每一個神經都接受輸入的值乘以加權來代表該連線的強度。倒傳播會探索應套用至在類神經網路中的節點,比較網路的目前輸出具有所需,或正確,輸出正確加權。想要的輸出與目前的輸出之間的差異的計算方式遺失或成本,函式。換句話說,損失函式會告訴我們在針對給定的輸入進行預測的精確度我們的類神經網路是。

公式來計算的遺失將會處於**[圖 1**。勇於求脅迫數學,由它只不過是加總所有的差異的平方。一般而言,一開始會設定加權和偏差為隨機值,其開始訓練類神經網路時,通常會產生較高的遺失值。

成本或遺失,函式
[圖 1 的成本或遺失,函式

此演算法,然後調整每個加權的計算的值與正確的值之間的差異降到最低。「 倒傳播 」 一詞是來自事實的演算法就會回到與計算答案之後調整加權和偏差。針對網路,更精確變得越小遺失。然後,學習程序,可以量化及降低遺失函式的輸出。每個循環,以降低遺失的正向傳播 」 和 「 倒傳播更正這種狀況稱為的 epoch。簡單地說,倒傳播在於找出最適合輸入的加權和偏差,取得更精確的輸出或 「 最小化遺失。 」 如果您想要聽起來耗費許多資源,它。事實上,計算 [電力不足直到相當來讓這個程序更適合廣泛使用。

梯度下降,學習速度與隨機梯度下降

加權調整每個 epoch 中的?會在隨機進行調整,或是否有處理序?這是許多初學者混淆,因為有大量不熟悉的字詞,例如梯度下降和學習速率會擲回的開始位置。不過,它其實不那麼複雜時正確說明。損失函數可降低到單一的數字,指出如何遠類神經網路的類神經網路的所有複雜度,答案是來自所需的回應。以單一數字的思考的類神經網路的輸出可讓我們思考其效能以簡單的方式。目標是要尋找產生的最小的遺失值或最小值的加權一系列。

中的圖形上繪製這**[圖 2**,顯示損失函式有它自己的曲線和可以用做為指南,來調整加權的漸層。遺失函式的曲線的斜率做為指南,並指向 [最小值。目標是要找出跨整個曲線,表示其中的類神經網路是最精確的輸入的最小值。

使用簡單的曲線損失函式的圖形
[圖 2 圖形的損失函式,使用簡單的曲線

在 [ [圖 2,來加入更多加權達到低點,然後開始將爬一次。線的斜率會顯示在曲線上,這代表最低遺失該最低點方向。當斜率為負數時,加入權數。當斜率為正數時,減去權重。特定的數量增加或減少以權數稱為學習速率。決定理想的學習速率盡可能藝術,因為它是一門學問。太大,此演算法可能衝過最小值。太低,定型會花太多時間。此程序稱為梯度下降。比較熟悉微積分錯綜複雜的讀者會看到其為何進行此程序: 決定損失函數的衍生項目。

很少,不過,只需要損失函式的圖形中的一個**[圖 2**。在實務上,有許多的尖峰和離峰期。所面臨的挑戰就如何尋找最小的高低點 (全球最少),並無法取得給騙了低點附近 (局部最小值)。在此情況下最好的方法是以隨機挑選沿著曲線的點,然後繼續進行梯度下降先前所述程序,因此詞彙 「 隨機梯度下降 」。 如需此程序的數學概念的絕佳的說明,請觀看 YouTube 影片中,「 梯度下降如何類神經網路的深入了解 |深度學習,第 2 章"在youtu.be/IHZwWFHWa-w

大部分的情況下,此層級的類神經網路架構已被主要抽離 Keras 和 TensorFlow 等程式庫。如同任何軟體工程的努力,了解基本概念時,一律可協助所面臨的挑戰,欄位中。

將理論上,若要練習

在上一個專欄中,我必須處理 MNIST 位數從頭開始建立類神經網路。啟動問題產生的程式碼基底是適合用來說明類神經網路架構的內部運作方式,但步驟很不切實際上移一層。有許多架構和程式庫現在可執行相同的工作,以較少的程式碼。

若要開始,開啟新的 Jupyter notebook 並輸入下列內容到空白儲存格並加以執行以匯入所有必要的程式庫:

import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
import matplotlib.pyplot as plt

請注意,此資料格的輸出會聲明 Keras 使用 TensorFlow 後端。因為 MNIST 類神經網路範例太常見,Keras 一部分的 API,其包含,而且甚至會將資料分割成定型集和測試集。將下列程式碼寫入至新的儲存格,並執行它,以下載資料並將它讀入適當的變數:

# import the data
from keras.datasets import mnist
# read the data
(X_train, y_train), (X_test, y_test) = mnist.load_data()

一旦輸出會指出下載檔案之後,使用下列程式碼簡單檢查定型及測試資料集:

print(X_train.shape)
print(X_test.shape)

輸出應該閱讀 x_train 資料集有 60,000 的項目,和 x_test 資料集有 10,000 個項目。同時包含 28 x 28 矩陣的像素為單位。若要查看特定的映像的 MNIST 資料,請使用 MatPlotLib 轉譯映像為下列程式碼:

plt.imshow(X_train[10])

輸出應該看起來手寫"3。 」 若要查看測試資料集的內容,請輸入下列程式碼:

plt.imshow(X_test[10])

輸出會顯示一個零。任意嘗試變更索引編號和資料集進行探索的影像資料集。

將資料成形

如同任何 AI 或資料科學專案中,輸入的資料必須重繪以符合演算法的需求。影像資料必須扁平化成一維的向量。每個映像為 28 x 28 像素,1 (28 x 28) 或由 784 1 將會是一維的向量。新的儲存格中輸入下列程式碼,並執行 (請注意,這不會產生輸出文字):

num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')

像素值從 0 到 255 的範圍。若要使用它們,您必須加以正規化到零和一之間的值。若要這樣做,使用下列程式碼:

X_train = X_train / 255
X_test = X_test / 255

然後輸入下列程式碼,看看哪些資料現在的樣貌:

X_train[0]

輸出會顯示零和一之間的 784 值的陣列。

取得手寫數字的各種映像中,然後判斷何種它們所代表的號碼分類工作。之前建立的模型,您必須分割成類別目錄的目標變數。在此情況下,您知道有 10 個,但您可以在 Keras 使用 to_categorical 函式,即可自動決定的。輸入下列程式碼,並執行它 (輸出應該會顯示 10):

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
num_classes = y_test.shape[1]
print(num_classes)

建立、 定型和測試的類神經網路

既然已成形並備妥資料,就可以建置使用 Keras 的類神經網路。輸入下列的程式碼,以建立函式,建立具有 num_pixels (或 784) 的輸入的層神經元的三個層級的循序的類神經網路:

def classification_model():
  model = Sequential()
  model.add(Dense(num_pixels, activation='relu', input_shape=(num_pixels,)))
  model.add(Dense(100, activation='relu'))
  model.add(Dense(num_classes, activation='softmax'))
  model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
  return model

比較這段程式碼的程式碼,從我的上一篇專欄 「 重頭 」 方法。您可能會注意到新的條款,像是 「 relu"或"softmax 」 啟用函式中參考。目前為止,我只探討了啟用 Sigmoid 函數,但有幾種啟動函式。現在,請記住所有啟用函式都壓縮輸入的值,藉由輸出介於 0 和 1 或-1 和 1 之間的值。

所有基礎結構就緒,就可以建置、 定型和評分模型。在空白儲存格中輸入下列程式碼,並執行:

model = classification_model()
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=0)

類神經網路執行時,請注意,每次反覆運算會卸除遺失值。因此,精確度也會改善。此外,記下的每個 epoch 所花來執行。完成後,請輸入下列程式碼,請參閱精確度和錯誤的百分比:

print('Model Accuracy: {} \n Error: {}'.format(scores[1], 1 - scores[1]))

輸出會顯示大於 98%的精確度和 1.97%的錯誤。

保存模型

既然已定型的模型以較高程度的精確度,您可以儲存供日後使用,來避免不得不重新定型模型。幸運的是,Keras 這麼簡單。新的儲存格中輸入下列程式碼,並執行:

model.save('MNIST_classification_model.h5')

這會建立二進位檔案的大小約 8 KB,且包含加權和偏差的最佳值。載入模型也很簡單 keras,就像這樣:

from keras.models import load_model
pretrained_model = load_model('MNIST_classification_model.h5')

此 h5 檔案包含模型,而且可以部署以及程式碼,以重新塑造和準備輸入的影像資料。也就是說,定型模型的冗長的程序只需要執行一次。參考預先定義的模型不需要耗費大量運算資源的程序的訓練,並在最終的生產系統中,類神經網路可以快速實作。

總結

類神經網路可以解決問題,有數十年 confounded 傳統的演算法。如我們所見,其簡單的結構會隱藏複雜度,則為 true。類神經網路的運作方式傳播轉送的輸入、 加權和偏差。不過,它是倒傳播網路實際上的學習位置判斷要對加權和偏差產生精確的結果明確的變更的反向程序。

學習,電腦方面來看,是要減少實際結果與正確的結果之間的差異。此程序將是既繁瑣又計算耗費資源,透過一個 epoch 執行所花費的時間,證明。幸運的是,這個訓練課程只需要進行一次而不是每個模型所需的時間。此外,我會探索使用的 Keras 來建置此類神經網路。雖然您可以撰寫建置全新的類神經網路所需的程式碼,就更容易使用現有的程式庫,例如 Keras,為您處理的每分鐘的詳細資料。


Frank La Vigne適用於在 Microsoft 擔任他能協助公司在 AI 技術解決方案專家來達到更充分運用他們的資料分析與 AI。他也共同主機何處播客。他的部落格定期位於 FranksWorld.com,您可以觀看他在他的 YouTube 頻道,"Frank 的世界電視 」 (FranksWorld.TV)。

感謝閱本篇文章的下列技術專家:Andy Leonard