神经网络实践指南

神经网络是近年来非常热门的技术,给很多领域带来了技术革新,然而,学习并在实践中应用神经网络技术并非易事,它既涉及复杂的数学概念和公式,也牵涉到计算机编程方面的知识,同时还需要一定的软硬件环境支持。本文综合各方资料,旨在提供一种最具可行性的实践神经网络的思路。

在Mathematica中学习神经网络

热门的神经网络框架有很多,比如Tensorflow、MXNet、Torch等,它们大多使用Python语言。然而这里,我们另辟蹊径,使用Wolfram公司的商业软件Mathematica来进行入门学习和实践,原因如下:

  • Mathematica提供了集成的软件环境,无需安装其它软件,甚至数据和预训练好的模型都可以直接在软件内下载,大大节省了我们的时间。
  • Mathematica的语法非常简单,很接近我们日常使用的自然语言,大多数时候我们都可以直接通过函数名知道其作用,而交互式的执行方式可以让我们实时查看计算结果。
  • Mathematica提供了非常完善的中文文档和案例支持,对输出结果可以提供智能联想,方便我们随时学习新的函数的使用方法。

在Mathematica中用上一个神经网络有多简单呢?我们来看经典的MNIST手写数字识别问题。【参考软件内置的教程“神经网络简介”】

直接使用预训练的模型

第一步,获取预训练神经网络模型

在搭建自己的神经网络模型之前,我们先使用现有的模型。我们可以通过如下代码直接从Wolfram Neural Net Repository中下载预训练的LeNet模型:

lenetModel=NetModel["LeNet Trained on MNIST Data"]

第二步,使用模型

获取的模型可以像MMA中的任意函数一样,直接作用于新的图片。

这样,我们就像“把大象放进冰箱”,完成了最基本的使用神经网络这一任务。对于初学者来说,在其它语言环境中,完成这一任务可能都是一个艰巨的挑战,搭建各种语言环境就像造一台新的冰箱一样会耗费我们很多经历。

自然,我们想知道这里面发生了什么,让我们深入最为关键的NetModel一探究竟。

深入NetModel

收起状态下,一个NetModel图标会显示输入、输出接口的类型及对应层数,点击NetModel图标上的加号,我们可以看到其具体内部组成。

我们可以看到,一个Net是由众多Layer以及Input和Output组成。每一层都有对应的类型(class, vector, tensor)和尺寸。我们来一一理清其组成成分的含义。

层-Layer

毫无疑问,层是神经网络最核心同时也是最复杂的部分,Input和Output可以看作连接层的接口,其上会分别挂载编码器和解码器,用于将文件格式与数学编码相互转换。那么什么是层?

  • 层是作用在数值张量上的运算,它会产生另一个张量(向量、矩阵可看作张量的特殊情况)。
  • 大多数层只有一个输入和输出,少数层会有多个输入和输出。
  • 层与层可以连接成一条链(对应NetChain函数)或者有向无环图(对应NetGraph函数)。
  • 层中含有可学习的参数,用于在训练过程中调整。

上图展示了一个ConvolutionLayer的内部参数。每一类层根据它们对张量所进行的操作,所需的参数都不尽相同。红色的参数名表示该参数需要进行初始化之后,该层才能执行运算。

上图展示了另外一种常见的层,ElementwiseLayer。这一名称表明它将函数作用于每一个元素。这一层通常被用来应用激活函数。

MMA中目前支持的层类型如下:

层是网络的组成单元,要组成NeuralNet,可以通过NetChain或者NetGraph连接起来。二者的区别在于,NetChain只能有一个输入和输出,而NetGraph可以指定多个。

训练

一个未经训练的NetModel无法作用于实际数据。我们可以将神经网络看作一个灵活的万能模具,而待解决的实际问题可以抽象成一个具体的函数。训练的目的就是用数据微调模具,直至其接近所需的函数。用于训练的数据往往由输入、输出对组成。如果是具有多个输入和输出的模型,可以使用Association或者Dataset数据类型。

训练一个神经网络的基本目标是找到损失函数的最优值所对应的参数。使用的具体算法包含两个核心思想:反向传播和梯度下降。

  • 反向传播的含义是在神经网络中反方向传播误差\epsilon,并在每一个参数\phi上计算梯度\partial\phi/\partial\epsilon
  • 然后按照公式\phi \to \phi - r\partial \phi /\partial \epsilon更新参数,这被称为梯度下降,而r叫做学习率。
  • 在实际应用中可能会使用更复杂的参数优化算法,比如Adam等。

不同的噪声或者问题类型倾向于使用特定的损失函数层,而在Mathematica中,损失函数由NetTrain函数自动选择。

更多关于使用Mathematica进行机器学习的文章请参考该知识库页面

广告

0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论