【深度学习】神经网络入门(最通俗的理解神经网络)
让我们先探讨回归(Regression)问题。在另一个论坛中发现有人表示认为实现强人工智能必须使机器能够观察并识别规律的现象。具体而言,在识别形状时(如圆形、方形),以及区分颜色和形态特征后进行分类或预测的行为实际上就是我们讨论的回归问题的核心内容。
如何解决回归问题?我们可以用视觉直观地识别物体的基本特征;然而,在计算机领域中,则需要通过处理大量数据来提取模式和建立模型

假设存在一串数字序列{a₁,a₂,a₃,a₄,a₅,a₆,…}已知其前六项分别为a₁=1,a₂=3,a₃=5,a₄=7,a₅=9,a₆=11,则求第七项a₇是多少?

按照曲线的发展趋势绘制连接线后,在延伸至第七个数据点的位置处可以看到其数值为7。
由此可见,在统计学领域中回归问题本质上属于曲线拟合问题。
具体来说,在实际应用中如何实现这一目标是一个值得探讨的问题:因为人类凭直觉难以准确实现类似的手工绘制效果。
假设我们有一系列按照特定分布规律生成的数据点序列,
接下来我会以直线拟合为例详细阐述这一算法的基本原理。
如果你觉得这篇文章略显吃力不讨好, 或者你有兴趣系统地深入学习人工智能, 那么我可以向你推荐床长的人工智能教程。这部堪称大神之作的人工智能教程确实非常出色, 它的内容既通俗易懂又充满趣味性。点击这里即可查看这门课程。
其实在操作上并不复杂。首先任意画一条直线随后持续旋转它。每次转动一次就分别计算每个样本点与其在直线上的投影点之间的距离(误差)。将所有这些距离相加得到总误差值。当总误差降至最低时就停止调整方向。进一步解释时可说明:在整个过程中不仅需要旋转还需要相应地平移这条直线以优化拟合效果。具体来说就是通过持续微调使总误差降至最低从而实现最佳拟合状态这就是著名的梯度下降法(Gradient Descent)。其原理在于随着迭代次数增加每次微小的变化都会逐渐减小最终达到收敛状态即所谓的收敛(Converge)。值得注意的是这种方法的优势在于能够自动调节参数使其逐步逼近最优解而无需人工干预每一步的变化幅度都会根据当前的位置自动缩放从而保证算法的有效性和稳定性。

我们知道,在线性回归中用到的一条直线方程是y = kx + b(其中k代表斜率而b代表截距)。从另一个角度来看的话,则可以认为k决定了这条直线的变化方向与陡峭程度而b则决定了整条直线在y轴上的位置高度。由此可见,在应用梯度下降算法的过程中我们需要不断调整这两个关键参数k和b使得最终得到的结果能够最大限度地减少预测值与实际样本之间的差异。具体来说我们通常采用的是通过最小化预测值与实际值之间差值平方和的方式来实现这一目标这种方法被统称为最小二乘法(Least Square Method)

该问题看似已获得解决;然而为了实现适用于各类曲线拟合的需求, 我们仍需持续深入研究。
基于拟合直线不断旋转所形成的斜率以及相应的误差分析, 我们绘制了一条函数曲线, 如图所示。

观察图形可知:误差函数呈现出一个二次曲线形态;其中下凸函数(Convex)呈现出碗状结构;其最低点位于碗状底部位置。在图形最低点处绘制一条切线,则该条切线必然与横坐标轴平行,并可将横坐标轴视为该处之切线方向;若能计算曲线上每一点处对应的切线方程,则当所有这些计算完成时,在达到水平状态下的对应坐标点即为误差最小化的解;同时这也决定了最终拟合直线应有的斜率数值;梯度下降算法的核心问题便转化为寻找最优解的方向。

切线每一次旋转所经过的角度被定义为学习率(Learning Rate)。增大学习率系数能够显著提升收敛速度。然而,在设置过大的情况下可能会导致切线过度旋转而导致模型发散。[值得注意的是,在深度学习算法中,默认的学习速率通常是一个固定值,并且可以通过调节来优化模型的训练效果]。
提示:针对非线性误差曲线可能出现的情况,在处理复杂优化问题时需要注意以下几点:其一,在使用梯度下降算法寻找极值时,可能会导致陷入局部最优解的情况;其二,请参考下图中的曲线特征进行分析。

