神经网络从何而来?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络从何而来?相关的知识,希望对你有一定的参考价值。
参考技术A 【嵌牛导读】神经网络从何而来?这里说的『从何而来』,并不仅仅是从技术上去介绍一个方法的创造或发展,而更想探讨方法背后所蕴含的思想基础与演变之路。【嵌牛鼻子】神经网络、深度学习
【嵌牛提问】神经网络的由来?
【嵌牛正文】深度学习与神经网络是近几年来计算机与人工智能领域最炙手可热的话题了。为了蹭这波热度,博主也打算分享一些自己的经验与思考。第一篇文章想探讨一个非常基础的问题:神经网络从何而来?这里说的『从何而来』,并不仅仅是从技术上去介绍一个方法的创造或发展,而更想探讨方法背后所蕴含的思想基础与演变之路。
首先,需要为『神经网络』正一下名。在人工智能领域,我们通常所说的神经网络(Neural Networks)全称是人工神经网络(Artificial Neural Network),与之对应的是我们用肉长成的生物神经网络(Biology Neural Network)。众所周知,人工神经网络受生物神经网络的启发而产生,并在几十年间不断进步演化。可要论人类对人工智能的探索历史,却远远长于这几十年。为了深刻了解神经网络出现的背景,我们有必要从更早的历史开始说起。
简单说,人工智能想做的事情就是去总结和提炼人类思考的过程,使之能够机械化、可重复。从各种神话、传说来看,我们的祖先在几千年前就对这件事儿充满了好奇与遐想。到两千多年前,一大批伟大的哲学家在希腊、中国和印度相继诞生,并将人类对这一问题的认识推向了新的高度。为避免本文成为枯燥的哲学史,这里不想举太多的例子。伟大的希腊哲学家亚里士多德在他的《前分析篇》中提出了著名的三段论(sollygism),类似于:
所有希腊人是人
所有人终有一死
因此所有希腊人终有一死
虽然这是我们现在已经无比熟悉的推理模式,但是要在2000年前从无到有系统总结出一系列这样的命题与推理模式,却着实不易。有了『三段论』这种的武器,人们对问题的认识与决策就能从感性真正走向理性,做到可以重复。此外,我们熟悉的欧式几何也是当时这种逻辑推理学派的代表。欧式几何以一系列的公理为基础,基于一套严密的逻辑推理体系,最终得到结论的证明,现在仍然是每个学生需要反复训练的思维体操。
随着时间的演进,认知哲学与逻辑学也在不断的发展。在17世纪时,以笛卡尔、莱布尼茨为代表的哲学家进一步提出通过数学的方式对逻辑推演进行标准化,这也是对人脑推理与思考的再次抽象,为后续以后基于数字电路的人工智能打下了基础。之后,数理逻辑进一步发展,而到了20世纪中期,数理逻辑又一次取得了巨大的突破,哥德尔不完备理论、图灵机模型等的相继提出,科学家们既认识到了数理逻辑的局限性,也看到了将推理机械化的无限可能性,一种新的计算方式呼之欲出。
在图灵机的思想指导下,第一台电子计算机很快被设计出来,为人工智能的真正实现提供了物质上的基础。其实回望人工智能历史上的历次重大飞跃,硬件技术的发展无不扮演者重要的作用。很多看似有效的算法都苦于没有足够强大的计算平台支持无疾而终,而计算能力的提升也可以促进科学家们们摆脱束缚,在算法的研究道路上天马行空。深度学习这些年的迅猛发展,很大程度就是得益于大规模集群和图形处理器等技术的成熟,使得用复杂模型快速处理大规模数据成为可能。
1956年达特茅斯会议上,斯坦福大学科学家约翰·麦卡锡(John McCarthy)正式提出了『人工智能』这一概念, 标志着一个学科的正式诞生,也标志着人工智能的发展开始进入了快车道。如果说逻辑符号操作是对人类思维的本质的抽象,那么利用电子计算机技术来模拟人类的符号推理计算也是一个自然而然的想法。在艾伦·纽威尔(Alan Newell)和赫伯特·西蒙(Herbert A.Simon)等大师的推动下,以逻辑推演为核心符号主义(symbolicism)流派很快占据了人工智能领域的重要地位。符号主义在很多领域取得了成功,比如在80年代风靡一时的专家系统,通过知识库和基于知识库的推理系统模拟专家进行决策,得到了广泛的应用。而本世纪初热炒的语义网络以及当下最流行的知识图谱,也可以看做这一流派的延续与发展。
符号主义最大的特点是知识的表示直观,推理的过程清晰,但是也存在着许多局限性。除去在计算能力方面的困扰,一个很大的问题就在于虽然我们可以通过逻辑推理解决一些复杂的问题,但是对一些看似简单的问题,比如人脸识别,却无能为力。当看到一张人脸的照片,我们可以毫不费力的识别出这个人是谁,可这个过程并不需要做什么复杂的推理,它在我们的大脑中瞬间完成,以至于我们对这个过程的细节却一无所知。看起来想通过挖掘一系列严密的推理规则解决这类问题是相对困难的,这也促使很多人去探索与人脑工作更加贴合的解决方案。实际上在符号主义出现的同时,人工智能的另一重要学派联结主义(Connectionism)也开始蓬勃发展,本文的『主角』神经网络终于可以登场了。
在文章的一开始就提到,我们现在所说的人工神经网络是受生物神经网络启发而设计出来的。在1890年,实验心理学先驱William James在他的巨著《心理学原理》中第一次详细论述人脑结构及功能。其中提到神经细胞受到刺激激活后可以把刺激传播到另一个神经细胞,并且神经细胞激活是细胞所有输入叠加的结果。这一后来得到验证的假说也成为了人工神经网络设计的生物学基础。基于这一假说,一系列模拟人脑神经计算的模型被相继提出,具有代表性的有Hebbian Learning Rule, Oja's Rule和MCP Neural Model等,他们与现在通用的神经网络模型已经非常相似,例如在Hebbian Learning模型中,已经可以支持神经元之间权重的自动学习。而在1958年,Rosenblatt将这些模型付诸于实施,利用电子设备构建了真正意义上的第一个神经网络模型:感知机(Perceptron)。Rosenblatt现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动,并带来了神经网络的第一次大繁荣。此后的几十年里,神经网络又经历了数次起起伏伏,既有春风得意一统天下的岁月,也有被打入冷宫无人问津的日子,当然,这些都是后话了。
本文更想讨论这样一个问题:神经网络产生的动机仅仅是对生物学中对神经机制的模仿吗?在神经网络产生的背后,还蕴含着一代代科学家怎么样的思想与情怀呢?事实上,在神经网络为代表的一类方法在人工智能中又被称为联结主义(Connectionism)。关于联结主义的历史,一般的文献介绍按照惯例会追溯到希腊时期哲学家们对关联性的定义与研究,例如我们的老朋友亚里士多德等等。然而当时哲学家研究的关联其实并不特指神经元之间的这种关联,比如前文提到的符号推理本身也是一种形式关联,在希腊哲学中并没有对这两者进行专门的区分。所以硬要把这些说成是连接主义的思想起源略微有一些牵强。
前文提到,在数理逻辑发展过程中,17世纪的欧陆理性主义起到了重要的作用。以笛卡尔、莱布尼茨等为代表的哲学家,主张在理性中存在着天赋观念,以此为原则并严格按照逻辑必然性进行推理就可以得到普遍必然的知识。与此同时,以洛克、休谟等哲学家为代表的英国经验主义,则强调人类的知识来自于对感知和经验归纳。这一定程度上是对绝对的真理的一种否定,人类的认识是存在主观的,随经验而变化的部分的。如果在这个思想的指导下,我们与其去寻找一套普世且完备的推理系统,不如去构造一套虽不完美但能够随着经验积累不断完善的学习系统。而休谟甚至提出了放弃揭示自然界的因果联系和必然规律,而是依据“习惯性联想”去描绘一连串的感觉印象。这其实和神经网络设计的初衷是非常类似的:重视经验的获得与归纳(通过样本进行学习),但对模型本身的严谨性与可解释行则没有那么关注,正如有时候我们愿意把神经网络模型看做是一个『黑箱』。
然而单单一个『黑箱』是不能成为经验的学习与整理的系统的,我们还需要去寻找构建『黑箱』的一种方法论。现代哲学发展到20世纪初期时,在维特根斯坦和罗素等哲学家的倡导下,产生了逻辑经验主义学派。依托当时逻辑学的迅猛发展,这一主义既强调经验的作用,也重视通过严密的逻辑推理来得到结论,而非简单的归纳。在数理逻辑领域颇有建树的罗素有一位大名鼎鼎的学生诺伯特·维纳,他创立的控制论与系统论、信息论一道,为信息科学的发展提供了坚实的理论基础。而神经网络模型的创立也深受这『三论』的影响。前文提到MCP神经元模型的两位创始人分别是罗素和维纳的学生。作为一个系统,神经网络接受外部的输入,得到输出,并根据环境进行反馈,对系统进行更新,直到达到稳定状态。这个过程,同样也是神经网络对环境信息传递的接受和重新编码的过程。如果如果把神经网络当做一个『黑盒』,那么我们首先关心该是这个黑盒的输入与输出,以及如何根据环境给黑盒一个合理的反馈,使之能够进行调整。而黑盒内部的结构,则更多的成为了形式的问题。我们借鉴生物神经网络构造这个黑盒,恰好是一个好的解决方案,但这未必是唯一的解决方案或者说与人类大脑的神经元结构存在必然的联系。比如在统计学习领域中最著名的支持向量机(Support Vector Machines),最终是作为一种特殊的神经网络而提出的。可当其羽翼丰满之后,则和神经网络逐渐脱离关系,开启了机器学习的另一个门派。不同的模型形式之间可以互相转化,但是重视经验(样本),强调反馈的思想却一直保留下来。
前面说了这些,到底神经网络从何而来呢?总结下来就是三个方面吧:1.对理性逻辑的追求,对样本实证的重视,为神经网络的诞生提供了思想的基础。2.生物学与神经科学的发展为神经网络形式的出现提供了启发。3.计算机硬件的发展与计算能力的提升使神经网络从理想变成了现实。而这三方面的发展也催生着神经网络的进一步发展与深度学习的成熟:更大规模的数据,更完善的优化算法使网络能够学习到更多更准确的信息;对人脑的认识的提升启发设计出层次更深,结构更高效的网络结构;硬件存储与计算能力提升使海量数据的高效训练成为可能。而未来神经网络给我们带来的更多惊喜,也很大可能源自于这三个方面,让我们不妨多一些期待吧。
“page” GET 参数从何而来?
【中文标题】“page” GET 参数从何而来?【英文标题】:Where does the "page" GET parameter come from? 【发布时间】:2018-09-09 19:47:34 【问题描述】:我是 Django 的初学者,对于 Django 引擎盖下的实际工作方式,我深思熟虑。我目前正在我的网络应用中实现分页。
看看这个 view.py 文件:
def post_list(request):
object_list = Post.published.all(); # '.published' is a manager.
paginator = Paginator(object_list, 3); # 3 posts in each page.
page = request.GET.get("page");
try:
posts = paginator.page(page);
except PageNotAnInteger:
posts = paginator.page(1);
except EmptyPage:
posts = paginator.page(paginator.num_pages);
return render(request, "post/list.html", "page": page, "posts": posts);
request.GET 不是一个字典对象,包含了 url 中所有的 GET 请求参数,以及用于返回值的 .get() 方法 对于参数内的给定键?当我启动应用程序时,由于我的 URL 目前只是 localhost:8000,为什么如果我传递密钥“页面”它会起作用?
我的 list.html 文件:
% extends "base.html" %
% block title %My Blog% endblock %
% block content %
<h1>My Blog</h1>
% for post in posts %
<h2><a href=" post.get_absolute_url "> post.title </a></h2> <!-- How does this absurl work?-->
<p class="date">Published post.publish by post.author </p> <!-- What does '.publish' print?-->
post.body|truncatewords:30|linebreaks
% endfor %
% include "pagination.html" with page=posts %
<!-- The statement above is the little menu: "Page 1 of 2. Next" -->
<!-- It also sends the 'page' variable as a GET parameter. -->
% endblock %
我的 pagination.html 文件:
<!-- This pagination template expects a paginator object. -->
<div class="pagination">
<span class="step-links">
% if page.has_previous %
<a href="?page= page.previous_page_number ">Previous</a>
% endif %
<span class="current">
Page page.number of page.paginator.num_pages . <!-- what!? -->
</span>
% if page.has_next %
<a href="?page= page.next_page_number ">Next</a>
% endif %
</span>
</div>
【问题讨论】:
这个问题对我来说没有意义。 “Django 怎么可能知道它不应该显示它应该显示的所有内容”这句话在逻辑上是不一致的。 已修复。非常感谢您的关注。 您正在捕获 PageNotAnInteger 异常,然后将 1 传递给 paginator.page 函数。然后你正在捕获一个 EmptyPage 异常,它看起来像正在使用默认/备用值。 为了更好地理解您的问题,您能否解释一下您到底对什么感到困惑?是不是不知道 Django 从哪里获取键值对来填充 request.GET 字典? 好的。我的问题是:如果“request.GET”是一个包含 GET 请求参数的字典,如果没有“page”参数,为什么我可以使用“page”作为“request.GET.get(“page”) 中的键在 GET 请求中? 【参考方案1】:当请求中没有参数时(直接点击http://localhost:8000
时),page
的值为None
。这是request.GET.get()
在找不到您要求的键时的默认行为 - 与普通 Python 字典相同(因为 GET 扩展了它)。
# page will be None
page = request.GET.get("page")
这意味着None
被传递给paginator.page()
:
try:
# Passing None here
posts = paginator.page(page)
except PageNotAnInteger:
这可能意味着(尽管我们看不到paginagor
的代码)引发了PageNotAnInteger
异常,因此将值1 传递给paginagor.page()
:
try:
posts = paginator.page(page) # Raises PageNotAnInteger because None passed
except PageNotAnInteger:
# Posts are retrieved for page 1
posts = paginator.page(1)
然后将来自上述调用的posts
和page
的值(仍然是None
)传递给模板。
return render(request, "post/list.html", "page": page, "posts": posts);
模板list.html
然后迭代帖子并显示它们。
相当令人困惑的是,当包含pagination.html
模板时,它将一个名为page
的上下文变量定义为posts
的当前值:
<!-- Pass the value of posts using a variable name of page -->
% include "pagination.html" with page=posts %
所以pagination.html
模板引用page
的地方,其实就是使用posts
的值。
<!-- Really posts.number and posts.paginator.num_pages -->
Page page.number of page.paginator.num_pages
希望这有助于解释事情。
另外一点,您不需要在 Python 中的每一行末尾添加分号。
【讨论】:
以上是关于神经网络从何而来?的主要内容,如果未能解决你的问题,请参考以下文章
UnobservedTaskException - 任务从何而来