Neural Networks and Deep Learning (Week 3)——Shallow neural networks

(一)Neural Networks Overview——一个隐藏层的神经网络

问题:z[2]和a[2]为什么要这么计算?

(二)Neural Network Representation

输入层:a[0]=x

隐藏层:a[1]-------a1[1],a2[1],a3[1],a4[1],表示的是在第1层的第几个节点

输出层:a[2]----预测值

用上标来明确指出这是哪一层,约定在描述神经网络的层数时不加输入层,所以隐藏层是第一层,输出层是第二层。

(三)Computing a Neural Network's Output

圆圈表示的是:进行两步运算,第一步计算z,第二部计算z的激活函数sigmoid(z)

对于上图中的第一层,即隐藏层而言,进行的是如上图右侧所表示的计算


为避免进行for循环的复杂操作,即需要对上述式子进行向量化的操作,如下图

进而对z[1]进行sigmoid运算,则可以得到对应的a[1] ,即

得到的a[1]是一个4X1的向量,且每个元素的取值范围都是0~1

然后计算第二层:

a[1]维度是 4X1,w[2]是1X4,b是1X1,因此得到的a[2]的维度也是1X1

(四)Vectorizing across multiple examples

如果有多个样本,则需要对上述过程进行多次循环,用a[2](1)两个都是上标,表示的是在第二层神经网络的第一个案例的输出结果。

方法一:使用for 循环,即对上述4个步骤的上标分别加上第几个案例的标识进行循环,即

方法二:使用整个向量

纵向来看是不同的实例,横向是每个实例在每个神经单元的取值之类的

(五)Explanation for Vectorized Implementation

(六)Activation functions

1.tanh function

函数最后得到的值在-1~1之间,更可能使训练的数据中心化,平均值为0,使得下一层的学习更简单。结果一般优于sigmoid函数。

它和sigmoid函数共同存在的缺点就是:当Z值趋向于无穷时,所在的梯度很小几乎接近于0,变化很慢。

2.ReLU

如果不确定用什么激活函数的话,就使用ReLU函数即可

 3.Leaky ReLu

与ReLU函数不同的是,当Z小于0时,斜率不为0,而是有比较小的斜率值

在实际中,一般使用ReLu函数,因为其使学习变慢的斜率趋于0的现象变少了????但它到负数的时候不都直接成为0了么???

第二个问题:ReLu函数如何进行分类,也是当z>0时,分类为1?Z<0时,分类为0吗?感觉并不科学,,,

总结:

Sigmoid函数一般不使用,除非其要解决二分类问题或在输出层上使用;

RelU&Leaky Relu

(七)Why do you need non-linear activation functions

为什么要用一个非线性的激活函数呢?

 使用线性的激活函数,最后结合的是两个线性函数,得到的仍然是线性函数,与使用隐藏层无关。

当解决回归问题时,即最后的结果不是只有0和1两类,输出值是线性组合即可,而之前的隐藏层依旧要使用非线性函数

(八)Derivatives of activation functions

1.sigmoid函数

2.tanh函数

3.Relu函数

(九)Gradient descent for neural networks

这步是单纯的公式呈现喔

(十)Backpropagation

对于有一个隐藏层的2层神经网络来说,即

反向计算:da[2],dz[2],dw[2],db[2],da[1],dz[1],db[1],dw[1]

其中,感觉比较难理解的是dz[1],对z[1]进行求导,首先对a[1]求导,然后a[1]再对z[1]求导,从前可知,对a[1]求导就是w[1],对w[1]中的a[1]求导就是dz[2],因此所得的结果就是w[1]*dz[2]*g'(z[1])

向量化处理多个样本:

(十一)Random Initialization

把初始参数都初始化为0是不可取的,如果初始的w都为0,造成隐藏成的几个节点的计算功能一致,无论迭代多少次,都相当于隐藏层只有一个节点。

因此,需要对w权重矩阵进行随机的赋值,并且乘以一个很小的数值,如0.01

浅层神经网络的随机化之后取值为0.01较好

但对于过于深层的神经网络来说不一定都要是0.01

猜你喜欢

转载自blog.csdn.net/weixin_38527856/article/details/86525548