微分学主要用于计算曲线在某一点的切线斜率。计算得到的切线斜率即为导数(Derivative),通常表示为dy/dx或f’(x)。当涉及多元函数时,在处理多个变量的情况下若需计算多个方向上的变化率,则其中一个特定方向的变化率被称为偏导数(Partial Derivative),其数学表达式为∂y/∂x。鉴于大多数实际应用都涉及多元函数,在后续讨论中提及的‘导数’通常特指‘偏导数’。
以下介绍了线性回归(Linear Regression)的核心知识,并以此方法为基础进一步发展出多项式回归等非线性模型。通过将线性关系转化为非线性关系,我们可以构建更为灵活的数据拟合模型,从而实现对复杂数据模式的捕捉和分析能力提升。此外,借助软件工具如Excel,我们能够便捷地进行数据建模和分析操作,为决策提供可靠的数据支持。

通常情况下,在多数场景下采用曲线回归能够带来更高的精确度相较于直线回归的方法论优势显著性检验结果表明

一次函数表达式 y = kx + b 转换为二次函数表达式 y = ax^2 + bx + c 时, 变量由两个 (分别为 k, b ) 增加为三个 (分别为 a, b, c ), 项的数量由一个发展为两个. 高阶多项式如三次曲线及其复杂回归模型将显著增加变量数量与项的数量.
前面讨论了如何从一组数据中提炼出其内在规律。在实际应用中,我们通常会基于多个特征(如多维数据)来评估和理解各种现象。每个原始属性被视作一个独立的维度(dimension)。当采用多项式模型进行拟合时,在这种情况下,所需的数据量急剧上升。具体而言,在这种情况下,所需的特征数目可以通过公式n = \frac{d(d+1)}{2}来估算(其中d表示原始维度的数量)。例如在100维的数据空间中,采用二次多项式模型进行拟合后将会导致约5000个新的特征求解需求。
下面是一副50×50像素的灰度图片——通过二次多项式拟合的话——它能带来多少个特征呢?——大约是3百万

该模型的大小为5\times 1单位(每单位包含1\times 1的小块),其特征数量为\frac{N(N-1)}{2}其中N=49;若为彩色图像,则该模型的大小将提升至原来的三倍左右,并相应地使特征数量达到约两千万级别。

这么小的一张图片,就有这么巨大的特征量,可以想像一下我们的数码相机拍下来的照片会有多大的特征量!而我们要做的是从十万乃至亿万张这样的图片中找规律,这可能吗?
很显然,前面的那些回归方法已经不够用了,我们急需找到一种数学模型,能够在此基础上不断减少特征,降低维度。
随后,在严苛的技术要求下,“人工神经网络(ANN, Artificial Neural Network)”脱颖而出,并为机器学习领域开创了新的研究方向。
神经元
有人提出假设:"智能源于单一算法模型(One Learning Algorithm)"。若该假设成立,则运用单一算法(如神经网络)来解决复杂多变的世界问题成为可能。无需为万事万物设计复杂的编程方案, 只需采取以不变应万变的战略即可. 已有多项证据支持这一观点,例如在人类大脑发育初期阶段,各 brain regions 的功能划分尚未完全确定, 即使是处理声音的区域也可能具备视觉感知能力
下图是单个神经元(Neuron),或者说一个脑细胞的生理结构:

以单个神经元的数学模型为例,在模拟生理结构方面是一个简化的版本

具体来说,在机器学习模型中,+1代表偏置项(即偏移值),用于调整模型的输出结果位置。其中+1代表偏置项(即偏移值),而X₁、X₂、X₃等变量则分别表示输入的初始特征。每个特征都对应一个权重参数(Weight),这些权重参数决定了各个特征在最终输出中的重要性。在模型训练过程中,我们会对这些权重参数进行优化以提高模型的预测能力。具体来说,在模型构建阶段,我们需要将所有输入特征乘以对应的权重参数,并将这些乘积结果相加得到一个中间值;接着会对这个中间值施加一个非线性激活函数处理以引入非线arity;最后再将经过激活函数处理的结果作为模型的最终输出供后续使用。
举例说明:

