人工神经元模仿生物神经元的基本功能,就像它们的生物学对应物一样,它们仅在连接到称为人工神经网络的较大网络时才有用。神经网络可以模仿人脑的基本构成要素,但是,当连接到较大的网络时,人工神经元不会继承其生物学对应物的“通用情报”能力。甚至最大数量的人工神经元集合也不是聪明的。人工神经网络只能执行特定任务。
神经网络在某些任务中可以达到80%以上的精度
神经网络非常擅长识别模式,这就是模式识别是近年来它们如此广泛使用和讨论的原因。神经网络发现和识别模式的能力使它们远远超越了计算机科学中的传统方法,使其可用于研究和商业。
这种模式识别能力可用于解决各种各样的问题。本书后半部分的项目之一是情感分析,这是自然语言处理的分类问题。一串文字是肯定的,中性的还是否定的?首先,这个问题似乎很简单,但是该算法必须遍历人类语音中的细微差别。讽刺和其他复杂的语言细微差别会模糊机器的问题。尽管如此,在情感分析和观点挖掘任务中,神经网络仍可以达到70%以上的准确性,而最先进的神经网络可以达到80%以上。与使用人类对情感进行分类相比,这足以提供优势。
人工神经元
下图显示了说明单个生物神经元功能的单个生物神经元从其他神经元的树突接收输入信号,并沿其轴突发送输出信号,该轴突分支并连接到其他神经元。在上图中,输入信号用x0表示,当该信号“行进”时,它会w0 x0
根据权重变量(w0
)相乘()。权重变量是可学习的,并且权重强度和极性(正负)控制信号的影响。通过将信号输入与权重(∑i wi xi + b
)相加来确定影响,然后由激活函数f计算权重(),如果该值高于神经元触发的某个阈值。以下是简化图。
![](https://img.haomeiwen.com/i15863171/5214ab250bbbd4a7.png)
求和
希腊字母sigma ∑
用于表示求和,可以认为这类似于编程中的for循环。
![](https://img.haomeiwen.com/i15863171/836500af6206cfa6.jpg)
人工神经元的类型
我们暗示了存在用于不同目的的不同类型的神经元。在本节中,我们将讨论构成神经网络的不同类型的神经元。网络不必拥有每种类型的神经元,某些神经元可以有多种用途。
神经元命名约定在来源,行业和背景不同的人之间有所不同。神经元也可能被称为单位或节点。它们只是同一事物的不同名称。
输入和输出神经元
输入和输出神经元可以被认为是占位符,它代表传递到网络中的信息和从网络中以矢量或数组形式处理的信息。这些向量通常包含浮点数。向量中元素的数量等于输入神经元的数量。
![](https://img.haomeiwen.com/i15863171/27f8e2284a819538.jpg)
隐藏的神经元
隐藏的神经元位于网络中间,被其他神经元包围-它们从输入神经元或其他隐藏神经元接收输入,然后输出到输出神经元或隐藏神经元。它们永远不会连接到数据或自己产生输出。这是他们的定义特征。
![](https://img.haomeiwen.com/i15863171/1cf39820505076d6.jpg)
偏神经元
向网络中添加偏差可以通过允许程序员将激活函数曲线向左或向右移动来帮助网络学习,对此参数的微调会影响学习的成功。以下是包含偏向神经元的网络的示例。
该图显示了旨在计算XOR参数的神经网络。除输入层外,每个层都有一个附加的偏置神经元。在本章的后面,我们将构建并计算该网络的输出,并在scikit-learn中构建一个示例。
![](https://img.haomeiwen.com/i15863171/504fabdd1c2f7b45.jpg)
程序员如何横向移动激活功能的示例:
![](https://img.haomeiwen.com/i15863171/957d89d744826b29.jpg)
上下文神经元
上下文神经元存在于某些特定类型的神经网络中,并非在所有网络类型中都存在。例如,递归神经网络使用上下文神经元作为记忆的形式,以保留过去计算中的信息。他们试图模仿人脑内生物现象创造的环境。类比有助于使目的更明确;如果您过马路,并且听到汽车喇叭声,您可能会停下来,朝着噪音寻找危险。但是,如果您在体育比赛中听到热情的支持者发出的号角,则可以忽略它。您已经了解到喧闹的声音在过马路时很重要,但在其他情况下却毫无意义。
以下是递归神经网络架构的示例:
![](https://img.haomeiwen.com/i15863171/0c698d19b3f83289.jpg)
该网络类似于一个典型的网络,具有输入I1,两个隐藏的神经元和输出O1。另外,信息被复制并发送到C1和C2,它们提供来自先前计算的数据。
权重
权重变量使网络或程序员可以调整程序,使其更接近所需的输出。网络在训练迭代过程中以编程方式操纵权重,以随着网络学习而降低错误率。从讨论偏见的部分可以看出,偏见允许在图形上向左或向右操纵激活函数。重量允许操纵激活函数的梯度。
激活功能简介
人工神经元的发射频率由激活函数确定。它确定神经元将在什么阈值处发射。本节介绍了Sigmoid激活功能,以使人造神经元的操作更清晰。激活功能将在本节中进一步详细讨论。
![](https://img.haomeiwen.com/i15863171/1c2a7b3576ec76cb.jpg)
上图显示了Sigmoid激活函数,它将所有输入信号转换为0到1之间的正值。使用具有更大值或负值的其他激活函数会改变神经元的发射频率,并适合不同类型数据和目的。
实践练习
感知器
现代神经网络的基础由弗兰克·罗森布拉特(Frank Rosenblatt)于1956年创建,旨在模仿一种基本的生物神经元的结构,称为感知器。在本章开始的插图中可以看到这种架构。
对花进行分类Scikit-learn包含常用于算法测试目的的鸢尾花数据集,它已成为神经网络的“ hello world”数据集。我们的单层模型的目的是将虹膜数据集中的花朵分类为不同的类别。
通过Anaconda安装Scikit-learn我建议安装Anaconda,这是一个科学的python库,其中包括scikit-learn,其所有依赖项,matlibplot等。我们将使用与Anaconda捆绑在一起的jupyter笔记本(正式称为IPython Notebook)来运行我们的代码。
https://www.anaconda.com/download
如果您遇到问题,请参阅scikit-learn或anaconda文档。或者,如果与您现有的安装可能存在冲突,请考虑使用虚拟机并从头开始。
Jupyter笔记本
通过与Anaconda一起安装的Anaconda Navigator应用程序启动jupyter笔记本。
在已启动的jupyter Web界面中创建一个新的Python笔记本。
现在我们可以编写python并在Web界面中实时运行它。
导入依赖项
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from matplotlib.pyplot as plt
Iris数据集
Iris数据集由150个样本组成,每个样本具有四个特征,可测量萼片和花瓣的长度和宽度(以厘米为单位),以及三个鸢尾花(鸢尾,鸢尾和杂色鸢尾)的50个样本。1936年,该数据集首次在英国统计学家和生物学家罗纳德·费舍尔(Ronald Fisher)的研究文章中首次亮相。
与更复杂算法所需的数据集相比,虹膜数据集较小,例如,在深度学习中,卷积神经网络需要数以万计的数据点才能有效学习。
斜体字表示控制台输出的注释或文本。
#Load the Iris dataset
iris = datasets.load_iris()
#Assign the data to vertices
x = iris.data
y = iris.target
让我们看一下我们将要处理的数据。
x指数:
#Print the first five features (the four measurements in a 2D array)
x[:5]
输出:
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3\. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5\. , 3.6, 1.4, 0.2]])
y指标:
#Print all 150 indices of x axis (the class of each sample)
y[:150]
输出:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
神经网络要求将数据表示为浮点数。这允许基础实现内的各种计算使用小数点高精度。浮点数可以简单地以比整数允许的十个表示更好的粒度表示数据。通过查看本节开始处的带注释的神经元插图,可以了解这一点。
用x表示的2D数组代表四列:隔片长度,隔片宽度,花瓣长度和花瓣宽度。
可视化数据集
现在让我们可视化数据集,以更好地了解数据集的实际描述。
#Import dataset
iris = datasets.load_iris()
X = iris.data
y = iris.target
plt.figure(2, figsize=(8, 6))
plt.clf()
#Plot graph
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xticks(())
plt.yticks(())
plt.show()
![](https://img.haomeiwen.com/i15863171/065cc66984b21d3a.jpg)
该图显示了三种样品类型的分布,按特征中的两个特征(萼片宽度和萼片长度)分类。随意更改代码并以不同方式可视化数据。
准备数据
我们需要预留一些数据集,以成为感知器接受训练的数据。训练完成后,就不再使用此数据-算法已经从该信息中看到并学习到了,并且无济于事,因为已经知道了答案。
#Set aside 30% of the data set for training
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
该StandardScaler()
函数将数据集中的所有特征标准化,以具有零均值和单位方差,以确保所有特征均呈正态分布。许多预测算法要求将数据集标准化,否则其行为将不可预测。
#Train the scaler, which standarises all the features to have mean of zero and unit variance
sc = StandardScaler()
sc.fit(x_train)
现在,我们将缩放器应用于拆分数据集的每个部分。
#Apply the scaler to the X training data
x_train_std = sc.transform(x_train)
#Apply the SAME scaler to the X test data
x_test_std = sc.transform(x_test)
Scikit-学习感知器
在这里,我们使用该Perceptron()
函数调用具有以下参数的感知器对象:
max_iter
设置为在数据集上最多进行50次迭代,这些迭代也称为时期。请记住该词,因为如果您打算阅读其他文章,将这些词互换使用可能会造成混淆。
eta0
是一个常数值,乘以更新。这将确保值更改并且不会停滞,可以将其视为偏差。
verbose
是一个布尔值标志,当设置为1时,它将为每个时期打印信息。
#Create a perceptron object with 50 iterations over the data set, and a learning rate of 0.3
ppn = Perceptron(max_iter=50, eta0=1, verbose=0)
#Train the perceptron
ppn.fit(x_train_std, y_train)
Perceptron(alpha=0.0001, class_weight=None, eta0=1, fit_intercept=True,
max_iter=50, n_iter=None, n_jobs=1, penalty=None, random_state=0,
shuffle=True, tol=None, verbose=0, warm_start=False)
#Apply the trained perceptron on the X data to make predicts for the y test data
y_pred = ppn.predict(x_test_std)
结果
#Print the predicted y test data
y_pred
array([1, 2, 2, 1, 1, 0, 2, 2, 1, 2, 2, 0, 2, 1, 1, 2, 1, 0, 0, 1, 2, 1,
2, 2, 1, 1, 0, 2, 2, 2, 0, 1, 1, 0, 0, 1, 1, 1, 2, 2, 0, 1, 1, 1,
1])
#Print the true y test data
y_test
array([1, 2, 2, 1, 1, 0, 2, 1, 1, 2, 2, 0, 2, 1, 1, 2, 1, 0, 0, 1, 2, 0,
2, 2, 0, 1, 0, 2, 2, 2, 0, 1, 1, 0, 0, 1, 0, 1, 2, 2, 0, 1, 0, 1,
1])
#Print the accuracy of the implementation
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
Accuracy: 0.89
最简单的神经网络的这种实现实现了高精度。在多次运行中,它的精度在0.89到1.00之间,换句话说,它的精度在89%到100%之间。
这是通过scikit-learn文档中建议的参数设置实现的。但是,对参数进行反复试验可能是机器学习中的一种重要方法,因此不要害怕进行实验。始终考虑内部如何使用参数,它们如何影响数据并进行实验以查看更改参数实际上如何影响结果。
尝试自己更改参数,以了解如何影响精度。请参阅scikit-learn感知器文档以查看您可以操纵的其他参数。超参数操纵是调优和充分利用神经网络实现的重要部分,当您阅读本书的各章时,您将学到更多关于不同参数的知识,并继续尝试实际操作。在“调整和评估神经网络”一章中也详细讨论了调整。
附录1:Scikit学习型感知器
通过提供其他人编写的常用应用程序,创建了程序库来使程序员的生活尽可能轻松。以此为主要目的,图书馆可能无法直接从教科书中实现算法。此外,由于创建库时会考虑模块化,因此其底层实现可能比预期的要复杂。
Scikit-learn的感知器没有什么不同。该Perceptron()
函数共享SGDClassifier()函数的基础实现,因此其功能不同于传统的简单感知器。例如,传统的感知器要求数据必须是线性可分离的,即要能够干净地分离而不会重叠-想象一下一条图形,其中有一条直线在每一侧将两组不同的数据点分开。
SGDClassifier()
利用随机梯度下降(SGD)学习算法实现正则化线性模型。SGDClassifier(loss=“perceptron”, eta0=1, learning_rate=“constant”, penalty=None)
等同于Perceptron()
。
附录2
最后一点变得有点复杂,所以让我们分解一下。“ SGDClassifier()
利用随机梯度下降(SGD)学习算法实现正则化线性模型”
通过使用两种方法L1或L2之一向损失函数增加惩罚,使模型参数向零矢量减少,在图形上为0.0进行正则化。正规化可提高网络效率。这将在“训练神经网络”一章中详细讨论。
线性模型,是指一种基于特征特征的线性组合定义类别的分类器模型。这是通过将一组特征乘以一个常数并将结果相加而创建的数学表达式。X1 w1 + b
随机梯度下降(SGD)是一种反向传播学习算法,其基于批处理的值计算梯度,目的是减小梯度(想象一个学习速率梯度逐渐减小的图),从而实现梯度下降。该算法将数据分为几批,并对梯度求和并更新权重,类似于反向传播。
网友评论