神经网络基础知识
sigmod(x)
公式
数学表示:f(x)=((1)/(1+ℯ^(-x)))
Latex表示:f(x) = \frac{1}{1+e^{-x}}
图片表示:
性质
- 连续光滑、严格单调
- 能将(-∞~+∞) 映射到(0,1),实现很大程度上地压缩
- 其导函数容易求得并计算,当x=0时,f’(x) =0.25达到最大值,但是两端趋近于0,会出现梯度弥散
应用场景
- 预测概率
- 单位归一
- 神经网络输出层
原函数图像
![](https://i-blog.csdnimg.cn/blog_migrate/301f4dad64e563d32f9c747bd7c467bb.png)
一阶导函数图像
推导过程:
复合图像
tanh(x)
公式
数学表示:tanh(x) = (e^x -e^(-x)) / (e^x+e^(-x)) = 2*sigmod(2*x) -1
Latex表示: tanh(x) = (\frac{ex-e{-x} }{ex+e{-x}} )
图片表示:
性质
1.能将(-∞~+∞) 映射到(-1,1)
2.奇函数,关于原点对称,
3.其导函数易于计算,当x=0时,f’(x) = 1,在两端趋近于0,同样存在梯度弥散
应用场景
- RNN/LSTM
- 隐藏层中
原函数图像
一阶导数图像
推导过程:
混合图像
Relu(x)
公式
数学表示:f(x) =max(0,x)
Latex表示:
性质
- 当x<0时,f(x) =0;当x>0时,f(x) = x。
- 导函数非常简单,当x<0时,f’ =0,梯度为0,形成单侧抑制;当x≥0时,f’ =1。
- 不存在梯度弥散,因为梯度不存在饱和区,参数计算量小,梯度收敛速度较快。
- 缺点:不以0为中心,单侧抑制存在“死亡”神经元
应用场景
1.DNN:使得网络变得稀疏
原函数图像
一阶导函数图像
混合图像
softmax(x)
偏微分
单层感知机
定义
1957年 Frank Rosenblatt 提出了一种简单的人工神经网络,由一个输入层和一个输出层构成,因此也被称为“单层感知机”
偏微分
- x、w、σ 的上标:当前所在层数
- x、σ 、t 的下标:该层中节点的编号
- w 的下标:j表示上一层的节点,k表示下一层的节点
多输出感知机
定义
MLP可以被看作是一个有向图,由多个的节点层所组成,每一层都全连接到下一层;是一种前向结构的人工神经网络,映射一组输入到一组输出。
偏微分
- x、w、σ 的上标:当前所在层数
- x、σ 、t 的下标:该层中节点的编号
- w 的下标:j表示上一层的节点,k表示下一层的节点
多层感知机
反向传播中的偏微分
优化器优劣验证模型
Himmelblau函数
定义
在数学优化中,Himmelblau函数是一个多模态函数,用于测试优化算法的性能。该函数定义为:f(x,y)=(x^2+y-11)^2 +(x+y^2-7)^2
性质
- 具有4个局部最小值:f(3.0,2.0)=0.0;f(-2.805118,3.131312)=0.0;f(-3.779310,-3.283186)=0.0;f(3.584428,-1.848126)=0.0
- 具有1个局部最大值:f(-0.270845,-0.923039)=181.617
函数图像
Himmelblau’s Function:原站链接
测试代码(spyder)
# 测试优化器对于Himmelblau的优化效果
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
import torch
def Himmelblau(x):
return (x[0] ** 2 + x[1]-11)**2 + (x[0]+x[1]**2-7)**2
# 绘制3D图像
x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
print("x,y range:", x.shape, y.shape)
X, Y = np.meshgrid(x, y)
print("X,Y maps:", X.shape, Y.shape)
Z = Himmelblau([X, Y])
fig = plt.figure("Himmelblau")
ax = fig.add_subplot(projection="3d")
ax.plot_surface(X, Y, Z)
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
# 初始起点坐标,会影响结果
x = torch.tensor([0., 0.], requires_grad=True)
# 选定优化器
optimizer = torch.optim.Adam([x], lr=0.001)
for step in range(20000):
pre = Himmelblau(x)
optimizer.zero_grad()
# 反向传播
pre.backward()
optimizer.step()
if step % 2000 == 0:
print("step{}: x={},f(x)={}".format(step, x.tolist(), pre.item()))
train、validation、test
训练集、测试集
- 定义:训练集指为了对搭建的模型进行参数的确定,对模型的健壮性进行增强,对特定应用场景进行适应的大量数据;测试集指为了对经过训练后的模型进行评价考核或者具体使用需要的测试数据,能一定程度上检验模型是否有效。
- 划分:一般为 80%:20%
训练集、验证集、测试集
- 定义:训练集、验证集都是属于模型搭建第一步需要的数据,其中训练集是进行模型参数的确定,验证集是验证在进行模型的反向传播过程中是否出现过拟合,使得始终保存着模型最优参数。测试集数据原则上属于开发人员拿不到的数据,防止开发人员直接在测试集上进行模型训练,这部分数据集由目标客户独立拥有。
- 划分:(开发人员应该将拿到的数据保留一部分绝对不能参与模型的训练过程)一般为 60%:20%:20%
交叉验证
- 定义:指将训练集和验证集整体划分为K份,每次训练过程中利用这个整体的(K-1)份数据进行训练,1份数据进行验证;重复K次;
- 意义:能在一定程度上使得这个整体的所有数据都能参与模型的训练过程,使得模型的健壮性提高一点点。但是数据集并未实质性地扩充,所以优化效果不是太好!
正则化
- 定义:对目标函数增加一个参数范数惩罚,限制模型的学习能力
- 用途:防止模型出现过拟合
L1正则化
- 定义:指权重矩阵中各个元素的绝对值之和,为L1范数
- 作用:主要用于挑选出重要的特征,并舍弃不重要的特征
- 公式:
L2正则化
- 定义:指权重矩阵中各个元素的平方和,为了优化正则项,会减少参数平方的总和,倾向于选择值很小的权重参数,为L2范数
- 作用:防止过拟合
- 公式:
动量
定义
基于一定的惯性向前寻找路径,即:综合考虑当前梯度方向又考虑上一层的梯度方向,根据两个方向向量的对角线方向进行梯度下降求解
作用
用于防止系统收敛于局部最小值而非全局最小值
学习率动态调整
# 设置优化器:使用动量、正则化
optimizer = torch.optim.SGD(model.parameters(),args.lr,momentum=args.momentum,weight_decay=args.weight_deacy)
# 设置优化器监听,当loss持续变化不大次数达到阈值时,触发动态降低学习率
scheduler = ReduceLROnPlateau(optimizer,"min")
for epoch in xrange(args.start_epoch,args.epochs):
train(train_loader,model,criterion,optimizer,epoch)
result_avg,loss_val =validate(val_loader,model,criterion,epoch)
scheduler.step(loss_val)
梯度爆炸
# 解决梯度爆炸的算法
loss = criterion(output,y)
model.zero_grad()
loss.backward()
for p in model.parameters():
print(p.grad.norm())
torch.nn.utils.clip_grad_norm_(p,10)
optimizer.step()