首页 > 技术文章 > 吴恩达深度学习课程脉络(一)神经网络与深度学习

leoyes 2020-09-24 01:00 原文

第一周 深度学习概论

  1.1 课程体系

  AI 是新电力,对所有领域带来改变,最显著的部分是Deep learning

  课程分5个部分

    (一) 神经网络跟深度学习

    (二)  深度学习提升:超参数调整,正则化,优化

    (三) 结构化ML项目(工程化问题)- 相对独立

    (四) CNN 构建

    (五) NLP: 序列建模 ( RNN,LSTM)

  1.2 什么是神经网络?

    以房价预测为例,x 为 房间数,面积,邮政编码,是否富人区,做了一个3个节点的隐藏层( 可居住人数,步行便利性,学校 ),以隐藏层最终实现预测房价。 形象化,这就是一个基础神经网络

  1.3 用神经网络进行监督学习

    应用:房价预测;在线广告;图像分类;目标识别;语音转文本;中英互译;自动驾驶;

    三图举例三类NN: 标准NN, CNN,RNN

    拿猫分类的应用案例举例说明神经网络可以做啥,擅长非结构数据处理;课程尽量用非结构数据;

  1.4 为啥深度学习会兴起/

    三个方面:数据 + 算力 + 新算法

    跟传统的算法比,如SVM,logistic 等相比,能够处理大数据量,随着数据量提升,performance仍会进一步提升,效果不错;

    新算法提升,激活函数从sigmoid进化为ReLu等,改进了很多算法,但有趣的是改进的方向大都是提升速度的

 

第二周 神经网络基础

  2.1  二分类问题

    用猫分类引入,以卷积的RGB 3层数据作为特征,引入符号表达体系

    

   2.2 logistic 回归的方程

    进一步,以2.1构建的定义,建立方程,引入sigmoid函数

    

    2.3 logistic 损失函数

    先定义error function /loss function,衡量算法运行情况。介绍平方损失,但考虑到凸优化,交叉熵损更好

    进一步,定义成本函数为样本损失函数的连加,衡量参数在训练集上的效果, 目标最小化成本

    2.4 梯度下降

    一个碗状图跟抛物线图说明,每个点从最快下降的方向下降,接近全局最低点。 并直接引入梯度,及迭代更新公式

    

   2.5 导数 (略)

  2.7-2.8 计算图链式求导法则

    3(a+bc) 画图,强调了梯度的反向传播(front propagation/back propagation ), 讨论a,b,c分别变化0.001时,最终值的变化,dJ/da = 3. 强调导数的反向传播意义: 

    a变化delta, 则最终J变化 3倍;    b变delta,  bc变化 2*delta ( c*delta /c=2),最终J变化3 *2*delta

类似于放大镜,链式放大镜,链式法则

  2.9-2.10 logistic回归梯度下降法

    由一个样本的损失函数推导,得到da, dz = dL/dz 过度到m个样本的. 给出迭代伪代码 - for loop 展开形式

    

      

    2.11-2.13 向量化

    举例说明 for loop比向量计算慢300倍,将W,X,b计算向量化表达

    

      

  2.14 将logistics回归迭代计算向量化

    

       

    2.15 Python的广播机制( broadcasting)

     python的广播机制有好处,但要注意其副作用,即即使miss match 了也不会报错

    

  2.16-2.17 python编程的说明

    注意 随机数生产的列表数据,np.randam.randn(5),要用reshape(5,1)

     

 

第三周 实现一个神经网络

  3.1 神经网络概览

      类比logistic的结构 线性组合z,跟激活函数sigmoid(z), 损失函数 L(a,y),  引入2层神经网络的结构,强调多次跟logistic的结构一致,形成直觉:

         多次重复z1 -> a1=sigmoid(z1)  -> W1a1 -> z2 -> a2= sigmoid(z2)  -> L(a2,y)

      神经网络就长这样: logistic 重复了2遍

  3.2 神经网络表示

      以1个 hidden layer的NN介绍概念 - 输入层,隐藏层,输出层,激活函数,以及各个层的符号表示(上标supscript 代表层数layer,下标代表nodes节点);  输入层在多数文献中不算1层,因此hidden layer + output layer 又叫双层网络。

    

  3.3 神经网络的输出计算过程(单样本)

      input x -> output : 4 个公式

        z1 = W1 x + b1    ;   a1 = sigmoid [ z1 ] ;  z2 = W2 x + b2    ;   a2 = sigmoid [ z2 ] ;

      对于隐层的每个unit,其实是一个逻辑回归网络,一层4个unit看作4个logistics regression叠加在一起,w.T竖直叠加在一起则可理解参数矩阵;

      而对于隐层至输出层的部分,也可以看成是一个标准的logistics regression

      

  3.4  多样本正向传播向量化计算

      把小向量横向horizontally堆叠构成大矩阵。 横向代表m样本序列,竖向代表nodes序列 ( hidden unit )

      

   3.5 向量化

      解释符号表示系统, 上标 []代表层数,上标()代表样本序列数。 向量化表达为:

       Z[1] = W[1] X + b[1]    ;   A[1] = sigmoid [ Z[1] ] ;  Z[2]  = W[2] X + b[2]     ;   A[2]  = sigmoid [ Z[2] ] 

      用三种颜色来代表三个样本,形象化解释如何堆叠成矩阵的

      

    3.6  激活函数

      a = tanh (z) = exp(z) - exp(-z) /  exp(z) + exp(-z)  , tanh是sigmoid函数平移版本。  事实上,在隐藏层 tanh 比sigmoid好。值在-[-1,1]直接,用中心化效果,会让下层学习起来更容易方面点

      Wu 几乎不用sigmoid了, 只有一个输出层的例外,即二分类的输出层 0,1之间更加合理。 这种情况下,hidden layer用tanh,output layer 用sigmoid,实际上每层的激活函数可以不一样

      缺点: tanh跟sigmoid在z很大很小时,梯度很小几乎为0.

      最受欢迎 ReLu = max ( 0, x). 现在的默认激活函数了,Leaky Relu a=max(0.01z,z)

      sigmoid -除了二分类问题,不用了

   3.7  为啥要非线性激活函数

       直接推导一下,使用线性激活函数时,隐藏层的作用消失。

      

   3.8 激活函数的导数

      三个激活函数的导数,d-sigmoid(z) = sigmoid(z) ( 1- sigmoid(z)) ,  d-tanh(z) = 1-(tanh(z)), d-ReLu = 1 or 0   

      3.9 神经网络的梯度下降

      矩阵链式求导,dW, db, dZ, da

      

      3.10 Backpropagation Intuition (optional)

    

     3.11 随机初始化

      W的初始化不能为0,否则隐藏层同层的不同节点的所有函数都一样,梯度也一样,更新一样,最后所有节点一样,但我们需要不同的隐藏unit来实现不同的功能;

      特别提出: ouput层还是可以更新,因为dJ/dw= X(A-Y).T,有个系数X。

      W=np.random.randn((2,2)) * 0.01    ------> (浅层的0.01就可以了,深层的要用另外的数值)

    

 

 第四周 深度神经网络

