Monday, January 12, 2015

误差的函数曲线是个二次曲线,凸函数(下凸, Convex),像个碗的形状,最小值位于碗的最下端。如果在曲线的最底端画一条切线,那么这条切线一定是水平的,在图中可以把横坐标轴看成是这条切线。如果能求出曲线上每个点的切线,就能得到切线位于水平状态时,即切线斜率等于0时的坐标值,这个坐标值就是我们要求的误差最小值和最终的拟合直线的最终斜率。

误差的函数曲线是个二次曲线,凸函数(下凸, Convex),像个碗的形状,最小值位于碗的最下端。如果在曲线的最底端画一条切线,那么这条切线一定是水平的,在图中可以把横坐标轴看成是这条切线。如果能求出曲线上每个点的切线,就能得到切线位于水平状态时,即切线斜率等于0时的坐标值,这个坐标值就是我们要求的误差最小值和最终的拟合直线的最终斜率。


机器学习入门——浅谈神经网络

一楼献给度娘

先从回归(Regression)问题说起。我在本吧已经看到不少人提到如果想实现强AI,就必须让机器学会观察并总结规律的言论。具体地说,要让机器观察什么是圆的,什么是方的,区分各种颜色和形状,然后根据这些特征对某种事物进行分类或预测。其实这就是回归问题。

如何解决回归问题?我们用眼睛看到某样东西,可以一下子看出它的一些基本特征。可是计算机呢?它看到的只是一堆数字而已,因此要让机器从事物的特征中找到规律,其实是一个如何在数字中找规律的问题。




例:假如有一串数字,已知前六个是1、3、5、7,9,11,请问第七个是几?
你一眼能看出来,是13。对,这串数字之间有明显的数学规律,都是奇数,而且是按顺序排列的。
那么这个呢?前六个是0.14、0.57、1.29、2.29、3.57、5.14,请问第七个是几?
这个就不那么容易看出来了吧!我们把这几个数字在坐标轴上标识一下,可以看到如下图形:



用曲线连接这几个点,延着曲线的走势,可以推算出第七个数字——7。
由此可见,回归问题其实是个曲线拟合(Curve Fitting)问题。那么究竟该如何拟合?机器不可能像你一样,凭感觉随手画一下就拟合了,它必须要通过某种算法才行。

  • 思之舞占位
    2014-4-29 18:01回复
  • jack王year
    2014-5-1 08:24回复
  • paymingde人能看出来,是因为人接受了教育,概念,阿拉伯字母表,所以识别物体必需有参考,这个参考尽量信息量少,但至少可以区别其他已经建立过参考的事物。比如汽车,它的识别应该分解到局部,再有一个整体的数据,层层组织
    2014-5-12 21:01回复
  • 741918902写的真多啊,其实运行主要依靠的是关联性对吧,由一想到二
    2014-5-12 23:08回复
  • 风回千转机器人为什么不能随手画出来呢?具象的模糊系统明显比抽象的精确运算更有效率。
    2014-5-24 19:24回复
    • xlzm2zml2pjx但是在预测的时候还是需要根据前面的信息进行预测呀不管人,还是机器的抽象运算都会根据变化进行预测的呀
      2014-11-14 05:29回复
  • 还有1条回复,点击查看
假设有一堆按一定规律分布的样本点,下面我以拟合直线为例,说说这种算法的原理。

其实很简单,先随意画一条直线,然后不断旋转它。每转一下,就分别计算一下每个样本点和直线上对应点的距离(误差),求出所有点的误差之和。这样不断旋转,当误差之和达到最小时,停止旋转。说得再复杂点,在旋转的过程中,还要不断平移这条直线,这样不断调整,直到误差最小时为止。这种方法就是著名的梯度下降法(Gradient Descent)。为什么是梯度下降呢?在旋转的过程中,当误差越来越小时,旋转或移动的量也跟着逐渐变小,当误差小于某个很小的数,例如0.0001时,我们就可以收工(收敛, Converge)了。啰嗦一句,如果随便转,转过头了再往回转,那就不是梯度下降法。

我们知道,直线的公式是y=kx+b,k代表斜率,b代表偏移值(y轴上的截距)。也就是说,k可以控制直线的旋转角度,b可以控制直线的移动。强调一下,梯度下降法的实质是不断的修改k、b这两个参数值,使最终的误差达到最小
求误差时使用 累加(直线点-样本点)^2,这样比直接求差距 累加(直线点-样本点) 的效果要好。这种利用最小化误差的平方和来解决回归问题的方法叫最小二乘法(Least Square Method)



问题到此使似乎就已经解决了,可是我们需要一种适应于各种曲线拟合的方法,所以还需要继续深入研究。
我们根据拟合直线不断旋转的角度(斜率)和拟合的误差画一条函数曲线,如图:

从图中可以看出,误差的函数曲线是个二次曲线,凸函数(下凸, Convex),像个碗的形状,最小值位于碗的最下端。如果在曲线的最底端画一条切线,那么这条切线一定是水平的,在图中可以把横坐标轴看成是这条切线。如果能求出曲线上每个点的切线,就能得到切线位于水平状态时,即切线斜率等于0时的坐标值,这个坐标值就是我们要求的误差最小值和最终的拟合直线的最终斜率。
这样,梯度下降的问题集中到了切线的旋转上。切线旋转至水平时,切线斜率=0,误差降至最小值。



切线每次旋转的幅度叫做学习率(Learning Rate),加大学习率会加快拟合速度,但是如果调得太大会导致切线旋转过度而无法收敛。

注意:对于凹凸不平的误差函数曲线,梯度下降时有可能陷入局部最优解。下图的曲线中有两个坑,切线有可能在第一个坑的最底部趋于水平。


微分就是专门求曲线切线的工具,求出的切线斜率叫做导数(Derivative),用dy/dx或f'(x)表示。扩展到多变量的应用,如果要同时求多个曲线的切线,那么其中某个切线的斜率就叫偏导数(Partial Derivative),用∂y/∂x表示,∂读“偏(partial)”。由于实际应用中,我们一般都是对多变量进行处理,我在后面提到的导数也都是指偏导数。

  • 李杜白元学习率的解说有误。按照图4中的定义,固定的学习率将无法优化到极值。我建议修改为:切线每次旋转的幅度与上次切线的斜率的关系叫做学习率。
    2014-5-2 07:34回复
  • 利_刃回复 李杜白元 :恩,这个说法的确实不确切。 学习率其实是个预先设置好的参数,不会每次变化,不过可以影响每次变化的幅度。
    2014-5-4 07:05回复
  •  
以上是线性回归(Linear Regression)的基本内容,以此方法为基础,把直线公式改为曲线公式,还可以扩展出二次回归、三次回归、多项式回归等多种曲线回归。下图是Excel的回归分析功能。


在多数情况下,曲线回归会比直线回归更精确,但它也增加了拟合的复杂程度。


直线方程y=kx+b改为二次曲线方程y=ax^2+bx+c时,参数(Parameter)由2个(分别是k、b)变为3个(分别是a、b、c),特征(Feature)由1个(x)变为2个(x^2和x)。三次曲线和复杂的多项式回归会增加更多的参数和特征。


前面讲的是总结一串数字的规律,现实生活中我们往往要根据多个特征(多串数字)来分析一件事情,每个原始特征我们都看作是一个维度(Dimension)。例如一个学生的学习成绩好坏要根据语文、数学、英语等多门课程的分数来综合判断,这里每门课程都是一个维度。当使用二次曲线和多变量(多维)拟合的情况下,特征的数量会剧增,特征数=维度^2/2 这个公式可以大概计算出特征增加的情况,例如一个100维的数据,二次多项式拟合后,特征会增加到100*100/2=5000个。


