Advertisement

【深度学习】神经网络入门(最通俗的理解神经网络)

阅读量:

我们可以从回归(Regression)问题入手。我发现许多人在本吧讨论过为了达到强AI的目标,必须使机器能够识别并归纳出不同物体的特征这一观点。具体而言,我们需要让机器能够区分圆形、方形等基本形状,识别各种颜色和纹理,进而基于这些特征对某一现象进行分类或预测分析。这本质上就是回归问题的一种应用形式。

如何通过回归方法实现目标?人类通过视觉感知事物时能够迅速识别其主要属性。相比之下,在计算机看来,则仅能获取一系列数值数据。因此要让机器从事物的特征中找到规律,则转化为一个在数据中发现模式的问题。

这里写图片描述

假设存在一串数字序列,在已知其前六项分别为1, 3, 5, 7, 9, 11的情况下,请推导出第7项的具体数值是多少?

这里写图片描述

用曲线连接这几个点后,在沿着走向延伸的部分预测出了第七个数据点——7。
由此可见,在统计学中回归问题本质上属于一种曲线拟合(Curve Fitting)问题。
那么如何实现这一过程呢?机器无法像人凭直觉随意绘制一条完美无缺的曲线来完成这一任务;因此必须依靠特定算法来进行操作。
假设有若干样本点分布在某个规律上;让我举直线拟合的例子来说明这种算法的基本原理。
让我举直线拟合的例子来阐述这种算法的基本原理。

如果觉得这篇文章略微有些难度较大,或者希望系统地深入学习人工智能,我强烈推荐你看床长的人工智能教程。这份资源非常优秀,不仅通俗易懂,而且充满了趣味性和幽默感。点击这里即可访问该教程页面。

其实不复杂。任意画一条直线后持续旋转它,在每次转动时都需要计算每个样本点与其在直线上的投影之间的距离(误差)。求取所有样本点与相应投影点之间的距离之和作为总误差,在此过程中还需要不断调整直线的位置直至总误差达到最小值时停止。换一种说法是,在持续旋转的同时还需要不断调整直线的位置,在总误差逐渐减小的过程中一旦降到足够低(如0.0001),就可以完成训练(收敛)了。A为何如此?因为当总误差越来越小时相应的旋转或平移幅度也会随之减小直到最终稳定下来A一旦总误差降到足够低(如0.0001),就可以完成训练(收敛)了。

这里写图片描述

我们都知道,在解析几何中,一条直线的标准方程通常写作y = kx + b的形式。其中k表示斜率参数(即倾斜程度),而b则为纵轴截距项(即截距位置)。换句话说,在平面坐标系中通过调节k值的变化能够实现对直线倾斜程度的不同设置;而改变b参数则能够调整直线在纵轴上的位置高度。值得特别注意的是,在回归分析中梯度下降算法的核心在于逐步迭代更新这两个关键参数以实现误差最小化的目标。

在计算预测值与实际观测值之间的差异时,默认的做法是采用累加的方式计算平方差:即\sum{(预测值 - 观测值)}^2而非简单的线性差分累积\sum{(预测值 - 观测值)}。相比于仅计算简单差值并累加的方式而言前者更能有效反映数据间的离散程度并提供更为稳健的优化方向依据因此这种方法被统称为最小二乘法(Least Square Method)。

这里写图片描述

问题至此虽已初步得到解决,但事实上我们仍需探索适应各类曲线拟合的方法,因此仍需继续深入研究。
我们根据拟合直线不断旋转的角度(即斜率)以及相应的拟合误差绘制函数曲线,如图所示。

这里写图片描述

这里写图片描述

曲线每次旋转的大小叫做学习率(Learning Rate)。增加学习速率会加快拟合速度, 但若设置过高会导致曲线旋转过度而无法收敛. 实际上它是一个预先设定好的参数, 不会每次都调整.

注意:对于具有起伏不平误差函数曲线的情况,在梯度下降过程中可能会出现陷入局部最优解的风险。从图中可以看出,在第一个凹陷区域的最低点附近,切线可能会趋于水平。

这里写图片描述

