01.神经网络与深度学习课程总结 -- 吴恩达(deeplearning.ai)

1、神经网络基础

1.1 从二分类问题定义神经网络

符号说明:

  • 训练数据: ( x , y ) = { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) ,   , ( x ( m ) , y ( m ) ) } (x, y) = \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)})\} ,训练样本包含m个;
  • 其中 x R n x x\in R^{n_{x}} ,表示样本 x x 包含 n x n_x 个特征;
  • y { 0 , 1 } y\in\{0,1\} ,目标值属于0、1类;
    输入神经网络时样本数据的形状:
    在这里插入图片描述

注:这里定义X的形状与机器学习中定义的不一样,机器学习中行是样本,列是特征;而神经网络定义的行是特征,列是样本。

1.2 Logistic Regression

神经网络中,Sigmoid函数是其中一种激活函数:
S i g m o i d ( z ) = 1 1 + e z Sigmoid(z)=\dfrac{1}{1+e^{-z}}
常用于神经网络最后一层的激活函数进行分类:
y ^ = S i g m o i d ( w T x + b ) = σ ( w T x + b ) \hat y = Sigmoid(w^{T}x+b)=\sigma(w^{T}x+b)

:Sigmoid函数有个很重要的性质,一阶导数可以用自身表示:
   \;
σ ( z ) = σ ( z ) ( 1 σ ( z ) ) \sigma'(z)=\sigma(z)(1-\sigma(z))

  • 这里可以解释梯度消失的问题,当 z = 0 z=0 时,导数最大,但是导数最大为 σ ( 0 ) = σ ( 0 ) ( 1 σ ( 0 ) ) = 0.5 ( 1 0.5 ) = 0.25 \sigma'(0)=\sigma(0)(1-\sigma(0))=0.5(1-0.5)=0.25 ,这里导数仅为原函数值的0.25倍。
  • 参数梯度下降公式的不断更新, σ ( z ) σ′(z) 会变得越来越小,每次迭代参数更新的步伐越来越小,最终接近于0,产生梯度消失的现象。

1.3 损失函数

(1)Loss function

一般经验来说,使用平方错误(squared error)来衡量Loss Function:
L ( y ^ , y ) = 1 2 ( y ^ y ) 2 L(\hat y, y)=\dfrac{1}{2}(\hat y-y)^{2}
但是,对于logistic regression 来说,一般不适用平方错误来作为Loss Function,这是因为上面的平方错误损失函数一般是非凸函数(non-convex),其在使用低度下降算法的时候,容易得到局部最优解,而不是全局最优解。因此要选择凸函数。

逻辑回归的Loss Function:
L ( y ^ , y ) = ( y log y ^ + ( 1 y ) log ( 1 y ^ ) ) L(\hat y, y)=-(y\log\hat y+(1-y)\log(1-\hat y))

  • y = 1 y=1 时, L ( y ^ , y ) = l o g y ^ L(\hat y,y)=−log\hat y 。如果 y ^ \hat y 越接近1, L ( y ^ , y ) 0 L(\hat y, y) \approx 0 ,表示预测效果越好;如果 y ^ \hat y 越接近0, L ( y ^ , y ) + L(\hat y, y) \approx +\infty ,表示预测效果越差;
  • y = 0 y=0 时, L ( y ^ , y ) = l o g ( 1 y ^ ) L(\hat y,y)=−log(1-\hat y) 。如果 y ^ \hat y 越接近0, L ( y ^ , y ) 0 L(\hat y, y) \approx 0 ,表示预测效果越好;如果 y ^ \hat y 越接近1, L ( y ^ , y ) + L(\hat y, y) \approx +\infty ,表示预测效果越差;
  • 我们的目标是最小化样本点的损失Loss Function,损失函数是针对单个样本点的。

