您的位置:首页 > 理论基础 > 计算机网络

神经网络中交叉熵代价函数 求导

2016-04-15 15:17 295 查看
最近看了几篇神经网络的入门介绍知识,有几篇很浅显的博文介绍了神经网络算法运行的基本原理,首先盗用伯乐在线中的一个11行python代码搞定的神经网络

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的更新速率,这里面的好处可以参考更权威的解释了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  神经网络 函数