每个程序员都应该知道的 40 个算法(四)(4)

简介: 每个程序员都应该知道的 40 个算法(四)

每个程序员都应该知道的 40 个算法(四)(3)https://developer.aliyun.com/article/1506368

理解伦理和算法

通过算法制定模式可能会直接或间接导致不道德的决策。在设计算法时,很难预见潜在的道德影响的全部范围,特别是对于大规模算法,其中可能涉及多个用户。这使得分析人类主观性的影响变得更加困难。

越来越多的公司将算法的道德分析作为其设计的一部分。但事实是,问题可能直到我们发现一个有问题的用例才会变得明显。

学习算法存在的问题

能够根据不断变化的数据模式进行自我调整的算法被称为学习算法。它们处于实时学习模式,但这种实时学习能力可能具有道德影响。这可能导致它们的学习结果在道德上存在问题。由于它们被创建为处于持续进化阶段,几乎不可能对它们进行持续的道德分析。

随着算法复杂性的增加,要完全理解它们对社会中个人和群体的长期影响变得越来越困难。

理解道德考虑

算法解决方案是没有感情的数学公式。负责开发算法的人有责任确保它们符合我们试图解决的问题周围的道德敏感性。这些算法的道德考虑取决于算法的类型。

例如,让我们看看以下算法及其道德考虑。一些需要仔细考虑道德问题的强大算法的例子如下:

  • 分类算法在社会上的使用决定了个人和群体的塑造和管理方式。
  • 在推荐引擎中使用算法时,可以将简历与求职者(个人和群体)进行匹配。
  • 数据挖掘算法用于从用户那里挖掘信息,并提供给决策者和政府。
  • 政府开始使用机器学习算法来决定是否向申请人发放签证。

因此,算法的道德考虑将取决于使用情况以及它们直接或间接影响的实体。在开始使用算法进行关键决策之前,需要从道德角度进行仔细分析。在接下来的部分中,我们将看到在进行算法的仔细分析时应该牢记的因素。

不确定的证据

用于训练机器学习算法的数据可能没有确凿的证据。例如,在临床试验中,由于有限的可用证据,一种药物的有效性可能无法得到证实。同样,可能存在有限的不确定证据表明某个城市的某个邮政编码更有可能涉及欺诈。我们在基于通过这些有限数据找到的数学模式做出决策时应该谨慎。

基于不确定的证据做出的决定很可能导致不合理的行为。

可追溯性

机器学习算法在训练阶段和测试阶段之间的脱节意味着如果算法造成了一些伤害,很难追踪和调试。此外,当发现算法中存在问题时,很难确定受到影响的人。

误导的证据

算法是数据驱动的公式。垃圾进,垃圾出GIGO)原则意味着算法的结果只能像其基础数据一样可靠。如果数据中存在偏见,它们也会反映在算法中。

不公平的结果

算法的使用可能会对已处于不利地位的脆弱社区和群体造成伤害。

此外,已经证明使用算法分配研究资金在多个场合上对男性人口存在偏见。用于授予移民的算法有时会无意中对脆弱人口群体存在偏见。

尽管使用高质量的数据和复杂的数学公式,如果结果是不公平的,那么整个努力可能会带来更多的伤害而不是好处。

减少模型中的偏见

在当前世界中,基于性别、种族和性取向已知的、有充分记录的一般偏见。这意味着我们收集的数据预计会展现出这些偏见,除非我们处理的是一个在收集数据之前已经努力消除这些偏见的环境。

算法中的所有偏见,直接或间接地都是由人类偏见造成的。人类偏见可以体现在算法使用的数据中,也可以体现在算法本身的制定中。对于遵循CRISP-DM跨行业标准流程)生命周期的典型机器学习项目,该生命周期在第五章中有解释,图算法,偏见看起来像这样:

减少偏见最棘手的部分是首先识别和定位无意识的偏见。

解决 NP-hard 问题

NP-hard 问题在第四章中得到了广泛讨论,设计算法。一些 NP-hard 问题很重要,我们需要设计算法来解决它们。

如果由于其复杂性或可用资源的限制而发现解决 NP-hard 问题似乎是不可能的,我们可以采取以下其中一种方法:

  • 简化问题
  • 定制一个已知解决方案以解决类似问题
  • 使用概率方法

