如果说深度学习背后的基本思想
已经出现了好几十年了
为什么现在才会兴起呢
我们通过这个视频来看一下在深度学习崛起
背后的主要驱动力 因为我认为这个将会 帮助你在你自己的组织中
找到最好的机会来应用这些工具
过去几年里很多人问我
Andrew 为啥深度学习突然这么好使
当我回答这个问题的时候
我通常会画这个图给他们看
我们在横坐标上绘制
我们给定的一个任务的数据
在纵坐标上绘制我们学习算法的性能
这样就能看到垃圾邮件分类器的准确率
或者是广告点击预测的准确了吧
或者是我们的自动驾驶车
用来搞清楚其他车辆的神经网络的准确度
事实证明 如果你画出传统学习算法的图像
比如支持向量机
或者逻辑回归 都以你所拥有的数据作为输入
你或许可以得到一个这样形状的曲线
他们的性能在你刚开始增加训练数据的时候 会得到一定得提高
但是当数据增长到一定程度的时候 性能会停止增长
这个应该是水平线 我画的不是很好
所以 他们好想总是不知道如何处理大量的数据
我们的社会在
过去的20年左右 对于很多问题
需要处理的数据量都从一个相对小的数据集
变成了一个非常大的数据集
这个大多是因为我们社会的数字化
现在我们在数字领域有太多的人类活动
我们花费了大量的时间在我们的电脑上 在网页上
在移动app上 而在电子设备上的活动产生了大量的数据
而得益于并不昂贵的手机摄像机 加速器
以及所有的物联网(Internet of Things) 的传感器的兴起
我们也一直在收集越来越多的数(
所以在过去的二十多年来 对大多数的应用来说
我们仅仅在积累大量的
传统学习算法已经无法有效利用的数据
而对于神经网络来说
事实证明 如果你训练一个很小的神经网络
那么它的性能(曲线)或许看起来会是这样
如果你训练一个稍大的神经网络
我们叫它中等大小的神经网络
它的性能一般会稍微好一些
而如果我们训练一个特别大的神经网络
那么它的性能通常会变得越来越好
所以 基于这些观察
我们可以得到 如果你希望达到这个非常好的性能 那么你需要两个东西
首先我们需要能够训练
一个可以利用大量数据的特别大的神经网络
第二 在这儿 在X轴上面
你需要大量的数据
所以通常说规模(scale)推动的深度学习的发展进步
规模 在这里我不仅仅指
神经网络的大量的隐藏神经元
大量参数
(神经元间的)大量连接 还指(被利用的)数据的大小
事实上 现在 得到一个 更好性能的神经网络的一个最可靠的方法
通常是训练一个更大的神经网络 或者给网络提供更多的数据
但是通常有限制 因为你总会用光自己的数据
或者神经网络已经已经太大 以至于训练时间无法接受
但是在深度学习的世界中 仅仅提升规模已经花费了我们大量的精力
为了使这个图像更加的精准
让我们增加一些东西
我在X轴上写一些数据
技术上来说 这是一些带标签的数据
也就是训练样例
我们有输入X和相应的输出Y
我想要引入一些我们在之后的课程会使用的符号
我们将用小写字母m代表我们训练集的大小
所以训练样例的数目就是m 也就是横轴
让我们看看这个图中别的细节
在这个小训练集的区域
算法之间的好坏顺序其实很难比较
所以如果你没有很多的训练数据的话
那么性能的好坏通常取决于你手动选择特征的技巧
所以 某些人很用心的手动选取了(很好的)特征
训练出了一个SVM 而某些人训练
使用小的训练集上训练了一个大的神经网络
很有可能SVM性能更好
所以在这个图像的左边区域
算法的优劣是很难说清楚的 而其性能
更多取决于你手动
选取特征的技巧以及算法底层细节
而这个仅仅是在这个大的数据区域
非常大的训练集
在图像右边 m非常大 我们可以看到
神经网络碾压了别的算法
所以如果你的朋友问你
为什么神经网络表现这么好
我鼓励你也给他们画这么一个图
所以我觉得可以这么说
深度学习的初期崛起
得益于数据的规模以及计算的规模(的进展)
我们只需能够在CPU或者GPU上面训练一个
非常大的神经网络 就能获得很好的结果
但是 渐渐的 特别在过去几年
我们也已经看到了巨大的算法创新
我想要多说一点
有趣的是 很多算法创新
在试图使神经网络运行的更快
所以 举一个具体的例子
神经网络一个巨大的突破就是
从一个看起来像是这个的逻辑函数(sigmoid函数)
变成一个我们之前说过的看起来像这样的ReLU函数
如果你不理解这里我说的细节 不用担心
但是事实证明 在机器学习中 使用逻辑函数的一个问题
是这里的一些区间中 函数的斜率
或说梯度几乎为0
所以在这些区间中 模型的训练就会
变的非常慢 因为当你在这里使用梯度下降算法的时候
相应梯度几乎是0 导致参数变化非常慢 所以训练也就变得非常慢
然后通过修改神经网络钟我们叫做 激活函数(activation function)的东西
为ReLU函数 即线性整流函数(rectified linear unit)
所以正的输入值的梯度都等于1
所以梯度就很少会渐渐地掉到0
而虽说这里的梯度 或说斜率 则是0
但是事实上仅仅将逻辑函数变成
ReLU函数已经使梯度下降算法变快了很多
所以这是一个可能相对简单的算法创新
但是最终 这个算法创新
确实帮助到了计算(的性能提升)
其实我们有很多的像这样的例子
我们修改算法来使得代码运行的更快
并且即使我们有大量的数据 或者一个很大的网络
这些算法的创新都可以允许
进行相应的训练
另一个快速运算很重要的原因是
事实上训练一个神经网络是需要多次迭代的
通常你首先有一个
神经网络架构的想法 然后你用代码实现
实现你的想法 之后让你
来运行一个实验来测试你的神经网络运行状况
之后再回过头来修改你的神经网络的细节
之后你就循环进行这个圆圈多次
而当你的神经网络的训练时间很长的时候
将会花费你很长的时间来进行这个循环
可以想象 花费10分钟或者一天
来完成一次迭代 和整整花费一个月
才能完成一次迭代相比 从效率上来讲
将会带来
极大的不同带来
因为当你在十分钟或者一天内得到结果
你就能够试很多不同的想法
并且更有可能发现对你的应用 有帮助的神经网络
所以快的计算能够帮助到我们
因为它加快了你得到实验结果的速度
并且这个确实帮助了神经网络的从业者
和深度学习的研究者
更快的改进自己的想法
所有的这一切
都加速了整个深度学习研究社区
使得这个社区几乎每个月都能发明新算法
所以所有的这一切对于整个深度
学习社区都是一个巨大的好处
这个社区在不可思议的发明新算法
并且在不停地探索最前沿的知识
总之 有一些力量在驱动着深度学习的进展
好消息是这些力量
依旧在有力的帮助深度学习变得更
拿数据来说 社会依然在产生 越来越多的数据
或者拿计算来说 随着专有化
(深度学习)硬件的兴起 例如GPU 以及更快的网络
很多种类的硬件
我很有信心 我们建立一个非常大
的神经网络的能力
以及共享计算的观念将会变得越来越好
以算法为例 整个深度学习研究社区
依然在算法最前沿处有现象级的创新
因此 我认为我们可以保持乐观
我对于深度学习在未来的几年 将会继续变得越来越好
保持非常乐观的态度
所以 让我们到这一节的最后一个视频中
我们将会讨论一些你能从这个课程中学到的知识