(一)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