【神经网络基础】第二课--浅层神经网络

版权声明:本文为王小草原创文章,要转载请先联系本人哦 https://blog.csdn.net/sinat_33761963/article/details/80317675

课程来源:吴恩达 深度学习课程 《神经网络基础》
笔记整理:王小草
时间:2018年5月15日


1.神经网络概览

回顾逻辑回归的结构:
image_1cde2lj74ao013451inq1egj193e9.png-7.3kB
圆圈节点内的计算如下,先计算线性z,再过一个sigmoid函数得到a,然后计算损失函数,进行梯度下降法求最优参数。
image_1cde2mrmk5jp1ms2ajnivkpk7m.png-16.8kB

推广到神经网络,每个圆圈节点都代表以上z,a两步计算(第一层用1表示,第而层用2表示)
image_1cde2sjvbmktm3hhfa7n11nf913.png-16.3kB
相当于如下计算过程:
image_1cde338901rguvfj1lfer12oh1g.png-38kB

同样使用反向传播可以计算出梯度,并寻找最优参数

2.神经网络表示

image_1cde3f3l94dk1mu32omva1bcp1t.png-34.3kB

以上神经网络,第一层是输入层,第二层是隐藏层,第三层是输出层。因此这是一个两层的神经网络(一般我们不算输入层)。

输入层:
用a[i]表示第i层的计算结果,也就是第i+1层的输入。因此输入层传递给隐藏层的数据,就是输入x本身,即a[0] = x

隐藏层:
第一个隐藏层的计算结果用a[1]表示,由于隐藏层中有4个节点(神经元),每个节点的计算结果可以用a1j表示:
image_1cde44cc31q4r1g91ghc1b091ejv4a.png-11.4kB
a[1]可以表示成:
image_1cde45i2m1phjpo3l4v1sl814f44n.png-8kB

输出层:
输出层表示为a[2],即为最终的输出y^

3.神经网络输出

神经网络到底最后会计算出什么鬼?

每个神经元的计算如下:
image_1cde4gtjf7881io25a6vve4gu54.png-33.7kB

隐藏层计算:
那么整个神经网络其实就是在重复以上过程的叠加。首先看隐藏层的四个节点,每个节点都先计算z,a:
image_1cde4nv6o1c1m1otm4os75e1r055h.png-78.7kB
将这四个等式用向量表示:
w用向量表示如下,由于前一层是3维,本层是4维,因此w矩阵的大小是(4,3)
image_1cde4ruml1jk1e9i11tg184ilju6u.png-19.3kB

image_1cde519os1hr91phffrsrksg3v7b.png-101.5kB
image_1cde523ob1q641qu21nui7s6r977o.png-23.7kB

简写之后如下:
image_1cde55l621il8icopogsdc7g92.png-60.4kB

输出层计算:
将上一层的输出作为本层的输入,其实就是逻辑回归的过程。
image_1cde57km81mapahqf5osle1qrn9f.png-10.1kB

4.多个样本向量化

上文是单个样本的向量化计算,下面推广到多个样本的向量计算,从而避免使用for循环。

对于一个样本

若有m个样本,则有m个输入x(i),m个输出y(i):
image_1cdfdme22dqdcdhuc1q421jg99.png-21kB
a[l](i)表示第l层的第i个样本。

若使用for循环遍历每个样本,则会有这般光景:
image_1cdfdui3bv2g11dn1pq21lcidm913.png-28kB

若使用向量化计算,则又是这般天地:
image_1cdff1oh9n3j14f810cco5q13sf6e.png-15.7kB

其中X如下:每一列为一个样本,每个样本有n维特征,矩阵大小为n*m,则:
image_1cdff29g41otb1ngo10r01s2p1mg6r.png-6.4kB

Z1如下,每一列荏苒是对应一个样本
image_1cdfe6r8d1bhk14bf1sv1q2k54u3a.png-12.4kB

A1如下,每一列仍然是对应一个样本,是每个样本的激活值,每一列的元素个数于改隐藏层的神经元个数一致:
image_1cdff7a43r4e1i391s7rp7s13kj8s.png-8.6kB

5.向量化实现的解释

解释向量计算的过程,假设有如下3个样本
image_1cdfek7emivur081c2n1ss717j54.png-28kB

则过程如下:
image_1cdfem85u1v2uuv9vvpus21rv61.png-75.6kB

W1表示第一个隐藏层的权重矩阵,有n行N1列,n是对应样本x的特征维度,N1代表第一个隐藏层的神经元个数
将W1与X相乘之后,会得到m*k大小的Z矩阵,每一列对应一个样本,每一列的元素个数对应神经元的个数

为何要一列为一个样本呢?
因为这样W于X两个矩阵相乘之后得到的z也是一列为一个样本,这样保证里X于Z的对齐。

6.激活函数

6.1 sigmoid函数

image_1cdfjmebvgh3gdv1klihkhu5i99.png-10.5kB
sigmoid函数在神经网络中一般不太用,一般用于二分类中,因为而分类需要得到0/1类,而sigmoid函数刚好是在[0,1]之间

6.2 tanh函数

