• 神经网络基础知识总结与理解


    神经网络基础知识总结与理解


    本文内容主要为学习 北京大学MOOC课程:人工智能实践:Tensorflow笔记的学习笔记,其中包括部分个人理解,不一定对,敬请大佬们斧正

    一、常用函数(基于tensorflow)

    1、tf.where

    类似于高级三目运算符,若条件语句为真返回A,否则返回B

    用法:

    tf.where(条件语句,A,B)
    
    • 1

    代码示例:

    a = tf.constant([1,2,3,1,1])
    b = tf.constant([0,1,3,4,5])
    c = tf.where(tf.greater(a,b), a, b)
    
    print("c:", c)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果

    c: tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)
    
    • 1
    2、np.random.RandomState.rand()

    按照给出的维度生成随机数矩阵

    用法

    np.random.RandomState.rand(维度)
    
    • 1

    代码示例

    rdm = np.random.RandomState()
    print(rdm.rand(2,3))
    
    • 1
    • 2

    运行结果

    [[0.18024415 0.14105498 0.23681506]
     [0.46079149 0.13543915 0.02365349]]
    
    • 1
    • 2
    3、np.vstack()

    将两个数组按照垂直方向叠加(有点升维的意思)

    用法

    np.vstack((数组1,数组2))
    
    • 1

    代码示例

    a = np.array([1,2,3])
    b = np.array([4,5,6])
    c = np.array([7,8,9])
    d = np.vstack((a,b,c))
    
    print("d:\n", d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果

    d:
     [[1 2 3]
     [4 5 6]
     [7 8 9]]
    
    • 1
    • 2
    • 3
    • 4
    4、np.mgrid[] + np.c_[]+array.ravel()

    np.mgrid[]根据所给条件生成具有“空间结构”的等差三维数组

    ravel()将数组“拉直”,即将高维数组变成一维数组

    np.c_[]将数组中的数据点配对生成数据点集合

    根据合起来就是依据所给条件生成坐标点

    用法

    np.mgrid[起始值:结束值:步长, 起始值:结束值:步长, ...]
    数组.ravel()
    np.c_[数组1,数组2]
    
    • 1
    • 2
    • 3

    示例代码1

    x, y, z = np.mgrid[1:3:1, 2:4:0.5, 5:7:1]
    
    • 1

    运行结果

    x:  array([[[1., 1.],	
                [1., 1.],		
                [1., 1.],	
                [1., 1.]],	
    
               [[2., 2.],	
                [2., 2.],	
                [2., 2.],	
                [2., 2.]]])	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    示例代码2

    x, y, z = x.ravel(), y.ravel(), z.ravel()
    
    • 1
    array([1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 2., 2., 2.])
    
    • 1

    示例代码3

    np.c_[x.ravel(),y.ravel(),z.ravel()]
    
    • 1

    运行结果

    array([[1. , 2. , 5. ],
           [1. , 2. , 6. ],
           [1. , 2.5, 5. ],
           [1. , 2.5, 6. ],
           [1. , 3. , 5. ],
           [1. , 3. , 6. ],
           [1. , 3.5, 5. ],
           [1. , 3.5, 6. ],
           [2. , 2. , 5. ],
           [2. , 2. , 6. ],
           [2. , 2.5, 5. ],
           [2. , 2.5, 6. ],
           [2. , 3. , 5. ],
           [2. , 3. , 6. ],
           [2. , 3.5, 5. ],
           [2. , 3.5, 6. ]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    二、常用概念

    1、复杂度

    神经网络复杂度分为两种,分别是空间复杂度和时间复杂度

    • 空间复杂度

    主要有两个参数:层数和总参数。层数指隐藏层加输出层的层数;总参数指参数的总数,即w的总数加上b的总数

    • 时间复杂度

    一般指乘加运算总数,等于w总数

    2、学习率

    学习率可以理解为向损失函数值减小的方向移动的速率*(好像有点绕)*,但下面的公式很好地解释了学习率的作用
    w t + 1 = w t − l r ∗ ∂ l o s s ∂ w t {w_{t + 1}} = {w_t} - lr*\frac{{\partial loss}}{{\partial {w_t}}} wt+1=wtlrwtloss
    一般学习率设置的策略为先大后小,主要作用是首先快速趋近到较优解,然后减小学习率,使模型能够收敛到稳定解而非在稳定解附近左右横跳

    3、激活函数

    激活函数的主要作用就是将原本线性输出的神经网络变成了非线性输出的神经网络,使得多层的神经网络有了意义——当激活函数非线性时,多层神经网络可以逼近所有函数。

    优秀的激活函数有以下几个特点

    • 非线性:使多层神经网络不退化成单层神经网络
    • 可微性:优化器大多使用梯度下降更新参数
    • 计算简单:减少计算开销
    • 非饱和性:梯度不变为0
    • 单调性:当激活函数是单调的,可以保证单层网络的损失函数是凸函数
    • 值域有界:对于大输入比较稳定
    • 近似恒等性:f(x)趋近于x,此时当参数初始化为随机小值时,神经网络会更稳定;同时输出的幅值不会随着深度的增加而显著增加。(实际上这个特性与非线性矛盾,所以激活函数只能部分满足这个特点)
    • 参数少:不增加神经网络的规模
    • 归一化:均值为0,加快收敛

    常见激活函数

    • sigmoid

    f ( x ) = 1 1 + e − x f(x) = \frac{1}{{1 + {e^{ - x}}}} f(x)=1+ex1

    特点:易造成梯度消失;输出非0均值,收敛慢;幂运算计算速度慢

    • Tanh

    f ( x ) = 1 − e − 2 x 1 + e − 2 x f(x) = \frac{1-{e^{-2x}}}{{1 + {e^{ -2x}}}} f(x)=1+e2x1e2x

    特点:易造成梯度消失;输出归一;幂运算计算速度慢

    • Relu(最常用)

    f ( x ) = { 0 x < 0 x x ≥ 0 f(x) = \left\{

    0x<0xx0" role="presentation">0x<0xx0
    \right. f(x)={0x<0xx0

    特点:正区间无梯度消失问题;输出非0均值,收敛慢;简单,计算速度快;Dead Relu问题,某些神经元可能永远不会被激活,导致相应参数不能更新(可以通过改进随机初始化并减小学习率减少输入Relu的负数特征,也可以使用Leaky Relu)

    4、损失函数

    损失函数(loss)主要作用是计算预测值(y)与已知答案(y_)的差距,而神经网络的优化目标就是使loss取值尽可能小,损失函数主要分为以下三类

    • 均方误差损失函数MSE(Mean Square Error)

    M S E ( y _ , y ) = ∑ i = 1 n ( y − y _ ) 2 n MSE({y_\_},y) = \frac{{\sum\nolimits_{i = 1}^n {{{(y - y_\_)^{2}}^{}}} }}{n} MSE(y_,y)=ni=1n(yy_)2

    对异常值非常敏感,适用于回归问题

    • 交叉熵损失函数CE(Cross Entropy)

    H ( y _ , y ) = − ∑ ( y _ ∗ l n y ) H(y_{\_},y)=-\sum(y_{\_}*lny) H(y_,y)=(y_lny)

    对正确值看重,适用于分类问题

    • 自定义损失函数

    自定义函数,较灵活

    5、欠拟合和过拟合
    • 欠拟合解决方法:
      • 增加输入特征项
      • 增加网络参数
      • 减少正则化参数
    • 过拟合解决方法
      • 数据清洗
      • 增大训练集
      • 采用正则化
      • 增大正则化参数
    6、正则化

    正则化在损失函数中引入模型复杂度指标,通过给w参数加权值,弱化了训练数据的噪声。实际上,正则化可以看作损失函数中的惩罚项
    l o s s = l o s s ( y , y _ ) + R E G U L A R I Z E R ∗ l o s s ( w ) loss=loss(y,y_{\_})+REGULARIZER*loss(w) loss=loss(y,y_)+REGULARIZERloss(w)
    公式中的REGULARIZER是调整正则化的超参数,从公式能直观的理解为消除较大的参数w,甚至使得部分参数变为0,可以降低模型复杂度

    正则化主要分为两类,分类如下

    • L1正则化

    大概率使很多参数变为0,更适用于特征选择,找出更关键的特征
    l o s s L 1 ( w ) = ∑ i ∣ w i ∣ loss_{L1}(w)=\sum_i|w_i| lossL1(w)=iwi
    作用:稀疏参数,降低复杂度;同时稀疏解,使得模型更具有“可解释性”;

    • L2正则化

    使参数很接近零但不为零,
    l o s s L 2 ( w ) = ∑ i ∣ w i 2 ∣ loss_{L2}(w)=\sum_i|{w_i}^2| lossL2(w)=iwi2
    作用:通过减小参数值的大小降低网络复杂度;减小参数的大小使函数值的变化减小,缓解过拟合;

    7、神经网络优化器

    优化器就是引导神经网络更新参数的工具,优化器之间的区别实际上就是其中一阶动量和二阶动量之间的区别,常用的优化器有五种,此处列举基础的两种

    • SGD (无动量):随机梯度下降

    一阶动量: m t = g t 二阶动量: v t = 1 下降梯度: η t = l r ∗ m t / v t 新参数: w t + 1 = w t − η t = m t − l r ∗ m t / v t 一阶动量: m_t=g_t\\ 二阶动量:v_t=1\\ 下降梯度:\eta_t=lr*m_t/{\sqrt{v_t}}\\ 新参数:w_{t+1}=w_t-\eta_t=m_t-lr*m_t/{\sqrt{v_t}} 一阶动量:mt=gt二阶动量:vt=1下降梯度:ηt=lrmt/vt 新参数:wt+1=wtηt=mtlrmt/vt

    • SGDM (含momentum)

    一阶动量: m t = β ∗ m t − 1 + ( 1 − β ) ∗ g t 二阶动量: v t = 1 下降梯度: η t = l r ∗ m t / v t = l r ∗ ( β ∗ m t − 1 + ( 1 − β ) ∗ g t ) 新参数: w t + 1 = w t − η t = w t − l r ∗ ( β ∗ m t − 1 + ( 1 − β ) ∗ g t ) 一阶动量: m_t = \beta * m_{t - 1} + (1 - \beta ) * {g_t}\\ 二阶动量:v_t=1\\ 下降梯度:\eta_t=lr*m_t/{\sqrt{v_t}}=lr*(\beta * m_{t - 1} + (1 - \beta ) * {g_t})\\ 新参数:w_{t+1}=w_t-\eta_t=w_t-lr*(\beta * m_{t - 1} + (1 - \beta ) * {g_t}) 一阶动量:mt=βmt1+(1β)gt二阶动量:vt=1下降梯度:ηt=lrmt/vt =lr(βmt1+(1β)gt)新参数:wt+1=wtηt=wtlr(βmt1+(1β)gt)

  • 相关阅读:
    创邻科技图数据库课程走进一流高校
    20-数据结构-内部排序-插入排序
    怎样给蔬菜图片抠图?看看这个马路中央的紫茄子
    【附源码】计算机毕业设计SSM设计与实现大学常规信息管理系统
    day33 文件上传&中间件解析漏洞&编辑器安全
    【C++】string类的介绍与使用
    工业级数据分发服务DDS之安全篇
    2023.11.6联赛总结
    html主页框架,前端首页通用架构,layui主页架构框架,首页框架模板
    jsoup框架技术文档--java爬虫--基本概念
  • 原文地址:https://blog.csdn.net/weixin_48066554/article/details/127698851