TowardsDataScience 2023 博客中文翻译(三百六十一)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

Web Speech API:什么有效,什么无效,以及如何通过将其与 GPT 语言模型连接来改进它

原文:towardsdatascience.com/web-speech-api-what-works-what-doesnt-and-how-to-improve-it-by-linking-it-to-a-gpt-language-dc1afde54ced

系列文章的一部分,探讨现代人工智能和其他技术如何帮助更高效的人机交互

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 LucianoSphere (Luciano Abriata, PhD)

·发表于Towards Data Science ·阅读时间 15 分钟·2023 年 12 月 6 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由palesa提供,来源于Unsplash

我认为现代技术使得人机交互变得比目前的软件所提供的要简单和自然得多。实际上,我认为技术已经足够成熟,我们可以不依赖传统接口,向用户体验的革命迈进。

大型语言模型无疑引发了这场革命的一个阶段,特别是在我们询问信息的方式上。然而,我认为技术仍然可以提供更多。例如,尽管虚拟现实头显的成本在降低,我们仍然主要使用平面屏幕;尽管眼动追踪、语音识别和身体部位追踪等技术已达到较高水平,我们仍然使用鼠标、键盘和触控手势来操作设备;尽管语音合成技术取得了重大进展,我们仍然在大量阅读。

我认为,当前的技术已经足够成熟,能够提供几乎像《星际迷航》中那样的人机交互(如果你不明白我的意思,请查看这个),然而我们却仍然想停留在过去。

在这篇文章中,我开始了一系列短文,专注于现代技术如何使人机交互发生根本性改变,这些技术已经非常成熟,你将通过我分享的代码片段和示例应用来亲自测试。

忠于我的风格,我将特别讨论这些现代技术的基于网页的实现。我将从集成到网页浏览器中的 Web Speech API 开始,讨论其功能,展示一些用例,强调其局限性,并举例说明如何通过将其与大型语言模型结合来克服这些局限性。

本系列基于我最近参与的一个项目,旨在构建一种首创的网络应用程序,提供沉浸式、多用户的分子图形和建模功能,名为 HandMol:

[## 结合四种 AI 模型以提供终极沉浸式可视化和建模体验

继续阅读关于这款名为 HandMol 的新免费应用程序如何实现沉浸式、协作式的可视化和建模…

pub.towardsai.net](https://pub.towardsai.net/coupling-four-ai-models-to-deliver-the-ultimate-experience-in-immersive-visualization-and-modeling-9f52a4bd1443?source=post_page-----dc1afde54ced--------------------------------)

(现代)语音识别和语音合成

特别是语音识别和语音合成这两项技术,已经存在近二十年,并在推动更自然的人机互动方面提供了很多可能性。

语音识别,或称 ASR(自动语音识别)或 STT(语音转文本),将口语语言转换为书面文本。它有两个主要的广泛应用:

  • 通过口头指令控制如智能手机或计算机等硬件,最好以自然的方式进行。想象一下你如何通过语音命令使用智能手机、Alexa 或 Siri。

  • 转录(或许随后显示、存储或分析)对话中所说的内容。考虑一下会议转录、视频字幕等。

这两个应用程序直接相关于本博客文章的主题,并通过 Web Speech API 实现了对网页程序员的支持。

语音合成,或称 TTS(文本转语音),将书面文本转换为口语语言。它使计算机和其他设备能够生成类似人类的语音,使信息能够以听觉方式访问,就像你在 Medium 文章中看到的那样。

语音合成在各种场景中都有应用,包括为视力障碍用户提供的辅助功能、交互式语音响应系统以及多媒体内容的丰富化。

语音转录(STT)和语音合成(TTS)使与数字内容的互动更加包容和多样化,开辟了免提和免屏操作以及个性化用户体验的机会。

语音识别和语音合成技术的简要历史

语音识别和合成在近年来取得了显著进展,特别是随着现代 AI 模型的整合和机器学习技术的进步。它们可以追溯到 20 世纪中期,当时首次尝试使用计算机进行语言处理。早期模型在处理口音、方言、同音词和语音细微差别时面临挑战,无论是在语音生成还是理解方面。统计模型和符号自然语言处理的进步逐步改善了 ASR 系统,但在 2010 年代末期,随着变换器的引入,尤其是对 ASR 的突破性进展:通过利用注意机制,新的语音识别方法能够捕捉长期依赖关系和上下文理解,从而显著提高了语音转文本转换的准确性。

STT 比 TTS 更复杂一些,因为需要考虑更多的变量。然而,最现代的方法表现非常出色。虽然不深入细节,但现代 STT 涉及一个复杂的过程,多个阶段和 AI 模型协同工作。关键阶段包括音频输入的预处理、特征提取、音素提取、语言模型决策和解码成单词序列。现代 ASR 模型通常在所有阶段使用变换器,保留信息中的长期耦合,以提高准确性和连贯性。最先进的 ASR 系统包括直接内置在核心模块中的语言模型元素;这种原生集成被证明对高转录和识别准确性至关重要。

现代 ASR 和 TTS 技术确实能做得远远不止单纯的语音识别或合成,实际上接近于“对口语的理解”。比如,最先进的 STT 和 TTS 模型可以将音频转录为文本或从文本合成音频,支持多种语言,有些甚至能够自动识别语言,适应上下文,检测或模拟不同的说话者,用时间戳注释转录词汇,处理标点符号和非语言发声,允许自定义词典等。

如果你对 Web Speech API 中所有这些功能以及在你的 Web 应用中利用它们感到兴奋,你需要了解一些限制,这可能会让你失望,因为浏览器支持的功能还不是最先进的。然而,幸运的是,将 Web Speech API 与大型语言模型结合使用可以缓解这些问题,就像许多现代 ASR 和 TTS 技术一样,我将在这里通过编程使用 GPT-3.5-turbo 或 GPT-4 来展示这一点。如果这还不够,你还会发现有些公司提供他们自己的(付费)API 来进行最先进的 ASR 和 TTS。

Web Speech API、其组件及其可用性

Web Speech API 是一个网络标准,允许 web 应用将语音数据融入其功能中。它有两个部分:SpeechRecognition,允许语音输入和识别,以及 SpeechSynthesis,允许语音输出和合成。

Web Speech API 最早由 Google 在 2010 年提出,并在 2013 年的 Chrome 25 中实现。从那时起,它得到了其他浏览器的支持,但兼容性和功能性各不相同。根据 caniuse.com 的报告,截至 2023 年 12 月,支持情况非常不均衡,尤其是在语音识别方面:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自caniuse.com/?search=web%20speech%20api

根据我的经验,我发现 API 的语音识别模块仅在 Safari 和 Chrome 中表现良好,包括它们的 iOS 和 Android 版本。请注意,其他基于 Chromium 的浏览器,如 Brave 或 Oculus Browser(Meta 的 Quest 虚拟现实浏览器)不支持语音识别。这是因为 Google 的语音识别服务是专有的,需要许可证使用,而 Google 不授予其他浏览器使用许可证。值得注意的是,由于 Chrome 中的语音识别由基于云计算的系统处理,以用户隐私为中心的浏览器如 Brave 将面临一个艰难的决定,如果 Google 允许它们使用自己的资源进行语音识别。哦,顺便提一下,谈到隐私,请注意,所有通过 Web Speech API 进行的语音识别都需要调用的网页通过 https 提供服务!

与语音识别相反,语音合成在计算机上的所有主要浏览器(除了已被 Microsoft 的 Edge 替代的旧版 Internet Explorer,它现在支持语音合成)和大多数智能手机浏览器中都能得到妥善处理。对于 TTS,当前不强制要求 https。

接下来,我将专注于 Web Speech API 以及如何在 Chrome 中使用它,尽管原则上核心元素在所有其他支持该 API 的浏览器中应该工作相同。

使用 Chrome 的 Web Speech API

要以编程方式使用 Web Speech API,你需要创建 SpeechRecognition 或 SpeechSynthesis 接口的实例,具体取决于你想使用语音输入还是输出——或者你也可以创建两者,并在同一个应用中使用它们!

语音识别

例如,要创建一个语音识别对象,你可以简单地这样做:

var recognition = new SpeechRecognition();

然而,你最好检查一下 ASR 在浏览器中是否实际上已启用。然后,最简单的代码块看起来如下:

const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;

window.onload = function () {
  if (typeof SpeechRecognition === “undefined”) {  //Check browser can do speech recognition
    console.log(“Speech api failed”);
  } else {
    console.log(“Speech api ok”);
    const recognition = new SpeechRecognition();  //Create speech recogn object
    recognition.continuous = true;                //Define behaviour and properties, for ex. ask for continuous ASR,
    recognition.interimResults = true;            //Show partial results of ASR (i.e. when results are not yet final because speech recognition keeps going as audio progresses)
    recognition.lang = "en-US";                   //Language must be defined upfront
    recognition.onresult = (event) => {           //Triggered when a word or sentence has been recognized
      const res = event.results[last];            //If there's a list of several recognized words/sentences, retrieve the last one
      var text = res[0].transcript.trim();        //Extract and clean up text
      … //Process text
    }
    recognition.start();            //With all setup ready, start recognition
  }
}

你可以使用如上所示的对象的方法和属性来控制语音识别服务,并以最佳方式使用它。最常用的命令和属性包括startstopabortlanginterimResults等。你还可以添加事件监听器来处理对象触发的事件,例如onstartonendonresultonerror等。

一个特别值得关注的属性,遗憾的是因为负面的原因,是“grammars”。语音识别的“grammars”应该允许一个进行 ASR 的代码理解它通常无法理解或排名较低的词汇。这个功能对于纠正发音和使用名字、行话、地方表达等尤其重要。你可以在这里找到一些信息,但我不会深入细节,因为……它确实不起作用,很多人对此表示抱怨;此外,还有一个整体的趋势是从 API 中删除“grammars”,因为目前没有浏览器支持它(见这里)。

要了解有关 SpeechRecognition 对象的属性和事件的更多信息,查看此处

以及如何使用 Web 语音 API 进行语音识别的全球完整示例,请查看这个官方示例,它展示了如何通过口头命令更改网页的背景颜色:

## dom-examples/web-speech-api/speech-color-changer/script.js at main · mdn/dom-examples

附带各种 MDN DOM 和 Web API 文档页面的代码示例……

github.com

语音合成

类似地,要创建一个语音合成对象,你可以写:

var synthesis = window.speechSynthesis;

然后,你可以创建SpeechSynthesisUtterance接口的实例,这些实例代表你希望合成的特定语音请求。你可以设置 utterance 的属性,例如文本、声音、语速、音调、音量等。你可以使用对象的方法和属性来控制语音合成服务,例如 speak、pause、resume、cancel、getVoices 等。你还可以添加事件监听器来处理 utterance 触发的事件,例如 onstart、onend、onerror 等。例如,要合成文本并在开始和结束时记录日志,你可以这样写:

var utterance = new SpeechSynthesisUtterance(‘Hello world, I'm talking thanks to the Web Speech API!’);
utterance.onstart = function(event) {
  console.log(‘Speech started’);
};
utterance.onend = function(event) {
  console.log(‘Speech ended’);
};
synthesis.speak(utterance);

我在我的 Web 应用程序中真正喜欢做的是创建一个可以接收字符串并将其朗读出来的函数。我称这个函数为 speakUp(),它看起来是这样的:

function speakup(TextToSpeak) {
  if (“speechSynthesis” in window) {                            //Check TTS is supported
    const toSpeak = new SpeechSynthesisUtterance(TextToSpeak);  //Create utterance
    toSpeak.lang = “en-US”;                                     //Set language
    window.speechSynthesis.speak(toSpeak);                      //Speak!
  } else {
    console.log(“Speech synthesis not supported by browser.);
  }
}

通过 Web Speech API 进行 ASR 和 TTS 的问题,以及如何使用大型语言模型纠正其中的一些问题

Web Speech API 使用起来非常简单,如你所见。它也是免费的,不需要任何 API 密钥,也没有调用次数和频率的限制。

然而,通过反复尝试,我发现系统经常出现故障,尤其是在 ASR 方面。此外,API 有时似乎会自行关闭,许多人对此提出了问题但没有明确的解决方案。最糟糕的是,虽然免费的 API 在某些应用中可以使用,但无论是语音识别还是合成,都远未达到最先进的水平。与我在介绍中提到的现代 ASR 系统相比,Chrome 的 ASR 服务几乎无法提供任何实质性的功能!

语音识别的准确性和可靠性都不高,也不耐受口音和方言。即使有一些噪音,它也几乎没有用。它无法自动检测语言,无法识别同一对话中的多个人,标点处理还可以,但对声音化表达感到困惑等。

语音识别服务存在隐私和安全问题,因为语音数据被传输到外部服务器或第三方,而未经用户同意或了解。

语音合成服务的声音不够自然或富有表现力,尤其是对于英语以外的语言。

此外,正如我们所见,语音识别和合成服务在浏览器和设备上非常依赖,可能在不同的平台和地区不可用或不一致。

由于其能力有限,它们可能会带来伦理和社会影响,如偏见、歧视、欺骗、操控或冒充。

作为开发者和用户,你应该意识到这些局限性和挑战,并负责任且恰当地使用 Web Speech API。

通过使用大型语言模型缓解语音识别问题

上述问题中,与 ASR 相关的问题是最重要的。解决这些问题中的许多需要在最基础的识别层面采取行动。然而,与转录准确性和术语补全相关的最重要的问题可以通过大型语言模型解决,正如我通过 GPT-3.5-turbo 或 GPT-4 在 JavaScript 中编程实现的那样。

这如何工作

本质上,你通过一个提示调用语言模型,解释输入内容的样子和这些输入的输出应该是什么,然后是来自 API 识别的实际(原始)转录。

触发所有这些工作的 Web 应用程序中,语音识别用于触发命令。例如,如果用户说“放大”或“扩大”或类似的命令,那么可视化(该应用程序用于分子图形)必须放大。该应用程序的提示如下:

let theprompt = [];         //Initializing an array that will contain the prompt

theprompt.push({
  role: "system",           //Tell the mode what it will be doing
  content: "You receive texts from speech recognition and act accordingly by triggering commands, effectively correcting speech recognition as in the examples provided below. If you don't understand the request or the request is not in the list, you run the command didntUnderstand()",
  });

theprompt.push(                                      //Provide examples from hereon
 { role: “user”, content: “Make molecules bigger” },
 { role: “assistant”, content: “scale(+)}
);
theprompt.push(
 { role: "user", content: "Zoom in" },
 { role: "assistant", content: "scale(+)" }
);
theprompt.push(
 { role: "user", content: "Enlarge" },
 { role: "assistant", content: "scale(+)" }
);
theprompt.push(
 { role: "user", content: "Zoom out" },
 { role: "assistant", content: "scale(-)" }
);
theprompt.push(
 { role: "user", content: "Make smaller" },
 { role: "assistant", content: "scale(-)" }
);

让我们详细了解一下。以下是提示的系统元素:

你从语音识别中接收文本并据此执行命令,实际上纠正语音识别,如下面提供的示例。如果你不理解请求或请求不在列表中,你将运行命令 didntUnderstand()。

然后,看看用户/助手对的示例如何提供可能的输入,这些输入会产生相同或相关的输出,例如“放大”和“扩大”都导致调用 scale(+),而“缩小”调用 scale(-)。

在代码的其他部分,你会发现一些条目“教”语言模型以一种可以防止程序崩溃的方式来纠正输入,同时增加产生正确输出的机会。例如,我说的“最小化”经常被识别为“mini mice”,“ANI”这个非标准英语单词被识别为“Annie”。然后我可以用这样的示例来指导语言模型:

theprompt.push(
 { role: "user", content: "Minimize with ANI" },
 { role: "assistant", content: "minimize(ANI)" }
);
theprompt.push(
 { role: "user", content: "Minimize with Annie" },
 { role: "assistant", content: "minimize(ANI)" }
);
theprompt.push(
 { role: "user", content: "Mini mice with Annie" },
 { role: "assistant", content: "minimize(ANI)" }
);
...etc.

这个技巧效果非常好,这并不奇怪,因为归根结底,这正是现代语言模型如 Whisper 的核心,这些模型将语言模型直接嵌入到语音识别过程中!

在结束这一部分时,为了完整性,当然完整的提示必须包含在从语言模型获取的承诺中,在我的情况下,通常是 OpenAI 的 GPT-3.5-turbo 或 GPT-4:

fetch(`https://api.openai.com/v1/chat/completions`, {    //Main call to speech API
  body: JSON.stringify({
  model: “gpt-3.5-turbo”,                     //Or GPT-4, as of December 2023
  messages: theprompt,                    //The prompt just created
  temperature: 0,                         //Keep this low to avoid hallucination
  max_tokens: 20,                         //The outputs should be small commands, so this should be low
}),
  method: “POST”,
  headers: {
    “content-type: “application/json”,
    Authorization: “Bearer “ + stringWithYourAPIKey,    //API key from openAI for GPT models!
  },
}).then((response) => {
  if (response.ok) {
    response.json().then((json) => {
    var command = json.choices[0].message.content.trim();    //Extract text, which will contain commands
    console.log(command);
    if (command == ....                 //List and execute tasks 

Chrome 的 Web Speech API 的一些应用案例

除了触发这一系列博客文章的应用程序(在这里),我还可以与你分享其他使用语音识别和/或合成 API 的项目:

在这个示例中,我结合了 Chrome 的语音识别功能和 GPT-3,创建了一个从你的口述笔记和指南中编写电子邮件的 Web 应用程序:

[## 一个基于 GPT-3 的自动化电子邮件写作 Web 应用程序,来自语音笔记

我将 Chrome 的语音识别引擎与 GPT-3 结合起来,创建了一个从你的口述笔记中编写电子邮件的 Web 应用程序……

pub.towardsai.net

在这里,我展示了如何构建一个类似 chatGPT 的机器人,它可以听你说话并口头回复;同样,这将 Chrome 的 Web Speech API 用于识别和合成,与 GPT-3 作为驱动聊天机器人“脑力”的语言模型结合:

## 将 GPT-3 与语音识别和合成结合,实现一个完全对话的聊天机器人…

我是如何创建这个网页应用的,你可以自然地与 GPT-3 谈论任何你想要的话题,全基于网页的…

towardsdatascience.com

在这个其他示例中,使用 Chrome 的语音识别功能来控制一个网页应用,在这种情况下使用 GPT-3 将口头请求转化为命令:

## 通过将语音转化为命令来控制网页应用,与 GPT-3 一起使用

最后一篇文章展示了 GPT-3 的实际应用,详细解释了工作流程和细节…

towardsdatascience.com

超越 Web Speech API

我在上面描述了某些网页浏览器不支持语音合成,大多数也不支持语音识别。我还解释了 Chrome 的内置语音 API 并不出色,尤其是对于语音识别,并且这些限制的一些问题可以通过语言模型来克服;然而,并非所有问题都可以用这种策略解决,因此许多现代 ASR 系统具有的功能是完全缺失的。

在这种情况下,了解浏览器可能支持语音识别和合成是重要的,通过使用替代服务或解决方案——这些服务或解决方案是付费的,相比于 Chrome 的免费 API,原则上更强大。

仅提及一些提供此 API 服务的公司,可以查看 Gladia、Speechly、AssemblyAI、Deepgram、Spechmatics(这个有一个很棒的示例在这里),以及其他一些公司。即使是 Google 也有一个与他们在 Chrome 中免费提供的系统不同的 ASR 系统,它显然效果更好,其他科技巨头如 Microsoft 和 AWS 也通过 API 提供了他们自己的产品。你甚至可以下载 OpenAI 的开源 Whisper,并设置一个专门为你运行的服务,甚至可以根据你的需求进行定制——不过你还是直接去找一个通过 API 提供的公司,比如Gladia.io

当然,除非你做的是封闭实现(例如在本地服务器上使用 Whisper),否则大多数这些服务都需要你将音频发送到他们的服务器,这可能会危及隐私。然而,对于非敏感任务来说,它们可能是一个完美的选择,即使在许多情况下成本相对较低。

进一步阅读

[## Web Speech API - Web APIs | MDN

Web Speech API 使你能够将语音数据集成到网络应用程序中。Web Speech API 有两个部分…

developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API?source=post_page-----dc1afde54ced--------------------------------) [## Using the Web Speech API - Web APIs | MDN

语音识别涉及通过设备的麦克风接收语音,然后由语音…

developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API/Using_the_Web_Speech_API?source=post_page-----dc1afde54ced--------------------------------)

www.lucianoabriata.com 我写关于我广泛兴趣领域的一切:自然、科学、技术、编程等。 订阅以获取我的新故事 通过电子邮件*。要* 咨询小型工作 请查看我的 服务页面在这里。你可以 在这里联系我 你可以 在这里给我小费.

权重衰减在没有残差连接的情况下能有效吗?

原文:towardsdatascience.com/weight-decay-is-useless-without-residual-connections-ef65197e5944?source=collection_archive---------13-----------------------#2023-02-21

残差连接如何秘密地对抗过拟合?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Guy Dar

·

关注 发布于 Towards Data Science ·9 min read·2023 年 2 月 21 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 ThisisEngineering RAEng 提供,来源于 Unsplash

引言

在这篇文章中,我们将用数学方法(使用简单的数学,别担心!)展示如果没有残差连接,LayerNorm 可能会导致神经网络的过拟合问题。过拟合是机器学习中的一个严重问题,科学家们真的希望避免这种情况。粗略来说,过拟合意味着网络记住了训练集,而不是学习任务并推广到新的未见数据上。权重衰减是一种用于对抗过拟合的正则化技术。然而,我们将展示在相当标准的前馈网络中,它们需要残差连接才能有效(在下面的解释中我会进一步澄清)。残差连接以其在反向传播过程中稳定训练的作用而闻名。另一方面,Normalization 层(如 LayerNorm)则在输入通过网络层时稳定输入。Normalization 层的想法是我们希望内部表示的范数保持在一定范围内。在 LayerNorm 中,我们通过其范数来除以每个内部表示向量(此时我省略了一些细节)。一些先前的工作建议将 LayerNorm 添加到残差网络中[Liu et al, 2020],这有助于提高它们的性能。我们的研究则是另一个方向——为什么从理论上讲,你可能不应该在没有残差连接的情况下使用 LayerNorm。实际上,即使是后规范残差连接(无论那是什么意思……)也会遭遇同样的问题。

从广义上讲,思想相当简单:通过将权重衰减设得非常小(除了最后一层,它虽然令人头疼,但仍使大部分权重衰减变得无用),我们可以使权重衰减几乎没有实际用处。简单回顾一下什么是权重衰减:权重衰减是一种正则化技术,用于防止神经网络收敛到不能推广到未见数据的解决方案(即过拟合)。如果我们训练神经网络只去最小化训练数据上的损失,我们可能会找到一个专门为这特定数据及其特性量身定制的解决方案。为避免这种情况,我们添加一个与网络权重矩阵的范数相关的项。这旨在鼓励优化过程收敛到可能对训练数据不是最优的解决方案,但在范数上具有较小权重矩阵的解决方案。其思路是,具有高范数权重的模型不够自然,可能试图拟合特定的数据点以进一步降低损失。在某种程度上,这是一种将奥卡姆剃刀(哲学观点认为简单的解决方案可能是正确的)集成到损失中的方式——其中简单性由权重的范数来体现。我们在这里不会讨论权重衰减的更深层次的理论依据。

TL;DR:在这篇文章中,我们展示了在没有残差连接的 ReLU 前馈网络中,添加 LayerNorm 后,权重衰减正则化不会改变最优损失值(*除了讨厌的最后一层,我们稍后会讨论为什么我们认为这还不够)。

理论游戏时间

ReLU 网络的正尺度性

线性网络和 ReLU 网络具有以下尺度特性:设 a > 0 为正标量。那么 ReLU(ax) = a ReLU(x)。最终,在任何由矩阵乘法堆叠后跟 ReLU 激活组成的网络中,这个属性仍然有效。这是最普通的神经网络——没有归一化层,也没有残差连接。然而,这种之前曾广泛存在的前馈 (FF) 网络展示了这样一种结构化行为确实令人惊讶:将输入乘以正标量,结果输出正好按相同的因子缩放。这就是我们所称的 (正向) 尺度等变性(这意味着输入的尺度变换会传递到输出的尺度变换,而 不变性 则表示输入的尺度变化不会对输出产生影响)。但还有更多:如果我们在过程中对任何权重矩阵(以及相应的偏置项)进行同样的操作——效果也是一样的:输出将按相同因子放大。不错吧?当然。但是我们能利用它吗?让我们看看。

让我们看看添加 LayerNorm 后会发生什么。首先,什么是 LayerNorm?简单回顾一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 µx 条目的平均值, 表示逐元素乘法,β, γ 是向量。

那么,当我们添加 LayerNorm 时,尺度特性会发生什么变化?当然,在添加 LayerNorm 之前,情况不会改变,因此如果我们在此之前将权重矩阵缩放了 a > 0,那么 LayerNorm 的输入会被 a 缩放,然后发生的情况是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以,我们得到一个新的属性,这次尺度缩放只是使输出 保持不变—— 正尺度 不变性。而且,这即将变得令人遗憾……

注意: 当我们讨论 LayerNorm 时,其他形式的归一化,如 BatchNorm,满足正尺度不变性属性,因此它们也像 LayerNorm 一样容易受到讨论中提到的问题的影响。

如何完全消失

让我们提醒自己我们正在尝试最小化什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中训练集表示为一组 {(x_i, y_i)} 的对,神经网络的参数(权重)fΘ 指定。这个表达式由两部分组成:需要最小化的经验损失——神经网络在训练集上的损失,以及旨在使模型达到“更简单”解决方案的正则化项。在这种情况下,简单性被量化为网络权重具有低范数。

但问题在于,我们发现了一种绕过权重规模限制的方法。我们可以将每个权重矩阵按任意小的因子进行缩放,仍然能得到相同的输出。换句话说——函数 f,即原始网络和缩放网络实现的函数是完全相同的!内部可能不同,但输出是相同的。这适用于每一个具有这种架构的网络,不管参数的实际值是什么。聪明的读者可能会注意到β, γ也是参数,因此也应考虑,但由于下一个 LayerNorm 的尺度不变性,它们也可以被缩放(*除了那个恼人的最后一层)。

记住,我们的目标是对未见数据进行泛化。如果正则化项趋近于零,网络就可以自由地过拟合训练数据,正则化项也就变得无用。正如我们所见,对于每一个具有这种架构的网络,我们可以设计一个等效的网络(即计算完全相同的函数),其权重矩阵范数可以任意小,这意味着正则化项可以趋近于零而不影响经验损失项。换句话说,我们可以去掉权重衰减项,它不会有太大影响。

最后一层的技术细节仍然是我们面临的一个小问题,我们不能去掉它的权重衰减项,因为最后一层通常没有跟随 LayerNorm,而且:最后的 LayerNorm 无法重新缩放,因为它后面没有任何 LayerNorm,因此我们还要考虑它的β, γ。所以我们剩下的只有最后一层的范数和 LayerNorm 的参数。为什么这并不是那么糟糕?过拟合可能发生在整个网络中,因此我们可以几乎所有参数进行过拟合。更重要的是,模型的内部层是学习关注点的特征提取器,而最后一层是对学习到的特征进行分类的分类器。至少从直观上看,它在过拟合中的作用可能相比于特征提取要小得多。

还有一句警告:尽管理论上,模型应该找到一个过拟合训练数据的解决方案,但观察到优化可能会收敛到泛化解决方案,即使没有显式正则化。这与优化算法有关。我们使用局部优化算法,例如梯度下降、SGD、Adam、AdaGrad 等。它们不能保证收敛到最全局最优的解决方案。这有时反而是一种福气。一项有趣的研究(例如,[Neyshabur, 2017])表明,即使没有显式正则化,这些算法也属于隐式正则化的一种形式!虽然并非万无一失,但有时模型会收敛到一个泛化解决方案——即使没有正则化项!

残差连接如何解决这个问题?

让我提醒你什么是残差连接。残差连接将层的输入加到输出上。如果该层正在计算的原始函数是 f(x) = ReLU(Wx),那么新函数是 x + f(x)

现在,这一新层的权重缩放特性被打破了。这是因为在表达式的残差部分前没有学习到系数。因此,f(x) 部分由于权重缩放而被一个常数缩放,但x 部分保持不变。现在,当我们对其应用 LayerNorm 时,缩放因子无法再被抵消:LayerNorm(x + a f(x)) ≠ LayerNorm(x + f(x))。重要的是,只有在残差连接应用在 LayerNorm 之前 时才会出现这种情况。如果我们先应用 LayerNorm,然后再进行残差连接,则会发现我们仍然获得 LayerNorm 的缩放不变性:x + LayerNorm(a f(x)) = x + LayerNorm(f(x))

第一个变体通常被称为 pre-norm 变体(更准确地说,实际上是 x + f(LayerNorm(x)) 被称作这种方式,但我们可以将 LayerNorm 归因于前一层,并将下一层的 LayerNorm 视为上面的表达式,除了第一层和最后一层的边缘情况)。第二个变体被称为 post-norm 变体。这些术语常用于 transformer 架构中,而这些超出了本文的范围。然而,值得一提的是,一些研究如 [Xioang et al, 2020] 发现 pre-norm 更易于优化(他们讨论了不同的原因)。然而,请注意这可能与这里讨论的缩放不变性无关。Transformer 预训练数据集通常包含大量数据,过拟合问题变得不那么严重。此外,我们还没有讨论 transformer 架构本身。但这仍然值得考虑。

结论

在本文中,我们观察到了一些没有预归一化残差连接的前馈神经网络的有趣特性。具体来说,我们注意到,如果它们不包含 LayerNorm,它们会将输入缩放和权重缩放传播到输出。如果它们包含 LayerNorm,它们是尺度不变的(除了最后一层),而权重/输入缩放完全不会影响输出。我们利用这一特性展示了这样的网络的最佳解决方案可以避免特征提取中的权重范数惩罚(仅保留分类器惩罚),因此网络可以收敛到一个或多或少相同的函数,这个函数是它在没有这些技术的情况下会收敛的。虽然这是一个关于最优性的声明,但是否这些解决方案实际上是通过梯度下降找到的仍然是一个问题。我们可能会在未来的文章中探讨这一点。我们还讨论了(预归一化)残差连接如何破坏尺度不变性,从而似乎解决了上述理论问题。仍然可能存在一些残差连接无法避免的类似特性,我可能未曾考虑。像往常一样,感谢你的阅读,我们下篇文章见!

参考文献

F. Liu, X. Ren, Z. Zhang, X. Sun, 和 Y. Zou. 重新思考带有层归一化的残差连接,2020.

B. Neyshabur. 深度学习中的隐式正则化,2017. 网址 arxiv.org/abs/1709.01953.

R. Xiong, Y. Yang, D. He, K. Zheng, S. Zheng, C. Xing, H. Zhang, Y. Lan, L. Wang, 和 T.-Y. Liu. 关于 Transformer 架构中的层归一化,2020. 网址 arxiv.org/abs/2002.04745.

使用 Keras 进行测井数据预测的神经网络

原文:towardsdatascience.com/well-log-measurement-prediction-using-neural-networks-with-keras-ef7dfed94077

使用 Keras 预测体积密度(RHOB)的示例,并说明归一化对预测结果的影响

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Andy McDonald

·发布于 Towards Data Science ·阅读时间 11 分钟·2023 年 10 月 26 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代表神经网络与自然景观相结合的图像。图像由 DALL-E 3 生成。

全球每天都有大量数据从井中获取。然而,这些数据的质量可能会显著变化,从缺失数据到受到传感器故障和钻孔条件影响的数据。这可能对地下项目的其他部分产生连锁反应,例如延误和不准确的假设与结论。

由于缺失数据是我们在测井数据质量中最常遇到的问题之一,因此已经开发了许多方法和技术来估计值并填补空白。这包括应用机器学习技术——在过去几十年中随着 TensorFlow 和 PyTorch 等库的普及而越来越受欢迎。

在本教程中,我们将使用 Keras,它是一个运行在 TensorFlow 之上的高级神经网络 API。我们将利用它来演示构建机器学习模型的过程,从而允许预测体积密度(RHOB)。这是一个常见的测井测量,但它可能会受到孔眼条件不良的显著影响,或者在某些情况下,工具可能会出现故障,导致关键区间没有测量数据。

我们将从一个非常简单的模型开始,该模型不考虑输入的归一化,这是机器学习工作流程中的一个常见步骤。然后,我们将建立一个具有归一化输入的第二个模型,并说明其对最终预测结果的影响。

导入库和加载数据

本教程的第一步是导入我们将使用的库。

对于本教程,我们需要 4 个库:

这些是按以下方式导入的:

import pandas as pd
from sklearn.model_selection import train_test_split
import tensorflow as tf
import matplotlib.pyplot as plt

一旦导入了库,我们需要加载将用于训练和测试模型的数据。

对于本教程,我们将使用一个包含来自挪威西海岸 Volve 油田 3 口井的系列测井数据的数据集。这些数据来自公开的 Equinor Volve 数据集。

该数据集的完整详细信息可以在文章末尾找到。

要读取我们的 CSV 文件,我们只需调用:

df = pd.read_csv("Data/Volve/VolveNN.csv")
df

当我们查看数据框时,我们可以看到其中包含哪些测井数据,以及数据的前 5 行和最后 5 行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于神经网络建模的三个选定 Volve 井的数据框视图。图像由作者提供。

对于本教程,我们将假设所有的数据准备步骤已经完成,并且数据已由岩石物理学家/地球科学家进行了质量检查。

不过,如果我们想要再次检查是否所有列都充满了数据且没有空值行,我们可以调用df.describe()。当我们这样做时,我们需要检查所有列/测量中的计数行是否为 24,111。

值得注意的是,在应用机器学习之前确保数据质量非常重要,因为这可能导致错误和其他问题。

数据拆分为训练和测试

对于本教程,我们将尝试预测体积密度(RHOB)。由于各种原因,这种测井测量有时会在测井数据集中缺失。这些原因包括数据对钻井目标并不重要,或者为了节省钻井和测井成本,数据被简单地排除在外。

因此,我们通常需要使用现有的测井数据集,其中包含 RHOB 测量,以构建一个机器学习模型,该模型可以用于预测其他井中的测量结果,尽管这些井中并未获取这些测量。

我们的下一步是将数据拆分为两个部分。

X变量中放置的数据将作为我们模型的输入,而y包含我们的目标输出——在这种情况下是 RHOB。

# Define feature variables (X) and target variable (y)
X = df[['DTS', 'GR', 'NPHI', 'PEF', 'DT']]
y = df['RHOB']

我们可以继续使用现有的数据进行构建、训练和预测,但我们将无法真正了解模型的表现情况。

这是我们将数据拆分为两个子集的地方。一个子集用于训练模型,另一个子集用于验证和调整模型。理想情况下,我们还会有第三个数据集,用于测试模型在完全未见数据上的表现。

不过,在这个例子中,我们将坚持使用两个子集。

为了拆分数据,我们调用 sklearn 的 train_test_split 方法,并传入我们的 Xy 变量。

我们还将设置拆分比例为 70% 进行训练,其余 30% 用于验证和微调数据。这个比例可以根据数据集的大小进行调整。例如,对于较小的数据集,您可能希望有更大的训练子集。

# Split the dataset into 70% training and 30% testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

我们可以通过检查 X_train 和 X_test 的长度来验证拆分是否成功。

len(X_train), len(X_test)

它返回一个包含子集大小的元组:

(16877, 7234)

在标准工作流程中,我们通常会对数据进行归一化/标准化,以考虑不同的数据范围。然而,对于我们的第一个模型,我们将使用未归一化的数据,然后在第二个模型中应用归一化,以查看是否能改善结果。

构建和训练 Keras 模型

在使用 keras 构建模型时,有两种主要的方式来创建神经网络模型。这些是 Sequential API 和 Functional API 方法。

使用 Sequential 方法,我们只需将层线性地堆叠在一起,而 Functional API 提供了更多灵活性,可以用于创建具有多个输入和输出及共享层的更复杂模型。

在本教程中,我们将使用 Sequential API,因为它是最简单的使用方法,容易上手。

定义 Keras 神经网络模型

要开始使用 Sequential API,我们首先创建模型如下。

在构建神经网络时,最好从简单和小规模开始,逐渐增加复杂性,直到对结果满意。

在这个例子中,我们将创建一个非常简单的神经网络,由一个包含 8 个神经元的隐藏层组成,relu 作为激活函数。这个层通过应用多个权重、偏差和激活函数来转换输入数据,然后将其传递到最终的输出层。这个层设置为提供一个代表声学剪切迟缓曲线的数值输出。

要了解更多关于不同激活函数及其工作原理的信息,我建议查看以下页面:

# Define a simple Neural Network using Keras Sequential API
model = tf.keras.Sequential([
    tf.keras.layers.Dense(8, activation='relu'),
    tf.keras.layers.Dense(1)
])

编译 Keras 神经网络模型

一旦我们定义了模型,接下来需要对其进行编译。这将配置和设置模型如何学习。

为了保持模型简单,我们将使用平均绝对误差(MAE)作为损失函数(用于量化模型对目标特征的表现)和指标(也用于判断模型表现——但如果使用不同的损失函数,它可以是更易于理解的评分)。

我们还将优化器设置为‘Adam’。这是一个常见的优化器模型,用于根据选择的损失函数确定模型如何更新其权重。

# Compile the model
model.compile(loss='mae',
             optimizer='Adam',
             metrics='mae')

拟合/训练 Keras 神经网络模型

创建模型的最后一步是将模型“拟合”到训练数据中。这将开始我们定义模型的训练过程。

我们还将设置训练的周期数为 30。这代表数据在神经网络中的一次完整传递。每次传递后,模型权重会被更新,以最小化所选的损失函数。

在构建模型时,将模型拟合结果保存到历史变量中是一个好主意。这将允许我们绘制结果并记录训练历史。

history = model.fit(X_train, y_train, epochs=30, 
                    validation_data=(X_test, y_test))

一旦我们开始运行模型,我们将获得以下文本输出,详细说明模型的进展以及每个周期的表现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Keras 神经网络模型训练输出。图像由作者提供。

模型完成后,我们可以通过生成一个 matplotlib 图形来以图形形式查看历史记录。

plt.figure(figsize=(10, 8))
pd.DataFrame(history.history).plot()
plt.xlabel('Epochs')
plt.ylabel('Mean Absolute Error (MAE)')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Keras 神经网络模型训练过程中的损失曲线。图像由作者提供。

在上面的图像中,蓝色曲线(损失)和橙色曲线(mae)分别表示训练损失和性能指标(MAE)。

两条曲线在开始时急剧下降,这表明模型正在学习并改善其在初始周期中的表现。然而,随着周期数的增加,损失和指标的下降变得更加缓慢。这可能表明我们的模型已达到收敛并得到了最终解决方案。

将 Keras 模型应用于测试数据

一旦我们的模型经过训练,我们可以应用该模型并预测测试子集目标特征中的值。

这是通过调用以下代码来完成的。

y_pred = model.predict(X_test)

一旦我们运行这一行,我们将看到 Keras 进行预测。

227/227 [==============================] - 0s 1ms/step

评估模型性能

在模型进行预测后,我们可以通过调用 Keras 中的几个指标来评估其在测试数据上的表现。

这些是平均绝对误差(MAE)——表示实际值和预测值之间的平均绝对差异——和均方根误差(RMSE)——表示实际值和预测值之间的平均误差幅度。

为了将我们预测的变量传递到这些指标中,我们首先需要去除生成结果中的任何额外维度。这确保了y_testy_pred的形状是相同的。

mae_1 = tf.keras.metrics.mae(y_test, tf.squeeze(y_pred)).numpy()
mse_1 = np.sqrt(tf.keras.metrics.mse(y_test, tf.squeeze(y_pred)).numpy()
mae_1, mse_1

当我们查看指标时,我们得到以下分数。

(0.07578269, 0.11054294)

这告诉我们,平均而言,我们的预测结果与实际结果相差 0.0757 g/cc,RMSE 为 0.1105,表明我们有一些结果与实际值差异显著的实例。

误差结果的可视化

仅仅查看指标虽然很好,但仅凭这两个数字来判断我们模型的表现可能会很困难。

我们可以通过实际和真实测量值的简单散点图来可视化我们的结果。

def create_scatter_comparison(ytrue, ypreds):
    # Auto calculate the min and max scales for the data
    minscale = min(ytrue.min(), ypreds.min())*0.95
    maxscale = max(ytrue.max(), ypreds.max())*1.05

    plt.figure(figsize=(10, 10))
    plt.scatter(ytrue, ypreds)

    # Create a 1:1 relationship line
    line_points = np.linspace(minscale, maxscale, 100) 
    plt.plot(line_points, line_points, c='red')

    plt.xlim(minscale, maxscale)
    plt.ylim(minscale, maxscale)
    plt.xlabel('Actual Measurements')
    plt.ylabel('Predicted Measurements')
    plt.show()

然后,我们可以通过传入实际值和预测值来调用我们的图表。

create_scatter_comparison(y_test, y_pred)

当我们运行这个时,我们会得到以下图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测测量值与实际测量值的散点图。图片由作者提供。

总体来说,模型在预测体积密度(RHOB)方面表现良好——大多数数据点接近 1:1 关系线。然而,还有一些领域可以通过改进模型来受益。

我们可以看到在 2.2g/cc 到 2.6 g/cc 之间的数值分布更广,这表明我们的模型在这个范围内低估了体积密度。

通过对输入数据应用 MinMaxScaler 来改进 Keras 模型

一些机器学习模型,包括神经网络,当数据归一化到标准范围时表现更好。

在井测量中,我们有时会有数据缩放从 0 到 0.5,而其他数据达到几万。这可能导致某些输入曲线比其他曲线具有更大的权重。

为了在建模时让每个输入曲线具有相同的基础,我们需要将输入数据更改为标准范围。此外,这也可以提高模型训练时间和模型预测准确性。

归一化值的一种方法是使用MinMaxScaler来自sklearn

这个函数会将数据缩放到 0 和 1 之间。

一旦MinMaxScaler被导入,我们就可以拟合和转换我们的X_trainX_test数据。

我们不需要改变目标特征。

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

然后,我们可以传入我们新缩放的变量并重新运行模型。

# Create a model
model = tf.keras.Sequential([
    tf.keras.layers.Dense(8, activation='relu'),
    tf.keras.layers.Dense(1)
])

# Compile model
model.compile(loss='mae',
             optimizer='Adam',
             metrics='mae')

# Fit the model
history = model.fit(X_train_s, y_train, epochs=30)

再次,Keras 将在运行时报告模型的进展。

我们立即注意到,mae 值比原始运行时更小。希望这意味着模型更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用缩放输入进行预测时 Keras 的进展。图片由作者提供。

然后,我们可以通过重新评估关键指标来进行新的预测。

y_pred = model.predict(X_test_s)

mae_1 = tf.keras.metrics.mae(y_test, tf.squeeze(y_pred)).numpy()
rmse_1 = np.sqrt(tf.keras.metrics.mse(y_test, tf.squeeze(y_pred)).numpy()) 

这给我们提供了 0.0292 g/cc 的 MAE 和 0.0455 的 RMSE。这表明,通过应用我们的 MinMaxScaler,模型得到了改进。

(0.029252911, 0.04554793)

我们可以通过将新的预测结果传入散点图并将结果与之前的模型进行比较来进一步确认这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Keras 预测的比较,归一化前(左)和归一化后(右)使用 MinMaxScaler。比较时请注意不同的尺度。图片由作者提供。

尽管图表的尺度不同,我们可以看到在 2.2g/cc 和 2.6 g/cc 范围内有显著改善。这证实了将归一化应用于数据已产生更好的预测结果。

总结

在本教程中,我们已经看到如何构建一个非常简单的 Keras 神经网络模型,以使用其他可用的井日志数据来预测常见的井日志测量。这在数据缺失或受差井条件(如洗井)影响的数据的情况下极其有用。

尽管本教程在对模型进行一次修订后停止,但尝试不同的模型设置变体和不同的输入组合总是明智的。

请记住,构建成功的机器学习模型的整个过程涉及多次迭代以达到最终模型。即使模型已经部署,也可以在有新数据时进行修订。

最后,使用机器学习技术进行预测不应被视为领域专业知识的直接替代品。相反,领域专业知识应与建模和预测过程相结合。这可以确保准确性,并捕捉到任何错误结果。

数据集使用情况

本教程中使用的数据是 Equinor 在 2018 年发布的 Volve 数据集的一个子集。数据集的详细信息,包括许可证,可以在以下链接找到

[## Volve 领域数据集

Equinor 已发布 2008-2016 年 Volve 领域的完整数据集。点击此处下载以供研究、学习……

www.equinor.com](https://www.equinor.com/energy/volve-data-sharing?source=post_page-----ef7dfed94077--------------------------------)

Volve 数据许可证基于 CC BY 4.0 许可证。许可证协议的详细信息可以在这里找到:

cdn.sanity.io/files/h61q9gi9/global/de6532f6134b9a953f6c41bac47a0c055a3712d3.pdf?equinor-hrs-terms-and-conditions-for-licence-to-data-volve.pdf

感谢阅读。在您离开之前,您绝对应该订阅我的内容,将我的文章送入您的收件箱。 您可以在这里进行订阅!此外,如果您喜欢这些内容并想表示感谢,请考虑为它点赞。

50 多次机器学习面试(作为面试官)教会了我什么

原文:towardsdatascience.com/what-50-ml-interviews-as-an-interviewer-have-taught-me-6a72f7344eb1

作为面试官,你能做些什么以在结果不论如何的情况下给候选人留下积极的印象?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Thushan Ganegedara

·发表于 Towards Data Science ·6 分钟阅读·2023 年 7 月 7 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 charlesdeluvio 提供,来自 Unsplash

如果你觉得面对技术面试很困难,那么尝试进行面试吧。我说的不是那些给人留下刺耳印象的尴尬面试官,他们傲慢地看着你,你只希望痛苦早点结束。我说的是那些留下积极印象、你会珍惜的面试官。

面试是一项巨大的责任。你是某人职业生涯的把关人。因此,你必须尽你所能对他们尽量公平。

我将提到的所有要点都围绕一个关键价值展开:

同理心!

如果你掌握了同理心,你可能甚至不需要阅读这篇文章。我在这里讨论的一切都是我的个人观点,不代表我雇主的看法。

为了提供背景,我是一名机器学习工程师,我讨论的是技术或编码面试。

阅读完这篇文章后,你将(希望)获得一些经验,这些经验将使你成为一个更好的面试官,给候选人留下积极的印象(无论结果如何)。

让我们先跳过候选人的明显检查,先理清思路:

  • 展现出对语言和工具的扎实技术知识

  • 在解决问题时思考

  • 友好与合作

任何没有打勾的项都是值得关注的。

协作优于审查

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Mitchell Luo 拍摄,发布在 Unsplash

面试官进行面试的风格对面试结果起着重要作用。如果面试官表现得像一个无法满足的权威人物,即使是最优秀的候选人也可能会紧张并感到不安。当候选人面前有一个亲切的人时,他们的表现会更好。

我的一种方法是将面试几乎变成一场对偶编程的会话,我们两个人共同努力解决问题,而不是默默地(有些悲惨地)观察候选人对问题的痛苦挣扎。

我不会撒谎,我曾经支持“审查团队”。那时,我认为评估候选人的最重要标准是看他们是否能自己找到解决方案。在工作中,解决问题的时间很少仅仅依赖于你的技术知识。相反,它更多地受到以下因素的影响……

  • 知道应该问什么问题(当然是对的人)

  • 交流你到目前为止的工作

  • 解释和执行他人的提示/建议

对偶编程给了你一个黄金机会来测试候选人的这些“软技能”。因此,与其孤军奋战,不如组成一个团队,共同努力达到最终解决方案。为了推动候选人朝正确方向前进或在他们卡住时打破僵局,我会使用诸如“告诉我你在想什么”或“也许从伪代码开始”这样的短语。我不是说你应该把解决方案直接交给他们,而是帮助他们成功。

这种方法不仅有助于你评估候选人的一系列硬技能和软技能,而且还让候选人感受到成就感(而不是在他们遇到困难时被抛弃)。

情境意识

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Timon Studler 拍摄,发布在 Unsplash

你必须培养的一个关键技能不是记住问题的答案(尽管这很重要),而是具有敏锐的情境意识。每个候选人都是不同的,每次面试的体验也是不同的。作为面试官,你必须能够适应那个独特的情境。

如果候选人显得紧张,多微笑一点,问问天气,并让他们知道你在这里如果需要帮助。如果候选人在解决问题时需要一些个人空间,给予他们这些空间。如果候选人在面试开始时遇到技术困难,给他们一点额外的时间来弥补丧失的时间。

不仅在面试过程中需要这样做,而且在面试后也要这样做。在评估候选人时,通过排除噪音建立他们表现的公平形象。问自己一些问题,例如,

  • 如果他们不紧张的话,表现是否会更好?

  • 候选人是否有文化/语言障碍?

  • 这是一个我会期待与之合作的人吗?

候选人通常会随着面试阶段的进行变得越来越自信/舒适。也许候选人正经历非常糟糕的一天!因此,作为面试官,你需要能够穿透这些,评估候选人的技能。我不是说你应该完全忽略这些事实。记下它们并与其他面试官/招聘人员沟通。但如果你期待面试者总是处于最佳状态,你会感到失望。记住我们都是人!这也引出了第二点。

写详细的反馈

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Aaron BurdenUnsplash 提供的照片

这是作为面试官最难掌握的事情之一:写出全面且公平的评估。为什么困难?因为在一个小时或 45 分钟的时间窗口内,你需要评估候选人的许多方面,同时你的精神带宽有限。和其他事情一样,掌握这项技能需要时间。

一些可以帮助你的事项有,

  • 使用模板在面试过程中记笔记。可以是面试中的每个任务,他们做得好的地方和做得不好的地方。一个重要的点是要有具体的例子,而不是模糊的陈述。

  • 查看其他人写的反馈(如果你能看到的话)

  • 不要拖延记笔记——确保在面试结束时你的笔记是完整的。否则,你将总是忘记在面试过程中做出的重要观察。

准时

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Aron VisualsUnsplash 提供的照片

作为面试官,容易产生一种皇室感。可能会出现这样的想法:“他们应该在等我进来,而不是我等他们。”个人而言,更重要的是我以他们(或我)对待自己时间的方式来珍惜别人的时间。

我不必提醒你面试前的兴奋(以一种可怕的方式)是怎样的。而且 99%的候选人肯定会准时参加面试。作为面试官,我也应当对候选人做到这一点,这才公平。

结论

进行一次出色的面试不是一门科学,没有一个万能的配方可以总是奏效。这更多地依赖于你解读情况和候选人的能力。

重要的是将这些建议/学习看作参考。它们不是精确的规则,也没有确切的衡量标准。例如,我并不是说你应该仅仅因为候选人紧张而放弃他们。但如果候选人回答了 80%的问题,并且你知道他们已经很久没有面试,并且他们非常紧张,那么可以给他们第二次机会。

此外,作为一个“善良的人”可以帮助使面试过程更加愉快。遗憾的是,我曾见过面试官在面试后嘲笑候选人的弱点。对大多数人来说,面试是一个非常紧张的经历,我们都有过犯错的时候。所以尽量避免这样做。

感谢你的阅读!我希望这些建议能帮助你成为更出色的技术面试官!

如果你喜欢这个故事,欢迎 订阅 Medium,你将会收到我发布的新内容通知,并且可以解锁访问成千上万来自其他作者的精彩故事。

## 通过我的推荐链接加入 Medium — Thushan Ganegedara

作为 Medium 的会员,你的会员费的一部分会支付给你阅读的作者,你将获得每个故事的全面访问权限……

thushv89.medium.com

什么是梯度,为什么会爆炸?

原文:towardsdatascience.com/what-are-gradients-and-why-do-they-explode-add23264d24b

阅读这篇文章,你将对深度学习中最重要的概念有一个坚定的理解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Daniel Warfield

·发布于 Towards Data Science ·10 分钟阅读·2023 年 6 月 12 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“梯度爆炸”,由 MidJourney 制作。所有图像均由作者提供,除非另有说明。

梯度可以说是机器学习中最重要的基础概念。在这篇文章中,我们将探讨梯度的概念、使梯度消失和爆炸的原因,以及如何控制梯度。

这对谁有用? 对初学者到中级的数据科学家有用。我将包括一些可能对更高级读者有用的数学参考。

你将从这篇文章中获得什么? 对梯度的深入概念理解,它们如何与机器学习相关,梯度带来的问题,以及用来减轻这些问题的方法。

目录

点击链接以导航到特定部分

1) 什么是梯度? 2) 实际梯度(数学上) 3) 简单模型中的梯度(一个例子) 4) 什么是梯度爆炸和消失? 5) 为什么梯度爆炸和消失不好? 6) 我们如何修复梯度爆炸和消失?

什么是梯度?

目录

想象你有一些表面,有山丘和山谷。这个表面由一些多维函数(具有多个输入的函数)定义。

"""
Making a 3d surface with hills and vallys, for demonstrative purposes
"""

import matplotlib.pyplot as plt 
from matplotlib import cm
from matplotlib.ticker import LinearLocator
import numpy as np

#creating wide figure
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})

# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = 0.2*np.sin(X+Y + R) - 1*np.sin(X/2)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis,
                       linewidth=0, antialiased=False)

plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一些表面,有山丘和山谷

梯度告诉你, 对于表面上的任何给定点,它既指明了到达更高点的方向,也描述了该点表面的陡峭程度。

因为这是一个三维表面(输入是 x 和 y,输出是 z),我们可以通过计算在 X 轴和 Y 轴上某个点的坡度来计算梯度的简化版本。

"""
Calculating a simplified gradient using slopes along the X and Y direction
"""

def computeZ(x,y):
    """
    calculates any point on the surface
    """
    r = np.sqrt(x**2 + y**2)
    z = 0.2*np.sin(x+y + r) - 1*np.sin(x/2)

    return z

def plot_pseudo_gradient(x,y):
    """
    Calculates an approximation of the gradient using slope calculations
    of neighboring points offset by a small dx and dy.
    """

    #computing value at point
    z = computeZ(x,y)

    #defining some small distance to traverse 
    dx = 0.9
    dy = 0.9

    #getting the change in Z as a result of the change in X and Y
    dzx = (computeZ(x+dx,y) - computeZ(x,y))
    dzy = (computeZ(x,y+dy) - computeZ(x,y))

    #calculating the slope along the x and y axis.
    #these together tell you the direction of increase
    #and the slope of the current point, so these together
    #are the actual pseudo gradient
    slope_x = dzx/dx
    slope_y = dzy/dy

    #to scale the vectors for visability
    scale = 7

    #calculating the value at the end of the pseudo gradient
    #so I can draw a tangent line along the surface in the direction
    #of the gradient
    dz = computeZ(x+slope_x*scale,y+slope_y*scale)

    xs = [x, x+slope_x* scale]
    ys = [y, y+slope_y* scale]
    zs = [z, z+dz]

    #plotting the actual gradient
    ax.plot([xs[0], xs[1]],
            [ys[0],ys[1]],
            [zs[0],zs[0]], 'b')

    #plotting the tangent line
    ax.plot(xs, ys, zs, 'r')

    #plotting vector components of the tangent line
    ax.plot([xs[0],xs[1],xs[1],xs[1]],
            [ys[0],ys[0],ys[1],ys[1]],
            [zs[0],zs[0],zs[0],zs[1]], '--k')

    ax.scatter([x],[y],[z], marker='x', c=['k'])

#creating a figure
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.computed_zorder=False #unfortunatly, zorder has pervasive bugs in 3d plots

# Plot the surface.
surf.set_zorder(1)
surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, linewidth=0, antialiased=False, alpha=0.2)
surf.set_zorder(1)

#plotting the pseudo gradient at x=0 and y=0
plot_pseudo_gradient(0,0)

#rendering
plt.show()

#for later use in traversal with the gradient
return slope_x, slope_y

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蓝色的梯度描述了“x”标记的点的最大增加方向。红线描述了如果你沿着梯度走一段距离,你会到达哪里。

所以,从概念上总结一下,梯度计算了最大增加的方向,以及这种增加的陡峭程度,通过计算输出相对于函数所有输入的斜率。

实际梯度

目录

在之前的示例中,我计算了我称之为“简化梯度”的内容。我计算了 z 相对于 x 和 y 的小变化的斜率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于计算伪梯度的比率。 SlopeZvsX 和 SlopeZvsY 被用来构造图像中的蓝线。

实际上,梯度是使用偏导数计算的,这意味着它是相对于单个变量(x 或 y)的函数的导数。 如果你对微积分不熟悉,你可以观看一个关于导数的 视频 和另一个关于 偏导数 的视频来快速了解数学。不过,无论数学如何,简化梯度和实际梯度的概念是相同的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个具有 x 和 y 维度的函数的梯度的数学符号。梯度是一个由函数相对于每个输入的偏导数组成的向量,表示为一个向量。真实梯度比我在之前示例中计算的“伪梯度”更加准确且计算更快。从概念上讲,你仍然是在计算给定 x 和 y 变化时的斜率。

简单模型中的梯度

目录

在研究机器学习时,你会发现到处都是可微性;可微损失函数、可微激活函数等等。原因是,如果一切都是可微的,你可以快速计算梯度(你需要调整输入以获得更好输出的方向)。

例如,假设我们有一个具有两个参数 x 和 y 的机器学习模型。我们还有一个函数,告诉我们这些参数如何将模型拟合到一组数据。我们可以使用梯度通过在梯度方向上采取一系列步骤来尝试找到最佳模型参数。

"""
Using Gradients to iteratively search for the maximum of the surface
"""

#creating a figure
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.computed_zorder=False #unfortunatly, zorder has pervasive bugs in 3d plots

# Plot the surface.
surf.set_zorder(1)
surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, linewidth=0, antialiased=False, alpha=0.3)
surf.set_zorder(1)