下面是一张50*50像素的灰度图片,如果用二次多项式拟合的话,它有多少个特征呢?——大约有3百万!


它的维度是50*50=2500,特征数=2500*2500/2=3,125,000。如果是彩色图片,维度会增加到原来的3倍,那么特征数将增加到接近3千万了!


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


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

  • wangmingfu0409粉墨登场不是这样用的,这里应该用闪亮登场
    2014-5-3 22:58回复
  • 利_刃回复 wangmingfu0409 :
    2014-5-4 07:06回复
  • 393318055回复 wangmingfu0409 :哈哈,想起了我的高中时光
    2014-5-7 19:33回复
  • lj745280746请问:特征数与维度有什么区别?特征数=维度^2/2这个公式怎么来的,有什么意义?
    2014-6-15 06:23回复
  • 利_刃如果是a,b,c三个原始特征,那么转换为2次多项式为a^2 + a*b + a*c + b^2 + b*c + c^2,一共6项(6个特征);如果是a,b,c,d四个原始特征,那么转换为a^2 + a*b + a*c + a*d + b^2 + b*c + b*d + c^2 + b*c + d^2,共10个特征,当原始特征数越来越大时,转换的特征数会趋于,可以用O(n^2)来表示。
    2014-6-15 10:59回复
    • 利_刃回复 lj745280746 : 当原始特征数越来越大时,转换的特征数会趋于"原始特征数^2/2"。如果还不理解,可以搜索"大O符号"来获得更多信息。 特征和维度这两个词常常会混用,我这里的维度指的是原始特征。
      2014-6-15 11:02回复
    • lj745280746回复 利_刃 :谢大侠指点
      2014-6-19 08:44回复
    • 立体位移这样搞是弄不出强AI的,你要让计算机自己去推演规律,而不是靠人生搬硬塞
      2014-7-16 06:25回复
    • 看这满天的星斗楼主简直超赞
      2014-11-17 03:51回复
  • 还有4条回复,点击查看
神经元


有一种假说:“智能来源于单一的算法(One Learning Algorithm)”。如果这一假说成立,那么利用单一的算法(神经网络)处理世界上千变万化的问题就成为可能。我们不必对万事万物进行编程,只需采用以不变应万变的策略即可。有越来越多的证据证明这种假说,例如人类大脑发育初期,每一部分的职责分工是不确定的,也就是说,人脑中负责处理声音的部分其实也可以处理视觉影像。




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


下面是单个神经元的数学模型,可以看出它是生理结构的简化版,模仿的还挺像:

解释一下:+1代表偏移值(偏置项, Bias Units);X1,X2,X2代表初始特征;w0,w1,w2,w3代表权重(Weight),即参数,是特征的缩放倍数;特征经过缩放和偏移后全部累加起来,此后还要经过一次激活运算然后再输出。激活函数有很多种,后面将会详细说明。


举例说明:


X1*w1+X2*w2+...+Xn*wn这种计算方法称为加权求和(Weighted Sum)法,此方法在线性代数里极为常用。加权求和的标准数学符号是,不过为了简化,我在教程里使用女巫布莱尔的符号表示,刚好是一个加号和一个乘号的组合。

这个数学模型有什么意义呢?下面我对照前面那个 y=kx+b 直线拟合的例子来说明一下。


这时我们把激活函数改为Purelin(45度直线),Purelin就是y=x,代表保持原来的值不变。
这样输出值就成了 Y直线点 = b + X直线点*k,即y=kx+b。看到了吧,只是换了个马甲而已,还认的出来吗?下一步,对于每个点都进行这种运算,利用Y直线点和Y样本点计算误差,把误差累加起来,不断地更新b、k的值,由此不断地移动和旋转直线,直到误差变得很小时停住(收敛)。这个过程完全就是前面讲过的梯度下降的线性回归。


一般直线拟合的精确度要比曲线差很多,那么使用神经网络我们将如何使用曲线拟合?答案是使用非线性的激活函数即可,最常见的激活函数是Sigmoid(S形曲线),Sigmoid有时也称为逻辑回归(Logistic Regression),简称logsig。logsig曲线的公式如下:

还有一种S形曲线也很常见到,叫双曲正切函数(tanh),或称tansig,可以替代logsig。
下面是它们的函数图形,从图中可以看出logsig的数值范围是0~1,而tansig的数值范围是-1~1。

《SD敢达大作战》正版卡牌巨作! 强力机师,超级敢达等你来战!
自然常数e


公式中的e自然常数,也叫欧拉数e=2.71828...。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!=1*2*3=6)


再举个通俗点的例子:从前有个财主,他特别贪财,喜欢放债。放出去的债年利率为100%,也就是说借1块钱,一年后要还给他2块钱。有一天,他想了个坏主意,要一年算两次利息,上半年50%,下半年50%,这样上半年就有1块5了,下半年按1块5的50%来算,就有1.5/2=0.75元,加起来一年是:上半年1.5+下半年0.75=2.25元。用公式描述,就是(1+50%)(1+50%)=(1+1/2)^2=2.25元。可是他又想,如果按季度算,一年算4次,那岂不是更赚?那就是(1+1/4)^4=2.44141,果然更多了。他很高兴,于是又想,那干脆每天都算吧,这样一年下来就是(1+1/365)^365=2.71457。然后他还想每秒都算,结果他的管家把他拉住了,说要再算下去别人都会疯掉了。不过财主还是不死心,算了很多年终于算出来了,当x趋于无限大的时候,e=(1+1/x)^x≈ 2.71828,结果他成了数学家。


e在微积分领域非常重要,e^x的导数依然是e^x,自己的导数恰好是它自己,这种巧合在实数范围内绝无仅有。

一些不同的称呼:


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

神经网络


好了,前面花了不少篇幅来介绍激活函数中那个暗藏玄机的e,下面可以正式介绍神经元的网络形式了。
下图是几种比较常见的网络形式:


- 左边蓝色的圆圈叫“输入层”,中间橙色的不管有多少层都叫“隐藏层”,右边绿色的是“输出层”。
- 每个圆圈,都代表一个神经元,也叫节点(Node)
- 输出层可以有多个节点,多节点输出常常用于分类问题。
- 理论证明,任何多层网络可以用三层网络近似地表示。
- 一般凭经验来确定隐藏层到底应该有多少个节点,在测试的过程中也可以不断调整节点数以取得最佳效果。


计算方法:


- 虽然图中未标识,但必须注意每一个箭头指向的连线上,都要有一个权重(缩放)值。
- 输入层的每个节点,都要与的隐藏层每个节点做点对点的计算,计算的方法是加权求和+激活,前面已经介绍过了。(图中的红色箭头指示出某个节点的运算关系)
- 利用隐藏层计算出的每个值,再用相同的方法,和输出层进行计算。
- 隐藏层用都是用Sigmoid作激活函数,而输出层用的是Purelin。这是因为Purelin可以保持之前任意范围的数值缩放,便于和样本值作比较,而Sigmoid的数值范围只能在0~1之间。
- 起初输入层的数值通过网络计算分别传播到隐藏层,再以相同的方式传播到输出层,最终的输出值和样本值作比较,计算出误差,这个过程叫前向传播(Forward Propagation)

前面讲过,使用梯度下降的方法,要不断的修改k、b两个参数值,使最终的误差达到最小。神经网络可不只k、b两个参数,事实上,网络的每条连接线上都有一个权重参数,如何有效的修改这些参数,使误差最小化,成为一个很棘手的问题。从人工神经网络诞生的60年代,人们就一直在不断尝试各种方法来解决这个问题。直到80年代,误差反向传播算法(BP算法)的提出,才提供了真正有效的解决方案,使神经网络的研究绝处逢生。