让我们逐一看看它们。

简化问题

我们可以基于某些假设简化问题。解决的问题仍然给出的解决方案并不完美,但仍然具有洞察力和有用。为了使其起作用,所选择的假设应尽可能不受限制。

示例

在回归问题中,特征和标签之间的关系很少是完全线性的。但在我们通常的操作范围内可能是线性的。将关系近似为线性大大简化了算法,并且被广泛使用。但这也引入了一些影响算法准确性的近似。近似和准确性之间的权衡应该被仔细研究,并且应选择适合利益相关者的正确平衡。

定制一个已知解决方案以解决类似问题

如果已知类似问题的解决方案,那么可以将该解决方案用作起点。它可以定制以解决我们正在寻找的问题。机器学习中的迁移学习TL)就是基于这一原则。其思想是使用已经预先训练的模型的推理作为训练算法的起点。

示例

假设我们想要训练一个二元分类器,它可以基于实时视频流使用计算机视觉在企业培训期间区分苹果和 Windows 笔记本电脑。从视频流中,模型开发的第一阶段将是检测不同的物体并确定哪些物体是笔记本电脑。一旦完成,我们可以进入第二阶段,制定可以区分苹果和 Windows 笔记本电脑的规则。

现在,已经有经过良好训练、经过充分测试的开源模型,可以处理这个模型训练的第一阶段。为什么不以它们作为起点,并将推理用于第二阶段,即区分 Windows 和苹果笔记本电脑?这将使我们有一个快速起步,解决方案在第一阶段已经经过充分测试,因此错误更少。

使用概率方法

我们使用概率方法来获得一个相当不错的解决方案,但并非最佳解决方案。当我们在第七章中使用决策树算法来解决给定问题时,解决方案是基于概率方法的。我们没有证明这是一个最佳解决方案,但它是一个相当不错的解决方案,可以为我们在需求定义中规定的约束条件下提供一个有用的答案。

例子

许多机器学习算法从一个随机解决方案开始,然后迭代地改进解决方案。最终的解决方案可能是有效的,但我们无法证明它是最好的。这种方法用于解决复杂问题,以在合理的时间范围内解决它们。这就是为什么对于许多机器学习算法来说,获得可重复的结果的唯一方法是使用相同的种子来使用相同的随机数序列。

何时使用算法

算法就像从业者工具箱中的工具。首先,我们需要了解在给定情况下哪种工具是最好的。有时,我们需要问自己,我们是否有解决问题的解决方案,以及部署解决方案的正确时间是什么。我们需要确定算法的使用是否能够提供一个实际有用的解决方案,而不是其他替代方案。我们需要分析使用算法的效果,从三个方面来看:

  • 成本:能否证明与实施算法相关的成本?
  • 时间:我们的解决方案是否比更简单的替代方案使整个过程更有效?
  • 准确性:我们的解决方案是否比更简单的替代方案产生更准确的结果?

为了选择正确的算法,我们需要找到以下问题的答案:

  • 我们是否可以通过做出假设来简化问题?
  • 我们将如何评估我们的算法?关键指标是什么?
  • 它将如何部署和使用?
  • 它需要解释吗?
  • 我们是否理解了三个重要的非功能性要求-安全性、性能和可用性?
  • 是否有预期的截止日期?

一个实际的例子-黑天鹅事件

算法输入数据,处理并制定它,并解决问题。如果收集的数据是关于一个极具影响力且非常罕见的事件,我们如何使用由该事件生成的数据以及可能导致大爆炸的事件?让我们在本节中探讨这个方面。

纳西姆·塔勒布在他的 2001 年的书《被随机愚弄》中用黑天鹅事件的比喻来代表这些极其罕见的事件。

在黑天鹅首次在野外被发现之前,几个世纪以来,它们被用来代表不可能发生的事情。在它们被发现后,这个术语仍然很受欢迎,但它所代表的含义发生了变化。现在它代表着一些如此罕见以至于无法预测的事情。

塔勒布提供了将事件分类为黑天鹅事件的四个标准。

将事件分类为黑天鹅事件的四个标准

