技术控

    今日:94| 主题:49113
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 神经网络与深度学习笔记(三)

[复制链接]
Thedeathoflove 发表于 2016-10-5 17:57:58
73 0

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
神经网络与深度学习笔记(三)

  上一节的笔记中实现的方法,还存在很多问题,在实际应用中需要考虑算法的学习速度,过拟合等问题。这节的笔记记录一些优化方法,很    原书第三节对应。  
  误差函数

  误差函数其实有很多,只需要满足某些特定的假设都可以。具体是什么,没有仔细去了解。 之前使用的是二次误差函数,但是我们会发现它在最开始的时候对误差的修正是比较慢的,下图是在不同词迭代中在训练数据行的误差函数的变化,可以看到最开始的时候下降比较慢。然后就有    交叉熵(Cross entropy)代替二次误差函数。 交叉熵误差函数在单个神经元上的的定义:  
  1. math
  2. C=-(1/n)\sum_x[ylna+(1-y)ln(1-a)]
复制代码
  1. 其中y是目标值,a 是输出值,求和符号作用在所有样本$$x$$ 之上,n是样本数量。
  2. 手写数字识别的时候,输出层有10个然后误差函数的定义公示如下:
  3. ``
复制代码
math C = -(1/n)\sum  x\sumj[y  jlina^Lj+(1-y  j)lin(1-a^L  j$$ 是输出层第$$j$$个神经元的输出,$$y  j$$ 是目标值。用中文翻译一下就是对输出层的所有神经元的交叉熵求和。
  那么当我们修改误差函数的时候,会给我们的实现带来什么样的变化?还记得之前的反向传播算法都是基于二次误差函数来推导的。
  1. math
  2. \frac{\delta C}{w^L_{jk}} = \frac{1}{n}\sum_xa^{L-1}_j(a^L_j-y_j)
复制代码
  1. `
复制代码
math \frac{\delta C}{\delta b^L  j} =\frac{1}{n} \sumx(a^L  j-y  代码修改

  要实现交叉熵,在代码层面改的东西很少,直接修改    上章中的  
  1. backprop
复制代码
  1. 方法就好了
  2. ``
复制代码
def backprop(self, x, y):
  1. part_der_b = [np.zeros(b.shape) for b in self.bias]
  2.     part_der_w = [np.zeros(w.shape) for w in self.weights]
  3.     activation = x
  4.     activation_list = [x]
  5.     z_list = []
  6.     for w, b in zip(self.weights, self.bias):
  7.         z = np.dot(w, activation) + b
  8.         z_list.append(z)
  9.         activation = sigmoid(z)
  10.         activation_list.append(activation)
  11.     # 修改此处
  12.     delta = (activation_list[-1] - y)
  13.     part_der_b[-1] = delta
  14.     part_der_w[-1] = np.dot(delta, activation_list[-2].transpose())
  15.     for l in xrange(2, self.num_layers):
  16.         z = z_list[-l]
  17.         spz = sigmoid_prime(z)
  18.         delta = np.dot(self.weights[-l+1].transpose(), delta) * spz
  19.         part_der_b[-l] = delta
  20.         part_der_w[-l] = np.dot(delta, activation_list[-l-1].transpose())
  21.     return (part_der_b, part_der_w)
复制代码
``` 见到资料说如果使用sigmoid激活函数,最好使用交叉熵,做误差函数。
  激活函数

  激活函数也有很多,看到    WikiPida上有个表基本我知道的都有在列,此处不打算实现需要的时候可以去看看。  
  过拟合

  过拟合是机器学习中不可忽视的问题。神经网络同样存在,解决过拟合的方式和所有其他机器学习中的方案差不多。 * 提前停止训练 * 使用validation 数据集来选择和评估超参数 * 规范化,就是在误差函数之上增加惩罚因子比如对交叉熵L2规范化在误差如下:
  1. math
  2. C=-(1/n)\sum_x[ylna+(1-y)ln(1-a)] + \frac{\lambda}{n}\sum_ww^2
复制代码
友荐云推荐




上一篇:Happy Study Linux 2 - C标准库
下一篇:Use curl to create a CouchDB admin user
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表