神经网络中交叉熵代价函数 求导
2016-04-15 15:17
295 查看
最近看了几篇神经网络的入门介绍知识,有几篇很浅显的博文介绍了神经网络算法运行的基本原理,首先盗用伯乐在线中的一个11行python代码搞定的神经网络,
确实该博文运用浅显的语言解释了神经网络的基本来龙去脉(剩下的由开发者自由发挥了),从输入层到隐藏层到最终的输出,基本都是这样一张图描述的:
下面该讲重点了,就是最核心的运用梯度下降来训练模型,加快计算的效率,这个就是代码 l1_delta = l1_error * nonlin(l1,True) 的功效,只可惜这行代码看似简单,背后涉及了的公式推导还不少,其实很多算法看似简单的编码背后都是隐藏了大量的公式推导,这个才是最困难的,不废话,讲重点。
神经网络中的损失函数采用了交叉熵的公式,而没有采用通常的差的平方和公式(具体解释可看http://blog.csdn.net/u012162613/article/details/44239919),这个目的当然是为了简化计算的复杂度,深度学习也是因为简化了神经网络的计算复杂度得以推广了,公式如下,x,y代表了训练集中的输入样本x及真实类别值y:
其中,a是神经元中的sigmod函数,也是最终的预测值,即上图中的f(·)函数值,表达式为:
其中,对a求导后的表达式为,a的求导值可以用a表示:
而z是输入样本x的线性组合,这一个神经元的处理跟逻辑回归很像的,即:
然后,基本公式都列出来(盗图,σ()就是f()),可以求使得C取得最小值的w,b了,分别对w,b求导,然后就会得出:
最终,梯度下降法就是为了计算对于w,b的更新速率,这里面的好处可以参考更权威的解释了。
import numpy as np # sigmoid function def nonlin(x,deriv=False): if(deriv==True): return x*(1-x) return 1/(1+np.exp(-x)) # input dataset X = np.array([ [0,0,1], [0,1,1], [1,0,1], [1,1,1] ]) # output dataset y = np.array([[0,0,1,1]]).T # seed random numbers to make calculation # deterministic (just a good practice) np.random.seed(1) # initialize weights randomly with mean 0 syn0 = 2*np.random.random((3,1)) - 1 for iter in xrange(10000): # forward propagation l0 = X l1 = nonlin(np.dot(l0,syn0)) # how much did we miss? l1_error = y - l1 # multiply how much we missed by the # slope of the sigmoid at the values in l1 l1_delta = l1_error * nonlin(l1,True) # update weights syn0 += np.dot(l0.T,l1_delta) print "Output After Training:" print l1
确实该博文运用浅显的语言解释了神经网络的基本来龙去脉(剩下的由开发者自由发挥了),从输入层到隐藏层到最终的输出,基本都是这样一张图描述的:
下面该讲重点了,就是最核心的运用梯度下降来训练模型,加快计算的效率,这个就是代码 l1_delta = l1_error * nonlin(l1,True) 的功效,只可惜这行代码看似简单,背后涉及了的公式推导还不少,其实很多算法看似简单的编码背后都是隐藏了大量的公式推导,这个才是最困难的,不废话,讲重点。
神经网络中的损失函数采用了交叉熵的公式,而没有采用通常的差的平方和公式(具体解释可看http://blog.csdn.net/u012162613/article/details/44239919),这个目的当然是为了简化计算的复杂度,深度学习也是因为简化了神经网络的计算复杂度得以推广了,公式如下,x,y代表了训练集中的输入样本x及真实类别值y:
其中,a是神经元中的sigmod函数,也是最终的预测值,即上图中的f(·)函数值,表达式为:
其中,对a求导后的表达式为,a的求导值可以用a表示:
而z是输入样本x的线性组合,这一个神经元的处理跟逻辑回归很像的,即:
然后,基本公式都列出来(盗图,σ()就是f()),可以求使得C取得最小值的w,b了,分别对w,b求导,然后就会得出:
最终,梯度下降法就是为了计算对于w,b的更新速率,这里面的好处可以参考更权威的解释了。
相关文章推荐
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Sql Server中REPLACE函数的使用
- PowerShell函数简明教程