【Nan‘s 吴恩达深度学习笔记】第三周 浅层神经网络
浅层神经网络(shallow neural networks)
3.2 神经网络表示
输入层:输入特征𝑥1、 𝑥2、 𝑥3,它们被竖直地堆叠起来;
隐藏层:在训练集中看到他们,中间结点的准确值未知;
输出层:负责产生预测值。
符号使用中,当我们计算网络的层数时,输入层不算入总层数内。
3.3 神经网络输出计算
计算出隐藏层的四个逻辑回归单元和整个隐藏层的输出结果,如果编程实现需要的也只是这四行代码:
3.4 多样本向量化
矩阵𝐴:从水平上看,代表了各个训练样本。从竖直上看,矩阵𝐴的不同的索引对应于不同的隐藏单元。
矩阵𝑍、X:水平方向上,对应于不同的训练样本;竖直方向上,对应不同的输入特征,而这就是神经网络输入层中各个节点。
3.6 激活函数(Activation Function)
使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。使用不同的函数𝑔(𝑧[1]), 𝑔可以是非线性函数。
①sigmoid函数
在神经网路的前向传播中, 𝑎[1] = 𝜎(𝑧[1])和𝑎[2] = 𝜎(𝑧[2])这两步会用到 sigmoid 函数。
②tanh 函数
tanh 函数(双曲正切函数)是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,并且值域介于+1和-1之间。
在训练一个算法模型时,其效果总是优于 sigmoid 函数。如果使用 tanh 函数代替sigmoid 函数中心化数据,使得数据的平均值更接近 0 而不是 0.5.
例外:在二分类的问题中,对于输出层需要使用 sigmoid 激活函数,因为𝑦的值是 0 或 1,所以想让 y ^ \hat{y} y^的数值介于 0 和 1 之间,而不是在-1 和+1 之间.
sigmoid 函数和 tanh 函数两者共同的缺点:在𝑧特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。
③修正线性单元的ReLu函数
④Leaky ReLu
效果通常比ReLu更好,但实际不常用。
经验法则:
①二分类问题:如果输出是 0、 1 值(),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
②对于隐藏层:若不确定使用哪个激活函数,通常会
使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当𝑧是负值的时候,导数等于 0。在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
③小结:
sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
tanh 激活函数: tanh 是非常优秀的,几乎适合所有场合。
ReLu 激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用 ReLu 或者Leaky ReLu。
Why非线性激活函数
没有非线性激活函数,神经网络也就失去了意义!
𝑎[2] = 𝑧[2] = 𝑊′𝑥 + 𝑏′
如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。
如果在隐藏层用线性激活函数,在输出层用 sigmoid 函数,那么这个模型的复杂度和没有任何隐藏层的标准 Logistic 回归是一样的。
不能在隐藏层用线性激活函数,唯一可以用线性激活函数的通常就是输出层(一般用于回归问题)。
激活函数的导数
①sigmoid
②tanh
神经网络中:
a
=
g
(
z
)
a=g(z)
a=g(z)
g
(
z
)
′
=
d
d
z
g
(
z
)
=
1
−
a
2
g(z)'=\frac{d}{dz}g(z)=1-a^2
g(z)′=dzdg(z)=1−a2
③ReLU
④Leaky ReLU
神经网络的梯度下降
训练参数需要梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是初始化成全零。当你参数初始化成某些值后,每次梯度下降都会循环计算预测值
y
^
(
i
)
(
i
=
1
,
2
,
.
.
.
,
m
)
\hat{y}^{(i)}(i=1,2,...,m)
y^(i)(i=1,2,...,m)。
3.32:
3.33:
为什么
a
[
1
]
T
a[1]^T
a[1]T多了个转置: 𝑑𝑤中的𝑊(视频里是
W
i
[
2
]
W_i^{[2]}
Wi[2]是一个列向量,而𝑊[2]是个行向量,故需要加个转置。
类似逻辑回归中,dw=dz·x,只是
a
[
1
]
a[1]
a[1]目前充当x。
维度总结:
𝑊[2]的维度是: (𝑛[2], 𝑛[1])。
𝑧[2] , 𝑑𝑧[2]的维度都是: (𝑛[2], 1),如果是二分类,那维度就是(1,1)
随机初始化
对于一个神经网络,如果你把权重或者参数都初始化为 0,那么梯度下降将不会起作用。
解 决 方 法 就 是 随 机 初 始 化 参 数,把偏置项𝑏初始化为 0 是合理的,但是把𝑤初始化为 0 就有问题。
通常倾向于初始化为很小的随机数。防止造成tanh/Sigmoid 激活函数饱和在龟速的学习。