BP算法是一种计算偏导数的有效方法,它的基本原理是:利用前向传播最后输出的结果来计算误差的偏导数,再用这个偏导数和前面的隐藏层进行加权求和,如此一层一层的向后传下去,直到输入层(不计算输入层),最后利用每个节点求出的偏导数来更新权重。

为了便于理解,后面我一律用“残差(error term)”这个词来表示误差的偏导数


输出层→隐藏层:残差 = -(输出值-样本值) * 激活函数的导数
隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 激活函数的导数


如果输出层用Purelin作激活函数,Purelin的导数是1,输出层→隐藏层:残差 = -(输出值-样本值)


如果用Sigmoid(logsig)作激活函数,那么:Sigmoid导数 = Sigmoid*(1-Sigmoid)
输出层→隐藏层:残差 = -(Sigmoid输出值-样本值) * Sigmoid*(1-Sigmoid) = -(输出值-样本值)*输出值*(1-输出值)
隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 当前节点的Sigmoid*(1-当前节点的Sigmoid)


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



残差全部计算好后,就可以更新权重了:
输入层:权重增加 = 当前节点的Sigmoid * 右层对应节点的残差 * 学习率
隐藏层:权重增加 = 输入值 * 右层对应节点的残差 * 学习率
偏移值的权重增加 = 右层对应节点的残差 * 学习率
学习率前面介绍过,学习率是一个预先设置好的参数,用于控制每次更新的幅度。


此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。
以上介绍的是目前最常见的神经网络类型,称为前馈神经网络(FeedForward Neural Network),由于它一般是要向后传递误差的,所以也叫BP神经网络(Back Propagation Neural Network)

BP神经网络的特点和局限:
- BP神经网络可以用作分类、聚类、预测等。需要有一定量的历史数据,通过历史数据的训练,网络可以学习到数据中隐含的知识。在你的问题中,首先要找到某些问题的一些特征,以及对应的评价数据,用这些数据来训练神经网络。
- BP神经网络主要是在实践的基础上逐步完善起来的系统,并不完全是建立在仿生学上的。从这个角度讲,实用性 > 生理相似性。
- BP神经网络中的某些算法,例如如何选择初始值、如何确定隐藏层的节点个数、使用何种激活函数等问题,并没有确凿的理论依据,只有一些根据实践经验总结出的有效方法或经验公式。
- BP神经网络虽然是一种非常有效的计算方法,但它也以计算超复杂、计算速度超慢、容易陷入局部最优解等多项弱点著称,因此人们提出了大量有效的改进方案,一些新的神经网络形式也层出不穷。

