第三周——浅层神经网络
1、神经网络概述
比较简单,没有什么需要笔记记录的。
2、神经网络表示
(1)只有一个隐藏层的神经网络,三层NN:输入层、隐藏层、输出层;两层NN:隐藏层、输出层。
(2)由于输入层没有任何参数需要去学习,所以并不把输入层视做标准的一层,所以感知器亦称为单层NN,即它只有输出层。
(3)输入层亦称之为第零层,隐藏层为第一层,每一层会将激活值馈送给下一层,变量a表示这是激活值向量。
3、计算NN的输出
(1)带有非线性激活函数的神经元堆叠形成层,层堆叠形成网络。
(2)权重矩阵的某一行,行向量,对应于该层某个神经单元的权重向量,偏置向量的某一个元素则对应于该层某个神经单元的偏置值。
(3)向量化,沿着竖方向进行堆叠,于是就得到了W、b、z和a。
(4)隐藏层得到输入样本新的表示形式,即特征向量,输出层就是一个线性分类器(线性模型+将输出归一化使得具有概率意义),例如用于二分类的logistic回归和用于多分类的softmax回归,通过计算输入样本属于各个类别的概率来预测输入样本的类别。
4、多样本向量化
(1)向量化的好处,可以避免写显示的for循环,这样就不用写一堆的角标用于指定这是哪一个样本或是那一层,使得代码足够简洁,不容易出错。
(2)另外通过向量化,可以使用numpy内置的相关函数,做element wise的操作和向量矩阵计算等,numpy基于经典的线性代数库BLAS(C/C++写的),使用CPU/GPU(GPU不确定?)支持的SIMD指令,数据并行,加快代码的运行速度,所以看DL框架的源代码,是看不到多线程相关的代码的。
5、向量化实现的解释
没什么好解释的,就是:Z=WX+b; A=sigmoid(Z)。
6、激活函数
(1)tanh函数的效果几乎总是比sigmoid好,所以隐藏层几乎不会使用sigmoid来引入非线性。
(2)当构建二分类模型的时候,输出层使用sigmoid使得输出归一化为输入样本属于正类的概率。
(3)由于S型函数存在导数趋近于零的区域,故在反向传播链式求导的时候,会导致梯度趋近于零,使得训练速度变慢。
(4)ReLU函数在z=0处不可微(可微必可导,可导必可微;可导必连续,连续不一定可导),导数没有定义(编程的时候,z=0处的导数可以为0也可以为1,喜欢就好),事实上z=0的概率极低;它的另外一个缺点,当z<0时,导数为零。
(5)Leaky ReLU,a=max(0.01z, z);不过由于有足够多的隐藏单元使得z往往都大于零,故实际应用中还是常用ReLU。
7、为什么需要非线性激活函数
(1)如果隐藏层神经单元都使用线性激活函数,则任意多层的MLP都可以约简为感知机,即依然只是一个线性模型,即模型的输出依然只是输入特征的线性组合,无法解决非线性问题,更多详见 多层感知机/器-MLP。
(2)如果是回归问题,即输入输入对的输出(样本的标签)为连续值,则输出层可以使用线性激活函数。
8、计算激活函数的导数
(1)a=sigmoid(z), da/dz=a(1-a)。
(2)a=tanh(z), da/dz=1-a的平方。
(3)ReLU和Leaky ReLU在z=0处不可导。
9、使用梯度下降训练NN
向量化,没什么需要记录的内容
10、直观理解反向传播
(1)向量化,单样本训练logistic回归模型。
(2)向量化,单样本训练NN。
(3)向量化,多样本训练NN,如下面两图所示:
11、随机初始化(关于权重初始化,理解得还不是特别到位,需要看些论文)
(1)logistic回归的权重向量可以被初始化成全零,softmax回归的权重矩阵亦可。
(2)MLP每一层的权重矩阵不可以被初始化成全零,否则网络会不work,不过偏置向量可以初始化成全零。
(3)如果MLP的权重矩阵被初始化成全零,则每一个神经元都在做一样的计算,则输出的激活值矩阵所有元素均相等;反向传播时梯度矩阵dW=dZ*Ai-1
,两个所有item皆相等的矩阵相乘得到的新的矩阵所有item亦相等;参数更新之后,权重矩阵所有item依然相等,即某一层每个神经元依然在做一样的计算,则最后softmax输出层计算得到的该样本属于各个类别的概率将会是一样的,则模型完全不work。
(4)需要将权重随机初始化成一些很小的数,因为输出层可能会使用sigmoid函数,则dZ=dA*dA/dZ,若权重很大,则Z的元素会很大或很小(负数),则dZ的元素会趋近于零,导致梯度下降优化参数很慢。