#iteratively following the gradient
x,y = 0,0
for _ in range(10):
    dx,dy = plot_pseudo_gradient(x,y)
    x,y = x+dx, y+dy

#rendering
plt.show()

#printing result
print("ideal parameters: x={}, y={}".format(x,y))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 x=0 和 y=0 进行迭代梯度搜索到局部最大值。 “x” 点标记了每次迭代的位置。在这种情况下,梯度优化的结果是 x=-3.104,y=0.789。

当人们谈论训练时,他们有时会提到“损失景观”。当你将一个问题转化为机器学习问题时,你实际上是在创建一个参数的景观,这些参数表现得比其他参数好或差。你定义什么是好,什么是坏(损失函数),以及一个复杂的函数,它具有一组可微分的参数,可以调整以解决问题(机器学习模型)。这两者共同创建了一个理论上的损失景观,通过梯度下降(模型训练)来遍历这个景观。 什么是梯度下降?

数学上,梯度用于指向函数中的更大值。在机器学习中,我们通常优化以减少错误率,因此我们希望我们的损失函数(错误数量)更小,而不是更大。数学上几乎是相同的;你只需将一些 + 变成 -。

"""
reworking the previous example to find the minumum with gradient descent
"""

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.computed_zorder=False

surf.set_zorder(1)
surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, linewidth=0, antialiased=False, alpha=0.3)
surf.set_zorder(1)

