2019 年 2 月

第 34 卷,第 2 期

此文章由机器翻译

[人工智能]

深入了解神经网络

通过Frank La La |2019 年 2 月

Frank La Vigne神经网络是很多高级的人工智能 (AI) 解决方案的基本元素。但是,很少人取消 derstand 这一概念的核心数学或结构化基础。虽然初始研究神经网络返回日期数十年来,它不是直到最近的计算能力和训练数据集的大小进行它们实际供常规使用。

神经网络或更具体地说,人工神经网络,松散会基于在整个系统中枢的动物的生物神经网络的影响。时未一个算法本身,神经网络是框架的一种类型,用于算法来处理输入并生成"学习"的输出。神经网络已证明自己执行传统的编程方法必须解决严重困难的任务非常有用。虽然有几个不同的变体的神经网络,但它们都共享相同的核心结构和概念。存在框架,如 Keras,使其更易于实现和隐藏许多实现细节。但是,我永远不会完全由于电源和神经网络的优点之前我不得不手动程序之一。将在本专栏的目的: 若要从零开始与 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)

Z,加权和的值为 2.13。回想一下,下一步是通过激活函数运行此值。接下来,输入以下代码到新的单元格创建激活
函数,并执行它:

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 数据集质询可以很好地说明了神经网络上具有不理解数十年来的传统算法方法的任务是多么容易。

下面是汇总,给定一个 28 x 28 像素的灰度图像的神经网络必须了解要读取为正确的值的手写数字的问题。该 28 x 28 像素的图像包含 784 介于 0 与 255,使其可以想象的输入层结构之间的单个数字值。输入的层包含 784 神经元通过激活函数,以确保值为 0 和 1 之间传递值。因此,较浅的像素将具有值接近于其中一个,并且较暗的像素将具有值接近于零。输出层包含 10 个神经元,一个用于每个数字。最高值神经元表示答案。例如,如果为八个神经元具有最高的激活函数值,然后神经网络已确定 8 是输出值。

只需添加两个隐藏的层,借助 32 神经元,都会有很大的影响。因此,如何?请记住,每个神经元连接到在上一层和下一层中的每个神经元。这意味着有 784 x 32 中的第一层的权重,第二个层中的 32 x 32 权重,第三个层中的 32 x 10 权重。也有 32 + 32 + 10 个偏差值,则需要进行添加,也。从而得出总计的 26,506 可调整值,并在三层的神经网络、 刚好超过 26,506 权重和偏差的相对较简单示例。实际上,这意味着有 26,506 参数来进行调整,以实现理想的输出。很好的可视化效果和
此结构,它监视背后的强大功能的说明",但什么 * 是 * 神经网络? |深度学习,章 1"在 YouTube 上的视频bit.ly/2RziJVW。并且使用神经网络实现的交互式体验,务必要签出playground.tensorflow.org

请记住,实际的神经网络可能跨数百个层具有成千上万的神经元。它是此大量参数的数量,使其出使能够执行传统上被超出的计算机程序的功能的任务的神经网络。与所有这些"旋钮和调节盘"它有一些想知道如何将这些相对简单
结构可以处理有许多任务。这也是为什么神经网络进行定型需要如此多的处理能力,使得 Gpu 非常适合用于这种大规模并行计算。

生成神经网络

结构和所述的数学原理,就可以构建出神经网络。输入中的代码图 2到新的单元格并执行它。初始化神经网络函数可以简化多层的神经网络的创建过程。

图 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 方面表现很好,但是,其中是受到广泛支持的框架,如 Keras,以使神经网络的创建更简单的可用性。


Frank La Vigne是 Microsoft 作为 AI 技术解决方案专业人员,他帮助各家公司获益更多通过充分利用其数据与分析和 AI。他还共同主持 DataDriven 播客。他定期博客,您可以看到他在他的 YouTube 频道"Frank's World TV"(FranksWorld.TV)。


在 MSDN 杂志论坛讨论这篇文章