title: 深度学习笔记-第三周
date: 2022-12-14 20:54:30
【3.1 神经网络概况】
x代表输入特征,参数W和b,上标[]表示层数。
【3.2 神经网络表示】
将x1,x2,x3竖向堆积起来构建起神经网络的输入层(也可以用a[0]来表示输入特征的数值,a表示“激活”,每一个节点计算后都会将计算结果传递给下一层,作为下一层的输入特征
, 即a[0]表示第0层的输入,a[1]表示第1层的输入,直到最后一层a[i]=
y
^
\widehat{y}
y
)。
中间一层称为隐藏层(在训练集中中间节点的真正数值,在训练集中无法看到)。
a[3]是只带一个节点的层为输出层,它负责输出预测值 y ^ \widehat{y} y 值。
【3.3 计算神经网络的输出】
和logistics回归类似,每个节点进行两步计算,直到遍历完所有节点。
为了不使用for循环,我们通过向量化
:
用大写的Z[i]表示z[i]的列堆积(第i层)
用大写的W[i]表示w[i]T的行堆积(第i层)
用b[i]表示b[i]的列堆积(第i层)
用a[i]表示a[i]的列堆积(第i层),特别的a[0=] = x
【3.4 多个例子的向量化】
for循环表示遍历整个训练集。将其向量化后:
堆积的横向表示不同训练样本,竖向表示同一训练样本的不同指标
用A[i]表示a[i]的列堆积,特别的A[0=] = X
用Z[i]表示Z[i]的列堆积
【3.5 向量化实现的解释】
我们以2层神经网络为例。
X为x的横向堆叠:
Z是z的横向堆叠:
通过对x和a的堆叠(红框),可以除去一个显式的for循环(蓝框)。
【3.6 激活函数】
要搭建一个神经网络,可以选择在隐藏层和神经网络的输出层用什么样的激活函数(隐藏层的激活函数可以和神经网络的输出层不同
)。
一些约定:用g(z)来代表函数(线性和非线性)。
sigmoid激活函数和Tanh激活函数的局限性:他们的值域饱和并且非常深的神经网络使用Sigmoid 和 tanh 激活函数不容易训练。在大型网络深层使用这些非线性激活函数不能接收有用的梯度信息等。
因此ReLu激活函数
出现了。
ReLu激活函数图像:
一些经验法则:如果输出值是0或1,那么Sigmoid很适合作为输出层的激活函数,然后其他所有单元使用ReLu。(如果不确定隐藏层该用哪个,可以使用ReLu作为激活函数
)
【3.7 为什么使用激活函数】
如果使用只使用线性激活函数或者不使用激活函数,那么无论神经网络有多少层,那么神经网络的输出结果只是把输入线性组合再输出。
【3.8 神经网络的梯度下降法】
以二分类为例:
正向传播:
- Z[1] = W[1]X + b[1]
- A[1]= g[1](Z[1])
- Z[2] = W[2]A[1]+ b[2]
- A[2]= g[2](Z[2])
反向传播:
- dZ[2] = A[2] - Y (Y = [y[1], y[2], ……])
- dW1 = 1/m * dZ [2]* A[2]T
- db[2] = 1/m* np.sum(dZ[2], axsi = 1, keepdims = True) (np.sum是用来对矩阵的一个维度求和, keepdims防止输出一些奇怪的秩为1的数组)
- dZ[1] = W[2]TdZ[2] * g[1]'(Z[1])
- dW[1] = 1/m * dZ[1] XT
- db[1] = 1/m * np.sum(dZ[1], axsi = 1, keepdims = True)
【3.9 随机初始化】
对于logistics回归,可以将权重初始化为0,但如果将神经网络的各参数数组全部初始化为0,再使用梯度下降法是无效的
解决方案是随机初始化所有参数。
以两层神经网络为例:
b可以初始化为0。
为什么×0.01而不是100或者1000?
实际上,我们习惯将权重初始化为非常小的随机值,因为如果使用的是tanh或者是sigmoid激活函数,如果权重太大,当计算激活函数时可能会使z的值落在tangh或sigmoid函数的平缓部分,此时梯度的斜率非常小, 梯度下降法会非常慢,所以学习率会很慢。
2 ↩︎