子豪兄YYDS
https://www.bilibili.com/video/BV1K7411W7So?p=4

一、激活函数

在没有激活函数的情况下,所有的分类器只能是线性的,也就是在分类空间中找一条直线进行分类,但是并不是所有问题都是线性可分问题,遇上非线性的问题,就需要引入激活函数,让分类器能够完成非线性的分类问题。

激活函数有很多种,根据其特点,应用也存在差异。
①sigmoid函数
使用sigmoid函数作为激活函数,输入的值是输入加权求和后加偏置项,很大则输出1小则输出0,其余情况下在中间波动。利用这个函数还可以将任何数据压缩到0-1的范围内。



②tanh函数
tanh为双曲正切函数,其英文读作Hyperbolic Tangent。tanh和 sigmoid 相似,都属于饱和激活函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。


Sigmoid和tanh都存在饱和问题,即输入大到一定程度或者小到一定程度的时候就会趋向于一个固定值。对于sigmoid函数,当输入趋向于很大的正值时,它们饱和到一个高值,输入趋向于一个很小的负值时,它们饱和到一个低值,仅当输入接近0时才会对输入敏感。这种饱和性会让基于梯度的学习变得十分困难。当必须要使用sigmoid激活函数的时候,双曲正切函数的效果会比sigmoid函数更好。

③ReLU函数
ReLU函数是激活函数的一种,花书里面翻译为了整流线性单元,选择0和输入值里面更大的那个输出出来,也叫做修正线性激活函数。对于ReLU函数,在x>0的情况下导数常为1,这样在链式求导中就不会出现梯度消失的问题。
在x<0的情况下,输出值为0,就是一个去噪音的过程。但是ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于dead状态,所以使用ReLU的网络,学习率不能设置太大。
但是函数在0处由于左右导数不相等,所以在这一点不可微,这使得这个激活函数对基于梯度的学习算法不生效,也就是说不能通过基于梯度的方法学习那些使它们激活为零的样本。

RELU在小于0的情况下梯度为0,为了让小于0的时候也有梯度,所以引入了后面的修正的ReLU,比如下图中的Leaky ReLU激活函数,通过给激活函数在负数的部分一个很小的负数梯度值来修正ReLU。

图中的Maxout激活函数是对ReLU的进一步扩展,这个激活函数将输入分组,取最大的输入作为输出,这个激活函数可以学习具有多段的分段线性的激活函数,段数足够多就以任意的精确度来近似任何激活函数。使用这个激活函数需要一些冗余的参数去帮助激活函数防止灾难遗忘,这个灾难遗忘指的是神经网络忘记了如何执行它们过去的任务。

二、神经网络结构

引入激活函数之后,网络的结构变得嵌套了起来,线性分类器只能是一个权重矩阵乘以向量x得到一个输出向量,而引入了隐含层之后,上一层的输出变成了下一层的输入,相当于在上一层的向量上经过激活函数再次与第二层的权值相乘,这样可以一直向下延续下去,从而将实现非线性分类问题的处理,也可以看成第一层把数据变成了线性可分的,而第二层就是一个线性分类器,或者说第一层的线性分类器通过非线性的激活函数处理变成了非线性的分类器。

如果不采用激活函数,那么不管加多少层,都是线性的组合,可以用同一层一样,所以一定需要激活函数来做这个非线性的处理。

层数的增加,就可以挖掘出更多隐含的信息,各种非线性的信息才会被发掘出来。

第一层也就是输入层有3072个数,第二层有100个神经元,每个神经元都和第一层的3072个数据全连接,经过加权求和后变成一个数,经过激活函数后第二层的100个输出作为第三层的输入,加权求和后作为第三层十个神经元的输入送入激活函数,最后得到十个结果。

三、反向传播

引入多层的神经元之后,对每个变量的求导就需要借助链式求导法则,一点点向前面根据运算关系倒着求回去。本质还是梯度下降法,但是随着神经网络层数的增加,变量的数目也变多,而且存在许多的嵌套,所以就用链式求导法则去一个个求更新的梯度。

