【Neural Networks and Deep Learning2019吴恩达最新Coursera课程学习】——第三周—Shallow neural networks

Shallow Neural Networks

1. Neural Networks Overview——2019-06-17

Step1:z = 值*权重+偏差
Step2:a = 激活(z)
Step3:重复上面两个步骤

神经网络基本就是上面的这个过程。

2. Neural Network Representation——2019-06-30

神经网络的简单结构包括三个:

  • 输入层、
  • 隐藏层(意思是训练过程中只看得到其他两个层的结果,但是隐藏层中的东西我们是不知道的,就像个黑盒子。这就是被叫做玄学的原因吧!)
  • 输出层(输出层就负责构建最后的预测值,是个实数!)。
    在这里插入图片描述
    注意注意,在在论文或者其他一些介绍性的东西里,输入层是不算在正式层里面的,所以上面的这个图是个两层网络(隐藏和输出)
    上标表示的就是所在的层,这里下标指的是某一层中的第i个元素。
    注意注意 , 隐藏层的参数就是响应的w和b,上面四个单元,那么W的转置的大小就是43的矩阵(隐藏层四个单元,输入层三个单元),b的话就是一个41的向量了!这里对这些矩阵的维度的了解是至关重要的!
    注意注意,输出层的值的参数也是w和b,w的大小就是1*4(因为,输出一个单元,影藏层4个单元),b的话就是1个单元的向量!

3. Computing a Neural Network’s Output

  • 要点:单个训练示例的矢量化
  • 神经网络计算自己输出的细节其实:就是将逻辑回归进行多次的重复而已!

对于一层的神经网络,他做的事情就是下面这样的圆圈里的事情,一共有两步:
第一步,就行正常的线性操作;
第二部,过一个激活函数;
在这里插入图片描述
表示的话还是要弄明白相应的符号,如果符号都不懂,那就没什么意思了,
比如隐藏层的第一个单元(这里隐藏层是第一层)以及第二个单元的计算过程,每个都是上面说的两步!
注意两个单元的上下标:在这里插入图片描述
然后将这样的操作重新整理一下:
就可以很清晰直观的从下面的看出来:
在这里插入图片描述
重要的就是下面这些矩阵的块的拼接还有转置的过程,对于一个隐藏层中的神经元,对应了三个输入,所以对应了三个权重,这个小的权重就是3X1的,然后因为隐藏层中一共有四个神经元,所以就把四个小的权重拼接起来构建大大权重矩阵,这样就能实现向量化了,所以计算量就能降低,但是直接拼接的话就成了12X 1的大矩阵了,这样维度就对不上了,因为后面的输入x是3X1的,
所以将每个小权重先转置,3X1就变成了1X3,然后一共有四个,堆叠起来就成了4X3的了,这样维度就是ok的!
同样的,对得到的输出Z也进行堆叠,对输出Z经过激活A也进行堆叠,这样表现形式就一下子简单多了!

a[0]就是上面的输入x的别名,然后有了隐藏层的之后继续进行下一层的表达,最终的输出就是一个实数!第二程就是和逻辑回归就一毛一样了!只不过这里的权重和偏差都带上了上下标而已,
剩下的拓展一下就是不断的对上面的步骤进行扩充和堆叠,就是我们现在用的神经网络了!

4. Vectorizing across multiple examples——2019-07-01

  • 要点:就是多个训练示例的矢量化
    如果在没有矢量化多个训练示例的时候就需要用for循环来进行,如下图的左边,不断的重复这四个式子
    在这里插入图片描述

向量化后的好处:
在这里插入图片描述
就像图例给的一样,,横着扫描那就等于扫描了整个数据集,每一列代表一个单独的样例;
竖着扫描就是每个样例的第多少个节点,从大到小,这样就可以扫描整个数据集中每个样例中的每个节点!
简单来说:

  • 横着:样例
  • 竖着:隐藏单元

5. Explanation for Vectorized Implementation——2019-07-01

非常好的一张运算关系图,三个不同的训练样例经过神经网络的过程,对应的其实也只是上面那张图的第一个式子,后面还有激活以及下一层的计算,但是这个理解清楚了之后后面的也就都明白了!
在这里插入图片描述

一个神经网络上不同的层其实都在赶着差不读的事情,
在这里插入图片描述
比如上面这个图,右下方这一组的第一行Z的输入是X,其实也是A(0),这样来看的话就非常的对称和统一了,这个式子基本都没有什么独特之处了,整个神经网络就是大量的这么多的步骤的重复而已,所以说深度学习有什么难的,并没有!更深的神经网络本质上也只是在重复这两个步骤,仅仅比这里提到的这些进行了更多的次数而已!

