深度学习笔记11-神经网络

1.从逻辑回归到神经网络

逻辑回归用于解决二分类问题,softmax回归用于解决多分类问题,它们都是线性分类器。模型的决策边界都是直线。而神经网络既可以解决分类问题,也可以解决回归问题,不同的问题会选用不同的损失函数 。

在使用神经网络解决分类问题时,可以通过调整输出层神经元的数量来适应二分类或多分类任务,实际上三种模型并没有本质区别,逻辑回归和softmax回归完全可以看作是神经网络的简化版本

三种模型的结构设计

逻辑回归的输出只有1个计算单元,softmax回归的输出有2个计算单元,神经网络的输出不仅包括输出层的两个单元,还包括隐藏层的3个单元。

在二分类问题中,逻辑回归,softmax回归的决策边界都是一条直线,它们的原理是相同的,神经网络的决策边界会是一条弯曲的曲线,它尽可能的贴近真实数据。

2.MP神经元模型和神经网络

神经网络(neural network),是深度学习中最为基础的模型,在神经网络中包含了大量的节点与节点之间的链接,这些节点被称为神经元,将神经元进行连接和组合就生成了神经网络,而神经网络可以看作是模拟大脑的模型。

MP神经元模型

在这个模型中,神经元会收到来自其他n个神经元传递的输入信号x1到xn,每个神经元包含了权重w1到wn和偏置b,其中w1到wn控制了各个输入信号的重要性,而b控制了神经元被激活的容易程度。在神经元的内部,将接收到的x1到xn乘以对应的权重w1到wn,累加到一起并加上偏置b,得到结果,然后通过激活函数g对z进行处理,最终得到神经元的输出。

激活函数是神经元上运行的数学函数,它负责将神经元的线性累加值z,转为非线性输出。常用的激活函数有,,

神经网络的结构

神经网络由数量庞大的神经元组成,这些神经元被分为输入层,隐藏层和输出层。根据需要,神经网络可以包含多层隐藏层,神经网络通过输入层接收原始特征信息,再通过隐藏层进行特征信息的加工和提取,最后通过输出层输出结果,而隐藏层提取特征信息是神经网络的核心功能。

3.激活函数

激活函数是神经元上运行的数学函数,它负责将神经元的线性累加值z,转为非线性输出,它对于人工神经网络模型起着至关重要的作用。激活函数的不同会直接影响神经网络的的性能和效果,实际中要针对问题来选择激活函数。

sigmod函数

,它是一条平滑的曲线,处处可导,函数的输出会随输入呈现连续性的变化,sigmoid函数可以返回0-1之间的所有实数。使用sigmoid函数可以使损失函数发生连续的变化,从而更好的进行神经网络的迭代。

ReLu函数

ReLu函数全称修正线性单元,。选用ReLu函数可以提高神经网络的整体计算效率,当输入大于0时,ReLu函数的梯度值恒为1,在一定程度上可以缓解梯度消失问题。但是当输入小于0是,ReLu函数恒为0,导致只要输入小于0,神经元就无法学习,这种现象被称为"死亡ReLu"。

为了解决"死亡ReLu",可以使用它的变体,这样即使输入值为负数,神经元仍然有微小的梯度,不会完全"死亡"。

其他常用的激活函数还有等等,使用不同激活函数的激活网络,会有不同的计算性能和训练效果。要基于神经网络的收敛速度和测试集的准确率来选择激活函数。实际上如果神经网络的层数不高,激活函数的表现差异可能并不会很大。

4.神经网络的非线性特性

神经网络可以拟合任意形式的非线性函数,这种性质被称为神经网络的万能近似定理。具体来说,如果一个前馈神经网络包括了线性输出层和至少一层带有非线性激活函数的隐藏层,那么当提供足够多的隐藏神经元后,该神经网络就可以表示任意形式的非线性函数。

神经网络之所以可以拟合任意函数,其中一个关键原因是,在神经元中使用了非线性的激活函数。在神经网络中,如果激活函数是线性的,那么不管网络有多少层都会等价于一个无隐藏层的线性模型。一个没有非线性激活函数的神经网络,无论堆叠多少层,该神经网络仍然只是一个线性变换。这是因为线性函数的可加性和齐次性,多个线性函数的复合仍然是一个线性函数。

