2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数

目标:

  1. 神经网络优化过程,
  2. 使用正则化减少过拟合,
  3. 使用优化器更新网络参数

2.1 预备知识

tf.where(条件语句,真返回A,假返回B)

条件语句真返回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) # 若a>b,返回a对应位置的元素,否则返回b对应位置的元素
print("c:",c)

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

np.random.RandomState.rand(维度)

返回一个[0,1)之间的随机数

import numpy as np
rdm=np.random.RandomState(seed=1) #seed=常数每次生成随机数相同
a=rdm.rand() # 返回一个随机标量
b=rdm.rand(2,3) # 返回维度为2行3列随机数矩阵
print("a:",a)
print("b:",b)

运行结果:
a: 0.417022004702574
b: [[7.20324493e-01 1.14374817e-04 3.02332573e-01]
[1.46755891e-01 9.23385948e-02 1.86260211e-01]]

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

将两个数组按垂直方向叠加

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.vstack((a,b))
print("c:\n",c)

c:
[[1 2 3]
[4 5 6]]

np.mgrid[起始值:结束值:步长 , 起始值:结束值:步长, … ][起始值,结束值)

返回若干组维度相同的等差数组,左闭右开,包含起始值,不包含结束值

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

运行结果:
x = [[1. 1. 1. 1.]
[2. 2. 2. 2.]]
y = [[2. 2.5 3. 3.5]
[2. 2.5 3. 3.5]]

x.ravel( )

将x变为一维数组,“把 . 前变量拉直”

np.c_[ 数组1,数组2, … ]

使返回的间隔数值点配对

import numpy as np
x, y = np.mgrid [1:3:1, 2:4:0.5]
grid = np.c_[x.ravel(), y.ravel()]
print("x:",x)
print("y:",y)
print('grid:\n', grid)

运行结果:
x = [[1. 1. 1. 1.]
[2. 2. 2. 2.]]
y = [[2. 2.5 3. 3.5]
[2. 2.5 3. 3.5]]
grid:
[[1. 2. ]
[1. 2.5]
[1. 3. ]
[1. 3.5]
[2. 2. ]
[2. 2.5]
[2. 3. ]
[2. 3.5]]

2.2 指数衰减学习率

NN复杂度:多用NN层数和NN参数的个数表示

空间复杂度:
层数 = n个隐藏层的层数 + 1个输出层
总参数 = 总w + 总b
时间复杂度:
乘加运算次数

2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第1张图片
上图神经网络为2层
总参数=第一层(3x4=12)+当前输出层4+第二层(4x2)+当前层输出偏置项2 =26
时间复杂度=第一层(3x4=12)+第二层(4x2)=20

指数衰减学习率
可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使
模型在训练后期稳定。
指 数 衰 减 学 习 率 ‾ \underline{指数衰减学习率} = 初始学习率 * 学习率衰减率( 当前轮数 / 多少轮衰减一次 )
2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第2张图片

2.3 激活函数

2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第3张图片

优秀的激活函数:

  • 非线性: 激活函数非线性时,多层神经网络可逼近所有函数
  • 可微性: 优化器大多用梯度下降更新参数
  • 单调性: 当激活函数是单调的,能保证单层网络的损失函数是凸函数
  • 近似恒等性: f(x)≈x当参数初始化为随机小值时,神经网络更稳定

激活函数输出值的范围:

  • 激活函数输出为有限值时,基于梯度的优化方法更稳定
  • 激活函数输出为无限值时,建议调小学习率

激活函数

Sigmoid函数 Tanh函数 Relu函数 Leaky Relu函数
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1 f ( x ) = 1 − e − 2 x 1 − e − 2 x f(x)=\frac{1-e^{-2x}}{1-e^{-2x}} f(x)=1e2x1e2x f ( x ) = max ⁡ ( x , 0 ) f(x)=\max (x,0) f(x)=max(x,0) f ( x ) = max ⁡ ( α x , x ) f(x)=\max(\alpha x, x) f(x)=max(αx,x)
tf.nn. sigmoid(x) tf.math. tanh(x) tf.nn.relu(x) tf.nn.leaky_relu(x)
特点(1)易造成梯度消失(2)输出非0均值,收敛慢(3)幂运算复杂,训练时间长 特点(1)输出是0均值(2)易造成梯度消失(3)幂运算复杂,训练时间长 优点:(1) 解决了梯度消失问题 (在正区间)(2) 只需判断输入是否大于0,计算速度快(3) 收敛速度远快于sigmoid和tanh缺点:(1) 输出非0均值,收敛慢(2) Dead RelU问题:某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。 理论上来讲,Leaky Relu有Relu的所有优点,外加不会有Dead Relu问题,但是在实际操作当中,并没有完全证明Leaky Relu总是好于Relu。
函数 图像&导数图
Sigmoid函数 2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第4张图片
Tanh函数 2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第5张图片
Relu函数 2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第6张图片
Leaky Relu函数 2.1-2.3 神经网络优化-1: 预备知识 指数衰减学习率 激活函数_第7张图片

对于初学者的建议:

  • 首选relu激活函数;
  • 学习率设置较小值;
  • 输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布;
  • 初始参数中心化,即让随机生成的参数满足以0为均值, 2 当 前 层 输 入 特 征 个 数 \sqrt{\frac{2}{当前层输入特征个数}} 2 为标准差的正态分布。

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