微分是一种专门用于计算曲线切线的方法,在计算过程中所得到的结果即为该点处的切线斜率,并被称为导数(Derivative)。其常见的表达形式有dy/dx或f’(x)两种形式。在多元函数的情况下,在同时需要计算多个函数的切线时,则其中某条特定切线的方向系数即为偏导数(Partial Derivative),其符号表示为∂y/∂x。需要注意的是,在实际应用中,默认情况下我们处理的是涉及多个变量的情况,默认讨论的就是偏导数

此段主要阐述了线性回归模型(Linear Regression Model)的核心要素,在此基础上将直线方程转换为非线性的形式以适应不同类型的变量关系。从而衍生出包括二次项、三次项以及多项式形式在内的多种非线性模型。如图所示的是使用Excel进行数据拟合的强大工具。

这里写图片描述

在大多数情况下

这里写图片描述

当我们将一阶线性模型(直线方程)y = kx + b转换为二阶多项式模型(二次曲线方程)y = ax² + bx + c时,模型参数由原来的2个(k、b)增加到3个(a、b、c),而特征由1个(x)扩展为2个(x²和x)。采用高阶多项式模型(三次曲线及更为复杂的回归形式)将能够进一步增加数量上的参数与特征。

之前我们探讨了如何从一系列数据中提炼出其内在规律。在实际场景中,我们通常会通过多个指标或参数(这些指标可能涉及多串数据)来综合评估某一事件的发展态势。将每个原始属性或变量视为一个独立的维度,在这种情况下,在这种模型下所生成的特征数量急剧上升。具体而言,在这种情况下,生成的额外特征数量可以用公式N = D²/2来估算。例如,在D=100的情况下

下面是一副50×50像素的灰度图片,在采用二次多项式拟合的情况下,请问具备多少特征?——约达300万个特征

这里写图片描述

它的大小为50×50=2500像素点,其特征数量为(2500×2500)/2=3,125,000个。如果输入的是彩色图像,则其大小会扩展至原来的三倍大小(即76×76像素),相应的特征数量也将扩展至大约三千万个。

这里写图片描述

这么小的一张图片,就有这么巨大的特征量,可以想像一下我们的数码相机拍下来的照片会有多大的特征量!而我们要做的是从十万乃至亿万张这样的图片中找规律,这可能吗?
很显然,前面的那些回归方法已经不够用了,我们急需找到一种数学模型,能够在此基础上不断减少特征,降低维度。

于是,“人工神经网络(ANN, Artificial Neural Network)”就在这样苛刻的条件下粉墨登场了,神经科学的研究成果为机器学习领域开辟了广阔的道路。

神经元

有一种假设指出:"智能源于单一算法(One Learning Algorithm)"。如果该假设成立后,则意味着利用单一算法(如神经网络)来解决世界上千差万别的问题成为可能。人类无需为万事万物编写复杂的程序,就能采取"以不变应万变"的策略来应对各种挑战。越来越多的研究结果表明这种假设具有合理性。例如,在人类大脑发育初期的不同区域职责尚不明确的情况下——即大脑中负责声音处理的部分其实也可以承担视觉信息处理的任务——这进一步支持了这一观点。

下图是单个神经元(Neuron),或者说一个脑细胞的生理结构:

这里写图片描述

从数学模型的角度来看, 这一构造是对生物体内神经元的一种简化表示, 这种模型具有高度的真实感.

这里写图片描述

具体说明:在机器学习模型中,常数项的数值即为偏置项(Bias Units)。输入数据经由各输入特征按特定缩放系数进行加权处理后求和,在完成这一线性组合运算的基础上施加非线性激活函数以获得最终输出结果。各类激活函数如Sigmoid、ReLU等将在后续章节逐一介绍。

举例说明:

这里写图片描述

X₁·w₁ + X₂·w₂ + … + Xₙ·wₙ常被视为一种计算方式,在学术界通常被归类为加权求和法(Weighted Sum)。这一方法在线性代数领域得到了广泛应用。值得注意的是,在标准数学符号中通常用于表示这一概念;然而,在我的教程中采用女巫布莱尔的符号系统("Just a combination of plus and times signs."),特别地,在我的教程中采用女巫布莱尔的符号系统。

这个数学模型具有哪些价值呢?在接下来的内容中我会通过对比前面提到的y=kx+b直线拟合的例子来进一步阐述其重要性

这里写图片描述

现在我们将激活函数替换成Purelin(45度直线),即y=x,在此情况下表示保持输入值不变。

