2019 年 2 月

第 34 卷,第 2 期

本文章是由機器翻譯。

[人工智慧]

進一步探討神經網路

藉由Frank La La |2019 年 2 月

Frank La Vigne類神經網路是許多進階的人工智慧 (AI) 解決方案的基本元素。不過,少數人取消 derstand 核心數學或結構化支援,這個概念。初始的研究,在類神經網路傳回日期的約有十年,而不是直到最近的運算能力和訓練資料集的大小進行這些一般用途的實用。

類神經網路或更具體來說,人工類神經網路,鬆散根據在動物的大腦生物神經網路。不演算法時,類神經網路是一種架構,可用於演算法來處理輸入資料並產生 「 學習 」 的輸出。類神經網路,已證明自己在執行傳統的程式設計方法有嚴重的問題解決的工作很有用。雖然有數個各種不同的類神經網路,但它們都共用相同的核心結構和概念。有諸如 Keras,旨在使其更容易實作,以及隱藏許多實作詳細資料。不過,我絕對不會完全 grasped power 和類神經網路的優點之前我必須以手動方式程式設計其中一個。這會是此資料行的目標: 簡單的類神經網路,使用 Python 從頭建置。

神經與類神經網路

之前建置全新的類神經網路,請務必了解它的核心元件。每個類神經網路是由一系列連接的節點,稱為 「 神經所組成。接著,每一個神經都是分層排列網路的一部分。在每個圖層中的每個神經元會連接到下一層的每個神經元。每一個人的神經會接受一系列的輸入,並計算的加權的總和值。神經會啟動,或不為基礎的啟用函式會接受所有的輸入的值和偏差以及加權,並計算數字的輸出。此號碼是介於-1 和 1 或 0,1,取決於啟用函式的類型的值。這個值會接著傳遞給其他已連線的神經到下一層稱為正向傳播的程序中。

與圖層中,有三種基本類型: 輸入層,隱藏層和輸出層級。輸入的層代表輸入的資料,而輸出層包含的輸出。隱藏的層會判斷的深度類神經網路 — 這是 「 深度學習 」 一詞來自何處。在實務上,類神經網路可以有數百個隱藏層級,只有上限所提供的處理能力。

正向的傳播

