tf.clip_by_value函数可以限制log运算时不会出现log0这类的数出现
![](https://img.haomeiwen.com/i9387294/36277132ecf13235.png)
矩阵乘法tf.matmul,直接使用*是元素间相乘
![](https://img.haomeiwen.com/i9387294/ab582bf4dbcc333a.png)
根据交叉熵的公式,应该将每行中的 m 个结果相加得到所有样例的交叉熵,然后再对这 n 行取平均得到 一个 batch 的平均交叉熵。但因为分类问题的类别数量是不变的,所以可以直接对整个矩阵做平均而并不改变计算结果的意义。
通过计算交叉熵会得到一个n*m的矩阵,n是一个batch的样本数,而m是分类的类别数。
求平均使用 tf.reduce_mean()
![](https://img.haomeiwen.com/i9387294/122a457dbf426033.png)
tf.nn .softmax_cross_entropy_with_logits( labels=y_, logits=y)
上面的函数可以直接使用训练出来的y和原始标签y_计算出交叉熵,而不用自己添加softmax获得矩阵后再更新。
梯度下降的两个问题
1)无法全局最优
2)计算时间太长
关于优化学习率
众所周知,使用梯度下降的时候,需要在每次确定梯度方向后确定一个步长,也就是所谓的梯度前进多少,这个就是所谓的学习率。
学习率太大或者太小都不好,因为太大容易震荡,太小迭代速度又太慢。
TensorFlow提供另一个学习率设置方法-指数衰减法。
tf.train.exponential_decay函数实现了这个学习率。
可以先使用一个较大的学习率来快速达到一个较好的解,然后随着迭代的继续逐步减小学习率,使得模型在训练后期更加稳定。
学习率的更新其实是
![](https://img.haomeiwen.com/i9387294/1ead1afc41c710cf.png)
其中 decayed_learning_rate 为每一轮优化时使用的学习率 , learning_rate 为事先设定的 初始学习率, decay_rate 为衰减系数, decay_steps 为衰减速度。
![](https://img.haomeiwen.com/i9387294/90022c34c80da6a6.png)
tf.train.exponential_decay函数可以通过设置参数 staircase 选择不同的衰减方式。 staircase 的默认值为 False,这时学习率随法代轮数变化的趋势如 图 4-13 中灰色曲线所示。当 staircase 的值被设置为 True 时, global_step I decay_steps 会被 转化成整数。这使得学习率成为 一个阶梯函数( staircase function)
关于正则化
常用的正则化化是有两种分为L1和L2
![](https://img.haomeiwen.com/i9387294/56352243ed9e7c4e.png)
无论是哪一种正则化方式,基本的思想都是希望通过限制权重的大小,使得模型不能 任意拟合训练数据中的随机噪音。但这两种正则化的方法也有很大的区别。 首先, Ll正则 化会让参数变得更稀疏,而 L2 正则化不会 。 所谓参数变得更稀疏是指会有更多的 参数变为 0,这样可以达到类似特征选取的功能。之所以 L2 正则化不会让参数变得稀疏的原因是当 参数很小时,比如 0.001,这个参数的平方基本上就可以忽略了,于是模型不会进一步将这 个参数调整为 0。其次 , LI 正则化的计算公式不可导,而 L2 正则化公式可导。因为在优 化时需要计算损失函数的偏导数,所以对含有 L2 正则化损失函数的优化要更加简洁 。
网友评论