该计算形式被定义为加权求和法(Weighted Sum),在许多线性代数问题中这种方法应用广泛。标准数学符号通常采用的是为了简化起见,在我的教程中采用了女巫布莱尔的符号表示。其实它仅由一个加号与一个乘号构成。
这个数学模型能够揭示其重要性吗?为了更好地理解这一概念,请看下面的实例。

此时我们将激活函数更改为Purelin(45°直线),而Purelin定义为y=x。因此输出值将变为Y直线上各点坐标为Y = b + X*k。不难发现这一做法仅是对前一部分内容的不同表述,并未改变实质内容。接下来首先针对每一个数据点执行上述运算,在拟合直线上利用当前对应的X坐标计算出拟合后的Y坐标值后与实际样本进行比较;然后利用这些差异计算总误差;接着通过迭代更新参数b和k;使得拟合出来的新的斜率系数k与截距项b能够更好地匹配样本数据;最终当误差降到足够小时停止调整(即达到了收敛状态)。这一系列的操作本质上与我们之前讨论过的线性回归中的梯度下降方法一致
一般情况下,直线拟合的效果通常明显低于曲线拟合。那么在神经网络框架下进行曲线拟合时需要采取哪些措施?答案在于采用非线性激活函数。其解决方案在于采用非线性激活函数即可实现高精度的曲线拟合。最常用的非线性激活函数即S型函数(Sigmoid Function),这种函数因其良好的特性而被广泛应用。此外,S型函数也被称为逻辑回归(Logistic Regression),又简称为logsig模型。其基本公式如下:

另一种常见的S型曲线也较为普遍,它被称为双曲正切函数(tanh),亦可作为logsig的替代方案。

这些函数图形如下所示。通过查看图形可知,l o g s i g 的输出值在0到1之间变化;而t a n s i g 的输出值则在-1到1之间波动。

自然常数e
在数学公式中被称为自然常数或欧拉数,在科学计算中有着广泛的应用。这个数字具有某种神秘感和重要性,在许多领域中都扮演着关键角色。它承载着自然增长的本质规律,并且在科学研究中揭示了许多有趣的特性。其图形呈现出独特而迷人的螺旋形状,在自然界中能够观察到这种形态的例子也非常丰富。

被引入了以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)
从前有个贪心的地主:他总是热衷于赚钱(outsource capital),于是他出了一个高利贷业务(loans to his neighbors)——借出的资金年利率高达100%!也就是说借出去1元钱(principal),一年后他必须收回2元本息(principal + interest)。一天他突发奇想:如果把年利率拆成两次半年期计息的话(compounding),那么每半年收取50%的利息(interest)。这样一来第一半年结束后他会收到1.5元本息;第二年下半段时间再按1.5元本金计息,则需支付75分(half of 1.5元)利息——这样第一年总共获得2.25元本息回报!于是他觉得这个方法很赚——不如把计息周期变得更密集些呢?比如说每季度算一次利息——这样一年下来就能得到(1+25%)4=2.4414元本息收入——比之前的2.25元多了不少!于是他又想试试看:如果把计息周期拉得更密集些——比如说每天算一次……结果他的账房先生告诫他说:“这样下去大家都会疯掉啦!”不过这位地主并没有放弃——经过多年的坚持运算后发现:当计息周期无限密集时——也就是当n趋近于无穷大时——极限值为e=(1+1/n)n≈ 2.71828……最终这位原本打算干金融行业的地主竟然成为了著名的数学家!
在微积分学中, e被公认为最重要的常数之一, 函数e^x在其定义域内始终保持着独特的性质——它的导数就是自身. 这一独特的属性使得指数函数成为微积分中的核心概念. 令人称奇的是, 这一特性在整个实数范围内都是独一无二的.

一些不同的称呼:

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

神经网络
接下来,在之前的章节中, 我们已经对激活函数中的一个关键点进行了深入探讨. 特别提到的那个关键点就是指数函数e. 接下来正式阐述神经元网络的形式. 如图所示为几种常见类型的网络架构.