x,y = 0,0
for _ in range(10):
    dx,dy = plot_pseudo_gradient(x,y)
    x,y = x-dx, y-dy #<----------- this is the only part that changed

plt.show()

print("ideal parameters: x={}, y={}".format(x,y))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

梯度下降,通常在机器学习中使用的方法。

什么是梯度爆炸和梯度消失?

目录

首先,让我们看一个简化的神经网络。我们将忽略激活函数和偏置,仅将神经网络视为一系列权重。在这种简化的条件下,神经网络看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个小型神经网络的例子,它仅使用权重。Hidden 1 的值是 input1w1 + input2w2,这等于 0.5。在一般情况下,感知器将每个输入乘以其各自的权重,然后将这些值加在一起。

当我们有更深层的神经网络时,梯度爆炸和梯度消失的问题就会出现。想象一个网络,其中有几个更多的层在进行乘法和加法,不断地进行乘法和加法等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络深层部分的快照

如你所见,当你持续乘以大于 1 的数字时,值会迅速增大。如果权重小于 1,值会因为乘以越来越小的值而迅速缩小。

我们可以看到,网络中的值会因为模型中的权重而迅速变大或变小,但我们也可以将每个感知器中的值看作变化,而不是具体的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想象一下感知器中的数字不是感知器的值,而是感知器值的变化。正如你所看到的,由于重复的乘法,当你深入网络时,变化的速度会增加。

关键点是:如果权重大于 1,重复的乘法会导致变化率(梯度)变得非常大;如果权重小于 1,变化率会变得非常小。 换句话说,梯度可能会爆炸或消失

为什么梯度爆炸和梯度消失不好?

目录

大梯度,小梯度,那又如何?

小梯度移动缓慢,并且有可能陷入浅层的局部最小值。因此,梯度消失可能导致模型无法改进。另一方面,梯度爆炸移动过快,并可能出现不稳定的情况,从而导致模型无法收敛到最小值。

"""
Plotting 3 similar landscapes scaled vertically
to have small, moderate, and large gradients
"""

def f(x, scale):
    """
    Function to represent the landscape we are attempting to optimize
    scaling the function vertically will scale the gradients proportionally
    """
    return scale*(0.3*np.sin(x*0.1) +0.5* np.sin(np.cos(x)) + 0.1*np.sin(x*0.3+2) + 4*np.cos(x*0.1) + 6*np.sin(x*0.05))

def f_slope(x, scale):
    """
    Using a pseudo derivative instead of computing the actual derivative
    """
    dx = 0.00001
    slope = (f(x+dx, scale)-f(x, scale))/dx
    return slope

#defining range
X = np.linspace(50,125,10000)

for gradient_scale, color in zip([1,10,100], ['r', 'y', 'b']):
    #computing landscape
    Y = np.array(list(map(f, X, [gradient_scale]*len(X))))

    point = 58
    explored_x = []
    explored_y = []
    for _ in range(20):

        #marking point as explored
        explored_x.append(point)
        explored_y.append(f(point,gradient_scale))

        #traversing along gradient
        point = point-f_slope(point, gradient_scale)

    #plotting landscape
    plt.plot(X,Y)
    #plotting traversal
    plt.plot(explored_x, explored_y, 'x-'+color)
    #rendering
    plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三种形状相似的景观,一种梯度几乎为零(左),一种梯度适中(中),一种梯度爆炸(右)。梯度消失导致模型改进不足,而梯度爆炸则导致不稳定性。

当你考虑到不仅仅是更大的模型有梯度,每个感知机也有自己的梯度时,这个问题变得更加普遍。这意味着网络中的不同感知机可以有非常不同的梯度。理论上,一个模型在不同的部分可以同时存在梯度消失和梯度爆炸

我们如何解决梯度爆炸和梯度消失的问题?

目录

1) 调整学习率

学习率通过梯度进行乘法运算,以控制每次迭代沿梯度方向的步长。较小的学习率会导致较小的步伐,而较大的学习率则会导致较大的步伐(我在之前的示例中做了大致等效的操作)。这在一定程度上可能有用,但梯度消失和梯度爆炸的问题在于梯度在模型中会发生变化(一些感知机的变化很小,其他的变化很大)。因此,虽然学习率是一个关键的超参数,但通常不被视为专门处理梯度消失和梯度爆炸的解决方法。

2) 更改激活函数

出于各种原因,感知机并不会只是将其输入乘以某些权重,将结果加在一起,然后输出结果。几乎所有网络都会将这一操作的结果通过一个称为激活函数的函数。激活函数都是可微分的,因此在影响网络深度中的梯度方面具有多种特性。

4) 更改模型架构

简单地缩短网络可以有所帮助。然而,如果这不是一个选项,几种网络架构被专门设计来处理这个问题。LSTM 被设计得比经典 RNN 在处理梯度爆炸方面更具鲁棒性,残差和跳跃连接也被设计用来帮助解决这种现象。

5) 使用批量归一化

批量归一化是机器学习中的一种主要正则化策略。它不是通过单一梯度来更新模型参数,而是通过使用一批样本的平均梯度来更新参数。

6) 梯度裁剪

你可以设置梯度的最大允许阈值。如果梯度超过这个值,就将梯度的大小设为这个阈值。

7) 使用权重正则化

L1 和 L2 正则化用于对高权重值的模型施加惩罚。添加这种形式的正则化可以减少梯度爆炸。

8) 截断上下文窗口

无论你使用的是递归网络还是其他使用上下文窗口的网络,缩小窗口的大小可以帮助最小化复合梯度问题。

结论

就这样!在这篇文章中,我们了解了梯度以及其背后的数学。我们了解到,你可以使用梯度在某些维度空间中上下移动表面,并且了解了如何利用这来优化机器学习模型。我们还了解到,随着模型规模的增大,梯度可能会爆炸成很大的数值,或消失成很小的数值,这两者都可能破坏模型的学习能力。我们还讨论了修正梯度消失和梯度爆炸的一些方法。

关注以获取更多信息!

在未来的文章中,我将描述一些机器学习领域的标志性论文,重点介绍实用和直观的解释。我还会有关于不常讨论的机器学习概念的文章。

如何使用 Hugging Face 代理进行 NLP 任务

原文:towardsdatascience.com/what-are-hugging-face-agents-48c175bd33e3

一步步教程,教你如何使用 Transformers 工具和代理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Farzad Mahmoodinobar

·发表于Towards Data Science ·阅读时间约 11 分钟·2023 年 5 月 17 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alev Takil拍摄,图片来自Unsplash

Hugging Face,一个为机器学习从业者提供的开源 AI 社区,最近将工具和代理的概念集成到了其流行的Transformers库中。如果你已经使用 Hugging Face 进行自然语言处理(NLP)、计算机视觉和音频/语音处理任务,你可能会好奇工具和代理为生态系统带来了什么价值。代理为用户增加了一个可以说是重要的便利性——让我来解释一下。

假设我想使用 Hugging Face Hub 上的模型将英文翻译成法文。在这种情况下,我需要进行一些研究以找到一个好的模型,然后弄清楚如何实际使用该模型,最后编写代码生成翻译。但是,如果你已经有一个 Hugging Face 专家在手,他们已经知道所有这些信息呢?换句话说,你只需告诉专家你想将一个句子从英文翻译成法文,然后专家会负责寻找一个好的模型、编写代码并返回结果——而且专家的速度远远快于你和我能做的。这正是代理的作用!我们用简单的英文描述我们想要的,然后代理查看其工具箱中的可用工具并执行它!这非常类似于请求 ChatGPT 翻译一个句子,然后 ChatGPT 处理剩下的。但是现在,代理不仅限于 ChatGPT 使用的少数几个模型(即 Open AI 模型,例如 GPT 3.5 或 GPT-4),代理还可以访问 Hugging Face 上的许多模型。

