CS50AI - 第 5 章 - 神经网络
神经网络属于当下极其热门的话题,AAAI, NeurIPS 等等期刊成为了许多本科生接触科研,发表文章的首选。与神经网络相关的名词术语也往往出现在学术中,当然也出现在群聊中。
因此这节就讲一讲什么叫神经网络。
仿生学神经网络的产生,要从人类讲起。人工智能的这一学派是链接主义,也就是通过模仿人类大脑中神经元的连接来让机器形成智能。
剩下的两大流派我们也早有接触。
一个流派是符号主义,他们主张用数理逻辑(如果…就…)来求解问题。主要在 Knowledge 这一章进行了展开。是啊,这一章中我们定义了多少符号呢!
另一个流派是行为主义,他们主张让 agent 通过与环境交互,获得奖励惩罚,从而形成更好的决策。主要在上一章 Learning 中进行了小小的展开。上一章作业中的 Nim 是一个典型的行为主义的例子。
不过,不管是什么主义,似乎,共同的理念就是让机器来解决问题,而不是人类给出一一个显式的算法。比如,计算机视觉(Computer Vision,简称 CV)中的手写数字识别,很难用一个,如果这几个像素为黑,那么就是数字几,的算法来解决问题。所以人类的处理方法是,给机器一个数据集,对输入稍 ...
鲁迅公园半日游
放假的时候读完了迟子建的散文集《也是冬天,也是春天》。我最喜欢的就是标题的这篇散文。
接触到迟子建是在高二或者高三,做语文模拟题的时候,做到了取材于这篇散文的现代文阅读,是 2018 年 4 月的海淀一模,给我看乐了。作者的语言,像是在心平气和地描述一些很怪诞的事情。用现在的话说,可能有些死人感:
我先去拜谒原虹口公园的鲁迅先生墓,这座墓从当年的万国公墓迁葬于此,已经一个甲子了。天气晴好,又逢周末,园里晨练的人极多。入园处有个水果摊,苹果橘子草莓等钩织的芳香流苏,连缀着世界文豪广场。红男绿女穿梭其间,不为膜拜文豪,而是踏着热烈的节拍,跳整齐划一的舞。他们运动许久了吧,身上热了,大多将外套脱掉,只穿绒衣。广场边一棵粗大的悬铃木,此刻成了衣架,被拦腰系了一圈白带子,穿着吊钩,紫白红黄的外套挂在其上。我努力避让舞者,走进广场。文豪们的铜雕均是全身像,或坐或站。可怜的托尔斯泰,他右手所持的手杖,挂着一个健身者的挎包,一副苍凉出走的模样,可惜我不吸烟,不然会在他左手托着的烟斗上,献一缕烟丝,安抚一下他。与他一样不幸的,是手握鹅毛笔的莎士比亚和狄更斯,鹅毛笔成了天然挂钩,挂着色彩艳丽的超轻羽绒衣 ...
CS50AI - 第 4 章 - 学习
学习是当下 AI 领域非常热门的话题。机器学习已经渗透到科学研究的各个领域。
很简单地,基于图像识别来判断是不是有坏果;或者,在加密了的网络中,基于机器学习来识别流量中的恶意流量。
所以有必要学习一下机器是如何来学习的。
机器学习有一些取巧的成分。感觉,有点像大人教小孩子如何学习知识一样。因为我们不知道如何来编写一套行之有效的算法,所以寄希望于给定一些提示,让机器自己根据提示选择更好的路径,从而完成一项任务。
监督学习(Supervised Learning)监督学习,顾名思义,是需要人来监督的。
人,做了什么呢?
标注数据集。
监督学习的底层思路就是寻找一个近似函数。这个函数对于给定的输入,输出一个估计的结果。我们的目标就是提供大量的输入,根据输入,调整各个参数,得到近似函数。最后,针对新的输入,检验这个函数能不能输出预期结果。
找这个函数,目的是什么?目的是解决两种问题:
分类问题;
回归问题。
二者的区别在于,分类问题的值域是离散的,好果子/坏果子;下雨、不下雨;回归问题是连续的,如收入等指标。
分类问题对于分类问题,解决思路有两种:
邻居;
感知机(Perc ...
自动部署 HTTPS 证书
需求之前使用腾讯云的证书,只有 90 天的有效期,每次到期了就要手动部署,下载 .crt 和 .pri 文件(或者是 .key ,吧,记不清了),然后手动移动到对应的文件夹。一个域名就要花好几分钟,效率很低。
因此问了问 AI,有什么更好的方案。最终决定采用 Let’s Encrypt 和 Certbot 结合的自动化方案。
哪个证书这里需要澄清一个问题。Cloudflare 有一个 Edge Certficate 的方案,可以自动化地续期证书,这个证书是浏览器访问域名时用到的证书。
然而在 Cloudflare 的服务器和源服务器之间,仍然需要自动化处理证书。本文要解决的是后者。
1用户 -- Edge Certificate --> CF 代理服务器 -- 本文要解决的证书 --> 源服务器
环境配置安装 snapd12sudo apt updatesudo apt install snapd -y
安装 Certbot123sudo snap install core # 确保 snap 运行环境是最新的sudo snap refresh coresudo sn ...
计组 | 浮点数的运算
说在前面浮点数的运算步骤比较多,而且种类也比较多。
运算数的不同会影响运算进行多少步;而运算数的表示方式(原码、补码、移码)会影响具体问题的分析。
浮点数的加减法加减法大概需要这样几步:
对阶。小阶向大阶对齐,否则大阶的高位被舍去,误差太大;
尾数的相加;
规格化;
左规
右规
舍入处理;
截断;
末尾恒置 1;
0 舍 1 入。
看看流程图吧:
所以如果理解了这一个过程,就会明白,为什么浮点数中,一个很大的数加很小的数会损失精度了。
浮点数的乘除法浮点数的乘除法,要经历如下的阶段。不用文字了,直接展示流程图:
这里常考的一类题目是到底需要规格化几次,需要明白原码或补码表示时,数值的范围。
有时候是 0 次,不过最多是一次。
说明的是,在加减法和乘除法的过程中,如果使用更大的扩展位,可以提高精度。例如,Intel 在实现浮点数运算的时候,采用 80 位扩展,等保存结果的时候,再截断到 float 或者 double 的长度。
CS50AI - 第 3 章 - 优化
序这节讲优化问题,怎样找到最优解。
大概分成三种问题:爬山问题、线性规划问题,以及约束问题。
爬山问题爬山问题比较经典,解决的问题是:如何在一群状态中找到最值。
什么叫状态呢?状态就是一种方案。比如说,在哪里建医院可以让附近的居民区到达各自最近医院的路径开销最小;再比如,外卖平台怎样安排送餐顺序才能让所用路径最短等等。
有的时候,追求最大值,这种函数叫 Optimal Function,有时候追求最小值,这种函数叫 Cost Function。总而言之就是寻找最值。
解决这种问题最经典的思路是(以找最大值为例),从一个点开始,环顾四周(邻居),有更高的,则向上前进,否则就到了一个极值点。
注意我说的,这里到了一个极值点,而不是最值点。找到的只是一个相对优的解,但并不是最好的,总结来讲,有如下的问题:
找到的是极值点,是局部最值,而不是全局;
遇到大片相等的值时,会卡住,无路可走(因为是严格大于);
贪心,有时候走些弯路会爬的更高。
修改后的爬山算法要对算法进行优化,有许多思路。有一些地方可以做文章:
Steepest-ascent 选爬升最多的邻居(其实就是刚刚的思路);
Sto ...
春天又来了
又到了一年春天,日子渐暖,人也更加懒散。
这学期开学之后,一直找不到状态,总感觉还在放假中。。不知道怎样才能有点干劲呢?说实话,挺感谢那位的,也挺感谢那位的,虽然因她们产生的情感也让我备受煎熬,但至少让我在繁忙又繁忙的大一下和大二上有了奔头。不过这种 buff 的效果只能维持一学期。时间再长,就会发现,这种情感是单向的。
我承认我是恋爱脑,所以为了不让别人借助这一点伤害自己,我就只能尽量做到理智。爱这种东西,多半是荷尔蒙在作祟。看到有人做出这样的评论,当鸟类求偶的时候,会做出奇怪的动作。比如珠颈斑鸠在求偶的时候,发出“固固”“固固”的声音,在发出第一个音节的时候低下头,在第二个音节结束时抬起头,如此反复。
我也是一样,不过那是初中的时候了。对于喜欢的女生,莫名其妙跟对方搭话,喜欢在对方面前转,即使,也很遗憾,对方和我不在一个班。如果在一个班,我不知道我会选择放弃,还是选择勇敢地 A 上去。距离产生了滤镜。
说到滤镜,我想到,如果和对方的关系不同,看到的对方也不一样。什么是关系?一切皆集合。关系是存放有序对的集合。比如说,我大一的一个室友,在群里可是出尽了风头。不论是奋战到深夜,还是请求 ...
CS50AI - 第 2 章 - 不确定性
不确定性(Uncertainty)上节课讲的知识,那是布尔式的非黑即白。这里,我们考虑一个更细粒度的刻画,那就是发生的概率。
概率(Probability)样本空间(Possible Worlds)讨论概率,需要事先划定范围,这个范围就是样本空间。
比如,掷一个骰子,只有可能掷出来 ${1, 2, 3, 4, 5, 6}$。
概率的公理(Axioms in Probability)有一些概率相关的道理是人们共同承认的、显而易见的:
所有的概率都在 $[0, 1]$ 之间;
样本空间中所有样本点的概率之和为 1。
无条件概率(Unconditional Probability)考虑扔一个骰子,点数的可能;或者扔两个骰子,点数之和的可能,这种概率都是无条件的。条件的另一种理解方法就是知识。
条件概率(Conditional Probability)条件概率,记作 $P(a | b)$,表达的含义是,在事件 $b$ 发生的情况下,$a$ 发生的概率。也可以有另外一种方式,那就是,已知 $b$ 发生了,$a$ 发生的概率。
条件概率的一个思想是缩小考虑的范围。譬如说,已经知道 $b$ 发生 ...
计组 | 数据的运算
加法之前说过,补码的好处就在于可以直接使用无符号数的加法器硬件。因此,这里说的加法都是补码的加法,当然还涉及到了浮点数的阶码加法运算。
理论在进入到硬件层面之前,需要对加法进行理论分析,尤其是溢出判断的部分。判断溢出有如下几种方法:
双符号位;
进位;
符号位和进位标志;
运算前后的符号位(正 + 正 == 正?负 + 负 == 负?)。
3、4 只适用于同号数求和 or 异号数求差的判断,用得少。
1 在加法运算中对两个 operand 用两个符号位,如果运算结束后两个符号位不一样,那说明发生了溢出,表明当前的长度表示不下结果。扩展后的高位符号位肯定是真的,但是在结果中会被截断,低位的符号位会被保留。所以如果低位的符号位和最高位的符号位不一样,说明最终的符号位不符合预期,发生溢出。
2 记录最高位和次高位的进位情况,二者的异或表示是否发生了溢出。用穷举法证明,思路是:证明异号运算不会满足溢出判断的标准;再证明同号运算用此标准可以判断是否溢出(思路是:如果结果的符号位和加数一样,考察两个进位;如果不一样,也就是溢出了,再考察两个进位情况)。
...
计组 | 校验码
这些校验码的校验原理都是:在数据位之外,增加几个校验位,用来验证传送的数据是否正确。
奇偶校验码比较经典的奇偶校验码是在数据位之外添加一个校验位。分成两种校验方式,奇校验和偶校验。前者要求数据位和校验位中 1 的数量是奇数;后者要求 1 的数量是偶数。
检错能力:1 位;纠错能力:0 位。
如果有两位或两位以上同时在相反方向进行了变化,则不一定检查出错误。如果说 不一定 能检查出错误,就说明纠错的能力丧失了,这种评价标准对于后续的校验方式同理。
如果有 1 位发生了错误,确实不满足校验标准,然而,到底哪一位出错呢?不知道,任何一位出错都会造成校验失败。
举个例子。
偶校验,数据是 ASCII 码的 A: 00010001,当前二进制序列已经有偶数个 1 了,校验位是 0。所以发送方发送的数据是:0 + 00010001。
如果有 1 位发生了错误,不妨是数据位的最低位,那么接收方接收到的是:0 + 0010000,不满足偶校验,检出错误。但是不知道是哪位出了错,所有的位数其中之一,都具有翻转的可能。如果有两位发生了错误,不妨设最低两位,则接收到的是 0 + 0010010,仍然满足偶校 ...