Deep Learning_deeplearning.ai(course1、2)简单总结

来源:互联网 发布:怎么在淘宝办理学生证 编辑:程序博客网 时间:2024/06/02 04:53

写在前面

首先,感恩朋友借我的付费账号。
这周二的时候终于把吴恩达老师的deepLearning.ai(https://www.deeplearning.ai/)上的前三课学完了,完成了前两课的quiz和编程练习,感觉收获许多,抱着好好整理一下的心态,一直想要写一篇小总结的,无奈拖延症发作,一直拖到了现在。
本文将简单总结一下deeplearning.ai前三课的内容,主要拎一下框架。

Course1. Neural Networks and Deep Learning

为了引出Neural Network,吴老师从Logistic Regression开始介绍。

  • Logistic Regression
    解决二分类问题
    输入x, 输出预测y_hat(0~1)
    激活函数:sigmoid
    y_hat=sigmoid(w.T * x + b)
    Loss Function: L(y_hat, y) = -(y*log(y_hat) + (1-y)*log(1-y_hat))
    Cost Function: J(w,b) = -(1/m)*sum(L(y_hat, y))
    训练方法:Gradient Descent

    (Mine:Logistic Regression vs. 感知机?)

为了理解python中向量化计算的快速,吴老师介绍了python中numpy包,以及broadcasting in python。

  • Broadcasting in python general principle
    1. Matrix(m,n) +-*/ (Vector(1,n)->Matrix(m,n))
    2. Matrix(m,n) +-*/ (Vector(m,1)->Matrix(m,n))
    3. Vector(m,1) +- (R->Vector(m,1))

有了前面的铺垫,我们可以开始正式学习Neural Network了。
我们可以把前面的Logistic Regression看成一个最简单的,没有隐藏层的Shallow Neural Network。

  • Activation Function
    1.sigmoid(做二分类时,输出层可用,不然 never use it!)
    2.tanh(相比于sigmoid,优点是均值≈0)
    3.ReLU(常用:可以增加网络稀疏性;易于求导,提高BP时梯度下降的速度)
    4.Leaky ReLU

    Q:为什么要用非线性的激活函数?
    A:线性的激活函数满足叠加原理,增加再多的隐藏层,最后的输出都是输入x的线性组合,和直接使用线性模型没有什么两样,都无法解决非线性复杂问题。

  • Random initialization

    • 对于Logistic Regression, 直接将W和b初始为0,是可行的,因为进行梯度下降时,x(i)会对每个dw(i)=x(i)*dz起作用;
    • 对于Neural Networks,直接将W和b初始为0,会导致“Symmetry breaking problem”,即使得隐藏层内的每个神经元都在进行完全相同的计算,设置再多的神经元都无济于事,故应该对W进行random initialization,b是常数无所谓为不为0。
  • BP & FP

隐藏层数量增多,神经网络层数增多时,就是我们常说的Deep Neural Network了。
(注:我们计算神经网络层数的时候,一般不计算输入层)

  • Why Deep?
    • 从简单到复杂:在CNN中,我们可以认为前面的网络层在学习一些简单的特征,例如边缘特征,越到后面的网络层可以认为进一步扩展到更大更复杂的区域;
    • small but deep better than big but shallow!

course 1主要介绍了一些神经网络的基础知识。

Course2. Improving Deep Neural Networks: Hyperparameters tuning, Regularization and Optimization

  • 拿到一个数据集应该怎么分?
    以前数据量少,Train/Dev/Test(60/20/20)
    现在数据量多,Train/Dev/Test(98/1/1)
    无论如何,我们应该确保Dev和Test集的数据分布一致。

    (更麻烦的,在Course3中提到的:训练集和测试集不同分布的,我们应该分成Train/Train-dev/Dev/Test,其中,Train和Train-dev同分布,Dev和Test同分布。)

  • 为什么要划分数据集,因为我们要判断“欠拟合“&”过拟合”

Set error error error error human-level 0 0 0 0 Train set error 15 0.5 1 15 Dev set error 16 0.6 11 30 类型 High bias(欠拟合) just right High variance(过拟合) High bias & High variance
  • 怎么处理High bias 和High variance?

    • High bias:Bigger network;Train longer;NN architecture search
    • High variance: More data; Regularization; NN architecture search
  • 重点:处理过拟合

    • Regularization:代价函数J加入正则项(L1?L2?)
      • 为什么正则化可以解决过拟合呢?
      • 1.加入正则项后,权重衰减(weight decay),我们把lambd设得足够大,可以认为经过权重衰减后的W,接近与0,那么网络结构就简化了。
      • 2.另一种解释是,把lambd设得足够大后,W接近0,则Z也接近0,则整个激活函数接近线性,整个网络结构就接近线性网络,无法解决复杂问题。
    • Dropout:随机失活
      • 注1. 只在train时dropout,预测时不能dropout
      • 注2. 反向随机失活(Inverted dropout)时,需要把a除以keep_prob,以保证a的期望值不变。
    • Data Augmentation:数据增强,扩大数据集
    • Early Stopping:不够正交化,会导致bias和variance同时变化,不推荐使用

我们知道了怎么来训练一个网络,知道了当网络出问题的时候要怎么办,但是网络训练速度很慢,效果不好的时候应该怎么办呢?这就涉及到了优化的问题。

  • 那么,怎么优化?
    • Normalizing inputs:归一化,使得代价函数平面比较均匀,导致我们可以选择较大的学习率,不用怕在一个狭长的平面中,走一步就走出函数空间了,从而加速训练。
    • Batch Normalizaiton:归一化中间值,可以加速training。
    • Why does batch norm works?
      • 作用同对输入归一化,可以提高学习率;
      • 使得网络更加robust,增加了每层学习之间的独立性 ;
      • 每次batch,都有不同的mean,variance,相当于增加了噪声,进行了正则化。
    • 正确初始化W:除了前面所说的为了防止“Symmetry breaking problem”,不能把w初始化为0矩阵外;我们希望隐藏层unit数量越多,w越小,故,w需要乘上一个(1 / sqrt(n_(l-1)))系数,这样才能使得激活函数的值不会太大或太小,可以比较迅速地进行梯度下降修改w值。
    • 梯度下降时的各种优化方法:mini-batch、SGD、Momentum、RMSprop、Adam………….
      • Mini-batch:一次训练一个batch,减轻系统压力,加速训练;当训练集有很多冗余时,收敛速度更快;特别地,batch_size=1时,就是SGD,SGD算法不会收敛,只会在最小值附近波动。
      • Momentum:batch方法更新权重时,仅依靠当前batch,不稳定;故引入梯度的指数加权平均值来代替单纯的梯度值,使得更新方向更稳定。
      • RMSprop:与上面Momentum类似,用均方根来代替单纯的梯度值,使得更新方向更稳定。
      • Adam:Momentum + RMSprop。
    • Learning rate decay:随着时间推移,逐渐降低alpha。
    • 逃离鞍点?:梯度下降的各种优化方法,都可以有效地逃离鞍点。具体效果见图
    • 这里写图片描述
    • 这里写图片描述
原创粉丝点击