一般情况下,直线拟合的效果通常不如曲线拟合精确;那么在神经网络中如何进行曲线拟合呢?答案在于采用非线性激活函数;具体来说这是因为线性模型无法捕捉复杂的模式;其中最常用的是S型曲线(Sigmoid),也可称为逻辑回归(Logistic Regression),其数学表达式如后所示:

这里写图片描述

另一种常见的S型曲线也被称为双曲正切函数(tanh),即tansig函数,通常用来替代logsig函数。

这里写图片描述

这些函数图形的信息包括通过查看图表中的数据可以发现logsig的输出值位于0到1之间而tansig则在-1至1范围内。

这里写图片描述

自然常数e

在公式中用作代表的符号e被称为自然常数或称欧拉数(其中π≈3.1416)。人们常常认为这个数字充满了神秘色彩(其中包含了关于自然增长的秘密)。它是"自然规律"的核心(其图形表现为一种螺旋线)。它所包含的概念不仅限于数学领域,在自然界中也有着广泛的应用实例(这一特殊数值不仅在数学领域具有重要意义,在自然界中也有着广泛的应用实例)。

这里写图片描述

遵循了自然对数e的螺旋结构,在经历连续缩放循环的过程中能够完整保留其曲率特性。这种现象类似于永无止境的引力场效应,在吸收大量元素时仍能维持形态特征。这一特性具有不可替代的重要性,在经过多次Sigmoid变换后依然能够保持原始比例特性。

e是怎么来的?e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + 1/6! + 1/7! + … = 1 + 1 + 1/2 + 1/6 + 1/24 + 1/120+ … ≈ 2.71828 (!代表阶乘,3!=123=6)

再举一个简明的例子:有一个富翁特别热衷于赚取高额利息

后来他又设想如果将计息周期缩短到每个季度一次

接着他又进一步思考如果将计息周期缩小到每天一次会发生什么情况?按照这个思路进行下去的话每天都要计息一次的话结果会是(1+¹/₃₆₅)³⁶⁵≈2.71457元

然而随着复利计算周期无限细分下去的结果会趋近于一个固定的数值即当复利计息次数趋向于无穷大时的结果可以用极限的方式表示出来:limₓ→∞ (1+¹/x)^x≈ e≈ 2.71828

在微积分学中具有举足轻重地位的是常数e的存在。指数函数e^x所具有的独特属性即为该函数与其自身导数值相等的特点:\frac{d}{dx} e^x = e^x。这一性质使得指数函数成为微积分中的一个例外,在众多基本函数中独树一帜。这种特性在整个实数域上独一无二。

这里写图片描述

一些不同的称呼:

这里写图片描述

ex和e-x的图形是对称的;ln(x)是e^x的逆函数,它们呈45度对称。

这里写图片描述

神经网络

到这里为止,我们已经花费了大量的篇幅来探讨激活函数中那一项具有特殊性质的参数e.现在,我们正式进入神经元网络的形式介绍阶段.如图所示,这是几种典型的神经网络架构展示.

这里写图片描述
  • 左边用蓝色标记的部分称为输入层。
  • 中间部分无论有多少层次都统称为隐藏层。
  • 右边用绿色标注的部分为输出层。
  • 每一个圆圈代表一个神经元单元。
  • 多节点输出结构常用于解决分类问题。
  • 根据理论分析可知,在某种程度上可以用三层网络来近似任何多层网络的结构。

计算方法:

这里写图片描述

虽然图中未标出任何信息,但我们必须关注每一个箭头所指连线上都有一个权重(缩放)因子。
输入各节点都需要与对应的隐含各节点进行一一对应运算。
通过隐含各单元算出的数据再采用同样的方法与输出各单元进行运算。
其中隐含各单元采用Sigmoid函数作为激活函数而输出则使用Purelin函数。
最初输入数据通过网络传递至隐含 layer后再层层传递至 output layer完成前向传播的过程称为前向传播。