这里我手写了一个简单的网络结构和更新的过程:

对于这个网络,输入输出展开写可以得到:

相当于输出是一个有十二个自变量的函数,对每个变量求偏导,就变成了利用层与层之间的关系进行链式求导的过程:

本质上仍然是上一节线性分类器的内容,但是由于网络层数的加深,变量关系更加复杂,所以求偏导变得麻烦一些。


根据输入与输出的类型,可以将神经网络分为三类:输入标量输出标量、输入向量输出标量、输入向量输出向量。
输入标量输出也是标量,相当于一个一元函数,给一个自变量输出一个因变量,此时梯度结果就是一个实数,可以直接求导。输入向量输出标量,相当于图像的二分类,这时候求梯度就是对每个权重求偏导数。输入输出都是向量,比如说图像的多分类,这时候求梯度就需要求输出的类别对每个权重的偏导数,这个时候就引入了雅可比矩阵,用于记录输出的每个类对每个输入的偏导数。

关于雅可比矩阵,这里补充一下。雅可比矩阵是导数构成的矩阵,而导数是线性空间之间的线性变换,所以扩展到矩阵上来,雅可比矩阵描述的就是一个微分到另一个微分的映射关系。

从这个角度看,雅可比矩阵描述了一个坐标下的微小变化在另一个坐标系中会变成什么样子。

雅可比矩阵本身可以看作是导数到高维空间的一个推广,对于一般二维空间的导数,一种解释是方便进行一个近似操作,在自变量足够小的时候,可以用切线的变化量来代替真实函数的变化量,这也称为可微。推广到高维环境下,函数变为自变量和因变量都是向量的函数,这种情况下依然使用前面的思路,根据导数的概念仿照着写出这种情况的导数:

整理之后可以看出,矩阵A实际上就对应着二维情况下的导数,只不过这个时候A是个矩阵,我们可以叫他导矩阵。实际上这个矩阵内部确实是导数组成的。

这个矩阵就称为雅可比矩阵或者导数矩阵,利用这个矩阵,就可以写出下面的式子:

这个式子指出仿射变换的改变量是自变量的改变量的线性函数,直白的说,当我们将非线性函数给予线性转换时,Jacobian矩阵就是描述该线性关系的矩阵。

从雅可比矩阵的形式也可以看出,雅可比矩阵内部是由偏导数组成的,其中y相当于最终分类结果的各个参量,而x表示网络中的各个参数,利用雅可比矩阵的形式,可以方便地计算输入输出都是向量的网络。比如在多分类问题中,最终的分类结果是一个多维的向量,而向量中的每个参量都需要参与前面参数的调优,这就需要大量的偏导数运算,采用矩阵形式可以计算更加简单,所以使用雅可比矩阵来简化流程。

在实际应用中,如果损失函数是一个向量函数,那么其输入输出就都是向量,在反向传播求偏导的时候,就会出现多个变量求导的情况,一般函数都是利用线性求导法则求导然后相乘,在向量函数的情况下就变成了很多个雅可比矩阵的相乘。所以说是一种链式法则的延伸。

四、一个简单的神经网络代码

import numpy as np
from numpy.random import randn
# 导入numpy模块N, D_in, H, D_out = 64, 1000, 100, 10
# 初始化网络的参数 四个参数分别为:数据集的个数、输入层的神经元个数、隐含层的神经元个数、输出层的神经元个数(种类数目)
x, y = randn(N, D_in), randn(N, D_out)
# 初始化数据集
w1, w2 = randn(D_in, H), randn(H, D_out)
# 随机初始化权重for t in range(2000):# 迭代2000次 反向传播h = 1/(1+np.exp(-x.dot(w1)))# 隐含层的输出y_pred = h.dot(w2)# 输出层的输出loss = np.square(y_pred - y).sum()# 计算损失函数print(t, loss)grad_y_pred = 2.0 * (y_pred - y)# 计算输出层的偏导数grad_w2 = h.T.dot(grad_y_pred)# 计算隐含层的偏导数grad_h = grad_y_pred.dot(w2.T)grad_w1 = x.T.dot(grad_h * h *(1 - h))w1 -= 1e-4 * grad_w1w2 -= 1e-4 * grad_w2

