首先我们构想一个简单的问题,将红绿蓝三个小球进行分类,在计算机中,我们将这三类会赋予 1,2,3,的值。但这会导致一个问题,其实三种颜色是并列关系,但是从数字上,我们会感觉 1-2 会比 1-3 的关系更加接近,这会导致分类的不准确,所以我们会使用 one-hot vector 对这种情况进行分类,如下图所示:

我们希望归类只输出 0 和 1,但经过模型输出后 y 可能是任何值,所以我们需要softmax 操作进行归一化并去除负值,softmax 附加的一个效果是能让两个不同的 y 的差值更加的大(例如 1 和 3,经过 softmax 操作后成为 0.1 和 0.9 )

在最后一步我们经常使用 corss-entropy 进行进行输出 y 值和理想 y 值的距离

举一个实战案例:宝可梦和数码宝贝分类

STEP 1:我们需要构想,如果有一个函数,它应该长什么样,能够有功能去分类宝可梦和数码宝贝?(这是传统方法,现在机器学习基本上是端到端,减少人工提取特征的次数)

经过观察发现,数码宝贝的笔画比较复杂,宝可梦的线条比较简单,所以我们设计一个函数来描述线条的复杂程度去进行分类。

我们通过计算白色在图片中的占比,来进行分类,那么现在问题就转换为:找到一个合适的分界线(笔画数)来进行分类。假设分界线的选择有 1-10000,那么这个范围称为模型的复杂度。

STEP2:定义我们的 loss 函数

分类错了输出 1,分类对了输出 0,然后对所有输出求和,数字越大错误率越高(使用交叉熵也可以,但这种方法更加直观,因为这是非常简单的分类,有没有微分形式并不重要)

STEP3:得到分类方法(如何得到良好的训练集)

在定义 loss 函数之后,我们希望有一个较好的训练集,能让我们在训练集上训练的函数,在测试集上有良好的表现,那我们该如何评价一个训练集的好坏呢?有以下公式:h 是训练集中尝试的 threshold

所以根据上面的公式,如果我们希望得到较差训练集的概率变低,就可以增大 N(训练集的数量)或减小 H(降低模型的复杂度)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