前面已经提到过,在深度学习领域中采用梯度下降法是一种常用的学习策略。具体而言,在不断优化的过程中需要持续调整k和b这两个参数值(如学习率和偏差项),使得模型的整体性能得到显著提升。然而,在实际应用中情况更为复杂:除了简单的线性关系外,在复杂的深度学习模型中还存在无数个这样的权重系数(weight parameters)。如何有效地调整这些权重系数以实现整体性能的最大化仍是一个极具挑战性的研究课题。自人工神经网络在20世纪60年代首次提出以来,在经过近几十年的发展后仍然面临诸多难题。直到1980年代初出现的人工智能训练新方法(如基于误差逆传播算法(BP algorithm)的人工智能训练技术)才真正解决了这一难题

这里写图片描述

BP算法是一种高效求取偏导数的方法,在其核心机制中, 通过前馈网络输出结果反向传播误差梯度, 将其与各隐藏层依次进行加权相乘, 最终逐层反向传递至输入层(除输入层之外), 最后依据各节点梯度更新权重参数。

这里写图片描述

为使内容更易理解,在后文中统一采用符号'残差(error term)'来代表误差项的偏导

输出层→隐藏层:误差项由-(预测值 - 样本值)乘以激活函数梯度得出;
隐藏层→隐藏层:误差项由右层所有节点误差乘以相应权重后累加再乘以激活函数梯度得出。

假设输出层采用Purelin作为激活函数,则从输出层到隐含层的残差计算公式为:残差 = -(输出值 - 样本值)

假设将Sigmoid(logsig)作为激活函数,则其导数为该函数乘以(1减去该函数)。对于从输出层到隐藏层的误差计算而言,在当前节点处产生的误差等于负号乘以(Sigmoid输出减去样本目标)再乘以 Ssigmoid 函数在该点处的导数值;而从一个隐藏层到另一个隐藏层时,则是将右向左传递各节点处的加权残差之和与当前节点处该激活函数及其导数值相乘的结果

如果用tansig作激活函数,那么:tansig导数 = 1 - tansig^2

这里写图片描述

当所有残差计算完毕后, 就可以更新权重. 在输入层中, 各权重增量等于当前节点激活值乘以右一层相应节点残留误差再乘以学习率. 在隐藏层中, 各权重增量则由输入信号与右一层残留误差相乘再结合学习率共同决定. 偏置项各参数增量则仅与右一层残留误差和学习率相关. 如前所述, 在此算法中使用的学习率为预设常数, 在每次迭代中用于调节参数更新步长.

在此处之后,在处理全部数据时会持续不断地重复执行这一过程;当输出层产生的误差降至非常低时就会停止运算

BP神经网络的特点和局限性:

  • 该方法可应用于分类、聚类及预测等多种场景。
  • 在实际应用中,通常需要一个较大的历史数据集来训练模型。
  • 为了训练神经网络模型,请首先识别问题的关键特征,并收集与之对应的评价指标数据。
  • 从实践应用的角度来看,该方法主要基于经验积累而非严格的仿生学原理。
  • 因此,在实际应用中的有效性往往被更看重。
  • 例如初始权重设定、隐藏层节点数以及激活函数的选择等关键参数问题。
  • 通常依靠经验或实验结果来优化这些参数。
  • 尽管在解决许多复杂问题时表现优异。
  • 然而它也存在一些明显的缺陷。
  • 其主要缺陷包括计算量大、收敛速度较慢以及容易陷入局部最优解等。

