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

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

文章目录

  • 神经网络基础知识总结与理解
      • 一、常用函数(基于tensorflow)
        • 1、tf.where
        • 2、np.random.RandomState.rand()
        • 3、np.vstack()
        • 4、np.mgrid[] + np.c_[]+array.ravel()
      • 二、常用概念
        • 1、复杂度
        • 2、学习率
        • 3、激活函数
        • 4、损失函数
        • 5、欠拟合和过拟合
        • 6、正则化
        • 7、神经网络优化器

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

一、常用函数(基于tensorflow)

1、tf.where

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

用法:

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

代码示例:

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)

运行结果

c: tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

2、np.random.RandomState.rand()

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

用法

np.random.RandomState.rand(维度)

代码示例

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

运行结果

[[0.18024415 0.14105498 0.23681506]
 [0.46079149 0.13543915 0.02365349]]

3、np.vstack()

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

用法

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

代码示例

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)

运行结果

d:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

4、np.mgrid[] + np.c_[]+array.ravel()

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

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

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

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

用法

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

示例代码1

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

运行结果

x:  array([[[1., 1.],	
            [1., 1.],		
            [1., 1.],	
            [1., 1.]],	

           [[2., 2.],	
            [2., 2.],	
            [2., 2.],	
            [2., 2.]]])	

示例代码2

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

示例代码3

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

运行结果

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、复杂度

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

  • 空间复杂度

主要有两个参数:层数和总参数。层数指隐藏层加输出层的层数;总参数指参数的总数,即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\{ \begin{array}{l} 0 \quad x < 0\\ x \quad x \ge 0 \end{array} \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 _ ) n MSE({y_\_},y) = \frac{{\sum\nolimits_{i = 1}^n {{{(y - y_\_^{})}^{}}} }}{n} MSE(y_,y)=ni=1n(yy_)

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

  • 交叉熵损失函数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)

你可能感兴趣的:(学习笔记,神经网络,numpy,python)