首页 > 其他分享 >【机器学习】三种基本损失函数

【机器学习】三种基本损失函数

时间:2024-04-19 11:22:34浏览次数:30  
标签:10 机器 函数 硬币 信息量 sum 三种 事件 log

参考:

三种基本损失函数

任务:衡量人脑与神经网络在判断一张图片是不是猫这个问题上的差异。

\(x_i\) 是人工打上的一个标签,0代表不是猫,1 代表是猫。

\(y_i\) 是神经网络输出一个概率,表示这个图片是猫的概率。

\(W,b\) 是神经网络的参数,由参数得到一个 \(y_i\)。

image-20240418170321653

1、最小二乘法

在上述问题中,最简单的方式就是直接比较人脑与神经网络的区别。

如果两个值相差的越小,就可以很直观的理解为这两个模型越相似。

对于一张图片人打上的标签是 \(x_1\) ,而神经网络跑出的结果是 \(y_1\),直接把他们相减,就是他们之间的相差有多大。

\[|x_1-y_1| \]

因为绝对值函数在零点可能会存在不可导的情况,因此我们对其平方,让他处处可到。

\[(x_1-y_1)^2 \]

这是对于一张图片,刻画的差异程度,所有图片的差异程度加在一起,就可以量化人脑与神经网络在该问题上的差异。

\[\sum_{i=1}^{n}(x_i-y_i)^2 \]

当这一个值最小的时候,我们就可以认定人脑与神经网络这两个模型的差异最小。

\[min\sum_{i=1}^{n}(x_i-y_i)^2 \]

从这个式子我们也可以看出为什么这个方法叫做最小二乘法

2、极大似然估计法

极大似然就是概率的反向应用。

2.1、似然值

我们知道在抛硬币问题中,硬币正面朝上,或者硬币反面朝上的概率都是0.5。理想情况下,抛 10 次硬币获得的结果应该是 5 次朝上,5 次朝下。但实际情况却是各种情况都可能出现。

image-20240418181734252

这是我们从理论去思考实践,如果我们已知抛出的硬币的情况,然后考虑概率模型是什么,这就是似然的过程。

如下图所示,抛 10 次硬币,正面朝上 7 次,反面朝上 3 次,左边三种概率模型都有可能得到。

image-20240418182326086

但是这三种模型是不平等的,哪一种模型更有可能是该事件的模型呢?当事件,以及模型都确定时,我们是可以计算的。左边的式子中 \(\theta\) 表示的是某种确定的概率分布(如抛一次硬币,正面朝上的概率是 \(0.7\) ,反面朝上的概率是 \(0.3\))。\(c_{1\to10},\)表示的是抛了 \(10\) 次硬币,每次的情况。

整个左边表示的是在 \(\theta\) 这种概率分布下,发生抛 \(10\) 次抛出 \(c_{1\to10}\) 这样的结果发生的可能性。

\[P(c_1,c_2,···,c_{10}|\theta) =\prod_{i=1}^{10}{P(c_1|\theta)} \]

真实的事件已经发生,我们假设它有很多的模型,在一个概率模型下,发生当前事件的可能性,就是这个概率模型的似然值。

下图就列举了,抛 \(10\) 枚硬币,发生的事件为 \(7\) 次为正, \(3\) 次为负,对应 3 种概率模型的似然值。

image-20240418184142944

虽然我们可能永远都不知道准确的概率模型是什么,但是我们选似然值最高的模型,它也就最可能是准确的模型。这就是极大似然估计法。

极大似然估计法,适用于已知事件发生的结果,去反推事件原本的模型是什么。

2.2、神经网络与人脑似然

现在回到判断一个图片是不是猫这个问题上。

在抛硬币的问题中 \(c\) 表示抛硬币最终得到的结果,在图像识别问题中 \(x\) 就表示人打的标签(0就不是猫, 1 就是猫)。

在抛硬币问题中 \(\theta\) 表示概率模型,在图像识别问题中 \(W,b\) 表示网络的参数,我们可以认为一组 \(W,b\) 可以确定一个描述图片是否为猫的概率模型。网络参数可以得到一个输出,表示神经网络认为图片是猫的概率。

\[P(c_1,c_2,···,c_{10}|\theta) & = & \prod_{i=1}^{10}{P(c_1|\theta)} \\ P(x_1,x_2,···,x_{n}|W,b) & = & \prod_{i=1}^{n}{P(x_i|W,b)} \\ & = & \prod_{i=1}^{n}{P(x_i|y_i)} \\ \]