- 左侧蓝色区域标记为"输入层"。
- 中间部分无论多少层级都被统称为"隐藏层"。
- 每个圆形区域代表一个神经元单元。
- 输出端通常包含多个神经元单元,在分类问题中表现出色。
- 理论研究表明三层以上的网络架构能够很好地近似任意复杂的函数。
- 通常建议依据经验或实验结果初步设定隐藏层数量,并通过训练过程不断优化以提升模型性能。
计算方法:

需要注意的是图中标注并未显示具体数值或参数名称,请确保所有连接线上都明确标示出对应的权重(缩放)因子。
对于输入层中的每一个节点而言,请确保它们均需与隐藏层的所有节点进行一一对应运算。这种运算方式的具体实现方法是通过加权求和后再引入激活函数来进行处理(如前所述所述)。
通过应用隐藏层计算得到的结果数据再结合相同的运算方式来完成与输出层之间的数据传递。
其中Sigmoid被选用作为激活函数的原因在于其能够将输入范围内的任意数值映射到0至1之间的小数值上而不会发生饱和现象这使得其更适合于中间层次的学习过程而Purelin则保留了原始数值范围的优势以便于直接与样本目标值进行对比。
整个神经网络的工作流程可大致分为两个阶段首先是信息从输入层层传播到隐藏层层然后又从隐藏层层传递到输出层层最终所得到的结果会被用来评估预测结果的质量这个过程被称为前向传播
前面已经提到过,在应用梯度下降方法时

该算法被用作计算偏导数的一种有效手段;其基本原理如下:通过前馈传播最终输出结果来推导误差梯度,并按反向过程逐层调整直至输入层(不包括输入层),最终通过各节点梯度更新参数。

为了便于理解起见,在后续讨论中我会一直采用"残差(error term)"这一术语来指代误差项的偏导数值
从输出层到隐藏层的误差项等于负号乘以(预测输出与真实标签之差)再乘以激活函数的导数值。各节点之间的误差项通过加权求和后再乘以激活函数导数值传递至下一个隐藏层。
假设输出层采用Purelin作为激活函数,则其导数值恒等于1;从输出层到隐含层:残差计算公式为-(\text{输出值} - \text{样本值})
使用Sigmoids(logsig)作为激活函数时,则其导数为\sigma'(s)=\sigma(s)(1-\sigma(s))。从输出层传递到第一个隐含层时,在每一侧计算误差项等于负号乘以(预测概率与真实标签之间的差异)再乘以\sigma(s)并与其互补的概率相乘。进一步展开即为负号乘以标签与预测概率之间的差异以及两者各自的比例。在隐含层之间的传递中,在每一侧计算误差项等于右边所有隐含层节点误差项按权重相加的结果再乘以\sigma(s)与其互补的概率相乘。
如果用tansig作激活函数,那么:tansig导数 = 1 - tansig^2

在计算完所有的残差之后, 从而完成权重更新. 在输入层中, 每个参数增益等于 该节点 的 Sigmoid 值 乘以 右侧相邻层对应的节点 的 残差 值 再乘以 学习率. 在隐藏层中, 每个参数增益等于 输入数值 乘以 右侧相邻层对应的节点 的 残差 值 再乘以 学习率. 对于偏移值各参数增益, 则仅等于右侧相邻层对应的节点 的 残差 值 乘以 学习率. 已被详细阐述的是学习率这一概念, 它是一个预先设定好的参数, 其作用是调控每次更新过程中的幅度大小.
在此之后,对所有数据持续不断地进行这样的计算操作,并在计算结果的误差降至非常低时停止运算。
以上所述的是当前最常用的神经网络类型之一——前馈型人工神经网络(FeedForward Neural Network),因其通常需要反向传播误差特性而得名(Back Propagation Neural Network)。
BP神经网络的特点和局限:
- BP神经网络主要应用于分类、聚类以及预测等多种领域。
- 为了有效训练模型,通常需要较大的历史数据集,并通过这些数据让网络逐步掌握其中的内在规律。
- 从实践角度来看,BP神经网络是一个逐步优化和完善起来的系统,并不完全受生物学原理指导。
- 从这个角度讲,实用性 > 生理相似性。
- 在算法设计方面存在诸多挑战:如何设定初始参数?如何合理安排隐藏层规模?选择哪种激活函数?这些问题都缺乏坚实的理论支撑。
尽管如此,在很多情况下它的计算复杂度很高。
然而其明显的缺点包括过于复杂的计算过程,运算速度较慢以及容易陷入局部最优解的问题。
针对这些问题的研究者们提出了多种改进方案,并开发出了许多新型 neural network 结构。
为了便于理解,现将详细的推导过程一并呈现。文字的公式内容略显复杂,在此进行补充说明。参考如下链接中的详细推导内容: http://www.myreaders.info/03_Back_Propagation_Network.pdf ,我已经进行了相应的整理和补充。