(2)Cost function
全部训练数据集的Loss function总和的平均值即为训练集的代价函数(Cost function)。
J ( w , b ) = 1 m i = 1 m L ( y ^ ( i ) , y ( i ) ) = 1 m i = 1 m [ y ( i ) log y ^ ( i ) + ( 1 y ( i ) ) log ( 1 y ^ ( i ) ) ] J(w,b)=\dfrac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})=-\dfrac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log\hat y^{(i)}+(1-y^{(i)})\log(1-\hat y^{(i)})\right]

  • Cost function是待求系数w和b的函数;
  • 我们的目标就是迭代计算出最佳的w和b的值,最小化Cost function,让其尽可能地接近于0。

1.4 梯度下降法

用梯度下降法(Gradient Descent)算法来最小化Cost function,以计算出合适的w和b的值。

每次迭代更新的修正表达式:
w : = w α J ( w , b ) w w:=w-\alpha\dfrac{\partial J(w,b)}{\partial w}
b : = b α J ( w , b ) b b:=b-\alpha\dfrac{\partial J(w,b)}{\partial b}
在程序代码中,我们通常使用dw来表示 J ( w , b ) w \dfrac{\partial J(w,b)}{\partial w} ,用db来表示 J ( w , b ) b \dfrac{\partial J(w,b)}{\partial b}

1.5 逻辑回归中的梯度下降法

对单个样本而言,逻辑回归Loss function表达式:
z = w T x + b y ^ = a = σ ( z ) L ( a , y ) = ( y log ( a ) + ( 1 y ) log ( 1 a ) ) z= w^{T}x+b\\\hat y=a=\sigma(z)\\L(a, y)=-(y\log (a)+(1-y)\log(1-a))
反向传播过程:
在这里插入图片描述
对da、dz求导:
d a = L a = y a + 1 y 1 a d z = L z = L a a z = ( y a + 1 y 1 a ) a ( 1 a ) = a y da = \dfrac{\partial L}{\partial a}=-\dfrac{y}{a}+\dfrac{1-y}{1-a}\\dz = \dfrac{\partial L}{\partial z}=\dfrac{\partial L}{\partial a}\cdot\dfrac{\partial a}{\partial z}=(-\dfrac{y}{a}+\dfrac{1-y}{1-a})\cdot a(1-a)=a-y
w 1 w 2 w_1、w_2 和b进行求导:
d b = L b = L z z b = 1 d z = a y db = \dfrac{\partial L}{\partial b }=\dfrac{\partial L}{\partial z}\cdot\dfrac{\partial z}{\partial b }=1\cdot dz=a-y
梯度下降法:
w 1 : = w 1 α d w 1 w_{1}:=w_{1}-\alpha dw_{1}
w 2 : = w 2 α d w 2 w_{2}:=w_{2}-\alpha dw_{2}
b : = b α d b b:=b-\alpha db

1.6 m个样本的梯度下降

(1)单个样本表示
对m个样本来说,其Cost function表达式如下:
z ( i ) = w T x ( i ) + b y ^ ( i ) = a ( i ) = σ ( z ( i ) ) J ( w , b ) = 1 m i = 1 m L ( y ^ ( i ) , y ( i ) ) = 1 m i = 1 m [ y ( i ) log y ^ ( i ) + ( 1 y ( i ) ) log ( 1 y ^ ( i ) ) ] z^{(i)}= w^{T}x^{(i)}+b\\\hat y^{(i)}=a^{(i)}=\sigma(z^{(i)})\\J(w,b)=\dfrac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})=-\dfrac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log\hat y^{(i)}+(1-y^{(i)})\log(1-\hat y^{(i)})\right]

Cost function 关于w和b的偏导数可以写成所有样本点偏导数和的平均形式:
d w 1 = 1 m i = 1 m x 1 ( i ) ( a ( i ) y ( i ) ) dw_{1} =\dfrac{1}{m}\sum_{i=1}^{m}x_{1}^{(i)}(a^{(i)}-y^{(i)})
d b = 1 m i = 1 m ( a ( i ) y ( i ) ) db = \dfrac{1}{m}\sum_{i=1}^{m}(a^{(i)}-y^{(i)})

