tensorflow笔记系列文章均参考自中国大学Mooc上北京大学软件与微电子学院曹建老师的《Tensorflow笔记2》课程。曹建老师讲的非常棒,受益良多,强烈建议tensorflow初学者学习。
1 复杂度和学习率
1.1 神经网络复杂度
神经网络复杂度多用神经网络层数和神经网络参数的个数来表示。
空间复杂度:
- 层数 = 隐藏层层数 + 1个输出层。例如下图的神经网络为两层(1层隐藏层 + 1个输出层)
- 总参数 = 总w + 总b。例如下图的神经网络第一层参数个数为
3*4+4
,第二层神经网络个数为4*2+2
,所以一共有26个参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHLvFh2p-1596169483071)(C:\Users\xiao\AppData\Roaming\Typora\typora-user-images\image-20200730110726117.png)]
时间复杂度:
- 乘加运算的次数,例如上图的神经网络第一层经历了
3*4
次运算,第二层经历了4*2
次运算,一共运算次数是20次。
1.2 神经网络学习率
对于学习率来说,我们知道的是,学习率设置过小,模型收敛会很慢,学习率设置过大,模型可能不收敛。那么怎样设置一个合适的学习率呢,可以使用指数衰减学习率来解决这个问题。公式如下:
指数衰减学习率 = 初始学习率*学习率衰减率**(当前轮数/多少轮衰减一次)
1.3 激活函数
优秀的激活函数:
- 非线性:激活函数非线性时,多层神经网络可逼近所有函数
- 可微性:优化器大多用梯度下降更新参数
- 单调性:当激活函数是单调的,能保证单层网络的损失函数是凸函数
- 近似恒等性:f(x)约等于x,当参数初始化为随机小值时,神经网络更稳定
激活函数输出值的范围:
- 激活函数输出为有限值时,基于梯度的优化方法更稳定
- 激活函数输出为无限值时,建议调小学习率
2 损失函数
**损失函数(loss)**就是预测值与已知答案的差距,神经网络的优化目标就是找到一套参数,使得损失函数的值最小。
损失函数的定义常使用均方误差(mse),在tensorflow中可以用以下方式来定义:loss_mse = tf.reduce_mean(tf.square(y_ - y))
,其中y_
是真实值,y
是预测值。
除此之外,损失函数的定义还能使用均方误差和交叉熵,自定义损失函数就不介绍了,下面介绍一下交叉熵函数。
**交叉熵函数CE(Cross Entropy)**表示两个概率分布之间的距离:
H ( y − , y ) = − ∑ y − ∗ l n y H(y_ -, y) = -\sum{y_ -*lny} H(y−,