其中 \(x \in \{0,1\}\),且

\[f(x) = p^x(1-p)^{1-x} = \begin{cases} p, x = 1 \\ 1-p,x = 0 \end{cases} \]

那么上式就可以化为

\[\prod_{i=1}^{n}{{y_i}^{x_i}(1-{y_i})^{1-{x_i}}} \]

计算到这里其实就可以结束了,这里我们人为的加上 log 化乘为加

\[log(\prod_{i=1}^{n}{{y_i}^{x_i}(1-{y_i})^{1-{x_i}}}) \\ &=& \sum_{i=1}^{n}{log({y_i}^{x_i}(1-{y_i})^{1-{x_i}})} \\ &=& \sum_{i=1}^{n}[x_i\log{y_i} + (1-x_i)\log{(1-y_i)}] \\ \]

最终,最大化似然值,相当于最小化负对数似然:

\[min-(\sum_{i=1}^{n}[x_i\log{y_i} + (1-x_i)\log{(1-y_i)}]) \]

3、交叉熵

3.1、信息量

一种情况下能减少不确定性的任何事物都可称为信息。

信息量可以用来用来衡量一个事件发生的惊奇程度。

对于事件,我们用一个离散型随机变量来描述 \(X\) ,其概率密度函数为 \(p(X=x)\)。如果一个事件发生的可能性越小,但它却发生了,是不是就可以理解为这个事件带给我们的惊奇程度非常大。

所以当 \(p(x)\) 很小时,信息量应该会很大,再来理解信息量定义的公式:

\[ -\log_2{p(X)} \]

由于\(0\le p(x)\le1\) ,所以需要有一个符号,使得\(信息量 \ge0\) 。

3.2、熵

熵是随机变量不确定度的度量。如果熵比较大,表示整个状态越难以预测,愈加的混乱。

注意:

  • 信息量描述的是一个事件(\(X\) 的某一个取值),比如抛一次硬币结果为正面
  • 而熵描述的是一个系统,一个随机变量(\(X\) 的所有取值),比如抛硬币这件事情。

在信息量的基础上,如何理解熵的定义呢?

如果简单的将随机变量的所有事件对应的信息量相加,定义得到的结果为熵,有没有问题呢?

比如一个二元事件

x=1 x=0
p(x=1) = 0.99 p(x=0)=0.01

计算得到熵的结果为

\[H(X) = -\log_2{0.99} -\log_2{0.01} \approx 6.6584 \]

再考虑另一个二元事件

x=1 x=0
p(x=1) = 0.5 p(x=0)=0.5

计算得到熵的结果为

\[H(X) = -\log_2{0.5} -\log_2{0.5} \approx 2 \]


从直观的感受来说,上面事件整体带给我们的不确定性是非常小的,但是计算出来的熵的值却比下面要大。

这个时候我们再来看熵的定义式子:

\[H(X) = -\sum_{x\in X}{p(x)\log{p(x)}} \]

在之前的基础上多乘了一个概率本身,可以理解为单个事件的信息量,对于整个事件熵贡献的权重。

规定 \(0\log0 =0\) ,因为加上 \(0\) 概率的项,不改变其熵的值。

\(H(X)\) 可以理解为信息量 \(-\log(p(x))\) 的期望值

3.3、相对熵

相对熵是两个随机分布之间的距离的度量。在统计学中,它对应的是似然比的对数期望。

相对熵 \(D(p||q)\) 度量当真实分布为 \(p\) 而假定分布为 \(q\) 时的无效性。

KL散度是用来度量使用基于Q的分布来编码服从P的分布的样本所需的额外的平均比特数

两个概率密度函数为 \(p(x)\) 和 \(q(x)\) 之间的相对熵或 \(KL\)距离 定义为:

\[D(p||q) &= &\sum_{x \in X} p(x)\log{\frac{p(x)}{q(x)}} \\ &=&\sum_{x \in X}p(x)[\log{p(x)}-\log{q(x)}]\\ &=&\sum_{x \in X}-p(x)\log{q(x)}-\sum_{x \in X}-p(x)\log{p(x)} \]

可以证明,相对熵总是非负的,且当 \(p==q\) 时为零。

可以发现,由于 \(p(x)\) 表示的是真实的分布,那么他的熵是不变的,也就是推导最后的 \(-\sum -p(x)\log{p(x)}\) 是不变的。我们如果想要使得两个随机分布之间的距离最小化,也就是使得 \(\sum{-p(x)\log{q(x)} }\) 最小化。这个式子称为交叉熵。

