写在前面
今天看了吴恩达老师的深度学习视频,也做了相关的作业,因此对于作业中出现的知识做了总结,主要是激活函数这一块。当然这里也参照了网上的许多博客,主要是把知识点做个整合,理清自己的思路,供自己理解使用。
如果有侵权,请联系我,立刻删除。
深度学习 DeepLearning
- What?
深度学习就是建立神经网络,让神经网络去模仿人脑的机制分析和学习,提升分类和预测的准确性。它是机器学习的一种方法。 - Why?
一句话解释:DL可以让机器自动去学习良好的特征,免去了人工选取的阶段。
具体解释:它将特征工程完全自动化,而这曾经是机器学习工作流程中最关键的一步。特征工程是:对初始输入数据处理,和手动地为数据设计好表示层。深度学习完全将这个步骤自动化:利用深度学习,你可以一次性学习所有特征,而无须自己手动设计。这极大地简化了机器学习工作流程,通常将复杂的多阶段流程替换为一个简单的、端到端的深度学习模型。 - 深度学习的变革性在于,模型可以在同一时间共同学习所有表示层,而不是依次连续学习(这被称为贪婪学习)。通过共同的特征学习,一旦模型修改某个内部特征,所有依赖于该特征的其他特征都会相应地自动调节适应,无须人为干预。一切都由单一反馈信号来监督:模型中的每一处变化都是为了最终目标服务。这种方法比贪婪地叠加浅层模型更加强大,因为它可以通过将复杂、抽象的表示拆解为很多个中间空间(层)来学习这些表示,每个中间空间仅仅是前一个空间的简单变换。
利用BP算法可以让一个人工神经网络模型从大量训练样本中学习统计规律,从而对未知事件做预测。
损失函数 代价函数
- 损失函数 loss function是在单个训练样本上定义的,衡量的是单个训练样本的表现。损失函数越小,模型的鲁棒性就越好。
比如我们想要分类,就是预测的类别和实际类别的区别。 - 成本函数 cost function是损失函数的平均值,它衡量的是全体训练样本上的表现。
激活函数
什么是激活函数?–What
百度百科定义:
在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
我们知道,一个神经元节点做两件事:
- 计算线性函数,z=wx+b;
- 计算激活函数,激活函数有(sigmoid,tanh,ReLU)
这个定义没有要解释的,我的理解是它就是非线性函数。
为什么要有非线性激活函数?–Why
激活函数把非线性引入到我们的神经网络中,提供了网络的非线性建模能力。
如果没有激活函数,神经网络只能表达线性映射。也就意味着对于神经网络里的每一层来说,每一层的输入都是上层输出的线性函数,那么无论这个神经网络有多少层,输入是一个线性函数,最终的输出还是线性函数,倒不如去掉所有的中间层好了。也就是说,使用再多层,最终等效为一层。没有意义。
如果使用了激活函数,它给神经网络引入了非线性因素,使原来线性不可解的问题得到解决。非线性相当于在空间做变换,变换完成后相当于对问题空间进行简化。激活函数做的非线性变换可以使得神经网络处理非常复杂的任务。
有哪些激活函数,怎么用?–How
常见的激活函数有sigmoid,tanh,ReLU,还有Leaky ReLU(带泄露的修正线性单元)。
这里我主要记录三者的区别以及各自优缺点,图片和公式已经牢记于心啦~
-
Sigmoid
它是做二元分类的一个非常好的选择。它把一个实数输入映射到[0,1]范围内。当我判断某个图片是不是猫的时候(是:1,不是:0),就可以利用sigmod函数,当输出>0.5时,让其取分类为1,输出<0.5时,让其取分类为0,那么就可以根据输出的函数值得出分类结果。
sigmoid函数几乎不怎么用,除非在输出层。 -
tanh
几乎任何场合下(除了上面的二元分类)tanh函数都要比sigmoid函数优越,优越性体现在:sigmoid函数不是中心对称的,输出值总是正数,导致在做线性变换时,它只能“支持”上一层的结果。也就导致随着深度的增加,结点的取值就会爆炸。
tanh函数是中心对称的,均值为0的分布,它保证了0均值的特性。而且tanh函数有正有负,可以对来自上层的结果进行支持(1)、反对(-1)、弃权(0),收敛速度比sigmoid函数快,减少了迭代的次数。
ps:解释是从这篇文章看到的,感觉很好理解 -
ReLU 修正线性单元
最常使用的激活函数了
好处有三:
(1) 计算量小。可以看tanh和sigmoid函数表达式比较复杂,而ReLU的函数表达式是a=max(0,z),很好理解,z<0时,函数为0,z>0时,函数是形如y=x的,斜率为1。计算起来是方便了不少。
(2) 正是由于ReLU的斜率等于1(z>0),这也就减轻了sigmoid和tanh都共有的一个大毛病——梯度消失。在sigmoid和tanh中,z过大或者过小,函数的导数趋近于0,减慢学习速度,造成信息丢失,无法完成深层网络的训练。
可能你也会疑问,z<0时,函数值是0,斜率也为0,这不也有影响吗?No! 在神经网络中,有足够多的隐藏单元令z>0,所以这个不用担心。大部分的z还是取的比0大的值。
(3)稀疏性更低。人的大脑在工作中的时候只有5%的神经元是激活的,而sigmoid函数的神经网络的激活率是50%。但是RelU会使一部分神经元的输出为0(有部分的神经元未激活,降低了激活率),这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
这一部分,参考来自这篇解释
神经网络的参数为什么要随机初始化
注意:在逻辑回归(logistic)中,参数可以初始化为0。因为它属于只有一个神经元的单层神经网络,没有隐藏层。神经网络就是一组神经元连接在一起的网络,隐藏层可以有多个神经元,每个神经元本身就对应着一个逻辑回归过程。
这是吴恩达老师在一次作业里的解释:
如果将权重初始化为零,则Logistic回归中的第一个示例x将输出零,但Logistic回归的导数取决于不是零的输入x(因为没有隐藏层)。 因此,在第二次迭代中,如果x不是常量向量,则权值遵循x的分布并且彼此不同。
说实话,没咋看懂!希望有缘人看懂后,帮忙解释一下233。
那为什么神经网络的参数要随机初始化呢?
这篇解释很棒
引用一下:
神经网络的权重w 的不同代表输入的向量有不同的特征,即权重越大的特征越重要,比如在人脸识别中,人脸的属性有眼睛,鼻子,嘴巴,眉毛,其中眼睛更能够影响人脸的识别,所以我们给与眼睛更大的权重。
如果将权重初始化全为0,那么隐藏层的各个神经元的结果都是一样的,从而正向传播的结果是一样的,反向传播求得的梯度也是一样的,也就是说不管经过多少次迭代,更新的w(i)是相同的,这样就判断不了哪个特征比较重要了。
因此,初始w不同,可以学到不同的特征,如果都是0或某个值,由于计算方式相同,可能达不到学习不同特征的目的。
如果初始化为0,隐藏层的每个不同单元权重同步更新,权重相同,因此,同一个隐藏层的多个单元就没有意义了,也就失去了神经网络训练不同特征的意义了。(无论神经网络训练多长时间,这些隐藏单元仍然计算着完全一样的函数,在这种情况下,多个隐藏单元做着同意的事情)。
用同一个值初始化参数可以吗?
道理是一样的,如果用同一个值去初始化权重,同一层的隐藏单元之间的对称性还是依然存在的,也就是说这些隐藏单元计算的仍是完全一样的函数,神经网络就没办法学习了。
建立神经网络的步骤
这一部分在编程的时候看到别人总结的,抄下来记录一下:
- 定义模型结构(输入单元的数量、隐藏单元的数量、输出单元的数量)
- 初始化模型的参数(z=wx+b,w权重,b偏差)
- 循环:
计算当前损失(正向传播)
计算当前梯度(反向传播)
采用梯度下降法更新参数,找到最优参数,这个参数包括权重和偏置。(梯度下降法:通过不断的沿着梯度方向前进,逐步减小损失函数值的过程)
写在最后
其实,我感觉自己的理解还不是很到位,只是先把总结放到这里,便于后续学习的及时复习和及时修改。
另外,这部分总结仅供自己复习使用。文章参考了不少网上的博客,有些我摘抄在笔记本上就忘记是哪篇博客了,就没有标记出来。如果有侵权,请及时私信或者评论,我会第一时间删除 。谢谢!
如果文章中有不对或者理解不到位的地方,欢迎大家批评指正!共同努力呀!