神经网络与深度学习

学习资料:deeplearning.ai的《神经网络和深度学习》

一. 深层神经网络

1. 为什么需要深层神经网络

  • 对于深层神经网络,神经网络前几层的特征比较简单,之后几层可以抽取出更复杂的特征。
    比如:语音识别:前几层是声音的声波识别->声音的音位->声音里的字母->单词->短语->句子
    从最简单的特征的不断向上提升层次。
  • 是遵循电路原理:浅层次的网络相对于深层次的需要指数级的神经单元才能达到和深层次的同样效果。

当然神经网络不是越深越好,层次的深度和调参数一样,也是需要不断的尝试选择一个最适合的层次。

2. 神经网络中的参数及其维度

L代表层数,输入层为第0层(l=0),一个n层神经网络有n-1层隐藏层。

每一层神经网络都有输出,记作(A^{[l]}),输入层输入的特征记作(x),但是(x)同样也是0层的输出,所以(x=A^{[0]})

假设每个样本有(x)个特征,训练集总共有m个样本。

(A^{[l]})(Z^{[l]})维度:((n^{[l]}),m)

(W^{[l]})维度:((n^{[l]}),(n^{[l-1]}))

(b^{[l]})维度:((n^{[l]}),1)

无论是前向传播还是反向传播,所有的矩阵维数都是前后一致的!

截屏2020-01-15下午12.40.11

3. 参数的随机初始化

对于(W^{[l]})可以用高斯分布随机初始化,(b^{[l]})可以初始化为0。

4. 激活函数

神经网络中的每个结点包括线性运算和非线性运算,激活函数就是非线性部分。

  • sigmoid激活函数:除了输出层是一个二分类问题基本不会用它。

  • tanh激活函数:tanh是几乎适合所有场合。

  • ReLu激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用ReLu或者Leaky ReLu

二. 前向传播和反向传播

1. 前向传播

for l in range(1,L+1):

[Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]} ]

[A^{[l]}=g^{[l]}(Z^{[l]}) ]

其中(A^{[0]}=X;X={x_1,x_2,x_3})

2. 反向传播

截屏2020-01-15下午12.29.34

3. 传播过程

截屏2020-01-15下午12.30.27

三. 广播机制

1. 广播broadcast

两个多维度向量加减乘除时,只要两个向量columns或者ranks有一个相等,即行数相等或者列数相等则可以在相应的位置上进行运算。如果没有哪一个对应相等,则不可以运算。

(m*n)数组 与 (m*1)/(1*n)数组都可以进行+-*/。
运算时(m*1)/(1*n)自动扩充至(m*n)
同理:
(1*m) 与 k也可以运算

注意:如果列数等于行数不可以进行运算!唯一的特例:(1,n)与(n,1)之间可以运算,结果为(n,n)维向量

2. 乘法使用

元素乘法:np.multiply(a,b)
矩阵乘法:np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b)
唯独注意:*,在 np.array 中重载为元素乘法,在 np.matrix 中重载为矩阵乘法!

元素乘法可以用利用broadcast;而矩阵乘法必须要满足(m*n)(n*k)

3. 定义矩阵时的建议

shape: (n,) 与 (1,n) 区别:
例: (4,) [1,2,3,4] 一维数组 
    (1,4) [[1,2,3,4]] 二维数组

1.不要使用rank 1array!

如下:
不要使用:
a = np.arange(100)
a = np.random.randn(5)

用(1,n)(n,1)等来代替
a = np.arange(100).reshape(1,100)
a = np.random.randn(1,5)

2.经常使用np.reshape来使向量理想化

原文地址:https://www.cnblogs.com/z1xiang/p/12675875.html