>loss值与准确率的关系
下图是seq2seq模型训练loss值曲线,训练语料集1541组对话,训练了10轮,曲线图是第6轮到第10轮loss值收敛曲线,loss值按升序排序。
从曲线图中可以看到,随着训练轮数增加,loss值有向0.0收敛的趋势,准确率也随着训练轮数上升。把准确率换算成样本数,在loss曲线图上画一条竖直线,与loss曲线的交点是预测是否正确的loss阀值,如上图虚线所示,下图是放大图。
从上图可以看到,交叉点的左边样本是预测正确的样本,右边是预测不正确,还没有训练好的样本。各轮的loss值接近,如果用上一轮的loss阀值近似估计下一轮准确率,可以以交叉点为起点,向右画一条水平线,水平线与各轮loss曲线的交点,近似的划分了预测正确与不正确的样本,见下表。
从表中可以看到,使用loss阀值估算下一轮准确率最大正偏差是19.6%,最大的负偏差是-14.5%,使用loss阀值可以近似估算训练准确率。在seq2seq模型中,计算准确率需要把所有样本预测计算一次,相当于训练一轮,是很耗时间的,为了减少训练时间,一般间隔10-50轮计算一次准确率,每轮训练loss值是必须计算,可以使用loss阀值估算准确率,而在隔10-50轮计算出准确率时,根据准确率误差修正loss阀值,减少估算的准确率的误差。
>程序流程图
>Python代码
使用loss阀值计算准确率
##使用loss阀值计算准确率
def acc_by_costs(costs,threshold):
estimation = 0
for c in costs:
if c < threshold:
estimation += 1
return estimation
更新loss阀值
def threshold_renew(acc, costs, cost_bias, steps):
if acc > 0.05:
acc_num = steps * acc
for i in range(1,100001):
threshold = i/100000*(cost_mean + 5)
if acc_by_costs(costs,threshold) >= acc_num:
cost_bias = threshold
print("new cost_bias:",cost_bias)
break
return cost_bias