课时8 反向传播与神经网络初步(上)
反向传播在运算连路中,这是一种通过链式法则来进行递推的计算过程,这个链路中的每一个中间变量都会对最终的损失函数产生影响。
链式法则通常包含两部分,局部梯度和后一层的梯度相乘
前向和反向花费的时间是基本一样的。
大的函数也可以直接视作一个整体计算梯度
当局部梯度非常容易求得时,你可以把这部分表达式看作一整个S门
加法:梯度分配器;所以无论何时当你有一个加法运算时,他会分配相等的梯度值。
最大值门:一个梯度路由,他的工作方式是,认为比较大的输入梯度为1,比较小的梯度为0,直观的理解就是比较小的输入对输出没有影响。所以最受你只会得到比较大输入值的梯度,这就是最大值门是梯度路由的原因。
乘法:梯度转换器
向前传播/向后传播:主要思想就是遍历网络中所有的运算门,并按照正确的逻辑顺序进行排列。这意味着所有的输入值在运算之前要知道这些标注信息
事实上一个网络对象就是对这些门进行简单封装,以后也会发现门也被称作层。
在前向传播中,我们按照要求计算结果;在反向传播中,我们最终要求得的是整个损失函数关于各个变量的梯度。
一般来说在反向传播和构建这些时都需要那些数值,所以当你真正学习这个网络,每一个门都需要记住输入值和其他出现过得中间微分值。所以一定记住要在前向传播时候记住这些值,因为在反向传播中可能会用到某些变量。如果你不进行反向传播,你可以删除很多东西。
Torch实际上是一系列层的巨大集合,也就是运算门的集合。深度学习网络框架实际上是包含一系列层并且记录所有层之间联系的计算图
我们将张量看做一个n维数组,我们用常数将其标量化
课时9 反向传播与神经网络初步(下)
在反向传播中,使用链式求导法则计算梯度是最关键的。
对于每次更新,我们都要进行一次完整的前馈和反馈。当你想要进行更新,你需要梯度,所以你需要前馈你的样本。然后马上进行反向求导,如此你得到梯度。然后根据求得的梯度进行权值微调,来完成权值更新。可以这么说,通过前馈得到损失,通过反馈得到梯度,通过对梯度的使用来完成权值更新。这就是神经网络的训练过程中,内部变化前馈、反馈、更新、前馈、反馈、更新。。。
我们不需要求出完整的雅各比矩阵。每个输入影响每个输出。
神经网络相当庞大,我们只能用这样的结构来计算,记录中间值,对每个节点,应用前馈反馈API,构成图结构,图结构是对所有层以及层与层之间连接的包装。层与层之间的连接是通过向量的传递完成的
神经网络
(NOW)这个式子所代表的操作大概就是给出一个x,用W1矩阵乘以x,接下来经过一个激活方程,然后我们再做一个矩阵乘法,就得到了评分。
激活函数得到的是一个比率值
每一个单个的神经元都可以看做是一个小线性分类器,只是这些神经元都是彼此相连的,他们可以在一起工作
激活函数
输入层并不算层数内,因为这层的神经元只有输入值(没有权),没有计算。
全连接层,每一个神经元都连着下一层的所有神经元。
分层可以使计算更加高效,与其设置大量的没有明确组织结构的神经元,并让这些神经元独立计算,我们更倾向于把这些神经元安排到一个个层中使得我们可以进行向量化的运算。
神经网络就是利用隐藏层把输入值转换成可以使用线性分类器分类的形式,然后再用后面的层作为线性分类器进行数据分类
神经网络里面确实是神经元越多越好,因为在机器学习中经常出现模型表达能力不足的问题,所以你加入更多的神经元总是会让他工作的更好,但是在那之后你也需要加入正则化。要注意正确的防止神经网络过拟合的方法,并不是减少神经元,使得神经网络变小,而是加入合适的正则化系数。
当用mini-batch做优化时,L-BFGS还是一个不错的东西
神经网络究竟是越宽越好还是越深越好并没有一个标准的答案。
一般来说,如果是图片问题的话,层数会更重要一些。但是如果你要处理的只是一个简单的数据,网络的深度就没有多大作用。
不同层使用不同的激活函数一般是做不到的,大部分情况下,我们都是选择一种激活函数,然后整个神经网络都用这一个