算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5

上一周的回顾

      文档+项目,是刚刚匆匆过去一周的主旋律。实习报告、唐奖申请表和申请材料、十佳先进班集体材料等等,写的那是一个酣畅淋漓啊,总算在大好周末前赶完,结果周末还要继续上实训课,晕哉。对于之前设计的页面,做了一次比较大的改动,对导航、布局都进行了一定的修改,直观上看确实是比之前要好一些了。另一个实训项目呢,花费了一天去寻找以前写的Java EE项目,结果发现尴尬的是,并没有存档,额。实在没招了,只好到处找寻Github的开源项目,看有没有偷懒的余地,结果感人。抛开这些,这周空闲之余,还是继续对之前的课程进行了学习,感觉在一天天的入门。

翻过这座山,就会有人知道你的故事。


Deeplearning.ai神经网络与深度学习(Week5)

1.1 多个例子的向量化

      在前面的博客中已经讲解了关于编写神经网络时使用向量化技术提高代码效率的技巧,现在,我们来看看对于多个训练样本时,如何使用向量化对我们的代码进行改进:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第1张图片

      在传统做法中,我们通过for循环对每个样本进行遍历计算,这是一种直观且最易于理解的做法。但是如果我们采集到的训练样本急速增加,达到一个很高的数量级时,这种直接for循环遍历样本集的做法就显得很low。在向量化的改进方法中,针对神经网络中的每一个Layer,我们都可以将其中的参数整理为矩阵,并采用Numpy数据科学库进行计算。具体的做法其实很简单,将同一个Layer中的每个样本铺成一行,那么每一列就对应样本一系列的特征值。

1.2 激活函数

      现在我们来说说激活函数。激活函数activation function,就是在人工神经网络的神经元上运行的函数,负责从输入端到输出端的映射,也是为了让模型能够运用到众多的非线性模型当中而引入的一种处理过程。更严谨的说法,在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数。那么如果我们不使用激活函数会怎么样呢?我们会得到各层神经元权重的一个线性组合,不管神经元有多少层,我们通过其进行处理的输入值都不会发生美妙的变化,这种情况下,还不如直接去掉隐藏层来的痛快。

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第2张图片

      激活函数多种多样,举几个栗子:
      sigmoid函数

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第3张图片

      其数学表达式为:
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1
      这种函数的优点是输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层,在求导计算较为方便、简单。但其缺点也十分明显,那就是由于其软饱和性,在训练过程中容易发生梯度消失问题,导致训练无法进行。
      tanh函数

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第4张图片

      其数学表达式为:
f ( x ) = 1 − e − 2 x 1 + e − 2 x f(x)=\frac{1-e^{-2x}}{1+e^{-2x}} f(x)=1+e2x1e2x
      这种函数的优点是比起sigmoid函数,它的收敛速度更快,且输出以0为中心。不过呢,它也没有解决软饱和性问题,亦会产生梯度消失问题。
      ReLU函数

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第5张图片

      其数学表达式为:

      这种函数最大的优点是解决了前两种函数所没解决的梯度消失问题,提供了神经网络的稀疏表达能力,且在无监督学习中表现出色,所以成为了目前激活函数中比较主流的一种。不过呢,随着训练的进行,可能会出现神经元死亡,权重无法更新的情况,如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
      所以,任何函数都并不是天衣无缝的,在特定场景选择特定激活函数非常重要。根据经验,如果你要完成的是二分分类任务,那么你应该选择sigmoid函数,而其他可以用到sigmoid函数的场景,我们会建议你选用tanh函数,如果你不确定自己需要用哪种函数来处理你的模型,默认选择是ReLU函数,当然,你也可以尝试一下带泄露的ReLU函数,其公式为max(0.01z,z),即选择0.01z和z两者之间更大的那个,还是来看看它长什么样吧:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week5_第6张图片

      并没有一条明确的法则告诉我们应该在什么情况下选择什么样的激活函数,所以在实际的工程项目中,可以多尝试各种激活函数,在交叉试验集上跑跑,在工作集上跑跑,多多比较,这样对激活函数的选择会更加老道。


论文与工程训练总结

      刚刚过去的这一周可以说是专门训练工程项目的一周,从实习文档到前端项目再到周末实训项目无不在练习着自己的动手能力。感受比较深的一点就是虽然许多语言框架我都有一定的了解,但是在真正进行项目开发时会遇到各种各样的问题,比如IDE的版本问题、框架的依赖包问题、数据库的驱动版本问题等等,这些经验和教训都需要自己在实践中不断摸索才能不断参悟出门道,也可以说是一种修炼内功的过程。可以预见下一周依然是充满了工程项目的一周,继续加油!最后,恭喜IG,让我们每一个与电竞有过亲密接触的人能够在今年圆梦,未来属于我们,我们是冠军!

你可能感兴趣的:(算法,深度学习,机器学习)