1-3 浅层神经网络

吴恩达《神经网络和深度学习》课程笔记


1. 一些符号说明

圆括号上标,例如 x(i) 表示第 i 个训练样本;方括号上标,例如 z[n] 表示第 n 层网络。

一个圆形节点代表计算一次 z 和 a,即 z[n] = W[n]x + b[n],a[n] = sigmoid(z[n])。

输入层称为第0层,从隐藏层开始称为第1层、第2层……

激活值 a[n]:从第n层传递给第n+1层的值组成的向量,向量的维数取决于第n层的节点数。

2. 神经网络计算过程

一个简单的示意图:

计算过程:

其中,a[0] 为 (3,1) 的向量,W[1] 为 (4,3) 的矩阵,b[1] 为 (4,1) 的向量,z[1] 为 (4,1) 的向量,以此类推。

注意:在logistics回归中,z = wTx + b,而这里的W矩阵不用转置。因为 ,

2. 向量化

向量化只要把 m 个训练样本的上述列向量堆叠起来即可,例如

伪代码表示如下,

Z[1] = W[1]*X + b[1]
A[1] = sigmoid(Z[1])
Z[2] = W[2]*A[1] + b[2] 
A[2] = sigmoid(Z[2])

3. 激活函数

在上面的表达中,我们一直用 sigmoid 函数作为激活函数,实际上激活函数还有很多种选择,常用的几种如下:

  1. sigmoid 函数
    输出是0或1,比如进行二元分类的时候,在输出层使用。否则,不要用。
  1. tanh 函数
    效果通常比 sigmoid 函数好。
  1. ReUL(修正线性单元)
    大多数情况下使用的激活函数。
  1. leaky ReUL(泄露修正线性单元)
    效果较 ReUL 好,但是效率较低,可以一试。

激活函数通常都是非线性函数,因为如果使用线性激活函数,那么不管有多少隐藏层,最终的结果都是输入x的线性函数,隐藏层就没有了意义。

4. 梯度下降法

注意

  1. 上述 np.sum() 函数中,如果不加 keepdims=true,得到的矩阵是 (n[i],) 类型的;加上 keepdims=true,得到的矩阵是 (n[i],1) 类型的。
  2. 其中的 * 表示对前后两个矩阵做逐个元素的乘积。

一些公式的证明

损失函数为交叉熵损失,激活函数为sigmoid函数时,梯度计算公式的证明:

dz[1] 的计算公式老师没有证明,我自己简单的推导了一下:

最后一步的公式,可以根据矩阵的维度拼凑出来,但是不知道如何严格推导,懒得去看了……

为什么要随机初始化?

不能全部初始化为0,实际上是不能全部初始化为相同的数。因为如果W矩阵所有的数值都相同,那就意味着所有的节点的参数都相同,即所有节点都是等价的。这样神经网络就失去了意义。

但是,随机初始化W矩阵后,可以用0来初始化参数b。


好久没有放图片了,放一张羡羡~~ end

你可能感兴趣的:(1-3 浅层神经网络)