IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    数学不行还学AI – 神经网络平话演义(下)

    Hunter发表于 2017-05-08 23:00:13
    love 0

    原文:Learning AI if You Suck at Math — P5 — Deep Learning and Convolutional Neural Nets in Plain English!

    作者:Daniel Jeffries

    翻译:Kaiser(王司图)

    权重

    之前我们简单提过权重,这里深入探讨探讨。

    权重就是神经元之间的连接强度。

    在打哪农历,我们有许多的生物神经元,通过电/化学信号传递相连接。但这些连接并非一成不变,随着时间推移,有的增强,有的减弱。

    来自美国国家健康局来自美国国家健康局

    两个神经元之间的电-化学信号传递越多,连接就越强。本质上,每当你获得了新的经验,大脑就会立即重写自己,通过加强某些神经元之间的连接,对你的记忆、感受、想法进行编码。

    计算机神经网络也是受此启发而来,我们称之为人工神经网络(Artificial Neural Network, ANN),常说的“神经网络”其实就是指人工神经网络。ANN并非准确地用方程去描述生物神经,所以不要把ANN看成是对大脑的模拟,非也。生物神经网络(BNN)里,一个神经元并不是与其他所有神经元相连的,而人工神经网络中,一层里的每个神经元通常与下一层的所有神经元相连接。

    尽管多有差异,但BNN和ANN还是具有很强可比性的。就像脑中的神经元互联有强有弱,人工神经网络里的权重定义了神经元之间的连接强度,每个神经元都只是了解一丁点世界,但是组合起来就拥有了综合的理解。强度高的连接意味着对解决问题有着更高的重要性。

    一些TensorFlow神经元可视化可以帮助我们加深理解。

    第一个简单的网络系统共有六层,网络试图区分右图里的蓝点和橙点,为此寻找获得最高区分精度的模式。我还没有开始训练这个系统,因此我们看到所有神经元的权重都是一样的。连线越粗笔哦啊是权重越大,网络经过随机权重值初始化。

    再看80个”epochs”训练过后的神经网络:

    注意最右的图片,现在已经把中部蓝点用蓝色区域包围了,余下的归为橙点,可见这个分类是很成功的。也请注意有些神经元之间的权重有着更粗的蓝色虚线,说明随着权重的增长,系统被训练得可以认识世界了。

    训练我们的网络并进行优化

    现在让我们用模型来搞点动静,为此需要编译并设置优化函数。

    1

    2
    3

    我花了很长时间来理解优化函数,因为我发现绝大多数的解释都重在“是什么”而忽略了“为什么”。为什么我需要优化器?

    神经网络有目标预测y,经过训练之后还会产生一个新的预测y’,系统将这新预测与测试集中随机抽样进行比较,并衡量验证准确度。一个系统可能在训练数据上能达到99%的准确度,但是对测试图片却只有70%,所以准确度并不是关键,关键是验证准确度。

    优化器计算误差函数对模型权重的梯度(数学上叫偏微分)。

    这又是几个意思?想想一个分布在3D曲面(如下图)上的权重,也叫“误差曲面”,其“经纬度”就代表了某种权重的值,而“海拔”对应的是不同权重下的误差/代价。

    误差曲面误差曲面

    优化器就是为为这一重要函数服务的,它指出了如何调整权重以减小误差,具体原理就是微积分。什么是微积分?当然从课本上能找到很多没用的机械解释,导数啊,微分啊,但这些概念又表示了什么呢?

    我曾经也不知道,直到我读了Kalid Azad的Calculus Better Explained。以下是所有人都能懂的解释:

    微积分就做两件事:

    化大为小,比如从圆到环

    计算变化率

    比如我把一个圆分解成环:

    再把环都拉直来做一点简单的计算:

    我们做了很多的测试,调整网络的权重,但是我们究竟有没有更加接近问题的优选方案呢?优化器就是回答这个问题的!

    你可以在这里或者斯坦福课程深入了解梯度下降法,但是你会发现这些材料虽然在细节上面面俱到,却在“为什么”的核心问题上一笔带过。

    本质上你要做的就是减少误差,这就像在雾霾里开车。在本文的早期版本中,我把梯度下降比作是寻找最佳答案的方法,但实际上,“最佳”答案是不是存在都不一定。如果已知其存在,那就可以直接奔着过去了。所以我们只能慢慢地寻找“更佳”,有点类似进化,我们找到了一点更有利于生存的因素,但这可不意味着我们把爱因斯坦给造出来了!

    想象自己是个玩“马可波罗”的孩子,去感受梯度下降。你闭上了眼睛,朋友在为在一个池子外面。你喊“马可”,其他小孩儿回答“波罗”,你听声辨位来判断自己是靠近还是远离了他们。如果是远离了就调整方向,如果接近了就保持前进。这就是调整权重以帮助神经网络认识世界的方式。

    我们选择了这篇文章所述的“亚当”优化器,最终我通过暴力调参获得了不错的结果,这就是数据科学的艺术,并没有统一的算法知道。如果我更改了网络架构,那么最好的优化器可能就是另一种了。

    这里是Keras中的优化器。

    4

    (此为完整数据集训练结果)100个epochs之后,我们获得了79%的准确度,相对于这么少的代码量来说还算不错了。或许你不满足于79%,但是要知道这已经超过2011年ImageNet上的最佳表现了,就这也是经过了整整十年才达到的。而我们所做的只是Keras Github里的实例代码和略微的调整。!

    迟至2012年,新的思路才开始发威。由AI研究者Alex Krizhevsky, Ilya Suskever和Geoffrey Hinton研发的AlexNet,是图上的第一个橙点,这标志了当前的深度学习复兴。下一年几乎所有人都在用深度学习了,2014年最优的深度学习架构已经在图像识别上超越了人类。

    即便如此,这些架构也通常只是针对某类问题。今天最火的几种架构,像ResNet和Google的Inception V3对于小小的CIFAR10图像也只有88%的准确率,在更大CIFAR100数据集上表现就更差了。

    目前业界标杆是DenseNet,2016年赢得了ImageNet竞赛,用250层和1530万个连接,在CIFAR10上获得了杀手级的94.81%准确率,绝对是当之无愧的怪物。如果使用单个Nvidia GTX1080显卡,只是运行这个93%准确率的40X12模型就需要一个月!

    建议读者深入了解这些模型,在比较中学习。我做了一些实验,并且成功的用暴力实验方法和Keras内置层达到了81.40%的准确率,项目详情可见于我的Github。

    可以通过TensorBoard可视化来监控训练过程:

    可见我们的网络很快经过35个epochs达到79%准确率,余下的时间都用来攀升到81.40%,并且在75个pochs之后很容易过拟合。

    所以如何能改进这个模型呢?以下几个策略可供参考:

    加入自己设计的层

    进行图像增强

    更深神经网络

    调整层级参数

    阅读优秀的架构论文,自己的搭建类似的架构

    真正的数据科学艺术,是用自己的大脑去理解数据,在让模型理解的更好。或许你深入钻研了CIFAR10然后意识到提高图像对比度能使特征更佳明显,那就去尝试!

    大胆地用Photoshop打开图片,套几个滤镜上去看看有没有变得更清晰、更犀利,再思考能否用Keras的图像处理函数完成同样的工作。深度学习不是魔术弹,需要耐心和沉思才能获得走上正轨。虽然能力强大,但你可能经常会盯着工作站上的数字直到半夜两点,然后啥都没算出来。

    但这是获得突破的必经之路!

    这跟神经网络的“试-错”循环有些相似,做一些尝试,离答案更进一步;再尝试点别的,又偏离了答案。我现在正在研究如何用通用模型让神经网络自动进化,这一前沿领域已经有了很多进展但还远远不够!

    终有一天,神经网络的结构会变得越来越简单易用,只要导入几个库和预训练权重文件就能可以开工了,不过对于IT公司还有很多年的路要走。人工智能这一领域仍在飞速发展,每天都诞生新的想法,好消息是你已经近水楼台了,所以放心大胆的玩自己的模型吧。

    Study. Experiment. Learn.

    不会错的。



沪ICP备19023445号-2号
友情链接