3.4、交叉熵

给定两个概率分布 \(p,q\) ,\(p\) 相当于 \(q\) 的交叉熵定义为:

\[H(p,q) = -\sum_{x}{p(x)\log{q(x)}}=D(p||q)+H(p) \]

image-20240418170321653

再回到我们最开始的问题中:

\(x_i\) 对应 \(p(x)\) 表示真实的概率分布,而 \(y_i\) 就表示估计的概率分布,我们用交叉熵来度量,真实的情况与估计的情况的偏差是多少。对于一张图片来说其交叉熵为

\[H(x_i,y_i) =-[x_i\log{y_i}+(1-x_i)\log(1-y_i)] \]

因为 \(x\) 只有 \(\{0,1\}\) 两种情况,对于整个数据集的 \(n\) 张图片,总的交叉熵就为:

\[H(x,y) =-\sum_{i=1}^{n}[x_i\log{y_i}+(1-x_i)\log(1-y_i)] \]

标签:10,机器,函数,硬币,信息量,sum,三种,事件,log
From: https://www.cnblogs.com/hoppz/p/18145417

相关文章

  • 如何用Python构建一个生产级别的电影推荐系统 - 机器学习手册
    构建项目是彻底学习概念并发展必要技能的最有效方式之一。项目使您沉浸在现实世界的问题解决中,巩固您的知识,并培养批判性思维、适应能力和项目管理专业知识。本指南将带您逐步构建一个根据用户喜好量身定制的电影推荐系统。我们将利用一个庞大的包含10,000部电影的数据集作为......
  • c++函数模板和运行机制
    C++_templatec++提供了函数模板(functiontemplate.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函......
  • MySQL常用管理命令、常用函数小计
    1、Windows系统是MySQL服务器的关闭、重启 (mysql为服务名)关闭服务:netstopmysql启动服务:netstartmysql 2、连接mysql服务器在cmd窗口执行命令:mysql-h127.0.0.1-P3306-uroot-p -h127.0.0.1:指定主机IP  -P3306:执行mysql服务端口......
  • shell系统函数和流程控制
    系统函数:1、简单示例:点击查看代码#!/bin/bashfilename="$1"_log_$(datename+%S)echo$filenamebasename:基本语法:basename[string/pathname][suffix](功能描述:basename命令会删掉所有的前缀包括最后一个('/')字符,然后将左右字符显示出来。basename可以理解为路......
  • MYSQL 8 窗口函数的优点
    窗口函数的特点是可以分组,而且可以在分组内排序。另外,窗口函数不会因为分组而减少原表中的行数I这对我们在原表数据的基础上进行统计和排序非常有用。递归调用 复杂报表统计能力增强:窗口函数允许在数据集(窗口)内进行行级别的运算,而不会像传统聚合函数那样折叠所有行到单个输......
  • 千分位分隔函数
    点击查看代码添加千分位functionaddThousandSeparator(num,separator=","){returnnum.toString().replace(/\B(?=(\d{3})+(?!\d))/g,separator);}num.toString():将输入的数字num转换为字符串,以便后续处理。.replace(/\B(?=(\d{3})+(?!\d))/g,separator......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        鉴于农村地区的教学条件有限,教师师资力量不足等方面问题非常突出,直接影响了高中生的数学知识学习效果。为了可以提高高中生学习数学知识的效果,就必须要强化数学思想的贯彻,保证持续提高高中生的数学学力。其中二次函数题型是当下高中数学教学中的重要题型之一,主要是围绕......
  • 鸿蒙开发TypeScript语言:【函数】
    函数是一组一起执行一个任务的语句。您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。函数定义函数......
  • 【Python微信机器人】写一个监控采集公众号文章的插件
    原文链接:https://mp.weixin.qq.com/s/f8zbM6wMld3koqjaFbCuxw前言弄了个视频号下载后,同一个问题每天都会被问,回答的有点烦了。想了想根本原因还是缺少一个交流平台,微信群的话,刚进群的看不到之前的聊天记录。想整个知识星球,发现只能弄个收费的,免费的需要激活码才能创建。而有......
  • 虚函数与多态
    虚函数前有virtual关键字的成员函数classbase{ virtualintget();}intbase::get{}virtual关键字只用在类的定义里的函数声明构造函数与静态成员函数不能是虚函数多态表现形式一派生类的指针可以赋给基类的指针通过基类指针调用基类和派生类中的同名虚函数......