
暂无个人介绍
前面关于强化学习的文章中介绍了MDP,动态规划的方法对MDP问题的V函数进行评估和求最优策略。然而现实问题中,往往很多时候环境是未知的。那么这篇文章就介绍一下在未知环境下用Model Free的方法预测MDP。 1. Monte-Carlo (蒙特卡洛)策略估计 Monte-Carlo(MC)方法广泛应用于数学、物理和金融等领域。比如在物理学中研究离子运动轨迹,我们就可以采用Monte-Carlo方法进行多次随机抽样,观测离子运动规律。 同样的,在解决强化学习问题的时候,机器人面对未知环境的时候,它也可以用MC的方法评估当前策略。如果想知道当前策略π,当前状态s下的价值函数V函数,在当前策略π下直接行动,待到达终点之后(完成一个episode),再复盘整个过程所获得的奖励,评估出s状态下的V函数。然后再不停迭代,最终获得该策略π下s状态下的真实V函数Vπ(s)。 当然Monte-Carlo策略估计方法也分为首次访问MC方法和每次访问MC方法,两者唯一的不同只有一处,下面算法过程中在括号中的就是每次访问MC方法。 算法过程如下: 在一个episode中,当s状态第一次被访问到(或者每次被访问到)的时候,计数器N(S)=N(S)+1。 总共得到的奖励S(s) = S(s) + Gt 价值V函数的数值V(s)= S(s) /N(s) 当迭代无数次之后,根据大数定理,V(s)就应该趋近真实的V函数Vπ(s) 2. Monte-Carlo(MC)迭代更新 在介绍Monte-Carlo迭代更新之前必须先引入一个迭代求平均的例子。比如你想算一箱苹果中苹果的平均重量,简单的方法是随机抽取几个苹果,将这几个苹果的重量相加再除以个数就估算出了苹果的平均重量。 如果想让这个估计更加精确,你又从箱子里面拿出一个苹果,这时候还需要将所有拿出来的苹果重量相加吗?当然不需要。你只需要将这个苹果的重量减去之前求得的平均数,再除以总共拿出苹果的数量得到误差。最后原平均数加上这个误差就是新的平均数了。证明过程如下。 有了这个迭代求平均值的方法我们就可以改进MC算法,不用记住总共得到的奖励S(s)了 对于每个St,和奖励Gt 其实我们甚至都不用记住N(St), 因为在非静态的(Non-Stationary)的问题中,如果N越大,就意味着误差越小,当前行动对V函数的纠正就越小。所以在实际过程中我们往往用一个固定的学习速率α来代替1/N(St): 这个公式是不是跟之前的梯度下降(Gradient Desent)方法非常类似了。 3. Temporal-Defference (TD)算法 MC有一个很大的缺点,就是要更新V(s)一定要走完整个epsoide。TD方法不需要走完整个epsoide,走有限几步就可以更新,极端情况下TD(0)甚至可以走一步就更新。 回顾MC算法: 其中 TD(0)算法: 如英文描述红色文字部分叫做TD-target。与MC类似括号里面的误差叫做TD error 4. MC vs TD MC有高Variance 零Bias: 收敛性好 对初始值不敏感 算法容易理解和使用 MC 对解决非马可夫环境(或者部分马可夫环境)效果好。 TD有低的Variance,一些Bias 比MC效率高 TD(0)能收敛于Vπ(s) 对初始值敏感 TD能探索出马可夫模型,对马可夫环境效果好。 5. DP,MC,TD比较 之前文章中介绍的动态规划(DP),与MC,TD相比较可以发现 从抽样的数量和反馈的深度可以这样理解DP,MC和TD 实际上TD不仅仅只有只走一步的TD(0), 可以是n TD(n)。当n等于无穷大的时候TD=MC
求解最优MDP实际上就是找到最佳策略(Policy)π来最大化来最大化V函数(Value Function)。 公式一 1. 策略估算(Policy Evaluation) 在MDP问题中,如何评估一个策略的好坏呢?那我们就计算这个策略的V函数(值函数),这里我们又要用到之前文章中提到的Bellman Equation了。 公式二 这个等式可以通过下一个状态的值函数来求得当前状态的值函数。如果我们对上面这个Bellman Equation中的每一个状态不停地迭代,最终每个状态的V(值)函数都会收敛成一个固定的数值。公式如下 公式三 这个公式与公式二不同的是引入了k,k是指迭代的次数。Bellman等式左边表示k+1代s状态上的V函数,Bellman等式右边是k代中s下一个状态s'的的相关函数。第二个等式是Bellman等式的矩阵形式。我们使用这个公式将第k+1代的每一个状态s都更新之后,就完成了第k+1次迭代。 V函数真的会收敛到一个稳定的数值吗?我们不妨举一个例子。 图一 图中左上角和又下角是机器人的目标奖励为0,其他地方奖励为-1,策略是随机运动(上下左右移动的概率相等,为π=0.25)。价值函数的迭代过程如下: 图二 可以看出在这个随机运动策略决策下,通过对Bellman 等式的不断迭代最终V函数会收敛到一个稳定的数值。 2. 策略迭代(Policy Iteration) 通过迭代Ballman函数的方式完成V函数的收敛,从而完成了对这个策略的评估。上面的例子即便收敛之后,就得到了随机运动的策略π的V函数。 接下来我们就要改进这个随机策略,改进的方法就是选择获取最大奖励的策略,而并不是跟之前一样随机运动。这种获取最大奖励的策略就叫做Greedy策略。 图三 所以策略迭代分为两步: 第一步:用迭代Bellman 等式的方法对策略进行评估,收敛V函数(公式三) 第二步:用Greedy的方法改进策略。 上面两个步骤不停循环,最终策略就会收敛到最优策略。 图四 2. 值迭代(Value Iteration) 也许你已经发现了,如同上面的例子,如果想找到最佳策略,在用Bellman等式迭代的过程中,并不一定需要等到V函数完全收敛。或许可以设定一个迭代上限,比如k=3就停止迭代了。 那更加极端地,在迭代Bellman 等式的过程中,我们只迭代一次(k=1)就采取Greedy策略,而不必等到V函数收敛,这种特殊的策略迭代方法就叫做值迭代(Value Iteration) 公式四 值迭代简单粗暴,直接用Bellman等式更新V函数,每次更新的时候都用Greedy的策略,当V函数收敛的时候策略也就收敛了。这个时候得到的策略就是最佳策略。 3. 总结 策略迭代和值迭代是寻找最优策略的方法,策略迭代先评估策略用迭代Bellman等式的方式使V函数收敛,然后再用Greedy的策略对原策略进行改进,然后不断重复这两个步骤,直到策略收敛。 值迭代可以看成是策略迭代的一种特殊情况,只迭代Bellman函数一次便使用Greedy策略对V函数进行更新,然后重复这两个动作直到V函数收敛从而获得最佳策略。 相关文章AI学习笔记——求解最优MDPAI学习笔记——MDP(Markov Decision Processes马可夫决策过程)简介AI学习笔记——Q LearningAI学习笔记——Sarsa算法AI学习笔记——卷积神经网络(CNN) 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
我们介绍过MDP(Markov Decision Processes马可夫决策过程)以及什么是最优MDP,甚至从强化学习的角度介绍了DQN,Q-learning, Sarsa 等求解最优MDP方法,但是要深入理解强化学习,必须了解背后支持的理论基础。动态规划(Dynamic programming)就是这些算法为什么能够求解最优MDP的理论基础。 动态规划的本质是将复杂大问题分解成,相互重叠的简单子问题,求到子问题的的最优解,然后将这些最优解组合起来就是大问题的最优解。 举个简单的例子,女朋友想在衣帽间中找到最搭的穿戴(衣服,帽子,鞋子,首饰。。。)。这是一个复杂的问题,但是我们可以把这个问题分解成互相重叠的小问题,比如,找到最佳搭配的鞋子和裤子。最佳搭配的裤子和衣服,最佳搭配的衣服和首饰等等。。。将这些搭配打完分之后,你自然就会找到最佳搭配的(得分最高的)衣服,裤子,帽子,鞋子和首饰了。 能用动态规划解决的问题必须满足两个条件,第一是可以拆解成子问题,第二这些子问题必须能相互重叠,MDP就满足这两个条件。 在用动态规划解决MDP问题的时候需要用到之前提到的Bellman公式,已经用Bellman公式1.预测v函数(状态值函数),2.通过价值迭代(Value iteration)求最优MDP 3. 通过策略迭代(Policy Iternation)来求得最优MDP。这些内容将放在下一篇文章中介绍。 相关文章AI学习笔记——求解最优MDPAI学习笔记——MDP(Markov Decision Processes马可夫决策过程)简介AI学习笔记——Q LearningAI学习笔记——Sarsa算法AI学习笔记——卷积神经网络(CNN) 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
之前的文章介绍了Q-learning, 介绍了深度学习(Deep Learning),DQN顾名思义就是将两者结合起来。DeepMind公司也就是用DQN从玩各种电子游戏开始,直到训练出阿尔法狗打败了人类围棋选手。本文就简单地介绍一下DQN的基本概念。 1. Q-Learning 和 深度学习回顾 Q-learning是通过不停地探索和更新Q表中的Q值从而计算出机器人行动的最佳路径的,公式为 Q(s0,a2)新=Q(a0,a2) 旧 + α* [Q(s0,a2)目标 - Q(s0,a2)旧] Q(s0,a2)目标 =R(s1) + γ*max Q(s1,a) 深度学习就是用神经网络来学习数据,常见的深度学习网络如全连接的,CNN,RNN等等。 2. DQN搭建 为什么玩电子游戏没办法直接用Q-learning 来学习最佳路径呢?因为电子游戏的每一帧图片就可以是一种状态,游戏中的角色又可以有多种动作(上下左右,下蹲跳跃等等)。如果用Q表来记录每一个动作所对应的状态,那么这张Q表将大到无法想象。 DQN不用Q表记录Q值,而是用神经网络来预测Q值,并通过不断更新神经网络从而学习到最优的行动路径。 DeepMind 用DQN来玩电子游戏,他们将游戏画面的像素转换成深度神经网络的输入数据(状态s),用CNN(卷积神经网络)来预测动作a(a1,a2,a3 ....), 和对应的Q(s, a1), Q(s, a2),Q(s, a3)... 然后算法通过更新神经网络(NN)中的参数(w, b ...),来更新NN,从而优化模型得到最优解。 3. 记忆库(Experience replay)和Fixed Q-target(固定Q-目标) DQN中有两个神经网络(NN)一个参数相对固定的网络,我们叫做target-net,用来获取Q-目标(Q-target)的数值, 另外一个叫做eval_net用来获取Q-评估(Q-eval)的数值。 我们在训练神经网络参数时用到的损失函数(Loss function),实际上就是q_target 减 q_eval的结果 (loss = q_target- q_eval )。 反向传播真正训练的网络是只有一个,就是eval_net。target_net 只做正向传播得到q_target (q_target = r +γ*max Q(s,a)). 其中 Q(s,a)是若干个经过target-net正向传播的结果。 训练的数据是从记忆库中随机提取的,记忆库记录着每一个状态下的行动,奖励,和下一个状态的结果(s, a, r, s')。记忆库的大小有限,当记录满了数据之后,下一个数据会覆盖记忆库中的第一个数据,记忆库就是这样覆盖更新的。 q_target的网络target_net也会定期更新一下参数,由于target_net和eval_net的结构是一样的。更新q_target网络的参数就是直接将q_eval 的参数复制过来就行了。 见下图DQN的基本结构 随机抽取记忆库中的数据进行学习,打乱了经历之间的相关性,使得神经网络更新更有效率,Fixed Q-targets 使得target_net能够延迟更新参数从而也打乱了相关性。 Deep Mind 就是靠CNN, 记忆库和Fixed Q-target这三把利剑让机器学会了如何玩游戏,甚至在电子游戏中还能打败人类玩家。 参考文献: Playing Atari with Deep Reinforcement Learning 相关文章AI学习笔记——求解最优MDPAI学习笔记——MDP(Markov Decision Processes马可夫决策过程)简介AI学习笔记——Q LearningAI学习笔记——Sarsa算法AI学习笔记——卷积神经网络(CNN) 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
上一篇文章介绍了MDP的基本概念,但是我们更关心的是如何寻找到最佳的路径解决MDP问题。MDP过程中,可以有无数种策略(policy),找到最佳的路径实际上就是找到最佳的Policy 来最大化V函数(Value Function)或者Q函数(Action-Value Function)。 用数学表达式表达出来就是: 其中加星号* 的v和q表示最优的v和q。 还记得上一篇文章中的那个例子吗?学生学习的的状态有Facebook, Class1, Class2, Pass, Sleep 6个状态(State),每个状态都有一个或者多个行动(Action)。最优的V函数和Q函数都已求出来了,找到最优策略就是找到最大q*的过程。显然红色的路径就是最优策略,只有沿着这条路径才能的到最大的奖励。 同样的,用Bellman 等式可以得到最优V函数和最优Q函数的关系,以及他们自己的递归关系: 同样的用Bellman等式,我们可以验证为什么V(Pass) = 10. Pass 这个状态有两个行动,分别为Study和Pub。Study 对应一个状态Sleep,Pub对应三个状态Class1, Class2, 和 Pass。那么假设γ=1 V(Pass) = Max{+10+0,+1+(0.2x6 + 0.48 + 0.410)} = Max{10, 8.6} = 10。 用同样的方法可以验证每一个状态的V函数。 当然我们现在只能验证,无法真正求解最优V函数和Q函数,如果能求解最优Ballman 等式我们就能得到最优的V函数和Q函数进而得到最优的策略。 但是遗憾的是最优Ballman等式并不是线性的,所以不能直接通过解线性方程的方法求得。但是可以通过一些迭代算法求得,之前的Q-Learning和Sarsa 算法就是求最优Ballman等式的算法,当然这些算法也就是强化学习的算法了。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
前面好几篇文章都在介绍强化学习(RL),以及强化学习的一些具体算法,但是强化学习中用到的最重要的理论MDP却还没提到。这篇文章就来说说MDP。 讲MDP的文章和资料非常多,理论和数学公式也能轻易找到,所以本文并不是要严谨地推导MDP,而是想让读者感性地认识MDP以及它对强化学习的重要性。本文主要的参考资料来自于David Silver 教授(DeepMind 的创始人)在UCL的课程以及Richard S. Sutton and Andrew G. Barto的经典书籍:Reinforcement Learning: An Introduction 1. MDP需要满足的条件 RL是要通过对环境不停地试错来学习的,MDP就是用来描述RL中的环境。 这个环境必须是完全可观测的(Fully Observable)。几乎所有的RL问题都可以转换成MDP的环境。 未来只与当前的状态有关,与之前的历史没有关系。换句话说就是当前的状态一旦确定了,之前的历史就可以抛弃了,因为未来只与当前有关。 2. MP(Markov Process 马可夫过程) 注意,MDP除去决策"D",就是MP。MP是一个随机过程。从现在状态 S到下一个状态 S' 通过Pss' 状态转移概率矩阵(State transition probability matrix)来完成这个过程, Pss'只是概率,所以MP还是随机的。 举个栗子: 如下图,一个学生学习一门课程,有6个状态:从Class1 到 Class 3 的学习,到Pass再到去Sleep。中间可能去刷Facebook, 去Sleep或者去酒吧(Pub)喝酒。 其中,那些数字(0.9,0.1)和箭头就代表了Pss' 的数值和状态转移的方向。Pss' 实际上是一个矩阵,如下图: 3. 马可夫奖励过程(Markov Reward Process) 奖励R是环境的反馈,当然这个反馈是与行动A, 相关的。在还没引入行动这个概念之前,暂且认为只与状态S有关。下图是加上了奖励参数的样子: 我们的目标Gt是获得奖励,有了R,有了S,有了Pss' 矩阵,实际上我们就能够估算出每一个S上的Gt:E(Gt|St = S)。 Gt 是这样定义的: Gt的物理意义就是之后状态的所有R的总和。 γ为衰减值(0到1之间),我们在之前Q-Learning中已经介绍过了,就不多说了。 这个估算出来的Gt就叫做这个状态S上的Sate Value function(状态值函数): v(S) 4. Bellman 等式 v(S)很明显是一个递归的过程,也就是说知道了最终状态v(S最终)(上面那个例子是Sleep)就可以倒推到初始状态的v(S初始),这个关系就是用Bellman 等式表达出来的。 在任意一个状态S如何求v(S)呢?需要用到下面这个公式 Rs是这个状态的奖励,S' 是下一个状态(下个可能的状态可能不止一个),Pss'就是之前提到的State transition probability matrix。 这个公式的物理意义也很简单,就是这个状态的奖励加上所有可能的下一个状态的v(S')和对应的Pss' 的乘积之和,再乘以衰减值γ。 我们可以轻易验证4.3这个v(s) 是否正确,如下图(γ=1) 5. MDP(Markov Decision Processes马可夫决策过程) 有了前面MP的铺垫,加上D(Decision)就是MDP(马可夫决策过程了)。这个决策是要决策什么呢?就是要决策行动(Action)。 正如之前提到的,行动A的奖励R不仅跟状态S相关,而且与行动A也是相关的,还是之前学生学习课程的例子,加上行动和与行动相关的R,如图: (注意pub 那个黑点这里变成了行动,而不是状态,主要是为了后面区分sate-value function 和 action-value function) 6. 策略(Policy) DP是一个随机的过程,在有了策略 (policy)π之后才整个过程才有了规律,策略也是一个概率分布,体现了在给定状态下采取行动的概率。 策略是用来指导行动的,不要与描述状态间的Pss' 混淆了。当然两者是有联系的,后面将会提到。 7. Value Function(值函数) 这是MDP最重要的的概念。前面已经提到了状态值函数(State-Value Function)v(S)(后面简称V函数),但是没有机器人,没有策略指导机器人的行动。 有了策略π之后vπ(s)的物理意义就是,在该策略的指导下,在目前这个状态下,之后能够预期的到的的奖励是多少。 当然我们更关心策略是如何指导行动的,我们引入行动值函数(Action-Value Function) qπ(s,a) 的概念。看起来是不是很眼熟,因为我们通常又叫他q函数,参见之前的文章Q-Learning。 因为加入了行动,所以q函数的物理意义就是,在当前策略的指导下,在当前状态下,采取行动a之后所能预期得到的奖励是多少。 8. V函数和Q函数的关系 V函数和Q函数都是递归关系,这个通过Bellman 等式也可以证明,这里也不再赘述。 通过Q函数来求V函数: 上图,空心代表状态,实心代表行动。所有行动的策略π(a|s)与Q函数qπ()的乘积之和就能得到V函数。 同样的,所有下一个状态的V函数与对应的Pss'乘积之和再加上采取该行动的奖励就能求得Q函数。 再次注意,Pss'反映的是状态间的转移概率,π(a|s)是状态和行动间的策略概率 当然上面两图组合(公式的带入)就能反映该状态的V函数和下一个状态的V函数的递归关系。 倒过来组合(公式带入)就能反映该行动下的Q函数和下一个行动的Q函数的递归关系。 。 利用上面的公式我们可以轻易验证例子中pass的V函数: 注意:π(a|study)= π(a|pub) =0.5 总结 本文介绍了MDP的基本概念,然而我们了解MDP的概念是为了指导我们的行动,从而得到最优的结果。换句话说就是选择最优的策略,得到最多的奖励。再换句话说就是求最大的V函数和Q函数,这些内容将放到下一篇文章再做介绍。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
在使用Tensorflow搭建神经网络的时候,最后一步总会用到tf.train.XxxOptimizer(). 然后会有很多Optimizer()如下图 其实这些Optimizer 都是优化算法下面重点介绍几个常见的 1. Gradient Decent 这是最基础的梯度下降算法,更新权重W,不多解释。 W += - α * dx 其中 α是learning rate(学习速率)。我们可以把下降的损失函数看成一个机器人,由于在下降的时候坡度不是均匀的,机器人会左右摇摆,所以下降速度会比较慢,有时候遇到局部最优,还可能在原地徘徊好长时间。 2. Momentum 顾名思义这个优化算法实际上给了一个动量,让机器人下降的的时候带一个惯性,下降的速度就加快了。 算法如下: m = b1*m - α * dx W += m 3. AdaGrad 这个算法是通过动态改变学习速率,提高下降速度,相当于给机器人穿上一个左右侧滑有阻力的鞋子,让它只好沿着正确的方向下滑。 v = dx^2 W += -(α/sqrt(v)) * dx 4. RMSProp 这个算法相当于在AdaGrad中引入了Momentum的惯性 v = b1 * v + (1-b1)*dx^2 W += -(α/sqrt(v)) * dx 但是RMSprop缺少了Momentum的变量m 5. Adam Adam是目前用得最广的优化算法,它结合了AdaGrad和Momentum的优点(所以叫才Adam嘛) m = b1m + (1-b1)dx v = b2v + (1-b2)dx^2 W += -(α*m/sqrt(v)) * dx 这个算法相当于给机器人一个惯性,同时还让它穿上了防止侧滑的鞋子,当然就相当好用用啦。 给大家看看不同优化算法下降速度的差距 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
上一篇文章介绍了强化学习中的Q-Learning算法,这篇文章介绍一个与Q-Learning十分类似的算法——Sarsa算法。 1. 回顾Q Learning 还是同样的例子,红色机器人在4x4的迷宫中寻找黄色的宝藏。找到宝藏,将会的到+1的奖励,如果掉进黑色陷阱就回的到-1的奖励(惩罚)。 首先回顾一下Q表如下 Q table (States\Actions) left (A1) right (A2) up (A3) down (A4) S0 -1 3 -1 2 S1 1 2 -1 1 ... ... ... ... .. Q(S0,A2) = Q(S0,A2) + α[R(S1) + γ*maxa Q(S1,a)-Q(S0,A2)] 在Q Learning 算法中,当机器人处于S0的状态时,它的目标Q值是: R(S1) + γ*maxa Q(S1,a)。此时他还在S0的位置上,但是已经在计算S1上的最大Q值了。但是此时它并没有行动,也不一定会在S1采取Q值最大Q(S1, A2)的行动。因为我们提到,它还有10%的概率随机选择其他的行动 (ε贪婪方法(ε -Greedy method))。 2. Sarsa 行动派 在Sarsa算法中,机器人的目标是 R(S1) + γ*Q(S1,A) 至于A是多少,完全取决于机器人实际上选择的哪一个Action。机器人有90%的概率会选择Q值最大的Action(A2),还有10%的概率会随机选择一个Action。 所以,Sarsa的算法是这样的。 除了其目标Q值与Q learning 有所不同之外,其他的都是一模一样的。 所以Sarsa是在线学习(On Policy)的算法,因为他是在行动中学习的,使用了两次greedy方法来选择出了Q(S,A)和q(S',A')。而Q learning离线学习(Off Policy)的算法,QLearning选择Q(S,A)用了greedy方法,而计算A(S',A')时用的是max方法,而真正选择的时候又不一定会选择max的行动。 Q learning 通过Max的函数,总是在寻找能最快获得宝藏的道路,所以他比较勇敢。而Sarsa 却相对谨慎。 3. Sarsa-lambda Q learning 和 Sarsa都是单步更新的算法。单步跟新的算法缺点就是在没有找到宝藏之前,机器人在原地打转的那些行动也被记录在案,并更新了Q表,即便那些行动都是没有意义的。 Lambda(λ)这个衰减系数的引入,就是为了解决这个问题的。与γ用来衰减未来预期Q的值一样,λ是当机器人获得宝藏之后,在更新Q表的时候,给机器人一个回头看之前走过的路程的机会。相当于,机器人每走一步就会在地上插一杆旗子,然后机器人每走一步旗子就会变小一点。 Sarsa-lambda 的完整算法在这里: 注意,该算法与Sarsa 算法不同的地方就是多乘了一个E(s, a) (Eligibility Trace"不可或缺性值"),而这个E(s, a)又同时受γ和λ调控。并且在更新Q表的时候,不仅仅是更新一个Q(S,A),而是整个Q表所有的Q值都被更新了。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
继续接着上一篇,这篇文章介绍强化学习中的一个经典算法——Q Learning. 在之前的文章中已经介绍过了,强化学习就是让机器人(Agent)在与环境的互动过程学习解决问题的最佳路径的过程。 强化学习通常包括这么几个重要概念: 状态(State (S)) 动作(Action(A)) 奖励(Reward(R)) 下面以一个例子来解释这几个概念,并介绍一下Q Learning是什么: 上图红色方框就是我们的机器人,任务是要在4x4的迷宫中找到黄色圆圈的宝藏,并学习到达宝藏的最佳路径。如果以左上角的初始状态为S0,那么整个迷宫一共有16个状态(State)(从左到右从上到下分别是S0到S15)。机器人的行动(Action)有四个: 分别是向左(A1)向右(A2)向上(A3)和向下(A4)移动。如果找到黄色圆圈(宝藏)奖励(Reward)为1,掉入黑色陷阱奖励(Reward)为-1,其他地方为0。 1. Q表(Q table) Q Learning 就是创造一个Q表,来指导机器人的行动,Q表对应Action的数值越大,机器人就越大概率地采取这个Action. Q table (States\Actions) left (A1) right (A2) up (A3) down (A4) S0 -1 3 -1 2 S1 1 2 -1 1 ... ... ... ... .. 比如Q表在S0最大概率会向右移动,在S1最大概率还是向右移动,因为A2在两个状态的Q表数值都是最大的。 这个Q表是经过学习之后的结果,学习并不断更新这个表的过程就是Q Learning。 2. 探索-利用困境(Explore-Exploit dilemma) Q Learning 是如何学习并更新Q表呢?正如多臂老虎机(Multi-armed bandit)问题一样,如果机器人仅仅按照表中最大概率指导行动的话,是学不到任何东西的,它还需要不停地在未知地图上进行探索,这就是是探索-利用困境(Explore-Exploit dilemma)。同样的,我们也可以用ε贪婪方法(ε -Greedy method)的方法来解决这个困境。 也就是设定一个ε(比如0.9),90%的几率按照Q表数值最大Action行动,10%随机行动。每行动一次就要更新一下Q表。 3. 如何更新Q表 Q learning的算法就是如何更新Q表的方法。还是以表下为例: Q table (States\Actions) left (A1) right (A2) up (A3) down (A4) S0 -1 3 -1 2 S1 1 2 -1 1 当机器人处于S0的状态时,如果刚好选择了A2,那么下一个状态就是S1(注意有10%的概率会选择其他的Action, 而到达其他的状态)。行动之后,我们就需要更新Q(S0,A2)的数值, 先给结果吧: Q(S0,A2) = Q(S0,A2) + α[R(S1) + γ*maxa Q(S1,a)-Q(S0,A2)] 解释一下 R(S1)是机器人在S1能活的的奖励(Reward)(该游戏除了陷阱的地方为-1,宝藏的地方为1,其他地方均为0)。 γ为衰减值。 maxa Q(S1,a)是S1状态下Q表数值最大的一个(这里是2)。 α是学习速率(Learning Rate)。 R(S1) + γ*maxa Q(S1,a)是Q(S0,A2) 的目标数值。 那我们再把公式重写一遍就清楚了吧: Q(S0,A2)新=Q(S0,A2) 旧 + α* [Q(S0,A2)目标 - Q(S0,A2)旧] 上面的公式像极了在线性回归中的梯度下降法(Gradient Descent)。只不过在线性回归我们更新权重W的方法,在这里我们更新Q表而已。 完整的公式如下: 4. 衰减值 这里再解释一下为什么要用衰减值 γ,从上面的公式可以看出,St 和 St+1是一个递归的关系。当机器人走到第n步的时候,会受到0到n-1每一步状态的影响。如果衰减值γ=1,那么每一步的影响都是一样的。γ在0到1之间,就可以让越靠近n的状态对第n步影响越大,之前的状态随着行动的增加,影响力会越来越小。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
上一篇文章中提到了学习编程练习的重要性,今天就通过几个练习题,来巩固一下Python中几个重要的技能。 将字典中大于2的值过滤掉。 #Filter out values of equal or greater than 2 #Note that for Python 2 you will have to use iteritems d = {"a": 1, "b": 2, "c": 3} 读取输入的一句话中的单词数。 a,b 中的对应数字想加并输出结果。 #Print out in each line the sum of homologous items from the two sequences a = [1, 2, 3] b = (4, 5, 6) 发现下面代码中的错误。 #Please fix the script so that it returns the user submited first name for the first %s #and the second name for the second %s firstname = input("Enter first name: ") secondname = input("Enter second name: ") print("Your first name is %s and your second name is %s" % firstname, secondname) 打印出第三个“employee”的“LastName”,并添加一个“Albert Bert”的"employee" d = {"employees":[{"firstName": "John", "lastName": "Doe"}, {"firstName": "Anna", "lastName": "Smith"}, {"firstName": "Peter", "lastName": "Jones"}], "owners":[{"firstName": "Jack", "lastName": "Petter"}, {"firstName": "Jessy", "lastName": "Petter"}]} 打印a中的index 和 item 输出格式如下 Item 1 has index 0 Item 2 has index 1 Item 3 has index 2 a = [1, 2, 3] 在字母数字和符号中选6个字符,随机生成6位的密码。 要求用户输入用户名和密码,用户名不能与数据库中(database["Mercury", "Venus","Earth","Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"])重复,密码必须大于5位,并且包含数字和大写字母。 以上题目节选自udemy上的课程 答案如下: 1.将字典中大于2的值过滤掉 d = {"a": 1, "b": 2, "c": 3} d = dict((key,value) for key, value in d.items() if value<3) 这个题目有几个重要的点:(1). 遍历字典格式的数据需要,d.items(). (2). 这种重构的语句在Python中非常常见。同样的我们也可以输出一个小于3的list:a = list(key for key, value in d.items() if value<3) 读取输入的一句话中的单词数。 s = input('Please enter: ') s_list = s.split(' ') len(s_list) 这个题目几个重点:(1). 处理String中的几个非常常见的方法,如.split(), .strip() 等等。(2). len() size() type() 等Python常见的的方法。 a,b 中的对应数字想加并输出结果 a = [1, 2, 3] b = (4, 5, 6) print(list(i+j for i,j in zip(a,b))) zip的使用,非常重要. 正确的答案如下 firstname = input("Enter first name: ") secondname = input("Enter second name: ") print("Your first name is %s and your second name is %s" % (firstname, secondname)) 在Python中有多个格式输出的时候需要用元组(加括号)的形式 打印出第三个“employee”的“LastName”,并添加一个“Albert Bert”的"employee" d = {"employees":[{"firstName": "John", "lastName": "Doe"}, {"firstName": "Anna", "lastName": "Smith"}, {"firstName": "Peter", "lastName": "Jones"}], "owners":[{"firstName": "Jack", "lastName": "Petter"}, {"firstName": "Jessy", "lastName": "Petter"}]} print(d["employees"][2]["firstName"]) d["employees"].append({"firstName": "Albert", "lastName": "Bert"}) 这道题的关键是找出d的结构,这是一个字典嵌套list再嵌套字典的结构。 打印a中的index 和 item 输出格式如下 Item 1 has index 0 Item 2 has index 1 Item 3 has index 2 a = [1, 2, 3] for index, item in enumerate(a): print("Item s% has index s%\n"%(item, index)) 枚举enumerate 的应用,非常重要更多例子见(这里)[http://book.pythontips.com/en/latest/enumerate.html] 在字母数字和符号中选6个字符,随机生成6位的密码 import ramdon characters = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" chosen = ramdon.sample("characters",6) password = "".join(chosen) 这个题目有两个知识点,(1). ramdon,这个Python自带的重要库,已经random.sample()的使用方法。(2). string.joint()这个方法。 要求用户输入用户名和密码,用户名不能与数据库中(database["Mercury", "Venus","Earth","Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"])重复,密码必须大于5位,并且包含数字和大写字母。 database = ["Mercury", "Venus","Earth","Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"] while True: user_name = input("Please enter your user name: ") if user_name in database: print("The user name is exits, please try again!") else: break while True: error_msg = [] psw = input("Please enter your password: ") if len(psw)<6: error_msg.append( "Password must over 5 characters.") if not any(i.isdigit() for i in psw): error_msg.append("Password must contain at lease one number") if not any(i.isupper() for i in psw): error_msg.append("Password must contain at least one uppercase letter") if len(error_msg) > 0: for i in error_msg: print(i) else: break 这道题有这么几个知识点: (1). while 循环语句的使用。(2). if .... in .... 的使用。(3). i.isdigit() 和 i.isupper() 方法的使用。(4). any()的使用。 相关文章AI学习笔记之——强化学习(Reinforcement Learning, RL)AI学习笔记之——如何理解机器学习(Machine Learning)人工智能学习笔记之——人工智能基本概念和词汇人工智能学习笔记二 —— 定义问题 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
网上有一个经典的段子“听过很多道理,依然过不好这一生”。同样的道理我们也可以问问自己“学过这么多年英语,依然开不了口”,“看了这么多书,依然编不了程序”。其实原因很简单,那就是缺乏练习。 没有人学骑车会先学自行车原理,没有小孩学说话先要学语法。那学习编程也一样,看了再多的语法书,听了再多的视频教程,如果不上手练习都是白学了。知识如果没有自己动手实践,只有输入没有输出,是无法变成自己的技能的,这也是为什么我在这里将学到的东西写出来的原因。 作为一个非计算机或者软件工程出生的人,最近由于在学习机器学习需要用到Python,也看过不少教程,听过好几个慕课,但是真正在用的时候又忘了。前几天在Udemy上看到一个教程:通过100个问题,提升你的Python技能,于是就抱着试试看的心态尝试了一下。没想到一下子就被陷进去了。题目由浅入深,但是都是Python中比较重要的问题,做起题目来就像在游戏中升级打怪一样非常过瘾。 打算在后续的文章中分享几个有意思的题目,也算是不仅有输入还要有输出和总结吧。
上一篇文章简要介绍了一下强化学习,强化学习是一个非常庞大的体系,与监督学习和非监督学习相比,其广度和深度都大的多,涉及到很多经典的决策算法,对统计学知识有很高的依赖。作为强化学习的基础,这篇文章研究一下这个领域的一个经典决策问题——多臂老虎机问题。 1.探索-利用困境(Explore-Exploit dilemma) 多臂老虎机是一个有多个拉杆的赌博机,每一个拉杆的中奖几率是不一样的,问题是:如何在有限次数内,选择拉不同的拉杆,获得最多的收益。 假设这个老虎机有3个拉杆,最笨的方法就是每个拉杆都试几次,找到中奖概率最大的那个拉杆,然后把之后有限的游戏机会都用在这个拉杆上。 然而这个方法并不是可靠的,因为每个拉杆试1000次显然比试10次所获得的中奖概率(预估概率)更加准确。比如你试了10次,其中那个本来中奖概率不高的拉杆,有可能因为你运气好,会给你一个高概率中奖的假象。 在有限次数下,你到底是坚持在你认为中奖概率高的拉杆上投入更多的次数呢(Exploit),还是去试试别的拉杆(Explore)呢?如何分配Explore和Exploit的次数的问题,就是著名的探索-利用困境(Explore-Exploit dilemma(EE dilemma))。 2. ε贪婪方法(ε -Greedy method) 这个方法就是设定一个ε值, 用来指导到底是Explore 还是 Exploit。比如将ε设定为0.1,以保证将10%的次数投入在探索(Explore),90%的次数用于利用(Exploit)。 具体操作就是,每次玩的时候就抽一个0到1的随机数,如果这个数大于ε,则玩你认为中奖概率(预估中奖概率)最大的那个拉杆。如果小于ε,则随机再选择一个拉杆,得到收益后,更新这个拉杆的预估中奖概率,以便于下次选择做参考。 3. 预估回报方法(Estimating Bandit Rewards) ε贪婪方法最难的就是如何科学地选择ε,而预估回报方从另一个角度,抛弃了ε,只保留其"利用"(Exploit)的部分,用预设中奖概率"天花板"的方法来解决Explore-Exploit dilemma. 首先, 将老虎机每个拉杆都设置一个比较高的预估中奖概率(比如都是100%),然后每拉一次选中的拉杆, 这个拉杆的的预估概率就会改变。 比如,我第一次选择拉第一个拉杆,发现没有中奖,那这个拉杆的预估中奖概率就从100%变成了50%了。下一次Exploite选择拉杆的时候,第一个拉杆的预估概率就不是最高了,我们就去找这个时候预估概率最高的拉杆来拉,每拉一次更新一下这个拉杆的预估中奖概率。 理论上来说真实概率高的拉杆其预估概率下降的速度会比真实概率低的拉杆慢,所以多试几次之后就能找到真实概率最高的那个拉杆。 4. UCB1 (Bandit Algorithms Continued)方法 我们发现上面两个方法中,某个拉杆预估的中奖概率是随着这个拉杆被拉动的次数而变化的。我们是通过预估概率作为评判标准,来决定去拉哪一个拉杆。 如果一个拉杆没有被拉到,那么这个拉杆的预估中奖概率就不会改变。然而通过直觉就可以理解,一个拉杆的预估概率的准确度是跟你总共拉了多少次拉杆(所有的拉杆被拉的次数)相关的,拉得越多预估概率就越准确。这个时候我们引入UCB概率,而不是预估概率来作为选择拉杆的评判标准。 这里涉及到的理论知识叫做Chernoff-Hoeffding bound理论。大意就是,真实概率与预估概率的差距是随着实验(拉杆)的次数成指数型下降的。 根据这个理论就可以引入UCB概率,公式如下: 其中XUCB-j是第j个拉杆的的UCB概率,Xj是这个拉杆的预估概率,N是总共实验的次数,Nj第j个拉杆被拉到的次数。 同样的这个算法只有"利用"(Exploit)的部分,将判断Exploit的标准从预估中奖概率改成UCB概率即可。 总结 上文我试图用最简单的语言和最少的公式解释强化学习中的一个经典问题和几个经典算法,当然还有一个更好的算法叫贝叶斯方法,会用到之前介绍的贝叶斯定理以及Bernoulli likeihood 的更多数学知识,我会找机会单独来讲讲。 相关文章AI学习笔记之——强化学习(Reinforcement Learning, RL)AI学习笔记之——如何理解机器学习(Machine Learning)人工智能学习笔记之——人工智能基本概念和词汇人工智能学习笔记二 —— 定义问题 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
诚如在之前文章提到的,机器学习按照从那里学的角度可以分为:监督学习,无监督学习和强化学习三大类。之前的文章大多数都是介绍的前两类,而第三类强化学习(RL)确是最接近我们所想象的人工智能。 强化学习简介 强化学习(RL)就是在环境中与环境的互动不停地学习的,非常像人类学习走路,学习骑车,学习游泳等等。 想象一下自己刚刚开始学习骑自行车的样子,东扭西歪的,还摔过不少跤,最后才逐渐熟练掌握的。这种东扭西歪的动作恰恰就是对周围环境的不停反馈,如果动作不当摔倒了,就是个负反馈,下次再做这个动作就要小心了。用力蹬踏板的时候车子就向前走,这就是个正反馈,要继续保持这个动作前进。 与学习监督学习和非监督学习不一样,强化学习涉及到环境(Environment),反馈(Reward),智能体(Agent),Action(行动)并不是写几段Python代码,找个数据库就能开始学习的。还好,现在有有如OpenAI这样的开源平台,让初学者能够很快通过游戏的形式上手强化学习的项目。 在这里我简单介绍一个OpenAI 里面的小游戏,抛砖引玉让大家理解一下什么是强化学习。 OpenAI OpenAI 的gym里面有一个叫(cart_pos的小游戏)[gym.openai.com],就是水平方向上有一个可以左右移动的平台,平台上有一个木棍,在重力的作用下会左右摇摆,你要做的事情就是左右移动平台使其保持平衡不要掉下来。 游戏的环境参数实际上就是如下图的四个变量: [Horizontal Position,Horizontal Velocity, Angle of Pole, Angular Velocity] 首先以最简单的方式造一个机器人。 # Gotta import gym! import gym # Make the environment, replace this string with any # from the docs. (Some environments have dependencies) env = gym.make('CartPole-v0') # Reset the environment to default beginning env.reset() # Using _ as temp placeholder variable for _ in range(1000): # Render the env env.render() # 这里是关键 env.step(env.action_space.sample()) # take a random action 这段代码不多解释,可以参考官方网文档, 其中最关键的是这一句 env.step(env.action_space.sample()) 我们实际上是让平台随机移动,可以想象结果是这样的。 代码控制Agent 一般学习的对象我们叫做机器人或者Agent, 我们怎么简单地让这个Agent 智能一下呢? 最简单的方法就是当棍子向左偏的时候(Angle >0)就向右移动(Action = 1),向右偏(Angle<=0)就向左移动(Action = 0)。代码实现如下: 注意,四个环境变量是需要在obseervation中提取出来的,角度参数就是pole_ang import gym env = gym.make('CartPole-v0') # print(env.action_space.) # #> Discrete(2) # print(env.observation_space) # #> Box(4,) observation = env.reset() for t in range(1000): env.render() cart_pos , cart_vel , pole_ang , ang_vel = observation # Move Cart Right if Pole is Falling to the Right # Angle is measured off straight vertical line if pole_ang > 0: # Move Right action = 1 else: # Move Left action = 0 # Perform Action observation , reward, done, info = env.step(action) print(observation) 效果如下,虽然还是不稳定,但是比让平台随机移动还是有了点效果。 总结 注意上面通过if语句实现对Agent的控制,是完全没有用到机器学习的,因为逻辑是写死的,机器根本就没有“学习”的过程。 这里用这个例子只是简单让读者理解强化学习是什么,就是向人一样,通过行动和环境的反馈不停地修正进行学习的。后续的文章会引入神经网路,让机器学起来。 相关文章AI学习笔记之——如何理解机器学习(Machine Learning)人工智能学习笔记之——人工智能基本概念和词汇人工智能学习笔记二 —— 定义问题 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
前面虽然介绍了概率和贝叶斯网络,但是还是没有正式介绍AI中最重要的算法——机器学习。如果说概率论是机器学习的基石,那么机器学习算法和理论就是支撑整个AI系统的支柱。现在比较火的深度学习神经网路等等其实也就是机器学习的一个具体方法和分支。 我们知道程序员如果你要命令计算机做一件事情,他需要知道解决这个事情的每一个步骤,然后用判断,循环等指令,一步一步地告诉计算机如何去完成。比如自动售货机,计算机从你输入的号码查询到商品的价格和货架的位置,等待你付款成功之后就将商品“吐”出来。对于这种重复性的劳动这种程序是非常高效的。但是某些问题诸如自动驾驶问题,是不可能通过这种方式解决的。所以就有了现在最流行的机器学习。 机器学习就是和人类一样,通过不停地输入数据(信息)然后自动学习解决问题的办法。比如图片识别,小孩子是不可能出生的时候就知道什么是人什么是猫什么是狗,而是家长和老师们不停地在图片,视频或者现实生活当中给他们“指出”这是猫这是狗,小孩看(数据输入)多了自然就知道猫和狗的区别,下次在见到相同的动物也就学会了识别猫狗了。机器学习一样,人类标记(指出)大量带有猫狗的图片“喂”给机器,通过机器学习算法,机器自动就掌握了学习识别猫狗的算法,于是我们就可以用这个经过训练的机器去帮我们去识别猫狗了。 机器学习有很多分类,比如上面识别猫狗的例子就是一种用于分类(Classification)的监督学习算法(Supervised Learning)。那理解机器学习,首先就需要了解机器学习算法是怎么分类的,机器学习算法可以从以下几个角度来进行分类: 1、 学习什么(What) 就是这个机器学习的算法是用来学习什么的,是学习参数(Parameters)的吗?比如下雨的概率。是学习结构(Structure)吗? 比如贝叶斯网络的结构。还是学习隐藏的概念(Hidden concepts)比如广告商发现喜爱广告的不同群体。 2、从那里学习(What From) 是监督学习(Supervised Learning),无监督学习(Unsupervised Learning)还是强化学习(Reinforcement Learning)。前两者的区别是是否有人类标记。而是否是强化学习是指学习者是否是在与环境的互动中不停学习的,比如对话机器人。 3、学来干什么(What for) 是用来预测(Prediction), 比如预测天气;是用来诊断(Diagnostics),比如诊断病情;还是用来总结(Summarize)比如写阅读总结;等等用途 4、怎么学习(How) 是被动(Passive)的吗? 比如学习者是否这是观察者而不会改变环境和数据,还是主动的(Active)。是线上(Online)的还是线下(offline)的这取决于数据是在学习之前产生的还是在学习当中不停地产生。 5、学习的输出(Output) 是分类(Classification)呢(比如识别猫狗)还是回归(regression)比如预测房价。 6 、学习细节(Detail) 学习建立模型是越普遍(generative)越好,还是越特定(Discriminative)越好呢。 上面就从各个角度对不同的机器学习进行分类,虽然看起来比较浮于表面,但是这对真正理解机器学习非常重要,希望在今后的笔记中与大家一起学习,不断进步。 相关文章人工智能学习笔记之——人工智能基本概念和词汇人工智能学习笔记二 —— 定义问题 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
由于工作的关系经常往返于中英之间,以前回去总会带一点现金,最近几乎都用不了什么现金了,一个手机基本搞定衣食住行。 国内的移动支付发展速度真是令人惊讶,微信支付宝普及的程度不仅仅局限于大城市,连我家乡的四线小城的夜市小商贩都挂着各种二维码接受移动支付。与之相比,唯一需要用现金的地方却受限于一些官方的渠道,比如上海的机场大巴,就只接受纸币。 与国内相比,英国的移动支付却发展非常缓慢。目前仅仅在某些大学,大型超市的柜台上偶尔见到支持某某应用的支付的广告,但自己从来没有用过。 移动支付发展缓慢并不代表无现金支付发展缓慢。自己在英国生活的时候,其实一年也用不到几次现金,因为信用卡早已非常普及,特别是最近这几年contactless (闪付)普及之后,我连地铁卡都懒得带了,银行卡既是支付工具,同时又是地铁公交卡,在大伦敦范围内一个支持闪付的银行卡几乎能够满足衣食住行的所有需要了。前几年我一直在用iphone, 将Apple Pay 跟银行卡绑定之后也能直接代替银行卡的闪付功能,几乎能够做到一个手机解决衣食住行的所有需求。 当然闪付功能的银行卡跟手机支付相比还是有很多缺点的: 闪付有额度限制,一次只能支付少于30英镑,超过之后就只能老老实实输密码交易了。 并不是所有的POS机都支持闪付功能,遇到不支持闪付的POS机,也就只能输密码交易了。 升级闪付的POS机是需要花一定成本的,相比二维码的手机支付升级成本太高,所以好多英国的停车场现在都只能投币,于是我的车上必须随时准备大量硬币来应付那些投币的停车场,或者需要投币交过路费的地方。 闪付安全性不如手机移动支付,手机移动支付一般都需要指纹或密码验证,所以即便是手机丢了,别人一般也无法用你的手机进行支付,但是如果你的银行卡或钱包丢了,别人可以用你的银行卡直接刷卡消费。 强大地信用卡体系是阻碍移动支付在英国发展的主要原因,人们已经习惯用信用卡消费,用个人信用贷款,买车,买房,买家具(我有一个沙发300镑免息贷了3年,每个月只需要还几镑钱,反正信用在那里不用白不用),而且信用卡消费各种返点福利,补贴一点不比微信支付宝少。 当然作为一个以金融立国的老牌资本主义国家,人民的智慧也是无穷的,除了我刚刚提到的用Apple Pay 和 Android Pay 代替银卡卡之外呢,出现了好多发虚拟卡的数字银行。这些数字银行没有实体的柜台,但是跟普通银行一样可以发行银行卡,这些银行卡可以通过手机App直接管理,非常安全方便。特别是出国旅行的时候,传统的银行卡在境外用其他货币消费或者取现的话都会有大笔的手续费,而这些数字银行卡几乎没有手续费,相当方便,下图就是我使用过的其中一个卡叫做MONZO。 MONZO银行卡样张 有一次我回家将钱包落在车上,第二天车窗被砸,银行卡都被偷走。打了一圈电话将所有的卡都冻结之后,还是被小偷刷了好几百镑。只有这个MONZO卡,在APP上冻结之后小偷一分钱都没有刷走。当然这些钱银行都如数退给我了,不过花了不少时间成本,也是很不划算的。 最近在@justyy的博客上看到一个叫Wirex 的虚拟银行卡,不仅能够交易法币,还可以交易比特币等虚拟货币。简直将炒币的难度降低了无数个数量级,一不做二不休花了15分钟就申请了一张,并且第一次购买了一点点比特币,这张卡对我这种“炒币”小白真是太友好了。 之后可能会单独写一两篇文章介绍如何用这些虚拟银行卡 "炒币"“炒股”旅游等等。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
Autoencoder 的基本概念 之前的文章介绍过机器学习中的监督学习和非监督学习,其中非监督学习简单来说就是学习人类没有标记过的数据。对于没有标记的数据最常见的应用就是通过聚类(Clustering)的方式将数据进行分类。对于这些数据来说通常有非常多的维度或者说Features。如何降低这些数据的维度或者说“压缩”数据,从而减轻模型学习的负担,我们就要用到Autoencoder了。 用Autoencoder 给数据“压缩”和降维不仅能够给机器“减压”,同时也有利于数据的可视化(人类只能看懂三维的数据)。 Autoencoder 实际上跟普通的神经网络没有什么本质的区别,分为输入层,隐藏层和输出层。唯一比较特殊的是,输入层的输入feature的数量(也就是神经元的数量)要等于输出层。同时要保证输入和输出相等。 结构大概就是如图所示 因为输出要等于输入,所以中间的每一层都最大程度地保留了原有的数据信息,但是由于神经元个数发生了变化,数据的维度也就发生了变化。比如上图的中间层(第三层)只有两个神经元,那么这一层输出的结果实际上就是二维的数据结构。我们就可以用这一层的输出结果进行无监督学习分类,或者做视觉化的展示。 简化的Autoencoder 对于Autoencoder从输入层到最中间层的数据处理过程叫做数据编码(Encode)过程,从中间层到输出层则为解码(Decode)过程,最后保证输出等于输入。 Autoencoder的隐藏层可以是多层也可以是单层,这里我用一个只有一层隐藏层的Autoencoder的实例来介绍Autoencoder. Autoencoder实例代码 1、导入需要用到的库 import numpy as np import matplotlib.pyplot as plt %matplotlib inline 2、创建一个三维的数据 这里用sklearn 的一个make_blobs的工具创造有两个聚集点的三维数据 from sklearn.datasets import make_blobs data = make_blobs(n_samples=100, n_features=3,centers=2,random_state=101) 数据长这个样子 注意data[0]是100x3的数据(100个点,3个features(维度)) 3. 搭建神经网络 下面用Tensorflow Layers来搭一个三层的全连接的神经网路,输入层,隐藏层和输出层的神经元个数分别是3,2,1。 import tensorflow as tf from tensorflow.contrib.layers import fully_connected num_inputs = 3 # 3 dimensional input num_hidden = 2 # 2 dimensional representation num_outputs = num_inputs # Must be true for an autoencoder! learning_rate = 0.01 Placeholder,Layers,Loss Function 和 Optimizer #Placeholder X = tf.placeholder(tf.float32, shape=[None, num_inputs]) #Layers hidden = fully_connected(X, num_hidden, activation_fn=None) outputs = fully_connected(hidden, num_outputs, activation_fn=None) #Loss Function loss = tf.reduce_mean(tf.square(outputs - X)) # MSE #Optimizer optimizer = tf.train.AdamOptimizer(learning_rate) train = optimizer.minimize( loss) #Init init = tf.global_variables_initializer() 4. 训练神经网络 num_steps = 1000 with tf.Session() as sess: sess.run(init) for iteration in range(num_steps): sess.run(train,feed_dict={X: scaled_data}) # Now ask for the hidden layer output (the 2 dimensional output) output_2d = hidden.eval(feed_dict={X: scaled_data}) 注意:output_2d就是中间层输出的结果,这是一个二维(100x2)的数据。 这个数据长这个样子 4.总结 从上面的例子可以看到,Autoencoder 不是简单地去掉一个维度,而是通过编码的过程将数据“压缩”到二维。这些数据通过解码过程可以再次在输出层输出三维的数据,并且保留了元数据的两个积聚点。 上面只是一个非常简单的将三维数据通过Autoencoder降到二维空间,当数据的feature 太多的时候,通过Autoencoder 就可以在最大限度保留原数据的信息并降低源数据的维度。 ———— 相关文章AI学习笔记——循环神经网络(RNN)的基本概念AI学习笔记——神经网络和深度学习AI学习笔记——卷积神经网络1(CNN) ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
之前的文章简单介绍了Kaggle平台以及如何用支撑向量(SVM)的机器学习算法识别手写数字图片。可见即使不用神经网络,传统的机器学习算法在图像识别的领域也能取得不错的成绩(我跑出来了97.2% 的正确率), 但是要将正确率再往上提升就会遇到瓶颈了。 此时,神经网络以及深度学习,尤其是卷积神经网路(CNN)就派上用场了。 用CNN的网络,在同样的平台上,目前我将手写图片识别的正确率提高到了99.1%,排名全球900多名左右。 1、导入库文件 使用深度学习的方法当然就要用到大名鼎鼎的TensorFlow。 import pandas as pd import math import numpy as np import matplotlib.pyplot as plt, matplotlib.image as mpimg from sklearn.model_selection import train_test_split import tensorflow as tf %matplotlib inline 2、准备数据 与之前一样,需要对数据进行分成Train 和 Test 两个组。 labeled_images = pd.read_csv('train.csv') images = labeled_images.iloc[:,1:] labels = labeled_images.iloc[:,:1] train_images, test_images,train_labels, test_labels = train_test_split(images, labels, test_size=0.02) 3、创建帮助函数 这是本问最难的部分,作用实际上就是对数据进行处理,转换成TensorFlow 读得懂的数据。 One Hot Encode 我们知道,这些图片的标签(识别结果)就是是0到9的10个数字,结果就是一个nx1的矩阵,n是训练样本的个数。为了让模型更加方便地处理数据(计算机是二进制的,最好给它0,1的数据),需要将数据转换成nx10的矩阵。比如果其中一个样板的标记是3,那么这一行的数列就应该是[0,0,0,1,0,0,0,0,0,0], 如果是9的话[0,0,0,0,0,0,0,0,0,1]。所有的样本叠起来就是一个nx10的矩阵。 def one_hot_encode(vec, vals=10): ''' For use to one-hot encode the 10- possible labels ''' n = len(vec) out = np.zeros((n, vals)) out[range(n), vec] = 1 return out 帮助类 从AI学习笔记——卷积神经网络(CNN)的文章中我们知道,一张图片有三个维度——长,宽,颜色通道。对于本文中的黑色图片,第三个维度为1。在加上样本的个数(n),整个训练样本应该是一个(nx28x28x1)的四维Tensor(张量)。set_up_images(self)函数就是将图片转换成这样的Tensor。next_batch()函数则是n个训练样本分成若干个batch, 一个一个地送给模型(这个叫mini batch)。 class CifarHelper(): def __init__(self): self.i = 0 # Intialize some empty variables for later on self.training_images = None self.training_labels = None self.test_images = None self.test_labels = None def set_up_images(self): print("Setting Up Training Images and Labels") # Vertically stacks the training images self.training_images = train_images.as_matrix() train_len = self.training_images.shape[0] # Reshapes and normalizes training images self.training_images = self.training_images.reshape(train_len,28,28,1)/255 # One hot Encodes the training labels (e.g. [0,0,0,1,0,0,0,0,0,0]) self.training_labels = one_hot_encode(train_labels.as_matrix().reshape(-1), 10) print("Setting Up Test Images and Labels") # Vertically stacks the test images self.test_images = test_images.as_matrix() test_len = self.test_images.shape[0] # Reshapes and normalizes test images self.test_images = self.test_images.reshape(test_len,28,28,1)/255 # One hot Encodes the test labels (e.g. [0,0,0,1,0,0,0,0,0,0]) self.test_labels = one_hot_encode(test_labels.as_matrix().reshape(-1), 10) def next_batch(self, batch_size): # Note that the 100 dimension in the reshape call is set by an assumed batch size of 100 x = self.training_images[self.i:self.i+batch_size] y = self.training_labels[self.i:self.i+batch_size] self.i = (self.i + batch_size) % len(self.training_images) return x, y 最后这两行代码就完成了数据的初始化。 # Before Your tf.Session run these two lines ch = CifarHelper() ch.set_up_images() # During your session to grab the next batch use this line # (Just like we did for mnist.train.next_batch) # batch = ch.next_batch(100) 4、创建模型 这里用到了TensorFlow, 也许会之后在单独的文章中介绍如何使用,这里简单介绍一下。 使用TensorFlow 首先是要创建一个 computation graph(计算图谱),也就是先告诉计算机模型是怎样的,包括神经网络有多少层,每层多少个神经元,输入输出数据的格式是怎的。此时还没有开始计算。 Placeholder x 输入,y输出,hold_prob用于dropout(不多解释,主要用于随机丢弃神经元的一种正则化的方法) x = tf.placeholder(tf.float32, shape=[None,28,28,1]) y_true = tf.placeholder(tf.float32, shape=[None,10]) hold_prob = tf.placeholder(tf.float32) Help functions 这些函数是为了简化Tensorflow 创建神经网络的方法,根据从之前文章对CNN的介绍,我们需要卷积层,Pooling(池化)层,以及全连接层等等。 def init_weights(shape): init_random_dist = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(init_random_dist) def init_bias(shape): init_bias_vals = tf.constant(0.1, shape=shape) return tf.Variable(init_bias_vals) def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') # x -->[batch, in_height, in_width, in_channels] # W --> [filter_height, filter_width, in_channels, out_channels] def max_pool_2by2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') def convolutional_layer(input_x, shape): W = init_weights(shape) b = init_bias([shape[3]]) return tf.nn.relu(conv2d(input_x, W) + b) def normal_full_layer(input_layer, size): input_size = int(input_layer.get_shape()[1]) W = init_weights([input_size, size]) b = init_bias([size]) return tf.matmul(input_layer, W) + b 搭建神经网络 第一层,卷积+Pooling convo_1 = convolutional_layer(x,shape=[6,6,1,32]) convo_1_pooling = max_pool_2by2(convo_1) 第二层 convo_2 = convolutional_layer(convo_1_pooling,shape=[6,6,32,64]) convo_2_pooling = max_pool_2by2(convo_2) 第三层, 全连接 convo_2_flat = tf.reshape(convo_2_pooling,[-1,7*7*64]) full_layer_one = tf.nn.relu(normal_full_layer(convo_2_flat,1024)) Dropout 和 输出 full_one_dropout = tf.nn.dropout(full_layer_one,keep_prob=hold_prob) y_pred = normal_full_layer(full_one_dropout,10) 定义损失函数,和优化函数,初始化 Loss Function cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_pred)) Optimizer optimizer = tf.train.AdamOptimizer(learning_rate=0.00002) train = optimizer.minimize(cross_entropy) Intialize Variables init = tf.global_variables_initializer() 5、训练模型 之前的准备工作妥当之后,实际上训练模型的代码就很短了。用Tensorflow训练模型,都必须在一个Session 之内并且初始化(都是套路)。 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) 真正的代码就这两行, 实际上就是将之前帮助函数中定义的mini batch 送到模型中进行训练。 for i in range(50000): batch = ch.next_batch(100) sess.run(train, feed_dict={x: batch[0], y_true: batch[1], hold_prob: 0.5}) 模型要进行50000次的迭代,我们需要将每100此迭代的结果打印出来。完整代码如下 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(50000): batch = ch.next_batch(100) sess.run(train, feed_dict={x: batch[0], y_true: batch[1], hold_prob: 0.5}) # PRINT OUT A MESSAGE EVERY 100 STEPS if i%100 == 0: print('Currently on step {}'.format(i)) print('Accuracy is:') # Test the Train Model matches = tf.equal(tf.argmax(y_pred,1),tf.argmax(y_true,1)) acc = tf.reduce_mean(tf.cast(matches,tf.float32)) print(sess.run(acc,feed_dict={x:ch.test_images,y_true:ch.test_labels,hold_prob:1.0})) print('\n') saver.save(sess,'models_saving/my_model.ckpt') 最后得到了98%的准确率 Currently on step 0 Accuracy is: 0.179762 Currently on step 100 Accuracy is: 0.584524 .... .... .... Currently on step 49900 Accuracy is: 0.983333 至此,一个完整的用Tensorflow 训练CNN的过程就介绍完了,当然要最后还需要保存模型,用模型对新的数据进行预测,关于这部分的内容就留给读者自己吧。 ———— 相关文章 AI学习笔记——神经网络和深度学习AI学习笔记——卷积神经网络1(CNN) ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
之前写了关于人工智能和机器学习的理论基础文章,今天就理论联系实际,用机器学习算法跑个分。 机器学习最重要的就是数据,Kaggle平台提供了大量数据为机器学习的学习者和研究者提供一个跑分的平台。注册账号登录之后就可以进入比赛了,初学者可以从Digit Recognizer入手,也就是识别手工书写的数字。 作为一个菜鸟,我目前最好的成绩是识别率97.228 排名第1189位。 这个成绩是我用支撑向量(SVM)算法获得的,所以今天就来介绍如何用SVM来实现识别手写数字。 一、下载处理数据 首先导入需要用到的python库文件, pandas 和 sklearn 是机器学习非常重要的库文件。 import pandas as pd import matplotlib.pyplot as plt, matplotlib.image as mpimg from sklearn.model_selection import train_test_split from sklearn import svm %matplotlib inline 数据文件是csv格式的所以需要用panda 库来处理 labeled_images = pd.read_csv('train.csv') images = labeled_images.iloc[:,1:] labels = labeled_images.iloc[:,:1] train_images, test_images,train_labels, test_labels = train_test_split(images, labels, train_size=0.95, random_state=0) train_test_split 函数是用来将数据成两组,训练组和验证组,其中训练组占95%。 每一张图片实际上是一个28 x 28 的黑白带灰阶的图片。 image.png 学习之前还需要将数据normalize, 这里用到了sklearn 中的 standardscaler 函数 image.png 二、用Sklearn的SVM学习数据 将normalize 后的数据送进分类器中,总共四行代码完成训练和评分,结果是0.977142的准确率 from sklearn.svm import SVC clf = svm.SVC(kernel = "poly", degree = 3, coef0=0.1, C=100) clf.fit(train_images_scaled, train_labels.values.ravel()) clf.score(test_images_scaled,test_labels) 三、用训练好的分类器来标记数据 导入未标记的测试数据,result 就是标记后的数据 test_data=pd.read_csv('test.csv') test_data_scaled = scaler.transform(test_data) results=clf.predict(test_data_scaled) 这就是我用SVM训练分类器,并用分类器标记数据,最后取得97%准确率的训练结果的所有代码,是不是很简单。 ———— 相关文章AI学习笔记——循环神经网络(RNN)的基本概念AI学习笔记——神经网络和深度学习AI学习笔记——卷积神经网络1(CNN) ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
在之前的文章中介绍了经典的机器学习算法,深度学习算法等等,但是在这些算法的应用中有几个非常关键又很容易混淆的概念必须要强调一下。 1、数据分组 机器学习的数据一般会分为 train(训练), development(验证) 和 test(测试) 三个组。有时候可以将development 和 test 合并统称为dev/test set。 train 和 dev/test 在数据量较小的时候可以遵循70%和30%的分组原则,在数据量特别大的情况下dev/test 组比例可以减小。但最重要的是train 和 dev/test sets 的数据分布要尽可能一致。 2、Precision(准确率)和 Recall(召回率) 中文中“准确率”“精确率”经常混用来表示英文中的Precision 和 Accuracy ,然而这两个概念在数学上这两个词是不同的,为了避免歧义,这里统一用英文表达。Precison和Recall都有相应的数学公式,可以很容易google得到。在这里通过实例和图形直观理解这两个概念的含义。 如上图,比如在测试火灾报警器的性能的时候,左边淡绿色的方框是真实发生火灾的事件,右边方框是没有发生火灾的事件。左半边圆圈是发生火灾并报警的事件,右边圆圈是没有发生火灾而误报的情况。 如图所示,Precision :所有报警的事件中真实发生火灾的比例。它的反义词更好理解就是误报率Recall:所有发生火灾的事件中报警的比例。它的反义词更好理解就是漏报率 当然还有一个容易与Precision 混淆的概念,Accuracy (准确率)—就是所有正确报警的事件除以所有事件,错误率(Error)就是准确率的反义词。 Precision 和 Recall 是两个矛盾的参数,这个也很好理解,提高报警器的敏感度必然会减少漏报率,但是同时误报率也会增加。所以在评价一个模型的好坏的时候,往往这两个参数都要考虑,当然也有F1参数将Precision和Recall 统一起来了。 3、Bias(方差) 和 Variance(偏差) 我发现这两个概念的英文也更好理解,所以我也会直接用Bias 和 Variance 来解释这两个概念。 同样的,如上图以打靶为例,Bias 就是弹孔偏离靶心的距离,偏得越远Bias 就越高。Variance 就是弹孔发散程度,越发散,Variance 就越高。 一般来说,在机器学习中Bias 是指模型在Train set(训练集)中的错误率。Variance是在Dev set(验证集)中的错误率减去Train set(训练集)中的错误率 在机器学习中,Bias 和Variance 的分析非常重要,因为直接关系到训练的模型是overfitting(过拟合) 还是underfiting(欠拟合)。 4、 Overfitting (过拟合) 和Underfiting(欠拟合) 比如理想状况下一个模型的错误率是(Optimal error rate (“unavoidable bias”))是5%。那我们来分析一下下面的例子。 Train Set 错误率 = 6% Dev Set 错误率 = 7% 这是接近理想的状况,模型既没有Overfitting 也没有Underfitting. Bias 是6%接近unavoidable bias,Variance是1%(7%-6%)。 Train Set 错误率 = 3% Dev Set 错误率 = 16% 这种情况Variance 非常高(16%-3% =13%), 是典型的Overfitting的情况。 Train Set 错误率 = 15% Dev Set 错误率 = 16% 这种情况Bias 非常高,是典型的Underfitting的情况。 Train Set 错误率 = 15% Dev Set 错误率 = 30% Bias 和 Variance 都非常高,同时Overfitting 和 Underfitting. 以上的几个概念是非常重要又容易混淆的概念,通过举例而不是罗列公式从感性上理解这些概念对于理解机器学习,优化机器学习模型非常有用。 ———— 相关文章AI学习笔记——循环神经网络(RNN)的基本概念AI学习笔记——神经网络和深度学习AI学习笔记——卷积神经网络1(CNN) ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
五月的英国真是美好,月初和月末的周一都是Bank holiday。Bank holiday 实际上就是法定公共假期,英国的假期相比中国真是少得可怜,算上圣诞、新年全年加起来也只有8天。每次看到国内一会儿国庆,一会儿清明,一会儿中秋,真是羡慕得要死。五月初的Bank holiday 刚好临近国内的五一假期,所以早早就盘算起假期该怎么过了。 这是有娃之后的第一次长途旅行,由于要定时给娃喂奶,我们把时间计划得充裕一些,为此周五还专门请了一天的假。周五和周一两天都在路上,实际上玩耍的时间也就只有周六和周日两天。 说几个印象比较深刻的景点吧,第一个是Black mountain pass。这是一条蜿蜒的公路,刚好穿过 威尔士brecon beacons国家公园, 作为Top Gear 的御用公路,不仅景色迷人,而且蜿蜒崎岖,非常考验驾驶者的技巧和汽车的性能。 Black mountain pass 第二个是坐落在威尔士首府卡迪夫的国家博物馆。跟英国大多数博物馆一样,可以免费参观。比起伦敦拥挤的大英博物馆和国家美术馆,这个博物馆安静,但并不冷清。各种设施,尤其是让妈妈给孩子喂奶的育婴室也设计得非常人性化。这个博物馆的镇馆之宝是这幅,法国著名画家雷诺阿的『巴黎的女人』 巴黎的女人 最后一个也是坐落于卡迪夫市中心的,卡迪夫城堡。城堡其实我已经去过好多了,但大多建在郊外。这座城市中心的城堡真是器宇非凡。由于带着孩子,不方便入内参观,不过仅仅是在外面看看,在城堡后面的公园逛逛也是很值得的。 城堡里面 城堡大门 城堡后的公园 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
继续折腾我家的PC,上次我说到在PC上做了两件事,第一装了个黑苹果第二是在Windows 10 上面运行Ubuntu, 工欲善其事必先利其器,两个系统上用的最多的肯定就是终端了,Mac的默认的终端白底黑字,非常难看,Windows下的Ubuntu虽然多了色彩,但是也继承了Win下难看的字体非常难受,于是决定美化一下。 终端的主题我一直比较喜欢solarized ,下载之后直接打开/osx-terminal.app-colors-solarized目录下的主题配置文件,然后然后配置终端:先打开终端:终端---偏好设置---设置----选中 Solarized Dark主题---设置默认。就搞定了 Windows下就更简单了,有一个注册表文件安装之后就搞定了。 image.png Mac设置完主题只是第一步,还需要设置语法高亮。 设置语法高亮需要打开 ~/.bash_profile 文件进行配置。 针对terminal采用bash模式: 编辑 ~/.bash_profile, 加入以下代码: Bash代码 export CLICOLOR=1 export LSCOLORS=gxfxaxdxcxegedabagacad 保存,然后重启terminal,搞定。 Win下就更简单了,在窗口点击右键设置好字体就搞定了。 image.png 其实我是个Linux的菜鸟,在美化Mac终端和配置Linux的环境变量的时候还是学到不少东西。 在Mac中设置环境变量是在 ~/.bash_profile文件中 在Linux中是在~/.bashrc文件中 在这两文本个文件中,更强大的是可以配置环境变量的路径。比如我在Linux中安装了Anaconda,终端中输入conda 没有反应,这就是环境变量路径没有配置好的原因,这时只需要在那个文本文件中加入路径就好了,如下例 export PATH=/opt/local/bin:/opt/local/sbin:$PATH 最后在晒一下Mac终端配置的结果,Win下再怎么调都达不到Mac的效果。 image.png 相关文章装了一台『黑苹果』将黑苹果降级了 并上了Raid磁盘阵列终于在两台Mac上配置好了Tensorflow GPU在Windows10中运行Unbuntu 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
目前深度学习和神经网络算法最典型的有两个应用实例,一个是图像识别,一个是语音识别。上一篇文章讲到图形识别的卷积神经网络(CNN)就广泛应用在了图像别方面,而这篇文章就来讲另一个广泛应用于语音识别的算法循环神经网络(RNN)。 如果说CNN通过滤波器识别出图片中空间像素的关系,那么RNN就能够在时间序列的数据中找到规律,从而预测未来。所以RNN与CNN最大的不同就是, RNN的神经元输入的不仅是要有当前时间点的数据,还需要之前时间点的输出结果。因为当前的输出是跟之前(甚至是之后)的输出是相关的。 举一个简单的例子,给你一组数据【1,2,3,4,5,6】,让你将时间窗口向未来移动一步,你很容易就可以得到结果【2,3,4,5,6,7】。你给出答案7,是因为你发现了7跟6的关系,6跟5的关系,一次类推,RNN的基本原理是这样,就是发现时间序列上输入与输出之间的 关系。 1. RNN基本结构 跟普通神经网路的神经元一样,输入和输出之间是一个线性函数和一个非线性的激活函数如图 image.png 只不过在神经元会将输出结果又返回给输入端,如果将这个过程在时间的维度上展开就是这个样子的 image.png 当然一层也可以拥有多个神经元 image.png 2.RNN的应用实例 RNN并不是每个神经元都要有输入跟输出,输入跟输出可以是多对多(输入输出一一对应)多对一,一对多,多对多(输入和输出并非一一对应的) 举一个多对多,输入输出一一对应的例子。比如给一段话" Tom is very happy to play with Bill" ,让你判断这句话中每一个单词是否是人名。那输出就应该是[1, 0, 0, 0, 0, 1],"1"代表是人名,"0"代表不是人名。这就是典型的多对多一一对应的例子 image.png 当然也有多对一的例子,比如,输入是一段话的影评,然后输出是一个评分的数字。 image.png 一对多的例子也有很多,比如给一个开头的基调让机器谱曲。 image.png 最后是多对多,但并非一一对应的RNN。这种情况典型应用就是翻译,因为每种语言的词汇都不是一一对应的。 image.png RNN的基本概念就是这么简单,之后的文章会继续深入介绍一下RNN的具体模型以及在文字处理方面的应用。 本文和之前的文章中用到了twitter上TessFerrandez在吴恩达深度学习课程的笔记,在此对TessFerrandez的精美笔记表示感谢。 ———— 相关文章AI学习笔记——神经网络和深度学习AI学习笔记——卷积神经网络1(CNN) ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
image.png 上一篇博文用癌症检测的问题,发现即便是被准确率高达90%的仪器检测出了癌症,但实际得癌症的概率却如此之低。从这个例子引出了贝叶斯定理这个工具,利用这个工具可以计算一个普遍的问题那就是“检测问题”。如图,A是无法观察到的(是否是癌症患者),B是可以观测到的(仪器检测是否成阳性)。B关联于A,在知道B的结果的情况下求A的概率。 image.png 这两个相互关联的事件其实构成了一个简单的贝叶斯网络。 回到癌症检测这个问题来,如果你去医院连续做了两次癌症检测,这两次癌症检测的结果是关联的吗? 答案是关联的,也就是说第一次检测的结果会影响到第二次检测的结果。这个也很好理解,就是如果第一次检测成阳性,那么第二次检测成阳性的概率肯定就会增大。这也可以用贝叶斯网络画出一个简单的关系。如图三个事件的关系,T1和T2就是两次检测结果,C是指这个人是否患癌症。 image.png 那如果已知病人患癌症,那第一次和第二次的检测结果还互相关联吗? 答案是两次检测结果相互独立不再关联。这个也很好理解,癌症患者被检测到结果成阳性的概率P(+|C)只与机器的准确率有关系,跟你测一万次被检测到成阳性的概率都是90%,跟你前一次检测结果毫无关系。 再举一个例子,比如我今天的心情的好坏只与两个事件有关,第一是今天的天气是否晴朗,第二是我是否加薪。贝叶斯网络如下图, image.png 现在第一个问题是:我加薪的概率与今天天气是否晴朗的概率是否关联? 估计你用脚趾都能算出来,我加薪的概率跟天气没有半毛钱关系,两者相互独立! 那如果我今天很高兴呢?(也就是我的心情是知道的),那天气和加薪是否相互独立呢? 答案是这种情况下两者是关联的,而非相互独立的。为什么呢?如果你发现我今天很高兴,然后你看今天天气又不好,那我们今天加薪的概率肯定就回提高嘛。也就是说天气是否晴朗的概率就影响了我是否加薪的概率。 这种比较简单的贝叶斯网络很好理解,那复杂的情况怎么办呢,比如汽车故障的检测问题,如下图: image.png 如此多的事件相互关联,如何判断每个事件是否相互关联呢? 其实我们只需要将贝叶斯网络的几个基本关系就可以了,如图 image.png 左边Active triplets 表示事件互相关联的情况,其中第一和第二张图很好理解,第三张图实际上就是我举的天气的例子(已知我很高兴,那天气是否晴朗跟我是否加薪就关联了)。第四张图可以这样理解,比如我是否高兴与我是否出去跑步相关联,那如果已你看到我今天在外面跑步,那你就知道了我今天高兴的概率肯定很高,于是加薪和天气这两个事件就关联起来了。 右边Inactive triplets表示事件相互独立的情况,第二张图和地三张图我在文中的例子中已经给出来了,第一张图的情况也很好理解,比如三个事件分别代表我是否加薪,我是否高兴,和我是否出去跑步。在不知道我心情的情况下我出去跑步的概率显然受我是否加薪影响。那如果已知我很高兴了,那我是否出去跑步就只与我高兴的程度有关了是不是?而与我是否加薪就没关系了(相互独立了) OK知道上面那个图就很好判断事件的相互联系了, 给个思考题目吧,如图:F是否与A独立?在不知道任何事件的情况下(F⊥A)?;已知D的情况下(F⊥A | D)?;已知G的情况下(F⊥A | G)?;已知H的情况下(F⊥A | H)? image.png 欢迎留言讨论。 相关文章 如果体检癌症检测成阳性(准确率为90%)……怎么办人工智能学习笔记之——人工智能基本概念和词汇人工智能学习笔记二 —— 定义问题
image.png 如果你去医院体检发现癌症检测为阳性,而检测准确率为90%(检测成阳性而且确实有癌症P( + | C) ),你真正得了癌症的概率是多少? 当然我还得给你两个数据比如 1、癌症患者占人口总数的比如1%(P(C) = 0.01) 2、检测的误诊率20%(没有癌症但是检测成阳性P( + | -C)) 这三个条件下你能算出你确实得癌症(检查为阳性)(P(C|+))概率吗? ------答案在分割线下面-------- 答案是4.3%, 其实有很大概率你是没有癌症的,所以不必惊慌。 概率有多重要,记得当年在学习量子物理的时候,发现这是理解量子世界最重要的概念,没有之一。同时,现代金融,理财甚至赌博行业,都是概率理论在起着决定性作用。 概率思维是一个很重要的思维,特别是在机器学习领域,机器学习领域有一个用得非常广泛的方法叫做“朴素贝叶斯(Naive Bayes)”方法的核心就是概率理论。 那刚刚那个癌症的例子是怎么计算得到的呢? 概率理论有几个关键概念 1、独立事件和联合事件 比如抛硬币,每次拋都是独立事件,正反面的概率都是0.5。 独立事件同时发生比如抛两次都是正面的概率是0.5x0.5 = 0.25. 同时发生这种情况是两个相互独立事件的联合事件。 2、关联事件 比如天气,假设只有天晴和下雨两种状态,第一天天晴的概率是, P1(晴)=0.5,第二天天晴的概率是在第一天的基础上的关联事件, P2(晴|晴)=0.8。第一天晴第二天还是晴的联合事件的概率是P1(晴)*P2(晴|晴)=0.4, 那是不是说第二天天晴的概率就是0.4呢,当然不是,因为第一天还可能下雨,需要加上第一天下雨第二天也是晴天的概率。正确的算法是 因为第一天晴的概率是0.8 那么第一天下雨的概率是P1(雨) = 1-0.5 = 0.5, 这种情况下,如果第二天还是晴天的概率也要给出比如P2(晴|雨)=0.3,只有知道了 P1(晴),P2(晴|晴) 和P2(晴|雨)这三个条件我们才能算出第二天甚至第三天第四天天晴下雨的概率。 所以第二天, P2(晴) = P1(晴)P2(晴|晴) + P1(雨)P2(晴|雨) = 0.50.8 + 0.50.3 = 0.45。 癌症的例子怎么算呢?因为癌症患者的比例和被检测出阳性是一个关联事件,所以需要计算出两个联合事件: 1、癌症患者同时又被检测出来成阳性的概率 P(C, +) = P(C) * P( + | C) = 0.009 2、癌症患者但同时检测出来成阴性的概率 P(C, -) = P(C) * P( - | C) =0.001 所以最后你是癌症患者同时又被检查出来的概率 P(C|+) = P(C, +) /(P(C, +) +P(C, -)) = 0.043 3、贝叶斯法则(Bayes Rule) 对于癌症检测这类问题的概率计算方法实际上有一个法则叫做贝叶斯法则(Bayes Rule) image.png 参考维基百科:https://zh.wikipedia.org/wiki/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86 于是 套用上面的公式也是可以的到计算结果的 P(c | +) = P(+|c)* P(c)/P(+) = P(+|c)* P(c)/( P(+|c)* P(c) + P(+|-c)* P(-c)) 其实还有一个更简便的公式,可以更方便地计算如果两次都被检查出阳性那真正换癌症的概率,我就不做解释了贴出来放在这里,如果有疑问欢迎留言讨论: image.png
image.png 西方人结婚之后女方往往都会改成男方的姓氏,所以别人知道已婚夫妇的其中一人的姓氏之后就会默认另一个也是这个姓氏,之后称呼俩人的时候就直接Mr and Mrs xxx 就完了。比如如果我老婆去餐厅用她的名字订了位置, 服务生知道我们是夫妇的情况下,往往问都不会再问,直接就把她的姓冠在了我身上,反之亦然。这种时候往往都会搞得我们两人很尴尬。 还有一次,老婆拿了刚拿到驾照,我需要给保险公司打电话把她的名字加到我的车子名下。为了避免对方把她的姓氏写错,我在电话里面将她的全名的每一个字母都拼了出来。但最后收到确认信的时候我却哭笑不得,对方以为我只报了名而没有报姓,所以直接在她全名后面冠上了我的姓氏(英国人名在前,姓在后)。如果说一般情况也就算了,但是汽车保险名字可错不得,于是不得不再次打电话修改姓名,真是麻烦死了。 跟中国人刚好相反,英国人名字相同的特别多,到处都是John, Tom, Bill... 但是姓氏重复的确很少。所以往往会以姓氏来区分身份。 西方女权运动比中国早了百年,但妇随夫姓这个传统到现在还没赶上中国的脚步,我也因此在这边遇到了好多尴尬的场景。这一点你们是怎么看的呢?欢迎留言讨论.
image.png 上篇文章简单地地介绍了神经网络和深度学习,在神经网络中,每一层的每个神经元都与下一层的每个神经元相连(如下图), 这种连接关系叫全连接(Full Connected)。如果以图像识别为例,输入就是是每个像素点,那么每一个像素点两两之间的关系(无论相隔多远),都被下一层的神经元"计算"了。 这种全连接的方法用在图像识别上面就显得太"笨"了,因为图像识别首先得找到图片中各个部分的"边缘"和"轮廓",而"边缘"和"轮廓"只与相邻近的像素们有关。 这个时候卷积神经网络(CNN)就派上用场了,卷积神经网络可以简单地理解为,用滤波器(Filter)将相邻像素之间的"轮廓"过滤出来。 image.png 卷积(Convolution) 卷积的滤波器(Filter)是如何工作的呢?以下图,一个6x6的图片被一个3x3的滤波器(可以看成一个窗口)卷积为例,3x3的滤波器先和6x6的图片最左上角的3x3矩阵卷积得到结果后,再向右移一步继续卷积(窗口滑动),直到将整个图片过滤完成,输出一个4x4的矩阵(图片)。 image.png 这样有什么意义呢?如果如下图所示,被卷积的图片有明显的竖直轮廓(10和0之间有一轮廓,这条轮廓需要被标记出来),用3x3的竖直轮廓滤波器卷积之后,就能发现中间那条非常明显的竖直轮廓(中间30的两个竖排矩阵将竖直的轮廓位置明显地标记了出来)。 image.png 填充(Padding) 上面的例子用3x3的将6x6的图片过滤之后输出了一个4x4的图片,那如果我想保证输入和输出的图片尺寸一致怎么办?这个时候我们可以在原图片的边缘进行填充(Padding),以保证输入和输出的图片尺寸一致。下图就是用0在原图上Padding了一圈。 image.png 步长 (Stride) 上面提到用3x3的过滤器去卷积6x6的图片是通过窗口一步一步的移动最终将整个图片卷积完成的,实际上移动的步伐可以迈得更大,这个步伐的长度就叫做步长(Stride)。步长(Stride)和填充(Padding)的大小一起决定了输出层图像的尺寸。 image.png 深度(Depth) 这里的深度是指输出层图片的深度,通常图片有红绿蓝(RGB)三个颜色通道(Channel),那一个滤波器也需要三层滤波器对每个颜色通道进行过滤,于是6x6x3的图片经过3x3x3的滤波器过滤之后最终会得到一个4x4x1的图片,此时输出层图片的深度就是1。 image.png 增加滤波器的个数就能增加输出层图片的深度,同时滤波器的个数也决定了输出层图片的深度(两者相等)。下图两个3x3x3的滤波器将6x6x3的图片过滤得到一个4x4x2的图片。 image.png 单层完整的CNN 全连接的DNN,每一层包含一个线性函数和一个激活函数,CNN也一样,在滤波器之后还需要一个激活层,在图像识别应用中,激活层通常用的是Relu函数。线性函数有权重W和偏置b,CNN的权重W就是滤波器的数值,偏置b可以加载Relu之后,一个完整的CNN层如下: image.png 池化(Pooling) 用滤波器进行窗口滑动过程中,�实际上"重叠"计算了很多冗余的信息,而池化操作就是去除这些冗余信息,并加快运动。Pooling的方式其实有多种,用的最多的是max-pooling就是取一个区域中最大的值,如图将一个4x4的图片max-pooling 一个2x2的图片。 image.png 一个完整的深度CNN网络 一个完整的深度CNN网络,通常由多个卷积层加池化层和最后一个或多个完整层(Full connected(FC))构成,如图: image.png 好了,深度卷积神经网络就介绍完了,中间引入了不少概念,理解了这些概念其实CNN网络也十分简单。 本文和之前的文章中用到了twitter上@TessFerrandez在吴恩达深度学习课程的笔记,在此对@TessFerrandez的精美笔记表示感谢。 ———— 相关文章AI学习笔记——神经网络和深度学习 ———— 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
在之前的文章里面,我介绍了机器学习的很多经典算法,其中有一个叫做『神经网络』的算法目前最受追捧,因为击败李世石的阿尔法狗所用到的算法实际上就是基于神经网络的深度学习算法。由于其算法结构类似于人脑神经结构,所以人们对他给予了厚望,希望通过神经网络算法实现真正的AI。 神经网络(Neural Network(NN)) 一个典型的神经网络如下图 image.png 其最基本的神经元是由一个线性函数和一个非线性的激活函数组成: image.png 这个线性函数与之前线性回归是一样的,而激活函数可以理解为将输出的结果进行调控,比如使其保证在0和1之间。 与线性回归一样,神经网络实际上就是要训练找到合适的w 和 b。与线性回归一样,使用梯度下降(Grident Dscent)法,即可得到最优 的w和b。 非线性的激活函数有很多类,如图: image.png Sigmoid 是早期比较流行的,不过现在用的最多的是ReLu,为什么简单的Relu能够比看起来更加合理的Sigmoid 更加有效,并不是这篇笔记要探讨的话题。至于为什么要用激活函数,我想也很好理解,如果整个神经网络全是线性的话,那么无论这个网络有多复杂,最终都只是一个线性的,然而我们这个世界上的事物用线性模型就都能解释吗,显然不行。 深度神经网络(Deep Neural Network (DNN)) 深度神经网络实际上就是将神经网络进行叠加,而中间层叫做隐藏层(Hiden layer), 隐藏层能够分辨出浅层神经网络无法分辨的细节。 image.png 前向传播和反向传播(Forward and Backward propagation) 前向传播其实很简单,就是如何堆砌这个神经网络,多少个Feature 输入,多少层神经网络,每层多少个神经元,每一层用什么激活函数。 最困难的是反向传播,类似于线性回归一样,我们的目的是要用合适的参数(W和b)使这个网络,或者说整个模型预测的值最接近真实的数值,换句话说就是预测值与真实值的差距最小。这个求这个差值的函数我们叫代价函数(Cost Function), 而反向传播就是通过预测结果,向前倒推每一层W和b的导数。通过这个导数我们就可以用梯度下降的方法训练出代价函数最小的W和b值。 反向传播涉及到了微分,和偏微分(偏导)递归等数学原理,虽然也不难,但是也并不在本文的讨论范围之内。不过好消息是在现在流行的深度学习工具中,比如在Tensorflow中, 我们只需要关心如何搭建这个网络(前向传播),工具会自动通过反向传播计算最优解,所以这部分我想留在后续Tensorflow 的文章中详细讲解。 其实听起来高大上的NN和DNN是不是很简单。 相关文章AI 学习笔记之——监督学习一朴素贝叶斯(Supervised Learning) 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
之前我说通过某宝将家里面的PC装了上了黑苹果,用淘宝是因为不想折腾,想省时间。事实证明我还是一个爱折腾的人。 某宝店家装的是最新版的macOS High Sierra,由于官方的显卡驱动有问题,店家还专门帮我降到了之前的版本。后来越用觉得越卡,对比6年前的Macbook Pro, 简直是卡到爆。一开始我以为是内存不足,笔记本上面用的是16G的内存,PC上只有8个G。上亚马逊查了内存的价格之后便默默地放弃了。 多年来手机平板被苹果"强制"升级多次,升级多次造成各种卡顿和不兼容,所以我的苹果设备都不会主动升级到最新版本。这次PC上的卡顿多半是因为升级后的心系统还没有优化好造成的。 一不做二不休,开始研究起自己装苹果来。找店家装过系统有三个好处,第一是证明我的硬件是可以装黑苹果的,第二是黑苹果的系统做了备份,自己装坏了的话至少可以恢复。第三也是最重要的,就是不用自己配置繁琐的Clover引导文件。 最后顺便介绍一下超简单的黑苹果教程 1、下载一个带clover的苹果系统镜像。 2、将镜像写入U盘。 3、将店家配置好的EFI文件替换U盘中的EFI文件。 4、U盘启动电脑,装机 虽然非常简单,但是自己也折腾了两天才搞明白,不过如果是要自己配置引导文件的话估计要搞一个星期吧,因为引导文件是根据不同硬件自行配置的,所以自己配的话可能会遇到各种问题,于是你不得不逛各种论坛试各种方法。所以某宝的100多块钱还是非常值的。 降级成macOS Sierra 系统真是流畅得像飞一样,再加上4K屏,真的是太享受了。 对了,为了装这个系统还折腾了一个事情,就是Raid磁盘阵列,如果不知道Raid是什么,自行Google。Raid有好多种,我用的是Raid0, 简单说来就是把两块硬盘合并成一块,理论上读写速度也会翻倍,坏处是因为文件是分别存在两块硬盘上的,所以如果一个硬盘一旦坏掉,所有数据都会丢失。 一开始想在主板的Bios上组Raid盘,搞了好久都没成功,查来查去原来是主板不支持。正打算放弃,突然发现苹果支持软Raid, 而且超级简单。 打开自带的磁盘工具,左上角 File 下面直接就有 Raid工具,而且在安装的时候也可以用这个工具格盘然后再安装。 最后晒一下我的磁盘: 我实际上有四个物理磁盘,一块250G的SSD装的windows,两块120G的SSD组的Raid0磁盘整列,在Mac系统中显示的是一个240G的磁盘。另外一个1T的机械硬盘用来储存资料。 image.png 由于Raid0 挂掉的风险有点高,接下来准备做一个时光机的备份,作为下篇文章吧。 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
你以为我是在说虚拟机,哈哈那就错了,虚拟机太消耗资源啦。之前我说在PC上装了个黑苹果, 最近闲的蛋疼又想玩玩Linux,但是有不想装虚拟机也不想再格一个盘,怎么办。 最近Windows 10 开始支持Ubuntu啦。 首先打开Microsoft Store 搜索 Ubuntu image 评价还蛮高的嘛,赶紧装上,运行之后会出现跟Terminal 一模一样的终端,其实你已经在Linux的环境中啦。 试试 sudo -i 进入root 然后 apt update 开始更新啦! image 当然,命令行始终不好玩,能显示图形界面吗。 这也难不倒我们,不过需要安装一个软件Xming image 安装完成,启动Xlanuch. 配置完成后,在Terminal 中输入 export DISPLAY=0:0 安装并启动文件管理器nautilus apt install nautilus nautilus 哈哈Linux文件管理出现啦 image 完全没用虚拟机,Windows 10 下面运行Linux 是不是很神奇!! 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
有些问题之所以很困难有可能并不是问题本身很困难,而是自己没有把问题定义清楚。有时候把一个要解决的问题定义清楚问题本身就解决了一大半。这篇笔记是想通过一个简单的例子,介绍一下在人工智能或者机器学习领域中如何定义一个问题,顺便介绍一下解决这个问题的办法。 问题很简单,是一个导航问题,如图是罗马尼亚的地图,从Arad城市到Bucharest寻找最佳路径。 OK 把这个问题分解一下: 1、问题的初始状态是什么(Initial State)? 在Arad城市 2、行动(Action)是什么? 从一个状态(城市)移动到下一个状态(城市)。 3、结果(Result)呢? 状态变成在另一个城市了 4、这个状态是目标状态吗?需要测试一下(Goal test)。 是目的地Bucharest吗?是或不是 5、如何评价选择的路径(Path cost)? 路径的总里程 问题理解清楚了,接下来就是路径算法了,我们再把问题简化一下: 将问题想象成一个树枝(解决这个问题的办法跟之后介绍的“决策树”机器学习方法很像),初始地是头部,目的地是右下角。 怎么到达右下角最后一个目的地呢? 先介绍一种简单的算法,名字叫做“Breadth First” 故名思意就是“最短步数优先”。算法就会如图所示,先找只有需要走一步的城市(“2”和“3”),然后找需要走两步的(城市“4”,“5”,“6”,“7”).... 每走一步都会判断是否到达目的地,最后找到最佳路径1->3->7。 那如果找到了不止一条路呢?那算法就会将每个路径的总里程(Path cost)进行对比,选择路程最短的。“总里程”就是解决方案的评价标准。 这种算法虽然简单,但是非常耗时,比如上图找了7个路径最终才找到最佳路径,如果分支很多计算量就会成倍增加。 另外一个比较“聪明的”的算法是“Cheapest First” ,这个算法首先要知道每个城市(状态)离目的地的直线距离(这个需要标注),当每走一步之后就会选择预测距离(已走距离+距目的地直线距离) 最短的城市。 比如上图所示,红色数字表示城市离目的地的距离。我们从城市“1”出发,按照“Cheapest First”原则,第一步将会到城市“2”因为“2”的预测距离(0+2=2)要比“4”的预测距离(0+5=5)大。第二步会选择走到“3”(预测距离 2+2 =4小于到“5”的预测距离)。这个算法两步就找到了最佳路径。 OK,如何定义问题和解决这个问题算法介绍完了,是不是很简单,你能分别利用上面介绍的两种算法在地图上找到从Arad城市到Bucharest的最短路径吗,能演示每一步怎么走的吗? -------------- 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
好几个月前回国带了一块SSD,一直没时间给家里的台式机装上,最近休产假,终于有时间给装上了。之前说我工作的主力实际上一直都是那台Macbook Pro 但由于抵挡不了游戏的诱惑在家装了一台Windows PC, i5处理器,GTX1070 显卡。 本来Win10的系统用着也挺好,就是windows中的游戏诱惑实在太大,无法专心工作和学习,现在既然有了多一块SSD遂决定装上苹果的系统以方便专心工作和学习。另外如果想学习机器学习,python 和 TensorFlow 的话Mac 和 Linux 的系统真的比Windows好很多。 其实早在大学时代就在我那台小黑上折腾过黑苹果,那时候不吃不喝逛各种论坛,做引导装驱动,搞得不亦乐乎。如今可能已经过了折腾的年纪了遂直接上某宝找人远程装机。过程很快,远程装机大概花了不到一个小时就搞定了,后来驱动虽然出了点小问题,也很快就解决了。 之后我又把各种软件装好,邮件从笔记本中倒腾过来,再配上苹果原装的触摸板,现在这台黑苹果几乎已经算是非常完美了。 其实我如果花个半天最多一天的时间也应该能搞定,但是这些时间我完全可以做其他事情,陪陪家人,带带小孩。花了100多块人民币给自己买了大半天的时间真的是很值的。 -------------- 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
我的Macbook pro 已经陪伴我度过了快6年的美好时光了。2012年当所有的其他笔记本电脑都还在用恶心得1366*768的分辨率的时候,苹果在相继推出视网膜屏幕的手机和ipad之后,发布了世界上第一台视网膜分辨率笔记本电脑。 在入坑了是视网膜屏幕的ipad3之后,我表示再也回不去了,立马卖掉了手上用了不到一年的Macbook Air 加钱购得这台Macbook Pro 15寸的视网膜笔记本电脑。加上苹果的教育折扣和免费3年的Apple care 一共花了1200多英镑,差不多是我那个时候一个月的收入。 这台笔记本当时也是人生中最贵的一次消费,同时在好长一段时间里都是我最贵的财产。在陪伴我这6年的时间里,用它阅读了无数篇论文,写出了无数的文字,完成了厚厚的博士毕业论文。后来参加工作,用学校的经费买了一台Surface Pro 3, 新鲜了一段时间它的触控笔之后就放在在角落吃灰了。所以这三年它任然是我工作的主力。 当时在买它的时候因为考虑到可能要装虚拟机跑win的程序所以特地还将内存加到16个G。i7的处理器加上250的高速SSD,再加上MacOS的流畅性,即便是现在都还是比很多笔记本都快。这6年以来我从未重装过一次系统,它也从来没有在关键的时候罢过工。准备带着他在继续工作3年。 工欲善其事必先利其器,在效率工具上的投入带来了好多倍收益是非常值得的。 虽然我一直在用苹果的电脑和平板,也用了好长时间的iPhone,但是我并不是一个纯粹的果粉。我博士的老板实际上才是一个真正的果粉,受他的影响入了那个用了不到一年的Macbook Air , 这也是我MacOS的开始。当然我一点也不排斥Win的电脑 和Android 的手机,只要这些工具能够为我所用就好。 我的第一台笔记本电脑是台小黑,Thinkpad T60,2007年到2011年陪伴我度过5年的美好时光,从大学到博士研究生,从大陆到台湾再到英国。现在每次回国回家偶尔还将他打开,除了屏幕比之前暗淡了好多,装回windows XP,它还是那么流畅,两年前我结婚的时候多亏了它的光驱,不然还真不知道怎么把影楼的照片从光盘上读出来。 这就是十年来陪伴我一路走来的生产力工具,感谢你们。 ------------------ 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页
除了在这里记录一些生活琐事之外,我还决定在这里记录一下自己的学习和见闻。做一个简单的自我背景介绍吧,我本科来自国内某985高校的微电子专业,博士毕业于英国某罗素集团大学的物理学院,博士后加入了英国某高校电子信息与计算机学院的机器人课题组,并从此开始关注人工智能。对于一个非计算机科班出身,仅有本科一点C语言基础的人来说,这些东西对我来说都是全新的。关于人工智能的学习和研究需要以下几个核心知识点,我会在接下来的博客中一点点的阐述: 1、高等数学中的几个基本知识:微分(求导),线性代数(矩阵),统计(基本概念即可) 2、Python 编程语言。 3、搜索引擎(我只用google)。 OK,其实也没有想象中的那么复杂,虽然本人拥有物理学的博士学位,但其实很多东西也是从头开始,入门并不困难。今天第一篇文章先介绍人工智能的几个基本概念,(这里所有概念以英文为主,中文是根据自己理解翻译的): 1、人工智能AI (Artificial Intelligent ) 是什么 人工智能(AI)实际上是指的是一个智能系统(Intelligent Agent), 对外界收集到的信息进行处理,做出判断。可以想像成一个黑箱一个输入,一个输出。也可以说是对不确定的环境信息做出的反应,所以也叫不确定信息管理系统(Uncertainty management) 2、人工智能的基本词汇 全感知 vs 部分感知(Full vs Partially Observable) 就是从环境输入的信息是完整的还是部分的,比如下围棋,在下子之前,整个棋盘的信息(对手的布局和自己的布局)AI都是全部获得的。但是扑克牌就不一样,AI不知道你拿的什么牌。 确定性的vs随机性的(Deterministic vs Stochastic) 同样拿围棋和扑克牌举例子,理论上来说在规则允许的范围内,棋盘上每一个可以落子的位置都是知道的,所以是确定性的。而扑克牌你抽到下一张牌的结果是随机性的。 离散vs连续(Discrete vs Continuous) 这里是指输入输出的变量,围棋和扑克都是离散数据,也就是说下棋是是在棋盘上一个一个点下的,牌也是一张一张出的。而自动驾驶的输入和输出都是连续的变量,比如坡度大小,速度,转弯角度等等。 良性互动vs对抗性互动(Benign vs Adversarial) 与AI下棋或者玩扑克牌就是对抗性互动,而自动驾驶就是良性互动。 好了基本概念是不是特别简单,今后我会继续记录一下关于phyton, 机器学习,深度学习以及人工智能的相关笔记,附上一个我自己学习的脑图,欢迎与我交流: 文章首发steemit.com 为了方便墙内阅读,搬运至此,欢迎留言或者访问我的Steemit主页