预备知识——常用函数
np.random.RandomState.rand(),返回一个[0,1)的随机数
np.vstack(数组1,数组2),将两个数组按垂直方向叠加
tf.where(条件语句,真返回A,假返回B)
tf.greater(a,b),判断a是否大于b
使用下面三种函数生成网格:
np.mgrid[起始值:结束值:步长,起始值:结束值:步长,...]
x.ravel(),将x变为一维数组,把把变量拉直
np.c_[],返回的间隔数值点配对——np.c_[数值1,数值2,...]
复杂度
NN(神经网络)复杂度:多用NN层和NN参数的个数表示
空间复杂度:
层数=隐藏层的层数+1个输出层
下图为2层
总参数=总w+总b
3*4+4 +4*2+2
时间复杂度:
乘加运算次数
3*4+4*2
学习率
指数衰减学习率
可以先使用较大的学习率,快速得到最优解,然后逐步减少学习率,使用模型在训练后期稳定
激活函数
Sigmoid函数
tf.nn.sigmoid(x)
特点:易造成梯度消失,输出非0均值,收敛慢,幂运算复杂,训练时间长。
Tanh函数
tf.math.tanh(x)
特点:输出是0均值,易造成梯度消失,幂运算复杂,训练时间长
Relu函数
tf.nn.relu(x)
优点:解决了梯度消失问题(在正区间),只需判断输入是否大于0,计算速度快,苏联速度远大于上面两个函数
缺点:输出非0均值,收敛慢,Dead Relu问题:某些神经元可能永远不会被激活,导致相应的参数永远不会被更新
损失函数
预测值与已知答案的差距。
NN优化目标:loss最小
均方误差,自定义,交叉熵
tf.reduce_mean(tf.square(y_-y)
tf.losses.categorical_crossentropy(y_,y)
过拟合——正则化
正则化在损失函数中引入模型复杂度指标,利用给w加权,弱化了训练数据的噪声
L1正则化大概率会使很多参数变为0,因此该方法可以通过稀疏矩阵参数,减少参数数量,降低复杂度
L2正则化会使参数接近零但是不等于零,减少参数的值降低复杂度
优化器
随机梯度下降(SGD)
一阶动量mt为梯度gt,二阶动量恒等于1
SGDM
在SGD基础上增加一阶动量
Adagrad
在SDG基础说增加二阶动量vt
RMSProp
在SGD基础上增加二阶动量