基础
概念
- 看待人工智能的几个视角
从技术分层来看
认知:是指收集信息和解析信息来感知世界,比如图片识别、语音识别、自然语言处理等; 预测:是指通过计算,来预测行为和结果。比如广告推荐,歌曲推荐等; 决策:是指确定实现的方式和路径,比如移动路线规划、自动买卖股票等; 集成解决方案:是指人工智能和其他技术结合时,产生的多种集成解决方案,比如和汽车结合就是无人驾驶,和医疗器械结合就是手术机器人。从技术分类来看
基础架构层:云计算、芯片、Tensorflow等框架; 中间层:图像识别、语音识别、语义识别、机器翻译等; 应用层:智能滤镜,讲故事机器人,助理机器人,搜索引擎,内容推荐,阿里鲁班制图等。从应用场景来看
互联网和移动互联网应用:搜索引擎、精准营销、用户画像、反欺诈 智能交通:自动驾驶、共享出行、自动物流 智能金融:银行业、保险业、证券投资(风控、反欺诈、投资决策) 智能医疗:辅助诊断、手术机器人、智能制药、辅助器官、外骨骼 智能农业:智慧农业管理系统、智慧农业设备 智能写作:写稿机器人、收集资料机器人 机器翻译:文字翻译、声音翻译、图像翻译 机器仿生:动物仿生、器官仿生 智能助理:律师助理、时间管理助理 创作艺术:编曲、写歌、写小说、绘画编程类:《白话深度学习与TensorFlow》《TensorFlow实战》《Python编程 从入门到实践》
- 常用AI技术概念
人工智能>机器学习>深度学习
人工智能(Artificial Intelligence)AI:
它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。机器学习(Machine Learning):
机器学习是人工智能领域的一部分,并且和知识发现与数据挖掘有所交集。 研究专家系统、自动推理、自然语言理解、模式识别、计算机视觉、智能机器人等领域。深度学习(Deep Learning):
深度学习的概念源于人工神经网络的研究,是一种含多隐层的多层感知器。 深度机器学习方法也有监督学习与无监督学习之分 例如,卷积神经网络(Convolutional neural networks,简称CNNs)就是一种深度的监督学习下的机器学习模型,而深度置信网(Deep Belief Nets,简称DBNs)就是一种无监督学习下的机器学习模型。神经计算>人工神经网络>深度学习>卷积神经网络/递归神经网络
神经计算科学是使用数学分析和计算机模拟的方法在不同水平上对神经系统进行模拟和研究
人工神经网络(Artificial Neural Network,即ANN )
它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。模式识别、知识图谱和专家系统
模式识别(Pattern Recognition)是指对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程,是信息科学和人工智能的重要组成部分。
知识图谱本质上是语义网络,是一种基于图的数据结构,由节点(Point)和边(Edge)组成。
知识图谱就是把所有不同种类的信息连接在一起而得到的一个关系网络。 构建知识图谱的重点在于语义理解、知识表示、QA、智能对话和用户建模。 知识图谱是一系列结构化数据的处理方法,它涉及知识的提取、 表示、存储、检索等诸多技术。专家系统是一个具有大量的专门知识与经验的程序系统,它应用人工智能技术和计算机技术,根据某领域一个或多个专家提供的知识和经验,进行推理和判断,模拟人类专家的决策过程,以便解决那些需要人类专家处理的复杂问题。
专家系统就是人去学一个东西,然后把学到的知识理论化,再把这些理论模型化,最后把这个模型程序化,形成一个系统,就叫专家系统。 知识图谱可以作为专家系统的一部分存在,提供半自动构建知识库的方法。
- 常见AI算法概述
浅层学习没有隐藏层或者只有一层隐藏层,常见算法包括线性回归、逻辑回归、随机森林、SVM、K-means、RBM、AutoEncoder、PCA、SOM等
深度学习通常会有较多隐藏层,常见算法有CNN卷积神经网络和RNN递归神经网络,而基于RNN衍生出了LSTM和GRU等一系列算法。
决策树
决策树根据数据的属性采用树状结构建立决策模型, 用树形结构对数据进行分类,在进行逐步应答过程中
典型的决策树分析会使用分层变量或决策节点,决策树模型常常用来解决分类和回归问题。 场景举例:基于规则的信用评估、赛马结果预测 优点:擅长对人、地点、事物的一系列不同特征、品质、特性进行评估 常见相关算法: 分类及回归树(Classification And Regression Tree, CART) ID3(Iterative Dichotomiser 3) GBDT C4.5 Chi-squared Automatic Interaction Detection(CHAID) Decision Stump 随机森林(Random Forest) 多元自适应回归样条(MARS) 梯度推进机(Gradient Boosting Machine, GBM)回归算法
回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法,可以勾画出因变量与一个或多个因变量之间的状态关系。
场景举例:路面交通流量分析、邮件过滤 优点:回归可用于识别变量之间的连续关系,即便这个关系不是非常明显 常见算法有: 最小二乘法(Ordinary Least Square) 线性回归 逻辑回归(Logistic Regression) 逐步式回归(Stepwise Regression) 多元自适应回归样条(Multivariate Adaptive Regression Splines) 本地散点平滑估计(Locally Estimated Scatterplot Smoothing)基于核函数的学习算法
基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易的解决。
常见算法有: 支持向量机(Support Vector Machine, SVM) 径向基函数(Radial Basis Function ,RBF) 线性判别分析(Linear Discriminate Analysis ,LDA)基于实例的算法
常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。
常见算法: k-Nearest Neighbor(KNN) 学习矢量量化(Learning Vector Quantization, LVQ) 自组织映射算法(Self-Organizing Map , SOM)神经网络
神经网络也是一种分类器。它是由很多个虚拟的神经元组成的一个网络,我们可以把一个神经元看做是一个分类器,那很多个神经元组成的网络就能对样本进行很多次分类。
CNN(Convolutional Neural Networks)卷积神经网络,对于大型图像处理有出色表现。 场景举例:图像识别、文本转语音、药物发现、照片滤镜、人脸识别,无人汽车等。 优点:当存在非常大型的数据集、大量特征和复杂的分类任务时,卷积神经网络是非常有用的 RNN(Recurrent Neural NetWorks)递归神经网络存在某种形式的记忆,允许先前的输出去影响后面的输入。 RNN其实是两种人工神经网络的总称: 一种是时间递归神经网络(recurrent neural network),神经元间连接构成有向图 另一种是结构递归神经网络(recursive neural network),利用相似的神经网络结构递归构造更为复杂的深度网络。 场景举例:图像分类与字幕添加、政治情感分析、对话机器人,机器翻译,科大讯飞的自然语言识别,文章编辑等。 优点:递归神经网络在存在大量有序信息时具有预测能力叶贝斯算法
它的意思是:当你不能准确知悉一个事物的本质时,你可以依靠与事物特定本质相关的事件出现的多少去判断其本质属性的概率。
场景举例:情感分析、消费者分类 优点:对于在小数据集上有显著特征的相关对象,朴素贝叶斯方法可对其进行快速分类 常见算法有: 朴素贝叶斯算法 平均单依赖估计(Averaged One-Dependence Estimators, AODE) Bayesian Belief Network(BBN)聚类
简单的说,就是通过不断的迭代计算,把数据分成若干个组,使得这个组里的都是类似的数据,而不同组之间的数据是不相似的。
场景举例:图像分类识别,用户行为识别,用户画像等领域 常见算法有: k-Means算法 期望最大化算法(Expectation Maximization, EM)强化学习模型
在没有给出任何答案的情况下,先进行一些尝试,通过尝试所得到的回报,来确定这个尝试是否正确,由这一系列的尝试来不断调整和优化算法,最后算法知道在某种情况下,采取何种动作可以得到最好的结果。
他的本质是解决“决策问题”,就是通过不断做出决策并获得结果反馈后,学会自动进行决策,得到最优结果。
集成学习模型
用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。
常见算法有: Boosting Bootstrapped Aggregation(Bagging) AdaBoost 堆叠泛化(Stacked Generalization, Blending) 梯度推进机(Gradient Boosting Machine, GBM) 随机森林(Random Forest)
- 机器学习的工作流程
①选择数据:将你的数据分成三组:训练数据、验证数据和测试数据
②模型数据:使用训练数据来构建使用相关特征的模型
③验证模型:使用你的验证数据接入你的模型
④测试模型:使用你的测试数据检查被验证的模型的表现
⑤使用模型:使用完全训练好的模型在新数据上做预测
⑥调优模型:使用更多数据、不同的特征或调整过的参数来提升算法的性能表现
强化学习
http://36kr.com/p/5064302.html
https://blog.csdn.net/aliceyangxi1987/article/details/73327378
- 定义
强化学习是机器学习的一个重要分支,是多学科多领域交叉的一个产物,它的本质是解决 decision making 自动进行决策问题,并且可以做连续决策。
它主要包含四个元素,agent,环境状态,行动,奖励, 强化学习的目标就是获得最多的累计奖励。
让我们以小孩学习走路来做个形象的例子:
小孩想要走路,但在这之前,他需要先站起来,站起来之后还要保持平衡,接下来还要先迈出一条腿,是左腿还是右腿,迈出一步后还要迈出下一步。
小孩就是 agent,他试图通过采取行动(即行走)来操纵环境(行走的表面),并且从一个状态转变到另一个状态(即他走的每一步),当他完成任务的子任务(即走了几步)时,孩子得到奖励(给巧克力吃),并且当他不能走路时,就不会给巧克力。
- 和监督式学习, 非监督式学习的区别
在机器学习中,我们比较熟知的是监督式学习,非监督学习,此外还有一个大类就是强化学习:
- 强化学习和监督式学习的区别:
监督式学习就好比你在学习的时候,有一个导师在旁边指点,他知道怎么是对的怎么是错的,但在很多实际问题中,例如 chess,go,这种有成千上万种组合方式的情况,不可能有一个导师知道所有可能的结果。
而这时,强化学习会在没有任何标签的情况下,通过先尝试做出一些行为得到一个结果,通过这个结果是对还是错的反馈,调整之前的行为,就这样不断的调整,算法能够学习到在什么样的情况下选择什么样的行为可以得到最好的结果。
两种学习方式都会学习出输入到输出的一个映射,监督式学习出的是之间的关系,可以告诉算法什么样的输入对应着什么样的输出,强化学习出的是给机器的反馈 reward function,即用来判断这个行为是好是坏。
另外强化学习的结果反馈有延时,有时候可能需要走了很多步以后才知道以前的某一步的选择是好还是坏,而监督学习做了比较坏的选择会立刻反馈给算法。
而且强化学习面对的输入总是在变化,每当算法做出一个行为,它影响下一次决策的输入,而监督学习的输入是独立同分布的。
通过强化学习,一个 agent 可以在探索和开发(exploration and exploitation)之间做权衡,并且选择一个最大的回报。
exploration 会尝试很多不同的事情,看它们是否比以前尝试过的更好。
exploitation 会尝试过去经验中最有效的行为。
一般的监督学习算法不考虑这种平衡,就只是是 exploitative。
- 强化学习和非监督式学习的区别:
非监督式不是学习输入到输出的映射,而是模式。例如在向用户推荐新闻文章的任务中,非监督式会找到用户先前已经阅读过类似的文章并向他们推荐其一,而强化学习将通过向用户先推荐少量的新闻,并不断获得来自用户的反馈,最后构建用户可能会喜欢的文章的“知识图”。
马尔可夫决策过程:
在强化学习中定义解法的数学框架叫做马尔可夫决策过程(Markov Decision Process)。 它被设计为:
1 | 一系列状态的集合(Set of states),S |
我们必须采取行动(A)从我们的开始状态过渡到我们的结束状态(S)。我们采取的每个行动将获得奖励(R)。 我们的行为可以导致正奖励或负奖励。
我们采取的行动的集合(A)定义了我们的策略(π),我们得到的奖励(R)定义了我们的价值(V)。 我们在这里的任务是通过选择正确的策略来最大化我们的奖励。 所以我们必须对时间t的所有可能的S值最大化。
- 主要算法和分类
从强化学习的几个元素的角度划分的话,方法主要有下面几类:
1 | Policy based, 关注点是找到最优策略。 |
我们可以用一个最熟知的旅行商例子来看,
我们要从 A 走到 F,每两点之间表示这条路的成本,我们要选择路径让成本越低越好

那么几大元素分别是:
1 | states ,就是节点 {A, B, C, D, E, F} |
有一种走法是这样的,在 A 时,可以选的 (B, C, D, E),发现 D 最优,就走到 D,此时,可以选的 (B, C, F),发现 F 最优,就走到 F,此时完成任务。
这个算法就是强化学习的一种,叫做 epsilon greedy,是一种 Policy based 的方法,当然了这个路径并不是最优的走法。
- 强化学习的实践案例
我们会使用深度Q学习算法,Q学习是基于策略的,用神经网络来近似值函数的学习算法。Google使用该算法在Atari游戏中击败了人类。
让我们看看Q学习的伪代码:
1 | 初始化价值表‘Q(s,a)’. |
此外还可以从不同角度使分类更细一些:
- Model-free:不尝试去理解环境, 环境给什么就是什么,一步一步等待真实世界的反馈, 再根据反馈采取下一步行动。
- Model-based:先理解真实世界是怎样的, 并建立一个模型来模拟现实世界的反馈,通过想象来预判断接下来将要发生的所有情况,然后选择这些想象情况中最好的那种,并依据这种情况来采取下一步的策略。它比 Model-free 多出了一个虚拟环境,还有想象力。
- Policy based:通过感官分析所处的环境, 直接输出下一步要采取的各种动作的概率, 然后根据概率采取行动。
- Value based:输出的是所有动作的价值, 根据最高价值来选动作,这类方法不能选取连续的动作。
- Monte-carlo update:游戏开始后, 要等待游戏结束, 然后再总结这一回合中的所有转折点, 再更新行为准则。
- Temporal-difference update:在游戏进行中每一步都在更新, 不用等待游戏的结束, 这样就能边玩边学习了。
- On-policy:必须本人在场, 并且一定是本人边玩边学习。
- Off-policy:可以选择自己玩, 也可以选择看着别人玩, 通过看别人玩来学习别人的行为准则。
- 应用举例
强化学习有很多应用,除了无人驾驶,AlphaGo,玩游戏之外,还有下面这些工程中实用的例子:
- Manufacturing
例如一家日本公司 Fanuc,工厂机器人在拿起一个物体时,会捕捉这个过程的视频,记住它每次操作的行动,操作成功还是失败了,积累经验,下一次可以更快更准地采取行动。

- 库存管理 Inventory Management
在库存管理中,因为库存量大,库存需求波动较大,库存补货速度缓慢等阻碍使得管理是个比较难的问题,可以通过建立强化学习算法来减少库存周转时间,提高空间利用率。
- 动态定价 Dynamic pricing
强化学习中的 Q-learning 可以用来处理动态定价问题。
- Customer Delivery
制造商在向各个客户运输时,想要在满足客户的所有需求的同时降低车队总成本。通过 multi-agents 系统和 Q-learning,可以降低时间,减少车辆数量。
- 电商 ECommerce Personalization
在电商中,也可以用强化学习算法来学习和分析顾客行为,定制产品和服务以满足客户的个性化需求。
- Ad Serving
例如算法 LinUCB (属于强化学习算法 bandit 的一种算法),会尝试投放更广范围的广告,尽管过去还没有被浏览很多,能够更好地估计真实的点击率。
再如双 11 推荐场景中,阿里巴巴使用了深度强化学习与自适应在线学习,通过持续机器学习和模型优化建立决策引擎,对海量用户行为以及百亿级商品特征进行实时分析,帮助每一个用户迅速发现宝贝,提高人和商品的配对效率。还有,利用强化学习将手机用户点击率提升了 10-20%。
- 交易投资策略 Financial Investment Decisions
例如这家公司 Pit.ai,应用强化学习来评价交易策略,可以帮助用户建立交易策略,并帮助他们实现其投资目标。
- 医学研究 Medical Industry
动态治疗方案(DTR)是医学研究的一个主题,是为了给患者找到有效的治疗方法。 例如癌症这种需要长期施药的治疗,强化学习算法可以将患者的各种临床指标作为输入 来制定治疗策略。
- 实践
我们先看看什么是Cartpole问题,再继续编程提供解决方案。
当我还是一个小孩的时候,我记得我会捡一根棍子试着用一只手让它保持平衡。我和我的朋友们一起比赛看谁让棍子保持平衡的时间最长就可以得到“奖励”,一块巧克力!
开始我们的代码前,我们需要先安装一些东西,
步骤1:安装keras-rl库
从终端运行以下命令:
1 | git clone https://github.com/matthiasplappert/keras-rl.git |
步骤2:安装CartPole环境组件
假设你已经安装了pip,使用pip命令安装以下库
1 | pip install h5py |
Gym是一个工具包,用于开发和对比强化学习算法。它包括一个开源库,该开源库含有可用于测试强化学习算法的测试问题(环境)集合,一个站点和一个允许对比训练算法(代理)性能的API。
一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group。在使用h5py的时候需要牢记一句话:groups类比词典,dataset类比Numpy中的数组。
步骤3:启动
首先我们要导入所需模块
1 | import numpy as np |
然后设置相关变量
1 | ENV_NAME = 'CartPole-v0' |
下一步,我们创建一个简单的单隐层神经网络模型。
1 | model = Sequential() |
接下来,配置并编译我们的代理端。我们将策略设成ε-贪心算法,并且将存储设置成顺序存储方式因为我们想要存储执行操作的结果和每一操作得到的奖励。
1 | policy = EpsGreedyQPolicy() |
现在测试强化学习模型
1 | dqn.test(env, nb_episodes=5, visualize=True) |
近端策略优化(PPO)
基础
- Proximal Policy Optimization
这种算法用在强化学习中时表现能达到甚至超过现有算法的顶尖水平,同时还更易于实现和调试。所以 OpenAI 已经把PPO作为自己强化学习研究中首选的算法。
- 现有算法
- 策略梯度
策略梯度的一类方法让深度神经网络在控制任务中取得了明显进步,电脑游戏、三维运动、围棋都是很好的例子。但是用策略梯度的方法取得好的结果也有一些难度,因为这类方法对迭代步骤数非常敏感:如果选得太小,训练过程就会慢得令人绝望;如果选得太大,反馈信号就会淹没在噪声中,甚至有可能让模型表现雪崩式地下降。这类方法的采样效率也经常很低,学习简单的任务就需要百万级至十亿级的总迭代次数。
- ACER
研究人员们已经找到了 TRPO(Trust Region Policy Optimization,信任区域策略优化,https://arxiv.org/abs/1502.05477)和 ACER(Sample Efficient Actor-Critic with Experience Replay,能高效采样的带有经验回放的表演者-评论者算法,https://arxiv.org/abs/1611.01224) 这样的方法,对策略更新的大小做出限制或者另外的优化。
ACER 比 PPO复杂得多,需要额外的代码用于策略外的纠正以及一个回放缓冲区,在 Atari 测试中的具体表现却只比 PPO 勉强好一点点;
- TRPO
TRPO 虽然在连续控制任务中很有用,但是对策略函数和价值函数或者辅助损失之间有共享参数的算法较难兼容,比如 Atari 和其它一些视觉输入占据主要部分的任务就是这样。
在监督学习中,实现损失函数、在上面做梯度下降都很容易,而且基本上不费什么功夫调节超参数就肯定能够得到很好的结果。但是在强化学习中想要获得好结果就没有这么简单了,算法中有许多变化的部分导致难以 debug,而且需要花很大的精力在调试上才能得到好结果。