这里具体说明了处理完一个数据样本后立即更新权重的方法,并指出每次计算都会进行即时更新。值得注意的是这种方法的效果较佳,在不更新权重的前提下遍历整个数据集中的每一个样本后将所有需要更新的增量逐一累加并求取其平均值作为单次更新依据这种方法被定义为批量梯度下降(Batch Gradient Descent)。
推荐的入门级学习资源:
Andrew Ng教授开设的经典《机器学习》课程系列:https://class.coursera.org/ml
Coursera 课程‘神经网络表示法’详细笔记(中文版):http://52opencourse.com/139/coursera
Coursera 课程‘神经网络的学习内容’视频讲解:http://52opencourse.com/289/coursera
斯坦福大学深度学习教材(中文版):http://deeplearning.stanford.edu/wiki/index.php/UFLDL
感谢诸位的支持!
今天先发个初步的实际编程实践课程, 重点讲解Matlab神经网络工具箱的基本应用, 后续若有时间将进一步拓展这一技术方向
学习Matlab的基础知识,请参考该帖
例1:我们都知道,面积=长*宽,假如我们有一组数测量据如下:

基于这组数据进行神经网络的训练。(在Matlab中导入相应的代码,并通过回车键运行。)
输入特征[X₁,X₂]如下所示:
目标输出t如下所示:
建立基于BP的学习算法的前向神经元网络结构net:net = \text{newff}(p,t, \text{size});其中\text{size}表示隐层神经元数目;
对构建好的神经网络模型进行参数学习过程:\text{net}=\text{train}(\text{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是由均匀分布在[−43 至 43]区间内随机选取的单行5×49个样本组成的向量;
t是通过计算正弦函数作用于该向量得到的结果;
s是一个从零开始每隔\delta取值直到接近七的一系列数值;
利用这些数据绘制了带标记'x'的二维图形。

net = newff(p, t, 20); % 创建神经网络
net = train(net, p, t); % 开始训练
y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图
通过观察图形可以看出,在本次预测中显示的结果并不令人满意。需要对模型参数进行适当调整。

下面的设置是一种标准的批量梯度下降法的配置。
搭建一个三层神经网络架构如下:其中隐藏层包含[p]输入特征并采用\{\texttt{logsig}\}激活函数;输出层由单个节点组成,并使用\texttt{purelin}激活函数。\n\n网络训练采用梯度下降法进行优化。\n\n具体实现如下:\n\nnet = newff(p, t, 10, {'\texttt{logsig}', '\texttt{purelin}'), 'traingd');\n\n注意:此处仅设置为单隐含层(即数量为[p]),不要将其误认为是双隐含层
% 设置训练参数
net.trainparam.show = 5;设置显示频率为每五次迭代一次
net.trainparam.epochs = 2, net/train/epoch=2;设定总迭代次数为五百次(可选)
net/train/target=ε;设定误差阈值为ε=千分之一
net/train/learning_rate=η;设定学习速率为η=千分之一(可选)
net = train(net, p, t); % 开始训练
注意:在使用newff构建前馈神经网络时,请避免将新ff模型的第3个参数设置为[10 1]。因为这样会导致一个具有4层结构的新前馈神经网络被建立,并其中两个隐藏层分别包含有数量为...的数量为一个节点。这个操作容易产生混淆,请确保正确设置参数结构以避免影响模型性能

y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图
这时的效果显然更差了。

把精度调高一点看看。训练次数加到9999,误差<0.001;学习率调到0.06,希望能加快点速度。
构建一个两层神经网络(隐藏层包含10个节点并采用logsig激活函数;输出层包含一个节点并采用purelin激活函数);其中traingd对应梯度下降法。
构建一个两层神经网络(隐藏层包含10个节点并采用logsig激活函数;输出层包含一个节点并采用purelin激活函数);其中traingd对应梯度下降法。
% 设置训练参数
设置显示频率为每50次迭代一次。
设置总的训练周期数为9,999次。
设定误差目标低于预设值。
设定学习速率为6%。
net = train(net, p, t); % 开始训练
标准的批量梯度下降法的速度确实够慢,这次计算花了一分多钟。

y = sim(net, s); % 模拟
plot(s, y, ‘x’) % 画散点图
效果略微有所提升。
不过这条曲线看起来有些凹凸不平难以辨识,并且呈现出明显的过拟合特征。
而这种情况则与之相对的是欠拟合现象

首先解决速度问题, 将training algorithm替换为trainlm即可. 使用LM算法的trainlm不仅能够加快训练速度, 还能够减少陷入局部最小值的可能性, 在Matlab中通常被采用为默认设置.
net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 后面的代码不变

这一技术令人印象深刻,在仅需1秒钟的时间内就完成了任务,并经历了仅仅6轮计算后取得了些许改善。然而,在处理复杂问题时存在一定的局限性——它的内存占用非常大——这导致其他算法未能被取代。

下面解决过拟合问题,把隐藏层的节点数目设少一点就行了。
net = newff(p, t, 3, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 后面的代码不变
这回终于达到满意的效果了。(有时会出现局部最优解,可以多试几次)

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

关于隐藏层节点数量的选择,则通常靠直觉进行调节。当输入数据维度较大时, 耗时较多, 此时可依据经验公式进行适当调整。
h: 隐藏层节点的数量;
n: 输入层神经元的数量;
p: 输出层神经元的数量;
\alpha: 学习率;
\beta: 衰减系数;
\gamma: 正则化强度;
\delta_{i}: 第i个神经元的梯度大小;
\epsilon_{j}: 第j个输出神经元的目标误差值

如果把输出层改为logsig激活会是什么样子呢?
生成神经网络架构:
net = newff(p, t, 3, {'logsig', 'logsig'}); % 构建三层前馈神经网络
执行训练过程:
net = train(net, p, t); % 启动训练循环
运行模拟操作:
y = sim(net, s); % 执行前向传播以获得输出
生成数据可视化图表:
plot(s, y, 'x'); % 制作输出数据的散点图并展示
可以看到,在-1~0范围之间的所有点都被置为零。当使用logsig函数输出时,则需要通过数据归一化来保证能够获得完整的数值输出范围效果。

Normalization, also known as standardization, is the process of scaling a set of data to a specific range, such as 0 to 1 or -1 to 1. However, it is not required when using Purelin output. Nevertheless, normalization can accelerate the convergence speed and is often considered an essential step in the training process by many tutorials.
该指标的计算采用归一化方法进行;当设定特定区间时,则计算公式可表示为:y等于(最大区间上限减去区间下限)乘以(当前变量减去区间下限),再除以(区间上限减去区间下限),最后加上区间下限;对于具体范围如0.1至0.9的情况,则可表示为:
(ymax - ymin)(x - xmin)/(xmax - xmin) + ymin
将数据集合5、2、6、3进行归一化处理:

在Matlab中进行归一化处理时,默认使用的函数是mapminmax具体来说该函数的作用与premnmx命令基本一致需要注意的是在Matlab的不同版本中这些命令的具体表现可能存在差异值得注意的是在R2007b和R2008b两个版本中premnmx命令在处理单列数据时存在潜在的问题而在R2009a版本之前尚未修复为了确保程序运行的稳定性建议优先采用mapminmax函数进行归一化处理其输出结果与premnmx有所不同因此在实际应用中应特别留意代码中的转置操作以避免潜在的计算错误
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]。
通过调用 mapminmax 函数处理 a 得到输出 c 和比例因子 PS。
再次调用 mapminmax 函数,并设置 reverse 参数以实现反向归一化处理。
% ans = [5,\;2,\;6,\;3]
神经网络的归一化(0~1范围)代码:
p = rand(1,50)*7; % 特征数据
t = sin(p); % 样本值
s = [0:0.1:7]; % 测试数据
[pn, ps] = mapminmax(p, 0, 1); % 输入数据进行归一化处理
[tn, ts] = mapminmax(t, 0, 1); % 训练样本进行归一化处理
sn = mapminmax('apply', s, ps); % 测试用例按照ps的比例缩放
net = newff(pn, tn, [5 1], {‘logsig’ ‘logsig’}); % 创建神经网络
net = train(net, pn, tn); % 开始训练
yn = sim(net, sn); % 进行模拟计算
y = mapminmax('reverse', yn, ts); % 按照ps的比例进行还原计算
plot(s, y, 'x'); % 绘制s关于y的散点图

神经网络工具箱还配有一人易用的图形界面,通过运行nntool程序即可打开。我认为手动画图比编写代码更麻烦,因此很少使用。我可以分享一个相关资源:matlab神经网络工具箱创建神经网络 -http://blog.sina.com.cn/s/blog_8684880b0100vxtv.html

关于Sigmoid的由来,在中文网站上鲜为人知。下面简单介绍一下吧!希望能帮助大家拓宽思路。
PS: 这些公式都提供了详细的求解步骤, 但现在这个时代, 手工计算已经越来越少人能胜任了, 通常情况下, 通过软件解决方程更为便捷.
dsolve(‘Dx=x*(1-x)’)
% ans = 1/(1+exp(-t)*C1)
如果需要了解详细的求解步骤,请参考Wolfram Alpha:http://www.wolframalpha.com 在其搜索栏中输入微分方程 x’=x(1-x) 即可获得所需信息。
logsig
Sigmoid函数(S形曲线、Logistic Function)源自统计学模型的发展与演进。在生物学领域的神经元激活函数呈现这样的特征:


参考:[ http://eprints.pascal-network.org/archive/2777443472774234234234234234234. pdf_]
实验证明基于统计学构建的Sigmoid激活函数相较于生物科学领域的模型更具优势,并且计算上非常方便。由此可见,在评估AI算法性能时不宜单纯以机器与人类间的相似度作为评判标准。

已知导数的具体形式后想确定其原函数的具体形式是什么样的呢?在统计学中讲过,在给定概率密度函数(PDF)的情况下求取累积分布函数(CDF),这正是通过计算不定积分(Indefinite Integral)来实现的任务。根据不定积分的相关理论基础可知,在计算过程中由于常数项的存在性问题导致存在无限多个满足条件的原函数可能性。为了直观理解这一过程让我们先采用图形化方法进行分析:既然导数代表了曲线切线方向或者说切线斜率的变化情况那么就可以在特定数值区间内绘制一系列对应的切线小段从而形成完整的切线场(Slope Fields, Direction Fields)。接着通过分析这些切线场的整体走向即可推断出相应的积分曲线的大致形态。在Matlab软件平台中我们可以通过quiver命令来绘制这样的切线场图形。

通过查看上图,在y轴0至1之间的区域是一个分界线,在此处的方向呈现水平状态。接下来对这一区域进行详细观察会发现什么情况呢?
看到了吧,我们要的Logistic Sigmoid就在这里呢。

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

tansig
双曲正切函数(双极S形函数、tanh、Hyperbolic Tangent),读作tanch,在18世纪时就已经出现。它的定义是:tanh(x) = sinh(x)/cosh(x),这一结果可由著名的欧拉公式(Euler’s formula)推导得出。
当选用tanh作为激活函数时,则展现出较快的收敛速度,并且其效果较Logistic函数更为出色。
欧拉公式:i是虚数单位(Imaginary Number),其定义是:(即i² = -1)
注释:以上述公式变换为基础,则可导出数学史上最为精妙的等式:

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


求tanh的导数:

logsig和tansig的关系:

