本文将对神经网络中常用的一些概念以及函数进行解释,如张量、神经网络复杂度\、学习率、激活函数、损失函数、过拟合、优化器等。
1. 张量是什么?
张量(Tensor):多维数组(列表)
阶:张量的维数
0阶张量叫做标量,1阶张量叫做向量,2阶张量叫做矩阵,...
张量可以表示0阶到n阶的数组(列表),判断张量是几阶,主要看方括号有几个
Tensorflow的数据类型:tf.int,tf.float,tf.bool,tf.string等
如何创建一个张量(Tensor)?
tf.constant(张量内容,dtype=数据类型(可选))
例如:a=tf.constant([1,5],dtype=tf.int64) 创建一个整数型的一阶张量[1,5]
tf.zeros(维度):创建全为0的张量
tf.ones(维度):创建全为1的张量
tf.fill(维度,指定值):创建全为指定值的张量
维度:1维:直接写个数;2维:用[行,列];多维:用[n,m,k...]
tf.random.normal(维度,mean=均值,stddev=标准差):生成正态分布的随机数,默认均值为0,标准差为1
tf.random.truncated_normal(维度,mean=均值,stddev=标准差):生成截断式正态分布的随机数,在之内
tf.random.uniform(维度,minval=最小值,maxval=最大值):生成均匀分布随机数 [min,max)
如何将numpy数据格式转换为Tensor数据类型?
tf.convert_to_tensor(数据名,dtype=数据类型(可选))
例如:a=np.arange(0,5)
b=tf.convert_to_tensor(a,dtype=tf.int64)
2. 神经网路(NN)复杂度
NN复杂度:多用NN层数和NN参数的个数表示
3. 学习率
参数更新公式里 lr 是学习率(0~1之间),表示参数每次更新的幅度。
lr 设定过小时,参数更新过慢;设定过大时,参数更新不收敛
指数衰减学习率:可以先用较大的学习率,快速得到较优的解,然后逐步减小学习率,使模型在训练后期稳定
例如:
4. 激活函数
一个两层神经网络的传播过程可以表示为:H=X*W1+b1;Y=H*W2+b2。一系列线性方程的运算最终都可以用一个线性方程表示。也就是说,上述两个式子联立后可以用一个线性方程表达。对于两次神经网络是这样,就算网络深度加到100层,也依然是这样。这样的话神经网络就失去了意义。因此引入了激活函数。
激活函数将非线性特性引入到神经网络中,对于神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。
常用的激活函数有三种,分别是阶跃函数、Sigmoid、Tanh、ReLU、Leaky Relu等
一般来说首选:
- relu激活函数;
- 学习率设置较小值;
- 输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布;
- 初始参数中心化,即让随机生成的参数满足以0为均值,根号(2/当前层输入特征个数)为标准差的正态分布。
5. 损失函数
损失函数(loss):预测值(y)与一直答案(y_)的差距
(1)损失函数常用均方误差
(2)自定义损失函数
- 当y-y_(y>y_)与y_-y(y<y_)来带的损失程度不同时,可采用自定义损失函数
- 可以设定PROFIT与COST为不同值来反映不同损失程度
(3)交叉熵损失函数CE(Cross Entropy)
- 表征两个概率分布之间的距离
- 交叉熵越大表示两个概率分布越远,反之则越近
注:在tensorflow中给出了可以同时计算概率分布softmax和交叉熵的函数:
tf.nn.softmax_cross_entropy_with_logits(y_,y)
6. 过拟合
欠拟合:模型不能有效拟合数据集,对现有数据集学习的不够彻底。解决方法:
- 增加输入特征项
- 增加网络参数
- 减少正则化参数
过拟合:模型对当前数据拟合太好了,对新数据难以做出正确的判断,模型缺乏泛化力。解决方法:
- 数据清洗
- 增大训练集
- 采用正则化
- 增大正则化参数
正则化缓解过拟合:正则化在损失函数中引入模型复杂度指标,利用给W加权值,弱化了训练数据的噪声(一般不正则化b),有两种正则化方法:L1和L2
- L1正则化大概率会使很多参数变为零,因此该方法可通过稀疏参数,即减少参数的数量,降低复杂度。
- L2正则化会使参数很接近零但不为零,因此该方法可通过减小参数值的大小降低复杂度。
7. 优化器
待优化:参数w,损失函数loss,学习率lr,每次迭代一个batch
更新参数分为4步完成:(t表示当前batch迭代的总次数)
常用的优化器有:梯度下降法(SGD)、SGDM、Adagrad、RMSProp、Adam
梯度下降法(SGD):
一阶和二阶动量设定:
更新公式:
SGDM:在SGD基础上增加一阶动量
Adagrad:在SGD基础上增加二阶动量
RMSProp:SGD基础上增加二阶动量
Adam:同时结合SGDM一阶动量和RMSProp二阶动量
以上这些公式愿意推导的自己可以试试
以下是用这些求解器在鸢尾花问题的代码上,改动了训练部分,参数更新处加入了优化器,统计了五种优化器下的loss和acc以及所有花费时间:
学习来源:人工智能实践:Tensorflow笔记