Xuerui Wang的人工智能笔记 - XueruiWanglay/ai106b GitHub Wiki
简介
- 深度学习很热门,开放原始码阶段,释出了很多很好的框架,比如是Ts?blow?;
- 机器学习在做的就有,“本来不会,后来会”,即修正错误、改善目前情况;
- 电脑向人靠近的过程--人脑是神经元的世界,然后靠感官们输入输出信息,而计算机有各种硬件模拟感官功能,但什么样的东西使得这些程式更接近人工智慧:“优化”;
- 优化即,对于某一个函数,找最高点或最低点;
- 最近电脑硬体的两个重要发展:区块链(比特币矿机),因为需要强大的加速能力,什么量子矿机那些,国内的公司-比特大陆;深度学习(神经网络),之所以是深度学习,是因为神经网络的层数很多,“深度”,可以达到几十层几百层,谷歌的TPU晶片,张量处理器,可以让深度学习的演算法跑得很快,挑战显卡厂商;
围棋赛
- 谷歌派一台装了TPU处理器的电脑跟别人对战,Alpha Go用了蒙迪卡罗搜寻树结合13层的神经网络;围棋优化的就是胜率,提高胜率/降低败率;不过优化过头的话,记录都是胜,但最后出来的还是败;table lookup的策略查表,即几千万套棋盘搜寻出一摸一样的棋盘,照着,但是问题在于,围棋棋盘空间非常大,如果不考虑吃掉棋子的话,381!的搜寻空间太大了,录入的tables一定没有这么大的cover,深蓝是tablelookup,而AlphaGo没有棋谱,靠自我优化胜的几率(!=胜率)
- 计算机与人类的距离:深度学习的应用:卷积神经网络做艺术创作;什么时候能开抗生素,机器(MyCin系统?)比较好,正确性可以做到比一般的人类医生高;电脑可以容易很快完成训练过程;电脑输在“辨认”等能力的局限上;《数位神经系统》:我们常常对短期的科技发展评估过高,却对短期的科技发展评估过低;
聊天机器人的例子
- 方法是“规则比对”,只要比对到了有价值的(可以回答的)字,就随机选择后面列出的回答方式之一回复,例如Q:“对不起|抱歉”, A:“没关系|别介意|*”;
- Eliza:做的事情基本就是“Turing Test",即用来检验电脑有否有智慧
传统行业与人工智能
- 会计之类的传统人力工作,正在受到挑战;
- 自动驾驶目前还不能取代人类驾驶,因为道路不是完全适合自动化的,有人开车,变化很多,所以不安全,如果完全重新修一座城市在规划的话,可能性提高很多
爬山演算法 hillclimbing
- 最简单的一类优化算法,且非常好用,如果想不出比它更好的,就用它;
基本问题
- 蚂蚁爬山:因为个体太小,无法看到山顶,面临路径选择的问题,解决办法有看斜率;电脑所能做的就是计算,它的山就是函数f(x),而怎么找到这个最高点f(x0),蚂蚁只能看到周围很小一圈,所以它选择(左右两个方法),哪边高往哪边去,两边都没有高,即是目前最高点了;
- 下山演算法:用爬山演算法也可以做,把函数乘以-1变成找最高的新函数,就可以通过找最高点的方法,找到原函数的最低点;
- 如果一个优化算法,不是用爬山(stepwise一步步找最高点),一定有其他的原理,否则用这类方法就可以解决问题了;
爬山演算法的极限
- 很多问题,并不是只有一个高点/一个谷底,所以容易陷入局部最优困境当中;
- 所以,一次爬山基本会陷入局部最优,也许偶然会找到全局最优 -- 解决方法:多次爬山,从随机乱数开始做初始点;改良爬山演算法,有模拟退火法(改良了,但效果有限)、遗传演算法(跑起来很慢,但有效情况分问题看)
现实3D问题
- 方向有前后左右,但也会有盲点,8个方向的话,漏洞会更少
- 如果看得到下降/上升斜度最大的方向,就选那个方向进行stepwise,此时,就要用到偏微分数学,“梯度下降法”(通过偏微分,找到梯度,永远朝梯度最大的方向走,效果很好;单程的神经网络的重要方法)
程式codes注意点
- 设定一个步伐长度dx,x+dx/x-dx表示右走/左走
- 如果哪边比较高,就替换x为新的x点
- 都不高了,就停止,break
extension
- 电脑里面,任何的bit stream都可以是一个点/一个解/一个染色体(遗传算法里),而优化从邻居们bit streams开始搜寻,遍历邻居,有最好就过去,但万一是浮点数,就是fi +/- dx(i=1,...,k);
- 盲点的问题:因为只看邻居的方向,万一左边的邻居更好,去了左边,但右边的邻居虽然不好,可它的再右边一个邻居是个全局优点梯度方向的开始,可能就错失了机会;
- 通用的爬山演算法框架:s是当前解,snew是它的某一个邻居,height是在山上的高度(AI里面的energy概念,错误率是一种能量,与高度是反向关系,能量要越低越好)
- 多变数求解:例如有三个变数,也是看能量值,随机从一个点开始,每次任一元素+/-step dx值,来看energy是否改善,继续迭代下一次,到找到最好的解;
- 解线性方程组:线性代数里面用高斯消元法,化成三角矩阵,再带回计算;用爬山演算法的话,只用知道怎么找邻居,怎么计算高度(最重要的是,能量函数怎么定),如何进行比较,更方便 -- 能量函数的通用形式:用欧几里和距离表示,即如果有AX=B这个线性方程组,能量函数即为||AX-B||,如AX的结果是Y向量,则最终结果即是((Y1-B1)^2+...+(Yn-Bn)^2)^1/2 这个欧式距离,即找它的最低值;
- 局限性:因为每次找邻居,资料库全扫一边,速度很慢,所以神经网络的梯度下降法更好;容易陷入局部最优困境(所有的演算法都会存在的问题,梯度下降法也是找到区域低点,只是它们规避这个问题有各种改良架构)。
结语
當然、上述的架構不只可以解這些問題,甚至可以用來解像「線性規劃、神經網路優化....」等等各式各樣的問題,前提是您必須自行設計 solution 類別的 neighbor(), energy() 與 toString() 函數,然後寫個主程式呼叫爬山演算法就行了。
模拟退火法
基本原理
- 找低谷(反向的爬山演算法)+ 尽可能跳出局部低点陷阱(通过升温弹出局部低点,通过降温降低反复陷入的概率)
- “Annealing” 退火,源自炼铁先升温塑性(让原子重新排列)再降温慢慢坚固(慢慢达到稳态),而在算法种,温度代表小蚂蚁会乱走的概率,温度越高,震动出去往上走的几率越高(即看到邻居更高,也会过去,且100次有99次都会过去),而降温到比较低的时候,就比较稳定了(旁边比较高,会过去的几率是100次中一次),而如果尽可能的 逃离局部最优呢?就是在这个高震动到稳态的过程中,不断尝试,尽可能找到全局优点,虽然也可能找不到;
- 怎么决定要不要往上走尝试看看呢:跟温度、新旧点之间的高度差(能量差)、随机数几率有关 -- 温度高的时候,容易往上走,温度低的时候,只往好的方向走;
该算法的架构分解
几率函数
- 要不要移动到新的点的几率,根据新旧点的能量差异和温度决定: if (enew < e) return 1; else return Math.exp((e-enew)/T);
- 即是,如果新的点能量值小于旧的点,就移动;否则,移动的几率就是exp((e-enew)/T),而这个几率要跟随机数几率作比较再定要不要移动
- 这样看来,如果enew<e,但是T很高,有很大几率会移动,而T很低,几乎不会往差的enew移动了
失败次数gens<maxGens
- 这里和爬山演算法很一样的是:失败次数达到了设置的最大失败次数,也会停掉,让它呆在这个地方了
- 但最大的区别在于,每次失败,gen++迭代增加一次的同时,温度会以T=T*0.999(例)的速度下降,失败的机会会降低(?)
温度
- 设的足够大,使其有机会乱跑
您可以看到上述模擬退火法程式,在一開始的時候幾乎都在亂走,因此浪費了很多時間,但也正是因為這種特性,模擬退火法比較有機會跳脫那些小山谷,而有機會找到更深的山谷,這正式模擬退火法的特性。
降温速度
- 慢慢降温比较好,但耗时会很久
缺点
- 当找到了最好的解,但这个过程还没停掉的话,还是会继续弹出,可能就错开了global optimal point,所以做好结果存储列表比较好;另一个解决办法是下降的比较慢,它会有机会回来这个最优点,且温度比较低的时候,就不容易跑出去了
hillclimbing vs. simulatedannealing
- 一般hc找不到的,sa也很难找到
- 除非你的问题是这种,会有很多小瓶颈的存在的,用SA比较有效;如果瓶颈都很大,要用SA完成优化速度很慢很慢,除非时间足够长(正无穷),能找到global optimization;
Genetic Algorithm 遗传算法
Naive Bayes
基本原理
- 事件之间独立;
- 一般用于unidex 两元分类;
- 有类cj(j=1,2)中特征fi(i=1,...,k)出现的条件概率,且有cj出现的概率p(cj),来预测,当特征fi出现,这个能分类成cj的概率是多少,最后依据大数为大原则,把具有特征fi的事件分类到c1或者c2;