6. Activation functions——2019-07-02

  • 激活函数这里应该再重新总结一下的!
    讲了一些激活函数,这里非常有必要自己整理一下:
    (1)Sigmoid:
    几乎是不建议使用的,或者干脆就不用这个,除非是在输出层上并且要解决的是二分类的问题。而且tanh函数要比这个好很多,见下面
    在这里插入图片描述
    (2)tanh
    在这里插入图片描述
    (3)ReLU:
    默认的最常见的就是这个线性整流单元了,长这个样子,函数的输出值都是大于零的,比如房价的预测,因为房价不可能是负的!
    在这里插入图片描述
    总之就是二分类的话就可以用sigmoid但是其他情况选首推RELU函数!
    (4)有时候还可以使用Leaky ReLU这样子的,
    在这里插入图片描述
    实在不知道哪种激活函数好的时候那就尝试,都试一试,看看什么样的好!

7. Why do you need non-linear activation functions?——2019-07-02

  • 非常重要的一个问题,为什么神经网络需要使用非线性激活函数?
    如果没有非线性的激活函数,那么神经网路的输出就没啥意义了,欧诺个愿都是输入函数的线性变化,比如下面的图中展示的一样,
    在这里插入图片描述
  • 尤其是当你神经网络的深度增加了之后的话,那就还是反反复复仅仅计算线性激活函数了!那就还不如干脆不要隐藏层得了,没啥意思了!
  • 线性的隐藏层没有任何用处的!两个线性函数的组合,依然还是我线性函数!
  • 所以一定要在神经网络中引入非线性激活函数,否则无论你的网络有多么深,那么你的网络还是永远无法实现一些有趣的事情和功能!
  • 只有一个地方会使用线性激活函数:使用机器学习解决回归问题的时候回归问题的时候回归问题的时候,但是隐藏层中的激活函数还是要用非线性的!
  • 所以使用非线性的激活函数,对神经网络至关重要!

8. Derivatives of activation functions——2019-07-02

为了能够得到反向传播,激活函数也是需要能够求导的!

  1. 首先还是Sigmoid的,如下图:
    在这里插入图片描述

  2. tanh函数的
    在这里插入图片描述

  3. ReLU and Leaky ReLU
    在这里插入图片描述
    这里需要注意的就是如果遇到了不连续的比如搭档自变量等于0的时候,函数并不是可导的,那就在代码里自己定义0的时候激活函数的倒数值,这样就解决问题啦!

9. Gradient descent for Neural Networks——2019-07-02

总结的话就是这一张图,但是反向传播我不太明白!
在这里插入图片描述

10.Backpropagation intuition (optional)——2019-07-02

这里比较重要,但是视频里也说了,如果能看懂基本上也就差不多了,如果想推导出来的话,那你的付出基本上放在实现算法上的话已经足够让你的工作能够work了!贴自己的笔记如下:
在这里插入图片描述

11. Random Initialization——2019-07-02

  • 逻辑回归的问题中,把权重参数初始化为零时可行的,
  • 但是在NN中把权重参数初始化为零,然后使用梯度下降的话就不行了,无法得到预期的效果就!

因为都初始化为零的话,每经过一次迭代,就会得到两个一毛一样的的隐藏单元,实现的功能也是一样的,可以说是对称的
在这里插入图片描述
所以无论你训练多少次,这个隐藏层的神经单元永远都是肩负的同样的功能进行运算,所以并不能为我们带来什么帮助,所以两个就和一个一样,更进一步来看,当输入变量更多,隐藏层的单元更多的时候,也是一样道理就和一个隐藏单元的作用一样,就没有意义了!
所以啊,
就需要进行:

  • 随机初始化
  • 在这里插入图片描述
  • b的话就不存在对称问题。
  • 对参数乘以0.01就是希望我们的参数不要太大了,因为太大的话,得到的Z就会很大,这样在经过sigmoid这样的激活函数的时候得到的更新的时候就非常的缓慢,
    所以 当w非常大的时候 z(的绝对值)也相应的会非常大<br />或者说z可能是一个非常大的数或是一个非常小的数 在这样的情况下 你可能最终会发现图上 tanh和sigmoid函数中 这些相对平坦的部分<br />梯度的斜率非常小 这意味着梯度下降会非常缓慢 所以整个学习过程也会变得尤为缓慢

概括一下 如果w过大 你很容易在开始时就 得出一个非常大的z 而这会导致你的tanh和sigmoid激活函数学习进度缓慢 无法实现预期功能 如果在你的神经网络中未使用 任何sigmoid或者tanh激活函数 这种情况可能不明显 但是如果你使用二分类 并且你的输出神经元 使用了sigmoid函数 那么你不会希望初始参数过大 所以这就是为什么我们说在上述公式中需要乘以0.01 或者其他比较小的数值 对权重参数矩阵w2来说也适用 我们可以表示成 w[2]=np.random.randn((1,2))*0.01 噢上面应该是zeros

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值