P4:神经网络与反向传播相关推荐

  1. 神经网络的反向传播(BP)是什么?sigmoid函数的导数是什么,有什么形式优势、优缺点?

    神经网络的反向传播(BP)是什么?sigmoid函数的导数是什么,有什么形式优势? 目录

  2. 反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...

    神经网络的反向传播是什么 神经网络的反向传播,实际上就是逐层计算梯度下降所需要的$w$向量的"变化量"(代价函数$J(w1,b1,w2,b2,w3,b3...wn,bn)$对于$w ...

  3. ​通俗理解神经网络BP反向传播算法

    转载自  ​通俗理解神经网络BP反向传播算法 通俗理解神经网络BP反向传播算法 在学习深度学习相关知识,无疑都是从神经网络开始入手,在神经网络对参数的学习算法bp算法,接触了很多次,每一次查找资料学习 ...

  4. 仅使用numpy从头开始实现神经网络,包括反向传播公式推导过程

    仅使用numpy从头开始实现神经网络,包括反向传播公式推导过程: https://www.ctolib.com/yizt-numpy_neural_network.html

  5. 零基础入门深度学习(3) - 神经网络和反向传播算法

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  6. 机器学习笔记丨神经网络的反向传播原理及过程(图文并茂+浅显易懂)

    文章目录 一.前言 二.神经网络的前向传播原理 1. 单个神经元的计算 2. 神经元在神经网络中的计算 三.反向传播算法内容(请静下心,一步一步的看) Step1 计算误差 Step2 更新权重 四. ...

  7. 神经网络之反向传播算法(均方根反向传播算法RMSProp)

    文章目录 均方根反向传播算法(RMSProp) 1.算法原理 2.算法实现 2.1 训练过程 2.2 测试过程及结果 3.参考源码及数据集 均方根反向传播算法(RMSProp) 自适应梯度算法(Ada ...

  8. 深度学习与自然语言处理教程(3) - 神经网络与反向传播(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  9. 深度学习与计算机视觉教程(4) | 神经网络与反向传播(CV通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/37 本文地址:https://www.showmeai.tech/article-d ...

最新文章

  1. 国家集训队2009 书堆
  2. 来自语音从业者的一封批评信
  3. 模型web迁移延时太长,机器学习神器Cortex 能一键解决吗?
  4. 看不见的攻击面:查看 SQLite 数据库就中招?
  5. python使用redis_Python操作redis系列之 列表(list) (五)
  6. MySQL事物的概念
  7. dev c++代码自动补全_让代码自动补全的全套流程
  8. python函数可以提高运行效率吗_python 多进程如何提高函数效率?
  9. 总结 | 深度学习PyTorch神经网络箱使用
  10. 理解有参构造器和无参构造器的作用
  11. 右手螺旋判断磁感应强度方向_弹簧左旋or右旋在功能和应用上有什么区别,如何判断左旋还是右旋...
  12. Office 2019快速安装
  13. 实现一个计算体脂率的程序
  14. html5微场景制作,聊聊我用过的H5微场景制作工具
  15. 服务机器人分类和发展趋势分析
  16. 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
  17. 音视频基础 、IPB帧及其特点
  18. chrome去广告插件 去掉百度热搜
  19. 笔试一道honor的嵌入式软件程序编写题目【c语言字符串】
  20. 苹果承认iOS源代码泄露,对iOS 11.2.5的有没有影响

热门文章

  1. 文本不换行,显示省略号
  2. C++静态库与动态库(转)
  3. 测试转开发,一个女孩子短短的工作心得
  4. android activity 跳转与值
  5. ibatis基础(五):删除指定id的单个对象
  6. 2019杭电多校第一场 Operation HDU - 6579
  7. Eos的Wasm智能合约的局限性
  8. javascript之Bom简介
  9. angular 定时函数
  10. 数据库优化之mysql【转】