为了方便更好地理解这个公式的含义与应用逻辑,在此我发布了一个详细的计算过程说明图。参考这个链接:[ _http://www.myreaders.info/03_Back_Propagation_Network.pdf_ ] 我进行了整理和优化。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

下面介绍了一种具体的优化方法:每次计算一条记录后立即更新权重参数,并在此基础上持续进行即时调整以提高模型性能。事实上批量处理的效果更为显著。具体来说,在不进行权重更新的情况下遍历整个数据集的所有样本,并将所有样本对应的损失增量累加并求其平均值作为单次完整迭代过程中的损失增量变化量。随后利用这一平均值来完成一次完整的权重参数更新,并在此基础上开始新的迭代循环。这一技术被称为批处理梯度下降法(Batch Gradient Descent)。

推荐的入门级学习资源:

Andrew Ng开设的《机器学习》课程:https://class.coursera.org/ml

感谢大家的支持。
今天先分享一份实用的编程指导教程, 向大家介绍Matlab神经网络工具箱的使用方法, 之后若有时间可用时再补充一些更深入的知识。

学习Matlab的基础知识,请参考该学习资源: http://tieba.baidu.com/p/2945924081

例1:我们都知道,面积=长*宽,假如我们有一组数测量据如下:

这里写图片描述

我们运用这组数据用于训练神经网络。(在MATLAB中输入给定的代码块后运行此代码块即可完成)

p = [2,5;3,6;12,2;1,6;9,2;8,12;4,7;7,9]'; % 输入特征X₁,X₂
t = [10,18,24,6,18,96,28,63]; % 目标输出
net = newff(p,t,20); % 创建一个BP神经网络
net = train(net,p,t); % 基于输入输出数据对神经网络进行训练

出现如下的信息,根据蓝线的显示,可以看出最后收敛时,误差已小于10^-20。

这里写图片描述

或许你会好奇,计算机是否能够自主学习乘法规则呢?无需依赖乘法口诀表,请尝试选取几个数字进行测试。

s = [3 7; 6 9; 4 5; 5 7]’; % 准备一组新的数据用于测试
y = sim(net, s) % 模拟一下,看看效果
% 结果是:25.1029 61.5882 29.5848 37.5879

观察到了吧?预测出来的数据与真实值之间仍存在一定差距。从这可以看出,并非所有的预测都完美无缺。这些预测并非凭空猜测,在一定程度上还是有一定的依据和可靠性可言。如果训练数据量进一步增加,则有望显著提升模型的准确度。

这里写图片描述

你的测试结果可能与我的有所不同。这是因为初始化时使用的权重参数是随机分配的,在这种情况下可能会导致模型陷入局部最优解的情况,在某些情况下预测效果可能会较差。

例2:下面测试一下拟合正弦曲线,这次我们随机生成一些点来做样本。

创建一个包含从零到七之间均匀分布的随机数数组p。
通过应用正弦函数得到对应波形的数据t。
初始化变量s为从零开始每隔十分之一取值直到七。
调用绘图函数绘制散点图来展示数据关系。

这里写图片描述

net = newff(p, t, 20); % 创建神经网络
net = train(net, p, t); % 开始训练

y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图

通过图表分析得出,这次的预测结果显示预期效果不佳。为了提高模型性能,有必要通过优化相关参数进行调整。

这里写图片描述

下面的设置是一种标准的批量梯度下降法的配置。

构建三层神经网络结构:配置各层激活函数为:隐藏层采用logsig函数(共10个节点),输出层采用纯线性函数(一个节点)。其中traingd表示梯度下降训练算法。net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘traingd’); 这里指定隐藏层为单一层且包含logsig激活函数(共十个节点),输出层为单一层纯线性激活函数。

% 定义训练参数
net.trainparam.show = 50; % 每50次迭代后展示一次进度
net.trainparam.epochs = 500; % 总的训练周期数
net.trainparam.goal = 0.01; % 设定误差阈值为不超过允许误差值(小于等于)
net.trainParam.lr = 0.01; % 学习率设置为百分之一

net = train(net, p, t); % 开始训练

特别提醒:在使用newff函数时,请注意其第三个参数设置为...时不能将其误认为是...参数组。因为这样做会导致网络结构变成4层结构(包括输入层、两个隐藏层以及输出层),其中两个隐藏层分别含有......神经元。这种错误很容易出现。(输出层的节点数由程序根据输入数据t的维度自动确定)

这里写图片描述

y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图

这时的效果显然更差了。

这里写图片描述

把精度调高一点看看。训练次数加到9999,误差<0.001;学习率调到0.06,希望能加快点速度。

该段文字描述了一个两层神经网络系统中包括隐藏层和输出层。其中隐藏层包含10个节点,并采用logsig激活函数;输出层包含1个节点,并采用purelin激活函数。其中traingd代表基于梯度下降法的训练算法。

% 设置训练参数
net.trainparam.show = 50; % 设置每隔50次显示一次训练结果
net.trainparam.epochs = 9,999; % 设置总训练次数为9,999次
net.trainparam.goal = 1e-3; % 设置误差小于等于1e-3作为训练目标
net.trainParam.lr = 6e-2; % 设定学习率为

net = train(net, p, t); % 开始训练

标准的批量梯度下降法的速度确实够慢,这次计算花了一分多钟。

这里写图片描述

y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图

