分割数据
监督式机器学习的通常做法是:将数据集分成各个子集进行训练、验证和测试。其中的一种工作方式是:将80%的数据分配给训练数据集,而将其他的10%分配给验证和测试数据集。目前,大部分训练都是针对数据集进行的。在每一个epoch结束时,我们将针对验证数据集进行预测。
那些验证数据集中的错误,不但可以被用于识别停止的条件,并驱动超级参数的调优,而且可以帮助您确定目标模型是否对训练数据进行了过度的拟合。
对于测试数据集的预测通常是在最终模型上完成的。如果某个测试数据集从未被用于训练,我们有时则称之为holdout数据集。
作为其他常见的分割数据方案,交叉验证能够重复地将整个数据集分割成一套训练数据集,以及一套验证数据集。
机器学习库
在Python中,Spark MLlib(https://www.infoworld.com/article/3141605/review-spark-lights-up-machine-learning.html)和Scikit-learn(https://www.infoworld.com/article/3158509/review-scikit-learn-shines-for-simpler-machine-learning.html)都是机器学习库的最佳选择。在R语言中,常见的机器学习包有CARAT、randomForest、e1071和KernLab。而在Java中,您可以用到Java-ML、RapidMiner和Weka。
细说深度学习
作为机器学习的一种应用形式,深度学习在被训练模型的输入和输出之间存在着不止一个隐藏层。在大多数讨论场合中,深度学习意味着使用深度技术的神经网络。当然,除了神经网络,深度学习还会使用一些算法来实现其他类型的隐藏层。
“人工”神经网络的概念由来已久,它是由相互连接的阈值开关,构成了人工神经元网络,可以像动物大脑和神经系统(如:视网膜)那样学习识别模式。
Backprop
当两个神经元在训练中同时活跃(active)时,学习基本上是通过加强两个神经元之间的连接来实现的。在当前的神经网络软件中,最常见的方法是:使用一种称为误差反向传播(或称backprop、BP)的规则,来增加神经元之间连接的权值。
人工神经网络中的神经元
每一个神经元都拥有一个传播函数。该函数可通过加权来转换连接神经元的输出。传播函数将输出传递给激活函数,激活函数在输入超过阈值时就会被触发。
神经网络中的激活函数
在上个世纪40、50年代,人工神经元普遍使用的是被称为感知器(perceptrons)的一步式激活函数。如今的神经网络引入了诸如:逻辑函数、s形函数(sigmoid function)、双曲正切函数、修正线性单元(ReLU)等平滑激活函数。其中,ReLU虽然存在着“在学习率设置过高时,神经元会在训练中‘死亡’”的问题,但是它仍然是快速收敛的最佳选择。
激活函数的输出可以传递给某个输出函数,进行附加整形。不过,输出函数通常是恒等函数,因此激活函数的输出会直接被传递给连接在下游的神经元中。
神经网络拓扑结构
常见的神经网络拓扑结构是:
- 在前馈网络中,神经元可分为:一个输入层、n个隐藏处理层和一个输出层。每一层的输出都只会输入到下一层。
- 在具有快捷连接的前馈网络中,一些连接可以跳过一到多个中间层。
- 在递归神经网络中,神经元可以直接或间接地通过下一层来影响自己。
训练神经网络
神经网络的监督学习和其他机器学习类似:我们用一组训练数据来表示网络,将网络输出与期望的输出进行比较,以生成错误向量,接着根据错误向量再对网络进行修正。在应用纠正之前,那些共同运行的批量训练数据被称为epoch。
在实现细节上,相对于模型的权值和偏差方面的梯度,反向传播使用误差(或成本)函数,来发现正确的方向,从而最小化误差。因此,应用的正确性取决于优化算法和学习速率的变量。正如前面提到的,该变量通常需要足够的小,以保证收敛性,并避免造成ReLU神经元“死亡”。
神经网络的优化器
通常,神经网络的优化器会使用某种形式的梯度下降算法,来驱动反向传播。同时,它会用到一种避免陷入局部极小值的机制,例如:只优化那些随机选择的小批量(随机梯度下降),以及对梯度使用动量修正的方式。另外,一些优化算法(如:AdaGrad、RMSProp和Adam)还会通过查看梯度的历史,来调整模型参数的学习率。
与所有的机器学习类似,您需要根据一个单独的验证数据集,来检查神经网络的预测。如果不这样做的话,您所创建的神经网络可能只能记住输入的信息,而无法学习并成为广义的预测器。
深入学习的各种算法
一个针对真实问题的深度神经网络,可能由十多个隐藏层所组成,其拓扑结构也可能繁简不同。一般而言,网络中的层级越多,其优势是能够识别的特征就越多,而劣势则为计算所需的时间就越长,训练也就越困难。
卷积神经网络(CNN)常被用于机器视觉等应用之中。该网络通常使用卷积、池化、ReLU、全连接、以及丢失层来模拟视觉的皮层。其中,卷积层主要是对于许多小的重叠区域进行积分。池化层执行的是一种非线性的下采样(down-sampling)形式。ReLU层用到了非饱和激活函数f(x) = max(0,x)。在一个完全连接的层级中,神经元与前一层的所有激活都有联系。丢失层主要负责计算网络训练如何“惩罚”那些预测标签和真实标签之间的偏差,使用Softmax或交叉熵(cross-entropy)损失函数来进行分类,或使用欧式(Euclidean)损失函数进行回归。
递归神经网络常被用于自然语言处理(NLP)、序列处理、长短时记忆(LSTM)网络、基于注意力的神经网络。在前馈神经网络中,信息通过隐藏层从输入流向输出。这有效地限制了该网络一次性只能处理一个状态。
在递归神经网络(RNN)中,信息通过反复循环,让网络只记住最近的一次输出,以便对序列和时序进行分析。当然,RNN存在着两个常见的问题:爆炸性的渐变(我们很容易通过夹持来修复)和消失的渐变(不太容易修复)。
在LSTMs中,该网络能够用forgetting和gating来修改以前信息的权重,并记住它们。通过此类长、短期记忆,该网络解决了梯度消失的问题。同时,LSTMs也可以处理数百个过去输入的序列。
注意力模块是一些将权重应用到输入向量上的通用门。它的分层神经注意编码器(hierarchical neural attention encoder)使用多层注意模块,来处理成千上万的过去的输入。
虽然不属于神经网络,但是随机决策森林(RDF)对于一系列分类和回归问题也十分有用。由多个层级构成的RDF,能够输出单个树的预测统计平均值(一般为分类模式或回归平均值)。在随机方面,RDF对单个树使用引导聚合(也称为bagging),并针对树的特性进行随机取子集。
同样不属于深度神经网络的XGBoost (eXtreme Gradient boost),是一个可扩展的端到端树状增强系统。它在许多机器学习的挑战中都取得了先进的成果。不同于RDF,它的梯度树增强是从单个决策树或回归树开始的。通过优化,其后续的树是基于前续树的残留而构建的。
目前,业界公认最好的Python深度学习框架包括:TensorFlow、Keras、PyTorch和MXNet。Deeplearning4j是最好的Java深度学习框架之一。而ONNX和TensorRT则是用于深度学习模型的运行时(runtime)。
深度学习与机器学习的比较
一般而言,经典(非深度)机器学习算法的训练和预测速度,要比深度学习算法快得多。一到多个CPU足以训练一个经典的模型。而深度学习模型通常需要硬件加速器,如GPU、TPU或FPGA来进行训练,以及大规模的部署。如果没有它们,此类模型可能需要几个月的训练时间。
自然语言处理是深度学习的一个分支,它包括语言翻译、自动化摘要、协同参考解析、语篇分析(discourse analysis)、形态分割(morphological segmentation)、命名实体识别、自然语言生成、自然语言理解、词性标注、情感分析和语音识别等。
深度学习的另一个主要应用领域是图像分类。它包括:带定位的图像分类、目标检测、目标分割、图像风格转换、图像着色、图像重建、图像超分辨率和图像合成等。
此外,深度学习已经被成功地用于预测分子之间的相互作用,以帮助制药公司设计新药,搜索亚原子粒子,并将自动解析用于构建人脑三维显微镜图像等方面。
【原标题】Deep learning vs. machine learning: Understand the differences (作者: Martin Heller )
原文链接:https://www.infoworld.com/article/3512245/deep-learning-vs-machine-learning-understand-the-differences.html