现在我们了解了代理和工具的作用,让我们看看如何实现它们。

## 通过我的推荐链接加入 Medium

阅读 Farzad(以及 Medium 上的其他作者)的每个故事。你的会员费直接支持 Farzad 和其他…

medium.com

Transformers 代理 — 实现

对于这一部分,我主要依赖于 Hugging Face 文档 关于代理,并使用我自己的示例进行了实现。

步骤 1 — 要求

让我们开始导入我们在这个练习中将要使用的一些库。请注意,我在结果中包含了这些库的版本,以便你想创建一个相同的环境。

import transformers, huggingface_hub, diffusers, torch
from platform import python_version
print(f'python: {python_version()}')
print(f'transformers: {transformers.__version__}')
print(f'huggingface_hub: {huggingface_hub.__version__}')
print(f'diffusers: {diffusers.__version__}')
print(f'torch: {torch.__version__}')

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你的环境中没有一个或多个这些库,你可能会从上述代码块中遇到错误。如果是这样,你可以运行下面的单元格来安装这些库。我假设如果你正在阅读这篇文章,你的环境中已经有 Python,因此下面没有包含。

技巧提示: 如果你需要运行一行命令,例如在 Jupyter notebook 或类似环境中安装 transformers,你可以使用 !pip install transformers==4.29.0。在下面的代码块中,我使用了 %%sh,这是一个魔法命令,表示此单元格中的所有内容都作为命令运行。

%%sh

pip install transformers==4.29.0

pip install huggingface_hub==0.14.1

pip install diffusers==0.16.1

pip install --upgrade torch torchvision

pip install openai==0.27.6

步骤 2 — Hugging Face 登录

现在我们的环境已经准备好,我们需要登录到 Hugging Face 以访问他们的推理 API。此步骤需要一个免费的 Hugging Face 令牌。如果你没有,可以按照这个链接中的说明(我花了不到 5 分钟)为自己创建一个。

让我们登录。

import huggingface_hub
from huggingface_hub import login

my_hf_token = 'ADD_YOUR_TOKEN_HERE'

login(my_hf_token)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果显示登录成功。

在下一步中,我们将实例化代理。请注意,Hugging Face 支持各种代理(本质上是大型语言模型或 LLM)。有些代理是收费的,如 Open AI 的,有些是开源的,如 BigCode 和 OpenAssistant。对于这篇文章,我选择了 BigCode 提供的一个免费开源选项Starcoder,因为这将更方便刚入门的用户尝试这些模型。如果你对使用其他代理感兴趣,Hugging Face 提供了一个易于阅读的教程,链接在这里

让我们继续进行下一步并实例化我们的代理。

第 3 步 — 实例化代理

下面的代码块实例化了来自 BigCode 的Starcoder代理。

import transformers
from transformers import HfAgent

# Starcoder
agent_starcoder = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")

现在我们的代理准备好了,让我们看看它能做什么!

第 4 步 — 执行任务

我们将要求模型生成一张图片,这是第一个任务。我们的做法是将我们想要的内容传达给代理,然后代理会完成它。让我们来看一个例子。

task = "Draw me a picture of the ocean"

picture_ocean = agent_starcoder.run(task)

picture_ocean

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hugging Face Agent生成的海洋图片

这很有趣!从结果来看,我们可以看到代理解释了它采取的一些步骤。例如,代理使用了image_generator工具来生成我们要求的图片。

我们提到我们的代理是一个 LLM,我们知道输出是随机生成的,并且期望在重新运行模型时会有所变化。让我们看看如果再运行一次相同的任务会得到什么结果。

picture_ocean = agent_starcoder.run(task)

picture_ocean

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hugging Face Agent生成的海洋图片

正如预期的那样,图片不同。但是,如果在看到图片后,我们想对图片进行修改会怎么样呢?例如,看到这张图片中有一艘船会很不错。让我们要求我们的代理在同一张图片上添加一艘船。

picture_ocean_updated = agent.run("Transform the image in `picture_ocean` to add a ship to it.", picture=picture_ocean)

picture_ocean_updated

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hugging Face Agent生成的海洋和船只图片

如我们所见,这次代理使用了一个不同的工具叫做image_transform,因为它不再需要生成整张图像,而是通过在提供的图像中添加一艘船来转换图像。我们可以看到图像左上角的那个小船。表现得还不错!

不过这时候你可能会问,代理实际上在做什么?我们将在接下来回答这个问题。

第 5 步 — 代理实际上做了什么?

正如我们之前所学,代理是执行我们提供的提示的 LLM。换句话说,代理接收我们的提示,然后根据要求,代理收集他们认为有用的工具并运行这些代码。Hugging Face 提供了一种查看代理代码的方法,即在我们的运行命令中添加return_code=True。换句话说,我们可以要求代理仅返回代码块,然后我们可以自己修改和/或运行代码。

让我们重新运行我们的命令,如下所示,并查看结果:

task = "Draw me a picture of the ocean"

agent_starcoder.run(task, return_code=True)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我已经清理并重新编写了代理返回的内容如下:

from transformers import load_tool
image_generator = load_tool("huggingface-tools/text-to-image")
image = image_generator(prompt="ocean")

让我们运行这段代码并查看结果。

 from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image = image_generator(prompt="ocean")

image

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

海洋的图片,由Hugging Face 代理生成

结果如预期那样工作。换句话说,我们不再需要依赖代理为我们创建代码,我们可以直接使用huggingface-tools/text-to-image工具生成图片。

现在我们了解了代理如何选择工具并工作的过程,让我们看看一些额外的工具。

第 6 步 — 额外工具

在本节中,我们将涵盖代理可以使用的其他一些工具,如下所示:

  • 图像描述

  • 问题解答

  • 翻译

  • 混合请求

6.1. 图像描述

这是一个有趣的练习。首先,我们将使用text-to-image工具生成一张玩具车的图片。然后我们将保存该图片,并要求代理对其进行描述。

让我们开始创建一张玩具车的图片。

from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image_generator(prompt="toy car")

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

玩具车的图片,由Hugging Face 代理生成

然后,我将其保存到本地驱动器,然后使用Python Imaging Library 或 PIL读取它。之后,我们将提示代理对该图像进行描述。

下面是代码块:

from PIL import Image

task = 'Caption the following image'

image = Image.open('/content/picture.png')

agent_starcoder.run(task, image=image)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看看最后一句话——这是一个很好的描述!代理描述了这辆车,这似乎相当准确。如果你对幕后发生的事情感到好奇,让我们让代理返回代码,看看使用了哪些工具以及如何使用,如下所示:

agent_starcoder.run(task, image=image, return_code=True)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们将代码块清理如下:

from transformers import load_tool
image_captioner = load_tool("image-captioning")
caption = image_captioner(image)

代理所做的是加载image-captioning工具,然后为我们提供的图像生成标题。听起来很简单!让我们继续下一个例子。

6.2. 问答

问答是显而易见的,但让我们让它更有趣。与其提供一段文字给代理并询问有关提供信息的问题,不如提供一张图像,并询问代理有关图像的内容。

我在一个 Word 文档中写了几行文字,然后将其保存为*.jpg图像在本地。我们首先使用 PIL 查看如下图像:

from PIL import Image
image = Image.open('/content/jack.jpg')
image.show()

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,图像中有几句关于我在西雅图的虚构朋友 Jack 的句子。接下来,让我们向代理提问,并看看它如何回应。我想问代理 Jack 最喜欢的颜色是什么,如下所示:

task = "in the following 'document', what is Jack's favorite color?"

agent_starcoder.run(task, document=image)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再次查看底部的最后一句——这相当不错!我们可以看到文本提取并不完美,例如,它将 Tesla 提取为‘tesia’,但代理仍然返回了相关的图像部分,回答了我们的问题。

让我们看看代理究竟使用了哪些工具:

task = "in the following 'document', what is Jack's favorite color?"

agent_starcoder.run(task, document=image, return_code=True)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们将代码清理如下:

from transformers import load_tool

document_qa = load_tool("document-question-answering")

answer = document_qa(document, question="What is Jack's favorite color?")
print(f"The answer is {answer}.")

我们可以看到代理使用了document-question-answering工具,然后以问答任务的形式提出了问题。

接下来,让我们看看代理是否能执行翻译。

6.3. 翻译

这部分相当简单。让我们让代理翻译一个句子,然后看看它使用了哪些工具。

text = 'this is a sentence in English'

task = "translate the following 'document' to French"

agent_starcoder.run(task, document=text)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太棒了!我们看到了结果,这是所提供句子的法语翻译。让我们看看代理使用了什么工具:

agent_starcoder.run(task, document=text, return_code=True)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我先清理一下代码:

from transformers import load_tool
translator = load_tool("translation")
translated_document = translator(document, src_lang="English", tgt_lang="French")

这看起来相当简单。代理使用了translation工具,并且代理正确地识别了源语言(src_lang)和目标语言(tgt_lang),这是基于我们要求的!

到这一步,我在想代理是否能够处理更复杂的任务。我们接下来会看看。

6.4. 混合请求

如果我们将问答和翻译结合起来呢?让我们问代理 Jack 最喜欢的颜色是什么,同时要求答案必须用法语返回。

task = "in the following 'document', what is Jack's favorite color? After you answer the question, translate the answer to French"

agent_starcoder.run(task, document=image)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看看最后一句——这很好!我们看到代理首先返回了英文答案,然后按照我们的要求将响应翻译成了法语!

结论

  • 代理和工具是一个强大的组合。我认为代理对技术用户(即机器学习和 AI 从业者)和非技术用户都很有益。对于技术用户,代理可以加快过程——代理可以帮助选择多个工具中的一个,并返回代码供技术用户根据需求进行修改。另一方面,不熟悉机器学习的非技术用户,只需用简单的英语提出需求,代理将处理其余的工作。

  • 希望你喜欢这篇关于代理和工具的简要教程!如果你对在 Hugging Face 中实现自然语言处理(NLP)任务感兴趣,请查看下面的帖子。

## 使用 Hugging Face 实现 NLP 任务

- 介绍如何使用 Hugging Face 进行 NLP 任务的教程。

