深度学习从入门到实战——前馈神经网络

这里写目录标题

  • 前馈神经网络
    • 连接主义
      • 感知器、多层感知器
      • BP算法
      • 前馈神经网
      • 梯度下降法
      • 多层感知机
      • BP 算法
        • BP算法的基本过程
      • 梯度爆炸和梯度弥散

前馈神经网络

连接主义

感知器、多层感知器

BP算法

前馈神经网

神经网络是最早作为一种连接主义为主的模型。

神经元(M-P)
1943 年,美国神经生理学家沃伦·麦卡洛克( Warren McCulloch ) 和数学家沃尔特 ·皮茨(Walter Pitts )对生物神经元进行建模,首次提出了一种形式神经元模型,并命名为McCulloch-Pitts模型,即后 来广为人知的M-P模型。

MLP,全连接神经网络,单个神经元又称感知机。
深度学习从入门到实战——前馈神经网络_第1张图片
在M-P模型中,神经元接受其他n个神经元的输入信号(0或1),这些输入信号经过权重加权并求和,将求和结果与阈值(threshold) θ 比较,然后经过激活函数处理,得到神经元的输出。
在这里插入图片描述
M-P 模型可以表示多种逻辑运算,如取反运算、逻辑或、逻辑与。

深度学习从入门到实战——前馈神经网络_第2张图片
人工神经网络由神经元模型构成,这种由许多神经元组成的信息处理网络具有并行分布结构。
深度学习从入门到实战——前馈神经网络_第3张图片
其中圆形节点表示一个神经元,方形节点表示一组神经元。
1958 年,罗森布拉特( Roseblatt )提出了感知器,与 M-P 模型需 要人为确定参数不同,感知器能够通过训练自动确定参数。训练方式为有监督学习,即需要设定训练样本和期望输出,然后调整实际输出和期望输出之差的方式(误差修正学习)。
在这里插入图片描述
其中,\alphaα 是学习率,rr 和 yy 分别是期望输出和实际输出。

感知器权重调整的基本思路:

  • 实际输出 y 与期望输出 r 相等时,w 和 θ 不变
  • 实际输出 y 与期望输出 r 不相等时,调整 w 和 θ 的值
  • 在这里插入图片描述
    深度学习从入门到实战——前馈神经网络_第4张图片
    深度学习从入门到实战——前馈神经网络_第5张图片
import torch
from torch import optim


xs = torch.arange(0.01,1,0.01)
ys = 3*xs+4+torch.randn(99)/100

class Line(torch.nn.Module):

    def __init__(self):
        super().__init__()

        self.w = torch.nn.Parameter(torch.randn(1))
        self.b = torch.nn.Parameter(torch.randn(1))

    def forward(self,x):
        return self.w*x+self.b

if __name__ == '__main__':

    
    line = Line()

    opt = optim.SGD(line.parameters(),lr=0.1,momentum=0.01)
   # opt = optim.Adam(line.parameters(),lr=0.00001)

    for epoch in range(10):

        for _x,_y in zip(xs,ys):


            z = line(_x)

            loss = (z-_y)**2

            opt.zero_grad()
            loss.backward()
            opt.step()
            print(loss)
            
    print(line.w)
    print(line.b)
            

梯度下降法

# import random
# import matplotlib.pyplot as plt
#
# _x = [i/100. for i in range(100)]
# _y = [3*e+4+random.random()/10 for e in _x]
# print(_x)
# print(_y)
#
# # BP
# w = random.random()
# b = random.random()
#
# for i in range(30):
#     for x,y in zip(_x,_y):
#         z = w * x + b
#         o = z - y
#         loss = o ** 2
#
#         dw = -2*o*x
#         db = -2*o
#
#         w = w + 0.1*dw
#         b = b + 0.1*db
#         # print(dw,db)
#         print(w,b,loss)
#
# plt.plot(_x,_y,".")
#
# v = [w*e+b for e in _x]
# plt.plot(_x,v)
# plt.show()

import random

if __name__ == '__main__':
    x = [ i/100. for i in range(100)]
    y = [3*i+4+random.random()/100. for i in x]
    w = random.random()
    b = random.random()
    for _ in range(5000):
        for _x,_y in zip(x,y):
            y_pre  = _x*w+b
            o = y_pre-_y
            loss = o**2
            dw = -2*o*_x
            db = -2*o
            w = w+0.1*dw
            b = b+0.1*db

    print(w,b,loss)

多层感知机

单层感知器只能解决线性可分问题,而不能解决线性不可分问题;为了解决线性不可分问题,我们需要使用多层感知器。
深度学习从入门到实战——前馈神经网络_第6张图片
多层感知器指的是由多层结构的感知器递阶组成的输入值向前传播的网络,也被称为前馈网络或正向传播网络。

以三层结构的多层感知器为例,它由输入层、中间层及输出层组成

与M-P模型相同,中间层的感知器通过权重与输入层的各单元相连接,通过阈值函数计算中间层各单元的输出值
中间层与输出层之间同样是通过权重相连接

深度学习从入门到实战——前馈神经网络_第7张图片

BP 算法

多层感知器的训练使用误差反向传播算法(Error Back Propagation),即BP算法。BP算法最早有沃博斯于1974年提出,鲁梅尔哈特等人进一步发展了该理论。

BP算法的基本过程

  1. 前向传播计算:由输入层经过隐含层向输出层的计算网络输出
  2. 误差反向逐层传递:网络的期望输出与实际输出之差的误差信号由输出层经过隐含层逐层向输入层传递
  3. 由“前向传播计算”与“误差反向逐层传递”的反复进行的网络训练 过程
  4. BP算法就是通过比较实际输出和期望输出得到误差信号,把误差信 号从输出层逐层向前传播得到各层的误差信号,再通过调整各层的连接权重以减小误差。权重的调整主要使用梯度下降法:
  5. 在这里插入图片描述
    通过误差反向传播算法调整多层感知器的连接权重时,一个瓶颈问题就是激活函数:

M-P 模型中使用阶跃函数作为激活函数,只能输出 0或 1,不连续所以 不可导
为了使误差能够传播,鲁梅尔哈特等人提出使用可导函数Sigmoid作为激活函数

深度学习从入门到实战——前馈神经网络_第8张图片
在这里插入图片描述

深度学习从入门到实战——前馈神经网络_第9张图片
可以看出,在0,1附近,接近饱和,容易发生梯度弥散或者梯度爆炸。在中间的梯度最为合适。
其他常见的激活函数:ReLU (Rectified Linear Unit,修正线性单元)和tanh等
深度学习从入门到实战——前馈神经网络_第10张图片

  • Relu 可以稳定的提供梯度,但是非线性能力不如sidmoid、tanh.

梯度爆炸和梯度弥散

  • 网络深度够大、根据链式求导法则,网络进行反向传播时、如果某层的参数w过小或者过大,梯度求倒时,求导参数往往为参数的乘积,这样就会导致出现的参数梯度越来越大或者越来越小。
  • 采用了饱和性激活函数

参考:
链接: dataWhale.

你可能感兴趣的:(深度学习,深度学习理论,cnn,图像识别,目标检测)