____tz_zs学习笔记
第三周 浅层神经网络
3.1 神经网络概览
本节课带你大概了解一下神经网络长什么样,以及流程。
3.2 神经网络表示
这是一个双层神经网络,因为我们不把输入层看作一个标准的层。
“隐藏层”这个名字的含义是:在训练集中,这些中间节点的真正数值我们是不知道的,在训练集中你看不到他们的数值(训练集只有输入值和输出值),所谓的“隐藏层”仅仅只是表示你无法在训练集中看到。
3.3 计算神经网络的输出
每个节点的计算
将同一层的计算向量化
向量化时的一条经验法则:当我们在一层中有不同的节点,那就纵向堆叠起来。
·
3.4 多个例子中的向量化
多个训练样本正向传播过程的向量化
老师语:详细了解线性代数的细节在深度学习领域是很重要的,能帮助你快速正确的实现这些算法。
横向堆叠起来,堆叠到矩阵各列里,构成大矩阵。
横向指标对应了不同的训练样本,竖向指标对应了神经网络里的不同节点。
3.5 向量化实现的解释
本节课讲述了3.4中向量化的正确性
规律:如果将输入成列向量堆叠,那么在方程运算之后,你也能得到成列堆叠的输出。
·
3.6 **函数
本节课帮助你对如何在你的网络里选择**函数有所理解。
tanh函数(或者叫双曲正切函数),在数学上,这实际上是σ函数平移后的版本。
tanh函数几乎在所有场合都比σ函数表现好,因为tanh函数输出介于-1和1之间**函数的平均值更接近0,使用tanh函数而不是σ函数也有类似数据中心化的效果。
老师说:几乎不使用σ函数了,tanh函数几乎在所有场合都更优越,一个例外场合是二元分类中的输出层,使用σ**函数作为输出层。
tanh函数和σ函数都有一个缺点是,如果z很大或者很小,那么导数的梯度或者说这个函数的斜率可能就很小,这样会拖慢梯度下降算法。
选择**函数的经验法则:如果输出值是0和1,在做二元分类,那么σ函数很适合作为输出层的**函数。然后其他单元都用ReLU,ReLU(修正线形单元)已经是**函数的默认选择了,当不确定隐藏层选什么**函数时,就用ReLU作为**函数。
ReLU的缺点:z为负时,导数等于0。
ReLU和带泄漏的ReLU好处在于,对于很多z空间,**函数的导数和0差很远。没有那种斜率接近0时,减慢学习速度的效应。
·
深度学习的其中一个特点是:在建立神经网络时经常有很多不同的选择。(比如,隐藏单元数、**函数、初始化权重)
3.7 为什么需要非线性**函数?
如果使用线性**函数,或者没有**函数,那么无论有多少隐藏层,你一直在做的只是计算线性**函数。
因为两个线性组合的组合本身就是线性函数。
3.8 **函数的导数
神经网络的反向传播时,需要计算**函数的斜率或者导数。
sigmoid**函数的导数
tanh**函数的导数
ReLU和带泄漏的ReLU**函数的导数
3.9 神经网络的梯度下降法
本节课为梯度下降算法(反向传播)的具体实现,要能够正确的执行正向和反向传播运算,学会所需要的导数,学会用梯度下降法来学习神经网络的参数。
下图为正向传播和反向传播的步骤及其公式,证明和推导过程将在下一节课学习。
stackoverflow上关于keepdims的问答:what the role of keepdims in python
3.10 (选修)直观理解反向传播
下图为回顾logistic回归的梯度计算
神经网络反向传播
注意:1、这里和2.14节logistic回归梯度计算公式的区别是,2.14节的是单个参数w,这里的是大写的矩阵W。大写的矩阵W是单个的w成列堆叠成大矩阵后转置得到的。
2、实现反向传播有个技巧:确保矩阵的维度互相匹配。——这样就已经能消除很多bug了。
回顾前面课程中前向传播的多样本向量化
反向传播的多样本过程的总结
初始化参数,不要全零,而是随机初始化,对于训练你的神经网络很重要。
3.11 随机初始化
如果你将所有W初始化为0,那么因为两个隐藏单元一开始就在做同样的计算,两个隐藏单元对输出单元的影响也一样大,那么在一次迭代后,同样的对称性依然存在,无论你迭代多少次,两个隐藏单元仍然在计算完全一样的函数。
初始化参数一般都很小,如果W很大,那么可能一开始就落在z很大的区域,tanh函数或者sigmoid函数梯度的斜率很小,导致减慢学习速度。
·