Stanford CS230学习笔记(四):Lecture 3 Shallow Neural Network

333 阅读5分钟

这章更完会跳很大一段!yep!直接跳到Lecture 8!因为项目是NLP方向的,现在在看时间更短且针对性更强的CS224n,前面的可能会等到四月份项目结题再看,CS224n里面讲得不清楚的地方我发现Andrew讲得蛮细致,所以直接跳到Sequence Models这一章,开始同时看两个,同时会写CS224n的笔记,反正也没人看我写的这些东西,自由的感觉真好(不想再努力了呜呜呜)

浅层神经网络基础

神经元的计算

每一个隐藏层和输出层的神经元(neuron) 当中,都有两步计算

  1. 计算z^{[m]}=W^{[m]}a^{[m-1]}+b^{[m]}这里的W包含了转置的操作,当m=1时,a^{[0]}=x,即为输入
  2. 计算a^{[m]}=g^{[m]}(z),其中g^{[m]}(x)是神经网络当前层的激活函数,而后将结果输出到下一层

神经网络的输入输出

若记XY分别为输入和输出结果,那么它们的结构如下:

  • X -- input dataset of shape (input size, number of examples)
  • Y -- labels of shape (output size, number of examples)

这里要注意X所代表的输入大小即为输入层神经元个数(样本向量长度)

神经网络的表示

神经网络一般可以看作1+n+1的结构,分为:

  • 输入层(Input layer):大小为每个样本具有的向量长度
  • 隐藏层(Hidden layer):数量与连接方式自定义
  • 输出层(Output layer):大小为计算的结果具有的向量长度

层数不包括输入层,因此最简单的神经网络是两层的神经网络

符号表示

假设z^{[2]}=(w^{[2]})^Ta^{[1]}+b^{[2]},可以看到w b的值每一层都不同,其矩阵大小分别由输入和输出决定

  • w.shape == (m,n),那么m == 该层的神经元数n == 上一层的神经元数

    • 直觉上这里应该是反的,但w计算时候加了转置
  • b.shape == (x,y),那么x == 该层的神经元数y == 下一层的神经元数

上下标符号说明:

  • [1]:用于上标,表示第几层的变量
  • (3):用于上标,表示第几个样本对应的变量,一般只用于x
  • 4:单独的数字用于下标,表示该变量在本层内隶属于第几个神经元

因此a_4^{[1](3)}就表示 处于第一层的第四个神经元输出的关于第三个训练样本的激活向量(activation vector)

浅层神经网络的计算

向量化

直接按列堆叠向量,就可以得到正确的表达式,其实正确性就是来源于线性代数的那一套

自己关于向量化的理解:向量化去for loop的本质只是将for循环转换成了矩阵的计算而已

这张图Andrew画得很清楚,看到这里豁然开朗orz

反向传播

随机初始化

在之前的逻辑回归中,将所有wb的值初始化为0是可行的,但在神经网络中,将所有值初始化为0就会出现**对称化(symmetry)**的情况,其实不仅是0,将同一层的wb以相同常数初始化都会出现这种问题,所以wb的初始值应保持不同,因此采用随机的方法初始化

关于对称化的含义及来源,可以参考【知识】神经网络中的参数初始化 - 大胖子球花 - 博客园,我个人的理解是梯度下降寻找的是wb的最优解,如果用相同参数初始化,权值也相同的情况下,就会出现一个隐藏层中的神经元无论怎么训练结果都相同的情况,这就造成了神经元的浪费,也不利于整体的训练

如下图所见,可以将一个神经元用0初始化,其他的全都随机初始化,且乘的系数应该很小,避免z过大梯度过小的问题

激活函数

常用激活函数

选取

  • sigmoid:二元分类问题
  • tanh:浅层神经网络,其实除了二元分类,其他的时候都比sigmoid优秀
  • ReLU:常用于深层网络激活函数,有效解决当z的值太大时候梯度下降过慢的问题
  • Leaky ReLU:为解决ReLU函数左侧梯度为0的问题,用途不广

下面来自于 www.cnblogs.com/hutao722/p/…

相较而言,在隐藏层,tanh函数要优于sigmoid函数,可以认为是sigmoid的平移版本,优势在于其取值范围介于-1 ~ 1之间,数据的平均值为0,而不像sigmoid为0.5,有类似数据中心化的效果

但在输出层,sigmoid也许会优于tanh函数,原因在于你希望输出结果的概率落在0 ~ 1 之间,比如二元分类,sigmoid可作为输出层的激活函数

但实际应用中,特别是深层网络在训练时,tanh和sigmoid会在端值趋于饱和,造成训练速度减慢,故深层网络的激活函数默认大多采用relu函数,浅层网络可以采用sigmoid和tanh函数

激活函数的作用

这一段老师没讲,大概的思路是这样的:

对于有些样本,用一条直线就可以将它们分开,但是对于大多数样本一条直线并不能满足需求,激活函数的作用就是将线性分割转换成非线性的分割,更细致的可以参照 www.zhihu.com/question/22…

常见激活函数的求导

注意点

这里有两道错题

逻辑斯蒂回归的全0初始化

逻辑斯蒂回归是可以使用0全部初始化的,因为它没有隐藏层

结果输出维度

z^{[m]}=W^{[m]}a^{[m-1]}+b^{[m]},这里本来想的是ZA的输出维度与该层的b保持一致,但是其实在计算过程中 b从列向量被横向广播到了m,即样本的个数,因此这道题答案应该是B