决定罕见事件是否应该被分类为黑天鹅事件有点棘手。一般来说,为了被归类为黑天鹅,它应该符合以下四个标准。

  1. 首先,一旦事件发生,对观察者来说,它必须是一个令人震惊的惊喜,例如在广岛投下原子弹。
  2. 事件应该是一场轰动一时的事件-一场颠覆性的重大事件,比如西班牙流感的爆发。
  3. 一旦事件发生并尘埃落定,作为观察者群体的数据科学家应该意识到实际上这并不是那么令人惊讶。观察者们从未注意到一些重要的线索。如果他们有能力和主动性,黑天鹅事件本来是可以预测的。例如,西班牙流感爆发之前有一些被忽视的线索。此外,曼哈顿计划在原子弹实际投放广岛之前已经运行了多年。观察者群体只是无法将这些线索联系起来。
  4. 当事件发生时,虽然黑天鹅事件的观察者们感到终身的惊讶,但也许有些人对他们来说根本不是什么惊讶。例如,多年来致力于开发原子弹的科学家们,使用原子能从未是一个惊讶,而是一个预期的事件。

将算法应用于黑天鹅事件

黑天鹅事件与算法相关的主要方面有:

  • 有许多复杂的预测算法可用。但如果我们希望使用标准的预测技术来预测黑天鹅事件作为预防措施,那是行不通的。使用这种预测算法只会提供虚假的安全感。
  • 一旦黑天鹅事件发生,通常不可能准确预测其对包括经济、公众和政府问题在内的更广泛社会领域的影响。首先,作为一种罕见事件,我们没有正确的数据来供给算法,也没有掌握我们可能从未探索和理解的更广泛社会领域之间的相关性和相互作用。
  • 需要注意的一点是,黑天鹅事件并不是随机事件。我们只是没有能力关注最终导致这些事件发生的复杂事件。这是算法可以发挥重要作用的领域。我们应该确保在未来有一种策略来预测和检测这些小事件,这些事件随着时间的推移组合在一起产生了黑天鹅事件。

2020 年初的 COVID-19 爆发是我们这个时代最好的黑天鹅事件的例子。

前面的例子显示了首先考虑和理解我们试图解决的问题的细节,然后提出我们可以通过实施基于算法的解决方案来为解决方案做出贡献的重要性。没有全面的分析,如前所述,使用算法可能只能解决复杂问题的一部分,达不到预期。

总结

在本章中,我们了解了在设计算法时应考虑的实际方面。我们探讨了算法可解释性的概念以及我们可以在不同层面提供它的各种方式。我们还研究了算法中潜在的道德问题。最后,我们描述了在选择算法时要考虑的因素。

算法是我们今天所见证的新自动化世界中的引擎。了解、实验和理解使用算法的影响是很重要的。了解它们的优势和局限性以及使用算法的道德影响将在使这个世界成为一个更好的居住地方方面产生深远影响。这本书正是为了在这个不断变化和发展的世界中实现这一重要目标而做出的努力。

相关文章
|
2月前
|
负载均衡 监控 算法
每个程序员都应该知道的 6 种负载均衡算法
每个程序员都应该知道的 6 种负载均衡算法
232 2
|
3月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
62 1
|
4月前
|
算法 搜索推荐 程序员
程序员常用算法详细讲解
每一种算法都有其适用场景,了解并熟悉这些常用算法的策略和实现,对于解决实际编程问题具有重要的意义。需要注意的是,理论知识的重要性虽然不言而喻,但真正的理解和掌握,还需要在实践中不断地尝试和错误,以达到深入理解的目的。
41 1
|
4月前
|
机器学习/深度学习 算法 搜索推荐
程序员必须掌握的算法
作为一名程序员,掌握一些重要的算法是必不可少的。算法是解决问题的方法和步骤,对于程序员来说,熟悉和掌握一些常见的算法可以提高编程能力,解决复杂的计算问题。与此同时,算法是计算机科学中的核心概念,对于程序员来说,掌握一些基本的算法是非常重要的。
53 1
|
6月前
|
算法 程序员
程序员必知:XGB算法梳理
程序员必知:XGB算法梳理
34 0
|
6月前
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
36 0
|
7月前
|
机器学习/深度学习 人工智能 算法
每个程序员都应该知道的 40 个算法(四)(3)
每个程序员都应该知道的 40 个算法(四)
50 2
|
7月前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。