效果较上期有所提升。然而这条曲线表现出较大的起伏不够理想这是一种过拟合(Overfitting)现象与之相对而言则是欠拟合(Underfitting)。

这里写图片描述

先着手解决速度问题,并将训练器从 traingd 更换为 trainlm。
采用 LM 算法的 trainlm 是一种介于牛顿法与梯度下降法之间的非线性优化方法。
不仅能够加速训练进程,
而且能够减少陷入局部极小的风险。
作为 MATLAB 的默认选择。

net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 后面的代码不变

这里写图片描述

这个速度令人印象深刻,在1秒钟内就完成了任务;尽管只经历了6轮计算过程但整体表现有所提升;然而LM算法也存在不足内存消耗过大导致无法取代其他算法

这里写图片描述

下面解决过拟合问题,把隐藏层的节点数目设少一点就行了。

net = newff(p, t, 3, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 后面的代码不变

这回终于达到满意的效果了。(有时会出现局部最优解,可以多试几次)

这里写图片描述

如果节点数目太少,会出现欠拟合的情况。

这里写图片描述

对于隐藏层中的节点数量设置,则通常需要凭借经验来调整。当训练数据集的空间维度较高时(即维度数目较多),确实会耗费较多的时间来完成参数调试工作;此时可以通过经验公式指导,在一定范围内进行微调以达到较优效果。

这里写图片描述

如果把输出层改为logsig激活会是什么样子呢?

构建一个三层前馈神经网络模型 net ,其参数设置为 [ 'logsig' 'logsig' ];% 神经网络结构配置
经过训练过程 net ,并获得其权重和偏置参数;% 训练神经网络以适应给定数据
通过传递函数 sim 对输入信号 s 执行模拟计算得到输出 y;% 使用 trained 网络预测输入信号
生成并绘制预测结果与实际值之间的对比散点图 并附上简要说明;% 可视化分析部分

可以观察到,在-1至0区间内的所有点都被映射为零值。若要实现完整的数值范围效果,则需事先将数据进行归一化处理。

这里写图片描述

归一化(Normalization),也可称为标准化处理;它是指将一组数字通过比例缩放至0到1或-1到1的范围内。
尽管某些情况下使用Purelin输出时无需进行归一化处理;然而,在大多数情况下进行归一化处理有助于提升模型的收敛速度,并常被教材作为训练前的重要步骤。

归一化指标即等于(当前值x减去最小值min)除以(最大值max减去最小值min)。当限定取值范围时,则有公式y等于(ymax减去ymin)乘以(x减去xmin)除以(xmax减去xmin),再加上ymin。对于数值5、2、6、3来说,在取值范围为0.1到0.9的情况下,则按照上述方法进行计算处理。对数值5、2、6、3进行归一化处理。

这里写图片描述

归一化操作在Matlab中通过以下函数执行:...具体而言,在Matlab R2016a及以上的版本中,默认提供了这一功能,并建议开发者遵循官方指南以确保数据处理的一致性和可靠性

a = [5, 2, 6, 3];

b = mapminmax(a, 0, 1) % 归一化到0~1之间
% b = 0.7500 0 1.0000 0.2500

c = mapminmax(a) % 归一化到-1~1之间
% c = 0.5000 -1.0000 1.0000 -0.5000

反归一化(Denormalization)就是按归一化时的比例还原数值。

a被初始化为数值数组[5、2、6、3]。
[c与PS]由mapminmax函数作用于数组a生成;其中PS记录了归一化比例。
调用mapminmax函数并设置参数为reverse模式时处理c与PS;并利用PS进行反向归一化。
结果ans返回数值5与2与6与3。

神经网络的归一化(0~1范围)代码:

p = rand(1,50)*7; % 特征数据
t = sin(p); % 样本值
s = [0:0.1:7]; % 测试数据

对特征值进行归一化处理;
对样本观测值进行归一化处理;
通过应用映射函数将测试数据按ps的比例进行缩放。

net = newff(pn, tn, [5 1], {‘logsig’ ‘logsig’}); % 创建神经网络
net = train(net, pn, tn); % 开始训练

计算过程由函数sim完成(输入为net和sn)。随后通过调用mapminmax函数(参数为reverse、yn和ts)实现数据的还原过程。最后绘制出以s为x轴、y为值的散点图。

这里写图片描述

该软件还提供了用户友好的图形界面;启动nntool即可打开该界面;个人认为编写代码更为便捷;因此不太常用;我可以分享一篇相关的文章;如果有兴趣的话,请参考下面的文章:matlab神经网络工具箱创建神经网络 -http://blog.新浪财经博客文章(将新浪替换为空)

这里写图片描述

关于Sigmoid函数的起源,在中文网站上鲜有介绍。下面将简要阐述这一背景知识,旨在帮助大家开阔视野。

PS: 在这些公式中我已经提供了详细的求解步骤。然而,在当前的社会环境中(尤其是年轻一代),很少有人愿意花时间进行手工计算了;对于大多数方程而言,默认使用软件进行求解更为高效。例如,在处理Sigmoid微分方程时(特别是像神经网络中的那样),可以选择使用Matlab等数学软件来进行计算。

dsolve(‘Dx=x*(1-x)’)
% ans = 1/(1+exp(-t)*C1)

如果希望获取求解过程或深入的资料,请参考Wolfram平台: http://www.wolframalpha.com;在Wolfram平台的搜索栏中输入 x’=x(1−x) 即可。

logsig

Sigmoid 函数(S 形函数、Logistic Function)源自统计学模型的概念。它是在研究神经网络中的信号传递机制时提出的。
基于生物学的神经元激活函数则是一种以生物神经元为原型设计的非线性变换方式。
Sigmoid 函数是一种在机器学习中被广泛采用的非线性激活函数。

这里写图片描述
这里写图片描述

参考文献:该论文的全文链接为 http://eprints.pascal-network.org/archive/22222222/nnn/paperid.html

实践表明,在统计学框架下实现的Sigmoid函数激活特性较生物模型表现出显著优势,并且在计算效率方面具有明显优势。由此可见,在评估AI算法性能时应避免仅依据机器与人类之间的相似性来进行评判标准的选择。
Sigmoid函数最早被用于描述人口增长过程,并于1838年首次提出。其导数形式(即概率密度)最初被应用于该领域研究。从人口数量变化规律来看,在初期阶段呈现指数级快速增长;随后逐渐趋于饱和并减缓增长率;当达到成熟期后基本停止增长;整体呈现出典型的S型曲线特征。

这里写图片描述

当导数的形式已经了解后,请问它的原函数具体形式又是怎样的呢?已知导数求取原函数的过程,在统计学上相当于基于概率密度函数(PDF)计算累积分布函数(CDF)。不定积分(Indefinite Integral)正是专门用于此类计算的工具。

基于不定积分的知识可知,在实际应用中由于常数项的变化性特征决定了存在无限多个可能的原函数。

让我们先运用图解法进行分析:既然导数代表了函数曲线在各点处的变化率(即切线斜率),那么我们可以选取一定数值范围内的多个点,在每个点上绘制对应的切线短划线段(即形成一个方向场或梯度场),随后通过观察这些切线的方向和走向趋势来推断并绘制出相应的积分曲线。

在Matlab软件中可以通过quiver命令生成方向场图。

这里写图片描述

能够从图表中看出,在y轴上0至1区间被划分为一个分水岭。在y=0和y=1处的方向呈现出水平状态。接下来对这一区域进行详细观察。

看到了吧,我们要的Logistic Sigmoid就在这里呢。

这里写图片描述

下面给出符号求解的过程:

这里写图片描述

tansig

双曲正切函数(亦称双极S形函数、tanh及Hyperbolic Tangent),发音为'tanch'自18世纪以来就已出现。其定义为:其定义为tanh(x)=\frac{sinh(x)}{cosh(x)}源自广为人知的欧拉公式(Euler's formula)。采用tanh作为激活函数时具有较快的收敛速度且表现优于Logistic函数。欧拉公式如下所示i被定义为虚数单位(Imaginary Number)满足i^2 = -1。拓展思考基于上述公式的转换我们可以得出被誉为数学之美的最著名等式。

这里写图片描述

,数学中最神秘的5个符号e、i、π、1和0,全包含在里面了。

这里写图片描述
这里写图片描述

求tanh的导数:

这里写图片描述

logsig和tansig的关系:

这里写图片描述

全部评论 (0)

还没有任何评论哟~