图灵:计算机器与智能 经典AI论文系列
经典AI论文这个系列的产生主要是出于这样一个想法: 现在每年人工智能相关的顶会文章, 一年下来都有上万篇, 论文似乎永远都读不完. 然而, 这些论文真正的价值有多少呢? 有多少论文在十年之后还能发挥作用了? 我们真的需要一个会议就涌现出成百上千个state of art的模型吗?不妨来看看这些历久弥新的经典AI论文, 也许这些论文没有最新的技术, 也许里面的有些观点现在来看都很幼稚, 但是他们也曾经发挥过巨大的作用. 重温这些”老论文”, 也许能够给我们带来更开阔的视野. 不要总是被近五年(甚至很多人觉得两年前的文章就过时了)的走势所裹挟, 也许我们应该像诗人Robert Frost说的那样, took the one less traveled by.
这次来读的是祖师爷A.M.图灵在1950年发表的一篇论文: Computing Machinery and Intelligence (计算机器与智能).
在这篇论文里, 图灵首先是提出了一个问题: “机器能思考吗?(Can machines think)”, 接着设计了一个游戏, 并认为该游戏是对前问题的等价描 ...
【西瓜书】第十六章 强化学习
本文是周志华老师《机器学习》第十六章强化学习的学习笔记。
任务与奖励强化学习通常用马尔科夫决策过程(Markov Decision Process, MDP)来描述. 其对应一个四元组:
E=(X, A, P, R)其中$E$为环境, $X$为状态空间, $A$为动作空间, $P:X\times A\times X$为状态转移概率, $R: X\times A\times X$为奖励.机器要做的就是在环境中不断尝试而学的一个策略(policy)$\pi: X\times A$, 策略的优劣则取决于长期执行这一策略后得到的累积奖励. 这里的计算方式有多种, 常用的有”T步累计奖励”$\mathbb{E}[\frac{1}{T}\sum{t=1}^T]r_t$和$\gamma$折扣累计奖励$\mathbb{E}[\sum{t=0}^{+\infty}\gamma^tr_{t+1}]$.
K-摇臂赌博机我们先来考虑最简单的情况,即只有一步操作. 在这个设定下,我们需要考虑两方面: 一是需要知道每个动作对应的奖励, 二是要执行奖励最大的动作. 如果每个动作的奖励是确定值, ...
协程 --流畅的python
协程这一章来介绍一下Python最鲜为人知的, (表面上看起来)最无用的特性,也就是协程(Coroutine).本章的notebook文件见这里.协程是一种流程控制工具, 可以把它看作一种轻量级的线程,但是它的中断和继续都是由程序控制(而非系统阻塞),因此效率更高.
这么说可能有些难以理解,下面就一步步深入了解协程.
## 从生成器到协程
在Python2.5以后,生成器API中加入了`send`方法, 该方法可以发送数据并将该数据作为生成器函数中`yield`表达式的值. 自此, 生成器就可以用作协程.
下面介绍一个最简单的协程用法:
1234def simple_coroutine(): print('开始协程') x = yield print('协程接收到: ', x)
12my_coro = simple_coroutine()my_coro
<generator object simple_coroutine at 0x000001EC20B4C468>
1nex ...
Python拾遗 上下文管理器和else语句 --流畅的python
本文的jupyter notebook文件在这里。
上下文管理器和else块Python有一些其他语言中不常见的流程控制特性,因此也往往为人所忽视,本章讨论其中两个特性:
with语句和上下文管理器
for, while和try语句的else子句
if以外的else语句我们习惯于if/else语句,但是往往忽略,python中for, while, try语句也能跟else子句:
for当循环运行完毕时(没被break),才会运行else块
while 当循环因为条件为假而退出(没被break),才会运行else块
try 当块中没有异常抛出时才会运行else块
虽然说这里使用的关键词是else,但是其实使用then更符合其语义:先(成功)做这个,再做那个。
其中try和else的联合使用有些令人费解,毕竟else块的代码可以放在try里面:如果发生异常了无论是try块剩下的部分还是else部分的代码都不会被执行。这里的好处在于,可以明确try语句防守的是哪些语句(哪些语句可能会抛出预期异常),使逻辑更明确。
一个for/e ...
【西瓜书】 第十四章 概率图模型
本文是周志华老师《机器学习》第十四章概率图模型的学习笔记及部分习题答案。
概率模型是将学习任务归结为计算变量的概率分布的模型。在该模型中,利用已知的变量推测位置变量的分布称为推断。
假定关心的标量为$Y$,可观测变量集合为$O$,其他变量为$R$,那么就可以将模型分为两种:
生成式 考虑联合分布$P(Y, R, O)$
判别式 考虑条件分布$P(Y, R|O)$
给定观测变量,推断就是由上述分布去推测条件概率分布$P(Y|O)$
由于直接求解该模型的复杂度是指数级别的,因此我们需要有一套能够简洁紧凑表达变量关系的工具,其中的代表就是概率图模型。它利用图作为标识,用节点来表示随机变量, 边来表示随机变量之间的关系,概率图主要分为两类:
贝叶斯网,使用有向无环图(常用于变量间存在显式因果关系的情况)
马尔科夫网,使用无向图(常用于变量之间存在相关性但没有明显因果性)
隐马尔可夫模型隐马尔可夫模型(Hidden Markov Model, HMM)是最简单的动态贝叶斯网。其中的变量分为两组,第一组是状态变量$y_i \in \mathcal ...
Python拾遗 迭代器与生成器 --流畅的python
可迭代的对象,迭代器和生成器python中所有生成器都是迭代器,不过不同在于迭代器用于从集合中取出元素,而生成器用于“凭空”生成元素。 本章就来探讨一下迭代,迭代器和生成器。
本章的notebook文件在这里
可迭代对象但解释器需要迭代对象x时,会自动调用iter(x),其机制依次如下:
检测对象是否实现__iter__,是则调用它返回迭代器。
检查对象是否实现了__getitem__,是Python会创建一个迭代器,尝试按照顺序获取元素。
如果尝试失败,Python会抛出TypeError,显示对象不可迭代。
因此Python中所有序列都可以迭代的原因就是它们都实现了__getitem___方法。
可迭代对象和迭代器对比可迭代对象指的是:使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法,那么他就是可迭代的;同时如果实现了__getitem__方法且参数从零开始的索引,这种对象也可以迭代。下面我们用while语句来演示一下迭代过程:
123456789s = 'ABC' # 可迭代对象 it ...
【西瓜书】第十三章 半监督学习
本文是周志华老师《机器学习》第十三章半监督学习的学习笔记及部分习题答案。
在实际应用中,有标签的数据的获取往往受成本限制,其数量是较小的;但是同时我们又有大量的无标签数据,如何同时应用小部分的有标签数据和数量上较多的无标签数据,这就是半监督学习研究的内容。
当然有了无标签数据我们也可以通过人力或者其他方法来赋予这些数据标签,但是这么做代价往往很大,因此主动学习应运而生,其核心思想是从无标签数据中挑出那些对改善模型性能帮助大的数据来打上标签,这样使用尽量少的“查询(query)”来获得尽量好的性能。
但是上述操作仍然是引入了额外的专家知识,半监督学习可以让学习器不依赖外界交互,自动的利用未标记样本来提升学习性能。要利用这些未标记样本,需要做一些将未标记样本所揭示的数据分布信息与类别标记相联系的假设,首先我们默认下面讨论都有一个前提,即未标记样本和标记样本是(近似)独立同分布的(不满足独立同分布情况的可以看作是某种意义上的迁移学习):
聚类假设 cluster assumption 假设数据存在簇结构,同一个簇的样本属于同一个类别。
流形假设 manifold ...
读书月报1812
真的好快,18年的最后一个月读了这些书:
国家的常识
沙丘
东大爸爸写给我的日本史2
权威与个人
战后日本经济史
国家的常识后悔没有早点读到这本书,如果每个人都读过,世界上也就不会有那么多愤青了。长久以来,各路公知大V谈及外国(乃至西方)时都默认是指美国,提及民主也则默认为美国式的民主。 这本社科的教科书告诉我们“世界上国家多着呢!!!”读完非常开眼界,俄国的一党独大和日本的有什么区别,法国的精英统治和美国有何异同,民主和石油为何是反义词? 当然,考虑到作者自由主义/资本主义的屁股,对其在某些敏感章节抛出的观点需要甄别,但是全书所有的事实(fact)都值得了解。
顺便,大陆的版本缺了中国的一章,不过网络上可以找到。
沙丘 1,2各种“不可不读”/“人生必读”科幻小说排行榜上座客,但是开头有些晦涩,上来就是未加解释的许多术语概念。读完确实有种网文的“爽感”,隐隐觉得用今天的眼光来看有些过誉了。毕竟科幻作品也是一直在进步,不过作品里透出的类似“环境保护”的思想总给我一种年代感。
东大爸爸写给我的日本史2下半部,讲日本近代史的,比较好的一点是一直 ...
读书月报1811
这个月看了几本书:
你不懂咖啡
中县干部
共产主义的原貌
你不懂咖啡一本有趣的小科普,去上海的火车上三个小时随意翻完了。
中县干部这本书虽然不可多说,但是多少说几句。其实说实话我觉得除非相关专业的研究生,否则基本上大家都不会很完整的读完。毕竟作为一篇博士论文,里面的有太多细节对读者来说太过枯燥,我也不过是在行文中挑一些看起来有趣的字眼读读。
共产主义的原貌副标题是《马克思《1844年经济学哲学手稿》如是读》,里面挑挑拣拣支离破碎写了一些马克思早年的思想,但是可能由于xx原因和xx原因,读起来不甚过瘾。
Python拾遗 鸭子对象 序列的切片与散列 --流畅的python
本章的notebook文件在这里
序列的修改,散列和切片
不要检查它是不是鸭子,它的叫声像不像鸭子,它的走路姿势像不像鸭子等等。具体检查什么取决于你想使用语言的哪些行为。——Alex Matrelli
这一章来看看如何构造一个序列类型,我们以Vector类为例。
协议与鸭子类型在Python中创建功能完善的序列类型无需使用继承,只需实现符合序列协议的方法,这里协议是指面向对象编程中,只在文档中定义而不在代码中定义的非正式接口。
例如,python的序列协议需要__len__和__getitem__两个方法, 任何实现了这两个方法的类就能在期待序列的地方使用。
在编程中,鸭子类型指的是,符合鸭子特性的类型,即所谓的“长得像不像鸭子,走路像不像鸭子,叫声像不像鸭子”,但是在python中,只要符合了协议的类都可以算作鸭子类型。也就是我们开头所说的那句话。我们想实现一个鸭子(序列),只需要检查有没有鸭子的这些协议(序列的__len__和__getitem__)。
可切片的序列下面我们来实现一个可以切片的Vector序列,其中我们需要注意的是:
需要实现__len__ ...