4.1 多隐藏层神经网络

  一些函数函数只有多层深层的网络结构才能表达,但不要一开始就搞得很复杂,开始就搞1-2个隐藏层试试,交叉验证,如果效果可以最好了,介绍一下符号

4.2 前向传播

  

 4.3  核对系数矩阵维度

  用来debug,看看设计网络对不对

  

 

   向量化表达

  

  4.4  why深度表达

  以图像分类为例,layer 1 进行边缘检测,layer 2 提取眼睛鼻子局部特征, layer 3 提取轮廓

  以Audio为例,底水平信号识别 => 音节识别 => 单词 => 句子

  每层不同功能,特征提取越来越全面深度;

  另一个例子是类似于逻辑电路门理论,Circuit theory, 处理多变量异或问题,一层hidden layer 要2的N次方的神经元,但多层hidden layers则简单很多

  

  4.5 搭建深度网络块

  以L层为例, 一个模块包括forward跟backward两步,涉及如下变量

    

    复杂点:

    

    

 

 4.6 前向后向传播

  前向传播计算及向量化表达

  

   后向传播导数

  Intuition:

    1)L+1:  A[L]   +  Cache[L]  ==> dZ[L] 

    2)   dZ[L]  ==>  dW[L], db[L],L-1: dA[L-1] 

    3)  Cache[L] =  { 线性cache:W[L],  b[L], A[L-1]   和 激活cache:  Z[L] }

  

 

   看起来挺抽象复杂,但是做做作业就明白了,哈哈;

  Wu也有时还被惊到,竟然算法有效,他就写了几行代码,不确定代码在干啥,竟然产生了效果; 机器学习的复杂度,来源于数据,而非代码;

   作业中的表达

    

      

  

 1 def linear_backward(dZ, cache):
 2     """
 3     Implement the linear portion of backward propagation for a single layer (layer l)
 4 
 5     Arguments:
 6     dZ -- Gradient of the cost with respect to the linear output (of current layer l)
 7     cache -- tuple of values (A_prev, W, b) coming from the forward propagation in the current layer
 8 
 9     Returns:
10     dA_prev -- Gradient of the cost with respect to the activation (of the previous layer l-1), same shape as A_prev
11     dW -- Gradient of the cost with respect to W (current layer l), same shape as W
12     db -- Gradient of the cost with respect to b (current layer l), same shape as b
13     """
14     A_prev, W, b = cache
15     m = A_prev.shape[1]
16 
17     ### START CODE HERE ### (≈ 3 lines of code)
18     dW = np.dot(dZ,A_prev.T)/m
19     db = np.sum(dZ,axis=1,keepdims=True)/m
20     dA_prev = np.dot(W.T,dZ)
21     ### END CODE HERE ###
22     
23     assert (dA_prev.shape == A_prev.shape)
24     assert (dW.shape == W.shape)
25     assert (db.shape == b.shape)
26     
27     return dA_prev, dW, db
 

4.7 参数与超参数

  W,B, alpha,layers,Units,深度学习的应用是一个实验的过程,很难一开始就预设知道哪种参数是最合适的,需要不断尝试不同改进; Vison/Speech/NLP/Ad online/Recommendation等领域,有些经验可复制,有些不work,目前没有系统的理论支持哪个最好

 

4.8  跟人脑有啥关系

  没有任何关系。

  这些非常复杂的实现梯度下降函数的等式,跟大脑的简单解释,很容易使得人们在公众场合说出来,被报告,激发公众想象力;

  硬要说,只是在神经元跟隐藏单元存在一种简单的类比关系,因为神经生物学家对于单个神经元内部的具体工作模式都不了解

 

推荐阅读