eq2seq模型用loss值分布近似计算准确率

>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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值