学习笔记-神经网络(三)

#两种代价函数的对比
经过几天的反复学习,终于弄懂了二次代价函数和交叉熵代价函数的原理,也写了一点代码进行验证,虽然没有得出和书中相同的结果,而且也没有找到差异的原因,但仍然值得记录下来,如果将来有了更深入的理解,也可以回过头来看看最初所走的弯路。

  • 二次代价函数计算权重和偏置的公式
    这里写图片描述
  • 交叉熵代价函数计算权重和偏置的公式
    这里写图片描述

利用上面几个公式,编写计算一个神经元权重和偏置的代码,验证两种代价函数的性能差异,神经元的输入和初始权重和偏置如下图,学习目标的输出为0:
这里写图片描述

import math
def calc_cost_cross(y, a):
    #计算交叉熵代价
    return -1*(y*math.log(a)+(1-y)*math.log(1-a))

def calc_cost(y, a):
    #计算二次函数代价
    return pow((y-a),2)/2

def sigmod(z):
    #计算激活函数
    return 1.0/(1.0+math.exp(-z))

def sigmod_prime(z):
    #计算激活函数的导数
    return sigmod(z)*(1-sigmod(z))

def cal_delta_wb_cross(x,y,z):
    #计算交叉熵代价函数的偏导数
    w = x*(sigmod(z)-y)
    b = sigmod(z)-y
    return (w,b)

def cal_delta_wb(x,y,z):
    #计算二次代价函数的偏导数
    delta = sigmod(z)*sigmod_prime(z) 
    return (delta, delta)

def sgd_cross(x,y,w,b,epochs):
    #交叉熵代价函数的梯度下降学习
    eta = 0.05
    print('cross sgd----------------------------')
    for j in range(epochs):
        z = w*x+b
        delta_w,delta_b = cal_delta_wb_cross(x,y,z)
        a = sigmod(z)
        c = calc_cost_cross(y,a)
        print('%d: output:%.2f cost:%.2f w=%.2f b=%.2f'%(j,a, c,w, b))
        w = w - eta * delta_w
        b = b - eta * delta_b

def sgd(x,y,w,b,epochs):
    #二次代价函数的梯度下降学习
    eta = 0.05
    print('normal sgd----------------------------')
    for j in range(epochs):
        z = w*x+b
        delta_w,delta_b = cal_delta_wb(x,y,z)
        a = sigmod(z)
        c = calc_cost(y,a)
        print('%d: output:%.2f cost:%.2f w=%.2f b=%.2f'%(j,a, c,w, b))
        w = w - eta * delta_w
        b = b - eta * delta_b    
#交叉熵代价函数学习,共100次迭代        
sgd_cross(1,0,0.6,0.9,100)        
#sgd_cross(1,0,2,2,100)        
#交叉熵代价函数学习,共100次迭代
sgd(1,0,0.6,0.9,100)       

在上面的代码中,两种代价函数的学习速率都是0.05,从结果来看,交叉熵代价函数在第22轮迭代就学习到了0.51的输出,而二次代价函数在同样轮次只学习到了0.77的输出,在第100轮迭代学习到了0.53的输出。

交叉熵代价函数输出:
这里写图片描述
二次代价函数输出:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值