查看原文
其他

深度学习-真能一天搞懂?

2016-11-10 深度学习世界

别闹了,说你胖你就喘…真能那样早就成精了

前言

上期推荐过李宏毅的《一天搞懂深度学习》教程,其实人家题目是 Deep Learning Tutorial,深度学习这东西像围棋,易于入门难于精深,花一天时间给您用 286 页 PPT学会的深度学习,大概就是学了个80%,像下图这个样子:



为了跳出焦虑症-松鼠症-懒癌的死循环,编者也跟风采用输出倒逼输入的方式,试图恢复思考的习惯,跃出每次聊学习都只是推荐资料,谈感悟都是只会说那讲的贼好的怪圈,告别碎片化泡沫学习。墙裂推荐对本篇文章所谈内容感兴趣的朋友除了收藏转发之外找个数据库装个工具包亲自动手试试。

傻瓜式学习模型

要足够简单才会流行起来!

将人类行为进行数量化标示,高级智能构建被简化成了搜索和拟合函数做选择的问题,一个深度学习系统能识别出图片中的各个物体因为它对这个检测框从给定的几十个甚至上千个类别中做了一个单项选择题然后标出一个 Label,吃瓜群众就会觉得这很神奇很棒,从某种程度上讲,这是一个魔术,能红极一时因为IT WORKS!,绝大多数研究者已经放弃了从高度抽象的逻辑推演构建人工智能这条路转而利用人工标数据来实现智能。。。

把大象装进冰箱需要几步?

在深度学习任务中,你只要: 选择网络结构->确定学习目标->进行学习。。。没了!!!这让人逐渐理解生活大爆炸里 Sheldon 提到 Engineer 就会翻起的白眼,采用尽可能简单的模型,然后让一切湮没在海量的工程细节当中,每年招入大量的程序员加班加点不断走走停停,修修补补,整个 Computer Science 都未脱离各种细节的纠葛,暂时还称不上一门真正的科学。

我们的目标是?

没有蛀牙???不不不,实际系统目标多种多样,但无法用数学表示就无法代入公式,便不能转成代码让计算机去为我们工作。所以要有一个代价/目标函数来用数量化地表示我们的目标,将智能行为简化到一次单项选择的过程,网络要输出一个向量(x1, x2,...,xn)而我们人工标出的数据以的形式表示,后者 1 的位置代表正确的选择,其他位置都置 0,让输出向量尽可能逼近它,算一个 Mean Sequare Error 就好,比如向量(1,2)和(3,4)的 MSE 值是 ((1-3)^2 + (2-4)^2)/2,我们的目标就是让这个值尽可能地小

暴力求解!

我们眼中的照片,视频,耳机中播放的音乐,尽管惟妙惟肖,说到底都是一串数字信号,经过特征选择或者直接拿来都能抽成一个向量,变为我们系统的输入,向量中的每一个值都可能与我们最终的判定相关,到底用哪个数使用怎样的结构实在弄不清,干脆就让所有输入变量都与输出结果建立联系,用权值表示连接,管你相不相关,先一股脑连上,有多层抽象我就层层互连,把权值调来调去玩出花来就不信你效果不好。眼中浮现本科同学拿机器暴力枚举两天两夜搜索所有情况做数模的情景 Orz。本着 Engineering 的原则建立联系的时候直接采用加法,为了将计算放到一个可控的范围内,使用了一个形状像小肠名叫 Sigmoid 的函数,通过公式f(x) = 1/(1+e^-x)将加和结果限制在(0, 1)区间

开荒?

暴力假设下有太多参数需要处理,即使是 1000 特征的输入到第一个维度为 500 的隐层的连接,算上 bias 就需要一个 1001*500 的矩阵存储,使用 double 类型存放权值大概是 4 MB 的空间需求,如果一个清晰度高一些的灰度图抽成向量直接输入,但这层就需要 100 MB+ 的存储空间,人多力量大参数多了效果好是没错。。。一般随机初始化各参数之后调参就成为了一个难题。

工匠精神

架子搭好了,忽悠结束了,接着就是实打实地磨刀,哦不,training 了,让我们步入工程细节当中。。。

偏导~

