原文: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”训练过后的神经网络:
注意最右的图片,现在已经把中部蓝点用蓝色区域包围了,余下的归为橙点,可见这个分类是很成功的。也请注意有些神经元之间的权重有着更粗的蓝色虚线,说明随着权重的增长,系统被训练得可以认识世界了。
现在让我们用模型来搞点动静,为此需要编译并设置优化函数。
我花了很长时间来理解优化函数,因为我发现绝大多数的解释都重在“是什么”而忽略了“为什么”。为什么我需要优化器?
神经网络有目标预测y,经过训练之后还会产生一个新的预测y’,系统将这新预测与测试集中随机抽样进行比较,并衡量验证准确度。一个系统可能在训练数据上能达到99%的准确度,但是对测试图片却只有70%,所以准确度并不是关键,关键是验证准确度。
优化器计算误差函数对模型权重的梯度(数学上叫偏微分)。
这又是几个意思?想想一个分布在3D曲面(如下图)上的权重,也叫“误差曲面”,其“经纬度”就代表了某种权重的值,而“海拔”对应的是不同权重下的误差/代价。
优化器就是为为这一重要函数服务的,它指出了如何调整权重以减小误差,具体原理就是微积分。什么是微积分?当然从课本上能找到很多没用的机械解释,导数啊,微分啊,但这些概念又表示了什么呢?
我曾经也不知道,直到我读了Kalid Azad的Calculus Better Explained。以下是所有人都能懂的解释:
微积分就做两件事:
化大为小,比如从圆到环
计算变化率
比如我把一个圆分解成环:
再把环都拉直来做一点简单的计算:
我们做了很多的测试,调整网络的权重,但是我们究竟有没有更加接近问题的优选方案呢?优化器就是回答这个问题的!
你可以在这里或者斯坦福课程深入了解梯度下降法,但是你会发现这些材料虽然在细节上面面俱到,却在“为什么”的核心问题上一笔带过。
本质上你要做的就是减少误差,这就像在雾霾里开车。在本文的早期版本中,我把梯度下降比作是寻找最佳答案的方法,但实际上,“最佳”答案是不是存在都不一定。如果已知其存在,那就可以直接奔着过去了。所以我们只能慢慢地寻找“更佳”,有点类似进化,我们找到了一点更有利于生存的因素,但这可不意味着我们把爱因斯坦给造出来了!
想象自己是个玩“马可波罗”的孩子,去感受梯度下降。你闭上了眼睛,朋友在为在一个池子外面。你喊“马可”,其他小孩儿回答“波罗”,你听声辨位来判断自己是靠近还是远离了他们。如果是远离了就调整方向,如果接近了就保持前进。这就是调整权重以帮助神经网络认识世界的方式。
我们选择了这篇文章所述的“亚当”优化器,最终我通过暴力调参获得了不错的结果,这就是数据科学的艺术,并没有统一的算法知道。如果我更改了网络架构,那么最好的优化器可能就是另一种了。
这里是Keras中的优化器。
(此为完整数据集训练结果)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.
不会错的。