足球新闻
云达不莱梅vs多特蒙德直播_云达不莱梅vs多特蒙德免费高清在线直播_云达不莱梅vs多特蒙德免费直播视频直播

原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
原文:https://towardsdatascience.com/text-processing-is-coming-c13a0e2ee15c?source=collection_archive---------14-----------------------
Photo by Bharat Patil on Unsplash
如果你和我一样,看过的《权力的游戏》(GOT)的迷因比剧集本身还多,你可能会奇怪为什么每个人都对它如此着迷。由于我没有时间看节目或看书,我将使用基本的文本处理来大致了解我错过了什么。在本文中,我将使用 Python 中的正则表达式和自然语言工具包来探索、清理、标记和可视化文本。如果你对矢量化、词性标注或情感分析更感兴趣,这里有我写的另一篇文章。
所有 5 本书的文本都可以在 Kaggle 上找到这里。我将使用第一本书的文本(《权力的游戏》,1996) ,它有 571 页,包含 20,168 行文本。我将解释这些概念,以便清理文本:
正则表达式语法正则表达式函数标记化词干化/词汇化结合 NLTK 和 Regex可视化词频
正则表达式是一种不同符号和语法的语言,可用于在更大的字符串中搜索一段字符串。它可以在几乎任何编码语言中使用,并且在试图搜索一般的字符串模式时非常有用。最常见的是,它用于 web 抓取、输入验证和简单的解析。在 Python 中,可以使用导入正则表达式包。这给了你许多不同的函数和字符串序列,允许你搜索任何你想要的东西。
一个 regex 字符串指的是告诉 regex 要查找什么的字母、符号或数字的字符串。例如,如果您想要查找“Daenerys”的所有实例,regex 字符串应该类似于r“daene rys”。然而,如果您想要查找所有以’ D '开头的单词,正则表达式字符串应该看起来像 r’D[a-z]+’ 。字符串开头的 D 必须匹配,方括号表示选择一个,而+表示您必须从括号中选择 1 次或更多次来完成单词。我将介绍一些 regex 字符串的基本形式,它们在搜索文本时会很有用。
r’A’* 匹配一个 0 次或多次(‘、’ A ‘、’ AA ‘、’ AAA ‘、’ AAAA ‘等)。)
r’A+’ 匹配 A 1 次或多次(’ A ‘,’ AA ‘,’ AAA ‘,’ AAAA ‘等)。)
***r ‘[a-z]****匹配任意小写字母 0 次或更多次(’、’ ajrk ‘、’ bor ‘、’ q ‘等。)
***r ‘[0–9]+’***匹配任意数字 1 次或多次(’ 1 ‘,’ 254 ‘,’ 1029345 '等)。)
r’ing$’ 匹配以-ing 结尾的单词(“奔跑”、“攀爬”、“ing”等)。)
r’^st’ 匹配以 st- ('string ‘、’ stir ‘、‘奋斗’等)开头的单词。)
r’[^a]’ 将匹配任何不带 a 的字符串(’ surprise ‘,’ d4nfo)。,有意思!”等。)
r’。{4}’ 匹配任何不带换行符的 4 个字符的字符串(’ 9?rf ‘、’(hi)'等。)
regex 中有几个特殊序列由一个反斜杠后跟一个字母组成。反斜杠()是一个转义字符,它可以否定跟在它后面的任何内容的传统含义。“w”通常会匹配“w”,但 r’w+’ 会匹配一个或多个字母数字字符。如果字母是小写的,那么它匹配特殊序列定义的所有内容,但是如果字母是大写的,那么 regex 字符串匹配除了它定义的之外的所有内容。特殊序列字母列表可在找到。除了我简单介绍的和之外,还有很多技术,你可以点击这里,这里这里,这里这里,或者这里这里查看更多信息!
re 包有几个内置函数,可以用来将 regex 字符串应用于文本主体,以及查找匹配等。我将介绍一些,并解释它们之间的区别。所有这些函数至少有两个参数:要匹配的模式(regex 字符串)和要搜索的文本。以下三个函数返回一个 match 对象,该对象由匹配的字符串的索引(开始和停止)以及函数匹配的字符串组成。它们也被限制为每个查询只能找到一个匹配。
:查找匹配模式的第一个实例,返回匹配对象或无:仅在字符串的开头查找模式的实例,返回匹配对象或无:查找整个字符串是否匹配给定的模式,返回一个匹配对象或无
接下来的两个函数查找模式字符串中的所有匹配。这里,re.findall 返回所有匹配的列表,而 re.finditer 允许您使用一个循环提取每个匹配的特定信息。
:查找模式的所有非重叠匹配,返回所有匹配的列表:查找模式的所有非重叠匹配,返回一个迭代器对象,告诉你匹配的开始/停止/内容
以下两个函数是在搜索模式后分割或修改字符串的方法。它们都返回修改后的字符串。
:用替换字符串替换模式,返回修改后的字符串:根据模式分割字符串,返回字符串列表
既然我们已经介绍了 Regex 的基础知识,让我们继续预处理得到的文本。
为了分析一个文本,必须把它的词抽出来分析。一种方法是用空格分割每个文本,以便返回单个单词。然而,这并没有考虑标点符号或其他可能要删除的符号。这种将句子、段落或章节分解成单个单词的过程被称为标记化,是执行任何类型的文本分析之前的重要步骤。幸运的是,Python 中有一个名为自然语言工具包的包,它有大量有用的操作文本的函数。可以使用导入。这个包包括一个单词分词器和一个句子分词器,分别将文本分解成单词和句子。单词标记器将文本分成单词、标点符号和任何其他字符。这意味着标点符号从单词中分离出来,成为列表中自己的元素。句子标记器通过传统的句子标点符号(。, ?, !等。),并保持标点符号附在句子上。以下是每种方法的示例:
现在你已经有了文本中所有单词和标点符号的列表,接下来做什么呢?令牌列表可以通过循环运行,停用词列表中的所有内容都可以删除。停用词是指出现频率太高或意义不大的词,应该去掉。这可以被认为是一种降维,因为你去掉了那些不允许你收集文本信息的单词。删除不常出现的单词也很有用。
对于该文本,书的每个页码被指定为“第 X 页”。在我当前的清理单词列表中,每个实例都显示为[‘page ‘,’ #’],我将在下一篇文章中做进一步的文本分析时处理这个问题。
如果这两个词中的任何一个听起来像一种奇怪的园艺形式,我完全理解。然而,这实际上是两种用于将单词的所有变体组合成其父形式的技术。例如,如果一个文本有“running”、“runs”和“run”,这些都是母词“run”的形式,应该转换并作为同一个词计算,因为它们具有相同的含义。逐行检查文本并试图找出每个单词是否应该转换成它的基本形式是计算密集型的,并且浪费时间。幸运的是,上一节中介绍的 nltk 包有一些功能可以帮您做到这一点!
词干删除单词的结尾(-ing,-ed,-s,或另一个常见的结尾),希望它能找到单词的“基本”形式。这种方法对于像’ running’-‘run ‘,’ climbing’-‘climb ‘和’ pouring ’ = ’ pour ‘这样的词很管用,但是对于其他的词就不管用了,比如’ leaves’-'leav '。下面是一个简单的例子:
这种方法不能完全正确地转换所有的单词,因此 george 被改为 georg。为了解决这个问题,可以使用词条化来代替词干化,这可以达到相同的效果,但是使用一个由词条(单词的基本形式)组成的字典来判断截断单词的结尾是否有意义。它还考虑了单词的类型(名词、动词、形容词),以便更好地猜测父单词。此方法允许“leaves”转换为“leaf”,而不是“leav”。
请注意词汇化是如何正确地将敦促、开始和要求转换为敦促、开始和要求的,因为它将所有的标记视为一个动词并搜索基本形式。它还忽略了所有不需要转换的单词。关于如何在 Python 中进行词干化和词汇化的有用指南可以在这里找到。
既然您已经对 Regex 和 NLTK 提供的东西有了一些了解,我将解释这两者的交集。当标记一个文本时,除了 nltk 中的缺省值之外,还可以进行拆分。这是通过使用 来完成的,并且您可以指定分割哪个正则表达式字符串。这类似于,但是 NLTK 函数中指定的模式是您希望它返回的令牌的模式,而不是将被移除和拆分的内容。NLTK 中还内置了许多其他的记号赋予器,您可以在这里阅读。下面是一些的例子:
还有一种简单的方法来实现前面提到的一些功能,尤其是搜索。这可以用来再次检查词干化/词干化是否达到了预期的效果。在这种情况下,我们可以看到以-ing 结尾的动词在词汇化过程中被从单词列表中删除了。
在标记列表中查找短语实例的另一种有用方法是,首先使用将列表转换为文本对象,然后使用对该对象进行子集化,其中每个< >保存正则表达式字符串以匹配序列中的一个标记。我将通过下面的一些例子,这里有一个有用的参考供进一步探讨。
这是一个很酷的方法来找出你的文本可能隐藏了什么小短语,并且是开始分析文本的好地方。特别是,跟随丹妮莉丝贯穿整本书给了她一个非常快速的性格曲线的总结。接下来,我将介绍不同的方法来可视化单词在单词列表中的出现频率。
在实际分析文章之前,一个简单的方法是看看哪些词出现得最频繁。这也是一个好主意,以确保您已经删除了所有必要的停用词。可视化单词及其相对频率的一个基本方法是单词云,一个很好的演示可以在这里找到。这种方法仅显示每个单词与其他单词相比的相对频率,并且由于其抽象的性质,可能难以解释。为了补救这一点,我将探索 nltk 包中包含的不同的可视化方法,包括词汇分散图、频率分布图和 n 元语法频率分布图。
一个 频率分布图 根据频率绘制单词。剧情转折,我知道。这很有用,因为它显示了文本中有多少是由不同的主题或思想组成的。一个单词越常见,它就越是文章主题的中心。
Original Token Frequency Distribution
Lemmatized Frequency distribution
我在一个发行版中包含了原始的标记,在另一个发行版中包含了经过过滤、词条化的单词,以强调删除停用词和其他非必要符号的重要性。第一版没有告诉我任何关于这本书的内容,而第二版给了我几个抓住了乔治·R·R·马丁精髓和写作风格的单词和角色名。基于词汇化分布的发现,我选择了 10 个词来绘制词汇离差图。
词汇分布图 显示了单词在文本中出现时的分布(偏移量)。例如,如果感兴趣的单词是“狐狸”,句子是“快速的棕色狐狸跳过懒惰的狗”,则该单词的偏移量将是 4,因为它是句子中的第四个单词。这种绘制单词及其偏移量的技术显示了主题随时间的变化。这也是一个非常可定制的情节,因为你可以选择可视化的话。
Lexical Dispersion Plot
正如你所看到的,在不同的时期,书中有不同的主题。进一步分析不同的关键词会发现不同的含义,但这是一个好的开始,可以看出哪些概念在书中是重要的。
在本文中,我们介绍了 Regex 和不同的文本搜索方法,然后浏览了 NLTK 包中的基本工具,并了解了 Regex 如何与 NLTK 结合。最后,我们从书中提取了广泛的总结,并为进一步的分析准备了文本。我希望你喜欢这个旅程,你可以在这里查看更多的文本处理概念!
我的代码副本,有更多的例子和解释,可以在 github 上找到!请随意获取和使用代码。
https://www . data camp . com/community/tutorials/text-analytics-初学者-nltk (通用文本处理的绝佳资源)
https://www . data camp . com/courses/natural-language-processing-fundamentals-in-python(NLP 的一门课程)
原文:https://towardsdatascience.com/text-summarization-using-deep-learning-6e379ed2e89c?source=collection_archive---------6-----------------------
Text Summarization
随着互联网的兴起,我们现在可以随时获取信息。我们从许多来源被它轰炸——新闻、社交媒体、办公室邮件等等。要是有人能为我们总结出最重要的信息就好了!深度学习正在实现。通过序列到序列模型的最新进展,我们现在可以开发良好的文本摘要模型。
文本摘要有两种类型:
1.摘录摘要—这种方法从源文本中选择段落,然后对其进行排列以形成摘要。思考这个问题的一种方式是用荧光笔在重要的部分下划线。主要思想是摘要文本是源文本的子部分。
2.抽象总结——相反,抽象方法包括理解意图,并用自己的话写总结。我认为这类似于一支笔。
自然,抽象概括在这里是更具挑战性的问题。这是机器学习进展缓慢的一个领域。这是一个困难的问题,因为创建抽象的摘要需要很好地掌握主题和自然语言,这对于机器来说都是困难的任务。此外,从历史上看,我们没有一个好的大数据集来解决这个问题。这里的数据集指的是带有摘要的源文本。因为人类需要写摘要,所以获取大量摘要是一个问题,除了一个领域——新闻!
在呈现新闻文章时,专业作家不断总结信息,如下面 CNN 新闻的片段所示:
News snippet
商店亮点是为更大的文章创建的摘要。收集来自 CNN 和每日邮报的新闻数据,以创建用于文本摘要的CNN/每日邮报数据集,这是用于训练抽象摘要模型的关键数据集。使用这个数据集作为基准,研究人员一直在尝试深度学习模型设计。
我喜欢的一个这样的模型是 Abigail See 的指针生成器网络。我想用这个模型来强调深度学习摘要模型的关键组件。
在我们进入模型之前,让我们讨论一下文本摘要的评估指标 — Rouge Score 。Rouge score 突出显示了摘要文本和源文本之间的单词重叠。Rouge 1-测量源和摘要文本之间的单个单词重叠,而 Rouge 2 测量源和摘要之间的双字母重叠。因为 rouge 得分度量只考虑单词重叠而不考虑文本的可读性,所以它不是一个完美的度量,因为具有高 rouge 得分的文本可能是一个糟糕的摘要。
做文本摘要的标准方法是注意使用 seq2seq 模型。参见下面来自指针生成器博客的模型结构。
Encoder-Decoder model architecture
序列到序列模型有三个主要方面:
1.编码器—从原始文本中提取信息的双向 LSTM 层。这在上面用红色显示。双向 LSTM 一次读取一个单词,因为它是 LSTM,所以它基于当前单词和它之前已经读取的单词来更新它的隐藏状态。
2.解码器—单向 LSTM 层,一次生成一个单词的摘要。解码器 LSTM 开始工作,一旦它得到的信号比完整的源文本已经阅读。它使用来自编码器的信息以及之前写入的信息来创建下一个单词的概率分布。解码器在上面以黄色显示,概率分布以绿色显示。
3.注意力机制——编码器和解码器是这里的构建模块,但历史上,没有注意力的编码器和解码器架构本身并不太成功。如果不注意,解码器的输入是来自编码器的最终隐藏状态,它可以是 256 或 512 维向量,如果我们想象这个小向量不可能包含所有信息,那么它就成为了信息瓶颈。通过注意机制,解码器可以访问编码器中的中间隐藏状态,并使用所有这些信息来决定下一个单词。注意力在上面以蓝色显示。注意力是一个非常棘手的概念,所以如果我在这里的简短描述令人困惑,请不要担心。你可以通过我的博客在这里阅读更多关于注意力的内容。
正如指针生成器论文所示,上面的体系结构足够好,可以开始使用,但是它创建的摘要有两个问题:
1.概要有时会不准确地再现事实细节(例如德国队以 3 比 2 击败阿根廷队)。这对于像 2–0 这样的罕见或不在词汇表中的单词尤其常见。
2.摘要经常重复出现。(例如德国打败德国打败德国…)
指针生成器模型通过创建一种指针机制来解决这些问题,这种机制允许它在生成文本和从源代码原样复制之间切换。把指针想象成一个介于 0 和 1 之间的概率标量。如果为 1,则模型抽象生成单词,如果为 0,则提取复制单词。
与序列到注意序列系统相比,指针生成器网络有几个优点:
指针生成器网络使得从源文本复制单词变得容易。指针生成器模型甚至能够从源文本中复制词汇以外的单词。这是一个主要的好处,使我们能够处理看不见的单词,同时还允许我们使用更小的词汇(这需要更少的计算和存储空间)。指针生成器模型训练起来更快,需要更少的训练迭代来实现与序列间注意系统相同的性能。
我们已经在 Tensorflow 中实现了这个模型,并在 CNN/Daily Mail 数据集上对其进行了训练。该模型获得了 0.38 的 Rouge-1 分数,这是最先进的。我们的观察是,该模型在根据新闻文章(即它所训练的数据)创建摘要方面做得非常好。然而,如果呈现的文本不是新闻,它仍然可以创建良好的摘要,但这些摘要本质上更具提取性。
我希望你喜欢这个博客。要测试指针生成器模型,请在链接处提取它们的代码。或者与我联系,检查我们的这种模式的版本。
我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。在 http://deeplearninganalytics.org/的入住我们酒店。
你也可以在 https://medium.com/@priya.dwivedi的看到我的其他作品
如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我
关于指针生成器模型的博客
下载 CNN 每日邮报数据集
原文:https://towardsdatascience.com/text-summarization-using-tf-idf-e64a0644ace3?source=collection_archive---------0-----------------------
在文章 使用 NLTK分 5 步进行文本摘要中,我们看到了如何使用词频算法对文本进行摘要。
****边注:测试版用户,注册我的新公司:https://lessentext.com
额外奖励:使用 Streamlit App 查看实际操作
现在,我们将使用 Tf-IDF 算法对文本进行总结。
Photo by Romain Vignes on Unsplash
注意,我们在这里实现实际的算法,不使用任何库来完成大部分任务,我们高度依赖数学。
用简单的语言来说,TF-IDF 可以定义如下:
TF-IDF 中的高权重通过该术语在整个文档集合中的高术语频率(在给定文档中)和低文档频率来达到。
TF-IDF 算法由两种算法相乘而成。
词频(TF)是一个词在文档中出现的频率,除以有多少个词。
TF(t) =(术语 t 在文档中出现的次数)/(文档中的总术语数)
词频是一个词有多常见,逆文档频率(IDF)是一个词有多独特或罕见。
IDF(t) = log_e(文档总数/包含术语 t 的文档数)
例如,
考虑包含 100 个单词的文档,其中单词 苹果 出现 5 次。 苹果 的项频率(即 TF)则为(5 / 100) = 0.05。
现在,假设我们有 1000 万份文档,其中 1000 份文档中出现了单词 apple 。然后,逆文档频率(即 IDF)计算为 log(10,000,000 / 1,000) = 4。
因此,TF-IDF 重量是这些量的乘积:0.05 * 4 = 0.20。
很简单,对吧?我们将使用相同的公式来生成摘要。
哦,是的,我喜欢数学。
额外条件 Python3,Python 的 NLTK 库,你最喜欢的文本编辑器或 IDE
我们将在这里标记句子而不是单词。我们会给这些句子加权。
我们计算每个句子中的词频。
结果会是这样的:
在这里,每个句子都是关键**,值是词频字典。**
我们会找到段落中每个单词的词频。
**现在,记住 **TF,的定义
TF(t) =(术语 t 在文档中出现的次数)/(文档中的总术语数)
在这里,文档是一个段落,术语是一个段落中的一个词。
现在得到的矩阵看起来像这样:
如果我们将这个表与我们在步骤 2 中生成的表进行比较,您将看到具有相同频率的单词具有相似的 TF 分数。
这也是一个简单的表格,有助于计算 IDF 矩阵。
我们计算,“多少个句子包含一个单词”,姑且称之为文档按单词矩阵。
这是我们现在得到的,
****即单词出现在 2 个句子中,出现在 4 个句子中。
我们将为段落中的每个单词找到 IDF。
**现在,记住 **IDF,的定义
IDF(t) = log_e(文档总数/包含术语 t 的文档数)
在这里,文档是一个段落,术语是一个段落中的一个词。
现在得到的矩阵看起来像这样:
将其与 TF 矩阵进行比较,看看有什么不同。
现在我们有了矩阵,下一步就很容易了。
TF-IDF 算法由两种算法相乘而成。
简单地说,我们将矩阵中的值相乘并生成新的矩阵。
不同的算法给句子打分是不同的。这里,我们使用 Tf-IDF 句子中的单词得分来给段落加权。
这给出了句子表及其相应的分数:
与任何总结算法类似,可以有不同的方法来计算阈值。我们在计算平均句子得分。
我们得到以下平均分数:
****算法:如果句子得分大于平均得分,则选择一个句子进行摘要。
对于阈值,我们使用平均分数的 1.3 倍。您可以随意使用这些变量来生成摘要。****
原文:
总结正文:
瞧啊。您刚刚使用臭名昭著的 Tf-IDF 算法总结了文本。现在向你的朋友炫耀吧。ὠ;
****玩玩:试试改变阈值(1.5x 到 1.3x 或者 1.8x),看看会出什么结果。****引申:你也可以引申为用“你想要的若干行/句子”来概括一段文字。
注 : 这是一种 抽取 文本摘要技术。
** [## akashp1712/nlp-akash
自然语言处理注释和实现— akashp1712/nlp-akash
github.com](https://github.com/akashp1712/nlp-akash/blob/master/text-summarization/TF_IDF_Summarization.py)
**一个小小的请求:请报名参加我的新创业:【https://lessentext.com】并提前提供反馈!
原文:https://towardsdatascience.com/text-to-image-a3b201b003ae?source=collection_archive---------4-----------------------
本文将解释一篇有趣的论文背后的实验和理论,该论文将自然语言文本描述(如“一只小鸟有一个短而尖的橙色喙和白色腹部”)转换为 64x64 RGB 图像。以下是 Reed 等人的论文“生成性对立文本到图像合成”的链接。
[## 生成对立文本到图像合成
从文本中自动合成真实的图像将会是有趣和有用的,但是目前的人工智能系统还远远不能…
arxiv.org](https://arxiv.org/abs/1605.05396)
介绍使用的架构为可视属性构造文本嵌入流形插值结果/结论
将自然语言文本描述转换为图像是深度学习的一个惊人演示。诸如情感分析的文本分类任务已经通过深度递归神经网络获得成功,该深度递归神经网络能够从文本中学习有区别的向量表示。在另一个领域,深度卷积 GANs 能够根据从正态分布采样的随机噪声向量来合成图像,例如卧室的内部。Reed 等人[1]的重点是将深度 RNN 文本嵌入和图像合成的进展与 DCGANs 联系起来,这是受条件 GANs 思想的启发。
除了随机采样的噪声向量之外,条件 gan 还通过输入一个独热类标签向量作为生成器和鉴别器的输入来工作。这导致更高的训练稳定性,更具视觉吸引力的结果,以及可控的发电机输出。传统的条件-GANs 和文本-图像模型的区别在于条件输入。不是试图构造稀疏的视觉属性描述符来调节 GANs,而是基于通过深度神经网络学习的文本嵌入来调节 GANs。一个稀疏的视觉属性描述符可能会将“一只长着橙色喙的小鸟”描述为:
向量中的数字代表属性问题,如橙色(1/0)?小(1/0)?鸟(1/0)?这种描述很难收集,在实践中也不太管用。
通过使用 Word2Vec 等概念,单词嵌入已经成为自然语言处理的英雄。Word2Vec 通过学习预测给定单词的上下文来形成嵌入。不幸的是,Word2Vec 并不能完全翻译成文本到图像,因为单词的上下文并不能像一个明确训练的嵌入那样捕捉视觉属性。Reed 等人[1]提出了一种新颖的图像和文本描述的对称结构化联合嵌入,以克服这一挑战,本文稍后将对此进行详细介绍。
除了构建良好的文本嵌入,从文本到图像的翻译是高度多模态的。“多模态”这个术语是深度学习研究中需要熟悉的一个重要术语。这是指这样一个事实,即有许多不同的鸟的图像与文本描述“鸟”相对应。另一个例子是在演讲中有许多不同的口音,等等。这将导致对应于文本“鸟”的不同声音。多模态学习也存在于图像字幕(图像到文本)中。然而,由于文本的顺序结构,使得该模型可以预测以图像为条件的下一个单词以及先前预测的单词,这非常方便。多模态学习传统上非常困难,但随着 GANs(生成对抗网络)的发展,这种框架创建了一种自适应损失函数,非常适合于多模态任务,如文本到图像。
上图显示了 Reed 等人用于训练这种文本到图像 GAN 模型的架构。从这个图中最值得注意的是文本嵌入如何适应模型的顺序处理的可视化。在生成器网络中,文本嵌入通过全连接层过滤,并与随机噪声向量 z 连接。在这种情况下,文本嵌入从 1024x1 向量转换为 128x1 向量,并与 100x1 随机噪声向量 z 连接。在鉴别器网络侧,文本嵌入也通过全连接层压缩为 128x1 向量,然后整形为 4x4 矩阵,并与图像表示深度连接。该图像表示是在输入图像经过多次卷积、降低空间分辨率和提取信息之后得到的。鉴别器的这种嵌入策略不同于条件 GAN 模型,在条件 GAN 模型中,嵌入被级联到原始图像矩阵中,然后被卷积。
关于架构图,有一点需要注意,那就是直观地了解 DCGAN 如何对矢量或低分辨率图像进行上采样,以产生高分辨率图像。你可以看到每个反卷积层都提高了图像的空间分辨率。此外,特征图的深度每层都减少。最后,您可以看到鉴别器网络中的卷积层在处理图像时如何降低空间分辨率并增加特征图的深度。
关于这个训练过程的一个有趣的事情是,很难区分基于生成的图像看起来不真实的损失或者基于生成的图像与文本描述不匹配的损失。该论文的作者描述了训练动态,即最初鉴别器不注意任何文本嵌入,因为由生成器创建的图像看起来根本不真实。一旦 G 可以生成至少通过真假标准的图像,那么文本嵌入也会被考虑在内。
作者通过添加带有被标记为“假”的不正确文本描述的真实图像对来平滑这种训练动态。鉴别器只关注真实与虚假的二元任务,而不是将图像与文本分开考虑。这与诸如具有独热编码分类标签的 AC-GAN 的方法形成对比。AC-GAN 鉴别器输出真实与虚假,并使用共享中间特征的辅助分类器来分类图像的类别标签。
这篇论文最有趣的部分是他们如何构造一个独特的文本嵌入,其中包含要表示的图像的视觉属性。该载体通过以下过程构建:
记为等式(2)的损失函数表示文本分类器的总体目标,其优化两个损失函数之间的选通损失。这些损失函数如等式 3 和等式 4 所示。该论文将这一过程的直觉描述为“与任何其他类别相比,文本编码应该与相应类别的图像具有更高的兼容性得分,反之亦然”。这两个术语分别代表图像编码器和文本编码器。图像编码器取自 GoogLeNet 图像分类模型。该分类器降低了图像的维数,直到它被压缩成 1024×1 的向量。因此,目标函数旨在最小化来自 GoogLeNet 的图像表示和来自字符级 CNN 或 LSTM 的文本表示之间的距离。本质上,用于图像分类的矢量编码用于基于与相似图像的相似性来指导文本编码。
这方面的细节将在 Reed 等人的论文“学习细粒度可视化描述的深度表示”中详细阐述。
[## 学习细粒度可视化描述的深层表示
零镜头视觉识别的最新方法将学习公式化为图像和图像的联合嵌入问题
arxiv.org](https://arxiv.org/abs/1605.05395)
请注意“细粒度”这个术语,它用于将不同类型的鸟和花等任务与完全不同的对象(如猫、飞机、船、山、狗等)进行区分。就像在 ImageNet 挑战赛中使用的一样。
生成对抗网络的一个有趣的特征是潜在向量 z 可以用来插入新的实例。这通常被称为“潜在空间添加”。一个例子是做“戴眼镜的男人”——“不戴眼镜的男人”+“不戴眼镜的女人”,实现一个戴眼镜的女人。在本文中,作者的目的是在文本嵌入之间进行插值。这是通过以下等式实现的:
鉴别器已经被训练来预测图像和文本对是否匹配。因此,来自内插文本嵌入的图像可以填充在训练期间出现的数据流形中的间隙。使用这种方法作为训练数据空间的正则化方法,对于本文提出的模型的成功结果是至关重要的。这是数据扩充的一种形式,因为内插的文本嵌入可以扩展用于训练文本到图像 GAN 的数据集。
实验使用三个数据集进行,包含来自 200 个类别的 11,788 幅鸟类图像的 CUB 数据集,包含来自 102 个不同类别的 8,189 幅图像的 Oxford-102 花卉数据集,以及 MS-COCO 数据集,以展示所提出算法的可推广性。
来自 CUB 和 Oxford-102 的每张图片都包含 5 个文字说明。
Results on CUB Birds Dataset
Results on Oxford-102
Results on MS-COCO
上面给出的所有结果都是关于零射击学习任务的,这意味着该模型以前在训练期间从未见过该文本描述。上面的每张图片分辨率都很低,为 64x64x3。然而,看到这种算法在文本到图像的非常困难的多模态任务上取得一些成功是非常令人鼓舞的。感谢您阅读这篇文章,我强烈推荐您查看这篇文章以了解更多信息!
[1] Scott Reed,Zeynep Akata,,Yan,Lajanugen Logeswaran,Bernt Schiele,Honglak Lee .生成对立文本到图像合成。2016.
[2]斯科特·里德、泽内普·阿卡塔、伯恩特·谢勒、洪拉克·李。学习细粒度可视化描述的深层表示。2016.
原文:https://towardsdatascience.com/text2image-a-new-way-to-nlp-cbf63376aa0d?source=collection_archive---------8-----------------------
自然语言处理(NLP)一直被认为是一个棘手的问题,至少与计算机视觉相比是如此。NLP 模型运行时间更长,通常更难以实现,并且需要高得多的计算资源。另一方面,图像识别模型已经变得更容易实现,对 GPU 的负担也更轻。这让我想到,我们能不能把一个文本集转换成一张图片?我们能把文字解释成图像吗?事实证明,是的,而且结果出人意料地有希望!我们用这种方法来解决真假新闻的分类问题。
在本文中,我们将详细探讨这种方法、结果、结论和进一步的改进。大家系好安全带!
将文本转换成图像的想法最初是受到 Gleb Esman 关于欺诈检测的这篇文章的启发。在这种方法中,他们转换了各种数据点,如鼠标移动的速度、方向、加速度等。变成彩色图像。然后对这些图像运行图像识别模型,产生高度准确的结果。
所有实验使用的数据都是乔治·麦克林泰尔的假新闻数据集的子集。它包含大约 1000 篇虚假和真实的新闻,加在一起。
让我们首先在高层次上讨论 Text2Image。基本的想法是将文本转换成我们可以绘制成热图的东西。等等,那是什么东西?每个单词的 TF-IDF 值。术语频率—逆文档频率(TF-IDF)是一种统计方法,用于确定一个单词相对于文档中其他单词的重要性。在基本的预处理和计算 tf-idf 值之后,我们使用一定量的高斯平滑滤波将它们绘制成对数标度的热图。一旦绘制了热图,我们就使用 CNN 的 fast.ai 实现,并尝试区分真实和虚假的热图。我们最终获得了大约 71%的稳定准确率,这是这种新方法的良好开端。这是我们方法的一个简短流程图
Text2Image
还不太清楚?请继续阅读。
数据是小写的,所有特殊字符被删除,文本和标题被连接。出现在超过 85%的文档中的单词也被删除。此外,明确避免单词列表(停用词)。使用的是一个标准的停用词列表,大部分是无意义的重复词。修改专门用于假新闻的停用词可以是未来探索的一个领域,尤其是展现假新闻特有的写作风格。
为了对关键词进行评分和提取,使用了平滑术语频率逆文档(tf-idf)的 scikit-learn 实现。虚假和真实新闻语料的 IDF 是分别计算的。与整个语料库的单一 IDF 分数相比,计算单独的 IDF 分数导致了准确性的巨大飞跃。然后为每个文档迭代计算 tf-idf 分数。在这里,标题和正文不是分开评分的,而是一起评分的。
Calculating the Term Frequency
Calculating the IDF
将它们相乘,我们得到 tf-idf。我们为每个文档迭代地这样做。
对于每个文档,提取具有最高 TF-IDF 值的 121 个单词。然后这些字被用来创建一个 11×11 的数组。在这里,选择的字数可以作为一个超参数。对于更短、更简单的文本,可以使用更少的单词,而使用更多的单词来表示更长、更复杂的文本。根据经验,11x11 是该数据集的理想大小。TF-IDF 值不是按大小降序排列,而是根据它们在文本中的位置进行映射。TF-IDF 值以这种方式映射,因为它更能代表文本,并为模型提供更丰富的训练特征。因为一个单词可以在一段文本中出现多次,所以它的第一次出现被考虑在内。
不是按原样绘制 TF-IDF 值,而是以对数标度绘制所有值。这样做是为了减小上限值和下限值之间的巨大差异
在绘图时,由于这种差异,热图的大部分不会显示任何颜色差异。因此,它们以对数标度绘制,以更好地显示差异。
Figure 1 (left) shows the TF-IDF values plotted as is. Figure 2 (right) shows the same values plotted on a log scale
其中一个缺点是在训练模型时大量过拟合。这可以归因于缺乏任何数据扩充,因为目前,没有任何数据扩充的方法对于该用例是可行的。因此,在整个数据集上使用高斯滤波来平滑曲线。虽然它确实降低了一点准确性,但是过度拟合显著降低,尤其是在训练的初始阶段。
最终的热图尺寸为 11 x 11,由 seaborn 绘制。由于 x 轴和 y 轴以及颜色条在训练时不传递任何信息,因此我们将其移除。使用的热图类型是“等离子体”,因为它显示出理想的颜色变化。尝试不同的颜色组合可以是未来探索的一个领域。这里有一个例子,展示了最终的情节。
Final Plots
使用 fast.ai 在 resnet34 上训练该模型,总共使用了 489 篇假文章和 511 篇真文章。在没有数据扩充的情况下,在训练集和测试集之间使用标准的 80:20 分割。所有使用的代码都可以在这里找到。
经过 9 个时期后,模型的准确率达到 70%以上。尽管离这个数据集的最先进水平还很远,但这种新方法看起来确实很有前途。这是在训练过程中观察到的一些现象—
这个模型过度拟合了很多。与我们的预期相反,增加数据对过度拟合没有任何影响。进一步的训练或改变学习率没有任何效果。在 11x11 之前,增加地块大小是有帮助的,在此之后,增加地块大小会导致精度下降。在图上使用一定量的高斯滤波有助于提高精确度
目前,我们正致力于可视化词性(POS)标签和手套词嵌入。我们也在研究修改停用词,调整情节的大小和颜色模式。将保持你将张贴的进展!
如果您有兴趣探索 Text2Image 的更多可能性,或者想就此展开讨论,您可以在 Twitter @ Abhijithhere_ 上找到我,或者访问我的个人页面
原文:https://towardsdatascience.com/textrank-for-keyword-extraction-by-python-c0bae21bcec0?source=collection_archive---------1-----------------------
image from www.adaringadventure.com
TextRank 是一种基于 PageRank 的算法,常用于关键词抽取和文本摘要。在本文中,我将帮助您理解 TextRank 如何使用关键字提取示例,并展示 Python 的实现。
Keywords Extraction with TextRank, NER, etc
了解 PageRankPageRank 的实现通过 TextRank 提取关键词关键词提取的实现
关于 PageRank 的文章数不胜数,我就简单介绍一下 PageRank。这有助于我们后面理解 TextRank,因为它是基于 PageRank 的。
PageRank (PR)是一种用于计算网页权重的算法。我们可以把所有的网页看作一个大的有向图。在此图中,节点是一个网页。如果网页 A 具有到网页 B 的链接,它可以被表示为从 A 到 B 的有向边。
在我们构建了整个图之后,我们可以通过下面的公式为网页分配权重。
这里有一个例子可以更好地理解上面的符号。我们有一个图表来表示网页之间的链接。每个节点代表一个网页,箭头代表边。我们想得到网页的权重。
我们可以把上面函数中的求和部分改写成一个更简单的版本。
我们可以通过下面的函数得到网页的权重。
我们可以看到网页的权重依赖于其入站页面的权重。我们需要运行这个迭代很多次来得到最终的权重。在初始化时,每个网页的重要性为 1。
我们可以用一个矩阵来表示图中 a、b、e、f 之间的入站和出站链路。
一行中的每个节点表示来自其他节点的入站链接。例如,对于行,节点和具有到节点的出站链接。此演示将简化更新权重的计算。
根据函数中的,我们应该归一化每一列。
我们用这个矩阵乘以所有节点的权重。
这只是一个没有转储因子的迭代。
我们可以用 Python 多次迭代。
输出
所以 e 的权重(PageRank 值)是 0.34125。
如果我们把有向边改为无向边,我们可以相应地改变矩阵。
正常化。
我们应该相应地改变代码。
输出
所以 e 的权重(PageRank 值)是 1.29818827。
TextRank 和 PageTank 有什么区别?
简单的回答就是 PageRank 是网页排名,TextRank 是文字排名。PageRank 中的网页就是 TextRank 中的文本,所以基本思路是一样的。
这里我们有一些文字,摘自这里。我会用空间
我们将一个文档拆分成几个句子,我们只存储那些带有特定 POS 标签的单词。我们使用空间进行词性标注。
我们把这一段分成三句话。
因为句子中的大多数单词对确定重要性没有用,所以我们只考虑带名词、定语、动词词性标签的单词。这是可选的,你也可以使用所有单词。
输出
每个单词都是 PageRank 中的一个节点。我们将窗口大小设置为 k。
是窗户。窗口中的任何两个单词对都被认为具有无向边。
我们以为例,设置窗口大小 k=4,那么得到 4 个窗口,,,,。
对于窗口,任何两个单词对都有一条无向边。所以我们得到了。
基于这个图,我们可以计算每个节点(单词)的权重。最重要的词可以作为关键词。
这里我用 Python 实现了一个完整的例子,我们使用 spaCy 来获取单词的 POS 标签。
这个实现了我在上一节描述的所有功能。我们可以看到一个段落的输出。
输出
查看我在媒体上的其他帖子,有更好的目录列表视图!
GitHub:https://github.com/BrambleXu LinkedIn:www.linkedin.com/in/xu-liang 博客:https://bramblexu.org
我还实现了 TextRank,用于从新闻中提取关键字并将其可视化。欢迎检查。
[## 树莓徐/新闻图
从文本和图形可视化中提取关键信息- BrambleXu/news-graph
github.com](https://github.com/BrambleXu/news-graph)
Demo of News Graph
查看我的其他帖子 中等 同 一个分类查看 !
GitHub:bramble Xu LinkedIn:徐亮 博客:bramble Xu
原文:https://towardsdatascience.com/tf-agents-tutorial-a63399218309?source=collection_archive---------9-----------------------
在几个月内为我的强化学习管道中的另一个定制环境第三次实现了贪婪动作选择功能之后,我意识到我必须构建一个通用的强化学习框架,我可以在其中插入我的定制环境。幸运的是 Tensorflow 已经在上面了。
本教程将介绍我遇到的一些关于如何将所有 TF-Agents 组合在一起的问题。它是从单个 Collab 笔记本中收集来的,经过反复试验和钻研代码库后建立起来的。
这是给谁的?任何从事强化学习的人,厌倦了每次遇到新问题都要不断构建学习框架。
我要构建的环境是一个网格世界。它将是 6×6 的正方形,代理将从(0,0)开始,在(5,5)结束。代理的目标是找到从起点到终点的路径。代理可以选择的动作有上、下、左、右,用 0 到 3 的整数表示。
在奖励方面,如果代理人在终点着陆,则获得 100 的奖励,否则奖励为 0。如果代理到那时还没有到达终点,游戏将在 100 步处终止。
因此,让我们开始创建自定义网格世界环境,这需要对 PyEnvironment 类进行子类化,如下所示。
Initialization
init 函数必须包含 _action_spec 和 _observation_spec 的定义。由于动作是从 0 → 3 的单个整数,所以形状是一个空元组,它的最小值是 0,最大值是 3。观察值为 4 个整数,最大值和最小值分别为 0 和 5。前两个整数是指玩家的行和列,后两个整数是指赢方的行和列。
Reset
_reset 函数处理游戏结束时发生的事情——状态被重置,episode_ended 被设置为 False。
Step
_step 函数通过采取一个动作并将其应用到当前状态以获得一个新状态来处理状态转换。它测试新状态是否是游戏结束状态,然后返回转换或终止。它还将中间奖励和最终奖励应用于每个州。
Move
move 函数不是强制函数,但用于执行边界检查,然后根据动作更新状态。
Game over
game_over 函数通过比较玩家和获胜方块的行和列来检查游戏是否结束。
既然已经实现了这些定义,我们可以使用以下内置函数测试环境,以确保它符合规范:
Validation
只要没有抛出错误,那么就可以了!
接下来,我们将看看如何设置代理、学习模型、重放缓冲区、驱动程序以及它们如何相互连接。
首先,我们将 Gridworld 环境加载到一个限时包装器中,如果达到 100 步,该包装器将终止游戏。然后,结果被包装在 TF 环境处理程序中。
然后,我们将创建网络、优化器和深度 Q 网络(DQN)代理。在这里,我们决定创建一个具有 100 个隐藏节点的单一隐藏层的网络。对于这种简单的问题,这个设置应该足够了。我使用 Adam 优化器,因为一般来说,这是超越普通随机梯度下降(SGD)的最先进技术。尽管对于这个例子,我认为 SGD 也可以。请随意测试,并在评论中告诉我。
接下来,我们创建重放缓冲区和重放观察器。重放缓冲区用于包含观察和动作对,因此它们可用于训练。这里的参数是:
data_spec 是缓冲区中包含的行的形状batch_size,表示保存在重放缓冲区中的批处理的大小max_length 表示在用最新的条目覆盖最旧的条目之前,缓冲区可以容纳多少条记录。
这里需要注意的是,我们使用的 train_env.batch_size 在我们的例子中默认为 1,因为它不是由用户指定的。(第 148 行)
然后,我们从重放缓冲区中创建一个数据集,我们可以遍历该数据集并训练代理。这里使用的参数是:
num_parallel_calls 是并行处理的项目数sample_batch_size 是传递给神经网络进行训练的项目数num_steps,指定在返回的批次中作为子批次返回的连续项目数。这对于情节游戏来说非常重要,在这种游戏中,打乱所有数据会导致数据损坏。此处的最小值是 2,因为这样我们将接收子批次的[观察-动作,新观察-动作]进行训练。这是另一个可以调整的变量。
然后,我们希望创建一个驱动程序来模拟游戏中的代理,并将状态、动作、奖励对存储在重放缓冲区中,并跟踪一些指标。
最后,我们进入培训循环,在此循环中,驾驶员正在运行,经验从数据集中提取并用于培训代理。在特定的时间间隔,计算和打印损失和平均回报,并打印每集长度。情节长度应随时间减少,稳定在 10 步。
在这里找到 GridWorld 环境的完整代码,在这里找到训练设置的完整代码。
下面的图显示,在大约 6000 集之后,代理能够稳定地走 10 步到达获胜的方块。这里要注意的是,因为到达最后的方块是基于代理的随机行为,所以可能在 10000 集里它永远不会到达它,因此永远不知道它在哪里。
Plot of Average Episode Length vs Time
要进一步阅读 TF-Agents,请查看他们的文档。
感谢阅读!
原文:https://towardsdatascience.com/tf-idf-for-document-ranking-from-scratch-in-python-on-real-world-dataset-796d339a4089?source=collection_archive---------0-----------------------
什么是 TF-IDF?预处理数据。标题和正文的权重。使用 TF-IDF 匹配分数的文档检索。利用 TF-IDF 余弦相似度进行文档检索。
Photo by Sanwal Deen on Unsplash
TF-IDF 代表**“词频—逆文档频率”**。这是一种量化一组文档中的单词的技术。我们通常为每个单词计算一个分数,以表示它在文档和语料库中的重要性。该方法是信息检索和文本挖掘中广泛使用的技术。
如果我给你一个句子,比如“这栋楼好高”。我们知道单词和句子的语义,就很容易理解这个句子。但是任何程序(比如:python)如何解读这句话呢?任何编程语言都更容易理解数值形式的文本数据。因此,出于这个原因,我们需要对所有文本进行矢量化,以便更好地表示。
通过对文档进行矢量化,我们可以进一步执行多项任务,例如查找相关文档、排序、聚类等。当您执行 google 搜索时,使用的正是这种技术(现在它们被更新为更新的 transformer 技术)。网页称为文档,用来搜索的文本称为查询。搜索引擎维护所有文档的固定表示。当您使用查询进行搜索时,搜索引擎将找到该查询与所有文档的相关性,按照相关性的顺序对它们进行排序,并向您显示前 k 个文档。所有这些过程都是使用查询和文档的矢量化形式来完成的。
现在回到我们的 TF-IDF,
TF-IDF =术语频率(TF) *逆文档频率(IDF)
t —术语(单词)d-文档(一组单词)N —语料库的计数语料库—整个文档集
这衡量一个单词在文档中的出现频率。这在很大程度上取决于文档的长度和单词的一般性,例如,一个非常常见的单词如“was”可以在一个文档中出现多次。但是,如果我们取两个分别具有 100 个单词和 10,000 个单词的文档,则在 10,000 个单词的文档中,常见单词“was”出现的概率较高。但是我们不能说较长的文件比较短的文件更重要。正是因为这个原因,我们对频率值进行了归一化,我们用频率除以文档中的总字数。
回想一下,我们需要最终对文档进行矢量化。当我们计划对文档进行矢量化时,我们不能只考虑特定文档中出现的单词。如果我们这样做,那么两个文档的向量长度将会不同,并且计算相似性是不可行的。因此,我们所做的是将 vocab 上的文档矢量化。Vocab 是语料库中所有可能世界的列表。
我们需要所有词汇的字数和文档的长度来计算 TF。如果某个特定文档中不存在该术语,则该特定文档的特定 TF 值将为 0。在一个极端的情况下,如果文档中的所有单词都相同,那么 TF 将为 1。归一化的 TF 值的最终值将在[0 到 1]的范围内。0,1 包括在内。
TF 对于每个文档和单词都是独立的,因此我们可以将 TF 表述如下:
tf(t,d)= d 中 t 的计数/d 中的字数
如果我们已经计算了 TF 值,并且如果这产生了文档的矢量化形式,为什么不仅仅使用 TF 来寻找文档之间的相关性呢?我们为什么需要英特尔信息技术峰会?
让我解释一下,像“是”、“是”这样最常见的词会有很高的值,赋予这些词很高的重要性。但是用这些词来计算相关性会产生不好的结果。这类常用词被称为停用词。虽然我们将在稍后的预处理步骤中删除停用词,但是更理想的是在文档中找到该词的存在,并以某种方式减少它们的权重。
这个衡量文档在一整套语料库中的重要性。这与 TF 非常相似,但唯一的区别是 TF 是文档 d 中术语 t 的频率计数器,而 DF 是术语 t 在文档集 n 中出现次的计数。换句话说,DF 是该单词出现在其中的文档的数量。如果该术语在文档中至少出现一次,我们就认为出现了一次,我们不需要知道该术语出现的次数。
df(t)= t 在 N 个文档中的出现次数
为了保持这也在一个范围内,我们通过除以文档总数来标准化。我们的主要目标是知道一个术语的信息量,DF 是它的精确逆。这就是我们反转 DF 的原因
IDF 是衡量术语 t 的信息量的文档频率的倒数。当我们计算 IDF 时,对于最常出现的单词(如停用词)来说,IDF 将非常低(因为它们出现在几乎所有的文档中,并且 N/df 将给予该单词非常低的值)。这最终给出了我们想要的相对权重。
idf(t) = N/df
现在 IDF 有一些其他问题,当我们有一个大的语料库规模,比如 N=10000,IDF 值会爆炸。因此,为了抑制这种影响,我们采用了 IDF 的日志。
在查询时,当单词不在 vocab 中时,它将被忽略。但是在少数情况下,我们使用固定的 vocab,并且 vocab 中的一些单词可能在文档中不存在,在这种情况下,df 将是 0。因为我们不能被 0 整除,所以我们通过在分母上加 1 来平滑这个值。
idf(t) = log(N/(df + 1))
最后,通过取 TF 和 IDF 的乘积值,我们得到 TF-IDF 分数。TF-IDF 有许多不同的版本,但是现在,让我们集中在这个基本版本上。
tf-idf(t,d) = tf(t,d) * log(N/(df + 1))
我是 NLP 和 DL 领域的高级数据科学家和 AI 研究员。
联系我: Twitter , LinkedIn 。
现在我们已经了解了什么是 TF-IDF,让我们来计算数据集的相似性得分。
我们将要使用的数据集是几个故事的存档,这个数据集有许多不同格式的文档。下载数据集,打开你们的笔记本,我指的是 Jupyter 笔记本ὡ;。
数据集链接:http://archives.textfiles.com/stories.zip
任何机器学习任务的第一步都是分析数据。因此,如果我们查看数据集,乍一看,我们会看到所有包含英文单词的文档。每个文档都有不同的名称,其中有两个文件夹。
现在一个重要的任务是识别正文中的标题,如果我们分析文档,有不同的标题排列模式。但是大多数标题都是居中对齐的。现在我们需要想办法提取标题。但是在我们全力以赴开始编码之前,让我们稍微深入分析一下数据集。
花几分钟时间自己分析数据集。尝试探索…
经过进一步检查,我们可以注意到每个文件夹(包括根目录)中都有一个 index.html,其中包含所有的文档名及其标题。因此,让我们认为自己是幸运的,因为标题是给我们的,而不是穷尽地从每个文件中提取标题。
没有具体的方法来做到这一点,这完全取决于手头的问题陈述和我们对数据集所做的分析。
因为我们已经发现标题和文档名在 index.html 中,所以我们需要提取这些名称和标题。我们很幸运,index.html 有标签,我们可以使用模式提取我们需要的内容。
在我们开始提取标题和文件名之前,因为我们有不同的文件夹,首先让我们抓取文件夹,以便稍后一次性读取所有 index.html 文件。
os.walk 提供了目录中的文件,os.getcwd 提供了当前目录和标题,我们将在当前目录+ stories 文件夹中进行搜索,因为我们的数据文件位于 stories 文件夹中。
总是假设你正在处理一个巨大的数据集,这有助于自动化代码。
现在我们可以发现,文件夹给了根文件夹额外的 / ,所以我们要删除它。
上面的代码删除了文件夹中第 0 个索引的最后一个字符,这是根文件夹
现在,让我们遍历所有的 index.html,提取它们的标题。要做到这一点,我们需要找到一种模式来去掉标题。由于这是在 html 中,我们的工作会简单一点。
让我想想…
我们可以清楚地观察到,每个文件名都被括在( > <)和( " ) 之间,每个标题都在(
)和(
)之间****
我们将使用简单的正则表达式来检索名称和标题。以下代码给出了与该模式匹配的所有值的列表。因此 names 和 titles 变量包含了所有名字和头衔的列表。
现在我们已经有了从索引中检索值的代码,我们只需要迭代所有的文件夹,并从所有 index.html 文件中获取标题和文件名
-从索引文件中读取文件
-提取标题和名称
-迭代到下一个文件夹
这将准备数据集的索引,数据集是文件位置及其标题的元组。有一个小问题,根文件夹 index.html 也有文件夹及其链接,我们需要删除这些。
只需使用条件检查器来删除它。
预处理是我们处理任何文本模型的主要步骤之一。在此阶段,我们必须查看数据的分布情况,需要什么技术以及应该清理多深。
这一步从来没有一个统一的规则,完全取决于问题陈述。几个强制性的预处理是:转换成小写,删除标点符号,删除停用词和词干。在我们的问题陈述中,基本的预处理步骤似乎就足够了。
在文本处理过程中,每个句子被拆分成单词,每个单词被视为预处理后的一个标记。编程语言认为文本数据是敏感的,这意味着与**不同。我们人类知道这两者属于同一个标记,但是由于字符编码,它们被认为是不同的标记。转换成小写是一个非常强制性的预处理步骤。因为我们的所有数据都在列表中,所以 numpy 有一个方法可以立刻将列表转换成小写。**
停用词是最常见的不会给文档向量带来任何附加值的词。事实上,删除这些将增加计算和空间效率。nltk 库有一个下载停用词的方法,所以我们可以直接使用 nltk 库,遍历所有的词并删除停用词,而不是自己显式地提到所有的停用词。有许多有效的方法可以做到这一点,但我只给出一个简单的方法。
我们将遍历所有的停用词,如果是停用词,就不把它们追加到列表中
标点符号是语料库文档中不必要的符号集。我们应该对我们所做的事情小心一点,可能会有一些问题,比如预处理后 us-us“United Stated”被转换为“us”。连字符和通常应小心处理。但是对于这个问题陈述,我们将删除它们
我们将所有的符号存储在一个变量中,并迭代该变量,删除整个数据集中的特定符号。我们在这里使用 numpy,因为我们的数据存储在一个列表列表中,numpy 是我们的最佳选择。
注意标点符号中没有撇号。因为当我们首先删除标点符号时,它会将 don’t 转换为 dont,并且它是一个不会被删除的停用词。我们要做的是,首先删除停用词,然后是符号,最后重复停用词删除,因为少数词可能仍然有撇号,而不是停用词。
单个字符在了解文档的重要性方面没有太大用处,并且少数最后的单个字符可能是不相关的符号,所以删除单个字符总是好的。
我们只需要迭代所有的单词,如果长度不大于 1,就不追加单词。
这是预处理的最后也是最重要的部分。词干处理将单词转换成词干。
**例如, playing 和 played 是同一类型的词,基本上表示一个动作 **play。斯特梅尔正是这样做的,它将单词简化为词干。我们将使用一个名为 porter-stemmer 的库,它是一个基于规则的词干分析器。波特-斯特梅尔识别并移除单词的后缀或词缀。词干分析器给出的单词不需要有几次是有意义的,但是它将被识别为模型的单个标记。
引理化是一种将单词简化为单词的根同义词的方法。与词干提取不同,词汇匹配确保缩减后的单词再次成为词典中的单词(同一种语言中的单词)。WordNetLemmatizer 可用于对任何单词进行词汇化。
词干-不必是字典中的单词,根据一些规则删除前缀和词缀
词汇化——将成为词典中的一个词。简化为词根同义词。
一个更有效的方法是先用引理,然后用词干,但是对于一些问题语句,单独用词干也可以,这里我们不使用引理。
当用户给出诸如 100 美元或100 美元的查询时。对于用户来说,这两个搜索词是相同的。但是我们的 IR 模型将它们分开处理,因为我们将 100 美元、100 元作为不同的代币存储。因此,为了使我们的红外模式更好一点,我们需要将 100 转换为 100。为了实现这一点,我们将使用一个名为 num2word 的库。
如果我们看一下上面的输出,它给出了一些符号和句子,如“一百个 和 两个”,但是该死的我们刚刚清理了我们的数据,那么我们该如何处理呢?不用担心,我们将在将数字转换为单词后再次运行标点和停止单词。
最后,我们将把所有这些预处理方法放入另一个方法中,我们称之为预处理方法。
如果仔细观察,一些预处理方法会再次重复。正如所讨论的,这只是帮助清理数据的一点点深度。现在我们需要阅读文档,并将它们的标题和正文分开存储,因为我们以后会用到它们。在我们的问题陈述中,我们有非常不同类型的文档,由于编码兼容性,这可能会导致阅读文档时出现一些错误。要解决这个问题,只需在 open()方法中使用 encoding="utf8 ",errors=‘ignore’。
回想一下,我们需要给标题和正文不同的权重。现在我们该如何处理这个问题呢?在这种情况下,TF-IDF 的计算将如何进行?
给标题和正文不同的权重是一种非常常见的方法。我们只需要把文档看作 body + title,使用它我们可以找到 vocab。并且我们需要给标题中的单词不同的权重,给正文中的单词不同的权重。为了更好地解释这一点,让我们考虑一个例子。
title = “这是一篇小说论文”
body = “本文由许多论文的综述组成”
现在,我们需要计算身体和标题的 TF-IDF。暂时让我们只考虑单词 paper ,而忘记删除停用词。
题目中 word paper 的 TF 是多少?1/4?
不,是 3/13。怎么会?word paper 在标题和正文中出现 3 次,标题和正文的总字数为 13。正如我之前提到的,我们只是认为标题中的单词具有不同的权重,但是在计算 TF-IDF 时,我们仍然考虑整个文档。
那么论文无论是标题还是正文的 TF 都是一样的?对,是一样的!这只是我们要给出的重量差。如果这个词同时出现在标题和正文中,那么 TF-IDF 值不会有任何减少。如果这个单词只出现在标题中,那么这个特定单词的正文的权重就不会加到这个单词的 TF 中,反之亦然。
文档=正文+标题
TF-IDF(文档)= TF-IDF(标题) alpha + TF-IDF(正文) (1-alpha)**
让我们聪明点,事先算算 DF。我们需要遍历所有文档中的所有单词,并存储每个单词的文档 id。为此,我们将使用字典,因为我们可以将单词用作键,将一组文档用作值。我提到 set 是因为,即使我们试图多次添加文档,set 也不会只接受重复的值。
如果单词还没有集合,我们将创建一个集合,否则将它添加到集合中。try 块检查这种情况。这里 processed_text 是文档的主体,我们将对标题重复同样的操作,因为我们需要考虑整个文档的 DF。
len(DF)将给出独特的单词
DF 将单词作为键,文档 id 列表作为值。但是对于 DF,我们实际上不需要文档列表,我们只需要计数。所以我们要用它的计数来替换这个列表。
这就是我们需要的所有单词的数量。为了在我们的词汇表中找到全部的唯一单词,我们需要使用 DF 的所有关键字。
回想一下,我们需要为标题和正文保持不同的权重。为了计算正文或标题的 TF-IDF,我们需要同时考虑标题和正文。为了使我们的工作简单一点,让我们使用一个字典,将(文档,令牌)对作为键,将任何 TF-IDF 分数作为值。我们只需要迭代所有文档,我们可以使用 Coutner,它可以给出令牌的频率,计算 tf 和 idf,最后作为(doc,token)对存储在 tf_idf 中。tf_idf 字典是针对正文的,我们将使用相同的逻辑为标题中的单词构建一个字典 tf_idf_title。
来计算不同的权重。首先,我们需要维护一个值 alpha,它是主体的权重,那么显然 1-alpha 将是标题的权重。现在让我们深入研究一下数学,我们讨论过,如果一个单词同时出现在正文和标题中,那么这个单词的 TF-IDF 值将是相同的。我们将维护两个不同的 tf-idf 字典,一个用于正文,一个用于标题。
我们要做的是聪明一点,我们会为身体计算 TF-IDF;全身 TF-IDF 值乘以α;迭代标题中的标记;替换(文档,令牌)对的正文 TF-IDF 值中的标题 TF-IDF 值。花些时间来处理这个:P
流量:
-计算所有文档正文的 TF-IDF
-计算所有文档标题的 TF-IDF
-将主体 TF-IDF 乘以α
-Iterate Title IF-IDF for every(doc,token)
—如果标记在正文中,请将正文(文档,标记)值替换为标题(文档,标记)中的值
我知道这一开始并不容易理解,但还是让我解释一下为什么上面的流程有效,因为我们知道如果标记在两个地方,那么主体和标题的 tf-idf 将是相同的,我们对主体和标题使用的权重总和为 1
TF-IDF = body _ TF-IDF * body _ weight+title _ TF-IDF * title _ weight
body_weight + title_weight = 1
当一个令牌同时出现在这两个地方时,那么最终的 TF-IDF 将与获取 body 或 title tf_idf 相同。这正是我们在上面的流程中所做的。最后,我们有一个字典 tf_idf,它的值是(doc,token)对。
匹配分数是计算相似性的最简单的方法,在这种方法中,我们为每个文档添加查询中标记的 tf_idf 值。例如,对于查询“hello world ”,我们需要检查每个文档中是否存在这些单词,如果存在,那么 tf_idf 值将被添加到特定 doc_id 的匹配分数中。最后,我们将排序并取前 k 个文档。
上面提到的是理论概念,但由于我们使用字典来保存数据集,我们要做的是迭代字典中的所有值,并检查该值是否存在于令牌中。因为我们的字典是一个(document,token)键,所以当我们在查询中找到一个 token 时,我们会将文档 id 和 tf-idf 值一起添加到另一个字典中。最后,我们将只取前 k 个文档。
密钥[0]是文档 id,密钥[1]是令牌。
当我们有一个完美工作的匹配分数时,为什么我们还需要余弦相似度?虽然匹配分数给出了相关的文档,但是当我们给出长的查询时,它很失败,它将不能正确地对它们进行排序。余弦类似地做的是,它将所有文档标记为 tf-idf 令牌的向量,并测量余弦空间中的相似性(向量之间的角度。少数情况下,查询长度会很短,但它可能与文档密切相关。在这种情况下,余弦相似性是找到相关性的最佳方法。
观察上面的图,蓝色向量是文档,红色向量是查询,我们可以清楚地看到,尽管文档 d1 的曼哈顿距离(绿线)非常高,但查询仍然接近文档 d1。在这种情况下,余弦相似度会更好,因为它考虑了这两个向量之间的角度。但是匹配分数将返回文档 d3,但是这不是非常密切相关的。
匹配分数计算曼哈顿距离(从尖端开始的直线)
余弦分数考虑向量的角度。
要计算上述任何一项,最简单的方法是将所有内容转换为矢量,然后计算余弦相似度。因此,让我们将查询和文档转换成向量。我们将使用 total_vocab 变量来为每个标记生成一个索引,该变量包含所有唯一标记的列表,我们将使用 numpy of shape (docs,total_vocab)来存储文档向量。
对于 vector,我们需要计算 TF-IDF 值,我们可以从查询本身计算 TF,并且我们可以利用我们为文档频率创建的 DF。最后,我们将在一个(1,vocab_size) numpy 数组中存储 tf-idf 值,令牌的索引将从 total_voab 列表中决定
现在,我们要做的就是计算所有文档的余弦相似度,并返回最大的 k 个文档。余弦相似度定义如下。
*np.dot(a,b)/(norm(a)norm(b))
我从 doc_id 200 (对我来说)中取了文本,在匹配得分和余弦相似度两方面粘贴了一些长查询和短查询的内容。
****
****
正如我们可以从上面的文档中看到的,余弦方法总是比匹配方法得到更高的评价,这是因为余弦相似性学习了更多的上下文。
我是 NLP 和 DL 领域的高级数据科学家和 AI 研究员。
愿意联系: Twitter , LinkedIn 。
nltk,numpy,re,mat,num2words
1。简介2。单字索引&位置索引3.TF-IDF更多即将推出…
原文:https://towardsdatascience.com/tf-term-frequency-idf-inverse-document-frequency-from-scratch-in-python-6c2b61b78558?source=collection_archive---------1-----------------------
在这篇文章中,我将解释如何用 python 从头开始实现 tf-idf 技术,这种技术用于寻找由单词组成的句子的含义,并抵消单词袋技术的无能,这种技术有利于文本分类或帮助机器阅读数字中的单词。
术语。词频(TF)。文档频率。逆文档频率。用 Python 实现。
t —术语(单词)d-文档(一组单词)N —语料库的计数语料库—整个文档集
假设我们有一组英文文本文档,并希望对哪个文档与查询最相关进行排序,“数据科学太棒了!”一种简单的开始方式是通过消除不包含所有三个词“数据”、“是”、“科学”和“棒极了”的文档,但是这仍然留下许多文档。为了进一步区分它们,我们可以计算每个术语在每个文档中出现的次数;一个术语在文档中出现的次数称为其词频。
T 文档中出现的术语的权重简单地与术语频率成比例。
tf(t,d)= d 中 t 的计数/d 中的字数
这个衡量的是文档在整套语料库中的重要性,这和 TF 非常相似。唯一的区别是 TF 是文档 d 中术语 t 的频率计数器,其中 DF 是术语 t 在文档集 n 中出现次的计数。换句话说,DF 是该单词出现在其中的文档的数量。如果该术语在文档中至少出现一次,我们认为出现一次,我们不需要知道该术语出现的次数。
df(t)= t 在文档中的出现次数
在计算 TF 时,所有项都被认为是同等重要的。然而,众所周知,某些术语,如“是”、“的”和“那个”,可能会出现很多次,但并不重要。因此,我们需要降低频繁项的权重,同时增加罕见项的权重,通过计算 IDF,结合了一个逆文档频率因子,该因子减少了文档集中出现频率非常高的项的权重,并增加了出现频率很低的项的权重。
IDF 是测量术语 t 的信息量的文档频率的倒数。当我们计算 IDF 时,对于最常出现的词(例如停用词)来说,IDF 将非常低(因为停用词(例如“is ”)出现在几乎所有的文档中,并且 N/df 将给予该词非常低的值)。这最终给出了我们想要的相对权重。
idf(t) = N/df
现在,idf 很少有其他问题,在大型语料库的情况下,比如说 100,000,000,IDF 值会爆炸,为了避免这种影响,我们采用 IDF 的日志。
在查询期间,当出现不在 vocab 中的单词时,df 将为 0。因为我们不能被 0 整除,所以我们通过在分母上加 1 来平滑这个值。
这是最终的公式:
idf(t) = log(N/(df + 1))
tf-idf 现在是评估一个单词对一个集合或语料库中的文档有多重要的正确度量。
tf-idf(t,d) = tf(t,d) * log(N/(df + 1))
为了用 python 从头开始制作 TF-IDF,让我们想象不同文档中的两句话:
第一句话:“数据科学是 21 世纪最性感的工作”。
第二句话:“机器学习是数据科学的关键”。
第一步,我们必须创建 TF 函数来计算所有文档的总词频。以下是代码:
首先,像往常一样,我们应该导入必要的库:
因此,让我们加载我们的句子,并将它们组合在一个集合中:
输出:
现在让我们添加一种方法,对两个句子使用字典键值对来计算单词:
现在,我们将它们放入数据帧,然后查看结果:
不,让我们写 TF 函数:
这是预期的输出:
这就是 TF 公式的全部内容,我想谈谈停用词,我们应该删除它们,因为它们是最常见的词,不会给文档向量带来任何额外的价值。事实上,删除这些将增加计算和空间效率。
nltk 库有一个下载停用词的方法,所以我们可以直接使用 nltk 库,遍历所有的词并删除停用词,而不是自己显式地提到所有的停用词。有许多有效的方法可以做到这一点,但我只给出一个简单的方法。
这些是英语中停用词的例子:
这是一个简单的代码,可以下载停用词并删除它们。
输出:
现在我们已经完成了 TF 部分,接下来是 IDF 部分:
现在我们实施 idf 公式,让我们以计算 TFIDF 结束
输出:
那是许多工作。但是,如果将来要求您从头开始编写 TF-IDF 代码,这是很方便的。然而,由于 sklearn 库,这可以简单得多。让我们看看下面的例子:
这是预期的输出:
在这篇文章中,我们将解释如何使用 python 和一种称为词频的自然语言处理(NLP)技术—逆文档频率( tf-idf )来总结文档。
我们将使用 sklearn 和 nltk 来完成这项任务。
记住你可以在我的 github 库这里找到完整的工作代码。
感谢阅读,我很高兴讨论您可能有的任何问题或更正:)如果您想讨论机器学习或其他任何问题,请在 LinkedIn 上找到我。
原文:https://towardsdatascience.com/th-true-meaning-of-p-value-2225b04510c?source=collection_archive---------19-----------------------
p-values shouldn’t make us feel lost, but give us direction. Photo Credit: Martin Reisch.
我们之前已经多次学习过 p 值。首先,在我们大学时死记硬背的统计书中;第二,当我们读到一些文章向我们保证它们是合法的;最后,现在我们决定如何经营我们的企业。在整个过程中,我们被告知定义,希望我们已经学到了足够多的东西,可以反刍一些关于零假设和概率的东西——但是我们真的理解了吗?
理解不仅仅是知道一个定义,为了有效地使用 p 值,有必要对它们的含义有一种“感觉”。为此,我们将采用可视化方法。
事实上,当你通过视觉观察 p 值时,它们非常直截了当,这就是我今天想与你分享的。
我们将遵循这个粗略的准则:
我怎么确定我的转化率是我想的那样?测量概率AB 测试场景
前几段将涵盖一些基础知识,所以请随意跳过这些,但不要忘记检查视觉效果!
让我们先来看一个简单的 p 值,然后再来看最重要的 AB 测试场景,它决定了全球所有你最喜欢的应用、服务和程序的产品决策。希望在读完这篇文章(或书签)后,你能理解 p 值的所有荣耀,就像我最终理解的那样。
请注意,以下内容将围绕电子商务产品,但请注意,这种理解可以应用于处理各种其他情况。
想象一下:你已经推出了一个新网站,你想知道你的转换率(CVR)是多少,所以你开始衡量会话和转换。使用这些,您可以计算简单的转换率比例,如下所示:
您测量了 1000 次会话和 50 次转换,得出 CVR 为 5%——太棒了!但是等等,那 5%有多准确?
如果你再测量 1000 次会话,你会再获得 50 次转换还是会有所不同?这就是我们的朋友统计学的用武之地——帮助我们理解如何从样本数据中解读绝对真理。
为了以最简单的形式理解 p 值,让我们提出一个不同的问题。如果我们网站的实际 CVR 是 5%,那么如果我像上面那样测量 1000 个会话,我测量到 6%或更大的 CVR 的概率是多少?如果你不喜欢用百分比来思考,这就等于说“从 1000 次会话中获得 60 次或更多转化的几率有多大?”。
有了这样的问题陈述,我们现在可以通过计算进行实验。为此,我们将设置一个程序来模拟 1000 个会话,并对每个会话检查是否有转换。有了这些模拟的会议,我们可以计算那个实验的 CVR。然后我们将这样做 10,000 次,看看最常见的结果是什么。
运行完这个之后,我们剩下一长串可能的 CVR,如下所示:
然后,我们可以将所有这些值组合在一些波段中,并查看我们记录了多少个波段。绘制这个图给了我们下面的直方图。
简要回顾一下,直方图中的每一列都显示了有多少 CVR 在该波段内结束,例如,对于 0.05,该波段为 0.0495 至 0.0505,并且该图显示该波段具有最多数量的 CVR。
As we run more trials, the results approach the normal distribution. Left: Count of trials on y axis; as we run more trials the graph is filled up. Right*: y axis normalised to show the best visual. The line represents an approximation for the histogram.*
这张图表告诉我们什么?我们可以看到,最常见的值是 5%,这正是我们所期望的,因为这是实际的 CVR。我们还可以看到,有许多值不是 5%,这是由于用户的随机行为。
任何登陆网站的个人用户都有 5%的机会转化,但这并不意味着 100 个用户中有 5 个会转化。100 个用户中有 0 个会转化还是有可能的,只是偶然。
也就是说,平均而言,100 个用户中往往会有 5 个转化用户,这就是为什么当我们远离中心时,测得的 CVR 与 5%不同的实验数量会减少。这种分布被称为正态分布,由于它能够近似自然现象,因此在许多研究领域都得到了应用。
现在你可能想知道这是什么意思,但是用我们新发现的知识,我们可以回答我们最初的问题,那就是:
如果我们网站的实际 CVR 是 5%,如果我测量 1000 个会话,我测量到 6%或更高的值的概率是多少
现在这很容易。我们只需计算所有 CVR 超过 6%的试验,然后除以试验总数。
我们找到了。我们的 CVR 达到 6%或更高的几率只有 2%。我们可以为不同的潜在 CVR 计算类似的数字,但我们会看到趋势。随着我们远离值 5%(我们在实验中假设的 CVR),我们将看到测量值的概率向 0 下降。
让我们重述一下我们刚刚说过的话:
我们的 CVR 达到 6%或更高的几率只有 2%。
不管你有没有注意到:这是一个 p 值。
Much surprise. Photo Credit: Ben White.
p 值是假设零假设是正确的情况下,我们观察到某个事物为或更为极端的概率。
在我们的例子中,零假设是 CVR 是 5%,它是正确的意味着实际 CVR 是 5%。这就是你要说的——“我们的 CVR 达到 6%或更高的几率只有 2%。”—一个 p 值,甚至没有找到它的意思。
在典型应用中,通常从目标 p 值开始,然后检查测得的 CVR 与该值相比是否显著。这与我们刚刚遵循的程序相反。让我们试一试。
我将广告添加到一个之前 CVR 为 4%表现良好的页面,但我想非常确定(95%)我的广告不会分散用户的购买注意力。让我们回到我们的图表。我们需要找到试验次数达到 5%的 CVR,而不是对超过某个值的所有试验进行计数。这将类似于:
如果我们把测得的 CVR 按升序排列,我们只需要选择第 50 个 CVR。一个简单的方法是使用累积分布,这是通过将左侧的所有 CVR 相加直到列表末尾而创建的。从左到右,你会得到小于某个 CVR 的总试验次数。在 CVR 为 4%的情况下,你预计会有 500 个会话,正好是一半。
通常,我们会将累积分布绘制成百分比,这样我们就不必跟踪试验的次数。
Left: Histogram of ‘measured’ CVRs. Right: Cumulative Distribution of the same CVRs featured on the left.
现在我们有了累积分布,我们可以通过画一条线到分布上来找到我们的 CVR,然后下来找到我们的 CVR。这给出了 3%的结果。因此,我们可以得出结论,如果在 1000 次会话后,我们记录的值为 3%或更少,那么我们可以确信 CVR 小于 4%,我们应该重新考虑我们的页面设计。
希望以上给出了我们如何可视化 p 值的基本理解。我们现在已经到达了这篇文章的顶点——AB 测试。
AB 测试在全球范围内影响你最喜爱的应用、服务和程序的产品决策,因此,理解它们至关重要。
Photo Credit: Helloquence.
当人们想要测试变异和原始之间的差异时,使用 AB 测试。一个例子是电子商务网站上的新购买流。原来的设计将被称为控制,新的设计将是变化。在这种情况下,我们想知道:“变异的 CVR 比对照的好吗?”。
在这样的测试中,您可能会测量 1000 个会话的结果,并发现变异的 CVR 是 9%,而控制的 CVR 是 7%。我们能得出变异更好的结论吗?我们再做一些统计。
我们将采取和以前一样的方法,首先重申这个问题
由于纯粹的偶然性,我们测量到 2%的差异的概率是多少?
有了这个,我们可以像以前一样模拟一堆实验。考虑到我们测量的 CVR 为 7%和 9%,最有可能的平均值 CVR 为 8%,所以我们可以用 8%的 CVR 运行两个实验,看看有多少次差异大于 2%。
As before. Left: Histogram of ‘measured’ CVRs. Right: Cumulative Distribution of the same CVRs featured on the left.
我们可以在这里看到我们试验的结果。像以前一样,我们看到一个正态分布和我们的累积分布。为了计算出测量 2%差异的机会,我们可以找到 2%值所对应的试验次数。在这种情况下,如果我们画一条线,我们会看到它大约是 90%。这告诉我们,10%的时间我们会看到超过 2%的差异纯属偶然。换句话说:
由于纯粹的偶然性,我们有 10%的机会看到大于 2%的差异。
好了,又一个 p 值。通常对于业务测试,我们的目标是 p 值为 0.95,在这种情况下相当于 5%,因此我们可以看到,根据我们拥有的数据量,不可能得出变化更好的结论,相反,我们必须收集更多的数据。
细心的读者可能会好奇为什么我们还要进行 AB 测试。在上一节中,我们展示了当你做了一个改变,并且知道你的网站的潜在 CVR 时,如何找到 p 值。
我们进行 AB 测试的原因是为了控制可能影响结果的已知和未知因素。例如,如果用户更有可能在月末进行转换,而我们在月初开始测试,那么即使是一个更好的设计,这个变化也可能做得更差。或者,如果在测试期间,其中一个供应商停止生产一种产品,这将使变化处于亏损状态。
通过运行 AB 测试,将用户随机分配到一个组,我们可以确信两个样本将具有相似的特征,从而创建一个公平的测试。
我们发现 p 值是假设零假设是正确的情况下,我们观察到一个或更多极端效应的概率。
我们看到 p 值的应用通过可视化和一些计算实验的力量非常容易理解。这种理解方法给了我很大的帮助,当其他人需要帮助理解 p 值为 0.96 的实际情况时,它可以作为一个书签。
知道另一种简化 p 值的方法吗?让我知道!
原文:https://towardsdatascience.com/the-10-most-useful-machine-learning-projects-of-the-past-year-2018-5378bbd4919f?source=collection_archive---------2-----------------------
想获得灵感?快来加入我的 超级行情快讯 。ὠ;
对于人工智能和机器学习来说,过去的一年是伟大的一年。机器学习的许多新的高影响力应用被发现并公之于众,特别是在医疗保健、金融、语音识别、增强现实以及更复杂的 3D 和视频应用中。
我们已经看到了更多的应用驱动的研究,而不是理论上的推动。尽管这可能有其缺点,但它目前已经产生了一些巨大的积极影响,产生了可以迅速转化为业务和客户价值的新 R&D。这种趋势强烈地反映在许多 ML 开源工作中。
让我们来看看过去一年中最实用的 6 个 ML 项目。这些项目已经发布了代码和数据集,允许个人开发人员和较小的团队学习并立即创造价值。它们可能不是最具理论突破性的作品,但它们是适用和实用的。
Fast.ai 库旨在使用现代最佳实践简化快速准确的神经网络训练。它抽象了在实践中实现深度神经网络的所有细节工作。它非常易于使用,并且是按照从业者的应用程序构建思维来设计的。该库最初是为 Fast.ai 课程的学生创建的,是在易于使用的 Pytorch 库之上以干净简洁的方式编写的。他们的文档也是顶级的。
Detectron 是脸书 AI 的研究平台,用于对象检测和实例分割研究,用 Caffe2 编写。它包含各种对象检测算法的实现,包括:
屏蔽 R-CNN :使用更快的 R-CNN 结构的对象检测和实例分割RetinaNet :一个基于特征金字塔的网络,具有独特的焦点损失来处理困难的例子。更快的 R-CNN :物体探测网络最常见的结构
所有网络都可以使用几个可选分类主干之一:
ResNeXt{50,101,152}ResNet{50,101,152}特征金字塔网络(带 ResNet/ResNeXt)VGG16
更重要的是,所有这些都带有 COCO 数据集上预先训练的模型,因此您可以开箱即用!它们都已经在 Detectron model zoo 中使用标准评估指标进行了测试。
Detectron
另一个来自脸书研究中心的库是为文本表示和分类而设计的。它带有超过 150 种语言的预训练单词向量模型。这种词向量可以用于许多任务,包括文本分类、摘要和翻译
Auto-Keras 是用于自动机器学习(AutoML)的开源软件库。它是由德州农工大学的数据实验室和社区贡献者开发的。AutoML 的最终目标是向数据科学或机器学习背景有限的领域专家提供易于访问的深度学习工具。Auto-Keras 提供了自动搜索深度学习模型的最佳架构和超参数的功能。
多巴胺是强化学习算法快速原型的研究框架,由 Google 创建。它的目标是灵活且易于使用,实现标准的 RL 算法、指标和基准。
根据多巴胺的文档,他们的设计原则是:
简易实验:帮助新用户进行基准实验灵活开发:促进新用户产生新的和创新的想法紧凑而可靠:为一些更老、更流行的算法提供实现可重复:确保结果可重复
vid2vid 项目是 Nvidia 最先进的视频到视频合成算法的公共 Pytorch 实现。视频到视频合成的目标是学习从输入源视频(例如,语义分段掩码序列)到精确描述源视频内容的输出照片级真实视频的映射函数。
这个库的伟大之处在于它的选项:它提供了几种不同的 vid2vid 应用程序,包括自驾车/城市场景、人脸和人类姿势。它还附带了广泛的指令和功能,包括数据集加载、任务评估、培训功能和多 gpu!
Converting a segmentation map to a real image
ChatterBot: 用于会话式对话引擎和创建聊天机器人的机器学习kube flow:Kubernetes 的机器学习工具包imgaug: 用于深度学习的图像增强不平衡学习:scikit 下的一个 python 包,专门用于跟踪不平衡数据集ML flow:开源平台管理 ML 生命周期,包括实验、可复制性和部署。AirSim: 基于虚幻引擎/ Unity 打造的自动驾驶汽车模拟器,来自微软 AI & Research
在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上与我联系!
原文:https://towardsdatascience.com/the-10bias-and-causality-techniques-of-that-everyone-needs-to-master-6d64dc3a8d68?source=collection_archive---------11-----------------------
到底因果关系和机器学习有什么关系?机器学习是关于预测和关于真实效果的因果关系,这两个主题有什么共同点吗?是的,有很多共同点,这一系列文章试图在数据科学的这两个子领域之间架起一座桥梁。
我喜欢认为机器学习只是一个数据研磨机,如果你放入高质量的数据,你会得到高质量的预测,但如果你放入垃圾,它会继续研磨,但不要指望会有好的预测出来,它只是研磨的垃圾,这就是我们在这篇文章中要讨论的。
指标 :
基本定义;
数据科学中的因果关系;
1 —辛普生悖论;
2 —有效期、外部效度和格兰杰因果关系;
3 —生态谬误;
4 —省略可变偏差;
5 —反事实;
6 —实验的干预和设计;
7 —选择和生存偏倚;
结论和后续步骤。
**什么是机器学习?**很简单,它是一套在数据中寻找模式的技术,以实现给定的目标,而不必显式地传递指令。例如,网飞的电影推荐系统。
**什么是数据科学?**汇集统计数据的多学科领域,
通过机器学习和计算来解决数据密集型问题、分析和见解。更详细的描述可以在下面找到:
[## 毕竟,数据科学中有什么新东西?
数据科学家的工作范围和角色是什么。
medium.com](https://medium.com/swlh/data-science-and-the-data-scientist-db200aac4ea0)
在这里,它开始变得有点难以(和哲学)定义。过去的伟大思想家们取得了进步,如亚里士多德、德卡提斯、斯宾诺莎、康德、密尔、休谟和许多其他人,但没有什么明确的东西,我也不会给它下定义。对我们来说,现在,它将只是一个变量的真实影响,即
如果变量发生,它将对目标产生多大的影响。例如,吸烟(我们的变量)使你患肺癌(我们的目标)的可能性增加+ x%(我们的因果效应)。
这听起来很简单,但问题是,通过放置没有影响但只与引起影响的变量相关的变量,后者捕捉到了前者的影响,并且没有好的方法知道这是否正在发生。对于预测来说,这很好,因为我们通常没有因果变量,但通过放置一系列与因果变量相关的变量,模型可以更好地理解和预测。
如果你只关心预测,比如一个机器学习工程师,也许因果关系真的是一个次要的细节,但如果你的预测不是惰性的,而是对使用它们的人产生一些行动,也许你应该开始担心因果关系。如果你是一名数据科学家,不关心因果关系,你可能不是一名科学家,而是一名工程师。做科学就是发现(或者更常见的,试图反驳)因果关系。当然,在许多模型中,我们只关心做出简单的预测,我们可能不需要科学家来做这些。
Granger Causality Graph Example, which is not exactly causal, but which increases predictive power over time series. Available at URL: https://arxiv.org/abs/1406.6651
此外,机器学习领域越来越强烈的担忧是选择偏差。我们已经有几个国家(特别是在欧洲)允许用户知道一个可能的算法决策的原因(例如借款、保险或职位空缺),所以仔细想想偏见、
歧视和因果关系不仅重要,而且可以让你免于犯罪。我们在解释 BlackBox 的算法时谈到了这一点:
[## 解读机器学习——全指南
沙普利值和 SHAP 包
towardsdatascience.com](/the-ultimate-guide-using-game-theory-to-interpret-machine-learning-c384cbb6929)
在数据科学中,我们经常训练机器学习模型来预测目标,例如预测客户是否会偿还贷款,我们有这样做的最佳实践,例如平衡模型的复杂性,以便它不会非常简单,不会理解问题的复杂性,也不会比必要的过度拟合更复杂。但事实上,我们想要的是它能够很好地概括,为此,它理解因果效应是理想的,即变量如何影响目标以及它们如何相互关联。
正如我们所说,机器学习模型的一个主要优势是,它不一定要捕捉真实的影响来改善其预测,任何副作用或这些真实事件的代理也是可行的,这使得创建这种模型的人的生活更加容易。但是并不是一切都是完美的,
这个设施也开始产生一些问题。让我们来看例子:
辛普森悖论是,通过测量两个变量之间的相关性,他们显示了错误的值,这可以通过控制导致混淆的第三个变量来纠正。
当数据被分组时出现的一种趋势或结果,当数据被组合时,这种趋势或结果会反转或消失。爱德华·休·辛普森
辛普森悖论最初并不完全是效应信号的反转,而仅仅是在控制了使效应变得“混乱”的变量时,信号大小的变化,但是这在分析中变得如此正常,以至于最近我们只考虑了一个真正的效应悖论。辛普森当效果相反时,然而它比你想象的更普遍。一种思考方式是,这不是一个真正的悖论,而是一个我们不知道所有片段,但需要组合起来才能相信其效果的难题。
一个著名的例子发生在 1973 学年初,当时比较了加州大学伯克利分校研究生院的性别比例,注意到 44%的男性和 35%的女性。彼得·比克尔和他的团队检查了这些数据,并注意到一些非常奇怪的事情,存在歧视(这是该学院非常担心的),但在 6 个部门中的 4 个部门有利于女性(而在另外 2 个部门无动于衷)。事实证明,女性倾向于申请的部门要小得多,这个在分析中被“忽略”的变量将歧视女性的结果逆转为歧视男性。
为了解决这个问题,我们需要了解我们的分析或预测是否没有经历辛普森悖论,也就是说,如果我们忘记了一些混淆变量,不幸的是,没有科学的方法来证明没有影响。跟踪,但有好的做法,我们会看到在未来的职位。
Each point is a department and the size of the circles is the size of the department. The “+” indicates small departments.
辛普森悖论一直在发生,但是如果对你正在处理的数据没有足够的直觉,就很难做出诊断。下面是一篇解释如何用线性回归控制影响的文章:
[## 统计建模——实用指南
第 2 部分—解释机器学习模型
towardsdatascience.com](/statistical-modeling-the-full-pragmatic-guide-7aeb56e38b36)
想象一下,我们有一个模型来预测未来 10 分钟内太阳升起的概率,我们在这个模型中添加了几个变量,如温度、一天中的小时和分钟、光度等。当我训练我的模型时,我注意到最重要的变量叫做“公鸡之歌”,当我使用这个变量时,模型会损失很多性能。在机器学习的标准中,我应该保留这个变量,因为公鸡打鸣后不久,太阳就会升起。
When we have a variable increasing predictive power and it comes before the target, we call it Granger Causality (the granger-cause variable). Do not confuse with actual Causality.
当我们用我们的因果透镜思考超越相关性时,我们知道公鸡不会导致日出,即使它有很高的相关性,因为这种影响不是因果的,使用它有风险。可能有一天公鸡会更早歌唱,而太阳显然不会更早升起,或者可能公鸡醒来时身体不适,没有歌唱,但太阳仍会升起(我希望如此),在所有这些情况下,该模型都会出现悲惨的错误,因为它依赖于非因果相关性。
在这种情况下,我们的模型将有一个短的保质期,因为使用的变量不是因果变量,所以影响是不真实的。或者在计量经济学的措辞中,我们说这个模型没有外部有效性,因为如果我们把它用在某个地方,而不是一个凸起,它将不起作用。
如何解决?我们可以删除“公鸡打鸣”变量,我们的模型似乎会变得更糟(指标会减少),但在中期内它会更稳定(外部有效性更普遍),因为它不依赖于一个易变变量(方差高)。
当然这是一个不切实际的例子,但这在真实的机器学习项目中经常发生。想想你的变量是否有失效日期。如果它们是因果关系,它们会持续更长时间。
生态谬误比我们的辛普森悖论更为普遍(就像我们的辛普森悖论是生态谬误的一个特例)。当分析* 总体 *变量并对分类数据做出假设时,即着眼于宏观并推断微观时,问题就出现了。让我们用在美国找到一个富人的可能性来说明这个例子。我们首先考虑的是每个州的平均财富,总结如下:
我想说在富裕的州遇到富裕的人的机会比在贫穷的州高,这似乎有道理,但这就是错误所在!这种假设不一定是正确的,因为当分析汇总数据(按州)时,我们指的是平均值,当我们谈论找到一个富人的概率时,我们指的是中位数,这种概率只有在对称分布(或在这种特定情况下,不对称向右)中才会更高,这在这些情况下是非常罕见的。
IMAGE SOURCE: U.S. CENSUS BUREAU.
第二个相关的例子是著名的富人(个人)更倾向于投票给共和党候选人,当我们分析(按州)总数据时,这种效应是相反的。举例来说,2004 年,老布什在 15 个最贫穷的州赢得了选举,而约翰·克里在 11 个最富裕的州赢得了选举。然而,布什在最富有人群中的投票(> 20 万/年)是克里的两倍,这也是因为分布非常不对称,超出了受外部因素严重影响的平均值。
理解辛普森悖论的另一种方式(也是经济学家更喜欢的方式)是偏置被省略的变量。现在想象一下,我们的模型应该预测海滩上的冰淇淋销售,当我们查看解释变量之间的相关性时,最正相关的是椰子水的销售,我们在模型中添加了这一项,并对我们的预测感到满意。但是卖更多的椰子汁真的会增加冰淇淋的销量吗?
Y is the sale of ice cream, and Z is the sale of coconut water. We note that X (the temperature) affects both Y and Z, in our case reversing the sign of the effect of Z on Y from positive to negative.
仔细观察,这两种产品是替代品,这意味着它们对那些购买(更新)产品的人来说起着类似的作用,并且在某种程度上,增加一种产品的销售实际上会减少另一种产品的销售。游泳者的钱是有限的。这是因为,同样,我们有第三个变量导致冰淇淋销售变化和椰子水销售变化,当我们控制这个变量(可能是游泳者的数量,平均温度或如果是假日)时,椰子水的销售开始减少冰淇淋销售。在我们的模型中,即使有正的相关性,其偏相关(通过控制温度)也变成负的。
这是又一个例子,说明对数据有良好的直觉而不只是盲目地运行机器学习是多么重要。
“我不相信占星术,但我真的不会。我是双子座,所以我持怀疑态度。”
当我们试图用统计测试来否认(或证明)一个变量的影响时,我们基本上想知道添加那个变量是否会导致任何变化。一个典型的例子是征兆。当你根据人们的生肖来衡量他们的表现时(在本例中为一般情况),我们拒绝他们会有所作为的假设,因为在《自然》杂志发表的 500 强公司首席执行官中,我们接受他们会有所作为(在众多研究中)。在这里,我想讨论一些声称黄道十二宫会影响你的个性和潜力的实验。
这里的困难不是有一个反事实,而是究竟什么是反事实?对我们来说,一个反事实将是一个在所有方面都完全相同的个体,它们之间只有一个变量不同,在我们的情况下,就是符号。当我们做化学或物理实验时,创造反事实相当容易,因为无生命的物体可以重复,就像两个完全相同的化学实验,我们将一种试剂与另一种试剂不同,差异归因于试剂。在社会科学或经济学中,这要困难得多,想象一下国家的反事实?硬右?所以我们期待像朝鲜一分为二这样的“自然”事件。但是我们如何为标志创造一个反事实呢?我们需要一个有或没有标志的人,不可能。在这种情况下,我们需要求助于统计建模作为综合控制或倾向分数匹配。
People are very good at thinking counterfactuals. How, what if I had tried harder, would I have? Or what if Spock was mean? Note that the counterfactual is its identical “twin brother” in everything except the parsed variable.
我们的例子来自一项调查美国超级运动员标志的研究。当我们观察可以进入这个高性能组的球员的分布时,我们看到他们的迹象没有随机分布。显然有些星座比其他星座占优势。一种可能的解释是,明星真的改变了他们的性格和他们成为体育明星的机会。另一个可能的解释是,信号捕捉到了另一个变量的一些影响,但会是什么呢?嗯,每个标志包括出生时的时间间隔,与学年结束相关的标志比开始时有优势,因为孩子们在整个童年和青春期都是班上最大的,这在整个教育过程中给予了额外的信心,使他们最自信,这反过来又是体育和商业中高表现的超级重要的属性。知道了这些,一个提示,变得更自信!
回到反事实,我们怎么会有一个符号不同的孪生“兄弟”呢?这里的想法是比较是为了寻找一个反事实,可能是第二个非常相似的国家,但学年在 6 个月后开始,或者甚至是寻找某年改变了规则的某个州。当我们这样做时,效果是相反的!抛弃标志会产生影响的假设。
这个例子非常重要,因为它可以推广到许多其他机器学习应用程序。当训练我们的模型时,我们不注意小字体,例如,数据必须以无偏见的方式产生,以用于训练模型。我不止一次看到定价案例(和其他干预案例)使用历史价格/折扣来训练一个预测未来价格/折扣的模型。但是我们要的不是预测什么价格,而是最优价格!而且谁说那些历史培训价格是最优价格?例如,如果在公司政策中,当实行折扣时,它一直是节俭的,所有算法将做的是重复这种节俭,这可能与理想的价格/折扣相差很远。
这个案例说明了对因果建模至关重要的干预效应。如果你的机器学习算法预测并且不影响现实(明天怎么下雨?),干预不是一个问题,但如果你的算法为企业产生输入,以产生一个行动,如改变客户将有权获得的折扣,以最大化他们的购买概率,你必须在训练你的模型时考虑客户的反应。
围绕这个问题有许多例子和方法,从训练一个价格随机定价的模型,以产生一个良好的实验设计,从而产生一个可靠的训练数据集(如 Fischer 在 1936 年提出的),到更现代的方法,如 multi armed bandit,它能够在优化业务指标的同时进行 A/ B 测试(C/D/等)。
我们的下一篇文章将进一步探讨这个话题。
以下是最合法也最难解决的问题。选择偏差与设计好的实验有关,因为一旦你收集了有偏差的数据,就很难纠正,甚至很难知道它的存在。
我们来看第一个例子。想象一下,我们想要衡量数据科学培训在多大程度上提高了公司员工的生产力。我们的第一个方法是给每家公司发一封电子邮件,告诉他们有 50 个职位空缺,第一个注册的人将参加课程。我们进行培训,并在培训前后测量生产率。我们能说这种观察到的差异是训练的错吗?不幸的是,没有,因为第一批报名参加这个项目的人可能不是随机的,他们可能是最专心、最快、甚至更难参加额外课程的人,当测量实验结果时,我们不得不随机选择他们的参与者。
Bias resulting from Systematic error in ascertainment or participation of study subjects. People having different probabilities of being included in the study sample based on exposure and outcome. Diagram from: https://thegradient.pub/ai-bias/
第二个例子是沃尔德博士在第二次世界大战中提供帮助的经典案例。这个故事是关于我们应该在哪里加强飞机装甲。如果我们加固所有的东西,它会很重,它的自主性会被破坏,如果它不保护任何东西,它会非常脆弱。
Statistics produced from aircraft returning from damaged fighting. Each red dot represents a bullet.
上图是从战争中返回的飞机弹孔位置的汇编。当时显而易见的策略是在拍摄最多的地方加强拍摄。当他到达沃尔德的办公室进行进一步分析时,他提出了相反的建议。不是加强机翼,而是加强引擎和机身。但是如果飞机上没有洞,他为什么要这么做呢??
Statistics without Selection bias. Here is an example with white balls (true values of the returning planes) plus the red balls that indicate shots that were not counted as the planes did not return from combat. Wald was able to see this lack of data and saved many lives.
选择偏差,或者说生存偏差。沃尔德说,这些地方没有洞,正是因为这些区域的飞机已经损坏。他们只是还没有返回到统计数据中,而那些被损坏并返回的区域是那些不需要太多增援的地方,因为他们可能会被击中,但仍然可以返回基地。简单而伟大,他们巩固了正确的位置,统计数据帮助拯救了成千上万的生命。
这一系列的例子显然不是为了在这个问题上做到详尽无遗,而是试图开始挑衅,即在没有很好地理解数据和一些因果建模技术的情况下训练机器学习模型甚至会产生糟糕的结果。即使在简单的建模中,
即使度量在短期内是好的。
此外,这些例子表明,对业务数据的直觉和理解与机器学习技术本身的应用一样重要(甚至更重要)。
该文本是一个快速介绍,现在,评论摘录,你有疑问,使更完整和详细的职位。
在接下来的文章中,我们将更深入地回顾这些例子,并探索其中的一些技术,通过 python 中的例子和代码来尝试解决它们(或至少减轻它们)。等待下一个帖子:
因果计算和因果图(Judea Perl);强化学习和因果关系;倾向得分匹配和工具变量;具有不连续性(RDD)和分位数的回归;相关性、因果性和反事实;结构方程模型(SEM);
为数据科学家推荐书籍、课程和电影。深度潜入混乱矩阵和 AUC数据科学的范围是什么?用博弈论解释机器学习模型
原文:https://towardsdatascience.com/the-15-most-important-ai-companies-in-the-world-79567c594a11?source=collection_archive---------3-----------------------
人工智能正在向前发展,无论我们喜欢与否,机器学习都将在我们的技术未来中发挥重要作用。世界上最大和最好的公司已经知道这一点,他们正在大力投资人工智能。
以下是我列出的 15 家最有能力和资源塑造我们互联未来的人工智能公司。这些是人工智能领域的大玩家。
贸易巨头亚马逊投资了人工智能面向消费者的一面,以及公司及其流程的应用程序。该公司的 AI 语言助手 Alexa 集成到其 echo speaker 系列中,在全球范围内享有盛誉。然而,亚马逊网络服务(AWS),一套面向企业的机器学习程序和预先训练的人工智能服务,还没有做这么多。AWS 目前拥有超过 10,000 家客户,包括西门子、网飞、Tinder、NFL 和 NASA。
Photo by Piotr Cichosz on Unsplash
苹果近年来一直忙于收购人工智能初创公司,并将人工智能视为其未来的重要组成部分。2018 年 12 月,在谷歌挖走苏格兰计算机科学家后,该公司正式任命约翰·詹南德雷亚(John Giannandrea)为人工智能和机器学习部门的负责人。他将监督 Siri 和该公司新的 Create ML 工具等产品的开发,MacOS 和 iOS 开发者可以使用这些工具为他们的应用程序创建高效而直观的培训课程。
班卓是在 2013 年波士顿马拉松爆炸惨案后成立的。这家初创公司使用人工智能搜索社交媒体,以识别实时事件和情况,这些事件和情况对应急服务和其他组织更快、更智能地运作可能至关重要。该公司迄今已筹集超过 1.2 亿美元的资金,包括日本电信巨头软银(SoftBank)等投资者。
榜单上的第一家中国公司,DJI,虽然仍是一家正式的初创公司,但估值已经达到 150 亿美元。该公司在全球无人机市场的市场份额超过 70%,并越来越多地进入人工智能市场。最新的无人机使用人工智能和图像识别来躲避物体。很快,自动驾驶汽车和机器人技术就可以进入市场了。DJI 最近与微软就无人机到电脑的流媒体项目达成了合作。
Photo by Mitch Nielsen on Unsplash
人工智能在未来将会非常强大。因此,脸书投资人工智能并不奇怪。脸书的人工智能研究小组 FAIR 表示,它致力于推进机器智能领域,开发新技术,为人们提供更好的交流方式。马克·扎克伯格(Mark Zuckerberg)和其他人一起与两名人工智能爱丽丝(Alice)和鲍勃(Bob)合作建立了一个谈判平台,但在这对夫妇开始用他们的秘密语言交流后,他们结束了这个项目。
或许这个榜单上最大最重要的 AI 公司也是最明显的。谷歌收购了人工智能初创企业,就好像很快就不会再有了。在过去的四年里,山景城已经创建了不下十二家新的人工智能公司。最重要的收购是对棋盘游戏围棋冠军 DeepMind 的 4 亿美元交易。
还有谷歌的机器系统 TensorFlow,现在已经对所有人免费,还有正在进行的 Tensor AI 芯片项目,用于设备上的机器学习。谷歌首席执行官桑德尔·皮帅已经提到,从长远来看,我们正在“从计算机行业的‘移动优先’向‘人工智能优先’的世界发展”,这已经说明了你需要知道的一切,以了解谷歌对未来的看法。
当华为首席执行官 Richard Yu 在柏林举行的 2018 年 IFA 上推出麒麟 980 时,竞争非常激烈。华为芯片制造商海思对全球首款 AI 智能手机芯片第二代进行了显著增强。麒麟 980 可以高速进行人脸识别、物体识别、图像分割和智能翻译等操作。这种芯片引发了大量人工智能智能芯片,如果一家公司打算在未来几年进一步开发这项技术,它很可能会这样做。
自 20 世纪 50 年代以来,跨国技术公司 IBM 一直活跃在人工智能领域。该公司参与了人工智能的诞生,今天仍然坚定地致力于此。通过沃森,IBM 创建了一个机器学习平台,可以将人工智能集成到业务流程中,例如为客户支持建立一个聊天机器人。客户包括四大审计机构毕马威和巴西最大的银行之一 Bradesco。
在人工智能公司方面,英特尔也一直在疯狂收购,收购了 Nervana 和 Movidius 以及一些较小的人工智能初创公司。Nervana 使公司能够开发特定的深度学习软件,而 Movidius 的成立是为了将人工智能应用程序带到性能不足的设备上。英特尔还与微软合作,为必应搜索引擎提供人工智能加速。
像亚马逊一样,微软在消费者和商业两方面都参与了人工智能。微软的人工智能数字助手 Cortana 与 Alexa、Siri 和谷歌助手直接竞争。人工智能功能是该公司 Azure 云服务的一大部分,该服务为该行业的一些最大的名字提供聊天机器人和机器学习服务。微软也仅在 2018 年就收购了 5 家 AI 公司。
英伟达是历史最悠久的人工智能公司之一,今天仍然发挥着重要作用。英伟达的图形处理器是机器学习和人工智能的终极目标。这家总部位于特拉华州的公司活跃在医疗保健、高等教育、零售和机器人领域。凭借深度学习和 GPU 开发,英伟达致力于将人工智能集成到车辆、制造和自动驾驶的每个层面。
这个非营利研究小组围绕着为全人类的利益开发人工智能,并设法保持其开源思维,尽管通过投资和收购筹集了大量资金。人工智能领域的一些大腕目前在 OpenAI 工作,包括深度学习专家 Ilya Sutskever。赞助商包括微软、亚马逊和埃隆·马斯克。
像海思及其麒麟 980 一样,高通是另一家致力于人工智能的芯片制造商。人工智能在骁龙 855 移动平台中起着至关重要的作用。该芯片使用信号处理器实现人工智能语音、音频和图像功能。高通 Snapdragons 为市场上一些最受欢迎的智能手机提供动力。如果你对智能手机中的人工智能感兴趣,你应该关注高通。
你听说过中国政府使用人脸识别来追踪公民,对吗?嗯,SenseTime 是这项技术目前的供应商。他的研究团队正在香港大学研究深度学习,众所周知,他的图像识别技术远远领先于谷歌和脸书。自动驾驶目前是 SenseTime 的第一要务。
像硅谷的其他大玩家一样,Twitter 完全是为了进入人工智能,尤其是用钱。四家人工智能公司已经被收购,其中 Magic Pony 以 1.5 亿美元的价格被收购。这家澳大利亚公司正在开发机器学习方法,用于在网络和移动设备上进行视觉处理,Twitter 可能会在未来通过人工智能改进其系统,以便在用户的时间表中推荐特定的推文。
Photo by Con Karampelas on Unsplash
有我忘记的公司吗?请在下面的评论中告诉我。
原文:https://towardsdatascience.com/the-2018-kansas-city-chiefs-and-an-explosiveness-metric-in-football-c3b3fd447d73?source=collection_archive---------16-----------------------
Photo by Timothé Lejeune on Unsplash
如果你看过 2018 年的帕特·马霍斯秀,你就会知道堪萨斯城酋长队的进攻非常具有爆发力。作为一个数据迷,我想知道我们是否能提出一个衡量爆发力的单一数字。不幸的是,这并不简单。
一个简单的解决方法是计算超过 10 码的比赛。如果我们这样做,酋长队在新英格兰和公羊队之后排名第三。然而,在那些超过 10 码的比赛中,酋长队仍然有更高的总码数。酋长队也在 15 码以上的比赛和 20 码以上的比赛中领先。事实上,他们在 10 码以上的比赛中有 17 次达阵,而新英格兰和公羊队分别只有 15 次和 10 次达阵。所以我们知道酋长是爆炸性的,但我们如何量化呢?他们比公羊队和新英格兰队更强吗?
注:我的数据来自NFL scraper包。我只使用红区外的策略,赢的概率在 10%-90%之间。
球场既是衡量足球产量的一个好方法,也是一个糟糕的方法热火比赛预测。在一年的样本量中,我们可以依靠总传球码数和总跑动码数来准确地给出一个赛季中最佳四分卫和最佳跑卫。然而,足球赛季本质上是小样本的。每年都会有一些奇怪的统计数据在赛季中出现。足球分析家经常引用过去四场比赛、本月等的统计数据。这些数据本身就是戏剧性的和不可持续的。
总码数的一个问题是,它被大戏严重扭曲。阿德里安·彼得森,尤其是在他的全盛时期,展示了在一次跑步中落后多少码是相对无意义的。他已经 33 岁了,仍然对次要问题不屑一顾:
这一轮从哪里开始并不重要,它将是一个 TD。因为是从他自己的 10 码线开始,阿德里安得到了 90 码的成绩。如果同样的跑发生在对手 45 码处,他也只能得到同样出色的跑的一半码数。事实证明,酋长队在 2018 年有很多这样的比赛。
另一种表述方式是,有些码比其他码更难获得。一旦 AP 跑了 10 码,全速进入第二场,他再跑 3 码的机会就很高。然而,如果是 3 码和 3 码,他在 8 人对抗的情况下跑完全程 3 码的机会相对较低。话说得够多了,下面是一些实证的可视化。让我们从绘制跑垒得分的分布开始。
Note: I eliminated extreme win probabilities and redzone plays from the dataset
好吧,我们可以从中提取大量重要信息。如果你仔细观察的话,大约 90%的跑位在跑了 10 码之前就停止了。有一种更好的方式来展示这一点。累积分布函数将从左到右累加所有的概率。换句话说,我们将知道 0 码或更少,3 码或更少的比赛的百分比,等等。为了好玩,我用了艾德里安·彼得森全盛时期(从 2009–2015 年数据集开始)。这是他获得的码数的累积分布函数。
Blue bars mark the area from 0–3 yards gained. Green bars mark from 10–13 yards.
当你沿着 x 轴向右走,AP 被处理的概率增加。如果每一码都一样,那么 AP 在 0-3 码和 10-13 码之间被拦截的机会是一样的。在右边的图表中,在这两个范围内都有大约 6%的可能性。相反,我们看到 CDF 在左边。在图中,当我们到达 x=0 的混战线时,已经是 40%了!这意味着 40%的 AP 跑垒距离小于零码。当我们到达 3 码的时候,它一直跳到 65%。因此,在大约 25%的 AP 跑垒中(25%是因为我从 65%中减去 40%),他被铲球 0-3 码!或者,当他在第二跑道超速行驶时,他只有 3%的路程是在 10 到 13 码之间。换句话说,如果他已经在同一场比赛中获得了 10 码,那么他就更容易获得 3 码。所有的码不是平等创造的。
嗯,如果一个球员很有爆发力,我们应该会看到很多 20 码跑、45 码跑和 80 码跑。有时候唯一能阻止球员的就是端线。用足球男孩/女孩的话来说,他们需要能够“达到第二级水平”并“在开阔的领域表现良好”。从统计学的角度来说,这个分布应该有一个胖胖的右尾。
看看 2018 的酋长们有没有这条肥右尾巴。我将在下面绘制仅完成的分布图。尽管我很想包括残缺和麻袋,但这使分布变得复杂,从而也使数学变得复杂。
啊哈!那正是我们要找的尾巴。其他球队有一个更尖锐的高峰,因为他们完成了更多的 0-15 码传球。幸运的是,比我聪明的统计学家们想出了一种方法来衡量“峰值的锐度”。这就是峰度。但是峰度不是一切。酋长的分布也更加向右倾斜。当你把足够右偏斜和高峰度结合起来时,你会在分布的右尾下得到很多区域。换句话说,就是一堆 20 码以上的球。你可能还会注意到,高能量进攻的平均分布在 NFL 其他球队的右边。这只是每完成码数(YPC)。国家橄榄球联盟和爱国者队的场均得分约为 12 YPC,而酋长队和公羊队的场均得分分别为 14.5 和 13.7。让我们把它们放在一起(我使用了逆峰度,因为峰度在这个上下文中意味着更少的爆发力)。我归一化了均值、偏斜度和反峰度,得出了下面这张难看的图。我甚至有点不好意思把这张图包括进来,但它是一个更广泛观点的一部分:
这个图表需要一秒钟来解释,这使得它不能令人满意地比较这些球队的爆发力。对于一个强有力的进攻,我们需要一个高的每完成码数(蓝色条),一个高的反峰度(橙色条),和一个高的右斜(绿色条)。没有一个组合在这三个方面都是最好的,尽管酋长队在这三个方面的总平衡是最好的。
如果你想模拟一个游戏,均值、偏斜度和峰度都很好。人们甚至可以分离出触地得分的打法,以便更加准确。然而,我试图提出一个爆发力的单一指标。据我所知,没有数学上可靠的方法来线性组合峰度和偏斜度。
相反,我们将借用经济学家的一个术语。我们将使用基尼系数。基尼系数衡量分配中的不平等。经济学家最常用它来衡量收入不平等。如果一个国家的每个人收入完全相同,基尼系数等于 0。如果国家的所有财富都被一个人占有,那么基尼系数就是 1。
我们可以用码数不平等来代替收入不平等。换句话说,一个球队的码数有百分之几属于大戏?如果一个队的所有比赛都用相同的码数,基尼系数将为零。然而,如果一个人走了 80 码,而其他人走了 0 码,那就是 1 码。在酋长队对公羊队对帕特队的例子中,我们得到 0.436,0.380 和 0.407。酋长有最高的!
基尼系数与获得的平均码数无关。因此,我们还需要一个术语来描述每场比赛的码数,或者在我一直使用的例子中,每场比赛的码数。下面是我的数据集中团队的图表。不幸的是,“草皮上最棒的表演不在数据集中。
所以理论上,最具爆发力的传球进攻会偏向右上角。2013 年的老鹰队是唯一一支看起来比 2018 年的酋长队更具爆发力的球队(场均码数相对相近)。这一年尼克·福尔斯投出了 27 个罚球和 2 次拦截,所以这有点道理。让我们绘制完工量的分布图,以确保基尼系数发挥作用。首先,我将匹配 2018 年的酋长和 2016 年的美洲虎。他们每场比赛的码数差不多,但是酋长队应该有更多的大手笔。2016 年的海豚队和 2016 年的海盗队应该也是如此。那一年海豚队的基尼系数非常高,而海盗队却没有。
Longer, fatter right tails = higher Gini.
好像起作用了!所以上面的两个比较涉及到平均每场完成码数差不多但进攻非常不同的球队。2016 年的海豚队和 2018 年的酋长队比每次完成类似码数的对手更具爆发力。2016 年的海盗队和美洲虎队仍然是很好的传球进攻,擅长“移动链条”,但他们不太可能打开一个大的游戏。
总之,我们找到了一种通过进攻型打法的基尼系数来衡量爆发力的方法。我认为最好的使用方法是结合每次完成码数(YPC)。或者甚至是跑动进攻,就每次跑动的码数而言。那些平均拥有很多码数,并且非常倾向于大手笔的球队是最值得关注的球队。也许在未来,我们可以分解球员名单可能如何影响这种爆发力ᾑ;。我们也可以打开潘多拉的盒子,看看防御措施。如果你真的用这个工作,请发推特给我让我看看。如果你有兴趣的话,这次我想起来了链接我的代码!
最后,我想提一下,我不是第一个尝试测量爆发力的人。大学橄榄球分析界的传奇人物比尔·康纳利对爆发力有自己的衡量标准。他用它为做了很多伟大的工作,我尽我所能复制它。当我比较基尼和 IsoPPP 时,我有一个非常有趣的结果。IsoPPP 和每完井码数高度相关。然而,*基尼系数与 IsoPPP 相关,但与每完工码数无关。*同样,需要做更多的工作。敬请期待!
The correlation matrix of Yards Per Completion, Gini Coefficient, and my attempt to calculate IsoPPP.
原文:https://towardsdatascience.com/the-2020-candidates-on-spotify-7613c32701f2?source=collection_archive---------31-----------------------
Album art from 2020 candidates’ playlists.
利佐是民主党可以同意的一件事。三位 2020 年的候选人已经将 Spotify 整合到他们的竞选活动中:参议员卡玛拉·哈里斯、参议员柯尔斯顿·吉利布兰德和市长皮特·布蒂吉格。在他们的播放列表中,她出现的次数比任何其他艺人都多,只有她和阿撒·富兰克林出现在这三个列表中。
虽然很容易在每个播放列表中注意到 Lizzo,但我们可以使用 Spotify 的数据集来揭示不太明显的趋势。Spotify 公开了一首歌曲的受欢迎程度、风格信息和其他元数据——这些数据不仅有助于了解每位候选人的目标受众,还有助于了解候选人希望观众如何看待他。
该分析将考虑三个播放列表:来自 Buttigieg 竞选活动的“ Buttijams ”、来自 Gillibrand 竞选活动的“ Gillibrand 2020 ”以及来自 Harris 竞选活动的“卡玛拉的夏季播放列表”,如下面的时间线所示。(完整的播放列表也嵌入在本文的底部。)还有其他存在的:拜登在 2016 年与奥巴马一起发布了播放列表,贝托·奥洛克在参议院竞选期间发布了一个非常德克萨斯的播放列表。2017 年,哈里斯在她的官方参议员账户下发布了一个播放列表来庆祝非裔美国人音乐欣赏月,而 Buttigieg 最受欢迎的播放列表是“ 50 年,50 首颂歌:骄傲 2019 ”然而,考虑到这一点,更直接的方法是专注于明确用于 2020 年总统竞选的播放列表。所有数据都是在 8 月 1 日收集的。
Timeline and data from the three Spotify playlists.
虽然“听的次数”是衡量一首歌受欢迎程度的更直接的方法,但 Spotify 创造了一个从 0 到 100 的“受欢迎程度”指数,衡量播放次数和这些播放的最近时间。以下是每位候选人的播放列表中最受欢迎和最不受欢迎的歌曲。
LINKS — Buttigieg: American Pie, High Hopes. Gillibrand: Try a Little Tenderness, Sunflower. Harris: One Nation Under a Groove, Boy with Luv.
然而,看一下影响流行的两个因素的具体分类会更清楚:听众和发行日期。这些分布显示在下面的箱线图中。
Distribution of release year and number of listens for each candidate’s playlist. Outliers are dropped.
这里最引人注目的趋势是吉利布兰德几乎把所有的音乐都集中在了 21 世纪。这也体现在“倾听”的平均次数明显高于其他两位候选人。这可能表明她专注于更年轻的人群,或者只是选择“更安全”的歌曲(吉利布兰德有 1 首明确的歌曲,相比之下,Buttigieg 有 3 首,哈里斯有 8 首)。哈里斯似乎拥有分布最均匀的播放列表;她最早的歌曲是 1964 年的,但她的播放列表中至少有四分之一是 2019 年发布的歌曲。
虽然 Spotify 没有明确定义曲目的流派,但它确实将流派与艺术家联系起来。通过结合这两个数据源,我们可以大致估计出候选人决定将哪种风格与他们的图像联系起来。
Genre percentage distribution by candidate.
也许最显著的区别是某些候选人的播放列表中没有的类型。哈里斯的播放列表中没有乡村音乐,Buttigieg 也没有说唱音乐。Buttigieg 最受欢迎的音乐类型是摇滚,占 40%,流行音乐占 31%,灵魂乐占 30%。
下图有助于显示候选人之间的艺术家重叠。艺术家的受欢迎程度在括号里。如前所述,利佐和阿撒·富兰克林是仅有的两位出现在所有三个播放列表中的艺术家。
Artist overlap between candidate’s playlists. Popularity in parentheses.
Buttigieg 和 Harris 分享了最不受欢迎的艺术家麦克法登& Whitehead 和 Sharen Jones & The Dap-Kings,而 Harris 和 Gillibrand 分享了最受欢迎的艺术家:碧昂斯、Arianna Grande 和说唱歌手 Chance。
Spotify 还使用索引来帮助他们的算法进行推荐。然而,在这种分析中,以一种比体裁更详细的方式来区分三个候选人之间的文体差异是有帮助的。
Spotify 使用的三个有趣的功能是“能量”、“可跳舞性”和“效价”功能。按照 Spotify 的分类,一首充满活力的歌曲让人感觉又快又吵。正如人们所料,具有“可跳舞性”的轨道适合于跳舞。价高的轨道是积极的,价低的轨道是沮丧的或愤怒的。
Buttigieg 的竞选团队发布了三位候选人最有活力和“最快乐”的歌曲。吉利布兰德竞选团队贴出了该乐队最悲伤的歌曲,奥蒂斯·瑞丁的《尝试一点温柔》和艾丽西亚·凯斯的《T2》和《女超人》。哈里斯的播放列表最适合跳舞。
有更多的方式来探索 2020 年候选人如何使用音乐来传达他们的信息。如果你对自己进行分析感兴趣,这里有一个链接指向我收集的数据。Spotify 的数据集提供了另一种新颖的方式来分析竞选活动如何试图在更个人化的基础上与选民建立联系。
疑问?失误?联系我,查看更多项目在 我的网站 。
注意:嵌入的播放列表可能会更新,而上面的统计数据不会。例如,哈里斯最近从她的播放列表中删除了“One Nation Under Groove”,尽管该歌曲在统计中使用,但不会出现在下面的嵌入式播放列表中。
原文:https://towardsdatascience.com/the-3-best-optimization-methods-in-neural-networks-40879c887873?source=collection_archive---------3-----------------------
Photo by rawpixel on Unsplash
深度学习是一个迭代的过程。有如此多的参数要调整或方法要尝试,为了快速完成迭代周期,能够快速训练模型是很重要的。这是提高机器学习团队速度和效率的关键。
因此,优化算法非常重要,例如随机梯度下降、最小批量梯度下降、动量梯度下降和 Adam 优化器。
这些方法让我们的神经网络学习成为可能。但是,就速度而言,有些方法比其他方法执行得更好。
在这里,您将了解随机梯度下降的最佳替代方案,我们将实现每种方法,看看神经网络使用每种方法可以多快地学习。
对于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
Gradient…Gradient descent… Get it?
传统的梯度下降需要在对参数进行第一次更新之前处理所有的训练样本。从现在起,更新参数将被称为采取步骤。
现在,我们知道深度学习在处理大量数据时效果最好。因此,梯度下降需要在数百万个训练点上进行训练,然后才能迈出一步。这显然是低效的。
相反,考虑将测试集分解成更小的集合。每一小组被称为小批量。假设每个小批量有 64 个训练点。然后,我们可以一次在一个小批量上训练算法,并在每个小批量的训练完成后采取一个步骤!
因此得名:小批量梯度下降。
在之前的中,我们已经看到了成本图,在每次迭代后成本都平稳下降,如下所示。
Example of a cost plot using gradient descent
在使用最小批量梯度下降的情况下,曲线将振荡更多,总体呈下降趋势。当我们编写这个方法时,我们将看到一个例子。这种波动是有意义的,因为一组新的数据被用来优化成本函数,这意味着在回落之前,成本函数有时可能会上升。
让我们考虑两个极端。一方面,你可以将你的小批量设置为所有训练集的大小。这将简单地导致传统的梯度下降方法(也称为批量梯度下降)。
另一方面,您可以将最小批量设置为 1。这意味着每一步仅在 1 个数据点上训练后进行。这叫做随机梯度下降。然而,这种方法不是很好,因为它经常在错误的方向上采取步骤,并且它不会收敛到全局最小值;相反,它会在全局最小值附近振荡。
因此,你的小批量应该在这两个极端之间。一般来说,可以遵循以下准则:
如果数据集很小(少于 2000 个样本),则使用批量梯度下降对于较大的数据集,典型的小批量大小为 64、128、256 或 512。当然,你的小批量必须适合你的 CPU/GPU 内存
同样,小批量大小可以反复选择。你有时需要测试不同的尺寸,看看哪种训练速度最快。
具有动量的梯度下降包括对计算的梯度应用指数平滑。这将加速训练,因为算法将更少地向最小值振荡,并且它将向最小值采取更多的步骤。
如果你不知道指数平滑,你可能想读读这篇文章。
通常,使用简单的指数平滑,这意味着还有两个超参数需要调整:学习率α和平滑参数β。
通常,这种方法几乎总是比传统的梯度下降效果更好,并且它可以与小批量梯度下降相结合。
Adam 代表: ada 感受性mmoment 估计。简而言之,这种方法结合了动量和 RMSprop(均方根 prop)。
RMSprop 平滑了梯度,就像动量一样,但它使用了一种不同的方法,这种方法在数学上可以得到最好的解释。
首先,梯度计算如下:
Gradient in RMSprop
然后,权重和偏差矩阵更新如下:
Weight and bias update in RMSprop
注意β2是一个新的超参数(不要与动量的β相混淆)。另外,ε是一个非常小的值,以防止被 0 除。
因此,结合动量和 RMSprop,Adam 引入了四个超参数:
学习率αβ来自动量(通常为 0.9)来自 RMSprop 的 beta2 (通常为 0.999)ε(通常为 1e-8)
如上所述,您通常不需要调整 beta 、 beta2 和 epsilon ,因为上面列出的值通常会工作得很好。为了加速训练,只需要调整学习速率。
现在您已经了解了每种优化方法,让我们用 Python 实现它们,并看看它们之间的比较。
我们将在样本数据集上运行每种方法,看看神经网络将如何执行。为了测试训练速度,我们将保持历元数恒定为 10 000。
当然,完整的代码可以在笔记本中找到。
让我们从编码随机梯度下降法开始:
这是相当直接的,因为我们使用单个数据点来进行梯度下降。
小批量梯度下降有点难以实现,因为训练规模可能无法被小批量规模整除。因此,我们需要处理最后一批,以适应这种情况:
要实现动量,我们首先需要初始化速度:
然后,我们可以更新我们的参数:
现在,由于 Adam 结合了 momentum 和 RMSprop,我们需要初始化两个参数:
然后,我们可以这样更新参数:
现在,我们将用不同的优化方法训练一个神经网络,看看它能学习多快。
让我们将我们的模型定义为:
然后,在对 10 000 个时期进行小批量梯度下降训练后,我们得到:
Results for mini-batch gradient descent
正如你所看到的,我们在 10 000 个时期后只达到了 80%的测试准确度,并且判定边界不是很好。
现在,经过动力训练后,我们得到:
Results for momentum
有趣的是,势头并没有真正帮助。
现在,我们使用亚当,我们得到:
Results with Adam optimizer
太神奇了!使用 Adam,我们获得了 10 000 个历元的更高精度。
请注意,更好的方法就是更快的方法。给定更多的时期,其他方法可以给出更好的准确度分数。不过,这个练习的目的是评估每种方法的速度,亚当显然是赢家。**
就是这样!您学习了神经网络的不同优化方法,实现了这些方法,并且发现 Adam 的性能非常好。
通常,人工智能从业者使用小批量梯度下降或 Adam,因为它们在大多数时候表现良好。
幸运的是,深度学习框架内置了优化方法的功能。在下一篇文章中,我们将介绍 TensorFlow,看看编写更大、更复杂的神经网络有多容易。
下次见!






















