一、使用流程
使用 tape.gradient(ys, xs) 自动计算梯度;
使用 optimizer.apply_gradients(grads_and_vars) 自动更新模型参数。
X = tf.constant(X)
y = tf.constant(y)
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]
num_epoch = 10000
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
for e in range(num_epoch):
# 使用tf.GradientTape()记录损失函数的梯度信息
with tf.GradientTape() as tape:
y_pred = a * X + b
loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y))
# TensorFlow自动计算损失函数关于自变量(模型参数)的梯度
grads = tape.gradient(loss, variables)
# TensorFlow自动根据梯度更新参数
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
print(a, b)
特别提示:
loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y))
损失函数为:
tf.reduce_sum(): Computes the sum of elements across dimensions of a tensor.(计算张量各维元素之和)
tf.reduce_mean(): Computes the mean of elements across dimensions of a tensor.(计算张量各维元素的平均值)
tf.reduce_std(): Computes the standard deviation of elements across dimensions of a tensor.(计算张量各维元素的标准方差)
二、TensorFlow优化算法
优化算法的目标: 如果说让损失函数的越来越小是深度学习的性能指标。那么让损失函数趋向极小值的同时,令这个过程越短越好,就是优化算法的目标。
optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate)
两个阵营:
- 基于梯度递减的优化
- 牛顿方法(Newton Method):为了改善牛顿法在数值计算(如病态Hessian矩阵)上的不稳定性,通常使用它的近似版本—拟牛顿法(quasi-Newton Method)
2.1 基于梯度递减的优化:常见梯度下降优化器(学习率)
利用一阶收敛寻找极值
2.1.1 梯度递减(基础)
三种方法区别:每次参数更新时计算的样本数据量不同,下面分别给予简单介绍。
SGD(随机梯度递减法): Stochastic Gradient Descent
BGD(批量梯度递减法): Batch Gradient Descent
MGD(小批量梯度递减): Mini-Batch Gradient Descent
2.1.2 基于梯度递减的优化(提升)
Adam: Adaptive Moment Estimation
Adam使用动量和自适应学习率来加快收敛速度。
AdaGrad:自适应梯度算法
参数更新法则:
其中,
AdaDelta:
RMSprop:
Momentum:动量优化法
2.2 牛顿方法 —> 拟牛顿方法
利用二阶收敛寻找极值:收敛速度快
DFP:
BFGS:
L-BFGS:
三、常见损失函数(代价函数、目标函数)
损失函数: 度量实际输出 y_i 与预测值 y^_i的“落差”(差异)程度。
其中,N是参与训练的样本数量。
3.1 MAE(平均绝对误差):Mean Absolute Error
tf.keras.losses.MeanAbsoluteError()
3.2 MSE(均方误差):Mean Squared Error
tf.keras.losses.MeanSquaredError()
MAE和MSE的主要区别在于,MSE损失相比MAE损失通常可以更快地收敛,但MAE损失对于孤立点(Outlier)更加健壮,即更不易受到孤立点的影响。这是因为MSE的平方项,放大了孤立点带来的差异。
3.3 CE(交叉熵):Cross Entropy Loss 也被称为 Softmax Loss
其中,c_j 是样本 x_i 的目标类。若从不确定性上考虑,则交叉熵表示的是在给定的真实分布下,使用非真实分布所指定的策略来消除系统的不确定性所需要付出的努力大小。
二分类交叉熵损失函数:
loss = tf.keras.losses.binary_crossentropy(y_true=y, y_pred=y_pred)
多分类交叉熵损失函数:
loss = tf.keras.losses.categorical_crossentropy(y_true=y, y_pred=y_pred)
参考资料
《简单粗暴TensorFlow 2.0》进击的皇虫
《深度学习与TensorFlow实践》张玉宏