02多层神经网络的原理 神经网络自动求导原理

1、如何拟合更复杂的函数 - nonlinear function(通过基本的函数我们可以拟合非常复杂的函数)

2、激活函数 - activation function

3、神经网络 - Nueral Network

4、深度学习 - Deep Learning

5、反向传播 - Back propogation

6、如何实现自动的反向传播

7、拓扑排序-Topological Sorting

8、自动计算梯度(偏导)Auto-Compute Grandient

 

0:深度神经网络机器学习∈神经网络∈机器学习

机器学习:给机器数据,让机器自己去学习,去拟合;

神经网络:通过线性与非线性函数对现实生活中的情况进行拟合;

深度学习:层数超过三层的叫做深度神经网络机器学习,简称深度学习;

90年代,深度网络不能超过三层的根本原因是数据量不够(将一组线性和非线性变换称为一层)

因此,要有高精度,就得有足够的数据量;参数多一个,所需的数据就要过一个数量级;数据量决定这个东西能不能用,数据越多,精度越准确,才越能运用。

 

1:sigmoid函数

除了线性函数关系(kx+b)还有一个常见的函数关系是“s”型的一种函数(非线性函数)

\operatorname{sigmoid}(x)=\sigma(x)=\frac{1}{1+e^{(-x)}}

 

2:激活函数(用于非线性变换的函数)

线性函数对信号进行加强;

非线性函数实现功能;

线性函数+非线性函数能够构成所有想得到的复杂函数;=>线性+非线性的组合构成神经网络(神经网络:通过线性与非线性函数对现实生活中的情况进行拟合)

激活函数作用:让我的函数拟合非线性关系,如果没有非线性函数永远只能拟合线性关系,现实生活中绝大多数情况下都是非线性关系。

 

3:为了更新参数k1,b1,k2,b2,求偏导

k1 = k1 + (-1) * loss对k1的偏导

b1 = b1 + (-1) * loss对b1的偏导

k2 = k2 + (-1) * loss对k2的偏导

b2 = b2 + (-1) * loss对b2的偏导

以下公式推导证明各参数的偏导是可求的

 

4:如何构建一个程序,求各参数的偏导

利用计算机的“图”算法!!!

①构建计算机图

computing_graph = {

'k1' : [ ' linear_01' ],

'b1' : [ ' linear_01' ],

'x' : [ ' linear_01' ],

'L1' : [ ' sigmoid' ],

'sigmoid' : [ ' linear_02' ],

'b2' : [ ' linear_02' ],

'k2' : [ ' linear_02' ],

'L2' : [ 'loss' ],

'y' : [ ' loss' ],

}

②在图中,根据已知接点找到输出节点

def get_output ( graph , node ) :

       outputs = []

       for n , links in graph.items():

             if node == n:

             outputs += links

       return outputs

get_output (computing_grapth, 'k1') #输出的为 [' linear_01']

③如何求得K1的偏导

  • 获得k1的输出节点
  • 获得k1输出节点的输出节点
  • 直到我们获得最后的一个节点

computing_order = []

target ='k1'

out = get_output(computing_graph, target)[0]

computing_order.append(target)

 

while out: #当还有输出时

       computing_order.append(out)#把out放入computing_order中

       out = get_output(computing_graph,out)#下一个节点的下一个节点

       if out: out = out[0]

 

//computing_order # ['k1', 'linear_01', 'sigmoid', 'linear_02', 'Loss']

 

order = []

for index, n in enumerate( computing_order[: -1] ):    #用index和n两个变量分别遍历整个computing_order

      order.append(( computing_order[index+1] , n ))   #将index和n遍历的数据放入order中

return ‘*’.join([ '\partial{} / \partial{}'.format(a,b) for a, b in order[:: -1] ])   #order[:: -1]逆向排序

\frac{\partial \text { loss }}{\partial \text { linear2 }} \cdot \frac{\partial \text { linear } 2}{\partial \sigma} \cdot \frac{\partial \sigma}{\partial \text { linear1 }} \cdot \frac{\partial \text { linear2 }}{\partial k_{1}}

 

5:拓扑排序(第二节课2:28:30)
① 选择一个没有输入的节点,如果有多个没有输入的接点就任选一个;

② 在图中删去第一步选择的节点,把选择的节点作为我们的访问顺序节点;

③ 检查图是否为空,如果不为空,跳到①

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值