5.使用Python绘制神经网络

使用python中的networkx库绘制神经网络,networkx库可以用来创建和操作图类型的数据结构,其中包括无向图、有向图、带权图等等。神经网络可以看作是一种图数据结构,、可以使用networkx库创建并进行可视化的操作。

绘制两层神经网络

绘制三层神经网络

python 复制代码
#根据传入的输入层、隐藏层、输出层的神经元数量,绘制对应的神经网络
import networkx as nx
import matplotlib.pyplot as plt

def draw_network_digraph(input_num,hidden_num,output_num):
    G = nx.DiGraph()#创建一个图G
    #连接输入层和隐藏层之间的边
    for i in range(input_num):
        for j in range(hidden_num):
            G.add_edge(i, input_num+j)
    #连接隐藏层和输出层之间的边
    for i in range(hidden_num):
        for j in range(output_num):
            G.add_edge(input_num+i,input_num+hidden_num+j)
    pos=dict()#计算每个节点的坐标pos
    #节点的坐标(x,y)设置为:(0,i-input_num/2)(1,i-hidden_num/2)(2,i-output_num/2)
    #根据每一层的阶段数量,将节点从中间向两边分布
    for i in range(input_num):
        pos[i]=(0,i-input_num/2)
    for i in range(hidden_num):
        hidden=i+input_num
        pos[hidden]=(1,i-hidden_num/2)
    for i in range(output_num):
        output=i+input_num+hidden_num
        pos[output]=(2,i-output_num/2)

    #调用nx.draw,绘制神经网络
    nx.draw(G,pos,node_color='white',edgecolors='black',linewidths=2,node_size=1000)
python 复制代码
if __name__ == '__main__':
    #尝试绘制不同结构的神经网络
    draw_network_digraph(input_num=5,hidden_num=2,output_num=3)
    plt.show()
    draw_network_digraph(input_num=3,hidden_num=2,output_num=2)
    plt.show()
    draw_network_digraph(input_num=1,hidden_num=7,output_num=2)
    plt.show()

6.神经网络的表示

在神经网络中,将每个神经元的输入记为激励,使用,表示第j层第i个神经元,神经网络的输入层,...

神经网络使用前向传播的方式进行计算,在这个过程中使用表示第k层,第i个神经元计算得到的求和结果(第k层,第i个神经元的输入)的输入,将它带入激活函数g中就得到了第k层,第i个神经元的输出值。从神经网络的第一层开始,向前计算到第三层,这种计算方法称为神经网络的前向传播算法。

基于三层的神经网络:

第二层

第三层

7.矩阵表示前向传播算法

前向传播算法是矩阵的基本计算方法,将样本特征向量输入到神经网络中,经过一层层向前计算,最终从输出层输出结果。

神经网络的第j层输出:

神经网络的特征权值矩阵

偏置向量

神经网络的前向传播算法,矩阵乘法表示形式

第j层的线性输出:,

第2层的线性输出:

在计算过程中也可以将偏置b放到矩阵中,得到优化后的矩阵表示形式

,

相关推荐
宇寒风暖3 小时前
软件工程期末大复习(三)
笔记·学习·软件工程
跟德姆(dom)一起学AI5 小时前
0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型
人工智能·python·rnn·深度学习·神经网络·自然语言处理
Java知识日历6 小时前
【内含代码】Spring Boot整合深度学习框架DJL
java·人工智能·spring boot·后端·深度学习
SmiledrinkCat6 小时前
深度学习模型概论
深度学习
YuCaiH6 小时前
【无线传感网】无线传感器网络安全
笔记·无线传感网
Good Note7 小时前
MySQL数据库笔记——多版本并发控制MVCC
数据库·笔记·mysql
半夏知半秋8 小时前
python文件操作相关(csv)
开发语言·笔记·python·学习
暗暗那8 小时前
华为研发工程师编程题——明明的随机数
javascript·数据结构·笔记·算法·leetcode·华为
世界听的明白9 小时前
【docker】笔记
笔记·docker·容器