让我们思考一下我们的大脑是如何工作的,特别是神经元如何相互交换信息。
神经元是由包含细胞核的细胞体和称为树突的几个分支和称为轴突的长延伸组成的神经细胞。神经元通过突触接收电脉冲,突触连接到其他神经元的树突。
将大脑架构视为构建智能机器的灵感是实现这种结果的最明显方式。这是创建人工神经网络的主要思想。
深度学习并不是试图创建人脑的副本,而是计算神经科学的责任。然而,它使用通过神经网络共享信息的概念来解决复杂的问题。人类的大脑是最聪明的系统,大脑的能量效率大约是每秒10-16焦耳(J),而目前最好的计算机的能量效率约为每秒6 - 10焦耳(J)。
在现实世界中使用的人工智能应用中最大的困难是我们可以观察到的数据变化。例如,假设我们必须创建一个应用程序来识别汽车的颜色,在白天,你可以看到汽车的颜色是红色的,但是在晚上,这个像素与黑色非常相似。
深度学习尝试通过将应用程序分解为几个更简单的步骤来解决此问题。这允许计算机从更基本的概念构建复杂的概念。
1、神经网络
进入计算领域,神经网络的实现遵循神经元使用的信息共享的相同概念。
神经网络是由简单处理单元组成的并行分布式处理器。这些单位存储实验知识。学习过程是通过机器学习算法,其功能是修改网络权重以实现最终目标。
1.1、Perceptron(感知器)
Perceptron是最简单的神经网络架构之一,用于对线性分离的模式进行分类。每个输入连接到突触权重和偏差(x = 1)。今天它没有被广泛使用,因为还有其他更高效的架构,但它是理解神经网络背后的数学函数的好方法。
那么Perceptron是如何训练的呢?在上面的例子中,Perceptron有输入(x)和相关的权重(w)。输出由以下方程确定:
将突触权重乘以输入值的加权和。
紧接着,应用激活函数,确定输出值。
每个输出神经元的值都是线性的,因此,Perceptron的架构无法学习复杂的模式。如果我们需要解决像XOR这样的问题,我们将不得不建立一个更强大的神经网络。
1.2、Multi-Layer Perceptron(多层感知器)
将MLP视为感知器,但更发达,有更多神经元。
MLP包含三个重要属性:
输入层:数据输入。提供网络的初始元素。
隐藏层:负责数据处理。它们之所以被称为隐藏层是因为它们与外部世界没有联系。隐藏神经元的功能是介于输入和输出层之间。通过添加一个或多个隐藏的神经元层,我们使网络能够提取更复杂的统计数据。
输出层:最终值输出。
同样的概念也适用于Perceptron,但没有隐藏层。
网络输入节点提供信息作为第二层(隐藏层)的输入。来自隐藏神经元的输出信号用作第三层的输入,依此类推。
输入和输出神经元的数量取决于所执行的任务的类型。对于隐藏的层,您可以根据需要创建任何层。通常的做法是声明具有相同数量神经元的所有隐藏层。然而,找到完美数量的隐藏层确实是一个挑战。
MLP通常用于分类问题,每个输出神经元代表不同的二进制类。
信号流遵循单一方向,因此该架构是前馈神经网络的示例。
深度神经网络和MLPs之间存在差异。深度神经网络具有两个或更多隐藏层。
2、通过神经网络解释知识
神经网络必须发挥的一个重要功能是识别其工作环境模型的模式。
在大多数情况下,我们处理监督学习,其中输入与输出相关联。具有每个关联对的一组输入和输出对被称为训练数据集。为了使这个想法更清晰,考虑数字化:MNIST。在该挑战中,输入由像素组成,每个图像表示从0到10的数字。神经网络必须接收这些像素并显示对应于该数字的输出。训练数据是在现实世界中所代表的各种数字。
神经网络中的知识解释问题与其架构有关。目前还没有关于如何找到应该与环境交互的正确架构的解释。找到完美匹配的唯一方法是通过试验。
3、如何训练神经网络?
神经网络的大部分研究都集中在他们从环境中学习和提高结果的能力上。神经网络通过一个交互的突触权重调整过程来学习它所处理的任务。
根据孟德尔和麦克拉伦的说法,我们将神经网络的学习定义为:
学习是一个过程,在这个过程中,神经网络的自由参数被一个环境刺激的过程所适应。学习的类型是由参数修改的方式决定的。
想象一个神经网络就像一个正在学习走路的孩子。在开始的时候,孩子会有很大的困难来平衡和站立,但是通过训练,这个任务将会变得越来越简单,随着时间的推移,它将会自动完成。
这是神经网络的主要思想,平衡其突触权重并尽可能接近真实值达到最终值。
3.1、成本函数
每当我们要训练神经网络时,选择适合模型的成本函数是很重要的。成本函数告诉我们神经网络错误率是多少。
在涉及神经网络的大多数问题中,通常使用交叉熵。此外,这些是一些最常用的成本函数:
- MSE ;
- MAE ;
- Hinge ;
3.2、训练
当我们从头开始我们的神经网络时,突触权重被随机初始化。在训练过程中,我们从性能不佳开始,并希望最终获得高精度。我们在开始时的成本函数将具有高值,这意味着我们存在大量错误,并且最终,当我们训练网络时,错误量将减少。
为了降低成本函数的值,我们引入了优化算法。有各种各样的算法优化器,我相信你已经听说过梯度下降。然而,让我们只关注随机梯度下降 - 在我们的网络中改进错误的优秀算法,它是基于对每个交互的训练数据的随机实例,并基于这些实例计算梯度。这使得算法非常快,因为它在每个交互中只处理少量的数据,而且是处理大量数据的一个很好的选择。
3.3、反向传播
反向传播算法允许函数的错误信息在整个网络中传播,使突触权重根据对错误的贡献而更新。这使得可以计算梯度。
4、激活函数
基本上,激活函数是用于确定输出的网络末端的附加神经元。
通常,激活函数将结果值映射到所需范围,例如0到1或-1到1等。(取决于激活函数的选择)。
4.1、使用哪种激活函数?
在大多数情况下,通常会看到使用ReLu激活函数,但不仅限于此。当您知道要处理的问题时,选择一个具有适合你的模型特征的激活函数。例如,在分类问题中使用sigmoid激活函数是很常见的,为了确定某个类的概率,经常使用softmax函数。
关于sigmoid激活函数是如何流行的一种好奇,是基于一些科学研究表明生物神经元使用这个激活函数,然而,像ReLu这样的激活函数在深度神经网络中显示出更好的速度性能。
5、XOR问题
为了清楚地使用神经网络,我们将使用深度学习对长期未解决的问题进行应用。XOR函数是使用两个二进制值(0和1)的操作。
目标是建立一个神经网络,能够在扭矩中返回相应的输出值。我们将使用TensorFlow来执行这个任务。
让我们从导入所需的库开始。
import numpy as npimport tensorflow as tf
我们需要将包含输入和输出值的表传递给代码。
binary_i = np.array([[0,0], [0,1], [1,0], [1,1]])binary_o = np.array([[0], [1], [1], [0]])
我们必须创建两个张量,在训练期间输入和输出值。
X = tf.placeholder(tf.float32, shape=(None, 2), name="X")y = tf.placeholder(tf.float32, shape=(None, 1), name="y")
我们现在可以定义神经网络的结构。
n_inputs = 2n_hidden1 = 3n_outputs = 1hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1-new