BP神经网络——交叉熵作代价函数

Sigmoid函数

当神经元的输出接近 1时,曲线变得相当平,即σ′(z)的值会很小,进而也就使?C/?w?C/?b会非常小。造成学习缓慢,下面有一个二次代价函数的cost变化图,epoch从15到50变化很小。

引入交叉熵代价函数

针对上述问题,希望对输出层选择一个不包含sigmoid的权值更新,使得

由链式法则,得到

由σ′(z) = σ(z)(1? σ(z))以及σ(z)=a,可以将上式转换成

对方程进行关于a的积分,可得

对样本进行平均之后就是下面的交叉熵代价函数

对比之前的输出层delta,相当于去掉了前面的

相应的代码仅改动了一行(58->59),新的cost变化图如下。

在训练和测试数据各5000个时,识别正确数从4347稍提高到4476。

 1 # coding:utf8
 2 import cPickle
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5
 6
 7 class Network(object):
 8     def __init__(self, sizes):
 9         self.num_layers = len(sizes)
10         self.sizes = sizes
11         self.biases = [np.random.randn(y, 1) for y in sizes[1:]]  # L(n-1)->L(n)
12         self.weights = [np.random.randn(y, x)
13                         for x, y in zip(sizes[:-1], sizes[1:])]
14
15     def feedforward(self, a):
16         for b_, w_ in zip(self.biases, self.weights):
17             a = self.sigmoid(np.dot(w_, a)+b_)
18         return a
19
20     def SGD(self, training_data, test_data,epochs, mini_batch_size, eta):
21         n_test = len(test_data)
22         n = len(training_data)
23         plt.xlabel(‘epoch‘)
24         plt.ylabel(‘Accuracy‘)
25         plt.title(‘cost‘)
26         cy=[]
27         cx=range(epochs)
28         for j in cx:
29             self.cost = 0.0
30             np.random.shuffle(training_data)  # shuffle
31             for k in xrange(0, n, mini_batch_size):
32                 mini_batch = training_data[k:k+mini_batch_size]
33                 self.update_mini_batch(mini_batch, eta)
34             cy.append(self.cost/n)
35             print "Epoch {0}: {1} / {2}".format(
36                     j, self.evaluate(test_data), n_test)
37         plt.plot(cx,cy)
38         plt.scatter(cx,cy)
39         plt.show()
40
41     def update_mini_batch(self, mini_batch, eta):
42         for x, y in mini_batch:
43             delta_b, delta_w,cost = self.backprop(x, y)
44             self.weights -= eta/len(mini_batch)*delta_w
45             self.biases -= eta/len(mini_batch)*delta_b
46             self.cost += cost
47
48     def backprop(self, x, y):
49         b=np.zeros_like(self.biases)
50         w=np.zeros_like(self.weights)
51         a_ = x
52         a = [x]
53         for b_, w_ in zip(self.biases, self.weights):
54             a_ = self.sigmoid(np.dot(w_, a_)+b_)
55             a.append(a_)
56         for l in xrange(1, self.num_layers):
57             if l==1:
58                 # delta= self.sigmoid_prime(a[-1])*(a[-1]-y)  # O(k)=a[-1], t(k)=y
59                 delta= a[-1]-y  # cross-entropy
60             else:
61                 sp = self.sigmoid_prime(a[-l])   # O(j)=a[-l]
62                 delta = np.dot(self.weights[-l+1].T, delta) * sp
63             b[-l] = delta
64             w[-l] = np.dot(delta, a[-l-1].T)
65         cost=0.5*np.sum((a[-1]-y)**2)
66         return (b, w,cost)
67
68     def evaluate(self, test_data):
69         test_results = [(np.argmax(self.feedforward(x)), y)
70                         for (x, y) in test_data]
71         return sum(int(x == y) for (x, y) in test_results)
72
73     def sigmoid(self,z):
74         return 1.0/(1.0+np.exp(-z))
75
76     def sigmoid_prime(self,z):
77         return z*(1-z)
78
79 if __name__ == ‘__main__‘:
80
81         def get_label(i):
82             c=np.zeros((10,1))
83             c[i]=1
84             return c
85
86         def get_data(data):
87             return [np.reshape(x, (784,1)) for x in data[0]]
88
89         f = open(‘mnist.pkl‘, ‘rb‘)
90         training_data, validation_data, test_data = cPickle.load(f)
91         training_inputs = get_data(training_data)
92         training_label=[get_label(y_) for y_ in training_data[1]]
93         data = zip(training_inputs,training_label)
94         test_inputs = training_inputs = get_data(test_data)
95         test = zip(test_inputs,test_data[1])
96         net = Network([784, 30, 10])
97         net.SGD(data[:5000],test[:5000],50,10, 3.0,)   # 4476/5000 (4347/5000)
时间: 2024-08-23 14:29:33

