什么是损失函数与平均误差算法分析
Posted 17岁boy想当攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是损失函数与平均误差算法分析相关的知识,希望对你有一定的参考价值。
目录
损失函数概念
这里通过一组简单的Demo来做演示,例如摄氏度到华氏度的转换,给学习框架一组对应关系的数据,并让AI去不停的推理,经过时间的计算与推理可以发现两组数据之间的正比例关系。
那么这其中是有误差的,这个误差是由谁来记录的?
答案:损失函数,loss
损失函数的作用就是记录这组误差,并且在无数此的学习中不停的优化误差,当误差越小,则预测结果越准确,误差就是用来做补偿的。
首先我们通过一组简单的数据来讲述:
上面一组是摄氏度,下面一组是华氏度
-40,-10,0,8,15,22,38
-40,14,32,46,59,72,100
它们俩是有对应关系的,这组数据交给神经网络去训练,AI会去进行观测,并且对每次观测数据进行记录,比如记录第一组数据的第一个值与第二组数据的第二个值的差值是多少,第一组第一个值与第二组第二个值差值是多少... 不停的去观测,此时需要记录每次观测的差值是多少,所以就需要一个方法来记录差值,所以就诞生了损失函数。
损失函数将值记录起来:观测值与预期值的差值,每次都记录起来,在最终预测时输出结果时会加上损失函数作补偿,理论上来说损失函数越小的情况下,代表这组模型准确率越高,因为意味着每次预期误差其实并不大,AI在训练时会不停的进行预测,来优化自身算法公式里的参数值。
平均误差算法
在损失函数中最著名的就是平均误差算法,以下是它的算法公式
y是预期值,i是次数,因为每次观测都会被记录,i代表次数,k*xi是观测值,因为AI会去猜,k在什么情况下乘上xi是正确值,AI会不停的去猜k是多少,让k不停的变化直到结果等于0的情况下就代表这组观测数据是正确的,AI会不停的去修改k的值,yi-k*xi的值越来越小,甚至等于0,AI会找到最合适的K值。
后面的平方符号是为了防止出现负数,因为出现负数很明显是不正确的,因为最终结果是需要除去n的,这里n的值是总观测次数,上面也说过,每次观测值都需要被记录,损失函数还会记录总共观测了多少次,最终将总误差值在除于总的观测次数,就得到了平均误差值了,所以这就是平均误差算法的核心思路。
在之我们已经分析出这个算法公式的主要思路,那么我们可以通过编程来实现它,因为损失函数是用在训练上,如果我们再写一套CNN属实复杂化了,这里我写一套伪代码,来将上述算法公式转化为代码,这样看的就会更清晰
以下代码仅仅是用代码表示公式的伪代码
#include <stdio.h>
//获取数组实际数量
#define ArrSize(arr,type) sizeof(arr)/type
//用于猜最合适的k值
#define GUESS 12500
#define DAMAGE 1.35f
//观测值与预期结果值,也称为样本与学习样本
int centigrade[] = {-40,-10,0,8,15,22,38};
int fahrenheit[] = {-40,14,32,46,59,72,100};
//记录合适k值
int k_arr[GUESS] = {0};
double aueragLoss(int* observation,int* learning,int len1,int len2,int guess){
double loss = 0.0f; //损失值
int n = 0; //记录观测次数
int j = 0; //学习样本索引
int k = guess; //猜测k值
//空指针判断
if(observation == NULL || learning == NULL){
return 0.0f;
}
//开始观测
for(int i = 0;i<len1;++i,j++){
//为了防止观测数据集长度大于学习样本索引出现内存溢出风险,这里做一个判断
if(j >= len2){ //数组下标从0开始,所以这里在等于实际数时就应当清零
j = 0;
}
//这里的12500我们假设一个最大阈值,用来猜最合适的k值
loss = observation[i] - k*learning[j];
//记录观测数量
n++;
}
//当产生负数时进行一次平方运算,这个是可选的,你可以直接做平方也可以做判断
//算法公式是死的,思路是活的,我这里做判断是为了防止数过大,所以只在负数的情况下做平方运算
if(loss<0){
loss *= loss;
}
//最后一步,获取平均差值,就是观测总插值除于次数就可以得到平均差值
loss/=n;
//返回差值
return loss;
}
int main(){
int k_index = 0; //合适k数组索引
//这里通过不停猜测k值来检索最合适的k值
for(int k = 0;k<GUESS;++k){
double loss = aueragLoss(centigrade,fahrenheit,ArrSize(observation,int),ArrSize(learning,int),k);
printf("k为:%d时的损失:%lf\\n",k,loss);
//判断损失是否小于预设阈值,若小于则代表这个k值比较合适,应当记录
if(loss <= DAMAGE){
printf("k值为:%d时损失达到预设阈值\\n",k);
k_arr[k_index++] = k;
}
}
//打印合适k值
printf("合适k值数量有:%d\\n",k_index);
for(int i = 0;i < k_index;++i){
printf("%d ",k_arr[i]);
}
printf("\\n");
return 0;
}
在Tensor Flow里使用Keras训练时就可以看到选中损失函数的选择
model.compile(optimizer = 优化器,
loss = 损失函数,mean_squared_error、categorical_crossentropy...
metrics = ["准确率”])
mean_squared_error就是平均误差算法
以上是关于什么是损失函数与平均误差算法分析的主要内容,如果未能解决你的问题,请参考以下文章
[人工智能-深度学习-9]:神经网络基础 - 常见loss损失函数之均分误差MSE绝对值误差MAE平滑平均绝对误差Huber