[towardsdatascience.com

- 感谢阅读!

  • 如果你觉得这篇帖子有帮助,请 在 Medium 上关注我 并订阅以接收我最新的帖子!

  • (除非另有说明,所有图片均由作者提供。)

什么是多模态模型?

原文:towardsdatascience.com/what-are-multimodal-models-fe118f3ef963

赋予大型语言模型(LLM)视觉能力!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Omer Mahmood

·发表于 Towards Data Science ·阅读时间 6 分钟·2023 年 10 月 16 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Atlas by Nomic 上运行的 Mecari 文本与图像嵌入演示 截图。

这篇文章适合谁?

  • 读者群体 [🟢⚪️⚪️]: AI 初学者,熟悉流行概念、模型及其应用

  • 等级 [🟢🟢️⚪️]: 中级话题

  • 复杂度 [🟢⚪️⚪️]: 容易理解,没有数学公式或复杂理论

❓为什么这很重要

基础的大型语言模型(LLM),经过在庞大数据集上的预训练,在通过零-shot、few-shot 或迁移学习的提示下处理通用、多任务时相当高效。

确实,这些模型的例子如 PaLM2GPT4 已经彻底改变了我们与计算机交互的方式,使用文本作为输入,但是……

  • 如果有一种方法可以通过使这些模型使用不同的输入模态,如照片、音频和视频,来扩展它们的智能会怎样?换句话说,让它们变成多模态的!

  • 这可能会大大改善我们在网络上搜索信息的方式,甚至在现实世界应用中,例如医学和病理学,帮助我们理解周围的世界。

  • 有解决方案!多模态深度学习模型可以结合不同类型输入的嵌入,使得例如一个大型语言模型(LLM)能够“看到”你所询问的内容,并返回相关结果。

⚡️继续关注 如果你想了解更多关于这一切如何运作的知识,并试用一个实际的演示!

🔥 这如何运作?

它从嵌入开始

训练深度学习模型的最强大构建模块之一是创建嵌入向量。

在训练过程中,模型将遇到的不同类别(例如,人、食物和玩具)编码成其数值表示,即嵌入,这些嵌入存储为数字向量。

嵌入在我们想从类别(或类)的稀疏表示(例如一长串文本或图像)转变为更紧凑的形式,并且可以在其他模型中重用时非常有用。

简而言之,嵌入为我们提供了一种以简写形式存储事物含义的方法,机器可以用来快速比较和搜索!

更具体地说,通过对不同图像进行训练的视觉模型,具有相似外观和含义的图像将在它创建的嵌入空间中被紧密放置在一起。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:表示不同类别图像和同一嵌入空间中相似图像的嵌入可视化。由作者插图。

“模型可以将图像映射到嵌入,这是空间中的一个位置。因此,如果你在嵌入周围查看,你可以找到其他具有相似外观和含义的图像。这就是图像相似性搜索的工作原理!”[1]

图像和文本对的训练

类似于前面的示例,深度学习模型也可以通过相关的文本和图像配对进行训练。这是通过结合其他模型来实现的,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:使用模型组合对图像和文本对进行训练,即“CoCa”。由作者插图。

让我们来解析一下当我们传入一个图像和文本对时发生了什么:

  • 图像编码器: 用于获取图像嵌入的模型,

  • 单模态文本编码器: 一种用于获取文本嵌入的模型。该模型由图像编码器模型输入,接受源图像嵌入作为输入,产生图像和文本对的序列表示,即自注意力

  • 多模态文本编码器: 一种学习图像和文本之间关系的模型。更正式地说,这种技术称为交叉注意力:一种在 Transformer 架构中混合两种不同嵌入序列的注意力机制,或者在我们的案例中是图像和描述它们的文本。

这种设计,或结合模型的一种方式,被称为对比字幕或简单地‘CoCa’,如果你想深入了解,可以查看这里

“结果:一个基础的‘视觉语言模型(VLM)’…

我们建立了一个具有固定维度的共享嵌入空间,用于图像和文本,按照它们的含义组织。在这个空间中,含义相似的图像和文本被放在一起。”[1]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:相关图像和文本的嵌入可视化。由作者插图。

这意味着你可以根据文本搜索图像(文本到图像搜索),或者根据图像搜索文本(图像到文本搜索)。

这是 Google 搜索如何在图像和文本中找到相关结果的基本思路。

🔍 试一下快速演示!

想看看文本和图像嵌入在现实世界应用中的效果吗?

你可以通过使用在 Nomic 提供的 Altas 上运行的演示免费进行体验。

“Atlas 使你能够与非结构化文本、图像和音频数据进行互动、发现洞察并进行构建。”[2]

这里有一个搜索演示,将 Mercari 网站(一个日本电子商务零售商)上可用的项目的文本和图像嵌入结合在一起。

1. 导航至:atlas.nomic.ai/map/vertex-mercari(你可能需要创建一个免费账户以获得访问权限)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:Nomic 的 Atlas 用户界面的截图,运行 Mecari 嵌入演示。

2. 你可以在表示嵌入空间的“点云”可视化上移动鼠标光标,以进行搜索。

在界面右上角的“选择工具”中,你可以输入文本搜索查询,按某些属性进行筛选或使用‘套索’工具进行自定义选择。

真的就这么简单!如果你想了解更多关于它的组装过程,可以查看 这里

🍱 多模态语言模型

是的,这比我们讨论的内容还要多。对于大型语言模型,复杂的 变换器 架构用于通过标记化、位置编码和嵌入层将文本和其他数据转换为向量并进行反向转换。

但总的来说,我们之前讨论过的相同原理,使得我们可以利用图像来补充传递给大型语言模型(即多模态语言模型)的文本提示,这允许用户指定任何视觉或语言任务。

多模态语言模型是最近的一个强大发展,像 GPT-4VMedPalm M 这样的例子正在推动我们使用大型语言模型的边界,因为它们可以根据图像和文本输入提供丰富的响应。

例如,MedPalm M 使得基于 X 射线图像让模型对患者进行诊断成为可能,结果可与合格的医生相媲美!

重要的是要注意,多模态语言模型并不完美,仍然可能受到早期模型局限性的影响。

它们仍然不是完全可靠的(即,它们可能“幻想”事实并产生推理错误)。在使用语言模型输出时,尤其是在高风险情境下(如医疗诊断),应特别小心。

确保适当的保护措施和流程到位是至关重要的(例如人工审核、附加背景信息的基础,或甚至完全避免高风险用例)。

这是一个令人兴奋的领域,代表了大型语言模型的下一次进化!

🏁 总结

在这篇文章中,我们介绍了:

  • 嵌入是如何被用于使模型捕捉(编码)它们训练时输入的数据的。

  • 多模态深度学习模型的概念通常由多个单模态神经网络组成,这些网络分别处理每种输入模态。

  • 一个简单的演示,结合文本和图像嵌入,以说明在网站上搜索产品时的多模态搜索用例。

  • 最后,我们还讨论了一些潜在的用例以及实际的多模态 LLM 应用实例。

👋🏼感谢你的光临,希望你喜欢这篇文章,我们下次见!

📚 参考资料及进一步阅读

[1] “什么是多模态搜索:‘具有视觉能力的 LLM’如何改变业务” - cloud.google.com/blog/products/ai-machine-learning/multimodal-generative-ai-search

[2] atlas.nomic.ai/

出版物:

Transformer 架构中的 Query、Key 和 Value 是什么?它们为什么被使用?

原文:towardsdatascience.com/what-are-query-key-and-value-in-the-transformer-architecture-and-why-are-they-used-acbe73f731f2

对 Transformer 架构中 Key、Query 和 Value 概念背后的直觉进行分析,以及为何使用它们。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Ebrahim Pichka

·发布于 Towards Data Science ·阅读时间 10 分钟·2023 年 10 月 5 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图像 — 由 Midjourney 生成

介绍

近年来,Transformer 架构在自然语言处理(NLP)领域引起了轰动,在机器翻译、语言建模、文本摘要等多种任务中取得了最先进的成果,并且在其他 AI 领域(如视觉、语音、强化学习等)也有所应用。

Vaswani 等人(2017 年)首次在他们的论文*“Attention Is All You Need”*中介绍了 Transformer,其中他们使用了自注意力机制,而没有加入递归连接,同时模型可以选择性地关注输入序列的特定部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Transformer 模型架构 — 来自 Vaswani 等人(2017 年)论文的图像(来源:arXiv:1706.03762v7

特别是,之前的序列模型,例如递归编码器-解码器模型,在捕捉长期依赖关系和并行计算方面存在限制。实际上,在 2017 年 Transformer 论文发布之前,大多数 NLP 任务的最先进性能是通过在 RNN 上使用注意力机制获得的,所以注意力在 Transformer 之前就已存在。通过引入多头注意力机制,并去掉 RNN 部分,Transformer 架构通过允许多个独立的注意力机制解决了这些问题。

在这篇文章中,我们将深入探讨该架构的一个细节,即查询(Query)、键(Key)和值(Value),并尝试理解这部分所使用的直觉。

请注意,这篇文章假设你已经熟悉一些基本的自然语言处理和深度学习概念,如嵌入线性(密集)层,以及一般的简单神经网络的工作原理。

注意!

首先,让我们了解注意力机制试图实现什么。为了简化起见,我们从一个简单的例子开始,了解我们要解决的具体问题,而不深入讨论注意力机制的所有术语。

上下文很重要

考虑平滑时间序列数据的情况。时间序列已知是最基本的序列数据之一,因为它已经是数值化和结构化的形式,并且通常处于低维空间。因此,提出一个好的起始示例是合适的。

为了平滑一个高度变化的时间序列,一种常见的技术是计算每个时间步的“加权平均值”,如图 1 所示,权重通常基于相邻时间步距离目标时间步的远近来选择。例如,在高斯平滑中,这些权重是从以当前步为中心的高斯函数中提取的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

时间序列平滑示例 — 作者提供的图像。

从某种意义上说,我们所做的是:

  1. 我们取了一系列值

  2. 对于序列中的每一步,我们添加了(加权的)上下文来自其邻近值,而添加的上下文(权重)仅与它们的接近度相关。

  3. 最后,我们获得了一个新的上下文化的序列,这使得我们可以更容易地理解和分析。

这个示例中有两个关键点/问题:

  • 它仅使用接近度顺序位置的值来获取上下文的权重。

  • 权重是通过对所有点应用固定的任意规则来计算的。

语言的案例

在机器学习中,文本数据通常需要用实值向量(即嵌入)来表示。因此,我们假设标记(或单词)的主要含义被编码在这些向量中。现在,对于文本序列数据,如果我们想要像上述示例那样对序列中的每个标记进行上下文化,使每个标记的新嵌入包含更多关于其上下文的信息,我们将遇到一些问题,接下来我们将讨论这些问题:

首先,在上面的示例中,我们仅仅使用了标记的接近度来确定要添加的上下文的重要性(权重),而单词的工作方式并非如此

在语言中,单词在句子中的上下文不仅仅基于顺序距离和接近度。我们不能仅仅依赖接近度来融入其他单词的上下文。

其次,仅通过对上下文标记的嵌入的(加权)平均值来添加上下文可能不够直观。一个标记的嵌入可能包含有关该标记的不同句法、语义或词汇方面的信息。所有这些信息可能与要添加的目标标记无关。因此,最好不要将所有信息作为整体添加为上下文。

那么,如果我们有一些(向量)表示序列中的词,我们如何获得权重相关的上下文以重新加权和上下文化序列中的每个标记?

从广义上讲,答案是我们必须基于标记意义的某些特定方面(可以是语义的、句法的或其他任何方面)“搜索”它。在此搜索过程中,根据相关性或重要性分配权重上下文信息

这意味着,对于序列中的每个标记,我们必须遍历序列中的所有其他标记,并根据我们用来比较目标标记与其他标记的相似性度量,为它们分配权重上下文信息它们在期望上下文中的相似性越大,权重就越大

因此,一般来说,我们可以说注意力机制基本上是(1)为序列中的其他标记分配权重,(2)从其他标记中提取相关上下文,以根据它们与目标标记的相关性或重要性(即关注它们)。

我们说过,为了找到相关性/重要性,我们需要在序列中进行搜索并逐一比较标记。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在序列中搜索与标记相关的上下文以进行添加——图片由作者提供。

这就是查询找到意义的地方。

查询**

为了更清楚地理解,可以想象一下你在 YouTube 上搜索内容的情形。例如,假设 YouTube 将所有视频存储为一对“视频标题”和“视频文件”本身。我们称之为键值对,其中键是视频标题,值是视频本身。

你在搜索框中输入的文本在搜索术语中称为查询。所以从某种意义上讲,当你搜索某个内容时,YouTube 将你的搜索查询与所有视频的键进行比较,然后衡量它们之间的相似性,并根据相似性从高到低排序它们的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个基本的搜索过程展示了键、查询和值的概念——图片由作者提供。

在我们的问题中,我们有一个标记向量的序列,我们想要搜索权重以重新加权和上下文化序列中的每个标记(词)嵌入,我们可以从以下方面考虑:

  1. 你想要查找的是查询

  2. 你正在搜索的是键值对

  3. 查询会与所有的键进行比较,以衡量相关性/重要性/相似性

  4. 根据分配的相似性度量来使用。

另一个有用的相关类比是字典(或哈希表)数据结构。字典以键值对的形式存储数据,将键映射到其相应的值对。当你尝试获取特定的值时,你必须提供一个查询来匹配其对应的,然后它在这些键中搜索与查询进行比较如果匹配,则返回所需的值。

然而,这里的区别在于这是一个“硬匹配”情况,其中查询要么完全匹配键,要么不匹配,中间的相似性不会被测量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字典查询与键值对匹配 — 图片来源于作者

我们之前提到,我们只处理实值向量(标记嵌入)。因此,查询、键和值也需要是向量。然而,到目前为止,我们只有每个标记的一个向量,即其嵌入向量。那么,我们应该如何获得查询、键和值向量呢?

我们构造它们使用线性投影(线性变换即单个密集层,具有不同的权重集合:Wq、Wₖ、Wᵥ)对每个标记的嵌入向量进行变换。这意味着我们为查询、键和值分别使用可学习的权重向量,对词嵌入进行线性变换,以获取相应的查询、键和值向量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对词嵌入进行线性变换以获取查询、键和值向量 — 图片来源于作者

一个标记的嵌入可能代表该标记的不同上下文、结构和语法方面或含义。通过使用可学习的线性变换层来从标记的嵌入构造这些向量,我们允许网络:

  1. 提取并将信息的有限特定部分传递到QKV向量中。

  2. 确定一个更狭窄的上下文,在其中进行搜索和匹配。

  3. 学习在嵌入中哪些信息更重要。

现在,手中有了QKV向量,我们能够执行之前讨论的“搜索和比较”过程。这导致了注意力机制的最终推导,如(Vaswani et al 2017)中所提。

对于每个标记:

  • 我们将其查询向量与所有其他标记的键向量进行比较。

  • 计算每两个之间的向量相似性分数(即原始论文中的点积相似性)

  • 将这些相似性分数转换为权重,通过将它们缩放到 [0,1](即 Softmax)

  • 并通过加权其对应的值向量来增加加权的上下文。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点积注意力过程 — 图片来源于作者

因此,QKV向量的整个概念就像是一个词典,用于模拟搜索与匹配过程,从中我们学习两个序列令牌的相关性(权重)以及应该添加什么作为上下文(值)。还要注意,这一过程不必按顺序进行(一个令牌一次)。这一切通过矩阵操作并行进行。

请注意,在下面的插图中,矩阵的维度与原始论文中的维度有所不同(n_tokensdim 而不是 dimn_tokens)。稍后在本文中,您将看到注意力机制的原始和完整公式,其顺序与此相反。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点积注意力的矩阵形式 — 作者绘制的图片

这导致了对每个令牌的上下文感知嵌入,其中添加的上下文基于令牌之间的相关性,并通过QKV向量转换学习得到。因此,使用了点积注意力机制。Vaswani 等人(2017)的原始注意力机制也缩放了KQ向量的点积,即将结果向量除以sqrt(d),其中d是查询向量的维度。因此得名***“缩放点积注意力”***。这种缩放有助于在传递到 Softmax 函数之前减少点积的方差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意力机制公式 — Vaswani 等人(2017)(来源:arXiv:1706.03762v7

最后,我们提到将嵌入转换为QKV的线性层可能只提取嵌入中的特定模式以找到注意力权重。为了使模型能够学习序列令牌之间的不同复杂关系,创建并使用这些QKV的多个不同版本,以便每个版本关注嵌入中存在的不同模式。这些多个版本称为注意力头,因此得名“多头注意力”。这些头部也可以向量化,并使用当前流行的深度学习框架并行计算。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多头缩放点积注意力 — 图片来自 Vaswani 等人(2017)的论文(来源:arXiv:1706.03762v7

结论

总结一下,在这篇文章中,我试图描绘和分析 Query、Key 和 Value 的直觉,这些是注意力机制中的关键组件,初次接触时可能有点难以理解。

本文讨论的注意力机制是提出在变换器架构中,这种架构在(Vaswani et al, 2017)的论文“Attention is all you need”中介绍,并且自此以来,在深度学习的多个任务和基准中一直是表现最优的架构之一。鉴于其广泛的应用和适用性,了解这一架构中的细节和使用原因将会很有帮助。

我在解释这个话题时尽量做到清晰和基础,通过举例和插图尽可能地说明。

参考文献

[1] Vaswani, Ashish, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, and Illia Polosukhin. “Attention Is All You Need.” arXiv, 2023 年 8 月 1 日。 doi.org/10.48550/arXiv.1706.03762

GPT 模型背后的数据中心 AI 概念是什么?

原文:towardsdatascience.com/what-are-the-data-centric-ai-concepts-behind-gpt-models-a590071bb727

解读 ChatGPT 和 GPT-4 中使用的数据中心 AI 技术

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Henry Lai

·发表于 Towards Data Science ·阅读时间 8 分钟·2023 年 3 月 29 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

arxiv.org/abs/2303.10158。作者提供的图像。

人工智能(AI)在改变我们的生活、工作和与技术互动的方式上取得了令人难以置信的进展。最近,取得显著进展的一个领域是大型语言模型(LLMs)的发展,例如 GPT-3ChatGPTGPT-4。这些模型能够以令人印象深刻的准确性执行语言翻译、文本摘要和问答等任务。

尽管很难忽视大型语言模型(LLMs)模型尺寸的不断增长,但同样重要的是认识到它们的成功在很大程度上归功于用于训练它们的大量高质量数据。

在本文中,我们将从数据中心 AI 的角度概述大型语言模型(LLMs)的最新进展,借鉴我们最近的调查论文 [1,2] 以及在 GitHub 上的相关技术资源。特别是,我们将通过 数据中心 AI 的视角,深入探讨 GPT 模型。我们将通过讨论三个数据中心 AI 目标来解读 GPT 模型背后的数据中心 AI 概念: 训练数据开发、推理数据开发和数据维护

大型语言模型(LLMs)和 GPT 模型

LLM 是一种自然语言处理模型,经过训练以在上下文中推断单词。例如,LLM 的最基本功能是根据上下文预测缺失的标记。为此,LLM 通过海量数据训练来预测每个标记候选的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个示例,展示了如何在上下文中用 LLM 预测缺失标记的概率。图片由作者提供。

GPT 模型指的是一系列由 OpenAI 创建的 LLM,例如 GPT-1GPT-2GPT-3InstructGPTChatGPT/GPT-4。与其他 LLM 一样,GPT 模型的架构主要基于 Transformers,该架构使用文本和位置嵌入作为输入,并通过注意力层建模标记之间的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-1 模型架构。图片来自论文 cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf

后来的 GPT 模型使用了与 GPT-1 相似的架构,但模型参数更多,层数更多,上下文长度更大,隐藏层大小等也有所增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT 模型的模型大小比较。图片由作者提供。

什么是数据驱动的 AI?

数据驱动的 AI 是一种新兴的思考方式,旨在构建 AI 系统。它得到了 AI 先驱 Andrew Ng 的倡导。

数据驱动的 AI 是系统地工程化用于构建 AI 系统的数据的学科。 — Andrew Ng

过去,我们主要关注在数据基本不变的情况下创建更好的模型(模型驱动 AI)。然而,这种方法可能会在现实世界中导致问题,因为它没有考虑到数据中可能出现的不同问题,如标签不准确、重复和偏差。因此,“过拟合” 一个数据集不一定会带来更好的模型表现。

相比之下,数据驱动的 AI 侧重于提高用于构建 AI 系统的数据的质量和数量。这意味着关注点在于数据本身,而模型则相对固定。采用数据驱动的方法开发 AI 系统在现实世界场景中具有更大的潜力,因为用于训练的数据最终决定了模型的最大能力。

需要注意的是,“数据中心”与“数据驱动”在根本上有所不同,因为后者仅强调使用数据来指导 AI 开发,通常仍然侧重于开发模型,而不是工程化数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据中心 AI 与模型中心 AI 的比较。 arxiv.org/abs/2301.04819 图像由作者提供。

数据中心 AI 框架 由三个目标组成:

  • 训练数据开发是为了收集和生成丰富且高质量的数据,以支持机器学习模型的训练。

  • 推断数据开发是为了创建新的评估集,这些评估集可以提供对模型更细致的见解,或通过工程化的数据输入触发模型的特定能力。

  • 数据维护是为了确保在动态环境中数据的质量和可靠性。数据维护至关重要,因为现实世界中的数据不是一次性创建的,而是需要持续的维护。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据中心 AI 框架。 arxiv.org/abs/2303.10158。图像由作者提供。

数据中心 AI 如何让 GPT 模型取得成功

几个月前,Yann LeCun 在推特上表示 ChatGPT 并没有什么新意。确实,ChatGPT 和 GPT-4 中使用的所有技术(变换器、从人类反馈中学习的强化学习等)都并不新颖。然而,它们确实取得了之前模型无法达到的惊人结果。那么,它们成功的驱动力是什么呢?

训练数据开发。 通过更好的数据收集、数据标注和数据准备策略,用于训练 GPT 模型的数据的数量和质量有了显著提升。

  • GPT-1: BooksCorpus 数据集 被用于训练。该数据集包含 4629.00 MB 的原始文本,涵盖了来自冒险、奇幻和浪漫等多种类型的书籍。

    - 数据中心的 AI 策略: 无。

    - 结果: 关于这个数据集的 GPT-1 可以通过微调提高下游任务的表现。

  • GPT-2: WebText 被用于训练。这是一个由 OpenAI 创建的内部数据集,通过抓取 Reddit 上的外链生成。

    - 数据中心的 AI 策略: (1) 通过仅使用来自 Reddit 的外链(获得至少 3 个 Karma)来策划/筛选数据。 (2) 使用工具 DragnetNewspaper 提取干净的内容。 (3) 采用去重和一些其他基于启发式的清洗方法(论文中未提及具体细节)。

    - 结果: 经过筛选后获得了 40 GB 的文本。GPT-2 在未经过微调的情况下实现了强大的零样本结果。

  • GPT-3: GPT-3 的训练主要基于 Common Crawl

    - 数据中心 AI 策略:(1)训练分类器,根据每个文档与 WebText 的相似性来筛选低质量文档,WebText 是高质量文档的代理。 (2)使用 Spark 的 MinHashLSH 进行模糊去重。 (3)用 WebText、书籍语料库和维基百科来增强数据。

    - 结果: 经过筛选后,从 45TB 的纯文本中获得了 570GB 的文本(仅 1.27% 的数据在此质量筛选中被选择)。GPT-3 在零样本设置中显著优于 GPT-2。

  • InstructGPT: 让人类评估答案以调整 GPT-3,使其更好地符合人类期望。他们为标注员设计了测试,只有通过测试的标注员才有资格进行标注。他们甚至设计了一项调查,以确保标注员喜欢标注过程。

    - 数据中心 AI 策略:(1)使用人工提供的答案来调整模型,进行监督训练。 (2)收集比较数据来训练奖励模型,然后使用此奖励模型通过人类反馈强化学习(RLHF)来调整 GPT-3。

    - 结果: InstructGPT 显示出更好的真实性和更少的偏见,即更好的对齐。

  • ChatGPT/GPT-4: OpenAI 并未公开详细信息。但已知 ChatGPT/GPT-4 大体上遵循之前 GPT 模型的设计,并且仍然使用 RLHF 来调整模型(可能使用了更多、更高质量的数据/标签)。普遍认为 GPT-4 使用了更大的数据集,因为模型权重有所增加。

推理数据开发。 由于最近的 GPT 模型已经足够强大,我们可以通过调整提示(或调整推理数据)来实现各种目标,而不需要调整模型。例如,我们可以通过将待总结的文本与“总结一下”或“TL;DR”这样的指令一起提供来进行文本摘要,从而引导推理过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提示调优。 arxiv.org/abs/2303.10158。图像由作者提供。

设计适当的推理提示是一项具有挑战性的任务。这在很大程度上依赖于启发式方法。一项不错的 调查 总结了不同的促销方法。有时,即使是语义上相似的提示也可能产生非常不同的输出。在这种情况下,可能需要 软提示基础校准 来减少方差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于软提示的校准。图像来自论文 arxiv.org/abs/2303.13035v1,已获原作者许可。

LLM 的推理数据开发研究仍处于初期阶段。更多 推理数据开发技术在其他任务中 的应用可能会在不久的将来应用于 LLM。

数据维护。 ChatGPT/GPT-4 作为一种商业产品,不仅仅是训练一次,而是会持续更新和维护。显然,我们无法了解 OpenAI 外部的数据维护是如何执行的。因此,我们讨论一些用于 GPT 模型的数据中心 AI 策略,这些策略现在或将来很可能会被使用:

- 持续的数据收集: 当我们使用 ChatGPT/GPT-4 时,我们的提示/反馈可能会被 OpenAI 进一步用于提升他们的模型。质量指标和保证策略可能已经被设计和实施,以在此过程中收集高质量的数据。

- 数据理解工具: 可能已经开发出各种工具来可视化和理解用户数据,从而更好地理解用户的需求并指导未来的改进方向。

- 高效的数据处理: 随着 ChatGPT/GPT-4 用户数量的快速增长,需要一个高效的数据管理系统来实现快速的数据获取。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ChatGPT/GPT-4 使用“赞”和“踩”来收集用户反馈,以进一步发展他们的系统。截图来自 chat.openai.com/chat

数据科学社区能从这波 LLM 中学到什么?

LLM 的成功已经彻底改变了 AI。展望未来,LLM 可能会进一步革新数据科学生命周期。我们做出两个预测:

  • 数据中心 AI 变得更加重要。 经过多年的研究,模型设计已经非常成熟,特别是在 Transformer 之后。工程数据将成为未来提高 AI 系统的关键(或可能是唯一)途径。此外,当模型变得足够强大时,我们在日常工作中无需训练模型。相反,我们只需设计合适的推理数据(提示工程)以从模型中探测知识。因此,数据中心 AI 的研究与发展将推动未来的进步。

  • LLM 将推动更好的数据中心 AI 解决方案。 许多繁琐的数据科学工作可以借助 LLM 更高效地完成。例如,ChatGPT/GPT-4 已经能够编写可用的代码来处理和清理数据。此外,LLM 甚至可以用于创建训练数据。例如,最近的工作 表明,使用 LLM 生成合成数据可以提升临床文本挖掘中的模型性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 LLM 生成合成数据以训练模型。图片来自论文 arxiv.org/abs/2303.04360 并获得原作者的许可。

资源

我希望这篇文章能激发你在自己的工作中。你可以通过以下论文了解更多关于数据中心 AI 框架以及它如何使 LLM 受益的信息:

我们维护了一个GitHub 仓库,该仓库将定期更新相关的数据驱动 AI 资源。敬请关注!

在后续文章中,我将深入探讨数据驱动 AI 的三个目标(训练数据开发、推理数据开发和数据维护),并介绍代表性的方法。

对编码分类受保护属性的公平性影响是什么?

原文:towardsdatascience.com/what-are-the-fairness-implications-of-encoding-categorical-protected-attributes-2cc1dd0f5229?source=collection_archive---------5-----------------------#2023-05-06

探讨编码受保护属性对机器学习公平性的影响

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Carlos Mougan

·

关注 发表在Towards Data Science ·7 分钟阅读·2023 年 5 月 6 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

曙光中的公正女神来自Unsplash

我们将探讨分类属性编码的世界及其对机器学习模型在准确性和公平性方面的影响。分类属性,如出生国家或族裔,在确定数据中敏感信息的存在方面起着关键作用。然而,许多机器学习算法难以直接处理分类属性,因此需要使用编码方法将其转换为模型可以利用的数值特征。此外,我们还研究了交叉公平性工程的影响。

本博客包含了我们AI、伦理和社会(AIES’23)会议论文编码保护分类属性的公平性影响的总结,[link]。

总结: 编码保护属性提高了模型性能,但也增加了公平性违背。这可以通过目标编码正则化来调和。工程化交叉保护属性(性别-种族)提高了性能,但大幅增加了公平性违背。

引言

敏感属性在公平性中至关重要,其处理贯穿整个机器学习流程。许多机器学习算法要求将分类属性适当地编码为数值数据,然后再输入到算法中。

编码分类保护属性的影响是什么?

诱导偏差的类型

我们研究了这些编码方法可能引发的两种偏差:不可减少的偏差和可减少的偏差:

  • 不可减少的偏差: 这是指由于将群体分类到标签中而产生的(直接)群体歧视:关于比较群体的更多数据无法减少这种类型的偏差。在 COMPAS 数据集中,犯罪分子的族裔在确定再犯评分时至关重要;对像非洲裔美国人白人这样的大族裔群体的数值编码可能导致歧视,这是一种源于不可减少偏差的不公平效应。

  • 可减少的偏差: 由于对具有小统计代表性的群体进行编码时的方差而产生,有时甚至只有非常少的实例。当对族裔类别阿拉伯裔进行编码时,常常会引发较大的采样方差,最终导致几乎是随机和不现实的编码,从而发现和引入可减少的偏差。

编码方法

独热编码: 这是分类特征中最成熟的编码方法,也是公平性文献中的默认方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

One Hot Encoding 的示例。图片来源:作者

  • 目标编码: 分类特征被替换为各自类别的均值目标值。这种技术处理高基数分类数据,并对类别进行排序。目标编码的主要缺点出现在样本较少的类别被替换为接近期望目标的值时。这会引入模型偏差,因为它过度信任目标编码特征,并使其容易过拟合和减少偏差。

此外,这种类型的编码允许正则化。在本文中,我们研究了两种类型的正则化(在博客中我们只研究了高斯正则化)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标编码示例说明。作者提供的图像

实验

对于预测性能,我们使用 AUC 和公平性指标。参考组(r)与我们想要比较的组(i)之间。Z 是受保护的属性,\hat{Y}是模型预测。

人口统计学平等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不受特权组与受特权组获得的有利结果之间的差异

平等机会公平性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

确保公平机会而非原始结果。该值是

受保护组与

参考组

平均绝对赔率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不受特权组与受特权组的真实正例率和假正例率之间绝对差异的总和

实验假设

对受保护属性的编码

  1. 提高性能

  2. 增加了公平性违反

  3. 性能和公平性可以通过目标编码正则化来调和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:比较 OHE 和目标编码正则化(高斯噪声)在 COMPAS 数据集上的逻辑回归。红点表示不同的正则化参数:红色越深,正则化越高。蓝点表示独热编码。作者提供的图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高斯噪声正则化参数 λ \lambda λ对 COMPAS 数据集测试集上的性能和公平性指标的影响,使用 L1 惩罚的逻辑回归。在左侧图像中,所有受保护组的 AUC 都超过了正则化超参数。在右侧,平等机会公平性、人口统计学平等和平均绝对赔率在正则化超参数中的变化。作者提供的图像

在实验中,我们展示了公平机器学习文献中最常用的分类编码方法——独热编码,在平等机会公平性方面比目标编码更具歧视性。然而,目标编码表现出了良好的结果。使用高斯正则化的目标编码在存在两种偏见时显示了改善,但在过度参数化的情况下风险会显著丧失模型性能。

交叉公正性

在机器学习中追求公平时,必须认识到属性的复杂相互作用及其对歧视的影响。本节将深入探讨分类属性编码对交叉公正性的影响,重点关注从 COMPAS 数据集中获得的见解。我们提出了有关通过属性工程可能导致公正性下降的假设、分类编码可能增加歧视的倾向以及正则化技术在缓解交叉偏见中的有效性。

为了探讨编码对交叉公正性的影响,我们分析了 COMPAS 数据集中连接的“民族”和“婚姻状况”属性。通过选择“白人已婚”组作为参考,我们比较了所有组的最大公平性违规。为了便于理解,我们利用了上一节的广义线性模型,并强调平等机会公平性指标,这与其他公平性指标的行为一致。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编码分类保护属性的平等机会公平性及其在 Compas 数据集上的正则化效果。水平线是保护属性未包含在训练数据中的基线。正则化目标编码不会损害公平性指标,但可以提高该数据集的预测性能。图片由作者提供。

上图直观地展示了属性连接如何创建交叉属性并加剧公平性违规,为我们的第一个假设提供了实证支持。值得注意的是,即使在未编码保护属性的情况下(由水平线表示),最大公平性违规也显著增加,从“民族”0.015 或“婚姻状况”0.08 增加到交叉属性的 0.16。这一发现证实了金伯莉·克伦肖 1958 年的开创性工作,揭示了不同形式的压迫如何交织在一起并加剧对边缘化群体的歧视。

此外,我们的第二个假设得到了验证,即观察到这两种编码技术导致的平等机会违反率高于不编码受保护属性的情况。这突显了编码在放大歧视方面的作用。然而,仍有一线希望:通过目标编码的正则化,可以提升公平性。这个结果与我们的理论理解一致,因为属性连接可能会通过增加不可减少偏差和可减少偏差来恶化公平性。

结论

我们的研究强调了类别属性编码在平衡机器学习模型的准确性和公平性方面的重要作用。我们已识别出编码类别属性时可能出现的两种偏差:不可减少偏差和可减少偏差。

通过理论分析和实证实验,我们发现独热编码(one-hot encoding)表现出比目标编码(target encoding)更多的歧视。然而,经过正则化的目标编码表现出有希望的结果,它在保持可接受的模型性能的同时,展现了提高公平性的潜力。

我们强调了考虑编码类别受保护属性的影响的重要性,因为对编码方法进行轻微修改可以在不显著牺牲预测准确性的情况下实现公平性改善。

潜台词

近年来,我们看到许多算法方法从数据收集、预处理、处理过程中以及后处理步骤等多个角度来提高数据驱动系统中的公平性。在这项工作中,我们集中研究了如何通过编码类别属性(一个常见的预处理步骤)来调和模型质量和公平性。

许多公平机器学习工作的一个共同基础假设是,公平性与准确性之间的权衡可能需要复杂的方法或困难的政策选择 [Rodolfa et al.]

由于正则化的目标编码易于执行且不需要对机器学习模型进行重大更改,因此它可以作为公平机器学习中处理方法的合适补充,值得在未来进一步探索。

我们鼓励行业从业者考虑编码类别受保护属性的影响。通过对编码方法进行轻微调整,可以在不显著影响预测性能的情况下实现公平性改善。然而,必须理解的是,使用公平人工智能方法并不保证复杂社会技术系统的公平性。

限制:本工作旨在展示在任何时刻对分类保护属性进行编码的一些影响。应理解为,在任何情况下对分类保护属性的编码不会增加公平性指标;我们提倡在公平性轴上考虑编码正则化的效果,而不仅仅是在预测性能轴上。Fair-AI 方法并不一定保证基于 AI 的复杂社会技术系统的公平性。

致谢

本工作得到了欧洲联盟 Horizon 2020 研究与创新计划资助,资助项目为 Marie Sklodowska-Curie Actions(资助协议编号 860630),项目名称为‘’NoBIAS — Artificial Intelligence without Bias’’

免责声明

本工作仅反映作者的观点,欧洲研究执行局(REA)对其包含的信息的任何使用不承担责任。

引用

@inproceedings{fairEncoder,
author = {Mougan, Carlos and Alvarez, Jose M. and Ruggieri, Salvatore and Staab, Steffen},
title = {Fairness Implications of Encoding Protected Categorical Attributes},
year = {2023},
url = {https://arxiv.org/abs/2201.11358},
booktitle = {Proceedings of the 2023 AAAI/ACM Conference on AI, Ethics, and Society},
location = {Montreal, Canada},
series = {AIES '23}
}

成为初创公司全栈数据科学家的体验

原文:towardsdatascience.com/what-being-a-full-stack-data-scientist-at-a-startup-is-like-fa54b6be4c26

持续加速,高度协作,并且不断学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Ani Madurkar

·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 8 月 5 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

冰岛的午夜日落。作者提供的图像

在过去大约 12 个月里,我在一家健康科技领域的初创公司担任数据科学家。我作为团队中的两名数据科学家之一加入,这基本上意味着我们需要成为全栈工程师和科学家,以完成工作并建立可扩展的系统,为公司的未来成功奠定基础。

在这段时间里,我学到了比在其他任何角色中学到的更多,这篇文章展示了三种主要理念,最好地总结了我迄今为止的经验。

从本质上讲,你需要成为一个矛盾体。你必须在通常彼此对立的世界之间保持微妙的平衡。这项工作的这一方面可能很难出色,因为它通常要求你比其他大多数角色付出更多。但对于那些渴望获得极具回报的学习经历的人来说,这是无可比拟的。

成为建设者和战略家

你需要构建的内容实际上取决于初创公司的早期阶段以及数据科学/机器学习、数据工程和数据分析团队的人员数量。无论如何,最终可能还是要由你来操作完整的 ML 堆栈(从数据摄取到部署),并且还要构建一个平台以提升未来项目的效果。

这种情况通常表现为与关键业务利益相关者开会,并创建直接影响公司底线的模型。这在大多数数据项目中很常见,但这种场景下的噪音往往会更多。按定义,你正在一个尝试做新颖事情或以一种比竞争对手提供更大价值的方式解决问题的领域工作。这意味着你很可能不会参与传统的机器学习项目,做大家都在做的事情,你肯定不会拿到一个现成的项目;你将负责尝试构建一些新的东西。无论是数据集策划的新方法、特征工程、建模、模型应用,还是上述所有内容——你都应该尝试创新(当然仍需遵守伦理和法律约束)。

项目通常从一个深刻理解问题和/或客户及其当前需求的领域专家开始。作为数据科学家,你需要在各种想法中筛选出哪些是及时的、哪些需要更多高质量数据以及哪些是长期目标。这需要与领域专家进行策略规划,以便你可以朝着正确的方向执行。这里的策略规划由于组织的初创性质而显著不同,这意味着我们通常需要从可信赖的网站抓取数据来增强数据集,或需要与数据工程师紧密配合,建立 ETL 流程或为你的想法构建数据策划架构,而这些想法目前甚至尚不存在。

在实践中,制定正确的策略要困难得多,因为通常你需要尝试构建错误的东西以获得具体反馈,从而最终构建正确的东西。迭代是核心原则,但高效执行是宗旨。你必须能够比以往任何时候都更快地行动。由于速度的本质,你被迫只关注真正重要的事情,收集反馈,并继续前进。

寻找问题的关键点、从信号中解析噪音、每周发布代码以及不断响应反馈是非常宝贵的特质。通常,很难长时间保持这种状态,因此一个紧密而强大的团队对于实现这一目标至关重要。

成为工程师和科学家

尽管我强调了快速的重要性,但这奇怪地并不完全正确。更准确地说,你需要以一种方式进行构建,以便你明天能够更快。速度很重要,但加速是必不可少的。这对数据科学家来说本质上意味着你需要具备两个坚实的基础:Python 和统计学。这在数据科学家被聘用时总是需要的,但我所需要做的工作有时看起来像纯粹的软件工程,有时又像纯粹的统计学工作。

我的工作最初涉及了大量的数据工程类型的工作——收集优质数据集、设置 ETL 流程、为下游分析或建模策划数据集等。我并不是专业的数据工程师,所以这项工作是尽我所能地进行,以保持团队的速度。在我开始从事机器学习工作后,单独在 Jupyter notebooks 中操作每个模型是一种繁琐的方法,这不会进一步加速我们。解决方案是逐步构建一个 ML 平台,这样每次模型迭代变得更容易构建和部署。这项工作主要是软件工程类型的工作,如果没有对 Python 的强大掌握,我认为我不会有机会。在我构建这一平台的过程中,由于需要阅读大量使用各种 ML 方法的医疗数据研究论文——我们能否复制这些工作?他们有没有忽略的空白?我们可以采用他们测试过的哪些技术?了解如何快速阅读论文并将其转化为代码很快成为我需要发展的一个特质。

在这个角色中,数据科学家维恩图的每个角落对我来说都放大了 10 倍。为了达到预期的水平,我需要尽可能多地深入每一个领域。作为回报,我几乎消除了自己的冒名顶替综合症,同时在过程中学到了大量的知识。我绝对不是要美化这一点——做所有这些工作可能不是数据科学家角色的常态,但如果你发现自己想在初创公司做这些工作,这可能就是它的样子。正如那句老话所说,“万事通不精通,但往往胜过一技之长者”。

成为一个所有者和合作者

这是大多数人在职业发展中不得不面对的一个方面,但在初创公司中做这件事就像是蒙着眼睛做。你通常没有交付大规模项目的缓冲或安全网,这些项目除了浪费工作/时间之外没有任何影响。每个人都稍显紧张,客户始终是第一位的,所以你需要完全拥有你负责的项目。我几乎没有哪个团队成员等待被告知该做什么,他们通常看到需要完成的工作并在完成要求的工作之外也把它做得对。

在这里,所有权通常意味着端到端的所有权。对于一个数据项目,这包括从数据可以被整理的那一刻开始(从哪里?多频繁?需要如何清洗?需要存储在哪里?等等)到数据分析/处理(需要创建哪些指标?如何分析这些数据?需要跟踪哪些相关模式?等等),再到数据建模(数据应该如何建模?哪些模型效果最好?当前文献有什么说法?等等),再到评估和部署(如何衡量成功?失败意味着什么?模型部署在哪里?客户如何访问?等等)。这种端到端的思维不仅仅停留在部署阶段,因为你还需要进行模型监控和重新训练的触发。这需要承担很多责任,而不是一个人能完成的。

对于一家高速增长的公司而言,协作尤其困难,因为新员工不断加入,角色不断被定义。你需要快速建立朋友,这样你才能推动这些项目完成。说实话,公司的文化在很大程度上可以量化为有多少人愿意为他人提供帮助。如果你碰巧进入一个在快速的 Slack 会议后,大家都愿意迅速交朋友并帮助你完成工作的组织,你最好确保你表达深切的感激之情。聪明的人很少,聪明且有强烈工作伦理的人更是稀有,而那些聪明且有强烈工作伦理并且总是愿意帮助你的聪明人则是独角兽。

我所做的一切都离不开那些愿意伸出援手,帮助我完成目标的人的慷慨。在长期的时间里,这种行为会形成一种深具韧性和强大的文化。这种文化可以通过你首先成为一个愿意快速帮助他人的人来建立。不要等待其他人来帮助你,而要主动伸出橄榄枝,只为了看到一个朋友成功。随着时间的推移,你将建立一个围绕你的团队,其中充满了那些不会让你失败而无法东山再起的人。

希望这个故事能让你对我过去的一年有一些了解(并部分解释为什么我最近有点远离写作)。我特别希望能与有类似经历或处于类似位置的人交流,并从你们那里学习。我相信我的世界中还有许多可以改进的地方,希望了解如何做到这一点。

当然,如果你希望我写关于我工作的更多方面,请告诉我!非常感谢你阅读这些内容。

使用我的推荐链接成为 Medium 会员

Medium 是我进行日常阅读的大型资源库,如果你在数据领域,这个平台是一个宝贵的金矿。如果你希望订阅,这是我的推荐链接。完全公开:如果你使用这个链接订阅 Medium,你的部分订阅费用将直接进入我的账户。希望你能成为我们社区的一员。

## 通过我的推荐链接加入 Medium - Ani Madurkar

作为 Medium 会员,你的一部分会员费会用于支持你阅读的作者,同时你可以完全访问每一个故事……

animadurkar.medium.com

ChatGPT 对你的了解:OpenAI 在数据隐私方面的进展

原文:towardsdatascience.com/what-chatgpt-knows-about-you-openai-towards-data-privacy-science-ai-b0fa2376a5f6

管理 ChatGPT 个人数据的新方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 安德烈亚·瓦伦苏埃拉

·发布于 Towards Data Science ·阅读时间 11 分钟·2023 年 5 月 9 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 马修·亨利 提供,来源于 Unsplash

在 3 月 20 日 ChatGPT 数据中断引发的各种关注之后,我们迅速观察到外界的一些反应。最强烈的反应是什么? 意大利因数据隐私问题禁止 ChatGPT

近一个月后的事件,OpenAI 已经在用户数据隐私方面采取了一些措施:可以关闭聊天记录功能并导出你的个人数据,即他们从你与 ChatGPT 的互动中保留的数据。

这篇文章概述了 OpenAI 在强大 AI 生成技术 ChatGPT 的数据隐私方面采取的两项主要措施。我们将通过仔细查看 ChatGPT 从用户那里保留的数据,来尝试这两个新功能,以帮助你理解所给格式,从而解读你的数据。

#1. 关闭聊天记录

ChatGPT 的聊天记录不仅仅是存储你与聊天机器人对话的方式,让你可以随时登录查看过去的对话:你的聊天记录也被用来训练和改进 ChatGPT 背后的模型

聊天记录功能于 2022 年 12 月 15 日启用,老实说:我们都从存储对话中受益!但也确实,这一功能引发了一些数据隐私问题:ChatGPT 是否保存对话数据来训练其 AI 模型? 如果对话中涉及敏感或个人数据怎么办?

现在 OpenAI 赋予了用户控制权! 根据OpenAI 的公告,从 4 月 25 日起,可以禁用聊天记录,这样对话将不再出现在侧边栏中。此外,它们不会被用于进一步的训练,为用户提供了管理数据的选项。

之前,用户可以根据需求定期清除聊天记录,但任何对话仍然可以用于微调。目前,如果禁用聊天记录,对话只会保留 30 天。这是为了防止由于工具的误用需要审核对话,然后再永久删除它们。

设置控制中禁用聊天记录非常简单。要在网页界面中访问设置,请导航到主页左下角的部分。会弹出一个小窗口,你将在那里找到聊天记录和训练的控制:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自制的 ChatGPT 设置窗口截图。

在这一点上,我相信你也会注意到这个问题:

为什么 OpenAI 将保存聊天记录与使用这些数据训练其 AI 模型结合起来?

我猜这是一种微妙的方式,迫使用户继续使用他们的对话用于训练目的。 作为对 OpenAI 的支持点,从我的专业经验来看,我清楚地看到使用这些真实数据进行训练的好处。

#2. 导出你的个人数据

OpenAI 还在 ChatGPT 的设置中添加了第二个新功能:一个导出选项,以获取你的 ChatGPT 数据,并了解 ChatGPT 存储了关于你的哪些信息。

这个新选项可以看作是朝着欧盟通用数据保护条例(GDPR)迈出的一个步骤。GDPR 定义了处理数据的义务,以便利数据主体访问其个人数据。这就是为什么收集个人信息的平台,如GoogleNetflix,现在必须随时向用户提供他们拥有的数据。

在网页界面中,导出个人数据也非常简单。导出数据按钮就在聊天记录和训练按钮下方:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自制的 ChatGPT 设置窗口截图。

在导出数据的前几分钟,我在注册邮箱收到了一个包含我对话和其他相关信息的文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自制的 ChatGPT 设置窗口截图。

确认导出操作后,这是我在邮箱中收到的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 ChatGPT 的导出邮件中自制的截图。

点击下载按钮,我得到了一个包含 5 个htmljson格式文件的文件夹。

允许用户请求其个人数据的公司使其遵守上述 GDPR 法规。然而,有一个问题:文件格式可能使数据对大多数人不可读。在这种情况下,我们得到了htmljson文件。虽然html可以直接读取,json文件则可能更难以解释。我个人认为,新法规也应该强制要求数据具有可读格式。但目前为止……

让我们一个一个地探索这些文件,以充分利用这个新功能!

聊天记录

第一个文件是chat.html,其中包含我与 ChatGPT 的完整聊天记录。对话按其对应的标题存储。用户的问题和 ChatGPT 的回答分别标记为assistantuser

如果你曾经自己训练过 AI 模型,这个标记系统对你来说应该很熟悉

让我们观察一下我历史中的一个示例对话:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我从 ChatGPT 历史中自制的截图。对话标题用蓝色突出显示。用户/助手标签分别用红色和绿色突出显示。

用户反馈

你是否见过 ChatGPT 回答旁边的竖起大拇指和竖下大拇指图标 (👍👎)?

这些信息被 ChatGPT 视为对给定答案的反馈,这将有助于聊天机器人训练。

这些信息存储在message_feedback.json文件中,包含您通过竖起大拇指图标提供的任何反馈。信息以以下格式存储:

[{"message_id": <MESSAGE ID>, "conversation_id": <CONVERSATION ID>, "user_id": <USER ID>, "rating": "thumbsDown", "content": "{\"tags\": [\"not-helpful\"]}"}]

thumbsDown评分用于记录错误生成的答案,而thumbsUp用于记录正确生成的答案。

用户数据

还有一个文件(user.json)包含用户的以下个人数据:

{"id": <USER ID>, "email": <USER EMAIL>, "chatgpt_plus_user": [true|false], "phone_number": <USER PONE>}

一些平台因根据用户使用平台的情况创建用户模型而闻名。例如,如果Google的用户搜索大多与编程有关,Google可能会推断该用户是程序员,并利用这些信息显示个性化广告。

ChatGPT 可以用对话中的信息做同样的事情,但目前他们被要求将这些推测的信息包含在导出的数据中

⚠️ 仅供参考, 可以通过点击 Gmail 中的 账户 >> 数据与隐私 >> 个性化广告 >> 我的广告中心 来访问 Google 对他们的了解。

完整对话历史

还有一个包含对话历史的文件,还包括一些元数据。这个文件名为conversations.json包括诸如创建时间、多个标识符以及 ChatGPT 背后的模型等信息

⚠️ 元数据提供了关于主要数据的信息。它可能包括数据来源、意义、位置、所有权和创建等信息。元数据涉及与主要数据相关的信息,但并不构成主要数据的一部分。

让我们探讨同一对话关于 A320 液压系统故障json 格式。对话本身包含以下问答:

从这个简单的对话中,OpenAI 保留了相当多的信息。让我们回顾存储的信息:

  • json 文件的主要字段包含以下信息:

字段 moderation_results 是空的,因为 在这个具体案例中没有提供反馈给 ChatGPT。此外,mapping 字段中的 [+] 符号表示有更多信息可用。

  • 实际上,mapping 字段包含关于对话本身的所有信息。由于对话有四次交互,映射为每次交互存储一个 children 条目。

再次,[+] 符号表示有更多信息可用。让我们查看不同的条目!

  • mapping_id:它包含对话的 id 以及关于创建时间和内容类型等信息。据推测,它还创建了对话的 parent_id 和对应于用户与 ChatGPT 之间下一个交互的 children_id。以下是一个示例:

  • children_idX:每次交互(无论是来自用户还是助手)都会创建一个新的 children 条目。由于对话有四次交互,因此 json 文件显示了四个 children 条目。每个 children 条目具有以下结构:

第一个 children 条目在对话中被嵌套,具有 mapping_id 作为父项,第二次交互 — ChatGP 的回答 — 作为第二个子项。

  • Children 对应于 ChatGPT 答案的条目包含额外的字段。例如,对于第二次交互:

在 ChatGPT 的回答中,我们获得关于 ChatGPT 背后的模型和停止词的信息。它还显示了第一个 children 作为其 parent 和第三个 children 作为下一个交互。

完整的文件可以在这个 GitHub gist 中找到。

模型比较

你是否曾在对 ChatGPT 提供的回答不完全满意时使用过“重新生成回答”按钮?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ChatGPT 中“重新生成回答”按钮的自制截图。

这些反馈信息也被存储!

有一个名为 model_comparisons.json 的文件,它包含对话片段及每次 ChatGPT 重新生成回答时的连续尝试。信息仅包含文本,不包括标题,但包括其他一些元数据。以下是该文件的基本结构:

{
  "id":"<id>",
  "user_id":"<user_id>",
  "input":{[+]},
  "output":{[+]},
  "metadata":{[+]},
  "create_time": "<time>"
}

metadata字段包含一些重要信息,如对话发生的国家和大陆,以及https访问协议的信息等。该文件的有趣部分在于input/output条目:

输入

input包含来自原始对话的一系列消息。交互根据作者进行标记,并且如前所述,还存储了一些额外的信息。让我们观察一下我们样本对话中存储的消息:

User/Assistant条目是预期的,但我相信在这一点上我们都在想为什么会有一个 ***system*** 标签呢?

而且,为什么他们在每次对话开始时都要提供这样的初始声明呢?

ChatGPT 是否在任何新的对话中预先提供当前日期?

是的这些条目就是所谓的系统消息

系统消息

系统消息为助手提供总体指示。它们帮助设置助手的行为。在网页界面中,系统消息对用户是透明的,这也是我们看不到它们的直接原因。

系统消息的好处在于,它允许开发者在不将请求本身作为对话的一部分的情况下调整助手的行为。可以通过 API 提供系统消息。例如,如果你正在构建一个汽车销售助手,一个可能的系统消息可以是*“你是一个汽车销售助手。使用友好的语气与用户交谈,直到了解他们的需求。然后,解释符合他们偏好的可用汽车”*。你甚至可以提供车辆清单、规格和价格,以便助手也能提供这些信息。

输出

输出条目包含 ChatGPT 给出的回应以及每次点击再生回应按钮时的连续尝试:

如上所述,feedback_step_1条目存储了之前提到的点赞/点踩反馈信息。

再生信息存储在feedback_step_2条目中,其中第一个子条目original_turn用于原始回应,而重试的回应则在new_turn下。

这就是 OpenAI 对我们与 ChatGPT 互动的所有信息! 我认为了解哪些信息被存储对于两个主要目的是有用的。

首先,在当今的数据世界中,关注我们的隐私并了解平台存储和推测的关于我们的信息是非常重要的。其次,了解信息的结构和处理方式可以帮助我们使用 ChatGPT 作为起点来构建定制化的模型。例如,通过查看我们自己的数据,我们意识到你可以通过系统消息来引导 ChatGPT,以透明的方式将代理定向到我们希望其执行的目标。

总结

在这篇文章中,我们回顾了 OpenAI 在过去几个月中对用户数据隐私问题的回应措施。

关闭聊天记录的可能性以及随时导出个人数据的新功能都是保护 ChatGPT 用户的重要步骤。我个人认为这些措施承诺了优先考虑数据隐私,遵守相关数据保护法规。透明性和安全性是建立信任和确保负责任的 AI 使用的关键

从我们的角度来看*— 用户端 —*,我认为了解管理数据隐私的可能性是很有必要的。特别是关于这两个控制基本点的新功能,比如确保你的 ChatGPT 互动不会被用于训练目的(如果你不希望这样的话),或明确获得公司对你的数据。

当然,使用这项技术还有其他风险。例如,用户还应了解数据保留政策。即知道平台保留数据的时间,这个时间理想上应为最短必要时间。了解你提供给 AI 平台的数据的预期用途以及是否平台将你的数据与第三方共享及共享目的也是我们主要关注的内容。

考虑这些因素,用户可以在使用 ChatGPT 或其他大型语言模型时做出明智的关于数据隐私的决策

主动了解你的数据如何处理并采取措施保护你的隐私权利是很重要的。

就这些!非常感谢你的阅读!

我希望这篇文章能帮助理解 ChatGPT 在我们的对话中保留的信息,以及管理新 OpenAI 功能以保护数据隐私

你也可以订阅我的 通讯 以获取最新内容。特别是如果你对 ChatGPT 相关的文章感兴趣

## 解锁 ChatGPT 的新维度:文本转语音集成

提升 ChatGPT 交互中的用户体验

从 OpenAI 提供的提示工程课程中学到的内容 — 提示指南

了解 OpenAI 的更佳提示指南

提高 ChatGPT 性能的提示工程 [## 提升 ChatGPT 性能的提示工程

如何向 ChatGPT 提问以最大化成功回答的几率

levelup.gitconnected.com [## 使用迁移学习创建您自己的 ChatGPT

通过微调提升 ChatGPT 能力

medium.com [## 请 ChatGPT 帮助我使用您的 API!

使用 ChatGPT API 提升您的 Python 脚本

betterprogramming.pub

随时向我提出任何问题forcodesake.hello@gmail.com 😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值