神经网络是深度学习的基础,所以我认为,学习深度学习有两大基石,即:学好神经网络理论,学好实现理论的利器——Python。
一篇很好的文章,用Python编写了简单的BP神经网络,并几乎将所有代码解释了一遍。原文链接如下:http://python.jobbole.com/82758/
我在研究之后,自己试着重复那段程序,经过思考,终于理解了。下面是我在eclipse下编写的代码:
#-*-coding:utf-8 -*- import numpy as np #首先创建sigmoid函数 def nonlin(x,deriv=False): if deriv==True: return x*(1-x) return 1/(1+np.exp(-x)) #然后创建x和y x=np.array([[1,0,0], [0,0,1], [0,1,0], [1,0,1] ]) y=np.array([[1,0,0,1]]).T #创建syn0,为权重矩阵。随机生成,注意控制其范围在-1到1 syn0=2*np.random.random([3,1])-1 #训练网络,开始循环。根据差别修改权重矩阵-更新l0层数据-循环n次 for i in xrange(1000): #网络有两层,l0和l1. l0=x l1=nonlin(np.dot(l0,syn0)) l1_error=y-l1 l1_delta=l1_error*nonlin(l1,deriv=True) syn0+=np.dot(l0.T,l1_delta) print "the training result is:" print l1 得到如下结果:
the training result is: [[ 0.99849276] [ 0.04149694] [ 0.02333249] [ 0.96630778]] 可以看出,这与标准答案[1,0,0,1]已经很接近了。
不过,这样的训练也有缺陷,那就是过拟合。(说明我最近看的相关论文确实不少,哈哈)也就是说,输入别的实例时,结果可能与真实情况相差甚远。解决过拟合当然也有很多种方法,但上述例子操作简便,又是一切的基础,所以先将其实现。
这样的情况与《数值分析》有点像:数值分析的基本思想就是线性化,一个拉格朗日插值公式能用在数值微分、数值积分等多个领域。所谓难者不会,会者不难。
通过这几天的学习,我对深度学习也有了新的想法:深度学习就是发现那些不明显的特征,并把它们区分出来。这与数字图像处理中的时域到频域的变换有些神似,不知是不是巧合。卷积神经网络我还没有细看,或许那种网络就是基于这个思想吧。