第3讲 浅层神经网络
3.1 为什么需要非线性激活函数?
事实证明:要让你的神经网络能够计算出有趣的函数,你必须使用非线性激活函数,证明如下:
- 这是神经网络正向传播的方程,现在我们去掉函数𝑔,然后令𝑎[1] = 𝑧[1],或者我们也可以令𝑔(𝑧) = 𝑧,这个有时被叫做线性激活函数(更学术点的名字是恒等激励函数,因为它们就是把输入值输出)。为了说明问题我们把𝑎[2] = 𝑧[2],那么这个模型的输出𝑦或仅仅只是输入特征𝑥的线性组合。如果我们改变前面的式子:
所以,可以看出来,如果是用线性激活函数,那么神经网络只是把输入线性组合再输出。那么,无论你的神经网络有多少层一直在做的只是计算线性函数,所以不如直接去掉全部隐藏层。
3.2 四种激活函数的导数
在神经网络中使用反向传播的时候,需要计算激活函数的斜率或者导数。
1)sigmoid
倒数:
2) tanh
倒数:
3) ReLU
导数:
4) Leaky ReLU
倒数:
3.3 神经网络的梯度下降
1) 参数初始化问题
训练参数需要做梯度下降,在训练神经网络的时候,参数需要随机初始化,而不是初始化成全0。
- 如果你要初始化成 0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。
- 随机初始化的话:
- 𝑊[1] : 设 为np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初始化为很小的随机数。
- 𝑏:没有对称的问题,所以可以把 𝑏 初始化为 0
- 相似的,对于𝑊[2]你可以随机初始化,𝑏[2]可以初始化为 0。
为什么有0.01?
因为如果你用 tanh 或者 sigmoid 激活函数,或者说只在输出层有 一个 Sigmoid,如果数值波动太大,当计算激活值 z 时因为如果你用 tanh 或者 sigmoid 激活函数,或者说只在输出层有 一个 Sigmoid,如 果( 数值 )波 动太大 ,当 你计算激活值时 𝑧 = Wx + b, a=𝜎(𝑧) ,如果W很大,z就会很大,根据Sigmoid图像可知,z的某些a值只会停在两端平台的地方,这就意味着梯度下降会横慢,学习就很慢。
以单个训练样本的浅层神经网络为例
2)前向传播推导:
其中我们先计算𝑧,然后a,然后损失函数𝐿。过程如下图:
3) 反向传播推导:
反向传播其实就是做最优化,根据前向传播得到的loss值反向计算,根据参数对最终的loss值得影响进而更新参数值。若参数值增大,使最终loss值变大,我们应该减小该参数值大小;若参数值减小,使最终loss值增大,我们应该继续让改参数值减小。因为我们最终一定是让loss损失值的大小尽可能地小。
- 向后推算出𝑑𝑎[2],然后推算出𝑑𝑧[2],接着推算出𝑑𝑎[1],然后推算出𝑑𝑧[1]。我们不需要对𝑥求导,因为𝑥是固定的,再说了我们也不想优化𝑥。
- 下图为主要的推导过程:
4) 梯度下降
吴恩达老师认为反向传播的推导是机器学习领域最难的数学推导之一,矩阵的导数要用链式法则来求,如果这章内容掌握不了也没大的关系,只要有这种直觉就可以了
本讲的编程学习连接:https://blog.csdn.net/u013733326/article/details/79702148