熟悉 TensorFlow 的同学都知道, TensorFlow 中有两个经常用到的函数:
那么,二者有何区别?训练时目标函数应该使用哪一个?
我们先看函数定义:
tf.reduce_sum(input_tensor, axis=None, keepdims=None, name=None,
reduction_indices=None, keep_dims=None)
主要是三个参数:
input_tensor
:输入的张量数组axis
:求和的维度keepdims
:是否保持维度不变其余reduction_indices
和keep_dims
是为了保持和旧版本兼容,现已废弃。
从字面上理解,这是一个降维求和函数,对于给定的输入input_tensor
,对其维度axis
进行降维求和(不指定则默认对整个数组求和),并且返回求和后的结果张量。直接看样例:
>>> tensor = tf.constant(np.array([[1., 2.],[3., 4.]]))
>>> tensor.eval()
array([[1., 2.],
[3., 4.]])
>>> tf.reduce_sum(tensor).eval() # 全部求和
10.0
>>> tf.reduce_sum(tensor, axis=0).eval() # 按列求和
array([4., 6.])
>>> tf.reduce_sum(tensor, axis=1).eval() # 按行求和
array([3., 7.])
>>> tf.reduce_sum(tensor, axis=1, keepdims=True).eval() # 按行求和同时保持维度不变
array([[3.],
[7.]])
同样看函数定义:
tf.reduce_mean(input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None)
同样主要是三个参数:
input_tensor
:输入的张量数组axis
:求均值的维度keepdims
:是否保持维度不变其余reduction_indices
和keep_dims
是为了保持和旧版本兼容,现已废弃。
类似tf.reduce_sum
,只是一个是求和一个是求均值。
>>> tensor = tf.constant(np.array([[1., 2.],[3., 4.]]))
>>> tensor.eval()
array([[1., 2.],
[3., 4.]])
>>> tf.reduce_mean(tensor).eval() # 全部求均
2.5
>>> tf.reduce_mean(tensor, axis=0).eval() # 按列求均
array([2., 3.])
>>> tf.reduce_mean(tensor, axis=1).eval() # 按行求均
array([1.5, 3.5])
>>> tf.reduce_mean(tensor, axis=1, keepdims=True).eval() # 按行求均同时保持维度不变
array([[1.5],
[3.5]])
通常,对于数据的训练,采用的都是mini-batch
的方法,也就是传入的数据都是以一个batch
的形式传入的,那么当我们设计目标函数的时候,对于误差应该如何传导?
L = ∑ ( . . . ) L = \sum(...) L=∑(...)
或者
L = 1 n ∑ ( . . . ) L = \frac{1}{n}\sum(...) L=n1∑(...)
对于目标函数的设计,决定了使用的是tf.reduce_sum()
或者tf.reduce_mean()
假设当前训练的真实数据y_data = [1.5, 2.5, 3.6]
,预测结果y_pred = [1, 2, 3]
我们使用平方误差来衡量y_data
与y_pred
之间的差异程度
对于前者:
L = ∑ ( . . . ) L = \sum(...) L=∑(...)
>>> tf.reduce_sum(tf.square(y_pred - y_data)).eval() # loss
0.86 # 0.25 + 0.25 + 0.36
对于后者:
L = 1 n ∑ ( . . . ) L = \frac{1}{n}\sum(...) L=n1∑(...)
loss
将会是原来的1/3
即0.86 / 3 = 0.287
对于梯度的反向传导,使用前者(求和)的梯度将会是使用后者(求均)的梯度的3倍,那么如果你的学习率较大,可能会更新过快而导致跳过了最优点;相反,使用后者的时候也可能由于梯度更新过小而陷入局部极小值点,具体情况需要根据训练模型及优化器而定。