(2)向量化表示:避免在程序中使用for循环,提高计算的速度。

  • 输入矩阵X: ( n x , m ) (n_x, m)
  • 权重矩阵w: ( n x , 1 ) (n_x, 1)
  • 偏置b:常数
  • 输出矩阵Y: ( 1 , m ) (1,m)

所有m个样本的线性输出Z可以用矩阵表示:
Z = w T X + b Z = w^{T}X+b

逻辑回归梯度下降输出向量化:
dZ对于m个样本,维度为(1,m),表示为:
d Z = A Y dZ = A - Y

dw可表示为:
d w = 1 m X d Z T dw = \dfrac{1}{m}X\cdot dZ^{T}

db可以表示为:
d b = 1 m i = 1 m d z ( i ) db = \dfrac{1}{m}\sum_{i=1}^{m}dz^{(i)}


2、浅层神经网络

2.1 神经网络表示

单隐层神经网络示意图:

在这里插入图片描述

由图中可以看出,层与层之间参数矩阵的规格大小:

  • 输入层和隐藏层之间
    • w[1]−>(4,3):前面的4是隐层神经元的个数,后面的3是输入层神经元的个数;
    • b[1]−>(4,1):和隐藏层的神经元个数相同;
  • 隐藏层和输出层之间
    • w[1]−>(1,4):前面的1是输出层神经元的个数,后面的4是隐层神经元的个数;
    • b[1]−>(1,1):和输出层的神经元个数相同;

由上面我们可以总结出,在神经网络中,我们以相邻两层为观测对象,前面一层作为输入,后面一层作为输出,两层之间的w参数矩阵大小为 ( n o u t , n i n ) (n_{out},n_{in}) ,b参数矩阵大小为 ( n o u t , 1 ) (n_{out},1) ,这里是作为 z = w X + b z=wX+b 的线性关系来说明的,在神经网络中, w [ i ] = w T w^{[i]}=w^T

注:在逻辑回归中,一般我们都会用 ( n i n , n o u t ) (n_{in},n_{out}) 来表示参数大小,计算使用的公式为: z = w T X + b z=w^TX+b ,要注意这两者的区别。

单个结点示意图:
在这里插入图片描述

除输入层之外每层的计算输出示意图:
在这里插入图片描述

由图中可以看出,每个结点都对应这两个部分的运算,z运算和a运算。

使用向量化去计算神经网络的输出:
在这里插入图片描述

关于向量化的解释:
在这里插入图片描述

2.2 神经网络的前向传播和后向传播:

前向传播和后向传播过程:
在这里插入图片描述

反向传播时梯度下降法的参数:

  • 参数: W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] W^{[1]},b^{[1]},W^{[2]},b^{[2]}
  • 输入层特征向量个数: n x = n [ 0 ] n_x=n^{[0]}
  • 隐藏层神经元个数: n [ 1 ] n^{[1]}
  • 输出层神经元个数: n [ 2 ] = 1 n^{[2]}=1
  • W [ 1 ] W^{[1]} 的维度为 ( n [ 1 ] , n [ 0 ] ) (n^{[1]},n^{[0]}) b [ 1 ] b^{[1]} 的维度为 ( n [ 1 ] , 1 ) (n^{[1]},1)
  • W [ 2 ] W^{[2]} 的维度为 ( n [ 2 ] , n [ 1 ] ) (n^{[2]},n^{[1]}) b [ 2 ] b^{[2]} 的维度为 ( n [ 2 ] , 1 ) (n^{[2]},1)

下面为神经网络反向梯度下降公式(左)和其代码向量化(右):
在这里插入图片描述

2.3 神经网络的激活函数