正向傳播是哪些資料會流經輸入層至輸出層的類神經網路的程序。它牽涉到計算所有輸入的加權的總和,並納入偏差值。計算加權的總和後, 接著會透過啟用函式執行。使用在神經**[圖 1**為例,神經都有兩個輸入,x1,x2,以及兩個權數、 w1 和 w2。加權的總和由 z,值時代表值計算出來的啟用函數由經過加權總和的值。您應該記得啟用函式的目標是要壓縮的神經元輸出之間範圍的值。偏差被加入微調神經的敏感度。

類神經網路中轉送傳播[圖 1 中的類神經網路的正向傳播

為了說明這點,可能最好瀏覽程式碼。為了讓事情清除,我將使用完全相符的變數名稱與在**[圖 1**。先啟動 Jupyter Notebook (如需的詳細資訊,請前往此處: msdn.com/magazine/mt829269),然後在空白儲存格中輸入然後下列並執行:

x1 = .5
w1 = .2
x2 = 4
w2 = .5
b = .03

z = x1 * w1 + x2 * w2 + b

print (z)

2.13 為 z 的加權總和的值。回想一下,下一個步驟是透過啟用函式執行此值。接下來,輸入新的儲存格,來建立啟用下列程式碼
函式,並執行它:

import numpy as np
def sigmoid_activation(weighted_sum):
  return 1.0 / (1.0 + np.exp(-1 * weighted_sum))
a = sigmoid_activation(z)
print(a)

輸出應該會顯示等於 0.8937850083248244。多層類神經網路中的值會傳遞至下一層。因此,某個圖層中的啟用會串聯到下一步] 而,最後,透過在整個網路。

Sigmoid_activation 傳回值介於 0 和 1,不論大小或數目的小型。輸入下列程式碼來測試它:

print(sigmoid_activation(1000000))
print(sigmoid_activation(.000001))

輸出應該讀取 1.0 和大約 0.50,分別。

如需數學常數 e 的詳細資訊,請參閱 Wikipedia 文章的主題 (bit.ly/2s8VL9Q)。

類神經網路的運作方式?

指定相對簡單的結構和類神經網路的數學運算,很自然地想知道它如何套用至各式各樣的 AI 問題。功能是在網路中,不一定是本身的神經元。類神經網路中的每一個神經都代表輸入的值、 加權和偏差的組合。經過訓練,就可以決定適當的權數和值。

到目前為止,您一定聽過有關 MNIST 資料集,通常用於做為一種"Hello World"類神經網路。我有看過數十次之前如何類神經網路的概念為我的作用最後按下。如果您不熟悉此問題,有許多線上範例細分,(請參閱varianceexplained.org/r/digit-eda)。MNIST 資料集挑戰妥善說明類神經網路,才會有 baffled 傳統演算法的方法,數十年的工作是多麼的容易。

以下是指定的類神經網路必須了解如何讀取為正確的值是手寫數字的 28 x 28 像素灰階映像摘要說明的問題。該 28 x 28 像素映像包含介於 0 到 255,方便您想像的輸入層結構 784 個別的數值。輸入的層包含 784 神經,透過啟用函數,以確保值為零和一之間傳遞的值。因此,較淺的像素為單位將會有值愈接近,其中一個,而且較暗的像素會有值愈接近零。輸出層是由 10 個的神經,一個用於每個數字所組成。具有最高值的神經代表答案。比方說,如果八個用於具有最高啟用函式值,然後在類神經網路判定八是輸出值。

只加入兩個隱藏的層的詳細資訊,32 的神經元,會有很大的影響。因此如何?確認每一個神經都已連線到上一層和下一層中的每個神經元的重新叫用。這表示有 784 x 32 加權,在第一層、 32x32 加權,在第二個層中,而第三個層中的 32 x 10 加權。另外還有 32 + 32 + 10 個要加入,也需要的偏差。會產生總計 26,506 可調整的值,並在三層的類神經網路,剛好超過 26,506 加權和偏差的相對較簡單範例。實際上,這表示有 26,506 參數調整,以達到最理想的輸出。絕佳的視覺效果和
說明此結構和監看式,其背後的動力 」 那 * 為 * 的類神經網路嗎? |深度學習在 YouTube 上的一章 1 」 視訊bit.ly/2RziJVW。進行互動式與類神經網路的實驗,記得一定要看看playground.tensorflow.org

請記住真實世界的類神經網路,可能橫跨數百個圖層會有數十萬的神經。它是此相當數量的參數,好能力來執行工作,向來以外的電腦程式的功能可讓類神經網路。與所有這些 「 旋鈕和撥出 」 它有一些想知道如何使用這些相對簡單
結構可以處理這麼多的工作。這也是為什麼定型類神經網路需要這麼多的處理能力,並讓 Gpu 很適合用於這種大量平行計算。

建立類神經網路

結構和說明的數學運算,就可以開始建置的類神經網路。輸入中的程式碼**[圖 2**到新的儲存格,然後執行它。Initialize 類神經網路函式可簡化多層的類神經網路的建立。

[圖 2 建立的類神經網路

def initialize_neural_network(num_inputs, num_hidden_layers, 
  num_nodes_hidden, num_nodes_output):
    
  num_nodes_previous = num_inputs # number of nodes in the previous layer

  network = {}
    
  # Loop through each layer and randomly initialize 
  # the weights and biases associated with each layer.
  for layer in range(num_hidden_layers + 1):
        
    if layer == num_hidden_layers:
      layer_name = 'output' 
      num_nodes = num_nodes_output
    else:
      layer_name = 'layer_{}'.format(layer + 1) 
      num_nodes = num_nodes_hidden[layer] 
        
    # Initialize weights and bias for each node.
    network[layer_name] = {}
    for node in range(num_nodes):
      node_name = 'node_{}'.format(node+1)
      network[layer_name][node_name] = {
        'weights': np.around(np.random.uniform(size=num_nodes_previous), 
          decimals=2),
        'bias': np.around(np.random.uniform(size=1), decimals=2),
      }
    
    num_nodes_previous = num_nodes

  return network

若要建立 10 個的輸入、 兩個輸出,與具有 32 節點的五個隱藏的層的類神經網路,請在空白儲存格中輸入下列程式碼,並執行:

network1 = initialize_neural_network(10, 5, [32, 32, 32, 32, 32], 2)

若要建立具有的結構,以符合先前所述來解決 MNIST 挑戰的類神經網路的網路,調整 [參數,如下所示:

mnist_network = initialize_neural_network(784, 2, [32, 32], 10)
print(network1)

此程式碼會建立類神經網路使用 784 輸入的節點、 具有 32 個節點,兩個隱藏的層和輸出層的 10 個節點。請注意,輸出會顯示網路以 JSON 格式。也請注意加權和偏差會初始化為隨機值。

瀏覽類神經網路

到目前為止,我們有結構的類神經網路,但還沒做任何動作。現在,讓我們建立一些輸入 network1,其中包含 10 個輸入的節點,就像這樣:

from random import seed
np.random.seed(2019)
input_values = np.around(np.random.uniform(size=10), decimals=2)

print('Input values = {}'.format(input_values))

輸出會是 10 個隨機的值將做為類神經網路的輸入值的 numpy 陣列。接下來,若要檢視的加權和偏差的第一層的第一個節點,輸入下列程式碼:

node_weights = network1['layer_1']['node_1']['weights']
node_bias = network1['layer_1']['node_1']['bias']

print(node_weights)
print(node_bias)

請注意,有 10 個值的加權和偏差的值。接下來,輸入下列的程式碼,以建立計算的加權的總和的函式:

def calculate_weighted_sum(inputs, weights, bias):
  return np.sum(inputs * weights) + bias

現在請輸入下列程式碼,計算並顯示此節點的加權的總和 (z):

weighted_sum_for_node = calculate_weighted_sum(inputs, node_weights, node_bias)
print('Weighted sum for layer1, node1 = {}'.format(
  np.around(weighted_sum_for_node[0], decimals=2)))

傳回的值應該是 3.15。接下來,使用 sigmoid_activation 函式來計算這個節點的值,如下所示:

node_output_value  = sigmoid_activation(weighted_sum_for_node)
print('Output value for layer1, node1 = 
  {}'.format(np.around(node_output_value[0], decimals=2)))

此節點的最終輸出值是 」 0.96。它是這個值會傳遞至下一層中的所有各神經元。

請放心試驗,逐一查看的全球不下 5,600 個節點,在此網路中的任何一個。或者,您無法在這些節點,以取得大量計算的重視,類神經網路中的每個重複我所述的步驟。當然,這是更好以程式設計方式執行的工作。我將討論這,以及如何訓練類神經網路中下一個資料行。

總結

類神經網路會導致驚人的 AI 和已套用至例如語音辨識和電腦視覺困難的實際問題,大舉成功。雖然其結構可能很複雜,它們是由相對簡單的建置組塊。神經會安排在類神經網路中的圖層,每一個神經會將值傳入。輸入的值因此重疊顯示透過整個網路,而且會影響輸出。

神經本身都很簡單,並執行基本數學函式。它們會成為功能強大,不過,當彼此之間的連線。大量的可更簡單的類神經網路的值提供極大的輸出的控制權,並可以派上用場訓練。

雖然這篇文章著重於建置在 Python 中的類神經網路,幾乎任何程式設計語言可用來建立類神經網路。在 JavaScript 中,完成這個範例線上C#、 Java 或任何數目的現代程式語言。Python rest,不過,其中是廣受支援的架構,例如 Keras,讓建立類神經網路更簡單的可用性。


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


MSDN Magazine 論壇中的這篇文章的討論