BP神经网络——交叉熵作代价函数的相关文章

神经网络代价函数与交叉熵

在此我们以MSE作为代价函数: 其中, C表示代价 函数 ,x表示样本, y表示实际值, 表示实际值, 表示实际值, a表示输出值, 表示输出值, n表示样本的总数.为简单起见 表示样本的总数.为简单起见 表示样本的总数. a=σ(z), z=∑W j*X j+bσ() 是激活函数 使用梯度下降法(Gradient descent)来调整权值参数的大小,权值w和偏置b的梯度推导如下: 其中,z表示神经元的输入,σ表示激活函数.w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调

交叉熵代价函数(作用及公式推导)

转自:http://blog.csdn.net/u014313009/article/details/51043064,感谢分享! 交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足. 1. 二次代价函数的不足 ANN的设计目的之一是为了使机器可以像人一样学习知识.人在学习分析新事物时,当发现自己

交叉熵代价函数

本文是<Neural networks and deep learning>概览 中第三章的一部分,讲machine learning算法中用得很多的交叉熵代价函数. 1.从方差代价函数说起 代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigmoid函数),定义其代价函数为: 其中y是我们期望的输出,a为神经元的实际输出[ a=σ(z), where z=wx+b ]. 在训练神经网络过程中,我们通过梯度下降算法来更新w和b,因此需要计算代价函数对w和

为什么用交叉熵代替二次代价函数

交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足. 1. 二次代价函数的不足 ANN的设计目的之一是为了使机器可以像人一样学习知识.人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大.比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投

信息量,熵,交叉熵,相对熵与代价函数

本文将介绍信息量,熵,交叉熵,相对熵的定义,以及它们与机器学习算法中代价函数的定义的联系.转载请保留原文链接:http://www.cnblogs.com/llhthinker/p/7287029.html 1. 信息量 信息的量化计算: 解释如下: 信息量的大小应该可以衡量事件发生的“惊讶程度”或不确定性: 如果有?告诉我们?个相当不可能的事件发?了,我们收到的信息要多于我们被告知某个很可能发?的事件发?时收到的信息.如果我们知道某件事情?定会发?,那么我们就不会接收到信息. 也就是说,信息量

最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络

最近在看深度学习的"花书" (也就是Ian Goodfellow那本了),第五章机器学习基础部分的解释很精华,对比PRML少了很多复杂的推理,比较适合闲暇的时候翻开看看.今天准备写一写很多童鞋们w未必完全理解的最大似然估计的部分. 单纯从原理上来说,最大似然估计并不是一个非常难以理解的东西.最大似然估计不过就是评估模型好坏的方式,它是很多种不同评估方式中的一种.未来准备写一写最大似然估计与它的好朋友们,比如说贝叶斯估计 (Beyasian Estimation), 最大后验估计(Max

交叉熵 相关链接

TensorFlow四种Cross Entropy算法实现和应用 对比两个函数tf.nn.softmax_cross_entropy_with_logits和tf.nn.sparse_softmax_cross_entropy_with_logits 从神经网络视角看均方误差与交叉熵作为损失函数时的共同点 交叉熵代价函数 交叉熵代价函数(损失函数)及其求导推导 简单易懂的softmax交叉熵损失函数求导 如何通俗的解释交叉熵与相对熵? https://www.cnblogs.com/virede

深度学习之BP神经网络案例

1.知识点: A.BP神经网络:信号是前向传播,误差是反向传播,BP是算法,它不代表神经网络的结构: B.BP神经网络是有导师学习的神经网络,在训练的时候,需要指定输入和输出,让它知道这个输入对应这个输出,让它清楚每次训练的过程,然后他的神经元的输出和理想值目标有多大的误差,这样才会有误差反向传播这个过程: C.MATLAB里怎么创建神经网络包括设置他的参数:包括训练,包括仿真预测,这个过程需要了解: D.在训练之前有必要对数据进行归一化处理,为什么要归一化,归一化的方法有哪些,需要掌握的知识点

均方误差和交叉熵损失函数比较

一.前言 在做神经网络的训练学习过程中,一开始,经常是喜欢用二次代价函数来做损失函数,因为比较通俗易懂,后面在大部分的项目实践中却很少用到二次代价函数作为损失函数,而是用交叉熵作为损失函数.为什么?一直在思考这个问题,这两者有什么区别,那个更好?下面通过数学的角度来解释下. 思考:我们希望我们损失函数能够做到,当我们预测的值跟目标值越远时,在修改参数时候,减去一个更大的值,做到更加快速的下降. 二.两种代价函数的表达式 二次代价损失函数: 交叉熵损失函数: 针对二分类来说,其中: ai第Xi个样