网站首页 > 技术文章 正文
晓查 发自 凹非寺
量子位 报道 | 公众号 QbitAI
让小球滚下山坡,找到它们分别落在哪个山谷里。原来梯度下降算法还能变得像游戏视频一样酷炫:
以上是fast.ai创始人Jeremy Howard分享的一段视频,乍看就像就像是在复杂地形中作战的沙盘推演,其实揭示的是随机梯度下降(SGD)算法的本质。
谷歌大脑东京研究员hardmaru转发了视频对应的文章,评价它“像极了即时战略游戏”。
可别光顾着好玩,视频还得配合文章一起“服用”才有效果。上面的热门视频就是摘自fast.ai成员Javier Ideami写的一篇科普文。
如果代码和公式让你感到枯燥,那么不妨从这段酷炫的SGD视频入手,再读一读这篇文章,它会帮你更直观地理解深度学习。
梯度下降算法的可视化
到底什么是梯度?
深度学习的架构和最新发展,包括CNN、RNN、造出无数假脸的GAN,都离不开梯度下降算法。
梯度可以理解成山坡上某一点上升最快的方向,它的反方向就是下降最快的方向。想要以最快的方式下山,就沿着梯度的反方向走。
看起来像沙盘推演的东西,其实是我们撒出的小球,它们会沿着梯度下降的方向滚到谷底。
而梯度下降算法的最终目的,是找到整个“地形”中的最低点(全局最小值),也就是海拔最低的山谷。
但在这片地形中,山谷可能不止一处(局部最小值),所以我们需要撒很多球,让它们分别落入不同山谷,最后对比高度找到其中的海拔最低点。
以上就是随机梯度下降(SGD)算法的基本思想。
神经网络的输入输出
说完梯度下降算法,下面开始介绍神经网络的基本知识。
从本质上讲,神经网络是通过一系列“权重” 将输入数据变成我们所需的输出。
我们先从最简单的2层神经网络说起,简单介绍一下神经网络的结构。实际上神经网络比这个要复杂得多,通常有几十层甚至上百层。
输入:神经网络的输入是源数据,神经元数量与源数据的特征数匹配。上图以4个输入为例。
第一层:这是个隐藏层,包含有许多隐藏的神经元,它们又连接到周围层中的单元。
第二层:第二层也就是最后一层有1个单元,即网络的输出。
输入W和输出Z之间是线性关系:
对于第一层网络,Z1=W1X+b1,A1=ReLU(Z1),A1是Z1经过激活函数处理后的结果。
对于第二层网络,我们将第一层的输出A1作为第二层的输入,Z2=W2A1+b2,A2=Sigmoid(Z2)。
W将表示网络层的权重,它代表着网络不同单元之间连接的强度。b代表偏置项,可以为网络提供更大的灵活性。
最终第二层的输出Yh=A2就是这个神经网络最终的输出。
Yh = A2 = Sigmoid(W2 ReLU(W1 X + b1)+ b2)
Yh将代表神经网络的预测结果,就是将X输入给网络后产生的输出。
在这个方程中,W1、b1、W2、b2是未知数,需要训练网络找到它们的正确值。
激活函数的选取
你也许会注意到,在上面的神经网络中,每层的输出都是在线性运算的结果后加上一个“过滤”。为什么要这样处理呢?
现实中输入和输出之间的关系通常并非线性。如果神经网络的架构仅由线性算法组成,那么它很难计算出非线性行为。所以我们要在每层的结尾加上一个激活函数。
不同的激活函数有不同的特点。选取不当会导致梯度变得非常小,就是通常所说的梯度消失问题。
另外还存在一种相反的问题,就是梯度爆炸,当梯度值过大时,网络会变得非常不稳定。
常见的4种激活函数有:Sigmoid、tanh,ReLU、leaky ReLU,下面简单讨论一下它们的优缺点。
Sigmoid
1/(1+e-x)
这个函数非常适合将输入分为两类。它的形状很缓和,因此它的梯度能得到很好的控制。
主要的缺点是,在极端情况下,函数输出变得非常平坦。这意味着它存在梯度消失的问题。
tanh
(2 / (1+e-2x)) - 1
它与Sigmoid非常相似。函数曲线更陡峭,因此它的输出也将更强大。缺点与Sigmoid类似。
ReLU
max(0,x)
如果输入大于0,则输出等于输入。否则,输出为0。
它的输出范围从0到无穷大。这意味着它的输出可能会变得非常大,可能存在梯度爆炸问题。它还有个问题是左侧完全平坦,可能导致梯度消失。
ReLU计算简单,是神经网络内层最常用的激活函数。
Leaky ReLU
将ReLU函数的前半段用0.01x代替。
softmax
e-x / Sum(e-x)
输出范围介于0和1之间。
Softmax将输入归一化为概率分布。它将输入压缩为0到1范围,就像Sigmoid。
它通常在多分类场景中的输出层,Softmax确保每个类的概率之和为1。
实际上,神经网络是一系列函数的组合,有一些是线性的,优一些是非线性的,它们共同组成一个复杂的函数,将输入数据连接到我们需要的输出。
文章原作者将这个话题分成3部分讨论,更进一步的内容可以去他文末的链接中找到:
https://towardsdatascience.com/the-keys-of-deep-learning-in-100-lines-of-code-907398c76504
猜你喜欢
- 2024-10-11 大白话聊聊深度学习的前馈神经网络
- 2024-10-11 传统计算机视觉技术落伍了吗?不,它们是深度学习的「新动能」
- 2024-10-11 深度学习之多层感知器 多层感知器的应用
- 2024-10-11 CNN超参数优化和可视化技巧详解 knn超参数
- 2024-10-11 吴恩达深度学习笔记(15-21)总结-浅层神经网络总结
- 2024-10-11 浅层神经网络 浅层神经网络模型
- 2024-10-11 「五分钟机器学习」 神经网络的基本介绍
- 2024-10-11 入门|关于神经网络:你需要知道这些
- 2024-10-11 太天才了,把感知机组装在一起是不是就是神经网络了?
- 2024-10-11 神经网络背后的数学原理:反向传播过程及公式推导
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)