机器学习(11.3)--神经网络(nn)算法的深入与优化(3) -- QuadraticCost(二次方代价函数)数理分析

    
    在前面的文章已经对神经网络的基本算法流程做了详细的介绍
    机器学习(1)--神经网络初探
    机器学习(10.4)--手写数字识别的不同算法比较(4)--神经网络

    在这中间使用的就是QuadraticCost(二次方代价函数),其实在我们代码中并没有相关的代码,那这个所以的代价函数是什么?

    在文章 机器学习(7)--梯度下降法(GradientDescent)的简单实现  使用的其实就是QuadraticCost


    这篇文章我们将从数理上对QuadraticCost进行讲解:

以下是原本我们训练单条记录时的代码,

def itemData(item,layers,weights,biases):
    #开始正向计算
    zs = []
    acts = [item[0]]
    for w,b in zip(weights,biases):
        z = np.dot(w,acts[-1]) + b
        zs.append(z)
        acts.append(sigmoid(z))
    #开始反向计算
    item_w = [np.zeros(b.shape) for b in weights]   
    item_b = [np.zeros(b.shape) for b in biases]  
    for index in range(-1,-1 * len(layers),-1):
        if index == -1:
            item_b[index] = acts[index] - item[1] 
        else:
            item_b[index] = np.dot(weights[index + 1].T,item_b[index + 1])
        item_b[index] = item_b[index] * sigmoid_deriv(zs[index])  
        item_w[index] = np.dot(item_b[index],acts[index - 1].T)
    return item_w,item_b

在正向计算的循环最后一步我们会得出我们要计算值 acts[-1] 这时我设这个值为a 

而当条记录item[1] 就是实际值,也就是y或是y(x)

那么我们定义

       这也就是最二次方代价意思



因此在求得最后一层神经元


这时我们对最后一层的w,b求偏导数, 



其中x在程序代码对应的是a[-2],


因此直接用

if index == -1:
    item_b[index] = acts[index] - item[1] 
else:
    item_b[index] = np.dot(weights[index + 1].T,item_b[index + 1])
item_b[index] = item_b[index] * sigmoid_deriv(zs[index])  

item_w[index] = np.dot(item_b[index],acts[index - 1].T)

取得detal,

看到这里,应该明白为什么我们代码中没有cost,也没有二次方,但依然把这称之为QuadraticCost(二次方代价函数)

代码没有发生任何变化,也就不再粘贴出来了


你可能感兴趣的:(python,机器学习)