image_1cdfjq5q71aq1v7i8v2v5i1468b6.png-11.5kB
tanh优于sigmoid函数,因为其均值为0,实现了数据中心化的效果。

若神经网络是用于二分类的, 则为了实现最后输出[0,1],可以在最后一层用sigmoid函数,前面用其他激活函数。可见,在同一个网络中不同层可根据不同需求使用不同的激活函数。

但无论是sigmoid函数还是tanh函数都有一个致命的缺点,当输入z无穷大时, a回无限接近于0/1或-1/1, 即其鞋履接近0,在梯度下降时回拖慢梯度下降的效率,因此实践中一般回使用更受欢迎的Relu函数

6.3 Relu函数

image_1cdfk406f1j2tkp2f6lu34qh2bj.png-9.5kB

当z<=0时, a=0。若经过这个激活函数出现了很多0,那也没事,可以自己给这些0赋其他值。若做二分类,则最后一层用sigmoid函数,其他层可以用Relu函数。

6.4 Leaky Relu函数

image_1cdfk99c7718g981tne11kujuic0.png-16.7kB
Leaky Relu解决了Relu多0的问题,但实际中用Relu更多。但无论是Leaky Relu还是Relu都比sigmoid函数要快很多,因为没有鞋履接近于0的情况。

6.5 为何需要使用非线性函数

若使用线性函数作为激活函数,则神经网络的计算如下:
image_1cdge0r351a8o14b4hfbt7p1cl8cd.png-40.5kB

可见经过线性激活函数,无论神经网络设多少层,都是在计算线性函数而已。
但线性函数也不是一无是处,比如在做线性回归时可以使用线性激活函数,再比如当腰预测一个实数时,可在神经网络的最后一层设置线性激活函数。

7.激活函数的导数

7.1 sigmoid的导数

函数:
image_1cdgekv3b10snnt5moqmrsk2ocq.png-4kB

导数:
image_1cdgem4a37vp5rbmm5as5agvd7.png-40.2kB

7.2 tanh的导数

函数:
image_1cdgenjv0hca1lmr13d9jtqh75dk.png-8.9kB

导数:
image_1cdgeoo7vecc5kl10er1d2fvgoe1.png-26.3kB

7.3 ReLU和Leaky RelU的导数

函数:
image_1cdgesmavu0713061rso1s221k5jee.png-17.5kB

导数:
ReLu导数:
image_1cdgeuajn2jrdps9laa1uia7fb.png-15.3kB

Leaky RelU导数:
image_1cdgev5g48q31dii4qt1sgu1254fo.png-9.1kB

8.神经网络的梯度下降法

以一个2层的神经网络来做示范计算梯度下降

首先,明确参数:
image_1cdgg0n3hmrt90l7c1dn15fug5.png-15.3kB

接着,明确成本函数:
image_1cdgg1pptsd6ls1pe11j5m1ub89.png-18.5kB

然后,可以进行梯度下降的迭代了,重复以下过程
(1)第一步,先前向计算出每个样本的预测值y^(1)…y^(m)
(2)根据成本函数,计算每个参数的导数:image_1cdggg8711of711d2f1g8b41gc6m.png-9.7kB
(3)根据学习率更新参数:
image_1cdggh7ri69eu5016tdks4qvq13.png-13.7kB

将以上过程用公式的形式表示:
(1)第一步,前向计算没个样本点预测值:
image_1cdggjqs41vk718591iohmffdkg1g.png-29kB

(2)反向传播:
image_1cdggl9i5ufdlg4bq31e3j1mo1t.png-86.9kB

9.直观理解反向传播

9.1 逻辑回归反向传播

回顾逻辑回归:
image_1cdggu0gi1dh11338f9p2oukha2a.png-24.3kB

逻辑回归的反向传播过程如下:
先计算a的导数da:
image_1cdggva8h6n5cjf38ofhf1n1p2n.png-15.6kB
再计算z的导数dz:
image_1cdgh12mcjup1bc5icb1irm2qt34.png-3kB
从而计算w与b的倒数:
image_1cdgh1uu0113sgqm1nek18gc9hf3h.png-5kB

9.2 神经网络反向传播

神经网络前向计算如下:
image_1cdgh4sun15h112lc1hpkf7b1r1l3u.png-44.3kB

同理的反向传播
先计算da2,然后一步一步往回退,求各参数的导数:
image_1cdgh9tjnpk51av3k1c1ahh1os94b.png-26.2kB

用向量来表示(大写字母表示vector):
image_1cdghc1su1anb1ikd3091mcn4kv4o.png-59.6kB

10.随机初始化

权重的初始化也很重要,影响模型接下去的效果。

假如权重初始化得太小,比如都接近于0:
image_1cdghnegk1tif1e2515ennojuuh55.png-7.9kB
则同一层中的神经元的值都会相等,从而反向传播计算的梯度也会相等。
image_1cdghqsgj19cn1f1h1do915gh16gn5i.png-7.1kB
但其实我们更希望每个神经元能学习不同的特征,有不同的值。

但权重也不能太大,若w大,则z大,则经过sigmoid或者tanh之后,都接近于1/0或1/-1,再反向传播时会出现导数为0.但若不适用sigmoid或者tanh,则w大一点也无所谓的。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页