回复
  • 11楼
  • 2014-04-30 02:08
    文字的公式看上去有点绕,下面我发一个详细的计算过程图。
    参考这个:http://www.myreaders.info/03_Back_Propagation_Network.pdf 我做了整理




    回复
    • 12楼
    • 2014-04-30 17:36




      这里介绍的是计算完一条记录,就马上更新权重,以后每计算完一条都即时更新权重。实际上批量更新的效果会更好,方法是在不更新权重的情况下,把记录集的每条记录都算过一遍,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算,这种方法叫批量梯度下降(Batch Gradient Descent)

      推荐的入门级学习资源:


      Andrew Ng的《机器学习》公开课: https://class.coursera.org/ml
      Coursera公开课笔记中文版(神经网络的表示): http://52opencourse.com/139/coursera公开课笔记-斯坦福大学机器学习第八课-神经网络的表示-neural-networks-representation
      Coursera公开课视频(神经网络的学习): http://52opencourse.com/289/coursera公开课视频-斯坦福大学机器学习第九课-神经网络的学习-neural-networks-learning
      斯坦福深度学习中文版: http://deeplearning.stanford.edu/wiki/index.php/UFLDL教程

      回复
      • 14楼
      • 2014-04-30 17:39
        马克一下 不过设计理论的内容附上数学证明最好不过

        收起回复
        • 15楼
        • 2014-05-01 11:14
          表示更希望后续的非入门笔记的放出。另求吧主来撸

          回复
          • 16楼
          • 2014-05-01 12:03
            马克一下

            回复
            • 17楼
            • 2014-05-01 12:49
              嗯,很不错~学习了

              回复
              • 18楼
              • 2014-05-01 13:08
                有用

                回复
                • 19楼
                • 2014-05-01 18:45
                  好贴

                  回复
                  • 20楼
                  • 2014-05-01 22:35
                    楼主真是好人

                    回复
                    • 21楼
                    • 2014-05-03 01:52
                      果然通俗易懂!

                      回复
                      • 22楼
                      • 2014-05-03 12:50
                        此贴已火,俺来浇油

                        回复
                        • 23楼
                        • 2014-05-03 20:12
                          mark

                          回复
                          • 24楼
                          • 2014-05-04 11:40
                            技术学习贴,马克

                            谢谢大家的支持。
                            今天先发个实际编程操作教程,介绍一下Matlab神经网络工具箱的用法,后面有空再加些深入点的知识。

                            回复
                            • 26楼
                            • 2014-05-04 22:12
                              关于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]'; % 特征数据X1,X2
                              t = [10 18 24 6 18 96 28 63]; % 样本值
                              net = newff(p, t, 20); % 创建一个BP神经网络 ff=FeedForward
                              net = train(net, p, t); % 用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 = rand(1,50)*7 % 生成1行50个0~7之间的随机数
                              t = sin(p) % 计算正弦曲线
                              s = [0:0.1:7]; % 生成0~7的一组数据,间隔0.1,用于模拟测试
                              plot(p, t, 'x') % 画散点图



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


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


                              从图中看出,这次的预测结果显然是不理想的,我们需要设置一些参数来调整。

                              回复
                              • 29楼
                              • 2014-05-04 22:33
                                下面的设置是一种标准的批量梯度下降法的配置。


                                % 创建3层神经网络 [隐藏层10个节点->logsig, 输出层1个节点->purelin] traingd代表梯度下降法
                                net = newff(p, t, 10, {'logsig' 'purelin'}, 'traingd'); % 10不能写成[10 1]


                                % 设置训练参数
                                net.trainparam.show = 50; % 显示训练结果(训练50次显示一次)
                                net.trainparam.epochs = 500; % 总训练次数
                                net.trainparam.goal = 0.01; % 训练目标:误差<0.01
                                net.trainParam.lr = 0.01; % 学习率(learning rate)


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


                                注意:newff的第三个参数10不能写成[10 1],否则就是4层网络,两个隐藏层,分别是10个和1个节点。这个很容易弄错。(输出层的节点数程序会自动根据t的维度自动判断,所以不用指定)



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


                                这时的效果显然更差了。




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


                                % 创建2层神经网络 [隐藏层10个节点->logsig, 输出层1个节点->purelin] traingd代表梯度下降法
                                net = newff(p, t, 10, {'logsig' 'purelin'}, 'traingd');


                                % 设置训练参数
                                net.trainparam.show = 50; % 每间隔50次显示一次训练结果
                                net.trainparam.epochs = 9999; % 总训练次数
                                net.trainparam.goal = 0.001; % 训练目标:误差<0.001
                                net.trainParam.lr = 0.06; % 学习率(learning rate)


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


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




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


                                效果比上次稍好一点。不过这条曲线显得坑坑洼洼的很难看,这是一种过拟合(Overfitting)现象,与之相反的是欠拟合(Underfitting)

                                先来解决速度问题,把traingd改为trainlm即可。trainlm使用LM算法,是介于牛顿法和梯度下降法之间的一种非线性优化方法,不但会加快训练速度,还会减小陷入局部最小值的可能性,是Matlab的默认值。



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


                                这个速度比较惊叹了,1秒钟之内完成,只做了6轮计算,效果也好了一些。不过,LM算法也有弱点,它占用的内存非常大,所以没把其它算法给淘汰掉。



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


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


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

                                记号。
                                 
                                 
                                 
                                     
                              • 利_刃
                              • 如果节点数目太少,会出现欠拟合的情况。




                                关于隐藏层的节点个数,一般是要凭感觉去调的。如果训练集的维数比较多,调节起来比较耗时间,这时可以根据经验公式上下浮动地去调整。
                                下面给出几个经验公式供参考:

                                回复
                                • 33楼
                                • 2014-05-04 22:53
                                  如果把输出层改为logsig激活会是什么样子呢?


                                  net = newff(p, t, 3, {'logsig' 'logsig'}); % 创建神经网络
                                  net = train(net, p, t); % 开始训练
                                  y = sim(net, s); % 模拟
                                  plot(s, y, 'x') % 画散点图

                                  可以看出,-1~0范围之间的点都变为0了。使用logsig输出时要想得到完整数值范围的效果,必须先对数据进行归一化才行。






                                  归一化(Normalization),也叫标准化,就是把一堆数字按比例缩放到0~1或-1~1的范围。
                                  虽然用Purelin输出可以不必归一化,但归一化能在一定程度上加快收敛速度,因此被许多教程定为训练前的必须步骤。


                                  公式为:归一值 = (当前值x-最小值min)/(最大值max-最小值min)
                                  如果限定了范围,公式为:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
                                  0.1~0.9的范围:(0.9-0.1)*(x-min)/(max-min)*(0.9-0.1)+0.1
                                  把5, 2, 6, 3这四个数归一化:



                                  Matlab的归一化命令为:mapminmax
                                  注:网上的不少教程里用premnmx命令来归一化,要注意Matlab版本R2007b和R2008b,premnmx在处理单列数据时有bug,Matlab已给出了警告,R2009a版才修正。因此推荐使用mapminmax。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];
                                  [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]; % 测试数据


                                  [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') % 画散点图


                                  神经网络工具箱还有一个UI图形操作界面,执行nntool就可以打开。我觉得不如写代码方便,所以不怎么用。我提供一个相关的教程链接,有兴趣的可以看一下:matlab神经网络工具箱创建神经网络 - http://blog.新浪.com.cn/s/blog_8684880b0100vxtv.html (新浪替换成sina)

                                  回复
                                  • 37楼
                                  • 2014-05-04 23:09
                                    帖子不错,适合初学者

                                    必须顶,现在除了机器人,可以设计半自动化机器人。不过现在还没有那种大型的机器人出现,只能说遗憾

                                    回复
                                    • 41楼
                                    • 2014-05-08 11:51
                                      关于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) 即可。

                                      回复
                                      • 42楼
                                      • 2014-05-09 10:37
                                        logsig


                                        Sigmoid函数(S形函数,Logistic Function)是受统计学模型的启发而产生的激活函数。
                                        基于生物学的神经元激活函数是这样的:





                                        参看:http://eprints.pascal-network.org/archive/00008596/01/glorot11a.pdf


                                        实践证明了基于统计学的Sigmoid函数激活效果要比基于生物学的模型好,而且计算起来很方便,所以说不能以机器和人的相似度为标准来判断AI算法的好坏。
                                        Sigmoid函数原先是个描述人口增长的数学模型,1838提出,给出的是导数形式(概率密度)。人口增长规律:起初阶段大致是指数增长;然后逐渐开始变得饱和,增长变慢;达到成熟时几乎停止增长;整个过程形如一条S型曲线。

                                        回复
                                        • 43楼
                                        • 2014-05-09 10:47
                                          导数的形式知道了,那么它的原函数是什么样子呢?已知导数求原函数,用统计学的话来讲,即根据概率密度函数(PDF)求累积分布函数(CDF),不定积分(Indefinite Integral)就是专门用来做这个的工具。
                                          根据不定积分的知识可知,由于常数项是可变的,所以存在无数个原函数的可能。让我们先用图解法看一下:既然导数是函数曲线的斜率,那么可以把一定数值范围内的斜率,都画成一根根的短斜线,组成斜率场(Slope Fields, Direction Fields),然后根据这些斜线的走势,画出积分曲线。
                                          Matlab可以用quiver命令来画斜率场。



                                          从上图中可以看出,在y轴的0~1之间是个分水岭,0和1处的方向趋于水平。下面放大0~1的范围看看是什么样子的。

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


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

                                          回复
                                          • 44楼
                                          • 2014-05-09 10:51
                                            tansig


                                            双曲正切函数(双极S形函数, tanh, Hyperbolic Tangent),读tanch,18世纪就已经出现了。它的定义是:tanh(x)=sinh(x)/cosh(x),可以由著名的欧拉公式(Euler's formula)推导出来。
                                            用tanh作激活函数,收敛比较快,效果比Logistic函数还要好。
                                            欧拉公式: i是虚数(Imaginary Number)单位,它的定义是: (即i^2 = -1)
                                            题外话:根据上面的公式变换,可以得出史上最美的数学公式: ,数学中最神秘的5个符号e、i、π、1和0,全包含在里面了。







                                            求tanh的导数:




                                            logsig和tansig的关系:

                                            回复
                                            • 45楼
                                            • 2014-05-09 10:56
                                              S函数的来源讲解大赞啊。

                                              回复
                                              • 46楼
                                              • 2014-05-10 17:41
                                                必须顶啊

                                                回复
                                                • 47楼
                                                • 2014-05-11 23:17
                                                  楼主,我可以将你这贴发到“机器学习”吧吗,我会注明出处。

                                                  收起回复
                                                  • 48楼
                                                  • 2014-05-17 17:22
                                                    先顶后学

                                                    相见恨晚的感觉啊!必须给个赞!赞叹你知识的渊博!

                                                    收起回复
                                                    • 50楼
                                                    • 2014-05-19 18:30
                                                      很专业。。。但是我一直觉得现在的神经网络是基于统计学的一种对历史知识的存储方式,和动物的智能存在很大区别

                                                      收起回复
                                                      • 51楼
                                                      • 2014-05-21 00:41
                                                        楼主真专业,让我感觉数学可以诠释一切,但这些真的是太底层了。就像是另一个世界,支撑现实世界的世界

                                                        收起回复
                                                        • 52楼
                                                        • 2014-05-21 11:08
                                                          • 利_刃神经网络是一种比较复杂、不易理解的机制。连百度首席科学家吴恩达(Andrew Ng)都说,他用了许多年的神经网络,开发过许多成功的项目,但至今对这个算法理论也没完全弄明白,重要的是,神经网络算法确实在实践中很起作用,所以我们应该努力学习和使用它。
                                                            2014-5-21 01:53回复
                                                          • shuke0220自己有些不成熟的想法,不另开楼了,在研究人脑方面,可否让机器帮忙呢,比如假设你不了解3d打印的程序设计,手上有台3d打印机,试图从它的运动轨迹和机械结构上去推测它是怎么实现控制的,我们是否可以让一台机器通过大量的传感器,去感应它的运动轨迹,角度,高度,速度,从而推导出控制原理
                                                            2014-5-21 17:15回复
                                                          • shuke0220回复 shuke0220 :就是说,我们不直接去思考,而是指挥机器去做判断,最终得到想要的结论,其实很多大牛做研究,也都员指挥手下或学生去做,自已充当将军的角色,统筹大局,如果手下是一批机器的话。。。。
                                                            2014-5-21 17:23回复
                                                          • shuke0220回复 shuke0220 :我们跑的慢,靠锻炼身体提高速度是没有太多空间(修仙者除外),古人想到的是用马来拉车代步,今人有汽车和飞机,你所需掌握的是驾驭它并保持方向,我们是否将注意转到开发好用的探索思考型工具上
                                                            2014-5-21 17:32回复
                                                          • 天变晴回复 shuke0220 :可以啊,你先弄出个人工智能来,接下来的事就不用你来做了,
                                                            2014-5-21 19:08回复
                                                            • 天变晴回复 shuke0220 :一起逆向工程吧
                                                              2014-5-21 19:10回复
                                                            • shuke0220回复 天变晴 :让古人去想像有一天能登上月球,他们肯定会有很多五花八门的猜想,如嫦娥奔月靠药,有人想到天梯,有人想到大炮,总之都是建立在现有的认识水平上,想利用现有资源一步到位,我认为我们现在创造人工智能条件还不成熟,想太远了,不如创造些思维扩展工具,一步步去往这个方向靠拢
                                                              2014-5-21 19:55回复
                                                            • 利_刃回复 shuke0220 :你说的通过传感器,去感应它的一些属性数据,然后进行一些推断,这个利统计学的方式已经能解决相当一部分问题了。不过要想让机器完全理解每一个步骤的意义,进而判断哪些是对的,哪些是不理想的,哪些是可以改进的,用什么方法去改进等问题,想实现这些还有相当一段距离。还需努力吧。
                                                              2014-5-24 12:19回复
                                                          • 还有3条回复,点击查看
                                                          隔行如隔山,mark

                                                          回复
                                                          • 53楼
                                                          • 2014-05-21 13:37
                                                            不觉名厉。。。感觉高数知识跟不上

                                                            好贴, 这才是深入浅出,去粗取精的讲解,传道授业,就应如此。

                                                            收起回复
                                                            • 55楼
                                                            • 2014-05-22 22:58
                                                              读了大师的贴,如提壶灌顶洗了个热水澡

                                                              收起回复
                                                              • 56楼
                                                              • 2014-05-24 09:49
                                                                e是个好东西

                                                                回复
                                                                • 57楼
                                                                • 2014-05-24 09:51
                                                                  顶上去

                                                                  回复
                                                                  • 58楼
                                                                  • 2014-05-28 10:19
                                                                    感谢楼主,希望以后能见到楼主更多的帖子

                                                                    回复
                                                                    • 59楼
                                                                    • 2014-05-28 13:14
                                                                      人工智能不需要这么多,前pureul和ja就足矣

                                                                      虽说是神经学,也不要这么深奥吧

                                                                      mark! LZ太赞了!!

                                                                      回复
                                                                      • 62楼
                                                                      • 2014-06-17 10:29
                                                                        wow 大赞 中华好博士 咯咯咯咯咯咯

                                                                        回复
                                                                        • 63楼
                                                                        • 2014-06-18 15:04
                                                                          MARK

                                                                          回复
                                                                          • 65楼
                                                                          • 2014-06-19 15:08
                                                                               既然神经网络能够找出规律,有什么办法让神经网络找出“正弦平方加余弦平方等于一”这条规律,并且把它用语言表示出来。这可是初中生的大脑都知道的规律。
                                                                               如果这么简单的智力工作它都做不了的话,那么神经网络的前景实在太渺茫了!

                                                                            收起回复
                                                                            • 66楼
                                                                            • 2014-06-19 18:31
                                                                              • 利_刃神经网络不是万能的,它只是AI领域极为常用的工具之一,它在数据拟合和预测方面的能力是其它工具难以匹敌的,不过在其它的方面,也要和其它工具相互配合才行。贝叶斯理论、傅立叶变换、马尔可夫过程等都是常用工具。
                                                                                2014-6-19 11:05回复
                                                                              • 利_刃目前对于严格数学理论的自动推导和证明,和一些数学问题、过程的自动求解,即使用到神经网络,它也不是主角。深度神经网络目前还处在发展期,还蕴藏着巨大的潜力,某些事情到底能不能做还有待新的探索和验证。
                                                                                2014-6-19 11:05回复
                                                                              • click4i这样比较是无理的。这种数学定律是无数人经过千百年的努力才归纳出来的,所以一点都不简单。你试试让没学过数学的任何人去自己推出来看看。别说三角定律了,光是现代人熟悉的貌似简单的"零“这个观念都也不是个没受教育没有文化的自然人会懂的。
                                                                                2014-6-19 11:29回复
                                                                              • ruiaijun回复 利_刃 :楼主利_刃是个行家,不把话说得很满,与在我的主题里死挺神经网络的人相比,回答客观得多。但是这个问题不是没办法用圣经网络解决,就用楼主讲述的方式,给正弦平方加余弦平方输入不同值,计算该值。由计算机的计算误差,其结果应该在1附近漂移,用这些数据训练楼主给出的人工神经网络,
                                                                                2014-6-19 14:18回复
                                                                              • ruiaijun回复 利_刃 :(接上)其预期输出值应该是1。但是神经网络绝不可能把这个结果用语言表述出来。这个证明在初中几何课本就有。不一定用复杂的方法,不用推理机,从离散数学角度,就可以找到计算机证明的方法。
                                                                                2014-6-19 14:23回复
                                                                                • ruiaijun回复 利_刃 :(接上)我们设计一个没有任何数学公式的程序,那里要先给出证明该公式的预备条件:(1)正弦等于对边A比斜边C。(2)余弦等于临边B比斜边C。(3)对边平方加临边平方等于斜边平方。(4)如X/Y;Z/Y;X/Y+Z/Y=(X+Z)/Y。
                                                                                  2014-6-19 14:44回复
                                                                                • ruiaijun回复 利_刃 :(接上)(5)如(X/Y)^2=X^2/Y^2。求证:正弦平方加余弦平方=?程序里设置两个替代操作:(1)等量替代:把等式左侧的用等式右侧的代替。(2)假设量替代:把假设相等的东西,带入相关公式。程序里设一个表达操作:把证明过程显示出,用一个等式把求证结果表达出来。
                                                                                  2014-6-19 15:01回复
                                                                                • ruiaijun回复 利_刃 :预备条件补充:(6)X/X=1(补充结束)。(接上)程序里还设置一个找寻相关等式的操作。 先按上述要求编写程序,然后就运行程序。程序的运行情况大体是这样:程序从求证项出发,进行找寻操作,在预备条件里找寻相关等式。先找到(1),用等量替代操作把它代入求证项的相关位置。
                                                                                  2014-6-19 15:40回复
                                                                                • ruiaijun回复 利_刃 :(接上)然后找到(2),用等量替代操作把它也代入求证项的相关位置。得到:(A/C)^2+(B/C)^2=?然后继续进行找寻操作。找到(5),用假设量(设X=A/C;Y=B/C)替代操作,代入后得到:A^2/C^2+B^2/C^2=?
                                                                                  2014-6-19 15:43回复
                                                                                • ruiaijun回复 利_刃 :(接上) 然后继续进行找寻操作。找到(4),用假设量(设X=A^2/C^2;Y=B^2/C^2)替代操作,代入后得到: (A^2+B^2)/C^2=?
                                                                                  2014-6-19 15:44回复
                                                                              • 还有36条回复,点击查看
                                                                              计算机三个区,控制区,储存区,处理区。其实和大脑差距不大,但是发展却让计算机失去主控制,让人来控制!如果计算机起初就会感知到某个事物就传回处理区,处理区得到的感知就会在储存区扫描历史记录,扫描成功后在传到控制区实行某种控制,这样就会达到自主操作。lz你觉得它未来会成为真正意义上的机器人吗?

                                                                              收起回复
                                                                              • 67楼
                                                                              • 2014-06-20 15:57
                                                                                • 利_刃动物也有控制区、储存区和处理区,单是靠这种结构还不足以实现高智能的机器人。我们还面临一系列的问题,如何进行感知?感知的数据该如何存储和加工?以何目的或动机加以控制?个体之间如何协作?这些问题的逐步解决将引导人工智能的逐步实现。
                                                                                  2014-6-20 20:37回复
                                                                                • ruiaijun回复 利_刃 :“如何进行感知?感知的数据该如何存储和加工?”这两个问题要由“模拟感觉”来解决。包括用“非模糊数学”的真模糊理论解决信息加工问题,还有模式提取问题、一般性模式识别问题、创造性模式识别问题等诸方面。用离散法考虑其程序,不难解决。
                                                                                  2014-6-21 01:40回复
                                                                                • ruiaijun回复 利_刃 :“以何目的或动机加以控制?”这个问题涉及到“模拟需要”。包括原始欲望的设置、高级需要的生成、需要在发动活动中的地位等。用离散法考虑其程序也不难解决。
                                                                                  2014-6-21 01:43回复
                                                                                • ruiaijun回复 利_刃 :“个体之间如何协作?”表面看是协作问题,实际是群体学习问题。包括群体对个体学习的影响,个体知识(经验)在群体的传播,个体间的交流互进,个体间的竞争互进等,也要用离散编程法解决。
                                                                                  2014-6-21 01:47回复
                                                                                relocy不要把人脑附于在冯诺依曼架构上。冯诺依曼架构对于神经网络来说本身就是一个瓶颈。
                                                                                 

                                                                                证明正弦平方加余弦平方等于一
                                                                                  楼主利_刃是个行家,不把话说得很满,与在我的主题里死挺神经网络的人相比,回答客观得多。但是这个问题不是没办法用神经网络解决,就用楼主讲述的方式,给正弦平方加余弦平方输入不同值,计算该值。由计算机的计算误差,其结果应该在1附近漂移,用这些数据训练楼主给出的人工神经网络,其预期输出值应该是1。但是神经网络绝不可能把这个结果用语言表述出来。


                                                                                  这个证明在初中几何课本就有。不一定用复杂的方法,不用推理机,从离散数学角度,就可以找到计算机证明的方法。如何做那?


                                                                                  我们设计一个没有任何数学公式的程序,那里 给出证明该公式的预备条件:
                                                                                  (1)正弦等于对边A比斜边C。………………………………(正弦定义)
                                                                                  (2)余弦等于邻边B比斜边C。………………………………(余弦定义)
                                                                                  (3)对边平方加邻边平方等于斜边平方。……………………(勾股定理)
                                                                                  (4)如X/Y;Z/Y;则X/Y+Z/Y=(X+Z)/Y。……(通分)
                                                                                  (5)(X/Y)^2=X^2/Y^2。……………………(分数平方的展开)
                                                                                  (6)X/X=1。………………………………………………(除法规则)


                                                                                  准备条件是证明中不可少的,我的这个程序简单,只给出必备条件。完善的证明程序,其条件会比所需条件多很多,这也就提高了选择必备条件的难度。
                                                                                  注意“……()”是我用来说明程序的,不写进程序中。条件是要写进程序中的,对于程序来讲,它们只不过是一些字符串,程序对它们的含义并不理解,完成证明也不需要程序对公式理解。


                                                                                  求证:正弦平方加余弦平方=?
                                                                                  程序运行要从求证出发,“求证”二字只是为了使程序找到出发点,也不要求程序的理解。对于程序来说,这两个字只是两个连接的字符。它以后的字符串(欲证之公式),才是程序找寻操作的依据。

                                                                                回复
                                                                                • 68楼
                                                                                • 2014-06-20 16:17
                                                                                                    (接68楼)
                                                                                    程序里设置两个替代操作:
                                                                                    (1)等量替代:把等式左侧的用等式右侧的代替。
                                                                                    (2)假设量替代:把假设相等的东西,带入相关公式。
                                                                                    程序里还设置一个表达操作:把证明过程显示出来,再用一个等式把求证结果表达出来。
                                                                                    程序里还设置一个找寻操作:寻找相关等式的操作。


                                                                                    “等量替代操作”,是把完全相同的字符用等号后面的字符代替,程序在替代时完全不理解字符的含义。“假设量替代操作”,它比较复杂,首先它需要识别(但不必理解)等号和运算符号,把运算符号隔开的字符串作为操作对象。完成假设时,把某一个单字符对象用等号与其它公式的操作对象连接。然后用等量替代操作,进行替代。
                                                                                    找寻操作,就是先把求证的某一操作对象,在准备条件中检索该字符串,发现它的位置,就进入替代操作。如果准备条件多于必备条件,有些检索到的结果可能是无用的,下面的工作就会无法进行,此时要放弃检索到的公式。继续寻找。这个过程也叫做“尝试错误”过程。在离散法模拟思维时,尝试错误过程是不可少的。但是,本程序由于只有必备条件,不必经历尝试错误过程。
                                                                                    表达操作,就是把证明每步结果显示出来,中间过程(例如尝试错误过程)则不显示。这些作用在编程时要考虑进去。

                                                                                  回复
                                                                                  • 69楼
                                                                                  • 2014-06-20 16:57
                                                                                                     (接69楼)
                                                                                      先按上述要求编写程序,然后就运行程序。程序的运行情况大体是这样:
                                                                                      程序从求证项出发,进行找寻操作,在预备条件里找寻相关等式。先找到(1),用等量替代操作把它代入求证项的相关位置。然后找到(2),用等量替代操作把它也代入求证项的相关位置。得到(表达操作):
                                                                                      (A/C)^2+(B/C)^2=?
                                                                                      然后继续进行找寻操作。找到(5),用假设量(设X=A/C;Y=B/C)替代操作,代入后得到(表达操作):
                                                                                      A^2/C^2+B^2/C^2=?
                                                                                      然后继续进行找寻操作。找到(4),用假设量(设X=A^2/C^2;Y=B^2/C^2)替代操作,代入后得到(表达操作):
                                                                                      (A^2+B^2)/C^2=?
                                                                                      然后继续进行找寻操作。找到(3),用等量替代操作,代入后得到(表达操作):
                                                                                      C^2/C^2=?
                                                                                      然后继续进行找寻操作。找到(6),用假设量(设X=C^2)替代操作,代入后得到(表达操作):
                                                                                      C^2/C^2=1
                                                                                      最后,用假设量(设?=1)替代操作把结果代入求证,得到(表达操作):
                                                                                      正弦平方+余弦平方=1


                                                                                      以上运行过程的一段段语言部分,是程序操作过程,屏幕不显示。“得到(表达操作):”后面的公式在屏幕上显示,其为程序证明过程的真实写照。
                                                                                      我给出的证明正弦平方加余弦平方等于1的程序。依靠三个主要操作(找寻操作、等量替代操作、假设量替代操作),用离散的方式,还可以证明很多数学上的公式、定理。它虽然还不那么智力高超,但是它的智力应该比连续数学的各种模型高。


                                                                                      值得注意的是,在这个程序中我们没有用数学方法构造程序,什么加权平均、权重、调和函数都靠边站。只用到三个操作:找寻操作、等量替代操作和假设量替代操作。我把这种不用高等数学唬人的编程理念,叫做图灵主义。

                                                                                    收起回复
                                                                                    • 70楼
                                                                                    • 2014-06-20 17:01
                                                                                      • ruiaijun人们会问:这不是和我们想题的过程类似吗?就是这样。可它是计算机程序完成的。这才叫做模拟思维嘛!
                                                                                        2014-6-20 14:33回复
                                                                                      • 利_刃回复 ruiaijun :感谢rui老的精彩论述,您要表达的意思就是举例说明我前面说过的神经网络不擅长做的某些事情吧。其实可以举个更简单的例子,让神经网络证明一下“2+1=3”。神经网络只能拟合,无法证明。而用找寻操作、等量替代操作...配合皮亚诺公理就可以轻易证明了,这样简单到连小学生都能看懂。
                                                                                        2014-6-20 20:35回复
                                                                                      • 利_刃回复 ruiaijun :您的图灵主义也并非什么都擅长。例如高斯利用最小二乘法找到了谷神星的运动轨迹,如果不用最小二乘法,只用找寻操作、等量替代操作和假设量替代操作恐怕也很难达到目的吧。不知道您为什么把不用高等数学的编程理念叫做图灵主义,图灵可是少见的数学天才喔。
                                                                                        2014-6-20 20:35回复
                                                                                      • 利_刃神经网络可以是离散的,神经元的输出只取1和0这两个值就是离散的,例如Hopfield网络。
                                                                                        2014-6-20 20:36回复
                                                                                      • ruiaijun回复 利_刃 :“神经网络可以是离散的……”那么是否其激活函数也是离散函数呢?我指的当然不是取值,取值可以人为的取离散数。是否函数也是离散函数,例如级数(非函数项级数)。如果不是,该人工神经网络仍然不是真离散的。
                                                                                        2014-6-20 21:38回复
                                                                                        • ruiaijun回复 利_刃 :“这样简单到连小学生都能看懂”我问两句:第一个问题是,既然这样简单,为什么大多数人还认为模拟思维很难?第二个问题,为什么大多数人都不认为由此能产生高级模拟思维?
                                                                                          2014-6-20 21:43回复
                                                                                        • ruiaijun回复 利_刃 :“您要表达的意思就是举例说明我前面说过的神经网络不擅长做的某些事情吧。”有这个意思,也不全是。我还想展示离散编程的重要意义。很多人否定离散编程法,甚至污蔑为民科、伪科学。动辄问什么数据类型?离散就有两种数据,一是离散数字,二是离散符号(如字符串)。还用再问吗?
                                                                                          2014-6-20 21:50回复
                                                                                        • ruiaijun回复 利_刃 :“不知道您为什么……”因为我的“人工智能用离散法编程”的思想产生于离散数学中的图灵自动机理论。图灵机是一种没有任何计算功能的模型自动机,但是它可以编程计算,也可以完成“人们通过编程交给它的任何任务”。我就把不依赖“数字数学”的方法实现人工智能的思想叫做图灵主义。
                                                                                          2014-6-20 22:01回复
                                                                                        • ruiaijun回复 利_刃 :“例如高斯利用最小二乘法找到了谷神星的运动轨迹……”在高斯找到最小二乘法以前,他头脑里难道不是用找寻操作、等量替代操作、假设量替代操作在他的知识里找寻这种方法吗?最小二乘法对于高斯头脑来说是结果不是元操作。它只是解读外部世界的数学工具而已。(未完)
                                                                                          2014-6-20 22:09回复
                                                                                        • ruiaijun回复 利_刃 :(接前未完)就是在利用最小二乘法解读外部世界时,高斯和他的伙伴们,他们的头脑之中,那些元操作不知又运行了多少次,才完成预测了轨迹,并有了重大的观测发现。模拟人类智能,难道不应该回归到头脑里的这些元操作吗?为什么科学界总是回避思维的元操作呢?
                                                                                          2014-6-20 22:15回复
                                                                                      • 还有8条回复,点击查看
                                                                                      rui老有没有读过四五十年前流行过的自动定理证明机(automatic theorem prover)?你的东西在功能上看来是那种自动定理证明机的一个子集,所以或许你可以去参考看看是不是相关。这类系统在性质上是在执行演绎逻辑,而人工神经网络是在从训练集之中学出规则因此观念上接近归纳法,所以在这里谈定理证明就离题远了。

                                                                                      收起回复
                                                                                      • 72楼
                                                                                      • 2014-06-21 13:37
                                                                                        • ruiaijun推理机要先依据数理逻辑编写好推理公式,然后给足推理的各种条件,指定命题内容。运行中就依靠编好的逻辑公式演算下去,直到运行结束。四色定理就是用推理机证明的,用时很长,却写不出让人看得到的证明过程。。我的证明过程与推理机完全不同。它自己寻找资料,自己确定并写出证明过程。(未完)
                                                                                          2014-6-21 09:29回复
                                                                                        • ruiaijun(接上)和推理机方向相反,推理机是先确定推理过程,再进行推理。我的程序并不事先确定推理过程,由它自己找寻资料,自己确定推理过程。由于都是逻辑推理,我的程序是事后显示出它符合逻辑规则的。因此它和推理机是两个完全不同的证明体系。
                                                                                          2014-6-21 09:36回复
                                                                                        • ruiaijun对于你说的“离题远了”。我想说,归纳法也有区别:有依靠连续数学的模拟归纳法,还有用离散法编写的归纳法。后者因为不依赖连续数学,直接用语言归纳,不仅能够实现归纳,而且能够表达其过程。这是人工神经网络绝不可能办到的。我的题就是“展示离散法能够解决连续数学法不能解决的问题”。你怎么看?
                                                                                          2014-6-21 09:45回复
                                                                                        • click4i回复 ruiaijun :推理机是在得到命题之后就全自动的依据一阶谓词逻辑去找出解法。所以这里我想你是误解了推理机的操作方式。你说的四色定理并不是个好例子,因为它本来就是个极难的问题,你的方法也解不出来的。
                                                                                          2014-6-21 10:20回复
                                                                                        • click4i回复 ruiaijun :我会说你离题是由于下列理由。一是你的方法显然是在做演绎而不是归纳学习,因此离本楼主旨甚远。二是你的方法用的其实是符号逻辑symbolic logic不是离散数学discrete math。三是神经网络也有用离散激活函数和权值的,也有能学一阶谓词逻辑数据的,不是都是连续数学。
                                                                                          2014-6-21 14:30回复
                                                                                          • ruiaijun回复 click4i :不知你是如何理解推理机的功能的,你是否简单的介绍一下。至于四色定理,我还没有做过解它的尝试。我相信依据计算机的高速能力,它应该能够证明得出来,并找出四色定理的证明的简洁表达形式的。让人们看到。
                                                                                            2014-6-21 14:45回复
                                                                                          • ruiaijun回复 click4i :前面的回复,我确实误解了推理机的操作方式。我在下一楼将修改回复。
                                                                                            2014-6-21 15:36回复
                                                                                          • ruiaijun回复 click4i :“……你的方法也解不出来的。”我没有尝试过证明四色定理,但是由于计算机运行速度很快,我相信这类离散法——元操作结构的思维程序,可以完成四色定理的证明,并且还能够为人们展示出间接地表达形式。
                                                                                            2014-6-21 15:41回复
                                                                                          • ruiaijun回复 ruiaijun :近半小时后,两个找不到的帖子才又显示,我已经在下楼重发了,就这样吧。
                                                                                            2014-6-21 15:58回复
                                                                                        • 还有4条回复,点击查看
                                                                                          与click4i关于推理机的讨论,我的回复有错误,经思考,修改如下:


                                                                                          click4i回复:rui老有没有读过四五十年前流行过的自动定理证明机(automatic theorem prover)?你的东西在功能上看来是那种自动定理证明机的一个子集,所以或许你可以去参考看看是不是相关。这类系统在性质上是在执行演绎逻辑,而人工神经网络是在从训练集之中学出规则因此观念上接近归纳法,所以在这里谈定理证明就离题远了。


                                                                                          我的回答:从这个所证明问题上看,它恰好表现出演绎逻辑,推理机与我的程序有一点相似,但是实际却完全不同。我的程序并不懂得逻辑(不按任何逻辑编程),不懂的推理(不按任何推理规则编程),不是专家(不按任何专家经验编程)。程序本身是没有智能的,它只是机械的执行四个元操作(严格的说,替代是一个元操作,等量替代和假设量替代是它的后代操作),就得到证明结果。
                                                                                          它完全是对大脑离散操作的模拟,因此程序结构十分简单。如果能够给它归纳目标(某种表达或某种计算方式),它也可以完成归纳,可以总结出可表达的规律来,其具体程序例子我正在设计。
                                                                                          四色定理就是用推理机证明的,用时很长,却写不出让人看得到的证明过程。


                                                                                          我的回答:对于你说的“离题远了”。我想说,归纳法也有区别:有依靠连续数学的模拟归纳法,还有用离散法编写的归纳法。后者因为不依赖连续数学,直接用语言归纳,不仅能够实现归纳,而且能够表达其过程。这是人工神经网络绝不可能办到的。我的题就是“展示离散法能够解决连续数学法不能解决的问题”。你怎么看?

                                                                                        回复
                                                                                        • 73楼
                                                                                        • 2014-06-22 06:56
                                                                                            click4i回复:推理机是在得到命题之后就全自动的依据一阶谓词逻辑去找出解法。所以这里我想你是误解了推理机的操作方式。你说的四色定理并不是个好例子,因为它本来就是个极难的问题,你的方法也解不出来的。


                                                                                            我的回答:前面的回复,我确实误解了推理机的操作方式。现修改回复。
                                                                                            我没有尝试过证明四色定理,但是由于计算机运行速度很快,我相信这类离散法——元操作结构的思维程序,可以完成四色定理的证明,并且还能够为人们展示出间接地表达形式。




                                                                                            click4i回复:我会说你离题是由于下列理由。一是你的方法显然是在做演绎而不是归纳学习,因此离本楼主旨甚远。二是你的方法用的其实是符号逻辑symbolic logic不是离散数学discrete math。三是神经网络也有用离散激活函数和权值的,也有能学一阶谓词逻辑数据的,不是都是连续数学。(此贴由于我们两人同时发帖,在网页上同时不能显示……我的回复是后补的,因此我在下两楼重发此讨论)


                                                                                            我的回答:一,刚好这个证明问题要用演绎方式,并不是程序只能做演绎。它既然可以做归纳,与本主题主旨就很接近。二,我用的方法没有逻辑,只有几个不懂逻辑的操作,与symbolic logic无关。它用得是离散法,而不是离散数学,与离散数学关系也不大。三,不知你所说神经网络能否为1、3、5、7、9、……写出归纳公式来?

                                                                                          收起回复
                                                                                          • 74楼
                                                                                          • 2014-06-22 07:01
                                                                                            • click4i要讨论的话还是另开一搂吧,没事把楼主辛苦建起来的优质教学课程给搞混了。
                                                                                              2014-6-21 16:28回复
                                                                                            • ruiaijun回复 click4i :楼主是一个做学问的人,他一定没有时间在别人的主题里闲聊。我在此发帖,就是想让他抽空对我的思路做一下指点。与那些一知半解的人相比,楼主的观点更有警示意义。我想楼主也不想搞一言堂。你若有讨论兴趣,你可以专开一主题与我讨论。有内容的话,我会参与。
                                                                                              2014-6-21 17:11回复
                                                                                            • 利_刃回复 ruiaijun :不敢当,我目前多数都讨论一些书面知识。当然关于一些自己的想法还是有的。因为一些自我感觉不错的想法,在实践中常常会遇到种种挫折,所以我更倾向尽量用实践来验证这些想法。
                                                                                              2014-6-22 06:10回复
                                                                                            • 利_刃回复 ruiaijun :后面的话题就在你的 “离散编程法和智能元操作”http://tieba.baidu.com/p/3120753025 讨论了。
                                                                                              2014-6-22 06:11回复
                                                                                            • ruiaijun回复 利_刃 :“所以我更倾向尽量用实践……”我何尝不是用实践来检验自己的想法,六年前,我还尽量把自己的设想写成程序,现在更老了,编不动了,就只好用流程说程序了。
                                                                                              2014-6-22 07:38回复
                                                                                              • ruiaijun回复 利_刃 :“:后面的话题……”多谢关照!也许你会把我的想法驳得体无完肤,但是真心研究学问,那样也会很舒服。
                                                                                                2014-6-22 07:41回复
                                                                                            • 还有1条回复,点击查看
                                                                                            楼主真是好人,看了这个楼,对神经网络顿时明白了很多

                                                                                            回复
                                                                                            • 75楼
                                                                                            • 2014-06-25 15:15
                                                                                              浅显易懂,很好

                                                                                              回复
                                                                                              • 76楼
                                                                                              • 2014-07-15 16:35
                                                                                                好,希望楼主能以通俗易懂的方式讲解,加油

                                                                                                回复
                                                                                                • 77楼
                                                                                                • 2014-07-15 18:08
                                                                                                  mark,讲的很好

                                                                                                  回复
                                                                                                  • 78楼
                                                                                                  • 2014-07-16 15:27
                                                                                                    mark

                                                                                                    mark一个,漫漫看

                                                                                                    回复
                                                                                                    • 80楼
                                                                                                    • 2014-08-10 20:57
                                                                                                      赞一个

                                                                                                      希望来我吧多交流,我吧搜集各方面人才,吧名为 站在角落改变世界

                                                                                                      这个讲得深入浅出,非常好的入门教程。

                                                                                                      回复
                                                                                                      • 83楼
                                                                                                      • 2014-09-21 00:04
                                                                                                        收藏,慢慢看。楼主持续啊

                                                                                                        回复
                                                                                                        • 84楼
                                                                                                        • 2014-09-21 12:14
                                                                                                          没想到图灵机器人就是依据这种算法来做的,顿感牛逼啊!http://www.tuling123.com/openapi/cloud/proexp.jsp

                                                                                                          回复
                                                                                                          • 85楼
                                                                                                          • 2014-09-25 17:12
                                                                                                            真的好帖啊..看黑皮书BP看了两天才明白的东西楼主几幅图就讲明白了

                                                                                                            回复
                                                                                                            • 86楼
                                                                                                            • 2014-09-27 11:00
                                                                                                              楼主根据神经元的算法编个程序,培养个几十年,说不定就出现机器大脑了。

                                                                                                              回复
                                                                                                              • 87楼
                                                                                                              • 2014-09-27 11:16
                                                                                                                作为即将要踏入机器学习领域的我,看到这篇帖子真的很幸运,少走了不少弯路,再结合之前有学过Andrew的机器学习视频,借这篇帖子把一些概念连贯在一起了。

                                                                                                                回复
                                                                                                                • 88楼
                                                                                                                • 2014-11-15 15:22
                                                                                                                  感谢lz.明白了很多.深入浅出.感谢.


                                                                                                                  回复
                                                                                                                  • 90楼
                                                                                                                  • 2014-11-16 23:43
                                                                                                                    顶一下

                                                                                                                    谢谢,

                                                                                                                    回复
                                                                                                                    • 92楼
                                                                                                                    • 2014-11-20 09:43
                                                                                                                      真的受益匪浅 谢谢楼主

                                                                                                                      回复
                                                                                                                      • 93楼
                                                                                                                      • 2015-01-09 01:20

                                                                                                                      No comments:

                                                                                                                      Post a Comment