几种常用的激活函数 g ( x ) g(x)
在这里插入图片描述

  • sigmoid: g ( z ) = 1 1 + e z g(z) = \dfrac{1}{1+e^{-z}}
    • 导数: g ( z ) = a ( 1 a ) g'(z) = a(1-a)
  • tanh: g ( z ) = e z e z e z + e z g(z)=\dfrac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
    • 导数: g ( z ) = 1 a 2 g'(z)=1-a^{2}
  • ReLU(修正线性单元): g ( z ) = m a x ( 0 , z ) g(z)=max(0,z)
    • 导数:
      g ( z ) = { 0 , if z < 0 1 , if z > 0 u n d e f i n e ( ) , if z = 0 g'(z) = \begin{cases} 0, & \text{if z < 0} \\ 1, & \text{if z > 0} \\ undefine(任意取值), & \text{if z = 0} \end{cases}
  • Leaky ReLU: g ( z ) = m a x ( 0.01 z , z ) g(z)=max(0.01z,z)
    • 导数:
      g ( z ) = { 0.01 , if z < 0 1 , if z > 0 u n d e f i n e ( ) , if z = 0 g'(z) = \begin{cases} 0.01, & \text{if z < 0} \\ 1, & \text{if z > 0} \\ undefine(任意取值), & \text{if z = 0} \end{cases}

激活函数的选择

(1)sigmoid函数和tanh函数比较:

  • 隐藏层:tanh函数的表现要好于sigmoid函数,因为tanh取值范围为[−1,+1],输出分布在0值的附近,均值为0,从隐藏层到输出层数据起到了归一化(均值为0)的效果。
  • 输出层:对于二分类任务的输出取值为{0,1},故一般会选择sigmoid函数。

(2)然而sigmoid和tanh函数在当|z|很大的时候,梯度会很小,在依据梯度的算法中,更新在后期会变得很慢。在实际应用中,要使|z|尽可能的落在0值附近。

(3)ReLU弥补了前两者的缺陷,当z>0时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当z<0时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。

(4)Leaky ReLU保证在z<0的时候,梯度仍然不为0。

在选择激活函数的时候,如果在不知道该选什么的时候就选择ReLU,当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。

2.4 随机初始化的重要性

如果在初始时,两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候,WW参数要进行随机初始化,bb则不存在对称性的问题它可以设置为0。

以2个输入,2个隐藏神经元为例:

W = np.random.rand((2,2))* 0.01
b = np.zero((2,1))

这里我们将W的值乘以0.01是为了尽可能使得权重W初始化为较小的值,这是因为如果使用sigmoid函数或者tanh函数作为激活函数时,W比较小,则 Z = W X + b Z=WX+b 所得的值也比较小,处在0的附近,0点区域的附近梯度较大,能够大大提高算法的更新速度。而如果W设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。

ReLU和Leaky ReLU作为激活函数时,不存在这种问题,因为在大于0的时候,梯度均为1。


3、深层神经网络

3.1 深层神经网络的表示

DNN结构示意图如图所示:
在这里插入图片描述
对于第 l l 层神经网络,单个样本其各个参数的矩阵维度为:

  • W [ l ] : ( n [ l ] , n [ l 1 ] ) W^{[l]}: (n^{[l]},n^{[l-1]})
  • b [ l ] : ( n [ l ] , 1 ) b^{[l]}: (n^{[l]},1)
  • d W [ l ] : ( n [ l ] , n [ l 1 ] ) dW^{[l]}: (n^{[l]},n^{[l-1]})
  • d b [ l ] : ( n [ l ] , 1 ) db^{[l]}: (n^{[l]},1)
  • Z [ l ] : ( n [ l ] , 1 ) Z^{[l]}: (n^{[l]},1)
  • A [ l ] A^{[l]} = Z [ l ] : ( n [ l ] , 1 ) Z^{[l]}: (n^{[l]},1)

3.2 为什么使用深层网络

人脸识别和语音识别
在这里插入图片描述

对于人脸识别,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。

对于语音识别,第一层神经网络可以学习到语言发音的一些音调,后面更深层次的网络可以检测到基本的音素,再到单词信息,逐渐加深可以学到短语、句子。

所以从上面的两个例子可以看出随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。

注:较早的前几层能学习一些低层次的简单特征(自动特征工程),后几层能把简单的特征结合起来去探测更加复杂的东西。(从简单到复杂)

3.3 前向和反向传播

(1)首先给定DNN的一些参数:

  • L L :DNN的总层数;
  • n [ l ] n^{[l]} :表示第 l l 层的包含的单元个数;
  • a [ l ] a^{[l]} :表示第 l l 层激活函数的输出;
  • W [ l ] W^{[l]} :表示第 l l 层的权重;
  • 输入 x x 记为 a [ 0 ] a^{[0]} ,输出 y ^ \hat y 记为 a [ L ] a^{[L]}

(2)前向和反向传播的过程
在这里插入图片描述

(3)前向和反向传播的公式
在这里插入图片描述

前向传播 Forward propagation

Input: a [ l 1 ] a^{[l−1]}
Output: a [ l ] a^{[l]} c a c h e ( z [ l ] ) cache(z^{[l]})

  • 公式:
    z [ l ] = W [ l ] a [ l 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] ) z^{[l]}= W^{[l]}\cdot a^{[l-1]}+b^{[l]}\\ a^{[l]}=g^{[l]}(z^{[l]})
  • 向量化:
    Z [ l ] = W [ l ] A [ l 1 ] + b [ l ] A [ l ] = g [ l ] ( Z [ l ] ) Z^{[l]}=W^{[l]}\cdot A^{[l-1]}+b^{[l]}\\A^{[l]}=g^{[l]}(Z^{[l]})

反向传播 Backward propagation
Input: d a [ l ] da^{[l]}
Output: d a [ l 1 ] da^{[l−1]} d W [ l ] dW^{[l]} d b [ l ] db^{[l]}

  • 公式:
    d z [ l ] = d a [ l ] g [ l ] ( z [ l ] ) d W [ l ] = d z [ l ] a [ l 1 ] d b [ l ] = d z [ l ] d a [ l 1 ] = W [ l ] T d z [ l ] dz^{[l]}=da^{[l]} * g^{[l]}{&#x27;}(z^{[l]})\\dW^{[l]}=dz^{[l]}\cdot a^{[l-1]}\\db^{[l]}=dz^{[l]}\\da^{[l-1]}=W^{[l]}{^T}\cdot dz^{[l]}
    d a [ l 1 ] da^{[l−1]} 代入 d z [ l ] dz^{[l]} ,有:
    d z [ l ] = W [ l + 1 ] T d z [ l + 1 ] g [ l ] ( z [ l ] ) dz^{[l]}=W^{[l+1]}{^T}\cdot dz^{[l+1]}* g^{[l]}{&#x27;}(z^{[l]})
  • 向量化程序:
    d Z [ l ] = d A [ l ] g [ l ] ( Z [ l ] ) d W [ l ] = 1 m d Z [ l ] A [ l 1 ] d b [ l ] = 1 m n p . s u m ( d Z [ l ] , a x i s = 1 , k e e p d i m s = T r u e ) d A [ l 1 ] = W [ l ] T d Z [ l ] dZ^{[l]}=dA^{[l]} * g^{[l]}{&#x27;}(Z^{[l]})\\dW^{[l]}=\dfrac{1}{m}dZ^{[l]}\cdot A^{[l-1]}\\db^{[l]}=\dfrac{1}{m}np.sum(dZ^{[l]},axis=1,keepdims = True)\\dA^{[l-1]}=W^{[l]}{^T}\cdot dZ^{[l]}

3.4 参数和超参数

参数
参数即是我们在过程中想要模型学习到的信息, W [ l ] W^{[l]} b [ l ] b^{[l]}

超参数
超参数即为控制参数的输出值的一些网络信息,也就是超参数的改变会导致最终得到的参数 W [ l ] W^{[l]} b [ l ] b^{[l]} 的改变。

举例
学习速率: α \alpha
迭代次数: N N
隐藏层的层数: L L
每一层的神经元个数: n [ 1 ] , n [ 2 ] , n^{[1]}, n^{[2]}, ⋯
激活函数 g ( z ) g(z) 的选择


参考:
神经网络和深度学习 吴恩达
吴恩达Coursera深度学习课程 DeepLearning.ai 笔记

猜你喜欢

转载自blog.csdn.net/olizxq/article/details/83688067