如果你七大姑的八大姨的二舅姥爷的小外甥和对象的年龄差三,那你和你对象的年龄差距大概是你和你七大姑的年龄差加上七大姑和二舅姥爷的年龄差加上二舅姥爷和小外甥的年龄差再算上那个三;神经网络看起来庞大复杂,但是使用基本结构连接组合获得的,将其看作一个多层函数嵌套的最终从目标函数输出误差值的整体看,直接使用偏导计算,在每一处算得特定参数对本层输出结果的导数乘上上层的偏导就能得到参数调整方向和幅度,或者说,一个 delta。看起来高达上的人工智能前沿领域,使用的跟 dota 里面手动探索地图产不多的方法,看走哪效果好就走哪里。

MSE vs Cross Entropy

既然都是用导数,当然找个趁手的兵器很重要,MSE 太过平坦,大概是 A 吧。。从信息论那里借来 Cross Entropy 函数替换我们之前的目标函数加速训练,毕竟暴力方法太耗时,替换优化任何一个部分都能带来明显收益。

Sigmoid vs Relu

依然是慢的问题,sigmoid被替换成了一条可以简化为折线的 Relu;受到相关神经科学研究的启发,更多的激活函数得以应用,也让普通实现中 (0,1) 区间之外的数域获得得到利用,既然一条折线就能搞定。。似乎在讲将输入视为数值化的逻辑因子,0 代表不起效,正数值则代表着不同的作用权重,摆脱了 y = x 这样的激活函数效果等价于矩阵相乘依旧是矩阵表示的先行变换问题后,只用简单激活函数也能够发掘出多个参数矩阵的存储作用,承载更多信息并获得更快的训练速度。类似轮子、壳子、灯。。。加起来等于车子,每个参数表征一个特性,而特性是在实体间共享的,同时要包容所有特性分出车子、票子、房子的网络模型就会变得复杂,同时因为要一起做很多事情,网络的训练就变得繁难,跟解一团毛线一样,看起来简单,做起来却是另一个样子。 Relu 可以用式 relu(x)=log(1+exp(x)) 进行表示,或近似看作 y = max(0, x),以及视作 maxout 的一种特殊情况。

Moment,Weight Decay and more…

更进一步来讲,还有分批训练等方法。在利用导数通过梯度下降降低损失值的时候,并不能保证找到全局最优解,就效仿物理概念加上一个动量让训练不要轻易停(go)止(dai),多跑跑总会有更大几率得到更好训练效果的(默默想到动量守恒什么的。。。)。为了防止在训练集想太多,还通过减枝、early stop 和权值衰减让长期得不到激活的权值随训练递减逐渐拉近训练集和验证集上的效果差距,以争取更好的测试结果。

就决定是你了,皮卡丘!

针对不同任务网络有很多变形,类似小智针对不同战斗要使用不同的小精灵比赛一样。 在视觉任务当中,基础特征具有良好的空间布局,加上人自身看东西有从小处见整体的能力(gaze),采用多个卷积核扫描整张图片经过降采样(max pooling之类)逐层进行特征抽象,最后抽成特征向量会比直接输入一个超长向量直截了当的多,通常大家用 CNN 作为这种方法的简称。 另外的,对于有时序信息影响的任务,RNN 以及更复杂的 LSTM 玩得转的话可以处理这些问题。 当然,方法的具体实现涉及并行计算、超大数据量的处理等多方面的内容,不是三下两下能解决的,最好采用分数计算方法,浮点数在一些情况下并不够用。 像小时候的四驱车一样,大家都知道要马达,要轮胎,但给你一桶油一个铁块一般是早不出来的,大家的四驱车基本靠买。。。 号称搞深度学习的,大部分是通过使用工具包像搭积木一样拼接网络站在前人工作基础之上做事情。

未来?

  • 集合多任务构造 Active Memory?

  • 继续加深网络结构?

  • more an more


类似教科书里写过做风车的牛顿,我们找到了一个好玩的玩具,用处也多,却并不能清楚回答 __why it works ? 的问题;希望能扒出像三定律,麦克斯韦的方程组,爱因斯坦的相对论那样简介而美的东西。。


不过也说不定呢,人本来就是嬗变的,用计算机模拟人脑活动是一次自省的过程,啥都试一试如同神农尝百草,高兴之余也要 meditation 才能悟道


点击“阅读原文”了解水清新

↓↓↓

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存