=================第3周 浅层神经网络===============
===3..1 神经网络概览===
===3.2 神经网络表示===
===3.3 计算神经网络的输出===
方括号代表层数。
===3.4 多个例子中的向量化===
===3.5 向量化实现的解释===
方括号值的是层数,括号代表样本编号。ppt中显示的,不同row代表某一层的hidden unit,不同列代表各个样本,挺形象的呀,有趣。
===3.6 激活函数===
tanh几乎各方面都比sigmoid好,此时激活函数的平均值就更接近0,这实际上让下一层的学习更方便一点,我们会在下一周详细讨论原因。我几乎不用 σ 激活函数了,一个例外是在输出层。这两个激活函数都有一个缺点,就是z太大或太小时梯度会变很接近0,这将导致学习速度很慢。今天大多数人用的都是Relu,虽然有时人们也会用tanh。Relu的一个缺点是负数部分导数0,但实际证明这并没有什么大问题。Relu is increasingly the default choice of activation function so if you're not sure what to use for your hidden layer,我就用ReLU作为激活函数。Leaky Relu中负轴部分的斜率通常是0.01,也可以把它设成学习算法的另一个参数,有人说这样效果更好,但我很少见到有人这么做。通常比 Relu更好,不过实际中使用的频率没那么高,随便选一个 is ok,如果只能选一个我会选Relu。
===3.7 为什么需要非线性激活函数?===
如果你使用线性激活函数,或者如果没有使用激活函数,那么无论你的神经网络有多少层,那么无论你的神经网络有多少层 ,always doing is just computing a linear activation function。下面ppt左上角,你要是在第一个隐层不加非线性激活,在第2层用sigmod函数,那么这就相当于简单的Logisti回归,我懒得证明了。要点在于,线性隐层一点用都没有,因为两个线性函数的组合本身就是线性函数。除非你做回归问题,那么输出层可以线性,其他隐层几乎都不会使用。
===3.8 激活函数的导数====
sigmoid/tanh求导公式的优点在于,如果你已经计算出a值了,那么用这个式子就可以很快算出g(z)的斜率。
Relu和Leaky Relu的零点的导数无论归到哪部分都是可以的。
===3.9 神经网络的梯度下降法==
单隐层神经网络的反向传播,假设二分类任务,损失函数使用Log损失。加上开关keepdims 就是防止python直接输出这些古怪的rank 1 arrays。运算符 * 代表逐元素相乘。
好好体会呗,尤其向量化之后求导 dZ,dW时要注意维度匹配、逐项乘还是矩阵乘、1/m等。
===3.10 (选修)直观理解反向传播===
这是我在机器学习领域中看到的最难的推导之一(哈哈哈)。
===3.11 随机初始化===
对于logistic回归 可以将权重初始化为零,但如果将神经网络的各参数数组全部初始化为0,再使用梯度下降算法,那会完全无效。全部同样的初始值对权重进行初始化,会造成隐藏单元的效果完全一样,意味着节点计算完全一样的函数。我们可以通过归纳法证明每次训练迭代之后,两个隐藏单元仍然在计算完全相同的函数。
随机初始化时通常将权重初始化小一点,以免梯度很小,如果你的神经网络中没有任何sigmoid或者tanh激活函数,那问题可能没那么大 但如果你在做二元分类,你的输出单元是Sigmoid函数,那么你就不希望初始参数太大,所以用0.01是比较合理的,或者任意其他小数字。
来源:https://www.cnblogs.com/JesusAlone/p/8793237.html