├── ReadMe.ipynb ├── ReadMe.md ├── chapter02.ipynb ├── chapter03.ipynb ├── chapter04.ipynb ├── chapter05.ipynb ├── chapter06.ipynb ├── chapter07.ipynb ├── chapter08.ipynb ├── chapter09.ipynb ├── chapter10.ipynb ├── chapter11.ipynb ├── chapter12.ipynb ├── chapter13.ipynb ├── chapter14.ipynb ├── chapter15.ipynb ├── chapter16.ipynb ├── chapter17.ipynb ├── chapter18.ipynb ├── chapter19.ipynb ├── chapter20.ipynb ├── resource ├── chapter02_image01.png ├── chapter02_image02.png ├── chapter02_image03.png ├── chapter02_image04.png ├── chapter03_image01.png ├── chapter03_image02.png ├── chapter04_image01.png ├── chapter05_image01.png ├── chapter05_image02.png ├── chapter05_image03.png ├── chapter05_image04.png ├── chapter05_image05.png ├── chapter05_image06.png ├── chapter06_image01.png ├── chapter06_image02.png ├── chapter07_image01.png ├── chapter08_image01.png ├── chapter08_image02.png ├── chapter08_image03.png ├── chapter08_image04.png ├── chapter09_image01.png ├── chapter09_image02.png ├── chapter10_image01.png ├── chapter10_image02.png ├── chapter10_image03.png ├── chapter11_image01.png ├── chapter11_image02.png ├── chapter11_image03.png ├── chapter11_image04.png ├── chapter11_image05.png ├── chapter12_image01.png ├── chapter12_image02.png ├── chapter14_image01.png ├── chapter14_image02.png ├── chapter14_image03.png ├── chapter14_image04.png ├── chapter17_image01.png ├── chapter17_image02.png ├── chapter17_image03.png ├── chapter17_image04.png ├── sn02_image01.png ├── sn02_image02.png ├── sn07_image01.png └── sn07_image02.png ├── sn02.ipynb ├── sn06.ipynb ├── sn07.ipynb └── sn08.ipynb /ReadMe.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 机器学习笔记\n", 8 | "\n", 9 | "## 简介\n", 10 | "\n", 11 | "**作者:子实**\n", 12 | "\n", 13 | "机器学习笔记,使用 `jupyter notebook (ipython notebook)` 编写展示。\n", 14 | "\n", 15 | "`Github` 加载 `.ipynb` 的速度较慢,建议在 [Nbviewer](http://nbviewer.jupyter.org/github/zlotus/notes-LSJU-machine-learning/blob/master/ReadMe.ipynb?flush_cache=true) 中查看该项目。\n", 16 | "\n", 17 | "----\n", 18 | "\n", 19 | "## 目录\n", 20 | "\n", 21 | "来自斯坦福网络课程《机器学习》的笔记,可以在[斯坦福大学公开课:机器学习课程](http://open.163.com/special/opencourse/machinelearning.html)观看。\n", 22 | "\n", 23 | "根据视频内容,对每一讲的名称可能会有所更改(以更好的体现各讲的教学内容)。\n", 24 | "\n", 25 | "- 【第1讲】 机器学习的动机与应用(主要是课程要求与应用范例,没有涉及机器学习的具体计算内容)\n", 26 | "- 【第2讲】 [监督学习应用-线性回归](chapter02.ipynb)\n", 27 | "- 【第3讲】 [线性回归的概率解释、局部加权回归、逻辑回归](chapter03.ipynb)\n", 28 | "- 【第4讲】 [牛顿法、一般线性模型](chapter04.ipynb)\n", 29 | "- 【第5讲】 [生成学习算法、高斯判别分析、朴素贝叶斯算法](chapter05.ipynb)\n", 30 | "- 【第6讲】 [事件模型、函数间隔与几何间隔](chapter06.ipynb)\n", 31 | "- 【第7讲】 [最优间隔分类器、拉格朗日对偶、支持向量机](chapter07.ipynb)\n", 32 | "- 【第8讲】 [核方法、序列最小优化算法](chapter08.ipynb)\n", 33 | "- 【第9讲】 [经验风险最小化](chapter09.ipynb)\n", 34 | "- 【第10讲】 [交叉验证、特征选择](chapter10.ipynb)\n", 35 | "- 【第11讲】 [贝叶斯统计、机器学习应用建议](chapter11.ipynb)\n", 36 | "- 【第12讲】 [$k$-means算法、高斯混合模型及最大期望算法](chapter12.ipynb)\n", 37 | "- 【第13讲】 [最大期望算法及其应用、因子分析模型](chapter13.ipynb)\n", 38 | "- 【第14讲】 [因子分析的EM算法、主成分分析](chapter14.ipynb)\n", 39 | "- 【第15讲】 [PCA的奇异值分解、独立成分分析](chapter15.ipynb)\n", 40 | "- 【第16讲】 [马尔可夫决策过程](chapter16.ipynb)\n", 41 | "- 【第17讲】 [解连续状态的MDP](chapter17.ipynb)\n", 42 | "- 【第18讲】 [线性二次调节](chapter18.ipynb)\n", 43 | "- 【第19讲】 [微分动态规划及线性二次型高斯](chapter19.ipynb)\n", 44 | "- 【第20讲】 [策略搜索算法](chapter20.ipynb)\n", 45 | "\n", 46 | "----\n", 47 | "\n", 48 | "- 【参考笔记1】 线性代数复习及参考\n", 49 | "- 【参考笔记2】 [概率论复习](sn02.ipynb)\n", 50 | "- 【参考笔记3】 MATLAB入门\n", 51 | "- 【参考笔记4】 凸优化概述1\n", 52 | "- 【参考笔记5】 凸优化概述2\n", 53 | "- 【参考笔记6】 [隐式马尔可夫模型](sn06.ipynb)\n", 54 | "- 【参考笔记7】 [多元高斯分布](sn07.ipynb)\n", 55 | "- 【参考笔记8】 [更多关于多元高斯分布的知识](sn08.ipynb)\n", 56 | "- 【参考笔记9】 高斯过程\n", 57 | "\n", 58 | "笔记格式借鉴[Jin Li](https://github.com/lijin-THU/)的[机器学习笔记](https://github.com/lijin-THU/notes-machine-learning)。" 59 | ] 60 | } 61 | ], 62 | "metadata": { 63 | "anaconda-cloud": {}, 64 | "kernelspec": { 65 | "display_name": "Python [default]", 66 | "language": "python", 67 | "name": "python3" 68 | }, 69 | "language_info": { 70 | "codemirror_mode": { 71 | "name": "ipython", 72 | "version": 3 73 | }, 74 | "file_extension": ".py", 75 | "mimetype": "text/x-python", 76 | "name": "python", 77 | "nbconvert_exporter": "python", 78 | "pygments_lexer": "ipython3", 79 | "version": "3.5.2" 80 | } 81 | }, 82 | "nbformat": 4, 83 | "nbformat_minor": 0 84 | } 85 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # 机器学习笔记 2 | 3 | ## 简介 4 | 5 | **作者:子实** 6 | 7 | 机器学习笔记,使用 `jupyter notebook (ipython notebook)` 编写展示。 8 | 9 | `Github` 加载 `.ipynb` 的速度较慢,建议在 [Nbviewer](http://nbviewer.jupyter.org/github/zlotus/notes-LSJU-machine-learning/blob/master/ReadMe.ipynb?flush_cache=true) 中查看该项目。 10 | 11 | ---- 12 | 13 | ## 目录 14 | 15 | 来自斯坦福网络课程《机器学习》的笔记,可以在[斯坦福大学公开课:机器学习课程](http://open.163.com/special/opencourse/machinelearning.html)观看。 16 | 17 | 根据视频内容,对每一讲的名称可能会有所更改(以更好的体现各讲的教学内容)。 18 | 19 | - 【第1讲】 机器学习的动机与应用(主要是课程要求与应用范例,没有涉及机器学习的具体计算内容) 20 | - 【第2讲】 [监督学习应用-线性回归](chapter02.ipynb) 21 | - 【第3讲】 [线性回归的概率解释、局部加权回归、逻辑回归](chapter03.ipynb) 22 | - 【第4讲】 [牛顿法、一般线性模型](chapter04.ipynb) 23 | - 【第5讲】 [生成学习算法、高斯判别分析、朴素贝叶斯算法](chapter05.ipynb) 24 | - 【第6讲】 [事件模型、函数间隔与几何间隔](chapter06.ipynb) 25 | - 【第7讲】 [最优间隔分类器、拉格朗日对偶、支持向量机](chapter07.ipynb) 26 | - 【第8讲】 [核方法、序列最小优化算法](chapter08.ipynb) 27 | - 【第9讲】 [经验风险最小化](chapter09.ipynb) 28 | - 【第10讲】 [交叉验证、特征选择](chapter10.ipynb) 29 | - 【第11讲】 [贝叶斯统计、机器学习应用建议](chapter11.ipynb) 30 | - 【第12讲】 [$k$-means算法、高斯混合模型及最大期望算法](chapter12.ipynb) 31 | - 【第13讲】 [最大期望算法及其应用、因子分析模型](chapter13.ipynb) 32 | - 【第14讲】 [因子分析的EM算法、主成分分析](chapter14.ipynb) 33 | - 【第15讲】 [PCA的奇异值分解、独立成分分析](chapter15.ipynb) 34 | - 【第16讲】 [马尔可夫决策过程](chapter16.ipynb) 35 | - 【第17讲】 [解连续状态的MDP](chapter17.ipynb) 36 | - 【第18讲】 [线性二次调节](chapter18.ipynb) 37 | - 【第19讲】 [微分动态规划及线性二次型高斯](chapter19.ipynb) 38 | - 【第20讲】 [策略搜索算法](chapter20.ipynb) 39 | 40 | ---- 41 | 42 | - 【参考笔记1】 线性代数复习及参考 43 | - 【参考笔记2】 [概率论复习](sn02.ipynb) 44 | - 【参考笔记3】 MATLAB入门 45 | - 【参考笔记4】 凸优化概述1 46 | - 【参考笔记5】 凸优化概述2 47 | - 【参考笔记6】 [隐式马尔可夫模型](sn06.ipynb) 48 | - 【参考笔记7】 [多元高斯分布](sn07.ipynb) 49 | - 【参考笔记8】 [更多关于多元高斯分布的知识](sn08.ipynb) 50 | - 【参考笔记9】 高斯过程 51 | 52 | 笔记格式借鉴[Jin Li](https://github.com/lijin-THU/)的[机器学习笔记](https://github.com/lijin-THU/notes-machine-learning)。 -------------------------------------------------------------------------------- /chapter02.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第二讲:监督学习应用-线性回归\n", 8 | "\n", 9 | "我们从监督学习的一些例子开始讲起。假设我们有一个经调查得到的数据集,内容是关于俄勒冈州波特兰地区$47$间出租公寓的面积与价格之间的关系表:\n", 10 | "\n", 11 | "$$\\begin{array}{c|c}living\\ area(feet^2)&price(1000\\$s)\\\\\\hline2104&400\\\\1600&330\\\\2400&369\\\\1416&232\\\\3000&540\\\\\\vdots&\\vdots\\end{array}$$\n", 12 | "\n", 13 | "我们可以画出一张关于面积-价格的图像:\n", 14 | "\n", 15 | "\"\"\n", 16 | "\n", 17 | "有了这样的数据,我们怎样才能预测波特兰地区其他出租公寓的价格,比如推导出一个从面积得出价格的函数。\n", 18 | "\n", 19 | "为了今后的课程书写方便,我们约定一些未来将要用到的符号:\n", 20 | "\n", 21 | "* 使用$x^{(i)}$来表示**输入变量**,也称作**输入特征(feature)**,即本例中的实用面积(living area);\n", 22 | "* 使用$y^{(i)}$来表示**输入变量**或**目标变量(target)**,也就是我们尝试做出预测的值;\n", 23 | "* 一对$(x^{(i)}),\\ y^{(i)}$称作一个**训练样本(training example)**;\n", 24 | "* 用于做学习的数据集,也就是由$m$个$(x^{(i)}),\\ y^{(i)}$组成的列表$\\left\\{\\left(x^{(i)},\\ y^{(i)}\\right);\\ i=1,\\cdots,m\\right\\}$,称作**训练集(training set)**;\n", 25 | "\n", 26 | " 需要注意的是,标记中的上标$^{(i)}$仅用于在训练集中标识训练样本的序号,并不表示指数。\n", 27 | "\n", 28 | "* $X$表示**输入值空间**,$Y$表示**输出值空间**,在本例中$X=Y=\\mathbb{R}$(即都是一维实向量空间)。\n", 29 | "\n", 30 | "更加正式的描述监督学习问题:我们的目标是,通过一个给定的训练集,训练一个函数$h:\\ X\\to Y$,如果$h(x)$能够通过较为准确的预测而得到结果$y$,则我们称这个$h(x)$是“好的”。因为一些历史原因,函数$h$被称为假设(hypothesis),监督学习用流程图表示如下:\n", 31 | "\n", 32 | "\"\"\n", 33 | "\n", 34 | "当我们尝试预测的目标变量是连续的(就像我们公寓租金的例子一样),我们就说这是一个回归问题(regression problem)。\n", 35 | "\n", 36 | "当$y$只能取几个分立的值(例如已知房间面积大小,我们需要判断这是一栋房屋还是一套公寓)时,我们称其为分类问题(classification problem)。\n", 37 | "\n", 38 | "# 第一部分:线性回归(Linear Regression)\n", 39 | "\n", 40 | "为了让例子更有趣,我们丰富一下数据集,在已知条件里再加上卧室的数量:\n", 41 | "\n", 42 | "$$\\begin{array}{c|c|c}living\\ area(feet^2)&\\#bedrooms&price(1000\\$s)\\\\\\hline2104&3&400\\\\1600&3&330\\\\2400&3&369\\\\1416&2&232\\\\3000&4&540\\\\\\vdots&\\vdots&\\vdots\\end{array}$$\n", 43 | "\n", 44 | "此时$x$是一个在$\\mathbb{R}^2$向量空间中的二维向量,即$x_1^{(i)}$表示第$i$个房间样本的实用面积,$x_2^{(i)}$表示第$i$个房间样本的卧室的数量。(通常在设计学习算法时,我们都是自行决定选取哪些特征。假设我们在其他地方做房屋价格调研,那么我们可能会将“是否每个房间都有壁炉”、“卫生间数量”等其他因素纳入输入特征。)\n", 45 | "\n", 46 | "要实现一个监督学习算法,我们必须确定函数(假设)$h$的形式,作为本课程的第一个例子,我们选择使用一个简单的线性函数来逼近$y$:\n", 47 | "\n", 48 | "$$h_\\theta(x)=\\theta_0+\\theta_1x_1+\\theta_2x_2$$\n", 49 | "\n", 50 | "在式子里的$\\theta_i$叫做参数(或权重),用于参数化$X\\to Y$的线性函数映射空间。在不产生混淆的情况下,我们会省略$h_\\theta(x)$中的下标$\\theta$,简单记为$h(x)$。在上式中我们省略了第一项中的$x_0=1$(即截距项),补上这一项后有:\n", 51 | "\n", 52 | "$$h(x)=\\sum_{i=1}^n\\theta_ix_i=\\theta^Tx$$\n", 53 | "\n", 54 | "上式最右侧中的$\\theta$和$x$都是向量,$n$代表输入向量中元素个数(不包含$x_0$)。\n", 55 | "\n", 56 | "现在,有了训练集,我们应该如何选择(训练)参数$\\theta$呢?其中一种合理的方法是使得计算出的$h(x)$与真实结果$y$尽量接近(至少对训练集中的已有数据做到尽量接近)。为了形式化这个“尽量接近”的问题,我们定义一个关于$\\theta$的函数,使其能够描述$h(x^{(i)})$与相应$y^{(i)}$间的差距,并称其为**成本函数(cost function)**:\n", 57 | "\n", 58 | "$$J(\\theta)=\\frac{1}{2}\\sum_{i=1}^n\\left(h_\\theta\\left(x^{(i)}\\right)-y^{(i)}\\right)^2\\tag{J}$$\n", 59 | "\n", 60 | "以前见过线性回归的同学应该熟悉上式,这就是最小二乘回归模型中常见的最小二乘成本函数。随着课程的进行,我们会发现最小二乘法仅是它所在的一族算法中的特例。\n", 61 | "\n", 62 | "## 1. 最小均方法(LMS: Least mean squares algorithm)\n", 63 | "\n", 64 | "我们需要选取合适的$\\theta$以使得$J(\\theta)$取最小值。为了达到这种效果,我们可以使用一种搜索算法,算法起始于某个关于$\\theta$的“初始猜测值”,然后不断的修改$\\theta$以使$J(\\theta)$减小,直到最终$\\theta$收敛于使得$J(\\theta)$取最小处。特别的,我们讲一下梯度下降(gradient descent)法:算法从某个初始的$\\theta$起,不断更新$\\theta_j:=\\theta_j-\\alpha\\frac{\\partial}{\\partial\\theta_j}J(\\theta)$($:=$表示赋值,该赋值运算同时作用于所有的$\\theta_j,\\ j=0,\\cdots,n$)。赋值运算中的$\\alpha$称为学习速率,通常采用手动设置(learning rate,在本例中,它决定了我们“向下山走”时每一步的大小,过小的话收敛太慢,过大的话可能错过最小值)。这是一种很自然的算法,每一步总是寻找使$J$下降最“陡”的方向(就像找最快下山的路一样)。\n", 65 | "\n", 66 | "为了实现这是算法,我们需要找出偏导数是什么。我们从最简单的情况入手,假设只有一个训练样本$(x,\\ y)$,这样我们就可以忽略$(J)$式中的求和步骤:\n", 67 | "\n", 68 | "$$\\begin{align}\\frac{\\partial}{\\partial\\theta_j}J(\\theta)&=\\frac{\\partial}{\\partial\\theta_j}\\frac{1}{2}\\left(h_\\theta(x)-y\\right)^2\\\\&=2\\cdot\\frac{1}{2}\\left(h_\\theta(x)-y\\right)\\cdot\\frac{\\partial}{\\partial\\theta_j}\\left(h_\\theta(x)-y\\right)\\\\&=\\left(h_\\theta(x)-y\\right)\\cdot\\frac{\\partial}{\\partial\\theta_j}\\left(\\sum_{i=0}^n\\theta_ix_i-y\\right)\\\\&=\\left(h_\\theta(x)-y\\right)x_j\\end{align}$$\n", 69 | "\n", 70 | "训练集仅有一条数据的情况给了我们更新规则:$\\theta_j:=\\theta_j+\\alpha\\left(y^{(i)}-h_\\theta(x^{(i)})\\right)x_j^{(i)}$。\n", 71 | "\n", 72 | "这条规则称为**最小均方(LMS: Least mean squares)**更新规则,也被称作Widrow-Hoff学习规则。这条规则一些看上去很直观、自然的特征,比如更新的幅度与**误差项**$\\left(y^{(i)}-h_\\theta(x^{(i)})\\right)$的大小呈正比。因此,如果我们拿到一条训练向量,其目标量$y^{(i)}$与我们函数的预测值$h_\\theta(x^{(i)}$非常接近,则在这条规则作用下,函数的参数$\\theta_j$只需要很小的调整;相反的,如果预测值与目标量误差较大,则会得到一个较大的参数调整。\n", 73 | "\n", 74 | "上面,我们使用仅含有一条训练样例的训练集推导出了LMS规则,我们需要将规则推广以适用于正常的训练集,介绍两种方法:\n", 75 | "\n", 76 | "* 一种方法是:\n", 77 | "\n", 78 | " ```\n", 79 | " Repeat until convergence {\n", 80 | " ```\n", 81 | " $\\qquad\\quad\\quad\\theta_j:=\\theta_j+\\alpha\\underbrace{\\displaystyle\\sum_{i=1}^m\\left(y^{(i)}-h_\\theta(x^{(i)})\\right)x_j^{(i)}}\\qquad\\quad(for\\ every\\ j)$\n", 82 | " ```\n", 83 | " }\n", 84 | " ```\n", 85 | "\n", 86 | "\n", 87 | "对于所有的$j$,重复迭代$\\theta_j:=\\theta_j+\\alpha\\displaystyle\\sum_{i=1}^m\\left(y^{(i)}-h_\\theta(x^{(i)})\\right)x_j^{(i)}$直到$\\theta_j$收敛。\n", 88 | "\n", 89 | "从这个式子里容易看出,大括号中的求和过程就是$\\frac{\\partial J(\\theta)}{\\partial\\theta_j}$(在有$m$个训练样本时,观察$(J)$式)。所以,这个方法其实就是对$J(\\theta)$原始的成本函数做了简单的梯度下降。该方法在每一步搜索“最陡方向”时都会遍历整个训练集,所以也被称作**批量梯度下降(batch\n", 90 | "gradient descent)**。值得注意的是,梯度下降可以容易的达到局部最小值,而且我们此处的优化问题也只有一个全局最优解(没有局部最小值)。因此,在本例中,梯度下降总是收敛于全局最小值(当然学习速率$\\alpha$不能过大)。况且成本函数$J$确实是一个凸二次函数(仅有一个全局最小值)。\n", 91 | "\n", 92 | "\"\"\n", 93 | "\n", 94 | "图中的椭圆为某二次函数的等高线,同时也显示了梯度下降法从初始值$(48,\\ 30)$到最小值中间的轨迹。图中的“×”标记了梯度下降过程中经过的一系列$\\theta$值。\n", 95 | "\n", 96 | "关于收敛,我们可以查看两侧迭代是否相差很多,如果相差无几则可以判断收敛;更常用的方法是检查$J(\\theta)$,如果这个值不再发生较大变化时,也可以判断收敛。关于找如何“找”最陡下山路径,其实求偏导本身就已经给出了最陡路径。\n", 97 | "\n", 98 | "我们运行批量梯度下降算法用$\\theta$拟合“公寓租金”训练集,以求得根据面积预测价格的函数,最终得到$\\theta_0=71.27,\\ \\theta_1=0.1345$。当我们在最开始的“面积-价格”图中画出关于面积$x$的函数$h_\\theta(x)$时,有:\n", 99 | "\n", 100 | "\"\"\n", 101 | "\n", 102 | "\n", 103 | "如果将卧室数量也纳入输入特征,则会得到$\\theta_0=89.60,\\ \\theta_1=0.1392,\\ \\theta_2=-8.738$。这个结果也是通过批量梯度下降求得。\n", 104 | "\n", 105 | "* 我们接下来介绍第二种方法:\n", 106 | "\n", 107 | " ```\n", 108 | " Loop {\n", 109 | " for i=1 to m, {\n", 110 | " ```\n", 111 | " $\\qquad\\qquad\\quad\\quad\\theta_j:=\\theta_j+\\alpha\\left(y^{(i)}-h_\\theta(x^{(i)})\\right)x_j^{(i)}\\qquad\\qquad\\quad(for\\ every\\ j)$\n", 112 | " ```\n", 113 | " }\n", 114 | " }\n", 115 | " ```\n", 116 | "\n", 117 | "在这个方法中,我们每次仅使用一个训练样本,根据由这个样本得到的误差梯度来更新参数$\\theta$。整个算法运行完毕时,对每一套$\\theta$参数,每个样本只使用了一次。这就是**随机梯度下降(stochastic gradient descent)**,也称作**增量梯度下降(incremental\n", 118 | "gradient descent)**。相对于批量梯度下降每走一步都需要遍历整个训练集(如果训练集样本很多,即$m$很大时,就是非常繁重的计算),随机梯度下降每一步就轻松很多,之后就是不断地根据遇到的每一个样本调整参数。通常情况下,随机梯度下降能够比批量梯度下降更快的使$\\theta$接近最优解。(然而,值得注意的是,随机梯度下降可能永远都不会收敛于最小值点,参数$\\theta$将在$J(\\theta)$最小值附近持续摆动。不过,在实践中,最小值附近的解通常都足够接近最小值。另外,在随机梯度下降的实际操作中,随着迭代步骤的进行,我们会慢慢减小$\\alpha$的值至$0$,这样也可以保证参数收敛于全局最小值,而不是在其附近持续摆动)。也是因为效率原因,在遇到训练集中包含大量样本的情况下,我们通常会选用随机梯度下降法。\n", 119 | "\n", 120 | "## 2. 正规方程组(The normal equations)\n", 121 | "\n", 122 | "梯度下降给了我们一种最小化$J$的途径,下面我们看另一种方法。这次我们直接通过计算实现最小化,不再依靠类似梯度下降中使用的分步迭代算法。此方法会直接对$J$求$\\theta$的偏导,并使偏导为零,以求$J$的极值点。正规方程组会涉及较多的线性代数,为了避免大篇幅的矩阵求导等运算,我们引入一些新的记号。\n", 123 | "\n", 124 | "### 2.1 矩阵求导\n", 125 | "\n", 126 | "定义函数$f:\\ \\mathbb{R}^{m\\times n}\\to\\mathbb{R}$,这是一个从$m\\times n$阶矩阵到实数的映射,我们定义对“$f$关于$A$的函数”求关于$A$的导数:\n", 127 | "\n", 128 | "$$\\nabla_Af(A)=\\begin{bmatrix}\\frac{\\partial f}{\\partial A_{11}}&\\cdots&\\frac{\\partial f}{\\partial A_{1n}}\\\\\\vdots&\\ddots&\\vdots\\\\\\frac{\\partial f}{\\partial A_{m1}}&\\cdots&\\frac{\\partial f}{\\partial A_{mn}}\\end{bmatrix}$$\n", 129 | "\n", 130 | "可以发现,$\\nabla_Af(A)$的梯度是一个$m\\times n$阶矩阵,它的第$(i,\\ j)$个元素为$\\frac{\\partial f}{\\partial A_{ij}}$。举个例子,矩阵$A=\\begin{bmatrix}A_{11}&A_{12}\\\\A_{21}&A_{22}\\end{bmatrix}$是一个二阶方阵,定义函数$f:\\ \\mathbb{R}^{2\\times 2}\\to \\mathbb{R}$,有$f(A)=\\frac{3}{2}A_{11}+5A_{12}^2+A_{21}A_{22}$,于是有$\\nabla_Af(A)=\\begin{bmatrix}\\frac{3}{2}&10A_{12}\\\\A_{22}&A_{21}\\end{bmatrix}$。\n", 131 | "\n", 132 | "在引入$\\mathrm{tr}$来表示矩阵的**迹(trace)**。对于一个$n$阶方阵$A$,定义$A$的迹为其对角线元素之和:\n", 133 | "\n", 134 | "$$\\mathrm{tr}A=\\sum_{i=1}^nA_{ii}$$\n", 135 | "\n", 136 | "实数的迹就是它本身,$a\\in\\mathbb{R},\\ \\mathrm{tr}\\ a=a$。(如果以前没遇到过这种“操作符记号”,可以把$A$的迹看做作用在$A$上的\"迹\"函数$\\mathrm{tr}(A)$,而对于迹,我们通常不写括号)。\n", 137 | "\n", 138 | "矩阵的迹符合“按次序”的交换律:\n", 139 | "\n", 140 | "$$\\mathrm{tr}AB=\\mathrm{tr}BA,\\quad \\mathrm{tr}ABC=\\mathrm{tr}CAB=\\mathrm{tr}BCA,\\quad \\mathrm{tr}ABCD=\\mathrm{tr}DABC=\\mathrm{tr}CDAB=\\mathrm{tr}BCDA$$\n", 141 | "\n", 142 | "下面的推论中$A,\\ B$皆为方阵:\n", 143 | "\n", 144 | "$$\\begin{align}\\mathrm{tr}A&=\\mathrm{tr}A^T\\\\\\mathrm{tr}(A+B)&=\\mathrm{tr}A+\\mathrm{tr}B\\\\\\mathrm{tr}\\ aA&=a\\mathrm{tr}A\\end{align}$$\n", 145 | "\n", 146 | "我们就不证明上面这些推论了(有些性质我们会在后面的章节使用)。接下来是关于迹和导数的推论:\n", 147 | "\n", 148 | "$$\\begin{align}\\nabla_A\\mathrm{tr}AB&=B^T\\tag{1}\\\\\\nabla_{A^T}f(A)&=\\left(\\nabla_Af(A)\\right)^T\\tag{2}\\\\\\nabla_A\\mathrm{tr}ABA^TC&=CAB+C^TAB^T\\tag{3}\\\\\\nabla_A\\lvert A\\rvert&=\\lvert A\\rvert\\left(A^{-1}\\right)^T\\tag{4}\\end{align}$$\n", 149 | "\n", 150 | "结合推论$(2),\\ (3)$有:\n", 151 | "\n", 152 | "$$\\nabla_{A^T}\\ \\mathrm{tr}ABA^TC=B^TA^TC^T+BA^TC\\tag{5}$$\n", 153 | "\n", 154 | "推论$(4)$只用于非奇异方阵,$\\lvert A\\rvert$表示矩阵的行列式。\n", 155 | "\n", 156 | "为了使这些推论更形象,我们详细解释一下等式$(1)$为何成立。设有矩阵$B\\in\\mathbb{R}^{n\\times m}$,我们可以以$f(A)=\\mathrm{tr}AB$为原型定义函数$f:\\ \\mathbb{R}^{m\\times n}\\to\\mathbb{R}$。因为$A\\in\\mathbb{R}^{m\\times n}$,所以$AB\\in\\mathbb{R}^{m\\times m}$为方阵,所以我们对其求迹是可行的。因此函数$f$的确做了$\\mathbb{R}^{m\\times n}$到$\\mathbb{R}$的映射。然后我们再对其应用一开始定义的矩阵求导,计算$\\nabla_Af(A)$,根据定义可知,结果仍是一个$m\\times n$的矩阵。根据矩阵求导定义,$\\mathrm{tr}AB$对$A$求导后,结果矩阵中第$(i,\\ j)$个元素应为$B_{ji}$,也就是$B^T$的第$(i,\\ j)$个元素。\n", 157 | "\n", 158 | "推论$(1)-(3)$都较为简单,而推论$(4)$可以从逆的伴随矩阵表示法得出:定义$A'$是方阵$A$的代数余子式(其第$(i,\\ j)$元素为$(-1)^{i+j}$乘以“从$A$中删掉第$i$行和第$j$列所得到的方阵”的行列式)于是可以证明$A^{-1}=\\frac{\\left(A'\\right)^T}{\\lvert A\\rvert}$(可以找一个二阶方阵来验证,如果想要看完整证明可以参考中高阶线代课本,如Charles Curtis, 1991, Linear Algebra, Springer。也可以参考[MIT线性代数第二十讲笔记](http://nbviewer.jupyter.org/github/zlotus/notes-linear-algebra/blob/master/chapter20.ipynb))这个结论表明$A'=\\lvert A\\rvert\\left(A^{-1}\\right)^T$,同时,行列式可以表示为$\\lvert A\\rvert=\\sum_jA_{ij}A'_{ij}$(按第$j$列做代数余子式列展开),注意到$\\left(A'\\right)_{ij}$并不依赖元素$A_{ij}$(从代数余子式的定义得到),这说明$\\frac{\\partial\\lvert A\\rvert}{A_{ij}}=A'_{ij}$,综上得$(4)$。\n", 159 | "\n", 160 | "### 2.2 再看最小二乘\n", 161 | "\n", 162 | "有了矩阵求导,我们再来看如何形式化“使$J(\\theta)$能够取到最小值”的$\\theta$。我们将$J$重新按照矩阵及向量的标记法表示。\n", 163 | "\n", 164 | "对于已知训练集,定义**设计矩阵(design matrix)**$X$,这是一个$m\\times n$矩阵(如果算上截距项,则应是$m\\times (n+1)$矩阵,第一项为$\\theta_0x_0,\\ x_0=1$),矩阵以各训练样本作为行向量:$X=\\begin{bmatrix}—\\left(x^{(1)}\\right)^T—\\\\—\\left(x^{(2)}\\right)^T—\\\\\\vdots\\\\—\\left(x^{(m)}\\right)^T—\\end{bmatrix}$。\n", 165 | "\n", 166 | "同样的,将训练集中的所有目标值放入$m$维列向量$\\vec y=\\begin{bmatrix}y^{(1)}\\\\y^{(2)}\\\\\\vdots\\\\y^{(m)}\\end{bmatrix}$。\n", 167 | "\n", 168 | "再将$h_\\theta\\left(x^{(i)}\\right)=\\left(x^{(i)}\\right)^T\\theta$表示为向量形式有$X\\theta-\\vec y=\\begin{bmatrix}\\left(x^{(1)}\\right)^T\\theta\\\\\\left(x^{(2)}\\right)^T\\theta\\\\\\vdots\\\\\\left(x^{(m)}\\right)^T\\theta\\end{bmatrix}-\\begin{bmatrix}y^{(1)}\\\\y^{(2)}\\\\\\vdots\\\\y^{(m)}\\end{bmatrix}=\\begin{bmatrix}h_\\theta\\left(x^{(1)}\\right)-y^{(1)}\\\\h_\\theta\\left(x^{(2)}\\right)-y^{(2)}\\\\\\vdots\\\\h_\\theta\\left(x^{(m)}\\right)-y^{(m)}\\end{bmatrix}$。\n", 169 | "\n", 170 | "在线性代数中我们知道,向量与自身做内积得到向量长度的平方,即$z^Tz=\\sum_iz_i^2$,则有:\n", 171 | "\n", 172 | "$$\\begin{align}\\frac{1}{2}\\left(X\\theta-\\vec y\\right)^T\\left(X\\theta-\\vec y\\right)&=\\frac{1}{2}\\sum_{i=1}^m\\left(h_\\theta\\left(x^{(i)}\\right)-y^{(i)}\\right)^2\\\\&=J(\\theta)\\end{align}$$\n", 173 | "\n", 174 | "最后,为了最小化$J$,我们来求$J$关于$\\theta$的导数,于是有:\n", 175 | "\n", 176 | "$$\\begin{align}\\nabla_\\theta J(\\theta)&=\\nabla_\\theta\\frac{1}{2}\\left(X\\theta-\\vec y\\right)^T\\left(X\\theta-\\vec y\\right)\\\\&=\\frac{1}{2}\\nabla_\\theta\\left(\\theta^TX^TX\\theta-\\theta^TX^T\\vec y-\\vec{y}^TX\\theta+\\vec{y}^T\\vec y\\right)\\\\&=\\frac{1}{2}\\nabla_\\theta\\mathrm{tr}\\left(\\theta^TX^TX\\theta-\\theta^TX^T\\vec y-\\vec{y}^TX\\theta+\\vec{y}^T\\vec y\\right)\\\\&=\\frac{1}{2}\\nabla_\\theta\\left(\\mathrm{tr}\\theta^TX^TX\\theta-2\\mathrm{tr}\\ \\vec{y}^TX\\theta\\right)\\\\&=\\frac{1}{2}\\left(X^TX\\theta+X^TX\\theta-2X^T\\vec y\\right)\\\\&=X^TX\\theta-X^T\\vec y\\end{align}$$\n", 177 | "\n", 178 | "* 第二步括号内的运算其实是一个数($\\left(X\\theta-\\vec y\\right)$长度的平方),所以可以在第三步中使用性质“实数的迹就是它本身”;\n", 179 | "* 第三步到第四部使用了推论$\\mathrm{tr}A=\\mathrm{tr}A^T$合并项;\n", 180 | "* 第四步到第五步使用推论$(5):\\ \\nabla_{A^T}\\ \\mathrm{tr}ABA^TC=B^TA^TC^T+BA^TC$,其中$A^T=\\theta,\\ B=B^T=X^TX,\\ C=I$;以及推论$(1):\\ \\nabla_A\\mathrm{tr}AB=B^T$\n", 181 | "\n", 182 | "最终得到**正规方程组(normal equations)**:\n", 183 | "\n", 184 | "$$\\bbox[30px,border:2px solid red]{X^TX\\theta=X^T\\vec y}$$\n", 185 | "\n", 186 | "因此,我们得到形式化的使得“使$J(\\theta)$能够取到最小值”的 $\\theta=\\left(X^TX\\right)^{-1}X^T\\vec y$。\n", 187 | "\n", 188 | "另外,在[MIT线性代数第二十讲笔记](http://nbviewer.jupyter.org/github/zlotus/notes-linear-algebra/blob/master/chapter16.ipynb)有关于正规方程组几何意义(向量空间投影)的推导。" 189 | ] 190 | } 191 | ], 192 | "metadata": { 193 | "kernelspec": { 194 | "display_name": "Python 3", 195 | "language": "python", 196 | "name": "python3" 197 | }, 198 | "language_info": { 199 | "codemirror_mode": { 200 | "name": "ipython", 201 | "version": 3 202 | }, 203 | "file_extension": ".py", 204 | "mimetype": "text/x-python", 205 | "name": "python", 206 | "nbconvert_exporter": "python", 207 | "pygments_lexer": "ipython3", 208 | "version": "3.5.2" 209 | } 210 | }, 211 | "nbformat": 4, 212 | "nbformat_minor": 0 213 | } 214 | -------------------------------------------------------------------------------- /chapter03.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第三讲:线性回归的概率解释、局部加权回归、逻辑回归\n", 8 | "\n", 9 | "我们先来回顾一下上一讲中的内容。\n", 10 | "\n", 11 | "* 我们用$\\left(x^{(i)},\\ y^{(i)}\\right)$表示训练集中的第$i$个样本;\n", 12 | "* 用向量$\\vec\\theta=(\\theta_0,\\ \\cdots,\\ \\theta_n)$表示特征值的系数向量;\n", 13 | "* 接着用$h_\\theta\\left(x^{(i)}\\right)$表示用于拟合训练集中样本的假设函数(假设函数基于参数$\\vec\\theta$),并定义$h_\\theta\\left(x^{(i)}\\right)=\\displaystyle\\sum_{j=0}^n\\theta_jx_j^{(i)}=\\theta^Tx$,$j$表示训练集中各样本的特征值$(x_1,\\ \\cdots,\\ x_n)$的序号,共有$n$个特征值,而$x_0=1$,此为常数项$\\theta_0$(即截距项);\n", 14 | "* 最后定义了成本函数$J(\\theta)=\\frac{1}{2}\\left(\\displaystyle\\sum_{i=1}^mh_\\theta\\left(x^{(i)}\\right)-y^{(i)}\\right)^2$,其中$m$表示训练集中共有$m$个训练样本,其形式化描述为$\\theta=\\left(X^TX\\right)^{-1}X^Ty$。\n", 15 | "\n", 16 | "下面我们将接着上一讲的内容,从概率解释的角度介绍最小二乘的合理性。\n", 17 | "\n", 18 | "## 3. 线性模型的概率解释\n", 19 | "\n", 20 | "当我们遇到一个回归问题时,可能会有疑问,为什么使用线性回归?更具体的可能会问,为什么使用最小二乘成本函数$J$?这样合理吗?有那么多别的指标,比如预测值与实际值之差的绝对值、四次方等,为什么偏偏选择差的平方作为优化指标?在这一节我们将从一系列基于概率的假设中推出最小二乘回归的合理性。\n", 21 | "\n", 22 | "仍旧使用“公寓租金”例子,我们假设价格是一些特征的线性函数加上$\\epsilon^{(i)}$,于是有下面的式子将目标值与输入向量联系起来:\n", 23 | "\n", 24 | "$$y^{(i)}=\\theta^Tx^{(i)}+\\epsilon^{(i)}$$\n", 25 | "\n", 26 | "式中的$\\epsilon^{(i)}$是误差项,它捕获了可能的未建模影响因素(比如我们的回归算法并没有纳入某个影响公寓租金的关键因素),也可能包含了存在于样本中的随机噪音。我们做出进一步假设,$\\epsilon^{(i)}$是独立同分布(IDD: independently and identically distributed)的,服从期望为$0$方差为$\\sigma^2$的高斯分布(或自然分布,Gaussian distribution/Normal distribution),即$\\epsilon^{(i)}\\sim N\\left(0,\\sigma^2\\right)$,即$\\epsilon^{(i)}$的概率密度函数为:\n", 27 | "\n", 28 | "$$p\\left(\\epsilon^{(i)}\\right)=\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{\\left(\\epsilon^{(i)}\\right)^2}{2\\sigma^2}\\right)$$\n", 29 | "\n", 30 | "则可以得到:\n", 31 | "\n", 32 | "$$p\\left(y^{(i)}\\mid x^{(i)};\\theta\\right)=\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2}{2\\sigma^2}\\right)$$\n", 33 | "\n", 34 | "(这里教授简要说明了为什么使用高斯分布,一个原因是因为高斯分布便于计算;另一个原因是在处理实际问题的过程中,如果我们使用线性回归让后尝试测量误差的分布,大多情况下误差都服从高斯分布。高斯模型对于这类对于这类回归问题中的误差来说是一个很好的假设。另外,许多随机变量之和趋于服从高斯分布,如果误差是有许多效应共同导致的,例如卖家的情绪、买家的情绪、房子是否有花园、房间的壁炉数量等等,所有这些效应都是独立的,那么根据中心极限定理,这些效应的总和会近似的服从高斯分布。)\n", 35 | "\n", 36 | "$p\\left(y^{(i)}\\mid x^{(i)};\\theta\\right)$表示以$\\theta$为参数的对于给定$x^{(i)}$下$Y$的条件概率。我们不能将$\\theta$也纳入条件(即不能记为$p\\left(y^{(i)}\\mid x^{(i)},\\theta\\right)$,这表示$y$是以$\\theta,\\ X$的为条件的概率,属于贝叶斯学派的观点),因为$\\theta$并不是一个随机变量(频率学派的观点,我们不把$\\theta$当做随机变量,我们认为$\\theta$确有其值,但是我们现在不知道是多少)。我们也可以将$y^{(i)}$的分别表示为$y^{(i)}\\mid x^{(i)};\\theta\\sim N\\left(\\theta^Tx^{(i)},\\sigma^2\\right)$。(即在给定$x^{(i)}$下假设函数的期望是$\\theta^Tx^{(i)}$。)\n", 37 | "\n", 38 | "现在,已知$X$(包含所有训练样本$x^{(i)}$的设计矩阵)和$\\theta$,求$y^{(i)}$的分布。概率由$p\\left(\\vec y\\mid X;\\theta\\right)$给出,这个量通常被视为一个关于$\\vec y$(也可能关于$X$)的函数,有着固定参数$\\theta$。现在我们明确的将这个量视为一个关于$\\theta$的函数,我们仍叫它**似然函数(likelihood function)**($\\theta$的似然性是关于给定$X$下数据$Y$以$\\theta$作为参数的概率,虽然$\\theta$的似然性与数据$Y$的概率是一样的,而且尽管似然性和概率几乎是一样的意义,然而我们在这里使用似然性这个词是想强调,我们想要把$p\\left(\\vec y\\mid X;\\theta\\right)$看做是在$\\vec y,\\ X$确定时关于$\\theta$的函数,以后我们也会继续使用“参数的似然性”和“数据的概率”这种称谓,而不是“数据的似然性”和“参数的概率”这种说法。):\n", 39 | "\n", 40 | "$$L(\\theta)=L\\left(\\theta;X,\\vec y\\right)=p\\left(\\vec y\\mid X;\\theta\\right)$$\n", 41 | "\n", 42 | "利用$\\epsilon^{(i)}$独立的假设(也因为$y^{(i)}$是对于给定$x^{(i)}$的),上式可以写为:\n", 43 | "\n", 44 | "$$\\begin{align}L(\\theta)&=\\prod_{i=1}^mp\\left(y^{(i)}\\mid x^{(i)};\\theta\\right)\\\\&=\\prod_{i=1}^m\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2}{2\\sigma^2}\\right)\\end{align}$$\n", 45 | "\n", 46 | "我们现在推出了将$x^{(i)}$与$y^{(i)}$联系在一起的概率模型,接下来需要考虑如何合理的对参数$\\theta$做出猜测?最大似然估计告诉我们,应该选择使数据概率尽可能大的$\\theta$,于是,我们应该选择能够使$L(\\theta)$取最大值的$\\theta$。\n", 47 | "\n", 48 | "比起最大化$L(\\theta)$,我们也可以选择最大化任意关于$L(\\theta)$的严格增函数。因此,为了便于求导,我们可以最大化**对数似然估计(log likelihood)**$\\mathscr{l}(\\theta)$:\n", 49 | "\n", 50 | "$$\\begin{align}\\mathscr{l}(\\theta)&=\\log L(\\theta)\\\\&=\\log \\prod_{i=1}^m\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2}{2\\sigma^2}\\right)\\\\&=\\sum_{i=1}^m\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2}{2\\sigma^2}\\right)\\\\&=m\\log \\frac{1}{\\sqrt{2\\pi}\\sigma}-\\frac{1}{\\sigma^2}\\cdot\\frac{1}{2}\\sum_{i=1}^m\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2\\end{align}$$\n", 51 | "\n", 52 | "于是,我们发现,最大化$\\mathscr{l}(\\theta)$的过程变成了最小化$\\frac{1}{2}\\sum_{i=1}^m\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2$,这个式子正是成本函数$J(\\theta)$的定义式。\n", 53 | "\n", 54 | "综上,可以看出,在关于训练数据的概率假设中,最小二乘回归与$\\theta$的最大似然估计一致。也正是因为最小二乘回归其实是再做最大似然估计,所以我们才会强调最小二乘是一种“很自然”的方法。(不过,概率假设并不是证明“最小二乘是一种非常易用的、合理的求解过程”这一结论的*必要条件*,这只是众多假设中的一种,最小二乘在这种假设下合理,除此之外还有其他假设也可以证明这一结论。)\n", 55 | "\n", 56 | "还需要注意的是,我们对$\\theta$的求解并不依赖与$\\sigma^2$,即使不知道$\\sigma$我们依然完成了运算。我们将在后面关于指数族和一般线性模型的课程中使用这一结论。\n", 57 | "\n", 58 | "## 欠拟合和过拟合\n", 59 | "\n", 60 | "继续使用上一讲的例子,当我们考虑使用特征变量$x\\in\\mathbb{R}$来预测$y$,下图最左为使用直线$y=\\theta_0+\\theta_1x$拟合训练集,可以发现得到的直线并不能较为准确的描述训练数据的形态,我们说这不是一个良好的拟合。\n", 61 | "\n", 62 | "\"\"\n", 63 | "\n", 64 | "如果我们再加入一个特征值$x^2$,然后对$y=\\theta_0+\\theta_1x+\\theta_2x^2$做拟合,于是我们得到一个稍好的拟合,如中图所示。看上去似乎是特征值取的越多越好,其实不然,取的过多也会有问题。如图中最右所示,这是用五阶多项式$y=\\displaystyle\\sum_{j=0}^5\\theta_jx_j$得到的结果,可以看出曲线恰好能够经过每一个训练样本,但这并不是我们期望的良好的拟合,比如在“公寓租金”的例子中,这个曲线并不能良好的反映面积$x$对租金$y$的影响。我们将在后面的课程中形式化定义这个现象,并告诉大家如何鉴定什么才是一个“良好的”假设,现在大家只需要了解,左图叫做**欠拟合(underfitting)**,表示数据的特征并没有被拟合曲线良好的表达出来;而右图叫做**过拟合(overfitting)**。\n", 65 | "\n", 66 | "从上面的例子,我们可以清楚的认识到,对特征的选择会在很大程度上影响学习算法的表现。(当学到模型选择时,我们也会见到自动选择“好”特征值的算法。)\n", 67 | "\n", 68 | "## 4. 局部加权回归(LWR: locally weighted linear regression)\n", 69 | "\n", 70 | "如果我们有足够的训练数据,特征值的选择就没那么重要了。在前面学到的线性回归中,为了查询$x$(即得到$h(x)$),我们将执行下面的步骤:\n", 71 | "\n", 72 | "1. 寻找使$\\sum_i\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2$取最小的$\\theta$;\n", 73 | "2. 给出预测结果$\\theta^Tx$。\n", 74 | "\n", 75 | "相比上面的过程,局部加权回归执行以下步骤:\n", 76 | "\n", 77 | "1. 针对给定的查询点$x$,寻找使$\\sum_i\\omega^{(i)}\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2$取最小的$\\theta$;\n", 78 | "2. 给出预测结果$\\theta^Tx$。\n", 79 | "\n", 80 | "这里的$\\omega$称为权值,是一个非负数。直观上看,如果对于某个$i$,$\\omega^{(i)}$取值较大,则在计算$\\theta$取值时,我们将尽可能的减小$\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2$项的取值(精确拟合);反之,如果$\\omega^{(i)}$取值较小,则$\\left(y^{(i)}-\\theta^Tx^{(i)}\\right)^2$所得到的的误差项将足够小而忽略不计。\n", 81 | "\n", 82 | "一种较为合理的权值设置(这里我们使用指数衰减函数,exponential decay function,权值的设置还有很多其他选择):\n", 83 | "\n", 84 | "$$\\omega^{(i)}=exp\\left(-\\frac{\\left(x^{(i)}-x\\right)^2}{2\\tau^2}\\right)$$\n", 85 | "\n", 86 | "易看出,对于给定的查询点$x$,权值的大小与训练样本$x^{(i)}$相对于$x$的位置密切相关:\n", 87 | "\n", 88 | "* 如果$x^{(i)}$距离$x$很近,则$\\omega^{(i)}$将取靠近$1$的值;\n", 89 | "* 如果$x^{(i)}$距离$x$很远,则$\\omega^{(i)}$将取到$0$附近。\n", 90 | "\n", 91 | "因此,通过这种方法得到的$\\theta$将更注重查询点$x$附近的训练样本(权重较高)的精确拟合,而忽略那些距离较远的训练样本(权重较低)。(尽管权值函数的样子看起来很像高斯分布的概率密度函数,但是这个函数跟高斯分布并没有直接联系,另外$\\omega^{(i)}$并不是随机变量,也并不服从高斯分布,它只是一个样子恰好类似钟形的曲线。)\n", 92 | "\n", 93 | "函数中的$\\tau$称作**带宽(bandwidth)**(或波长)参数,它控制了权值随距离下降的速率。如果$\\tau$取值较小,则会得到一个较窄的钟形曲线,这意味着离给定查询点$x$较远的训练样本$x^{(i)}$的权值(对查询点$x$附近训练样本的拟合的影响)将下降的非常快;而$\\tau$较大时,则会得到一个较为平缓的曲线,于是查询点附近的训练样本的权重随距离而下降的速度就会相对比较慢。\n", 94 | "\n", 95 | "值得注意的是,这是一个非参数算法,我们在使用这个方法时,是针对给定的查询点$x$进行计算,也就是每当我们对于一个给定的$x$做出预测时,都需要根据整个训练集重新进行拟合运算,如果训练集很大而查询很频繁的话,这个算法的代价将非常高。关于提高这个算法的效率,可以参考Andrew Moore关于KD-Tree的工作。\n", 96 | "\n", 97 | "# 第二部分:分类问题(Classification)和逻辑回归(Logistic regression)\n", 98 | "\n", 99 | "在前面的回归问题中,我们尝试预测的变量$y$是连续变量,现在我们来讨论分类问题。分类问题与回归问题不同之处在于,$y$的取值是少量的离散值。现在,我们先介绍**二元分类(binary classification)**,也就是$y$只能取$0$或$1$。(在二元分类中介绍的很多方法也可以推广至多元情况。)比如,我们尝试实现一个垃圾邮件分类器,用$x^{(i)}$表示邮件的某些特征,通过分类算法预测得到:如果该邮件是垃圾邮件时$y=1$,反之$y=0$。我们也把$0$称为**negative class**,把$1$称为**positive class**,我们有时也使用$-,\\ +$作为标记。对于给定的$x^{(i)}$,$y^{(i)}$也称作训练样本的**label**。\n", 100 | "\n", 101 | "## 5. 逻辑回归\n", 102 | "\n", 103 | "对于分类问题,我们也可以无视$y$是取离散值的特征而继续使用线性回归,使用老办法通过$x$预测$y$的取值。然而,强行使用线性回归的方法处理分类问题通常会得到很糟糕的预测结果。况且,在我们已经明确知道$y\\in\\{0,\\ 1\\}$的情况下仍旧使用线性回归的$h_\\theta(x)\\in\\mathbb{R}$是不合逻辑的。\n", 104 | "\n", 105 | "所以,我们应该对原来的假设函数做出修改:\n", 106 | "\n", 107 | "$$h_\\theta(x)=g\\left(\\theta^Tx\\right)=\\frac{1}{1+e^{-\\theta^Tx}}$$\n", 108 | "\n", 109 | "这里的$g(z)=\\frac{1}{1+e^{-z}}$,也叫作**逻辑函数(logistic function)**或**S型函数(sigmoid function)**,图像如下图所示:\n", 110 | "\n", 111 | "\"\"\n", 112 | "\n", 113 | "在$z\\to\\infty$时函数$g(z)$趋近于$1$,而$z\\to-\\infty$是函数$g(z)$趋近于$0$。而且不光是$g(z)$,包括上面的$h(x)$都在$(0, 1)$之间取值。有$\\theta^Tx=\\theta_0+\\displaystyle\\sum_{j=0}^n\\theta_jx_j$,这里我们依然令$x_0=1$。\n", 114 | "\n", 115 | "其它的在$(-\\infty,\\ \\infty)$上能够从$0$取到$1$的可导的连续函数也可以使用,但是因为一些原因(我们将在后面的关于GLM、生成学习法的课程中了解),选择上面的逻辑函数是一种“自然”的结果。再继续前,我们先来看一下逻辑函数求导的优良性质:\n", 116 | "\n", 117 | "$$\\begin{align}g'(z)&=\\frac{\\mathrm d}{\\mathrm dz}\\frac{1}{1+e^{-z}}\\\\&=\\frac{1}{\\left(1+e^{-z}\\right)^2}\\left(e^{-z}\\right)\\\\&=\\frac{1}{1+e^{-z}}\\cdot\\left(1-\\frac{1}{1+e^{-z}}\\right)\\\\&=g(z)(1-g(z))\\end{align}$$\n", 118 | "\n", 119 | "接下来,我们应该如何用$\\theta$拟合逻辑回归模型呢?在线性回归中我们知道了,从一些列假设下的最大似然估计可以推导出最小二乘回归的合理性,所以,我们也可以按照这个思路,给我们的分类模型赋予一些列概率假设,然后通过最大似然估计拟合参数。假设:\n", 120 | "\n", 121 | "$$\\begin{align}P(y=1\\mid x;\\theta)&=h_\\theta(x)\\\\P(y=0\\mid x;\\theta)&=1-h_\\theta(x)\\end{align}$$\n", 122 | "\n", 123 | "当然,我们也可以将这两个假设合入一个简洁的式子:\n", 124 | "\n", 125 | "$$p(y\\mid x;\\theta)=(h_\\theta(x))^y(1-h_\\theta(x))^{(1-y)}$$\n", 126 | "\n", 127 | "假设训练集中的$m$个训练样本是相互独立的,我们就可以这样写出参数的似然估计:\n", 128 | "\n", 129 | "$$\\begin{align}L(\\theta)&=p\\left(\\vec y\\mid X;\\theta\\right)\\\\&=\\prod_{i=1}^m p\\left(y^{(i)}\\mid x^{(i)};\\theta\\right)\\\\&=\\prod_{i=1}^m\\left(h_\\theta\\left(x^{(i)}\\right)\\right)^{y^{(i)}}\\left(1-h_\\theta\\left(x^{(i)}\\right)\\right)^{1-y^{(i)}}\\end{align}$$\n", 130 | "\n", 131 | "跟线性回归中的运算一样,我们取对数便于求导:\n", 132 | "\n", 133 | "$$\\begin{align}\\mathscr{l}(\\theta)&=\\log L(\\theta)\\\\&=\\sum_{i=1}^my^{(i)}\\log h_\\theta\\left(x^{(i)}\\right)+\\left(1-y^{(i)}\\right)\\log\\left(1-h_\\theta\\left(x^{(i)}\\right)\\right)\\end{align}$$\n", 134 | "\n", 135 | "我们依然沿用线性回归中的思路,通过求导发现最大化似然函数的极值点,这次我们使用梯度上升法。我们使用矢量记法,则有更新规则为$\\theta:=\\theta+\\alpha\\nabla_\\theta\\mathscr{l}(\\theta)$。(因为想要求函数的最大值,所以我们在更新规则里使用了加号。)我们现在假设训练集中只有一个训练样本$(x,\\ y)$,对其求导,希望能导出适用于随机梯度上升更新规则:\n", 136 | "\n", 137 | "$$\\begin{align}\\frac{\\partial}{\\partial\\theta_j}\\mathscr{l}(\\theta)&=\\left(y\\frac{1}{g\\left(\\theta^Tx\\right)}-(1-y)\\frac{1}{1-g\\left(\\theta^Tx\\right)}\\right)\\frac{\\partial}{\\partial\\theta_j}g\\left(\\theta^Tx\\right)\\\\&=\\left(y\\frac{1}{g\\left(\\theta^Tx\\right)}-(1-y)\\frac{1}{1-g\\left(\\theta^Tx\\right)}\\right)g\\left(\\theta^Tx\\right)\\left(1-g\\left(\\theta^Tx\\right)\\right)\\frac{\\partial}{\\partial\\theta_j}\\theta^Tx\\\\&=\\left(y\\left(1-g\\left(\\theta^Tx\\right)\\right)-(1-y)g\\left(\\theta^Tx\\right)\\right)x_j\\\\&=(y-h_\\theta(x))x_j\\end{align}$$\n", 138 | "\n", 139 | "在上面的求导中,从第一步到第二步我们使用了逻辑函数求导性质$g'(z)=g(z)(1-g(z))$。这样,我们也就得到了适用于随机梯度上升的更新规则:\n", 140 | "\n", 141 | "$$\\theta_j:=\\theta_j+\\alpha\\left(y^{(i)}-h_\\theta\\left(x^{(i)}\\right)\\right)x_j$$\n", 142 | "\n", 143 | "如果使用批量梯度上升则是:\n", 144 | "\n", 145 | "$$\\theta_j:=\\theta_j+\\alpha\\sum_{i=1}^m\\left(y^{(i)}-h_\\theta\\left(x^{(i)}\\right)\\right)x_j$$\n", 146 | "\n", 147 | "回顾上一讲的最小均方法法,我们会发现上面这条更新规则和以前的更新规则一模一样,我们在这里必须说明,$h_\\theta(x)$已经变为关于$\\theta^Tx^{(i)}$的非线性函数,所以这并不是同一个算法。尽管如此,对于不同的算法得到同样形式的更新规则,我们还是感到很惊讶。对于这个现象,我们会在后面关于GLM模型的课程中给出解释。\n", 148 | "\n", 149 | "## 6. 感知算法(perceptron learning algorithm)\n", 150 | "\n", 151 | "最后,我们来简要的介绍一下感知算法,我们以后在介绍学习理论是还会继续讨论这个算法。对于上面的逻辑回归,我们如何“强迫”算法只输出$0$或$1$?我们会自然的想到改变$g$的定义,使其变为一个阈函数:\n", 152 | "\n", 153 | "$$g(z)=\\begin{cases}1\\quad z\\geq 0\\\\0\\quad z\\lt 0\\end{cases}$$\n", 154 | "\n", 155 | "如果我们依然令$h_\\theta(x)=g\\left(\\theta^Tx\\right)$,并将$g$修改为上面的阈函数,然后使用$\\theta_j:=\\theta_j+\\alpha\\displaystyle\\sum_{i=1}^m\\left(y^{(i)}-h_\\theta\\left(x^{(i)}\\right)\\right)x_j$或$\\theta_j:=\\theta_j+\\alpha\\left(y^{(i)}-h_\\theta\\left(x^{(i)}\\right)\\right)x_j$作为学习规则,那么我们就实现了一个**感知算法(perceptron learning algorithm)**。\n", 156 | "\n", 157 | "在六十年代,这个感知算法被认为是一种粗略的描述脑中独立神经元工作方式的模型。该模型很简单,所以我们也将它作为日后讨论学习理论的起点。需要注意的是,尽管这个算法看起来并不特殊,但实际上,与其前面的逻辑回归、最小二乘线性回归比起来,这是一个非常不同的算法:比如,我们很难赋予它一个在概率上有意义的解释,也很难从最大似然估计推导出感知算法。" 158 | ] 159 | } 160 | ], 161 | "metadata": { 162 | "anaconda-cloud": {}, 163 | "kernelspec": { 164 | "display_name": "Python [default]", 165 | "language": "python", 166 | "name": "python3" 167 | }, 168 | "language_info": { 169 | "codemirror_mode": { 170 | "name": "ipython", 171 | "version": 3 172 | }, 173 | "file_extension": ".py", 174 | "mimetype": "text/x-python", 175 | "name": "python", 176 | "nbconvert_exporter": "python", 177 | "pygments_lexer": "ipython3", 178 | "version": "3.5.2" 179 | } 180 | }, 181 | "nbformat": 4, 182 | "nbformat_minor": 0 183 | } 184 | -------------------------------------------------------------------------------- /chapter04.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第四讲:牛顿法、一般线性模型\n", 8 | "\n", 9 | "回到上一讲介绍的逻辑回归:在逻辑回归中,我们用S型函数作为$g(z)$,使用梯度上升的更新规则求参数$\\theta$的最大似然估计。下面来介绍另一种方法:\n", 10 | "\n", 11 | "## 7. 牛顿法\n", 12 | "\n", 13 | "我们先回忆一下牛顿法找函数值零点:设函数$f:\\ \\mathbb{R}\\to\\mathbb{R}$,我们希望找到使$f(\\theta)=0$的$\\theta\\in\\mathbb{R}$值,牛顿法提供下面的更新规则:\n", 14 | "\n", 15 | "$$\\theta:=\\theta-\\frac{f(\\theta)}{f'(\\theta)}$$\n", 16 | "\n", 17 | "该算法的大概流程为:先做对$\\theta$做一次猜测$\\theta=\\theta_1$,然后过$f(\\theta_1)$做$f$的切线,切线交横轴于点$\\theta_2$(也就是切线函数值的零点),此时更新$\\theta=\\theta_2$,再过$f(\\theta_2)$做$f$的切线,这样$\\theta$就可以逼近使函数值为零的$\\theta$取值,下面是牛顿法图解:\n", 18 | "\n", 19 | "\"\"\n", 20 | "\n", 21 | "在最左的图中为函数$f$的图像,我们希望找到零$f(\\theta)=0$的点,从图中看这个点大约取在$1.3$附近。假设我们初始化算法时猜测$\\theta^{(0)}=4.5$,牛顿法会计算出函数$f$在$(4.5,\\ f(4.5))$点的切线并解出切线的零点(即切线与$y=0$的焦点,如中图所示)。这就是第二次猜测的起点,在图中$\\theta^{(1)}$大约在$2.8$附近。而最右侧的图像显示了再一次迭代的结果,这使得$\\theta^{(2)}$取到了$1.8$附近。在几轮迭代之后,$\\theta$会快速向$1.3$附近收敛。\n", 22 | "\n", 23 | "根据导数(切线斜率)的定义有$f'\\left(\\theta^{(0)}\\right)=\\frac{f\\left(\\theta^{(0)}\\right)}{\\Delta}$,于是$\\Delta=\\frac{f\\left(\\theta^{(0)}\\right)}{f'\\left(\\theta^{(0)}\\right)}$,所以$\\theta^{(1)}=\\theta^{(0)}-\\Delta=\\theta^{(0)}-\\frac{f\\left(\\theta^{(0)}\\right)}{f'\\left(\\theta^{(0)}\\right)}$。则对于一般情况有$\\theta^{(t+1)}=\\theta^{(t)}-\\frac{f\\left(\\theta^{(t)}\\right)}{f'\\left(\\theta^{(t)}\\right)}$。\n", 24 | "\n", 25 | "牛顿法给了我们一个求$f(\\theta)=0$的方法,我们也可以利用它来求函数$\\mathscr{l}(\\theta)$的最大值。函数的最大值点也就是$\\mathscr{l}(\\theta)$一阶倒数为零的点,所以只需要替换上面方法中的$f(\\theta)=\\mathscr{l}'(\\theta)$即可,我们可以用牛顿方法,按照下面的更新规则求出函数最大值:\n", 26 | "\n", 27 | "$$\\theta:=\\theta-\\frac{\\mathscr{l}'(\\theta)}{\\mathscr{l}''(\\theta)}$$\n", 28 | "\n", 29 | "上一讲中,我们在推导逻辑回归的最大值时,使用向量记法的$\\theta$,我们将这一标记法应用到牛顿法中,在这种多维条件下一般化的牛顿法(也称作Newton-Raphson方法)为:\n", 30 | "\n", 31 | "$$\\theta:=\\theta-H^{-1}\\nabla_\\theta\\mathscr{l}(\\theta)$$\n", 32 | "\n", 33 | "* 式中的$\\nabla_\\theta\\mathscr{l}(\\theta)$仍然表示$\\mathscr{l}(\\theta)$关于向量$\\theta$的每一个分量$\\theta_i$的偏导数;\n", 34 | "* $H$是一个$n$阶方阵(如果算上截距项应该是$n+1$阶方阵),称为**海森矩阵(Hessian matrix)**,为了便于记忆可以当做是一阶导数(向量)除以二阶导数(乘以方阵的逆),方阵的定义为:\n", 35 | "\n", 36 | "$$H_{ij}=\\frac{\\partial^2\\mathscr{l}(\\theta)}{\\partial\\theta_i\\partial\\theta_j}$$\n", 37 | "\n", 38 | "相比于(批量)梯度下降法,牛顿法收敛速度通常更快,且逼近最小值时需要的迭代次数更少(牛顿收敛是一个二阶收敛(quadratic convergence))。然而牛顿法单次迭代的代价通常比梯度下降法更大,因为它需要计算整个$n$阶方阵再求逆。通常情况下,在$n$不是很大的条件下,牛顿法总体上更快。当我们使用牛顿法求逻辑回归中对数化似然函数$\\mathscr{l}(\\theta)$的最大值时,这个算法也被称作**Fisher scoring**。\n", 39 | "\n", 40 | "# 第三部分:一般线性模型(Generalized Linear Models)\n", 41 | "\n", 42 | "到目前为止,我们了解了回归问题、分类问题:在回归问题中我们设$y\\mid x;\\theta\\sim\\mathcal{N}\\left(\\mu,\\sigma^2\\right)$,而在分类问题中我们设$y\\mid x;\\theta\\sim\\mathrm{Bernoulli}(\\phi)$,对关于$x$和$\\theta$的函数给出合理的$\\mu$和$\\phi$。我们会在这一节看到,这两种假设都是一族算法模型中的特例,这一族算法模型就是我们曾经提到的一般线性模型(GLMs)。我们还将了解别的GLM家族中的模型如何推导、应用于其他分类、回归问题中。\n", 43 | "\n", 44 | "## 8. 指数族(exponential family)\n", 45 | "\n", 46 | "我们从定义指数分布族开始介绍GLMs,其中属于指数族的分布都可以写为如下形式:\n", 47 | "\n", 48 | "$$p(y;\\eta)=b(y)\\exp\\left(\\eta^TT(y)-a(\\eta)\\right)\\tag{1}$$\n", 49 | "\n", 50 | "* 式中的$\\eta$称为分布的**自然参数(natural parameter)**或**规范参数(canonical parameter)**;\n", 51 | "* $T(y)$称为**充分统计量(sufficient statistic)**(对于我们涉及的分布,通常$T(y)=y$);\n", 52 | "* $a(\\eta)$称为**对数配分函数(log partition function)**\n", 53 | "* $e^{-a(\\eta)}$这个量起到标准化常量的作用,它使得$p(y;\\eta)$求和(离散)或对$y$求积分(连续)的结果等于$1$。\n", 54 | "\n", 55 | "如果选定了$T,\\ a,\\ b$,就能够定义出由$\\eta$参数化的一族(或一个集合)分布,之后,我们通过改变$\\eta$就能获得这一族分布中不同的分布函数。\n", 56 | "\n", 57 | "我们将展示伯努利分布和高斯分布都是指数分布族中的特例。期望为$\\phi$的伯努利分布写作$\\mathrm{Bernoulli}(\\phi)$,分布$y\\in\\{0,\\ 1\\}$上取值,所以$p(y=1;\\phi)=p;\\ p(y=0;\\phi)=1-\\phi$,我们改变$\\phi$则会得到有不同期望值的伯努利分布。这一类由$\\phi$确定的伯努利分布就在指数分布族中,即将$(1)$式中的$T,\\ a,\\ b$确定下来后,式子就可以化为伯努利分布类型的表达式。\n", 58 | "\n", 59 | "我们将伯努利分布写为:\n", 60 | "\n", 61 | "$$\\begin{align}p(y;\\phi)&=\\phi^y(1-\\phi)^{1-y}\\\\&=\\exp(y\\log\\phi+(1-y)\\log(1-\\phi))\\\\&=\\exp\\left(\\left(\\log\\left(\\frac{\\phi}{1-\\phi}\\right)\\right)y+log(1-\\phi)\\right)\\end{align}$$\n", 62 | "\n", 63 | "因此,自然参数为$\\eta=\\log\\frac{\\phi}{1-\\phi}$,有趣的是,如果我们反过来用从$\\eta$的表达式中解出$\\phi$,则有$\\phi=\\frac{1}{1+e^{-\\eta}}$,这就是逻辑回归中使用的S型函数!当我们用一般线性模型(GLM)的形式表达逻辑回归时,还将再次看到这一现象。为了将伯努利分布完全用指数族分布的形式表达,我们给出其它关于指数分布族的参数:\n", 64 | "\n", 65 | "$$\\begin{align}T(y)&=y\\\\a(\\mu)&=-\\log(1-\\phi)\\\\&=\\log(1+e^{\\eta})\\\\b(y)&=1\\end{align}$$\n", 66 | "\n", 67 | "上面的参数表明,伯努利分布在选取适当的参数$T,\\ a,\\ b$后,就可以写为$(1)$式的形式。\n", 68 | "\n", 69 | "接下来我们考虑高斯分布。回忆由概率模型推导线性回归的过程中,我们发现方差$\\sigma^2$的取值并不影响我们最终得到的参数$\\theta$和假设函数$h_\\theta(x)$,因此我们即使选择任意的$\\sigma^2$也不会对分布的表示造成任何影响。为了便于推导,令$\\sigma^2=1$。(即使我们将$\\sigma^2$以变量的形式留在概率密度函数中,高斯分布也可以表达成指数分布族的形式,此时$\\mu\\in\\mathbb{R}^2$变为一个由$\\mu,\\ \\sigma$表示的向量。为了将带有$\\sigma^2$的高斯分布纳入GLM,我们可以给出更一般的指数族定义:\n", 70 | "\n", 71 | "$$p(y;\\eta,\\tau)=b(a,\\tau)\\exp\\left(\\frac{\\eta^TT(y)-a(\\eta)}{c(\\tau)}\\right)$$\n", 72 | "\n", 73 | "上式中的$\\tau$称为**离散参数(dispersion parameter)**,而高斯分布对应的$c(\\tau)=\\sigma^2$。不过,对于我们简化的高斯分布,并不需要这种更一般的表达。)\n", 74 | "\n", 75 | "$$\\begin{align}p(y;\\mu)&=\\frac{1}{\\sqrt{2\\pi}}\\exp\\left(-\\frac{1}{2}(y-\\mu)^2\\right)\\\\&=\\frac{1}{\\sqrt{2\\pi}}\\exp\\left(-\\frac{1}{2}y^2\\right)\\cdot\\exp\\left(\\mu y-\\frac{1}{2}\\mu^2\\right)\\end{align}$$\n", 76 | "\n", 77 | "于是,将高斯分布写为指数族形式有:\n", 78 | "\n", 79 | "$$\\begin{align}\\eta&=\\mu\\\\T(y)&=y\\\\a(\\eta)&=\\frac{\\mu^2}{2}=\\frac{\\eta^2}{2}\\\\b(y)&=\\frac{1}{\\sqrt{2\\pi}}\\exp\\left(\\frac{-y^2}{2}\\right)\\end{align}$$\n", 80 | "\n", 81 | "指数族当然还有很多别的成员,比如:\n", 82 | "\n", 83 | "* 多项分布(multinomial),我们将在后面介绍,如同伯努利分布对有两个结果的事件建模一样,多项分布对有$K$个结果的事件建模;\n", 84 | "* 泊松分布(Poisson),用于计数数据建模,比如样本中放射性元素衰变的书目、某网站访客的数量、商店顾客的数量;\n", 85 | "* 伽马分布和指数分布(the gamma and the exponential),用于非负的连续随机变量建模,如处理时间间隔,或是处理在等公交时发生的“下一辆车什么时候到”的问题;\n", 86 | "* 贝塔分布和狄利克雷分布(the beta and the Dirichlet),通常用于对分数进行建模,它是对概率分布进行建模的概率分布;\n", 87 | "* Wishart分布,这是协方差矩阵的分布。\n", 88 | "\n", 89 | "后面的课程将介绍一种常规方法,来建立对于给定了$x,\\theta$的来自上述任意分布的$y$的模型。\n", 90 | "\n", 91 | "## 9. 一般线性模型建模\n", 92 | "\n", 93 | "假如现在需要对我们商店在给定时间内客户数量$y$做出估计,估计的依据来自诸如商店促销活动、近期广告投入、当地天气状况、给定时间是周几等等,将这些作为特征值$x$,我们也知道泊松分布适用于预测来访者数量,那接下来该如何针对问题建立模型呢?幸运的是,泊松分布属于指数分布族,于是我们可以应用一般线性模型(GLM)。在这一节,我们将介绍针对类似问题建立一般线性模型的方法。\n", 94 | "\n", 95 | "一般的,对于想要预测的关于$x$的随机变量$y$的分类或回归问题,我们为了推导出关于问题的一般线性模型,模型需要遵守以下三条关于给定$x$下$y$的条件概率的假设:\n", 96 | "\n", 97 | "1. $y\\mid x;\\theta\\sim\\mathrm{ExponentialFamily(\\eta)}$,即对于给定的$x,\\ \\theta$,分布$y$服从某个由$\\eta$参数化的指数族分布;\n", 98 | "2. 对于给定的$x$,我们的目标是求出对于条件$x$下$T(y)$的期望,即$\\mathrm{E}[T(y)\\mid x]$。而在大多数情况下$T(y)=y$,所以我们希望学习算法得到的$h(x)=\\mathrm{E}[y\\mid x]$。(注意,在关于$h_\\theta(x)$的选择上,这条假设既适用于逻辑回归又适用于线性回归,比如,$h_\\theta(x)=p(y=1\\mid x;\\theta)=0\\cdot p(y=0\\mid x;\\theta)+1\\cdot p(y=1\\mid x;\\theta)=\\mathrm{E}[y\\mid x;\\theta]$。)\n", 99 | "3. 自然参数$\\eta$(通常是实数)和输入特征值$x$是线性关系:$\\eta=\\theta^Tx,\\ \\eta\\in\\mathbb{R}$(或者对于向量有$\\eta_i=\\theta_i^Tx,\\ \\eta\\in\\mathbb{R}^*$。)\n", 100 | "\n", 101 | "第三条也许是这些假设中“最欠合理”的了,它看起来更像是构建一般线性模型的”设计决策“,而不是”假设“。这三条假设(设计决策)可以让我们得到一类十分简洁的学习算法,也就是一般线性模型,并且具有良好的特性,比如便于我们学习。此外,所得模型通常对关于$y$的不同类型分布的建模都有良好的效果,比如我们接下来将介绍一般线性模型既能推导出逻辑回归,又能推导出普通最小二乘。\n", 102 | "\n", 103 | "### 9.1 普通最小二乘法\n", 104 | "\n", 105 | "为了证明普通最小二乘是一般线性模型中的特例,需要考虑目标变量$y$(在一般线性模型术语中也称作**响应变量(response variable)**)是连续的,我们使用高斯分布$\\mathcal{N}\\left(\\mu,\\ \\sigma^2\\right)$建立关于给定$x$下$y$的条件概率模型($\\mu$可能与$x$有关)。所以我们令上面的$\\mathrm{ExponentialFamily}(\\eta)$为高斯分布。在前面推导出的将高斯分布写为指数分布族的公式中,有$\\mu=\\eta$,所以:\n", 106 | "\n", 107 | "$$\\begin{align}h_\\theta(x)&=\\mathrm{E}[y\\mid x;\\theta]\\\\&=\\mu\\\\&=\\eta\\\\&=\\theta^Tx\\end{align}$$\n", 108 | "\n", 109 | "* 第一个式子来自假设2;\n", 110 | "* 第二个式子根据$y\\mid x;\\theta\\sim\\mathcal{N}\\left(\\mu,\\sigma^2\\right)$,$y$的期望值就是$\\mu$;\n", 111 | "* 第三个式子来自假设1(结合前推导出的将高斯分布写为指数分布族的公式);\n", 112 | "* 第四个式子来自假设3。\n", 113 | "\n", 114 | "### 9.2 逻辑回归\n", 115 | "\n", 116 | "再来考虑逻辑回归。现在主要看二元分类,也就是$y\\in\\{0,1\\}$,我们很自然的联想到使用伯努利族分布对$y$建模。在前面推导出的将伯努利分布写为指数分布族的公式中,$\\phi=\\frac{1}{1+e^{-\\eta}}$。此外,如果$y\\mid x;\\theta\\sim\\mathrm{Bernoulli}(\\phi)$,则$\\mathrm{E}[y\\mid x;\\theta]=\\phi$。同上面推导普通最小二乘一样:\n", 117 | "\n", 118 | "$$\\begin{align}h_\\theta(x)&=\\mathrm{E}[y\\mid x;\\theta]\\\\&=\\phi\\\\&=\\frac{1}{1+e^{-\\eta}}\\\\&=\\frac{1}{1+e^{-\\theta^Tx}}\\end{align}$$\n", 119 | "\n", 120 | "于是我们得到了假设函数$h_\\theta(x)=\\frac{1}{1+e^{-\\theta^Tx}}$,这就是上讲中逻辑函数的来源:一旦我们假设对给定$x$的$y$的条件概率服从伯努利分布,就可以推导出伯努利分布的指数分布族形式,进而得到一般线性模型的定义。\n", 121 | "\n", 122 | "再引入一些术语,一个关于自然参数$\\eta$的函数$g$给出了分布期望($g(\\eta)=\\mathrm{E}[T(y);\\eta]$),我们把这个函数称作**正则响应函数(canonical response function)**,其逆$g^{-1}$称作**正则关联函数(canonical link function)**。对于高斯分布,正则响应函数就是$g(\\eta)=\\eta$;对于伯努利分布就是逻辑函数。(很多其他教材使用$g$正则连接函数,而用$g^{-1}$表示正则响应函数,但我们在这里的表示法沿用以往的机器学习课程,并将在后面的课程中继续使用这种记法。)\n", 123 | "\n", 124 | "### 9.3 Softmax回归\n", 125 | "\n", 126 | "再多看一个一般线性模型的例子:如果在分类问题中,遇到$y$能够取$k$个值(不再限于两个)的情况,即$y\\in\\{1,2,\\cdots,k\\}$。继续用垃圾邮件的例子,我们前面将一封邮件通过算法标记为”垃圾邮件“或”正常邮件“,这是一个二元分类问题,现在我们想将其分为三类:”垃圾邮件“、”私人邮件“和”工作邮件“。这个问题中,响应变量仍然是离散值,只不过变成了两个以上的值,我们因此需要使用多项分布来建立模型。\n", 127 | "\n", 128 | "要推导此类问题的一般线性模型,我们首先得将多项分布表达成指数分布族的形式。\n", 129 | "\n", 130 | "为了参数化有$k$个可能取值的多项分布,我们使用$k$个参数$\\phi_1,\\cdots,\\phi_k$,用来表示每个可能得取值发生的概率。然而,这样设置参数可能会有冗余(过度参数化,over-parameterized),也就是参数线性相关(如果知道任意$k-1$个$\\phi_i$,都可以使用$\\displaystyle\\sum_{i=1}^k\\phi_i=1$算出最后一个$未知\\phi$的值)。所以我们应该设置$k-1$个参数$\\phi_1,\\cdots,\\phi_{k-1}$,则$\\phi_i=p(y=i;\\phi)$,$p(y=k;\\phi)=1-\\displaystyle\\sum_{i=1}^{k-1}\\phi_i$。为了写起来方便,在后面的推导中,我们令$\\phi_k=1-\\displaystyle\\sum_{i=1}^{k-1}\\phi_i$,但得清楚这不是一个参数,它是从其他参数中计算出来的。\n", 131 | "\n", 132 | "接下来我们需要定义$T(y)\\in\\mathbb{R}^{k-1}$(多项分布是少数几个$T(y)\\neq y$的概率模型):\n", 133 | "\n", 134 | "$$T(1)=\\begin{bmatrix}1\\\\0\\\\0\\\\\\vdots\\\\0\\end{bmatrix},\\ T(2)=\\begin{bmatrix}0\\\\1\\\\0\\\\\\vdots\\\\0\\end{bmatrix},\\ T(3)=\\begin{bmatrix}0\\\\0\\\\1\\\\\\vdots\\\\0\\end{bmatrix},\\ \\cdots,\\ T(k-1)=\\begin{bmatrix}0\\\\0\\\\0\\\\\\vdots\\\\1\\end{bmatrix},\\ T(k)=\\begin{bmatrix}0\\\\0\\\\0\\\\\\vdots\\\\0\\end{bmatrix}$$\n", 135 | "\n", 136 | "与前面介绍的分布不同的是,这里不再是$T(y)=y$,现在的$T(y)$不再是一个实数,它变成了一个$k-1$维向量,我们使用$(T(y))_i$表示向量$T(y)$的第$i$个分量。\n", 137 | "\n", 138 | "我们再引入一个非常有用的标记:指示函数(indicator function)$1\\{\\cdot\\}$,如果参数为真则返回$1$,反之返回$0$($1\\{True\\}=1,\\ 1\\{False\\}=0$)。举个例子$1\\{2=3\\}=0$而$1\\{3=5-2\\}=1$。\n", 139 | "\n", 140 | "我们可以利用这个函数将$T(y)$与$y$的关系表示成$(T(y))_i=1\\{y=i\\}$(则$T(y)=\\begin{bmatrix}(T(y))_1\\\\(T(y))_2\\\\\\vdots\\\\(T(y))_{k-1}\\end{bmatrix}=\\begin{bmatrix}1\\{y=1\\}\\\\1\\{y=2\\}\\\\\\vdots\\\\1\\{y=k-1\\}\\end{bmatrix}$,这样就可以简洁的表示上面的一系列向量了)。更进一步,有$\\mathrm{E}[(T(y))_i]=P(y=i)=\\phi_i$。\n", 141 | "\n", 142 | "一切准备就绪,可以开始将多项分布化为为指数分布族了:\n", 143 | "\n", 144 | "$$\\begin{align}p(y;\\phi)&=\\phi_1^{1\\{y=1\\}}\\phi_2^{1\\{y=2\\}}\\cdots\\phi_{k-1}^{1\\{y=k-1\\}}\\phi_k^{1\\{y=k\\}}\\\\&=\\phi_1^{1\\{y=1\\}}\\phi_2^{1\\{y=2\\}}\\cdots\\phi_{k-1}^{1\\{y=k-1\\}}\\phi_k^{1-\\sum_{i=1}^{k-1}1\\{y=i\\}}\\\\&=\\phi_1^{(T(y))_1}\\phi_2^{(T(y))_2}\\cdots\\phi_{k-1}^{(T(y))_{k-1}}\\phi_k^{1-\\sum_{i=1}^{k-1}(T(y))_i}\\\\&=\\exp\\left((T(y))_1\\log(\\phi_1)+(T(y))_2\\log(\\phi_2)+\\cdots+(T(y))_{k-1}\\log(\\phi_{k-1})+\\left(1-\\sum_{i=1}^{k-1}(T(y))_i\\right)\\log(\\phi_k)\\right)\\\\&=\\exp\\left((T(y))_1\\log\\left(\\frac{\\phi_1}{\\phi_k}\\right)+(T(y))_2\\log\\left(\\frac{\\phi_2}{\\phi_k}\\right)+\\cdots+(T(y))_{k-1}\\log\\left(\\frac{\\phi_{k-1}}{\\phi_k}\\right)+\\log(\\phi_k)\\right)\\\\&=b(y)\\exp\\left(\\eta^TT(y)-a(\\eta)\\right)\\end{align}$$\n", 145 | "\n", 146 | "对于此式有(注意这里的$\\phi_k=1-\\displaystyle\\sum_{i=1}^{k-1}\\phi_i$,它并不是一个参数):\n", 147 | "\n", 148 | "$$\\begin{align}\\eta^T&=\\begin{bmatrix}\\log\\frac{\\phi_1}{\\phi_k}&\\log\\frac{\\phi_2}{\\phi_k}&\\cdots&\\log\\frac{\\phi_{k-1}}{\\phi_k}\\end{bmatrix}\\\\a(\\eta)&=-\\log(\\phi_k)\\\\b(y)&=1\\end{align}$$\n", 149 | "\n", 150 | "于是我们将多项分布写成了指数分布族的形式。\n", 151 | "\n", 152 | "正则连接函数为(参数$\\eta$关于期望$\\phi$的函数):\n", 153 | "\n", 154 | "$$\\eta_i=\\log\\frac{\\phi_i}{\\phi_k}\\quad (i=1,\\cdots,k-1)$$\n", 155 | "\n", 156 | "为了表示方便,我们令$\\eta_k=\\log\\frac{\\phi_k}{\\phi_k}=0$,求正则响应函数(即正则连接函数的逆,期望$\\phi$关于参数$\\eta$的函数):\n", 157 | "\n", 158 | "$$\\begin{align}e^{\\eta_i}&=\\frac{\\phi_i}{\\phi_k}\\\\\\phi_ke^{\\eta_i}&=\\phi_i\\\\\\phi_k\\sum_{i=1}^ke^{\\eta_i}&=\\sum_{i=1}^k\\phi_i=1\\end{align}$$\n", 159 | "\n", 160 | "第三个式子表明$\\phi_k=\\frac{1}{\\sum_{i=1}^ke^{\\eta_i}}$,代回第二个式子得到正则响应函数:\n", 161 | "\n", 162 | "$$\\phi_i=\\frac{e^{\\eta_i}}{\\sum_{i=1}^ke^{\\eta_i}}\\quad (i=1,\\cdots,k-1)$$\n", 163 | "\n", 164 | "这个函数是由$\\eta$到$\\phi$的映射,也叫作**softmax**函数。\n", 165 | "\n", 166 | "接下来需要使用假设3,也就是$\\eta_i$是输入变量$x$的线性函数,这次我们要使用括号里关于向量$\\eta_i$的定义:$\\eta_i=\\theta_i^Tx,\\ \\eta\\in\\mathbb{R}^{k-1},\\ i=1,\\cdots,k-1$,这里$\\theta$仍旧是特征值$x$的系数,有$\\theta_1,\\cdots,\\theta_{k-1}\\in\\mathbb{R}^{n+1}$($n$是训练样本所取特征值的个数)。为了方便公式书写,我们依旧令$\\theta_k=0$,则多出来一项$\\eta_k=\\theta_k^Tx=0$,于是在$x$条件下$y$的概率可以表示为:\n", 167 | "\n", 168 | "$$\\begin{align}p(y=i\\mid x;\\theta)&=\\phi_i\\\\&=\\frac{e^{\\eta_i}}{\\sum_{i=1}^ke^{\\eta_j}}\\\\&=\\frac{e^{\\theta_i^Tx}}{\\sum_{j=1}^ke^{\\theta_j^Tx}}\\tag{2}\\end{align}$$\n", 169 | "\n", 170 | "这就是在$y\\in\\{1,\\cdots,k\\}$取值下的分类问题模型,也叫作**softmax回归**,是一般化的逻辑回归。\n", 171 | "\n", 172 | "此时的假设函数为:\n", 173 | "\n", 174 | "$$\\begin{align}h_\\theta(x)&=\\mathrm{E}[T(y)\\mid x;\\theta]\\\\&=\\mathrm{E}\\left[\\begin{array}{c|c}1\\{y=1\\}&\\\\1\\{y=2\\}&\\\\\\vdots&x;\\theta\\\\1\\{y=k-1\\}&\\end{array}\\right]\\\\&=\\begin{bmatrix}\\phi_1\\\\\\phi_2\\\\\\vdots\\\\\\phi_{k-1}\\end{bmatrix}\\\\&=\\begin{bmatrix}\\frac{\\exp\\left(\\theta_1^Tx\\right)}{\\sum_{j=1}^k\\exp\\left(\\theta_j^Tx\\right)}\\\\\\frac{\\exp\\left(\\theta_2^Tx\\right)}{\\sum_{j=1}^k\\exp\\left(\\theta_j^Tx\\right)}\\\\\\vdots\\\\\\frac{\\exp\\left(\\theta_{k-1}^Tx\\right)}{\\sum_{j=1}^k\\exp\\left(\\theta_j^Tx\\right)}\\end{bmatrix}\\end{align}$$\n", 175 | "\n", 176 | "可以看出,假设函数会对$p(y=i\\mid x;\\theta)$的每一个$i=1,\\cdots,k$做出概率估计(尽管我们仅把$h_\\theta(x)$定义在$k-1$维,但显然第$k$个情况的概率估计$p(y=k\\mid x;\\theta)$可以从$1-\\sum_{i=1}^{k-1}\\phi_i$算出)。\n", 177 | "\n", 178 | "最后一步就是求拟合参数了。与普通最小二乘、逻辑回归中的推导方法相似,如果训练集中有$m$个训练样本$\\left\\{(x^{(i)},y^{(i)});i=1,\\cdots,m\\right\\}$,想通过学习算法得到$\\theta_i$,则需要同以前一样,先写出似然函数:\n", 179 | "\n", 180 | "$$\\begin{align}L(\\theta)&=\\prod_{i=1}^mp\\left(y^{(i)}\\mid x^{(i)};\\theta\\right)\\\\&=\\prod_{i=1}^m\\left(\\phi_1^{1\\left\\{y^{(i)}=1\\right\\}}\\phi_2^{1\\left\\{y^{(i)}=2\\right\\}}\\cdots\\phi_k^{1\\left\\{y^{(i)}=k\\right\\}}\\right)\\\\&=\\prod_{i=1}^m\\left(\\prod_{l=1}^k\\left(\\frac{\\exp\\left(\\theta_l^Tx^{(i)}\\right)}{\\sum_{j=1}^k\\exp\\left(\\theta_j^Tx^{(j)}\\right)}\\right)^{1\\left\\{y^{(i)}=l\\right\\}}\\right)\\end{align}$$\n", 181 | "\n", 182 | "再对似然函数取对数:\n", 183 | "\n", 184 | "$$\\begin{align}\\mathscr{l}(\\theta)&=\\log L(\\theta)\\\\&=\\sum_{i=1}^m\\log\\prod_{l=1}^k\\left(\\frac{\\exp\\left(\\theta_l^Tx^{(i)}\\right)}{\\sum_{j=1}^k\\exp\\left(\\theta_j^Tx^{(j)}\\right)}\\right)^{1\\left\\{y^{(i)}=l\\right\\}}\\end{align}$$\n", 185 | "\n", 186 | "在上面的推导中我们使用了$(2)$式给出的$p(y=i\\mid x;\\theta)$的定义,剩下的就是计算$\\mathscr{l}(\\theta)$中参数$\\theta$的最大似然估计了,计算过程可以使用前面介绍的梯度上升或牛顿法。(如果取$n$个特征值,则向量$x\\in\\mathbb{R}^{n+1}$(含截距项$x_0=1$),有$\\theta_j\\in\\mathbb{R}^{n+1},\\ j=1,\\cdots,k-1$(也就是对每一个可能的$y_j$都有一套$\\theta_j$拟合,线性无关的共$k-1$个),如果愿意的话可以把$\\theta_j,\\ i=1,\\cdots,k-1$组成一个矩阵,即系数矩阵$\\theta\\in\\mathbb{R}^{(n+1)\\times(k-1)}$。)\n", 187 | "\n", 188 | "一般线性模型建模过程可以概括为:\n", 189 | "\n", 190 | "1. 根据训练集$x^{(i)},y^{(i)}$选择概率分布模型,参数为$\\phi$;\n", 191 | "2. 将该分布写为指数分布族的形式,参数为$\\eta$;\n", 192 | "3. 可以得到正则响应函数$g(\\eta)=\\mathrm{E}[T(y);\\eta]$;\n", 193 | "4. 将$\\eta=\\theta^Tx$带入正则响应函数得到假设函数$h_\\theta(x)=g(\\theta^Tx)$;\n", 194 | "5. 根据模型的概率解释得到似然函数$L(\\theta)=p(y^{(i)}\\mid x^{(i)};\\theta)$(根据假设函数得到);\n", 195 | "6. 取合适的$\\theta$使似然函数最大化。" 196 | ] 197 | } 198 | ], 199 | "metadata": { 200 | "kernelspec": { 201 | "display_name": "Python 3", 202 | "language": "python", 203 | "name": "python3" 204 | }, 205 | "language_info": { 206 | "codemirror_mode": { 207 | "name": "ipython", 208 | "version": 3 209 | }, 210 | "file_extension": ".py", 211 | "mimetype": "text/x-python", 212 | "name": "python", 213 | "nbconvert_exporter": "python", 214 | "pygments_lexer": "ipython3", 215 | "version": "3.5.1" 216 | } 217 | }, 218 | "nbformat": 4, 219 | "nbformat_minor": 0 220 | } 221 | -------------------------------------------------------------------------------- /chapter06.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第六讲:事件模型、函数间隔与几何间隔\n", 8 | "\n", 9 | "接着上一讲,进一步讨论朴素贝叶斯算法及事件模型。\n", 10 | "\n", 11 | "## 2.2 文本分类的事件模型\n", 12 | "\n", 13 | "在结束生成学习算法前,我们再来介绍一种针对文本分类的模型。虽然前面介绍的朴素贝叶斯算法对于很多分类问题都要良好的效果,不过对于文本分类,我们有一种更好的模型。\n", 14 | "\n", 15 | "在特定语境的文本分类中,朴素贝叶斯算法使用了**多元伯努利事件模型(multi-variate Bernoulli event model)**(特征值按照伯努利试验取$x_i\\in\\{0,1\\}$,特征值向量长度为字典长度)。回忆一下上一讲的知识,在这个模型中,我们首先假设下一封邮件的发送方已经确定,一个随机的邮件发送人(可能是垃圾邮件制造者,也可能只是普通联系人,是由我们确定的条件概率中的条件);接着我们假设,发送者会遍历词典,独立的决定是否将单词$x_i$写入邮件(该词语相对于其他词语独立),而且该词语服从概率$p(x_i=1\\mid y)=\\phi_{i\\mid y}$(如果是垃圾邮件制造者则可能更倾向于发送带有“buy”、“sales”、“discount”等单词的 邮件,而普通联系人则会选择更正常的词语分布发送正常邮件)。于是我们得到,$p(x\\mid y)=\\prod_{i=1}^np(x_i\\mid y)$和$p(y)$,再根据$\\mathrm{arg}\\displaystyle\\operatorname*{max}_yp(x\\mid y)=\\mathrm{arg}\\displaystyle\\operatorname*{max}_yp(x\\mid y)p(y)$最终得到该邮件是垃圾邮件的概率:$p(y)\\prod_{i=1}^np(x_i\\mid y)$。这个模型存在一些小问题,比如,它不能讲词语的出现的次数反应在输入特征值向量中,如果一封邮件多次出现“buy”这个词,那么此邮件确实更有可能是垃圾邮件。\n", 16 | "\n", 17 | "下面介绍的模型是朴素贝叶斯算法算法的简单变形,称为**多项事件模型(multinomial event model)**。接下来,我们将使用不同的记法和不同的特征值描述邮件。使用$x_i$表示邮件中的第$i$个词语,$x_i$在是一个在$\\{1,\\cdots,\\lvert V\\rvert\\}$取值的整数,而$\\lvert V\\rvert$就是词汇表(词典)的大小。于是,一封邮件被我们表示为$(x_1,x_2,\\cdots,x_n)$向量,注意,对于不同的邮件$n$是不同的。举个例子,对于一封以“A NIPS”开头的邮件,有$x_1=1$(“a”是词典的第一个单词)、$x_2=35000$(假设“nips”是词典的第35000个单词)。\n", 18 | "\n", 19 | "在多项事件模型中,我们像以前一样假设邮件发送方已经由一个随机过程确定(根据$p(y)$),可能是垃圾邮件制造者,也可能是普通联系人;接着,发件人从某多项分布($p(x_i\\mid y)$)中选出一个词$x_1$;然后根据相同的多项分布选出第二个词$x_2$(独立于$x_1$),继续重复这个动作选出$x_3,x_4,\\cdot,x_n$;最后,邮件编写结束。因此,该邮件是垃圾邮件的概率为$p(y)\\prod_{i=1}^np(x_i\\mid y)$,这个式子和前面的完全一样,但是请注意,这里的特征值$x_i$是邮件第$i$个单词,其取值不再是多元伯努利事件模型中的$\\{0,1\\}$了,它现在是一个多项分布。\n", 20 | "\n", 21 | "多项事件模型的参数为:$\\phi_y=p(y)$(同以前一样),$\\phi_{k\\mid y=1}=p(x_j=k\\mid y=1),\\ \\phi_{k\\mid y=0}=p(x_j=k\\mid y=0)$(对任意$j$)。注意到这里我们假设了对于任意$j$都有其$p(x_j\\mid y)$相等,即在$y$条件下关于某词语的概率分布与该词语出现在邮件里的位置($j$)无关。\n", 22 | "\n", 23 | "对于训练集$\\left\\{\\left(x^{(i)},y^{(i)}\\right);i=1,\\cdots,m\\right\\}$(其中$x^{(i)}=\\left(x_1^{(i)},x_2^{(i)},\\cdots,x_{n_i}^{(i)}\\right)$代表训练集第$i$封样本邮件特征值向量,邮件共有$n_i$个单词),参数的似然函数为:\n", 24 | "\n", 25 | "$$\\begin{align}\\mathcal{L}\\left(\\phi_y,\\phi_{k\\mid y=0},\\phi_{k\\mid y=1}\\right)&=\\prod_{i=1}^mp\\left(x^{(i)},y^{(i)}\\right)\\\\&=\\prod_{i=1}^m\\left(\\left(\\prod_{j=1}^{n_i}p\\left(x_j^{(i)}\\mid y;\\phi_{k\\mid y=1},\\phi_{k\\mid y=0}\\right)\\right)p\\left(y^{(i)};\\phi_y\\right)\\right)\\end{align}$$\n", 26 | "\n", 27 | "最大化似然函数将得到各参数的最大似然估计:\n", 28 | "\n", 29 | "$$\\begin{align}\\phi_{k\\mid y=1}&=p(x_j=k\\mid y=1)&=\\frac{\\sum_{i=1}^m\\sum_{j=1}^{n_i}1\\left\\{x_j^{(i)}=k\\land y^{(i)}=1\\right\\}}{\\sum_{i=1}^m1\\left\\{y^{(i)}=1\\right\\}n_i}\\\\\\phi_{k\\mid y=0}&=p(x_j=k\\mid y=0)&=\\frac{\\sum_{i=1}^m\\sum_{j=1}^{n_i}1\\left\\{x_j^{(i)}=k\\land y^{(i)}=0\\right\\}}{\\sum_{i=1}^m1\\left\\{y^{(i)}=0\\right\\}n_i}\\\\\\phi_y&=p(y=1)&=\\frac{\\sum_{i=1}^m1\\left\\{y^{(i)}=1\\right\\}}{m}\\end{align}$$\n", 30 | "\n", 31 | "我们对$\\phi_{k\\mid y=0},\\phi_{k\\mid y=1}$应用拉普拉斯平滑(在实际问题中应用拉普拉斯平滑通常可以得到更好的模型),即在分子上加一,分母上加$\\lvert V\\rvert$,得到:\n", 32 | "\n", 33 | "$$\\begin{align}\\phi_{k\\mid y=1}&=\\frac{\\left(\\sum_{i=1}^m\\sum_{j=1}^{n_i}1\\left\\{x_j^{(i)}=k\\land y^{(i)}=1\\right\\}\\right)+1}{\\left(\\sum_{i=1}^m1\\left\\{y^{(i)}=1\\right\\}n_i\\right)+\\lvert V\\rvert}\\\\\\phi_{k\\mid y=0}&=\\frac{\\left(\\sum_{i=1}^m\\sum_{j=1}^{n_i}1\\left\\{x_j^{(i)}=k\\land y^{(i)}=0\\right\\}\\right)+1}{\\left(\\sum_{i=1}^m1\\left\\{y^{(i)}=0\\right\\}n_i\\right)+\\lvert V\\rvert}\\end{align}$$\n", 34 | "\n", 35 | "在处理文本分类问题时,多项事件模型通常比原始的朴素贝叶斯算法效果更好,一个可能的原因是因为它考虑了每个单词出现的次数。\n", 36 | "\n", 37 | "尽管朴素贝叶斯分类器不是最好的分类算法,但它的效果一般都非常好,再加上它简单且易于实现的特性,我们通常用它作为“首选试验算法”。(使用朴素贝叶斯算法最终会得到一个逻辑函数形式的后验分布,也就是说,朴素贝叶斯算法也属于指数分布族,它仍然是一个线性分类器。)\n", 38 | "\n", 39 | "# 第五部分:支持向量机\n", 40 | "\n", 41 | "接下来的几个掌机会介绍支持向量机学习算法(SVM),它通常被认为是最好的现成监督学习算法之一(很多人认为它是最好的)。为了详细介绍支持向量机,我们需要先了解间隔(margin)的概念,以及使用大间隙(gap)分割数据的想法。接着我们将介绍优化间隔分类器,进而讨论一下语言歧义(language duality)现象。然后介绍支持向量机的核心——如何在一个极高维特征值向量空间(比如无限维)上高效的应用支持向量机算法。最后我们将介绍序列最小优化算法(SMO: sequential minimal optimization)算法——一个更优化的支持向量机的实现。\n", 42 | "\n", 43 | "## 1. 间隔:直观概念\n", 44 | "\n", 45 | "我们从间隔开始讨论支持向量机算法,本节将给出“间隔”以及算法对预测的“信心”的直观概念,在第三节我们会进一步形式化这些概念。\n", 46 | "\n", 47 | "回顾前面的逻辑回归,假设函数的模型$h_\\theta(x)=g\\left(\\theta^Tx\\right)$将给出关于$p(y=1\\mid x;\\theta)$的概率预测。当且仅当$h_\\theta(x)\\geq 0.5$即输入满足$\\theta^Tx\\geq 0$时,模型给出关于输入的预测为$1$。对于一个正训练样本(即$y=1$),$\\theta^Tx$越大,则$h_\\theta(x)=p(y=1\\mid x;w,b)$,也就意味着我们将其预测为$1$的“信心”越高。因此,严谨的说,如果$\\theta^Tx\\gg 0$,则算法预测其为$1$的信心就会非常大。同样的,对于逻辑回归,如果$\\theta^Tx\\ll 0$,则算法预测其为$0$的信心就会非常大。对于给定的训练集,我们可以说,如果拟合参数$\\theta$能够使得所有$y^{(i)}=1$的样本满足$\\theta^Tx^{(i)}\\gg0$,使所有$y^{(i)}=0$的样本满足$y^{(i)}=0$,则称这是一个良好的拟合,因为这反映出该拟合对分类结果的“信心”很足。所以,“信心”是一个很好的指标,后面我们将使用函数间隔形式化这个指标。\n", 48 | "\n", 49 | "另一种直观的表达,如下图,其中x代表正训练样本,o代表负训练样本,直线就是判别边界(由$\\theta^Tx=0$给出,也叫**分类超平面(separating hyperplane)**)。\n", 50 | "\n", 51 | "\"\"\n", 52 | "\n", 53 | "图中的三个点A、B、C,点A距离判别边界非常远,如果求关于点A的预测,我们会非常确定其值为$y=1$。相反,点C距离判别边界很近,虽然它在判别边界$y=1$一侧,但是如果判别边界稍有变动,它就有可能被放在$y=0$一侧。因此,我们对点A预测的信心强于点C。而点B则在两者之间,通常来说,如果点距离判别边界越远,模型做出预测的信心就越强。也就是说,如果对于给定训练集,可以找到一条能够准确并可信(即样本距离边界很远)的预测所有训练样本的判别边界,则称这个拟合是良好的。我们在后面将使用几何间隔形式化这个概念。\n", 54 | "\n", 55 | "## 2. 标记法\n", 56 | "\n", 57 | "为了更加简洁的介绍支持向量机,我们需要先引入一种新的标记。考虑使用线性分类器解决“特征为$x$目标为$y$”的二元分类问题。这次,我们使用$y\\in\\{-1,1\\}$来标记两个分类(而不是之前的$y\\in\\{0,1\\}$),再使用参数向量$w,b$代替之前的参数向量$\\theta$,于是我们现在将分类器写为:\n", 58 | "\n", 59 | "$$h_{w,b}(x)=g\\left(w^Tx+b\\right)$$\n", 60 | "\n", 61 | "此处,$g(z)=\\begin{cases}1 &z\\gt 0\\\\-1 &z\\lt 0\\end{cases}$,而$w,b$的记法可以将截距项与特征值的系数分开来记(也不再向特征值向量$x$中添加$x_0=1$分量),即$b$用来代替原来的$\\theta_0$,而$w$用来代替原来的$\\begin{bmatrix}\\theta_1&\\cdots&\\theta_n\\end{bmatrix}^T$。\n", 62 | "\n", 63 | "还需要注意的是,根据函数$g$的定义,分类器将直接给出$-1$或$1$的结果(类似感知算法),省略了估计$y=1$的概率的步骤。\n", 64 | "\n", 65 | "## 3. 函数间隔及几何间隔\n", 66 | "\n", 67 | "本节将形式化函数间隔及几何间隔。对于给定的训练样本$\\left(x^{(i)},y^{(i)}\\right)$,我们定义关于此训练样本函数间隔的超平面$(w,b)$为:\n", 68 | "\n", 69 | "$$\\hat{\\gamma}^{(i)}=y^{(i)}\\left(w^Tx^{(i)}+b\\right)$$\n", 70 | "\n", 71 | "上式可以解释为,当$y^{(i)}=1$时,为了得到一个较大的函数间隔(即为了使预测有较高的的可信度及准确性),我们需要$w^Tx+b$取一个较大的正数($w^Tx+b\\gg 0$);反之,当$y^{(i)}=-1$时,我摸需要$w^Tx+b$取一个较大的负数($w^Tx+b\\ll 0$)。此外,如果$y^{(i)}\\left(w^Tx+b\\right)\\gt 0$,则说明关于此样本的预测是正确的。因此,较大的函数间隔意味着较高的可信度和准确性。\n", 72 | "\n", 73 | "对于一个在$g\\in\\{-1,1\\}$取值的线性分类器,有一个性质导致其函数间隔不能有效的反映预测的可信度:对于给定的$g$,如果将$(w,b)$替换为$(2w,2b)$,即$g\\left(w^Tx+b\\right)$变为$g\\left(2w^Tx+2b\\right)$,我们会发现分类超平面$h_{w,b}(x)$并不会改变,也就是说$h_{w,b}(x)$只关心$w^Tx+b$的正负,而不关心其大小。但是将$(w,b)$变为$(2w,2b)$相当于给函数间隔乘了系数$2$,于是我们发现,如果通过改变$w,b$的取值,我们可以让函数间隔变得很大,然而分类超平面并没有改变,所以单纯的通过这种方式改变函数间隔的大小没有什么实质意义。直觉告诉我们,应该引入一种标准化条件,比如令$\\lVert w\\rVert_2=1$,即把$(w,b)$变为$\\left(\\frac{w}{\\lVert w\\rVert_2},\\frac{b}{\\lVert w\\rVert_2}\\right)$,我们在后面会继续讨论这种方法。\n", 74 | "\n", 75 | "对于给定的训练集$S=\\left\\{\\left(x^{(i)},y^{(i)}\\right);i=1,\\cdots,m\\right\\}$,关于$S$以$(w,b)$为参数的函数间隔$\\hat\\gamma$定义为取所以独立的训练样本中最小的那个函数间隔(即取最坏的一个样本的情况):\n", 76 | "\n", 77 | "$$\\hat\\gamma=\\operatorname*{min}_{i=1,\\cdots,m}\\hat\\gamma^{(i)}$$\n", 78 | "\n", 79 | "接下来我们讨论几何间隔,考虑下图:\n", 80 | "\n", 81 | "\"\"\n", 82 | "\n", 83 | "直线为$(w,b)$确定的判定边界(即超平面$w^Tx+b=0$),向量$w$正交于分类超平面(在超平面上任取两点$P_1=(x_1,\\cdots,x_n), P_2==(x'_1,\\cdots,x'_n)$,则两点满足平面方程组$\\begin{cases}w^TP_1+b=0\\\\w^TP_2+b=0\\end{cases}$,两式相减得$w^T(P_1-P_2)=0$,即$w^T$正交于该超平面上任意向量,所以$w^T$为超平面法向量)。观察点$A$,设点$A$为训练样本$(x^{(i)},y^{(i)}=1)$,它到判定边界的距离$\\gamma^{(i)}$即为线段$AB$的长度。\n", 84 | "\n", 85 | "如何计算$\\gamma^{(i)}$?注意到$\\frac{w}{\\lVert w\\rVert}$是标准化后的$w$向量,点$A$为$x^{(i)}$,则点$B$为$x^{(i)}-\\gamma^{(i)}\\cdot\\frac{w}{\\lVert w\\rVert}$。点$B$在判定边界上,而判定边界上的所有点都满足方程$w^Tx+b=0$,则:\n", 86 | "\n", 87 | "$$w^T\\left(x^{(i)}-\\gamma^{(i)}\\frac{w}{\\lVert w\\rVert}\\right)+b=0$$\n", 88 | "\n", 89 | "解出$\\gamma^{(i)}$得:(注:$w^Tw=\\lVert w\\rVert^2$)\n", 90 | "\n", 91 | "$$\\gamma^{(i)}=\\frac{w^Tx^{(i)}+b}{\\lVert w\\rVert}=\\left(\\frac{w}{\\lVert w\\rVert}\\right)^Tx^{(i)}+\\frac{b}{\\lVert w\\rVert}$$\n", 92 | "\n", 93 | "这就是正训练样本$A$被正确的分在判别边界$y=1$一侧的情形,更一般的,我们定义关于样本$\\left(x^{(i)},y^{(i)}\\right)$以$(w,b)$为参数的函数间隔为:\n", 94 | "\n", 95 | "$$\\gamma^{(i)}=y^{(i)}\\left(\\left(\\frac{w}{\\lVert w\\rVert}\\right)^Tx^{(i)}+\\frac{b}{\\lVert w\\rVert}\\right)$$\n", 96 | "\n", 97 | "可以看出,如果$\\lVert w\\rVert=1$,则函数间隔等于几何间隔($\\hat\\gamma^{(i)}=\\gamma^{(i)}$),这就是两种间隔的关系($\\hat\\gamma^{(i)}=\\frac{\\gamma^{(i)}}{\\Vert w\\Vert}$)。与函数间隔一样,如果改变参数$(w,b)$为$(2w,2b)$,则几何间隔不会改变。这个性质在后面会很方便,利用改变参数$(w,b)$的大小不影响间隔,我们可以在拟合参数时引入$w$的限制条件,比如令$\\lVert w\\rVert=1$,或$\\lvert w_1\\rvert=5$,或$\\lvert w+b\\rvert+\\lvert b\\rvert=2$,诸如这种限制条件都可以通过给参数$(w,b)$乘以一个适当的系数得到。\n", 98 | "\n", 99 | "对于给定的训练集$S=\\left\\{\\left(x^{(i)},y^{(i)}\\right);i=1,\\cdots,m\\right\\}$,也有关于$S$以$(w,b)$为参数的几何间隔$\\gamma$定义为取所以独立的训练样本中最小的那个几何间隔(即取最坏的一个样本的情况):\n", 100 | "\n", 101 | "$$\\gamma=\\operatorname*{min}_{i=1,\\cdots,m}\\gamma^{(i)}$$\n", 102 | "\n", 103 | "另外,几何间隔实际上就是点到超平面的距离,高中时学过的点$\\left(x^{(i)},y^{(i)}\\right)$到直线$ax+by+c=0$的距离为:\n", 104 | "\n", 105 | "$$d\\left(x^{(i)},y^{(i)}\\right)=\\frac{\\lvert ax^{(i)}+by^{(i)}+c\\rvert}{\\sqrt{a^2+b^2}}$$\n", 106 | "\n", 107 | "推广到高维就是上面的几何间隔,而函数间隔就是未标准化的几何间隔。\n", 108 | "\n", 109 | "最后,最大间隔分类器(maximum margin classifier,可以被看做是支持向量机的前身),实际上就选择特定的$w,b$使几何间隔最大化:\n", 110 | "\n", 111 | "$$\\begin{align}\\displaystyle\\operatorname*{max}_{w,b}&\\quad\\gamma\\\\\\mathrm{s.t.}&\\quad y^{(i)}\\left(\\left(\\frac{w}{\\lVert w\\rVert}\\right)^Tx^{(i)}+\\frac{b}{\\lVert w\\rVert}\\right)\\end{align}$$\n", 112 | "\n", 113 | "注:$\\mathrm{s.t.}$是“subject to”的缩写,意为“受限于”。" 114 | ] 115 | } 116 | ], 117 | "metadata": { 118 | "kernelspec": { 119 | "display_name": "Python 3", 120 | "language": "python", 121 | "name": "python3" 122 | }, 123 | "language_info": { 124 | "codemirror_mode": { 125 | "name": "ipython", 126 | "version": 3 127 | }, 128 | "file_extension": ".py", 129 | "mimetype": "text/x-python", 130 | "name": "python", 131 | "nbconvert_exporter": "python", 132 | "pygments_lexer": "ipython3", 133 | "version": "3.5.2" 134 | } 135 | }, 136 | "nbformat": 4, 137 | "nbformat_minor": 0 138 | } 139 | -------------------------------------------------------------------------------- /chapter07.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第七讲:最优间隔分类器、拉格朗日对偶、支持向量机\n", 8 | "\n", 9 | "简单的回顾上一讲的内容:\n", 10 | "\n", 11 | "* 我们定义了新的假设函数:\n", 12 | "\n", 13 | " $$\\begin{align}h_{w,b}&=g\\left(w^Tx+b\\right)\\\\g(z)&=\\begin{cases}1 &z\\gt 0\\\\-1 &z\\lt 0\\end{cases}\\\\y&=\\{-1,1\\}\\end{align}$$\n", 14 | "\n", 15 | "* 给出了函数间隔的定义:\n", 16 | "\n", 17 | " $$\\hat{\\gamma}^{(i)}=y^{(i)}\\left(w^Tx^{(i)}+b\\right)$$\n", 18 | "\n", 19 | "* 以及几何间隔的定义:\n", 20 | "\n", 21 | " $$\\gamma^{(i)}=y^{(i)}\\left(\\left(\\frac{w}{\\lVert w\\rVert}\\right)^Tx^{(i)}+\\frac{b}{\\lVert w\\rVert}\\right)$$\n", 22 | "\n", 23 | "* 了解了函数间隔与几何间隔的关系:\n", 24 | "\n", 25 | " $$\\gamma=\\frac{\\hat\\gamma}{\\lVert w\\rVert}$$\n", 26 | "\n", 27 | "* 同时也了解了其几何意义:由$w^Tx+b=0$确定的分类超平面将正负样本分隔开,同时使超平面与样本间的最小间隔尽可能大。我们也发现,如果按比例缩放参数$(w,b)$,并不会对假设结果造成任何影响,因为给参数同时乘以一个系数并不会影响超平面的位置。\n", 28 | "\n", 29 | "接着上一讲,我们继续介绍支持向量机的相关知识。\n", 30 | "\n", 31 | "## 4. 最优间隔分类器(optimal margin classifier)\n", 32 | "\n", 33 | "通过上一讲的介绍,对于给定的训练集,我们会自然的想要找到一个能够使(几何)间隔达到最大的判定边界,因为这样的判定边界能够得到高度可信的预测集,同时也是对训练集很好的拟合。这也将帮助我们得到一个将正负样本分隔(几何间隔)开的分类器。\n", 34 | "\n", 35 | "目前为止,我们都假设训练集是线性可分的,即我们一定可以找到一个能够将正负样本分开的分类超平面。那么,我们怎样找到将几何间隔最大化的分类超平面呢?讨论下面的优化问题:\n", 36 | "\n", 37 | "$$\\begin{align}\\displaystyle\\operatorname*{max}_{w,b}&\\quad\\gamma\\\\\\mathrm{s.t.}&\\quad y^{(i)}\\left(w^Tx^{(i)}+b\\right)\\geq\\gamma,\\quad i=1,\\cdots,m\\\\&\\quad\\lVert w\\rVert=1\\end{align}$$\n", 38 | "\n", 39 | "上式表示,在满足每一个训练样本的函数间隔都不小于$\\gamma$的情况下,使用$(w,b)$构造$\\gamma$的能够取到的最大值,同时有限制条件$\\lVert w\\rVert=1$保证函数间隔等于几何间隔。通过求得的$(w,b)$就可以计算出该训练集的最大几何间隔。(注:$\\mathrm{s.t.}$是“subject to”的缩写,意为“受限于”。)\n", 40 | "\n", 41 | "上面的优化问题有个棘手的限制条件$\\lVert w\\rVert=1$(这是一个糟糕的非凸性约束,即参数$w$可能位于一个单位圆环/球面上),这显然不是可以提交给标准的凸优化软件(如梯度下降法、牛顿法等)去解决的问题。所以,我们将上面的问题变形为另一种的形式:\n", 42 | "\n", 43 | "$$\\begin{align}\\displaystyle\\operatorname*{max}_{w,b}&\\quad\\frac{\\hat\\gamma}{\\lVert w\\rVert}\\\\\\mathrm{s.t.}&\\quad y^{(i)}\\left(w^Tx^{(i)}+b\\right)\\geq\\hat\\gamma,\\quad i=1,\\cdots,m\\end{align}$$\n", 44 | "\n", 45 | "也就是我们选择最大化几何间隔$\\frac{\\hat\\gamma}{\\lVert w\\rVert}$,同时满足所有样本的函数间隔不小于$\\hat\\gamma$的条件。因为函数间隔和几何间隔的关系为$\\gamma=\\frac{\\hat\\gamma}{\\lVert w\\rVert}$,而又舍弃了限制条件$\\lVert w\\rVert=1$,所以这次我们觉得应该可以求出最大值了。不过值得注意的是,这次最大化的对象$\\frac{\\hat\\gamma}{\\lVert w\\rVert}$是非凸的,而我们同样没有现成的凸优化软件来解决此类问题。\n", 46 | "\n", 47 | "于是,我们发现在第一个优化问题中,存在非凸性的限制条件,而在第二个优化问题中,存在非凸性的优化目标,所以我们并不能保证软件可以找到全局最小值。(要带上限制条件$\\lVert w\\rVert=1$是因为我们的优化想要度量的是几何间隔)。\n", 48 | "\n", 49 | "回想前一讲,我们知道,按比例缩放参数$(w,b)$对假设结果没有任何影响,我们现在可以利用这一点。我们现在来引入限制条件:对于给定的训练集,以$(w,b)$为参数的函数间隔必须为$1$:\n", 50 | "\n", 51 | "$$\\hat\\gamma=1$$\n", 52 | "\n", 53 | "给参数$w,b$乘以缩放常量会使得函数间隔缩放同样的倍数,则可以通过缩放$w,b$来满足上面的限制条件。将这一限制条件加入上面的假设中,于是问题变为最大化$\\frac{\\hat\\gamma}{\\lVert w\\rVert}=\\frac{1}{\\lVert w\\rVert}$,也就是相当于最小化$\\lVert w\\rVert^2$。现在的优化问题变为:\n", 54 | "\n", 55 | "$$\\begin{align}\\displaystyle\\operatorname*{min}_{w,b}&\\quad\\frac{1}{2}\\lVert w\\rVert^2\\\\\\mathrm{s.t.}&\\quad y^{(i)}\\left(w^Tx^{(i)}+b\\right)\\geq 1,\\quad i=1,\\cdots,m\\end{align}$$\n", 56 | "\n", 57 | "这样,我们就把原来棘手的问题变为了可以用软件高效解决的问题。上式是一个带有线性约束的凸二次型问题,解该式即可得到**最优间隔分类器(optimal margin classifier)**。这一类优化问题可以直接使用一些现成的商用二次优化程序(QP: quadratic programming)解决。\n", 58 | "\n", 59 | "到这里,问题基本解决,我们暂停一下支持向量机的讲解,先了解一下拉格朗日对偶。它将引出我们优化问题的对偶形式,通过使用核方法,将保证在我们将最优间隔分类器问题推广到极高维度空间时算法的高效求解。对偶形式也将帮助我们推导出一个用以解决上面优化问题的高效算法,其求解速度比常见的QP软件快很多。\n", 60 | "\n", 61 | "## 5. 拉格朗日对偶(Lagrange duality)\n", 62 | "\n", 63 | "我们先放一放支持向量机和最大间隔分类器,来聊一聊带有约束条件的优化问题。考虑下面的问题:\n", 64 | "\n", 65 | "$$\\begin{align}\\displaystyle\\operatorname*{min}_{w}&\\quad f(w)\\\\\\mathrm{s.t.}&\\quad h_i(w)=0,\\quad i=1,\\cdots,l\\end{align}$$\n", 66 | "\n", 67 | "回忆在高等数学中学到的拉格朗日乘数法([中文](https://zh.wikipedia.org/zh/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0),[英文](https://en.wikipedia.org/wiki/Lagrange_multiplier)),我们定义**拉格朗日算子(Lagrangian)**:\n", 68 | "\n", 69 | "$$\\mathcal{L}(w,\\beta)=f(w)+\\sum_{i=1}^l\\beta_ih_i(w)$$\n", 70 | "\n", 71 | "此处的系数$\\beta$称作**拉格朗日乘数(Lagrange multiplier)**,然后将$\\mathcal{L}$的偏导数置为零:\n", 72 | "\n", 73 | "$$\\begin{align}\\frac{\\partial\\mathcal{L}}{\\partial w_i}&=0\\\\\\frac{\\partial\\mathcal{L}}{\\partial\\beta_i}&=0\\end{align}$$\n", 74 | "\n", 75 | "最后解出$w,\\beta$即可。直接参考拉格朗日乘数法的例题([中文](https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0#.E4.BE.8B.E5.AD.90),[英文](https://en.wikipedia.org/wiki/Lagrange_multiplier#Examples))更加直观。\n", 76 | "\n", 77 | "在这一节我们会一般化这种带有约束条件的优化问题,也就是不限于等式约束条件,后面会加入不等式约束条件。因为篇幅限制,我们不会在这里直接推导拉格朗日对偶理论(感兴趣可以参考R.T. Rockarfeller (1970), Convex Analysis, Princeton University Press.),仅在这里给出主要思路和结果,进而在应用在最优间隔分类器优化问题中。\n", 78 | "\n", 79 | "下面介绍**原始优化问题(primal optimization problem)**:\n", 80 | "\n", 81 | "$$\\begin{align}\\displaystyle\\operatorname*{min}_{w}&\\quad f(w)\\\\\\mathrm{s.t.}&\\quad g_i(w)\\leq 0,\\quad i=1,\\cdots ,k\\\\&\\quad h_i(w)=0,\\quad i=1,\\cdots,l\\end{align}$$\n", 82 | "\n", 83 | "定义**广义拉格朗日算子(generalized Lagrangian)**:\n", 84 | "\n", 85 | "$$\\mathcal{L}(w,\\alpha,\\beta)=f(w)+\\sum_{i=1}^k\\alpha_ig_i(w)+\\sum_{i=1}^l\\beta_ih_i(w)$$\n", 86 | "\n", 87 | "这里的$\\alpha,\\beta$是拉格朗日乘数,考虑下面的量:\n", 88 | "\n", 89 | "$$\\theta_{\\mathcal{P}}(w)=\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\mathcal{L}(w,\\alpha,\\beta)$$\n", 90 | "\n", 91 | "其中下标$\\mathcal{P}$代表\"primal\"。对于一些$w$,如果$w$违反了任何原始约束条件(如$g_i(w)\\gt 0$或$h_i(w)\\neq 0$),则可以证明:\n", 92 | "\n", 93 | "$$\\begin{align}\\theta_{\\mathcal{P}}(w)&=\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}f(w)+\\sum_{i=1}^k\\alpha_ig_i(w)+\\sum_{i=1}^l\\beta_ih_i(w)\\tag{1}\\\\&=\\infty\\tag{2}\\end{align}$$\n", 94 | "\n", 95 | "(如果某个$g_i(w)\\gt 0$,则拉格朗日算子中该项相应的拉格朗日乘数$\\alpha_i$只需取无穷大就可以使整个式子最大化;类似的,如果某个$h_i(w)\\neq 0$,则拉格朗日算子中该项相应的拉格朗日乘数$\\beta_i$只需取无穷大也可以使整个式子最大化。)\n", 96 | "\n", 97 | "相反,如果$w$在约束条件内,则有$\\theta_{\\mathcal{P}}=f(w)$,于是有:\n", 98 | "\n", 99 | "$$\\theta_{\\mathcal{P}}=\\begin{cases}f(w)&\\textrm{if }w\\textrm{ satisfies primal constraints}\\\\\\infty&\\textrm{otherwise}\\end{cases}$$\n", 100 | "\n", 101 | "(也就是说,对于满足约束条件的$w$,要使得拉格朗日算子最大化,需要拉格朗日乘数项之和为零。)\n", 102 | "\n", 103 | "则对于满足原始约束的$w$来说,$\\theta_{\\mathcal{P}}$与原始优化问题中的目标函数相同;对于违反原始约束的$w$来说,$\\theta_{\\mathcal{P}}$为正无穷。因此,如果考虑最小化:\n", 104 | "\n", 105 | "$$\\operatorname*{min}_{w}\\theta_{\\mathcal{P}}(w)=\\operatorname*{min}_{w}\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\mathcal{L}(w,\\alpha,\\beta)$$\n", 106 | "\n", 107 | "我们发现,这与原始优化问题是一样的(也有同样的解)。为了后面使用方便,我们定义优化目标的最优值为$p^*=\\displaystyle\\operatorname*{min}_{w}\\theta_{\\mathcal{P}}(w)$,称为原始问题的**最优值(optimal value)**。\n", 108 | "\n", 109 | "现在,我们来看一个略微不同的问题,定义关于拉格朗日乘数的函数:\n", 110 | "\n", 111 | "$$\\theta_{\\mathcal{D}}(\\alpha,\\beta)=\\operatorname*{min}_{w}\\mathcal{L}(w,\\alpha,\\beta)$$\n", 112 | "\n", 113 | "其中下标$\\mathcal{D}$代表“dual”。留意到在$\\theta_{\\mathcal{P}}$的定义中,我们优化(最大化)关于$\\alpha,\\beta$的函数;而在这里,我们最小化关于$w$的函数。\n", 114 | "\n", 115 | "引入**对偶优化问题(dual optimization problem)**:\n", 116 | "\n", 117 | "$$\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\theta_{\\mathcal{D}}(\\alpha,\\beta)=\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\operatorname*{min}_{w}\\mathcal{L}(w,\\alpha,\\beta)$$\n", 118 | "\n", 119 | "这个式子除了“max”和“min”的顺序发生改变以外,其余的同前面的原始问题一样。同样的,定义对偶优化问题的最优值为$d^*=\\displaystyle\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\theta_{\\mathcal{D}}(\\alpha,\\beta)$。\n", 120 | "\n", 121 | "原始问题与对偶问题的关系可以用下面的式子简单表示:\n", 122 | "\n", 123 | "$$d^*=\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\operatorname*{min}_{w}\\mathcal{L}(w,\\alpha,\\beta)\\leq p^*=\\operatorname*{min}_{w}\\operatorname*{max}_{\\alpha,\\beta:\\alpha_i\\geq 0}\\mathcal{L}(w,\\alpha,\\beta)$$\n", 124 | "\n", 125 | "(一个普遍事实:“min max”某函数总是大于等于“max min”某函数,比如$\\displaystyle\\operatorname*{max}_{y\\in\\{0,1\\}}\\underbrace{\\left(\\displaystyle\\operatorname*{min}_{x\\in\\{0,1\\}}1\\{x=y\\}\\right)}_{0}\\leq\\displaystyle\\operatorname*{min}_{x\\in\\{0,1\\}}\\underbrace{\\left(\\displaystyle\\operatorname*{max}_{y\\in\\{0,1\\}}1\\{x=y\\}\\right)}_{1}$)在某些特定情况下,能够得到:\n", 126 | "\n", 127 | "$$d^*=p^*$$\n", 128 | "\n", 129 | "也就是说,我们可以通过解对偶优化问题来得到原始优化问题的最优值(这么做的原因是,对偶问题通常更加简单,而且与原始问题相比,对偶问题具有更多有用的性质,稍后我们会在最优间隔分类器即支持向量机问题中见到),接下来看在什么情况下此式成立。\n", 130 | "\n", 131 | "假设$f$和$g_i$是凸函数(对于$f$的海森矩阵有,当且仅当海森矩阵半正定时,$f$是凸函数。举个例子:$f(w)=w^Tw$是凸的,类似的,所有线性(和仿射)函数也是凸的。另外,即使$f$不可微,它也可以是凸的,不过现在我们不需要这种更一般化的关于凸性的定义),$h_i$是仿射函数([中文](https://zh.wikipedia.org/wiki/%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2),[英文](https://en.wikipedia.org/wiki/Affine_transformation))(仿射函数/变换是指存在$a_i,b_i$使得$h_i(w)=a_i^Tw+b_i$,而“仿射变换”是指线性变换后加上截距项$b_i$使整体平移,即线性变换是固定原点的,而仿射变换是可以平移的)。进一步假设$g_i$是严格可用的,即对于所有$i$存在$w$能够使$g_i(w)\\lt 0$。\n", 132 | "\n", 133 | "在上述假设条件下,附加条件$w^*,\\alpha^*,\\beta^*$一定存在($w^*$是原始问题的解,$\\alpha^*,\\beta^*$是对偶问题的解),再附加条件$p^*=d^*=\\mathcal{L}(w^*,\\alpha^*,\\beta^*)$,再附加条件$w^*,\\alpha^*,\\beta^*$满足**KKT条件(Karush-Kuhn-Tucker conditions)**:\n", 134 | "\n", 135 | "$$\\begin{align}\\frac{\\partial}{\\partial w_i}\\mathcal{L}(w^*,\\alpha^*,\\beta^*)&=0,\\quad i=1,\\cdots,n\\tag{3}\\\\\\frac{\\partial}{\\partial \\beta_i}\\mathcal{L}(w^*,\\alpha^*,\\beta^*)&=0,\\quad i=1,\\cdots,l\\tag{4}\\\\\\alpha_i^*g_i(w^*)&=0,\\quad i=1,\\cdots,k\\tag{5}\\\\g_i(w^*)&\\leq0,\\quad i=1,\\cdots,k\\tag{6}\\\\\\alpha_i^*&\\geq0,\\quad i=1,\\cdots,k\\tag{7}\\end{align}$$\n", 136 | "\n", 137 | "如果存在满足KKT条件的$w^*,\\alpha^*,\\beta^*$,则原始问题与对偶问题一定有解。$(5)$式又称为**KKT对偶互补条件(KKT dual complementarity condition)**,这个条件表明如果$a_i^*\\gt0$则$g_i(w^*)=0$(即约束条件$g_i(w^*)\\leq0$“激活”,成为一个**活动约束(active constraint)**并处于取等号的状态)。在后面的课程中,我们将通过这个条件知道支持向量机只有一小部分“支持向量”。当讲到序列最小优化算法(SMO)时,KKT对偶互补条件也会给我们一个验证其收敛特征的方法。\n", 138 | "\n", 139 | "## 6. 最优间隔分类器(续)\n", 140 | "\n", 141 | "在上一节,我们引入了原始优化问题,用以求解最优间隔分类器:\n", 142 | "\n", 143 | "$$\\begin{align}\\displaystyle\\operatorname*{min}_{w,b}&\\quad\\frac{1}{2}\\lVert w\\rVert^2\\\\\\mathrm{s.t.}&\\quad y^{(i)}\\left(w^Tx^{(i)}+b\\right)\\geq 1,\\quad i=1,\\cdots,m\\end{align}$$\n", 144 | "\n", 145 | "我们可以将约束条件写为:\n", 146 | "\n", 147 | "$$g_i(w,b)=-y^{(i)}\\left(w^Tx^{(i)}+b\\right)+1\\leq0$$\n", 148 | "\n", 149 | "对于每个训练样本都有这样一个约束条件。从对偶互补约束条件可知,当$\\alpha_i\\gt0\\implies g_i(w,b)=0$(此时是一个活动约束)$\\iff$样本$(x^{(i)},y^{(i)})$的函数间隔为$1$。也就是说,如果该约束是一个活动约束,那么它实际上是将一个不等式条件变为等式条件,这意味着第$i$个训练样本的函数间隔一定等于$1$。考虑下图,实线表示具有最大间隔的分类超平面:\n", 150 | "\n", 151 | "\"\"\n", 152 | "\n", 153 | "图中最靠近判定边界(即$w^Tx+b=0$)的点就是具有最小间隔的点,在上图中共有三个这样的点(一负两正),在平行于判别边界的虚线上。于是,一共有三个$\\alpha_i$在我们解优化问题的过程中不为零(也就是虚线上的三个点,只有这三个点的拉格朗日乘数不为零,也只有这三个样本的函数间隔等于$1$,其余样本的函数间隔都严格大于$1$。再多说一点,有时会有$g_i,\\alpha_i$都等于零的情况,但通常$g_i=0$时$\\alpha_i$是非零的,所以那些函数间隔为$1$的样本就是那些$\\alpha_i$不等于零的样本),这三个样本也称为这个问题的**支持向量(support vectors)**。支持向量的数量通常都比训练集样本总量少很多。\n", 154 | "\n", 155 | "随着我们对对偶问题的深入理解,其中的关键思想就是尝试将算法用输入特征空间中点的向量内积$\\left\\langle x^{(i)},x^{(j)}\\right\\rangle$的形式表达出来(可以看做$\\left(x^{(i)}\\right)^Tx^{(j)}$)。实际上当我们使用核方法时,这种表达法将成为算法的关键。\n", 156 | "\n", 157 | "为优化问题构造拉格朗日算子:\n", 158 | "\n", 159 | "$$\\mathcal{L}(w,b,\\alpha)=\\frac{1}{2}\\lVert w\\rVert^2-\\sum_{i=1}^m\\alpha_i\\left[y^{(i)}\\left(w^Tx^{(i)}+b\\right)-1\\right]\\tag{8}$$\n", 160 | "\n", 161 | "式中只有拉格朗日乘数$\\alpha_i$而没有$\\beta_i$,因为此问题中只含有不等式约束条件。\n", 162 | "\n", 163 | "我们需要找出此问题的对偶形式。要得到对偶问题的$\\theta_{\\mathcal{D}}$,首先需要最小化关于$w,b$(将$\\alpha$作为常量)的函数$\\mathcal{L}(w,b,\\alpha)$,也就是对$\\mathcal{L}$分别求关于$w,b$的偏导,并将偏导数置为零:\n", 164 | "\n", 165 | "$$\\nabla_w\\mathcal{L}(w,b,\\alpha)=w-\\sum_{i=1}^m\\alpha_iy^{(i)}x^{(i)}=0$$\n", 166 | "\n", 167 | "于是得到$w$:\n", 168 | "\n", 169 | "$$w=\\sum_{i=1}^m\\alpha_iy^{(i)}x^{(i)}\\tag{9}$$\n", 170 | "\n", 171 | "可以看出$w$实际上是由$\\alpha_i$设置权重后输入特征值向量的线性组合。继续对$b$求偏导:\n", 172 | "\n", 173 | "$$\\frac{\\partial}{\\partial b}\\mathcal{L}(w,b,\\alpha)=\\sum_{i=1}^m\\alpha_iy^{(i)}=0\\tag{10}$$\n", 174 | "\n", 175 | "现在将$(9)$式代入$(8)$式并化简,有:\n", 176 | "\n", 177 | "$$\\mathcal{L}(w,b,\\alpha)=\\sum_{i=1}^m\\alpha_i-\\frac{1}{2}\\sum_{i,j=1}^m\\alpha_i\\alpha_jy^{(i)}y^{(j)}\\left(x^{(i)}\\right)^Tx^{(j)}-b\\sum_{i=1}^m\\alpha_iy^{(i)}$$\n", 178 | "\n", 179 | "根据$(10)$式,最后一项应为$0$,于是得到:\n", 180 | "\n", 181 | "$$\\mathcal{L}(w,b,\\alpha)=\\sum_{i=1}^m\\alpha_i-\\frac{1}{2}\\sum_{i,j=1}^m\\alpha_i\\alpha_jy^{(i)}y^{(j)}\\left(x^{(i)}\\right)^Tx^{(j)}$$\n", 182 | "\n", 183 | "这个式子是我们通过求函数$\\mathcal{L}$关于$w,b$的函数最小值得到的,再加上约束条件$\\alpha_i\\geq0$(始终存在的约束)和$(10)$式,最终得到下面的对偶优化问题(此时将$\\mathcal{L}$看做关于$\\alpha$的函数):\n", 184 | "\n", 185 | "$$\\begin{align}\\displaystyle\\operatorname*{max}_{\\alpha}&\\quad W(\\alpha)=\\sum_{i=1}^m\\alpha_i-\\frac{1}{2}\\sum_{i,j=1}^m\\alpha_i\\alpha_jy^{(i)}y^{(j)}\\left\\langle x^{(i)},x^{(j)}\\right\\rangle\\\\\\mathrm{s.t.}&\\quad \\alpha_i\\geq 0,\\quad i=1,\\cdots,m\\\\&\\quad\\sum_{i=1}^m\\alpha_iy^{(i)}=0\\end{align}$$\n", 186 | "\n", 187 | "(在这里简单的解释一下第二个约束条件,即拉格朗日算子对$b$求偏导的结果。如果$\\displaystyle\\sum_{i=1}^m\\alpha_iy^{(i)}\\neq0$,则$\\theta_{\\mathcal{D}}(\\alpha)=-\\infty$。换句话说拉格朗日算子是参数$b$的线性函数。所以如果我们的目标是$\\displaystyle\\operatorname*{max}_{\\alpha\\geq0}\\theta_{\\mathcal{D}}(\\alpha)$,那么就应该选择使得$\\displaystyle\\sum_{i=1}^m\\alpha_iy^{(i)}=0$的$\\alpha$,因为当$\\displaystyle\\sum_{i=1}^m\\alpha_iy^{(i)}=0$时$\\theta_{\\mathcal{D}}(\\alpha)=W(\\alpha)$。)\n", 188 | "\n", 189 | "易证$p^*=d^*$及KKT条件((3)-(7)式)在此优化问题中成立。那么我们就可以通过计算对偶问题来得到原始问题的解。上面的对偶问题是一个求关于$\\alpha_i$的函数的最大值的问题。我们稍后再讨论对偶问题的特定解法,先假设我们能够解出最优值(即找到在约束条件下使$W(\\alpha)$最大化的$\\alpha$的取值),那么就可以使用$(9)$式找到最优值$w$($w$是一个关于$\\alpha$的函数)。考虑原始问题,有了$w^*$则可以直接求出截距项$b$,因为此时超平面的法向量已经确定,我们只需要在满足该法向量的超平面中“固定”适当的截距,使得超平面到正负样本的距离相等即可(即找到图中两虚线之间的实现)。我们将$a,w$带入原始问题求中解$b$:\n", 190 | "\n", 191 | "$$b^*=\\frac{\\displaystyle\\operatorname*{max}_{i:y^{(i)}=-1}w^{*T}x^{(i)}+\\displaystyle\\operatorname*{min}_{i:y^{(i)}=1}w^{*T}x^{(i)}}{2}\\tag{11}$$\n", 192 | "\n", 193 | "再继续之前,我们先仔细观察一下$(9)$式,也就是最优值$w$关于最优值$\\alpha$的函数。假设我们已经通过拟合训练集得到模型的参数,现在想要预测一个新的输入点$x$,那么我们会计算$w^Tx+b$,当且仅当这个值大于$1$时,模型才会给出结论$y=1$。但是通过$(9)$式,这个值也可以表示为:\n", 194 | "\n", 195 | "$$\\begin{align}w^Tx+b&=\\left(\\sum_{i=1}^m\\alpha_iy^{(i)}x^{(i)}\\right)^Tx+b\\tag{12}\\\\&=\\sum_{i=1}^m\\alpha_iy^{(i)}\\left\\langle x^{(i)},x\\right\\rangle+b\\tag{13}\\end{align}$$\n", 196 | "\n", 197 | "如果我们已经求出$\\alpha_i$,为了做出预测,则只需要按照上式求出$x$与训练集中样本的内积。而且在前面的求解中,我们知道,除了支持向量以为,其余训练样本对应的$\\alpha_i$都是零,因此上面的求和中很多项都是零。所以我们只需要求出$x$与支持向量的内积,然后再按照$(13)$式计算并作出预测即可。\n", 198 | "\n", 199 | "为了计算对偶优化问题,我们深入了解了问题的结构,于是仅依靠支持向量的内积就表示出整个算法。在下一节中,我们将继续分析这个特性,进而能够将核方法应用在分类问题。而作为结果得到的**支持向量机(support vector machines)**将会是一个能够在极高维度空间中高效学习的算法。" 200 | ] 201 | } 202 | ], 203 | "metadata": { 204 | "kernelspec": { 205 | "display_name": "Python 3", 206 | "language": "python", 207 | "name": "python3" 208 | }, 209 | "language_info": { 210 | "codemirror_mode": { 211 | "name": "ipython", 212 | "version": 3 213 | }, 214 | "file_extension": ".py", 215 | "mimetype": "text/x-python", 216 | "name": "python", 217 | "nbconvert_exporter": "python", 218 | "pygments_lexer": "ipython3", 219 | "version": "3.5.2" 220 | } 221 | }, 222 | "nbformat": 4, 223 | "nbformat_minor": 0 224 | } 225 | -------------------------------------------------------------------------------- /chapter09.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第九讲:经验风险最小化\n", 8 | "\n", 9 | "# 第六部分:学习理论(Learning Theory)\n", 10 | "\n", 11 | "## 1. 偏差/方差权衡(Bias/variance tradeoff)\n", 12 | "\n", 13 | "最早在我们学习线性回归的时候,我们就进行了关于选择拟合一个简单模型(如$y=\\theta_0+\\theta_1x$),还是选择拟合一个复杂模型($y=\\theta_0+\\theta_1x+\\cdots+\\theta_5x^5$)的讨论,仍旧是这幅图:\n", 14 | "\n", 15 | "\"\"\n", 16 | "\n", 17 | "结果发现,拟合一个五阶多项式(右图)并不是一个好的选择。而且,尽管这个五阶多项式在对训练集中的样本特征$x$(比如实用面积)做出预测$y$(比如公寓租金)时做的非常好,我们也并不看好它对不再训练集中样本的预测结果。换句话说,模型从训练集中学到的知识并不能很好的*泛化(generalize)*到其他房屋租赁样本中。我们说一个假设的**泛化误差(generalization error)**就是指该假设对于不在训练集中样本预测的期望误差(我们在后面会给出正式的定义)。\n", 18 | "\n", 19 | "最左和最右的图片都存在较大的泛化误差,但是这两个模型的问题却并不相同。如果$y$与$x$并不是线性关系,那么如果我们使用线性模型去拟合训练集,即使训练集很大,线性模型也不能精确的捕捉到数据的结构特征。非正式的定义模型的**偏差(bias)**:即模型的预测值与样本实际值之间的差距,偏差越大则约偏离真实数据,即使拟合的训练集很大(如无限的训练集)。因此,对于左图,其线性模可能型存在欠拟合问题(即不能捕捉到数据呈现出的特征)。\n", 20 | "\n", 21 | "除了偏差,泛化误差还有另一个组成部分——模型拟合过程的**方差(variance)**。比如右图中的五阶多项式,这个模型很有可能只反映出了我们这个有限训练集中的数据特征,但并不能反映出不在训练集中的更广泛的$y$与$x$的关系。我们的训练集中可能存在比平均价格更高或更低的样本,于是当我们拟合这些“具有欺骗性的”数据时,也有可能得到一个泛化误差很大的模型。在这种情况下,我们称模型具有较大的方差,也就是预测值的变化范围或离散程度较大。(方差越大,数据分布越分散。在课程中我们不再给出关于偏差与方差的形式化定义,尽管这两个概念在诸如线性回归的算法中有明确定义,但在分类问题中这些概念的定义却有好几个不同的提议,而且尚未达成共识。)\n", 22 | "\n", 23 | "参见[Understanding the Bias-Variance Tradeoff](http://scott.fortmann-roe.com/docs/BiasVariance.html):\n", 24 | "\n", 25 | "\"\"\n", 26 | "\n", 27 | "通常,我摸在偏差与方差间都会做出权衡。如果我们的模型过于简单,只有很少的几个参数,那么它可能存在着较大的偏差(但是方差较小);如果过于复杂而含有非常多的参数,那么模型可能会存在较大的方差(但是偏差较小)。对于上面的这个例子,使用二次函数拟合的效果优于一阶或五阶多项式。\n", 28 | "\n", 29 | "## 2. 序言\n", 30 | "\n", 31 | "本节我们会对学习理论有一个大致了解,除了启发和深入理解机器学习,这部分讨论还将加强我们对学习理论直观概念,也会介绍一些学习算法在不同设置下最佳应用的经验。同时还将尝试解答这几个问题:\n", 32 | "* 首先,我们能否形式化偏差与方差间的权衡过程?\n", 33 | "\n", 34 | " 这个问题也将引出关于模型选择方法的讨论,比如算法自动确定使用几阶多项式进行拟合。\n", 35 | "* 其次,在机器学习中我们真正关心的是模型的泛化误差,但是大多数学习算法只对训练集做拟合,那么我们如何从“对训练集有着很好拟合的模型”中得知它的泛化误差?\n", 36 | "\n", 37 | " 我们尤其想知道,能否将“模型关于训练集的误差”同“模型的泛化误差”联系起来?\n", 38 | "* 最后一个问题,是否存在能够证明学习算法将会有效的条件?\n", 39 | "\n", 40 | "我们从两个非常有用的引理说起:\n", 41 | "\n", 42 | "**引理**,联合界(the union bound):令$A_1,A_2,\\cdots,A_k$为$k$个不同的事件(并不要求独立),则有:\n", 43 | "\n", 44 | "$$\n", 45 | "P(A_1\\cup\\cdots\\cup A_k)\\leq P(A_1)+\\cdots+P(A_k)\n", 46 | "$$\n", 47 | "\n", 48 | "在概率论中,联合界通常当做公理来使用(所以我们不会尝试证明这个式子),不过它很符合直觉:$k$个事件中任意一些事件发生的概率至多为这$k$个事件各自发生的概率之和(用文氏图表示更加自然)。\n", 49 | "\n", 50 | "(在符号的使用习惯上,如果我们对符号$a$加上了$\\hat a$,则这个“帽子”符号通常表示对原符号的估计,比如后面的$\\hat\\varepsilon$就是用来近似估计泛化误差$\\varepsilon$,而后面的$\\hat h$就是对真正的假设函数$h$的估计。)\n", 51 | "\n", 52 | "**引理**,霍夫丁不等式(Hoeffding inequality),$Z_1,\\cdots,Z_m$是服从$\\mathrm{Bernoulli}(\\phi)$的独立同分布(IID)的随机变量,即$P(Z_i=1)=\\phi,P(Z_i=0)=1-\\phi$。令$\\hat\\phi=\\frac{1}{m}\\displaystyle\\sum_{i=1}^mZ_i$,这是一个通过变量均值去估计变量期望的量,再令$\\gamma\\gt0$,则有:\n", 53 | "\n", 54 | "$$\n", 55 | "P\\left(\\lvert\\phi-\\hat\\phi\\rvert\\gt\\gamma\\right)\\leq2\\exp\\left(-2\\gamma^2m\\right)\n", 56 | "$$\n", 57 | "\n", 58 | "这个引理(在机器学习中也叫作切诺夫界,Chernoff bound)告诉我们,如果用$\\hat\\phi$(即$m$个服从$\\mathrm{Bernoulli}(\\phi)$的随机变量的平均值)作为参数$\\phi$的估计,那么若$m$越大,则我们离参数实际值越接近。也就是说,假设有一枚不均匀的硬币,掷这枚硬币面朝上的概率为$\\phi$,如果我们掷$m$次硬币,然后计算面朝上的比例,那么掷的次数越多,则这个比例作为参数$\\phi$估计的可信度越高。\n", 59 | "\n", 60 | "仅通过这两个引理,我们就可以推导出一些关于学习理论的深层次的至关重要的结论。\n", 61 | "\n", 62 | "为了使后面的论述更简洁,我们先将注意力限定在$y\\in\\{0,1\\}$的二元分类问题上。我们在这里讨论的结论都可以推广到包括回归、多元分类等问题中。\n", 63 | "\n", 64 | "假设有一组大小为$m$的训练集$S=\\left\\{\\left(x^{(i)},y^{(i)}\\right);i=1,\\cdots,m\\right\\}$,其中的样本$\\left(x^{(i)},y^{(i)}\\right)$服从某个独立同分布的概率分布$\\mathcal{D}$。对于假设函数$h$,我们定义**训练误差(training error)**(在学习理论中也称为**经验风险(empirical risk)**或**经验误差(empirical error)**)为:\n", 65 | "\n", 66 | "$$\n", 67 | "\\hat\\varepsilon(h)=\\frac{1}{m}\\sum_{i=1}^m1\\left\\{h\\left(x^{(i)}\\right)\\neq y^{(i)}\\right\\}\n", 68 | "$$\n", 69 | "\n", 70 | "其实就是$h$对训练集误分类的比例。如果想要明确表示$\\hat\\varepsilon(h)$是基于训练集$S$的,那么可以写作$\\hat\\varepsilon_S(h)$。我们定义泛化误差为:\n", 71 | "\n", 72 | "$$\n", 73 | "\\varepsilon(h)=P_{(x,y)\\sim\\mathcal{D}}(h(x)\\neq y)\n", 74 | "$$\n", 75 | "\n", 76 | "这个式子表示,如果从分布$\\mathcal{D}$中再取出一个新的样本$(x,y)$,$h$会将其误分类的概率。\n", 77 | "\n", 78 | "应该留意的是,我们一直假设训数据是从分布$\\mathcal{D}$中取出的,而分布$\\mathcal{D}$正是我们将要(通过泛化误差定义式)用假设函数$h$评估的对象。这也有时候会作为**PAC**假设中的一条。(PAC是probably approximately correct的缩写,通常译为可能近似正确,它是学习理论已经证明的一套理论框架中的一些列假设。其中最重要的是关于同一个分布的训练以及测试的假设,以及关于独立抽取训练样本的假设。)\n", 79 | "\n", 80 | "考虑线性分类的设置,令$h_\\theta(x)=1\\left\\{\\theta^Tx\\geq0\\right\\}$,那么用什么方法拟合参数$\\theta$比较合理呢?其中一种实现是通过最小化训练误差得到:\n", 81 | "\n", 82 | "$$\n", 83 | "\\hat\\theta=\\mathrm{arg}\\operatorname*{max}_{\\theta}\\hat\\varepsilon(h_\\theta)\n", 84 | "$$\n", 85 | "\n", 86 | "我们称这个算法为**经验风险最小化(ERM: empirical risk minimization)**,而由学习算法得出的假设函数为$\\hat h=h_{\\hat\\theta}$。经验风险最小化通常被认为是最基础的学习算法,它也是本节关注的焦点算法。(ERM本身是一个非凸优化问题,诸如逻辑回归和支持向量机等算法也可以被看做是一种凸性近似的经验风险最小化算法。)\n", 87 | "\n", 88 | "在深入学习理论的过程中,我们要学会不纠结于假设某些特定的参数化法或该不该使用线性分类器等问题。对于本讲要证明的结论来说,我们不再把学习算法当做是一组参数的选取过程,而应该把它当做是选择一个函数的过程。定义学**假设类(hypothesis class)$\\mathcal{H}$**是所有分类器的集合,而我们的学习算法会从中选择分类器。对于线性分类器,$\\mathcal{H}=\\left\\{h_\\theta:h_\\theta(x)=1\\left\\{\\theta^Tx\\geq0\\right\\},\\theta\\in\\mathbb{R}^{n+1}\\right\\}$是所有判别边界是线性的分类器集合,其中的每一个成员$h_\\theta$都是从$\\mathcal{X}$(输入域)到$\\{0,1\\}$的函数。更广泛的,比如我们在学习神经网络,则我们可以令$\\mathcal{H}$为表示神经网络架构的所有分类器的集合。\n", 89 | "\n", 90 | "现在可以将经验风险最小化看做是一类函数$\\mathcal{H}$中的一个最小化函数,算法将在这一类函数中选择一个假设:\n", 91 | "\n", 92 | "$$\n", 93 | "\\hat h=\\mathrm{arg}\\operatorname*{min}_{h\\in\\mathcal{H}}\\hat\\varepsilon(h)\n", 94 | "$$\n", 95 | "\n", 96 | "(这里给出的$\\hat h$与前面的$\\hat\\theta$是等价的,只是不同思路下的不同表达。)\n", 97 | "\n", 98 | "## 3. 若$\\mathcal{H}$是有限的\n", 99 | "\n", 100 | "我们从一个具有“由$k$个假设构成的有限假设类$\\mathcal{H}=\\{h_1,\\cdots,h_k\\}$”的学习问题开始讲起。因此$\\mathcal{H}$只是$k$个从$\\mathcal{X}$映射到$\\{0,1\\}$的函数组成的集合,而经验风险最小化将从这$k$个函数中选择训练误差最小的一个。\n", 101 | "\n", 102 | "我们想要给$h$的泛化误差加上保证条件,分为两步:\n", 103 | "* 我们先要证明对于所有$h$,都有$\\hat\\varepsilon(h)$(训练误差)是$\\varepsilon(h)$(泛化误差)的可靠估计(这样我们就可以通过降低训练误差来减小泛化误差了);\n", 104 | "* 接下来证明$\\hat h$的泛化误差存在一个上界。\n", 105 | "\n", 106 | "假设我们从中选了$h_i\\in\\mathcal{H}$,考虑一个如下定义的伯努利随机变量$Z$:抽取样本$(x,y)\\sim\\mathcal{D}$,然后令$Z=1\\left\\{h_i(x)\\neq y\\right\\}$,即抽取一个样本,然后用$Z$来表示$h_i$是否误分类了样本,同样的有$Z_j=1\\left\\{h_i\\left(x^{(j)}\\right)\\neq y^{(i)}\\right\\}$,即$h_i$是否误分类了第$i$个样本(很明显$Z_j\\in\\{0,1\\}$是一个伯努利分布,根据泛化误差的定义有$P(Z_j=1)=\\varepsilon(h_i)$,其期望由$h_i$的泛化误差给出)。由于我们的训练集是$\\mathcal{D}$上的独立同分布,所以$Z$和$Z_j$具有相同的分布。\n", 107 | "\n", 108 | "可以看出对于随机抽取的样本,被误分类的概率为$\\varepsilon$(这正是$Z$和$Z_j$的预期值)。而且,训练误差可以写作:\n", 109 | "\n", 110 | "$$\n", 111 | "\\hat\\varepsilon(h_i)=\\frac{1}{m}\\sum_{i=1}^mZ_j\n", 112 | "$$\n", 113 | "\n", 114 | "$h_i$的训练误差$\\hat\\varepsilon(h_i)$就是$m$个随机变量$Z_j$的平均值,它们是从伯努利分布中抽取的期望为$\\varepsilon(h_i)$的独立同分布的随机变量。带入霍夫丁不等式有:\n", 115 | "\n", 116 | "$$\n", 117 | "P\\left(\\left\\lvert \\varepsilon(h_i)-\\hat\\varepsilon(h_i)\\right\\rvert\\gt\\gamma\\right)\\leq2\\exp\\left(-2\\gamma^2m\\right)\n", 118 | "$$\n", 119 | "\n", 120 | "这表明对于我们选择的特定$h_i$,当$m$足够大时,训练误差与泛化误差非常接近的概率也会变大。不过我们不仅仅想保证这个特定的$h_i$下$\\varepsilon(h_i)$与$\\hat\\varepsilon(h_i)$(很大概率)非常接近,我们想要证明这对所有的$h\\in\\mathcal{H}$同时成立。\n", 121 | "\n", 122 | "将事件$\\left\\lvert \\varepsilon(h_i)-\\hat\\varepsilon(h_i)\\right\\rvert\\gt\\gamma$记为$A_i$,我们已经证明了对任意$A_i$都有$P(A_i)\\leq2\\exp\\left(-2\\gamma^2m\\right)$。因此,使用联合界有:\n", 123 | "\n", 124 | "$$\n", 125 | "\\begin{align}\n", 126 | "P\\left(\\exists h\\in\\mathcal{H}.\\ \\left\\lvert\\varepsilon(h_i)-\\hat\\varepsilon(h_i)\\right\\rvert\\gt\\gamma\\right)&=P\\left(A_1\\cup\\cdots\\cup A_k\\right)\\\\\n", 127 | "&\\leq\\sum_{i=1}^kP(A_i)\\\\\n", 128 | "&\\leq\\sum_{i=1}^k2\\exp\\left(-2\\gamma^2m\\right)\\\\\n", 129 | "&=2k\\exp\\left(-2\\gamma^2m\\right)\n", 130 | "\\end{align}\n", 131 | "$$\n", 132 | "\n", 133 | "(第一个等式左边为“$\\mathcal{H}$中存在某函数$h_i$使得其泛化误差与训练误差的差值大于$\\gamma$”的概率。)\n", 134 | "\n", 135 | "同时用$1$减去不等式两边的量:\n", 136 | "\n", 137 | "$$\n", 138 | "\\begin{align}\n", 139 | "P\\left(\\lnot\\exists h\\in\\mathcal{H}.\\ \\left\\lvert\\varepsilon(h_i)-\\hat\\varepsilon(h_i)\\right\\rvert\\gt\\gamma\\right)&=P\\left(\\forall h\\in\\mathcal{H},\\ \\left\\lvert\\varepsilon(h_i)-\\hat\\varepsilon(h_i)\\right\\rvert\\leq\\gamma\\right)\\\\\n", 140 | "&\\geq1-2k\\exp\\left(-2\\gamma^2m\\right)\n", 141 | "\\end{align}\n", 142 | "$$\n", 143 | "\n", 144 | "($\\lnot$表示“逻辑否”,即事件“$\\mathcal{H}$中不存在某函数$h_i$使得其泛化误差与训练误差的差值大于$\\gamma$”,也就是事件“$\\mathcal{H}$中任意函数$h_i$使得其泛化误差与训练误差的差值不大于$\\gamma$”。)也就是说,对于所有$h\\in\\mathcal{H}$,有$\\varepsilon(h)$与$\\hat\\varepsilon(h)$之间的差值小于$\\gamma$的概率至少为$1-2k\\exp\\left(-2\\gamma^2m\\right)$,也叫作*一致收敛(uniform convergence)*结果,因为这是所有$h\\in\\mathcal{H}$同时成立的界限(一致收敛暗示了当$m$很大时,$\\mathcal{H}$中所有的$\\hat\\varepsilon(h_i)$都将同时收敛于$\\varepsilon(h_i)$,此时训练误差将会非常接近泛化误差 )。\n", 145 | "\n", 146 | "上面的计算结果指出,给定的$m,\\gamma$将会确定事件“对于某些$h\\in\\mathcal{H},\\ \\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\gt\\gamma$”发生概率的界限。这里涉及三个值$m,\\gamma$以及误差的概率。于是,我们就可以利用任意两个值确定第三个值的界限。\n", 147 | "\n", 148 | "* 比如,对于给定的$\\gamma$和某个$\\delta\\gt0$,$m$至少得取多大才能保证事件“训练误差与泛化误差之差在$\\gamma$以内”的概率至少为$1-\\delta$?可以令$\\delta=2k\\exp\\left(-2\\gamma^2m\\right)$然后解出$m$,那么如果$m\\geq\\frac{1}{2\\gamma^2}\\log\\frac{2k}{\\delta}$,则对于任意$h\\in\\mathcal{H}$,有事件“$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq\\gamma$”发生的概率至少为$1-\\delta$。(等价的有,对于某些$h\\in\\mathcal{H}$,事件$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\gt\\gamma$发生的概率为至多为$\\delta$)。这个界限指出了为了保证一个特定的误差,至少需要多少训练样本。对于给定的算法,为了保证特定的误差级别,所需要的训练集的大小$m$称为该算法的**样本复杂度界(sample complexity bound)**。\n", 149 | "\n", 150 | " 这个界限的关键性质在于,算法为保证误差所需的训练集大小与$k$的对数相关,也就是$\\mathcal{H}$中假设的个数的对数($m$与$\\log k$成正比,而$\\log k$的增长速度是非常慢的。另外,从经验上讲,对数函数是增长速度最慢的函数之一,在计算机科学中通常有$\\forall k,\\ \\log k\\leq30$。也就是说,即使在假设类中增加很多假设,所需的样本也不会增加多少)。在后面的讲解中,这是一个很重要的性质。\n", 151 | "\n", 152 | "* 类似的,我们也可以固定$m,\\delta$的取值,从上面的等式中解出$\\gamma$。如果要保证$1-\\delta$的概率,在给定的训练集包含$m$个样本时,对于所有的$h\\in\\mathcal{H}$,有$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq\\underbrace{\\sqrt{\\frac{1}{2m}\\log\\frac{2k}{\\delta}}}_{\\gamma}$。\n", 153 | "\n", 154 | "我们队第一部分的证明就到这里,可以看出训练误差一致收敛于泛化误差的可能性很高。接下来是第二部分的证明。\n", 155 | "\n", 156 | "现在,我们假设一致收敛已经确定,即对于所有$h\\in\\mathcal{H}$要使$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq\\gamma$,我们能够证明哪些关于$\\hat h$的泛化误差$\\varepsilon(\\hat h)$的结论?这里的$\\hat h=\\mathrm{arg}\\displaystyle\\operatorname*{min}_{h\\in\\mathcal{H}}\\hat\\varepsilon(h)$是经验风险最小化选取的假设。\n", 157 | "\n", 158 | "定义$h^*=\\mathrm{arg}\\displaystyle\\operatorname*{min}_{h\\in\\mathcal{H}}\\varepsilon(h)$为$\\mathcal{H}$中最能够满足条件的假设函数。注意到$h^*$是我们能从$\\mathcal{H}$中找到的最好的(泛化误差最小的)假设函数(也就是我们不可能在$\\mathcal{H}$中找到比$h^*$做得更好的函数,那么用我们的算法与$h^*$作比较就具有了实际意义),所以,与$h^*$对比误差有:\n", 159 | "\n", 160 | "$$\n", 161 | "\\begin{align}\n", 162 | "\\varepsilon(\\hat h)&\\leq\\hat\\varepsilon(\\hat h)+\\gamma\\\\\n", 163 | "&\\leq\\hat\\varepsilon(h^*)+2\\gamma\\\\\n", 164 | "&\\leq\\varepsilon(h^*)+2\\gamma\n", 165 | "\\end{align}\n", 166 | "$$\n", 167 | "\n", 168 | "第一个式子来自$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq\\gamma$(一致收敛假设)。第二个式子中,$\\hat h$是我们选来能够最小化$\\hat\\varepsilon(h)$的假设函数,那么对所有$h$都有$\\hat\\varepsilon(\\hat h)\\leq\\hat\\varepsilon(h)$,所以对特定的$h^*$也就有$\\hat\\varepsilon(\\hat h)\\leq\\hat\\varepsilon(h^*)$。第三个式子仍然使用一致收敛假设证明了$\\hat\\varepsilon(h^*)\\leq\\varepsilon(h^*)+\\gamma$。于是,这个不等式证明:如果有一致收敛假设,则$\\hat h$的泛化误差比至多比$\\mathcal{H}$中最好的假设函数多$2\\gamma$。\n", 169 | "\n", 170 | "把上面的推导总结在一个定理中:\n", 171 | "\n", 172 | "**定理**,令$\\lvert\\mathcal{H}\\rvert=k$,对于给定$m,\\delta$,当事件“训练误差与泛化误差之差小于$\\gamma$”的概率不小于$1-\\delta$时,有:\n", 173 | "\n", 174 | "$$\n", 175 | "\\varepsilon(\\hat h)\\leq\\underbrace{\\left(\\operatorname*{min}_{h\\in\\mathcal{H}}\\varepsilon(h)\\right)}_{\\varepsilon(h^*)}+2\\underbrace{\\sqrt{\\frac{1}{2m}\\log\\frac{2k}{\\delta}}}_{\\gamma}\n", 176 | "$$\n", 177 | "\n", 178 | "也就是将$\\gamma$换成了根号项,用的是事件“训练误差与泛化误差之差小于$\\gamma$”的概率不小于$1-\\delta$下一致收敛时得到的结论。另外,需要注意这个结论也告诉我们$\\varepsilon(h)$至多比$\\varepsilon(h^*)=\\displaystyle\\operatorname*{min}_{h\\in\\mathcal{H}}\\varepsilon(h)$大$2\\gamma$。\n", 179 | "\n", 180 | "这同样也印证了前面关于模型选择时的偏差/方差权衡的讨论。比如,我们原有一个假设类$\\mathcal{H}$,现在考虑换到另一个更大的假设类$\\mathcal{H}'\\supseteq\\mathcal{H}$下(举个例子,我们原来的$\\mathcal{H}$为所有线性函数的假设类,在加入了更多特征后有$\\mathcal{H}'$为二次函数构成的假设类,而线性函数构成的假设类是二次函数构成的假设类的子集)。如果我们换到$\\mathcal{H}'$(也就是二次函数假设类),则$\\varepsilon(h^*)$将会减小(因为我们这次从一个更大的函数集合中选择最小化泛化误差的函数,所以能够得到的新函数,可能是个二次函数,一定不会被原来的函数效果差)。于是,非正式的说,通过学习使用更大的假设类,偏差可能就会降低。但是,如果$k$增大,$\\gamma$项就会增大。于是,非正式的说,当我们选用更大的假设类时,方差也会随之上升。(整个过程说明,如果我们切换到一个更大的假设类中,那么我们得到一个使泛化误差更小的假设函数的希望就会增加,但代价是找到的函数不能精确拟合训练集的概率也会增加。我们可以非正式的将第一项对应为偏差,而将第二项对应为方差。)\n", 181 | "\n", 182 | "在给定$\\gamma,\\delta$的情况下,我们可以向前面一样解出$m$,从而得到样本复杂度界限:\n", 183 | "\n", 184 | "**推论**,令$\\lvert\\mathcal{H}\\rvert=k$,对于给定的$\\gamma,\\delta$,如果要保证$\\varepsilon(\\hat h)\\leq\\displaystyle\\operatorname*{min}_{h\\in\\mathcal{H}}\\varepsilon(h)+2\\gamma$成立,并且在事件“训练误差与泛化误差之差小于$\\gamma$”的概率至少为$1-\\delta$时,需要满足:\n", 185 | "\n", 186 | "$$\n", 187 | "\\begin{align}\n", 188 | "m&\\geq\\frac{1}{2\\gamma^2}\\log\\frac{2k}{\\delta}\\\\\n", 189 | "&=O\\left(\\frac{1}{\\gamma^2}\\log\\frac{k}{\\delta}\\right)\n", 190 | "\\end{align}\n", 191 | "$$\n", 192 | "\n", 193 | "下一讲会将讨论$\\mathcal{H}$是无限的情况,我们也会从上面这个式子开始说起。" 194 | ] 195 | } 196 | ], 197 | "metadata": { 198 | "kernelspec": { 199 | "display_name": "Python 3", 200 | "language": "python", 201 | "name": "python3" 202 | }, 203 | "language_info": { 204 | "codemirror_mode": { 205 | "name": "ipython", 206 | "version": 3 207 | }, 208 | "file_extension": ".py", 209 | "mimetype": "text/x-python", 210 | "name": "python", 211 | "nbconvert_exporter": "python", 212 | "pygments_lexer": "ipython3", 213 | "version": "3.5.2" 214 | } 215 | }, 216 | "nbformat": 4, 217 | "nbformat_minor": 0 218 | } 219 | -------------------------------------------------------------------------------- /chapter10.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十讲:交叉验证、特征选择\n", 8 | "\n", 9 | "回顾一下上一讲的内容,如果有一个有限的假设类$\\lvert\\mathcal{H}\\rvert=k$,对于给定的$\\gamma,\\delta$,要保证$\\varepsilon(\\hat h)\\leq\\displaystyle\\operatorname*{min}_{h\\in\\mathcal{H}}\\varepsilon(h)+2\\gamma$成立,并且在事件“训练误差与泛化误差之差小于$\\gamma$”的概率至少为$1-\\delta$时,需要满足:\n", 10 | "\n", 11 | "$$\n", 12 | "\\begin{align}\n", 13 | "m&\\geq\\frac{1}{2\\gamma^2}\\log\\frac{2k}{\\delta}\\\\\n", 14 | "&=O\\left(\\frac{1}{\\gamma^2}\\log\\frac{k}{\\delta}\\right)\n", 15 | "\\end{align}\n", 16 | "$$\n", 17 | "\n", 18 | "这是一个与样本复杂度相关的结论。现在我们想要将这一结论推广到无限假设类中。\n", 19 | "\n", 20 | "## 4. 若$\\mathcal{H}$是无限的\n", 21 | "\n", 22 | "我们已经证明了一些在有限假设类下非常有用的理论,然而,包括“任意以实数为参数的假设函数”(如线性分类器)在内的很多的假设类实际上包含了无数个假设函数。我们能否将有限假设类下成立的结论推广到无限假设类中呢?\n", 23 | "\n", 24 | "我们先抛出一个不严谨的论点,也许在某些方面不够“正确”,但它比较直观。之后,我们会给出一个更好且更普遍的结论。\n", 25 | "\n", 26 | "假设我们要将上面关于样本复杂度的式子应用在逻辑回归中,此时我们的假设类是由线性判别边界构成的,所以$\\mathcal{H}$是以$d$个实数作为参数(如果我用逻辑回归解决$n$个特征值的问题,则$d=n+1$,此时逻辑回归会找到一个以$n+1$个实数为参数的线性判别边界$g\\left(\\theta^Tx\\right)$)。而我们都知道,计算机通常使用IEEE双精度浮点数(C语言中的`double`,$64$位)来近似实数,那么在这个逻辑回归的情况下,计算机需要$64d$个比特位(bits)来表示这些参数。那么对我们的假设类就有$k=\\lvert\\mathcal{H}\\rvert=2^{64d}$个不同的假设函数。根据上一讲最后的结论,带入$O$表达式,为了保证样本复杂度中的条件$\\varepsilon{\\hat h}\\leq\\varepsilon{h^*}+2\\gamma$的概率至少为$1-\\delta$,就需要满足\n", 27 | "$\n", 28 | "m\\geq O\\left(\\frac{1}{\\gamma^2}\\log\\frac{2^{64d}}{\\delta}\\right)\n", 29 | "=O\\left(\\frac{d}{\\gamma^2}\\log\\frac{1}{\\delta}\\right)\n", 30 | "=O_{\\gamma,\\delta}(d)\n", 31 | "$\n", 32 | "(最后一个$O$记号的下标$\\gamma,\\delta$表明复杂度可能依赖于这两个隐藏参数)。从这里可以大概了解,所需训练样本的数量与模型参数的个数大约最多呈线性关系。\n", 33 | "\n", 34 | "虽然使用$64$位浮点数来推断这个结论并不能完全令人信服,但是这个结论大体上是正确的。如果要保证经验风险最小化生成的假设与最好假设间泛化误差的差距不超过$2\\gamma$,则$m$必须大于大$O$记号中的量级,如果我们尝试最小化训练误差,为了保证学习效果我们使用了含有$d$个参数的假设类,则所需要的训练样本的数量大致与我们假设类的参数数目呈线性关系,即$m$与$d$大致呈线性关系。\n", 35 | "\n", 36 | "(到目前为止,这些结论并不能说明一个使用经验风险最小化的算法的价值。因此,虽然多数尝试最小化或估计训练误差的判别学习算法对参数个数$d$为线性复杂度,但这个结论并不是对所有判别学习算法有效。对很多非经验风险最小化使用良好的假设保证仍是热门研究方向。)\n", 37 | "\n", 38 | "上面推导出的结论还有一个不那么令人满意的地方——它依赖参数化$\\mathcal{H}$。虽然直观上不容易看出问题,我们将具有$n+1$个参数$\\theta_0,\\cdots,\\theta_n$线性分类器所在的类写作$1\\left\\{\\theta_0^T+\\theta_1^Tx_1+\\cdots+\\theta_n^Tx_n\\geq0\\right\\}$,我们也可以将其写作$h_{u,v}(x)=1\\left\\{\\left(u_0^2-v_0^2\\right)+\\left(u_1^2-v_1^2\\right)x_1+\\cdots+\\left(u_n^2-v_n^2\\right)x_n\\geq0\\right\\}$,此时有$2n+2$个参数。不过,这两个式子表达的是同一个假设类$\\mathcal{H}$,即$n$维线性分类器的集合。\n", 39 | "\n", 40 | "为了给出一个更严谨的推导,我们先定义一些新概念。\n", 41 | "\n", 42 | "对于某个由点$x^{(i)}\\in\\mathcal{X}$构成的集合$S=\\left\\{x^{(1)},\\cdots,x^{(d)}\\right\\}$(并不要求是训练集),如果$\\mathcal{H}$可以实现$S$任意一种标记方式,即对于任意集合$\\left\\{y^{(1)},\\cdots,y^{(d)}\\right\\}$,存在$h\\in\\mathcal{H}$能够使$h\\left(x^{(i)}\\right)=y^{(i)},\\ i=1,\\cdots,d$成立,我们就称$\\mathcal{H}$**分散了(shatters)**$S$。\n", 43 | "\n", 44 | "对于给定假设类$\\mathcal{H}$,我们定义**Vapnik-Chervonenkis维度(Vapnik-Chervonenkis dimension)**,写作$\\mathrm{VC}(\\mathcal{H})$,表示能够被$\\mathcal{H}$分散的最大的集合。(如果$\\mathcal{H}$可以分散任意大小的集合,则有$\\mathrm{VC}(\\mathcal{H})=\\infty$)\n", 45 | "\n", 46 | "举个例子,考虑下图中的点:\n", 47 | "\n", 48 | "\"\"\n", 49 | "\n", 50 | "在两个维度上的($h(x)=1\\left\\{\\theta_0+\\theta_1x_1+\\theta_2x_2\\geq0\\right\\}$)线性分类器的集合$\\mathcal{H}$可以分散上面的点集吗?答案是肯定的。我们可以直接给出所有可能的八种分类标记的情况,而且对这个例子我们总是能够找到一个具有零训练误差的线性分类器(即完美分类):\n", 51 | "\n", 52 | "\"\"\n", 53 | "\n", 54 | "(对于上例的点集$S$,所有可能的分类情况都有对应的二维分类器将点分散)\n", 55 | "\n", 56 | "此外,通过一系列计算能够证明,此假设类(即二维线性分类器)不可能分开任意含有$4$个点的集合(不论这四个点在$x_1,x_2$坐标系上如何排列,我们都无法找到一组能够将“四个点的所有可能的$x,o$的标记情况”分开的直线)。因此,$\\mathcal{H}$可以分开的集合的元素总数为$3$,有$\\mathrm{VC}(\\mathcal{H})=3$。\n", 57 | "\n", 58 | "值得注意的是,虽然$\\mathcal{H}$的$\\mathrm{VC}$维是$3$,但也存在分不开的布局。比如,如果三点共线(如下方左图所示),则存在二维线性分类器无法分开的标记情况(如下方右图所示):\n", 59 | "\n", 60 | "\"\"\n", 61 | "\n", 62 | "(因为已经存在某个$3$个点的集合可以被二维线性分类器分散,所以这并不影响二维线性分类器的$\\mathrm{VC}$维为$3$。)\n", 63 | "\n", 64 | "也就是说,从$\\mathrm{VC}$维的定义有,为了证明$\\mathrm{VC}(\\mathcal{H})$至少是$d$,那么我们只需要找到一个大小为$d$的集合可以被$\\mathcal{H}$散列即可。\n", 65 | "\n", 66 | "**定理**,给定$\\mathcal{H}$,令$d=\\mathrm{VC}(\\mathcal{H})$,在保证事件“训练误差与泛化误差在$\\gamma$以内”的概率至少为$1-\\delta$的条件下,对于$h\\in\\mathcal{H}$有:\n", 67 | "\n", 68 | "$$\n", 69 | "\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq O\\left(\\sqrt{\\frac{d}{m}\\log\\frac{m}{d}+\\frac{1}{m}\\log\\frac{1}{\\delta}}\\right)\n", 70 | "$$\n", 71 | "\n", 72 | "因此,在概率至少为$1-\\delta$时可以得到:\n", 73 | "\n", 74 | "$$\n", 75 | "\\varepsilon\\left(\\hat h\\right)\\leq\\varepsilon\\left(h^*\\right)+O\\left(\\sqrt{\\frac{d}{m}\\log\\frac{m}{d}+\\frac{1}{m}\\log\\frac{1}{\\delta}}\\right)\n", 76 | "$$\n", 77 | "\n", 78 | "换句话说,如果一个假设类具有有限的$\\mathrm{VC}$维度,则当$m$越来越大时会产生一致收敛。同上一讲一样,我们可以从中得到一个使用$\\varepsilon\\left(h^*\\right)$表示的$\\varepsilon(h)$的界限。我们还能够得到下面的推论:\n", 79 | "\n", 80 | "**推论**,对于$h\\in\\mathcal{H}$(由于$\\varepsilon\\left(\\hat h\\right)\\leq\\varepsilon\\left(h^*\\right)+2\\gamma$),要保证$\\left\\lvert\\varepsilon(h)-\\hat\\varepsilon(h)\\right\\rvert\\leq\\gamma$的概率至少为$1-\\delta$,则必须满足$m=O_{\\gamma,\\delta}(d)$。\n", 81 | "\n", 82 | "也就是说,要保证从$\\mathcal{H}$中选取的假设能够“学的好”,所需的训练样本的个数与$\\mathcal{H}$的$\\mathrm{VC}$维数呈线性关系。这个结论也可以解释为,对于“大多数”假设类(我们假设”合理的“参数化),其$\\mathrm{VC}$维与其参数个数呈大致的线性关系(其实这两者的大小通常差不多,比如使用维度为$n$逻辑回归作为线性分类器时,一共需要$n+1$个参数,而$n$维线性分类器的假设类的$\\mathrm{VC}$维是$n+1$)。综合上面的各结论有,(对于一个尝试最小化训练误差)算法所需的训练样本的数量通常与假设类$\\mathcal{H}$参数的个数呈大致上的线性关系。这也表明了样本复杂度的上下界都是由$\\mathrm{VC}$维给出的。\n", 83 | "\n", 84 | "补充一点别的知识:回忆前几讲中的支持向量机算法,我们知道SVM会使用核函数将输入属性投影在无限维的特征空间中。那么,看起来SVM算法的$\\mathrm{VC}$维数是无穷。不过,具有较大间隔的线性分类器通常$\\mathrm{VC}$维都不会太大。我们可以做一个非正式的简要解释。给定了一个点集,如果我们只考虑使用具有较大间隔的线性分类器分隔这些点,那么我们的假设类将只包含这些间隔较大的判别边界。现在假设这个间隔就是$\\gamma$,那么假设类中将不会有太靠近某个点的判别边界(假设类中的假设函数到各点的距离都不会小于$\\gamma$)。如果点集中的点都分布在一个半径为$R$的圆内$\\left\\lVert x^{(i)}\\right\\rVert\\leq R$,那么对于可以分隔这个点集的分类器$h$(间隔至少为$\\gamma$)所在的假设类$\\mathcal{H}$,有$\\mathrm{VC}(\\mathcal{H})\\leq\\left\\lceil\\frac{R^2}{4\\gamma^2}\\right\\rceil+1$($\\lceil x\\rceil$表示对$x$向上取整)。关于这个结论的证明我们就不展开介绍了。通过这个结论我们可以知道,$\\mathrm{VC}$维数的取值范围与输入特征的维数是没有关系的。也就是说,即使输入$x$来自无限维空间,但只要我们令分类器必须满足一个较大的间隔时,$\\mathrm{VC}$维实际上是被限制在一个比较小的数字上。所以,如果给定SVM一个需要满足的间隔,SVM将自动找到一个具有较小$\\mathrm{VC}$维的假设类,算法并不会发生过拟合的现象。\n", 85 | "\n", 86 | "关于经验风险最小化,如果我们只看其中的一个样本$x$,对于假设函数$h_\\theta(x)=g\\left(\\theta^Tx\\right)$,那么指示函数$1\\left\\{h_\\theta(x)\\neq y\\right\\}$将会型为一个阶梯函数,假设我们拿到的是一个负样本$y=0$,那么如果$\\theta^Tx\\gt0$,也就是误分类,此时阶梯函数值为$1$,如果$\\theta^Tx\\leq0$,那么就是分类正确,此时阶梯函数值为$0$。我们所要做的就是找到一组$\\theta$,能够使这个阶梯函数最小化,也就是能够正确分类训练样本$x$(即令指示函数为$0$)。而这个指示函数是一个非凸函数,使用线性分类器最小化训练误差是一个NP困难问题([中文](https://zh.wikipedia.org/wiki/NP%E5%9B%B0%E9%9A%BE),[英文](https://en.wikipedia.org/wiki/NP-hardness))。我们前面介绍的逻辑回归和支持向量机都是在使用凸近似逼近经验风险最小化这个NP困难问题。\n", 87 | "\n", 88 | "# 第七部分:正则化及模型选择\n", 89 | "\n", 90 | "有时,遇到一个问题,我们需要在几个不同的模型间取舍。比如,我们在使用多项回归模型$h_\\theta(x)=g\\left(\\theta_0+\\theta_1x+\\theta_2x^2+\\cdots+\\theta_kx^k\\right)$时,需要确定$k$到底取$1,2,\\cdots10$中的那个值最为合适。那么,如何自动的让模型选择过程在偏差与方差间做出权衡?(原文使用”邪恶的双胞胎“来形容偏差与方差,可能使用”异卵双生“更合适)或者说,想要自动选择局部加权回归中的带宽参数$\\tau$,或是希望自动确定$\\mathscr{l}_1$正则化的SVM中的参数$C$(也就是SVM软边界中在间隔大小与惩罚力度之间做权衡的系数),我们应该如何去做呢?\n", 91 | "\n", 92 | "为了更具体的描述问题,我们在本讲中均假设将要从有限的模型集合$\\mathcal{M}=\\left\\{M_1,\\cdots,M_d\\right\\}$中选取模型。比如说在第一个例子中,$M_i$就表示$i$阶多项回归模型。(推广到无限的$\\mathcal{M}$也并不难。如果我们尝试从无限的模型集合中做出,使用带宽参数的例子$\\tau\\in\\mathbb{R}^+$,我们就可以离散化$\\tau$,然后令$M_i$为$\\tau_i$的函数,再从中选择可能的$M_i$。一般的,本讲描述的算法可以看做是在模型空间中做优化选择,我们同样可以将这个选择过程应用于无限模型集合中。)再比如我们需要在SVM、神经网络和逻辑回归中做出选择,那么$\\mathcal{M}$将包含这些模型。\n", 93 | "\n", 94 | "## 1. 交叉验证(Cross validation)\n", 95 | "\n", 96 | "像以前一样,假设有训练集$S$,从前面的经验风险最小化,我们可以得出一个关于模型选择的、乍看起来像个”算法“的步骤:\n", 97 | "\n", 98 | "1. 用$S$训练每一个$M_i$,从而得到相应的假设函数$h_i$;\n", 99 | "2. 选择训练误差最小的假设函数。\n", 100 | "\n", 101 | "遗憾的是,这个”算法“并不能符合我们的预期。比如说用这个”算法“要从多项模型集合中选择阶数,我们知道对于多项回归模型,其阶数越高则对训练集的拟合越好,也就是训练误差越小。于是,该”算法“会始终选择阶数高、方差大的多项模型,而我们通常是不会使用这种模型的。\n", 102 | "\n", 103 | "下面是一个比较好的算法,称为**保留交叉验证(hold-out cross validation)**(有时也称为**简单交叉验证(simple cross validation)**):\n", 104 | "\n", 105 | "1. 随机把训练集$S$分为两部分,$S_\\mathrm{train}$(假设有训练集$70%$的样本)和$S_\\mathrm{cv}$(剩下$30%$的样本),而这个$S_\\mathrm{cv}$称为保留交叉验证集;\n", 106 | "2. 仅使用$S_\\mathrm{train}$训练每一个模型$M_i$,进而得到相应的假设函数$h_i$;\n", 107 | "3. 使用保留交叉验证集测试$h_i$,选出测试结果$\\hat\\varepsilon_{S_\\mathrm{cv}}(h_i)$最小的假设函数。($\\hat\\varepsilon_{S_\\mathrm{cv}}(h_i)$表示$h_i$在训练集$S_\\mathrm{cv}$上的训练误差。)\n", 108 | "\n", 109 | "通过使用模型没有训练过的样本集$S_\\mathrm{cv}$的测试,我们对$h_i$的泛化误差就有了更好的估计,从而选择一个估计泛化误差最小的假设函数。我摸一般使用$\\frac{1}{4}$到$\\frac{1}{3}$的样本做保留交叉验证集合,而本例中的$30%$是常见的选择。\n", 110 | "\n", 111 | "有时第三步也会选择按照$\\mathrm{arg}\\displaystyle\\operatorname*{min}_i\\hat\\varepsilon_{S_\\mathrm{cv}}(h_i)$直接输出相应的模型$M_i$,然后在使用整个训练集$M$重新训练$M_i$。(这通常是个好点子,不过一些对初始化条件或数据的扰动非常敏感的算法来说,并不能使用这种方法。对这些算法来说,模型在$S_\\mathrm{train}$上表现的很好并不能得出它在$S_\\mathrm{cv}$上也会表现的很好。所以,对这种算法最好不要使用这个重新训练的步骤。)\n", 112 | "\n", 113 | "不过,保留交叉验证会“浪费”掉那$30%$的训练样本。即使我们使用改进的第三步,用整个训练集重新训练模型,但对于前面的模型选择过程,我们仍旧每次只使用了$0.7m$个训练样本,而不是包含$m$个样本的训练集。这种算法在训练样本有冗余或容易得到时,是没有什么问题的,但对于训练样本稀缺的学习问题(比如一共只有$m=20$个样本),我们就需要更好的算法了。\n", 114 | "\n", 115 | "下面的算法称作**$k$重交叉验证($k$-fold cross validation)**,该算法每次会保留更少的验证样本:\n", 116 | "\n", 117 | "1. 随机把训练集$S$分为$k$个子集,每个子集有$\\frac{m}{k}$个样本,记为$S_1,\\cdots,S_k$;\n", 118 | "2. 对每个模型$M_i$,我们执行下面的操作:\n", 119 | " \n", 120 | " `For` $j=1,\\cdots,k$\n", 121 | " \n", 122 | " * 使用$S_1\\cup\\cdots\\cup S_{j-1}\\cup S_{j+1}\\cup\\cdots\\cup S_k$(即使用除$S_j$以外的所以子集)训练$M_i$模型,从而得到假设$h_{ij}$;\n", 123 | " * 使用$S_j$测试$h_{ij}$,从而得到$\\hat\\varepsilon_{S_j}\\left(h_{ij}\\right)$。\n", 124 | " \n", 125 | " $M_i$的泛化误差估计为$\\hat\\varepsilon_{S_j}\\left(h_{ij}\\right)$(对于每个$j$)的平均值。\n", 126 | "\n", 127 | "3. 选择具有最小泛化误差的$M_i$,然后使用整个训练集$S$重新训练模型,这次得到的假设函数就是最终的输出。\n", 128 | "\n", 129 | "我们通常使用$k=10$重交叉验证。在这个算法中,虽然每次保留的数据仅为$\\frac{1}{k}$(已经比原始的保留交叉验证小了很多),但整个$k$重计算过程的代价将比原始的保留交叉验证大很多,因为我们需要训练每个模型$k$次。\n", 130 | "\n", 131 | "尽管$k=10$是我们的常用选择,但是在那些样本非常珍贵的学习问题中,我们可能会选择极端的算法——令$k=m$,从而使得每次保留的样本达到最小。在这个算法中,我们将使用$m-1$个样本训练模型,用剩下的$1$个保留样本作为测试,模型的泛化误差将通过求这$m=k$次训练的平均误差得到。由于该算法仅保留一个样本用做测试,它也被称作**留一交叉验证(leave-one-out cross validation)**。\n", 132 | "\n", 133 | "上面我们介绍了模型选择时交叉验证算法的几个版本,这些算法还有更简单的用途——评估*单个*模型或算法的效果。举个例子,如果我们实现了一个学习算法,现在想要评估它在应用中的效果(或者我们发明了一个新的学习算法,并想要在论文中说明它在不同测试集上的表现时),那么交叉验证就给出了一个合理的方法。\n", 134 | "\n", 135 | "## 2. 特征选择\n", 136 | "\n", 137 | "特征选择是模型选择的一个非常重要的情形,我们把它拿出来单独介绍。假设有一个特征值$n$非常大(比如$n\\gg m$)的监督学习问题,但是我们怀疑这些特征中仅有一小部分与学习问题有关。即使对$n$个特征使用非常简单的线性分类器(比如第三讲介绍的感知算法),假设类的$\\mathrm{VC}$维数也会为$O(n)$的量级,除非有对于$n$来说大小相当的训练集,否则模型就会存在过拟合问题。\n", 138 | "\n", 139 | "在这种情况下,我就可以使用特征选择算法减小特征值的数量。对于包含$n$个特征值的集合,有$2^n$种特征值子集(因为$n$个特征值的中的每一个都包含或不包含在子集中这两种状态)。于是,我们可以把特征选择看做一种在$2^n$个可能的模型中做出选择的模型选择问题。不过,对于过大的$n$,直接训练$2^n$个模型并进行比较的代价非常大,所以我们通常使用某种启发式搜索过程来寻找好的特征值子集。下面的搜索过程称为**向前搜索(forward search)**:\n", 140 | "\n", 141 | "1. 初始化$\\mathcal{F}=\\emptyset$;\n", 142 | "2. 重复`{`\n", 143 | " \n", 144 | " (a) 循环$i=1,\\cdots,n$,如果$i\\notin\\mathcal{F}$,令$\\mathcal{F}_i=\\mathcal{F}\\cup\\{i\\}$,然后使用某种交叉验证来估计特征$\\mathcal{F}_i$。(即仅使用$\\mathcal{F}_i$中的特征训练模型,然后估计模型的泛化误差。)\n", 145 | " \n", 146 | " (b) 令$\\mathcal{F}$为步骤(a)中找到的最佳特征子集。\n", 147 | " \n", 148 | " `}`\n", 149 | "3. 选择并输出上面的搜索过程得到的最佳的特征子集。\n", 150 | "\n", 151 | "外层循环的终止条件可以设置为当$\\mathcal{F}=\\{1,2,\\cdots,n\\}$变为特征值全集时,也可以设置为当$\\left\\lvert\\mathcal{F}\\right\\rvert$达到一个阈值时(也就是我们允许算法使用的特征值个数的上限)。\n", 152 | "\n", 153 | "上面的算法称为**封装特征选择(wrapper model feature selection)**,因为算法中对模型有一个“封装”的过程,算法会重复调用模型检查评估不同特征子集的效果。除了向前搜索之外,我们还可以使用别的搜索过程,比如**向后搜索(backward search)**,该算法从全集$\\mathcal{F}=\\{1,\\cdots,n\\}$开始,然后每次删除一个特征值(同向前搜索评估每一个特征值的添加一样,向后搜索用相同的方法评估每一个特征值的删除),直到$\\mathcal{F}=\\emptyset$。\n", 154 | "\n", 155 | "虽然封装特征选择算法通常都很奏效,但这个算法的计算量较大,因为它会不断的调用学习算法评估特征子集。完成整个向前搜索算法(算法在$\\mathcal{F}=\\{1,\\cdots,n\\}$时停止)需要调用学习算法大约$O\\left(n^2\\right)$次。(在计算资源能够满足要求的情况下可以使用这些算法,但是对于诸如文本分类的问题,特征值集合可以轻易达到几万个的数量级,如果再使用搜索算法就有些吃力了。)\n", 156 | "\n", 157 | "(向前/向后搜索通常都不会找到最好的特征子集,实际上寻找最好的特征子集是一个NP困难问题。所以,相比较而言,这种搜索算法的效果通常都挺不错。)\n", 158 | "\n", 159 | "下面介绍**过滤特征选择(Filter feature selection)**算法,该算法使用启发式且计算量更小的方法选择特征子集(不过,这种算法下相应的泛化误差可能会比搜索算法大)。算法的思路就是使用$S(i)$给特征$x_i$“打分”,看$x_i$能够为标记为$y$的类型提供多少信息,接下来就是简单的选择$k$个$S(i)$最高的特征值了。\n", 160 | "\n", 161 | "“打分”函数$S(i)$的一种可能的定义:测量训练数据中$x_i$与$y$的相关度。该算法可能会使得我们选择的都是与标签$y$强相关的特征值。在实践中,我们通常选择能够表示$x_i$与$y$间的**互信息(mutual information)**$\\mathrm{MI}\\left(x_i,y\\right)$的$S(i)$:\n", 162 | "\n", 163 | "$$\n", 164 | "\\mathrm{MI}\\left(x_i,y\\right)=\\sum_{x_i\\in\\{1,0\\}}\\sum_{y\\in\\{1,0\\}}p\\left(x_i,y\\right)\\log\\frac{p\\left(x_i,y\\right)}{p\\left(x_i\\right)p(y)}\n", 165 | "$$\n", 166 | "\n", 167 | "(上面的式子假设$x_i$和$y$都是二元取值的变量,而更加一般化的式子应该是计算取值域内所有变量的情况之和。)关于$p\\left(x_i,y\\right)$、$p\\left(x_i\\right)$和$p(y)$的概率可以从训练集的经验分布中求得。\n", 168 | "\n", 169 | "为了直观的解释这个“打分”函数的作用,应注意到互信息也可以表示成KL散度(Kullback-Leibler divergence,这是信息论中的概念,[中文](https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5),[英文](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence)):\n", 170 | "\n", 171 | "$$\n", 172 | "\\mathrm{MI}\\left(x_i,y\\right)=\\mathrm{KL}\\left(p\\left(x_i,y\\right) \\parallel p\\left(x_i\\right)p(y)\\right)\n", 173 | "$$\n", 174 | "\n", 175 | "在[问题集3](http://cs229.stanford.edu/materials/ps3.pdf)中有更多关于KL散度的信息,不过在这里,KL散度给出了衡量$p\\left(x_i,y\\right)$和$p\\left(x_i\\right)p(y)$间概率分布的差异程度的方法。如果$x_i$与$y$是独立随机变量,则有$p\\left(x_i,y\\right)=p\\left(x_i\\right)p(y)$,则这两个分布的KL散度为$0$。这与“$x_i$与$y$相互独立则$x_i$并不携带与$y$相关的信息”的观点一致。那么此时,$x_i$的得分$S(i)$就应该很小。相反,如果$x_i$携带的信息与$y$高度相关,那它们间的互信息$\\mathrm{MI}\\left(x_i,y\\right)$将会非常大。\n", 176 | "\n", 177 | "现在就有了一个关于特征值$S(i)$的排序,那么我们该选择前多少个特征值呢?其中一个“业界标准方法”就是使用交叉验证来判断究竟该选择多少个特征值。比如当我们使用朴素贝叶斯算法做文本分类时,会遇到词汇表条目数$n$过大的问题,而使用这个方法通常能够非常有效的提高分类器准确性。\n", 178 | "\n" 179 | ] 180 | } 181 | ], 182 | "metadata": { 183 | "kernelspec": { 184 | "display_name": "Python 3", 185 | "language": "python", 186 | "name": "python3" 187 | }, 188 | "language_info": { 189 | "codemirror_mode": { 190 | "name": "ipython", 191 | "version": 3 192 | }, 193 | "file_extension": ".py", 194 | "mimetype": "text/x-python", 195 | "name": "python", 196 | "nbconvert_exporter": "python", 197 | "pygments_lexer": "ipython3", 198 | "version": "3.5.2" 199 | } 200 | }, 201 | "nbformat": 4, 202 | "nbformat_minor": 0 203 | } 204 | -------------------------------------------------------------------------------- /chapter12.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十二讲:$k$-means算法、高斯混合模型及最大期望算法\n", 8 | "\n", 9 | "现在我们开始进入机器学习课程新的一章——无监督学习算法的应用。\n", 10 | "\n", 11 | "## $k$-means聚类算法($k$-means clustering algorithm)\n", 12 | "\n", 13 | "在聚类问题(clustering problem)中,对于给定的训练集$\\left\\{x^{(1)},\\cdots,x^{(m)}\\right\\}$,并且希望对样本分组,并找到能够使样本“紧密聚集”在一起的簇(clusters)。这里的$x^{(i)}\\in\\mathbb{R}^n$像原来一样,但是没有$y^{(i)}$。因此,这是一个无监督学习问题。\n", 14 | "\n", 15 | "$k$-means聚类算法的过程如下:\n", 16 | "\n", 17 | "1. 随机的初始化**簇质心(cluster centroids)**$\\mu_1,\\mu_2,\\cdots,\\mu_k\\in\\mathbb{R}^n$;\n", 18 | "2. 重复直到收敛\n", 19 | "\n", 20 | " `{`\n", 21 | " \n", 22 | " * 对每一个样本$i$,令$c^{(i)}:=\\mathrm{arg}\\displaystyle\\operatorname*{min}_j\\left\\lVert x^{(i)}-\\mu_j\\right\\rVert^2$\n", 23 | " * 对每一个簇$j$,令$\\mu_j:=\\frac{\\sum_{i=1}^m1\\left\\{c^{(i)}=j\\right\\}x^{(i)}}{\\sum_{i=1}^m1\\left\\{c^{(i)}=j\\right\\}}$\n", 24 | " \n", 25 | " `}`\n", 26 | "\n", 27 | "在这个算法中,参数$k$表示我们想要聚类的簇的数量,$\\mu_j$表示我们当前对于簇质心位置的猜测。为了初始化簇质心(即算法第一步),我们通常随机选择$k$个训练样本,然后令$k$个质心等于这$k$个训练样本。(方法不唯一,其他初始化方法也是可以的。)\n", 28 | "\n", 29 | "算法的内层循环重复这两步:(i)将每个训练样本$x^{(i)}$分配给距离它们最近的簇质心$\\mu_j$,(ii)移动每个簇质心$\\mu_j$到其下辖样本集合的中心。下图为$k$-means算法的简单演示:\n", 30 | "\n", 31 | "\"\"\n", 32 | "\n", 33 | "图中圆点为训练样本,叉号为簇质心,演示的过程为:(a)原数据集;(b)随机初始化的簇质心(在本例中并不是由某两个随机样本作为簇质心);(c-f)演示了$k$-means算法的两个迭代,在每次迭代中,我们都将训练样本分配给距离它们最近的簇质心(图中将样本与对应的簇质心标记为同一颜色);然后将每个簇质心移动到其下辖样本的中心。\n", 34 | "\n", 35 | "那么,$k$-means算法一定收敛吗?在特定的场景下,答案是肯定的。我们先定义**失真函数(distortion function)**:\n", 36 | "\n", 37 | "$$\n", 38 | "J(c,\\mu)=\\sum_{i=1}^m\\left\\lVert x^{(i)}-\\mu_{c^{(i)}}\\right\\rVert^2\n", 39 | "$$\n", 40 | "\n", 41 | "$J$为每个样本$x^{(i)}$到其簇质心$\\mu_{c^{(i)}}$的距离的平方之和,可以证明$k$-means正是在$J$上的坐标下降过程(参考[第八讲](chapter08.ipynb))。尤其是$k$-means算法的内循环实际上是在重复:保持$\\mu$不变最小化$J$关于$c$的函数,然后再保持$c$不变最小化$J$关于$\\mu$的函数。因此,$J$是单调递减的,它的函数值一定收敛。(通常这意味着$c$和$\\mu$也会收敛。但在理论上,$k$-means算法的最终结果可能在少数簇之间振荡,比如少数几组$c$或/且$\\mu$具有完全一样的$J$值。不过在实际操作中,这种现象几乎不会发生。)\n", 42 | "\n", 43 | "失真函数$J$是一个非凸函数,所以对于$J$的坐标下降并不能保证其收敛于全局最小值,即$k$-means会被局部最小值影响。尽管如此,$k$-means算法通常都都能很好的完成聚类任务。不过,如果真的怕算法落入“不好的”局部最优中,一个可行的解决方案是为簇质心$\\mu_j$赋上不同的初始化值,多运行几次,然后选出失真函数$J(c,\\mu)$最小的一组聚类结果即可。\n", 44 | "\n", 45 | "## 混合高斯模型(Mixtures of Gaussians)与最大期望算法(EM algorithm)\n", 46 | "\n", 47 | "在这一节我们将讨论对聚类样本密度估计(density estimation)的最大期望(EM: Expectation-Maximization)。\n", 48 | "\n", 49 | "假设有给定训练集$\\left\\{x^{(1)},\\cdots,x^{(m)}\\right\\}$,因为现在研究无监督学习算法,所以训练样本没有对应的$y$标记。\n", 50 | "\n", 51 | "我们希望使用一个联合分布$p\\left(x^{(i)},z^{(i)}\\right)=p\\left(x^{(i)}\\mid z^{(i)}\\right)p\\left(z^{(i)}\\right)$(链式法则)对数据建模。这里的$z^{(i)}\\sim\\mathrm{Multinomial}(\\phi)$(即$\\phi_j\\gt0,\\ \\sum_{j=1}^k\\phi_j=1,\\ \\phi_j=p\\left(z^{(i)}=j\\right)$,当只有两个高斯分布时,$z^{(i)}$只有两种取值的可能,此时它是一个伯努利分布。),并且有$x^{(i)}\\mid z^{(i)}=j\\sim\\mathcal{N}\\left(\\mu_j,\\varSigma_j\\right)$。令$k$表示事件$z^{(i)}$可能取的值的总数,因此,我们的模型假设每个事件$x^{(i)}$均由事件“$z^{(i)}$随机的在$\\{1,\\cdots,k\\}$做出选择”生成,而$x^{(i)}$可以表示为$k$个“由$z^{(i)}$确定的高斯分布”中的一个。这就是**混合高斯模型(mixture of Gaussians model)**。应注意$z^{(i)}$是**潜在(latent)**随机变量,这意味着它们是隐藏的、未知的,也正是这一点加大了我们估值难度。(变量$z^{(i)}$类似于样本$x^{(i)}$的标记,只是我们并不知道这个变量是多少,也就是说我们不知道每个样本属于哪个标记类,在后面的算法中,我们会尝试猜测这个标记。)\n", 52 | "\n", 53 | "模型的参数为$\\phi,\\mu,\\varSigma$,为了估计这些参数,可以写出参数在给定数据上的对数似然估计:\n", 54 | "\n", 55 | "$$\n", 56 | "\\begin{align}\n", 57 | "\\mathscr{l}\\left(\\phi,\\mu,\\varSigma\\right)&=\\sum_{i=1}^m\\log p\\left(x^{(i)};\\phi,\\mu,\\varSigma\\right)\\\\\n", 58 | "&=\\sum_{i=1}^m\\log\\sum_{z^{(i)}=1}^kp\\left(x^{(i)}\\mid z^{(i)};\\mu,\\varSigma\\right)p\\left(z^{(i)};\\phi\\right)\n", 59 | "\\end{align}\n", 60 | "$$\n", 61 | "\n", 62 | "然而,如果对式中每个参数求偏导并置为零,并尝试解出极值时会发现,我们无法求出这些参数的最大似然估计的解析解。\n", 63 | "\n", 64 | "随机变量$z^{(i)}$指出了$x^{(i)}$服从$k$个高斯分布中的哪一个。可以看出,如果我们能够确定$z^{(i)}$,那么这个最大似然问题就会好解很多,我们可以将似然函数写成:\n", 65 | "\n", 66 | "$$\n", 67 | "\\mathscr{l}\\left(\\phi,\\mu,\\varSigma\\right)=\\sum_{i=1}^m\\log p\\left(x^{(i)}\\mid z^{(i)};\\mu,\\varSigma\\right)+\\log p\\left(z^{(i)};\\phi\\right)\n", 68 | "$$\n", 69 | "\n", 70 | "最大化上面这个关于$\\phi,\\mu,\\varSigma$的式子就能求得各参数:\n", 71 | "\n", 72 | "$$\n", 73 | "\\begin{align}\n", 74 | "\\phi_j&=\\frac{1}{m}\\sum_{i=1}^m1\\left\\{z^{(i)}=j\\right\\}\\\\\n", 75 | "\\mu_j&=\\frac{\\sum_{i=1}^m1\\left\\{z^{(i)}=j\\right\\}x^{(i)}}{\\sum_{i=1}^m1\\left\\{z^{(i)}=j\\right\\}}\\\\\n", 76 | "\\varSigma_j&=\\frac{\\sum_{i=1}^m1\\left\\{z^{(i)}=j\\right\\}\\left(x^{(i)}-\\mu_j\\right)\\left(x^{(i)}-\\mu_j\\right)^T}{\\sum_{i=1}^m1\\left\\{z^{(i)}=j\\right\\}}\n", 77 | "\\end{align}\n", 78 | "$$\n", 79 | "\n", 80 | "如果能确定$z^{(i)}$,则这里的参数估计与前面([第五讲](chapter05.ipynb))高斯判别分析模型中的参数估计几乎是一样的,只不过$z^{(i)}$代替了原来的类标记$y^{(i)}$。(式子里还有其它细节不同,在[问题集1](http://cs229.stanford.edu/materials/ps1.pdf)的高斯判别分析中我们一了解到:第一,不同与问题集中$y^{(i)}\\in\\{-1,1\\}$服从伯努利分布,我们已经将$z^{(i)}$泛化为多项分布;第二,不同于问题集中不同的$y$共用一个协方差矩阵,我们已经给每个高斯分布赋上了不同的协方差矩阵$\\varSigma_j$。)\n", 81 | "\n", 82 | "然而,在我们的密度估计问题中,$z^{(i)}$是未知的,我们该怎么办呢?\n", 83 | "\n", 84 | "EM算法([中文](https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E6%9C%9F%E6%9C%9B%E7%AE%97%E6%B3%95),[英文](https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm))是一种迭代算法,有两个主要步骤。对于上面的问题,E步骤中,算法尝试猜测每个$z^{(i)}$的值,在M步骤中算法会根据猜测更新模型。因为M步骤会假设E步骤中的猜测是正确的,那么,有了缺失的$z^{(i)}$,最大化就很简单了。算法的流程:\n", 85 | "\n", 86 | "重复直到收敛:`{`\n", 87 | " \n", 88 | "* (E步骤)对于每个$i,j$,令$w_j^{(i)}:=p\\left(z^{(i)}=j\\mid x^{(i)};\\phi,\\mu,\\varSigma\\right)$(样本$x^{(i)}$属于第$j$个高斯分布的概率)\n", 89 | "* (M步骤)更新模型中的参数:\n", 90 | "$$\n", 91 | "\\begin{align}\n", 92 | "\\phi_j&=\\frac{1}{m}\\sum_{i=1}^mw_j^{(i)}\\\\\n", 93 | "\\mu_j&=\\frac{\\sum_{i=1}^mw_j^{(i)}x^{(i)}}{\\sum_{i=1}^mw_j^{(i)}}\\\\\n", 94 | "\\varSigma_j&=\\frac{\\sum_{i=1}^mw_j^{(i)}\\left(x^{(i)}-\\mu_j\\right)\\left(x^{(i)}-\\mu_j\\right)^T}{\\sum_{i=1}^mw_j^{(i)}}\n", 95 | "\\end{align}\n", 96 | "$$\n", 97 | "\n", 98 | "`}`\n", 99 | "\n", 100 | "在E步骤中,我们使用$x^{(i)}$以及当前的参数值计算所有的$z^{(i)}$,即使用贝叶斯定理:\n", 101 | "\n", 102 | "$$\n", 103 | "p\\left(z^{(i)}=j\\mid x^{(i)};\\phi,\\mu,\\varSigma\\right)=\\frac{p\\left(x^{(i)}\\mid z^{(i)}=j;\\mu,\\varSigma\\right)p\\left(z^{(i)}=j;\\phi\\right)}{\\sum_{l=1}^kp\\left(x^{(i)}\\mid z^{(i)}=l;\\mu,\\varSigma\\right)p\\left(z^{(i)}=l;\\phi\\right)}\n", 104 | "$$\n", 105 | "\n", 106 | "* 式中的$p\\left(x^{(i)}\\mid z^{(i)}=j;\\mu,\\varSigma\\right)$为某个以$\\mu_j$为期望、$\\varSigma_j$为协方差的高斯分布在$x^{(i)}$处的密度估计,即$\\frac{1}{\\sqrt{(2\\pi)^n\\left\\lvert\\varSigma_j\\right\\rvert}}\\exp\\left(-\\frac{1}{2}\\left(x^{(i)}-\\mu_j\\right)^T\\varSigma_j^{-1}\\left(x^{(i)}-\\mu_j\\right)\\right)$;\n", 107 | "* $p\\left(z^{(i)}=j;\\phi\\right)$为$\\phi_j$。\n", 108 | "\n", 109 | "E步骤中求出的$w_j^{(i)}$表示我们对$z^{(i)}$的“软”猜测。(“软”意味着一种概率上的猜测,从$[0,1]$区间取值;相对的“硬”猜测意味着最佳的一次性猜测,是一种对于值的猜测,比如从集合$\\{0,1\\}$或$\\{1,\\cdots,k\\}$中取值。)\n", 110 | "\n", 111 | "我们也应该对比M步骤中$z^{(i)}$已知时参数更新的式子,能够发现,只有式子里的由高斯分布中每个样本点求出的指示函数$1\\left\\{z^{(i)}=j\\right\\}$变为了$w_j^{(i)}$,其余部分同原来一样。\n", 112 | "\n", 113 | "同样也可以用前面的$k$-means聚类算法做对比,不同之处在于$k$-means算法将样本“硬”分配给不同的簇,EM算法用$w_j^{(i)}$做“软”分配。相似之处在于,EM算法也存在落入局部最优的可能。所以,使用不同的初始参数多运行几次的方法对EM算法同样适用。\n", 114 | "\n", 115 | "显然,可以很自然的解释EM算法对于$z^{(i)}$的迭代猜测,但是这个点子来自哪里?我们能对算法属性做出证明吗,比如证明其收敛性?在下一节,我们将给出一个更加泛化的EM算法的描述,它会使我们轻易的将EM算法应用在不同的具有潜在随机变量的估值问题中,而且也能够证明算法的收敛性。\n", 116 | "\n", 117 | "# 第九部分:EM算法\n", 118 | "\n", 119 | "在前面我们介绍了如何用EM算法应用在高斯混合模型的拟合上,在本节,我们将介绍EM算法更广泛的应用,并展示如何将其应用在含有潜在变量的估值问题族中。我们从**延森不等式(Jensen's inequality)**这一通途广泛的的结论开始本节的讨论。\n", 120 | "\n", 121 | "## 1. 延森不等式\n", 122 | "\n", 123 | "令函数$f$的值域为实数集,回忆以前的知识,如果$\\forall x\\in\\mathbb{R},f''(x)\\geq0$则$f$为凸函数([中文](https://zh.wikipedia.org/wiki/%E5%87%B8%E5%87%BD%E6%95%B0),[英文](https://en.wikipedia.org/wiki/Convex_function))。在这里,一般化的$f$的输入为向量,而函数的海森矩阵$H$应为半正定矩阵($H\\geq0$)。如果如果$\\forall x\\in\\mathbb{R},f''(x)\\gt0$,则称其为**严格(strictly)**凸函数(再输入为向量的情形下,函数对应的$H$应为为正定矩阵,记为$H\\gt0$)。于是,延森不等式为:\n", 124 | "\n", 125 | "**定理:**令$f$为凸函数,$X$为随机变量,则有$\\mathrm{E}\\left[f(x)\\right]\\geq f(\\mathrm{E}X)$。\n", 126 | "\n", 127 | "此外,如果$f$严格凸,则当且仅当$X=\\mathrm{E}[X]$的概率为$1$时(即$p(X=\\mathrm{E}[X])=1$,也就是说$X$是常量),有$\\mathrm{E}\\left[f(x)\\right]=f(\\mathrm{E}X)$。\n", 128 | "\n", 129 | "根据惯例,我们可以在写期望的时候省略方括号,$f(\\mathrm EX)=f(\\mathrm E[X])$。\n", 130 | "\n", 131 | "可以用下图解释这个定理:\n", 132 | "\n", 133 | "\"\"\n", 134 | "\n", 135 | "图中的实现就是凸函数$f$。X是一个随机变量,有$50%$的概率取到$a$、$50%$的概率取到$b$(沿$x$轴),则$X$的期望应在$a,b$的中点。\n", 136 | "\n", 137 | "再看$y$轴上的$f(a),f(b),f(\\mathrm{E}[X])$和$\\mathrm E[f(x)]$,其中$\\mathrm E[f(x)]$在$f(a),f(b)$的中点,从图中可以看出,因为$f$是凸函数,必然有$\\mathrm E[f(x)]\\geq f(\\mathrm EX)$。(有些同学可能会把这个不等式的符号方向记反,记住上面的图就可以快速推导出符号的方向。)\n", 138 | "\n", 139 | "**注意:**回忆以前的知识,当且仅当$-f$是[严格]凸函数时,$f$是[严格]凹函数(即$f''(x)\\leq0$或$H\\leq0$)。延森不等式同样适用于凹函数,只不过所有不等式的不等号的方向相反(如$\\mathrm E[f(x)]\\leq f(\\mathrm EX)$等)。\n", 140 | "\n", 141 | "## 2. EM算法\n", 142 | "\n", 143 | "对于给定的包含$m$个相互独立的样本的训练集$\\left\\{x^{(1)},\\cdots,x^{(m)}\\right\\}$,假设有估值问题:我们希望使用模型$p(x,z)$拟合样本数据,对数似然函数为:\n", 144 | "\n", 145 | "$$\n", 146 | "\\begin{align}\n", 147 | "\\mathscr l(\\theta)&=\\sum_{i=1}^m\\log p\\left(x^{(i)};\\theta\\right)\\\\\n", 148 | "&=\\sum_{i=1}^m\\log\\sum_{z^{(i)}}p\\left(x^{(i)},z^{(i)};\\theta\\right)\n", 149 | "\\end{align}\n", 150 | "$$\n", 151 | "\n", 152 | "但是直接计算出参数$\\theta$的最大似然估计可能会很难,因为这里的$z^{(i)}$是潜在随机变量。不过,如果能够确定$z^{(i)}$的值,参数的最大似然估计通常很容易计算。\n", 153 | "\n", 154 | "在这种情形下,EM算法给出了一个能够有效的求出参数最大似然估计的方法。直接最大化$\\mathscr l(\\theta)$可能很难,EM算法的思路是不停的构造$\\mathscr l$函数的下界(E步骤),然后最大化这些下界(M步骤)。(也就是说,算法先初始化一套参数$\\theta^{(0)}$,然后构造一个下界$\\mathscr l$并求这个$\\mathscr l$的最大值,而取最大值时的的这套参数就是$\\theta^{(1)}$;算法再从$\\theta^{(1)}$开始构造下一个下界并最大化得到$\\theta^{(2)}$……直到收敛于一个局部最优解)。下面介绍EM算法的形式描述:\n", 155 | "\n", 156 | "对每一个$i$,令$Q_i$为某个关于$z$的分布($\\displaystyle\\sum_{z^{(i)}}Q_i\\left(z^{(i)}\\right)=1,Q_i\\left(z^{(i)}\\right)\\geq0$),考虑下面的式子(若$z$是连续变量,则$Q_i$为概率密度,此时讨论中的所有对$z$的求和应变为对$z$的积分):\n", 157 | "\n", 158 | "$$\n", 159 | "\\begin{align}\n", 160 | "\\sum_i\\log p\\left(x^{(i)};\\theta\\right)&=\\sum_i\\log\\sum_{z^{(i)}}p\\left(x^{(i)},z^{(i)};\\theta\\right)\\tag{1}\\\\\n", 161 | "&=\\sum_i\\log\\sum_{z^{(i)}}Q_i\\left(z^{(i)}\\right)\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\tag{2}\\\\\n", 162 | "&\\geq\\sum_i\\sum_{z^{(i)}}Q_i\\left(z^{(i)}\\right)\\log\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\tag{3}\n", 163 | "\\end{align}\n", 164 | "$$\n", 165 | "\n", 166 | "$(2)$式到$(3)$式的推导使用了延森不等式,对于$f(x)=\\log(x)$有$f''(x)=-\\frac{1}{x^2}\\lt0$,所以$f(x)$是一个定义在$x\\in\\mathbb R^+$上的凹函数,则有$f(\\mathrm EX)\\geq \\mathrm E[f(X)]$。再看$(2)$式中的$\\displaystyle\\sum_{z^{(i)}}\\underbrace{Q_i\\left(z^{(i)}\\right)}_\\textrm{probability}\\underbrace{\\left[\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\right]}_\\textrm{variable}$项,恰好是$z^{(i)}$服从$Q_i$的分布时,变量$\\left[\\displaystyle\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\right]$的期望表达式(期望的定义:$\\mathrm E[g(x)]=\\sum_xp(x)g(x)$)。那么,根据延森不等式,应有:\n", 167 | "\n", 168 | "$$\n", 169 | "f\\left(\\operatorname*E_{z^{(i)}\\sim Q_i}\\left[\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\right]\\right)\\geq\\operatorname*E_{z^{(i)}\\sim Q_i}\\left[f\\left(\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}\\right)\\right]\n", 170 | "$$\n", 171 | "\n", 172 | "式中的$\\displaystyle\\operatorname*E_{z^{(i)}\\sim Q_i}$指在随机变量$z^{(i)}$服从$Q_i$分布的情况下求期望。最终我们得到$(3)$式。\n", 173 | "\n", 174 | "对于*任意*的分布$Q_i$,$(3)$式都能给出一个$\\mathscr l(\\theta)$的下界。而$Q_i$有很多种选择,我们接下来该怎么做?如果我们对当前的参数$\\theta$做一次猜测,我们希望这个猜测能够紧贴着目标函数$\\mathscr l(\\theta)$,因为只有这样,我们才能确定每次迭代都是在逼近目标函数的局部最优解。也就是说我们希望特定的$\\theta$猜测能够使这个“下界不等式”取到等号部分。(后面会解释这个等号如何保证$\\mathscr l(\\theta)$在每一次迭代中都单调递增。)\n", 175 | "\n", 176 | "对于特定的$\\theta$猜测,要使下界紧贴着目标函数,可以再观察引入延森不等式的那一步推导,我们的目标是使不等式取到等号。而上面已经介绍了,如果要取等号,只能是对一个“常量随机变量”求期望,也就是需要令$\\displaystyle\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}=c$,$c$是某个与$z^{(i)}$无关的常量(对于任意$z^{(i)}$,都取同一个常量$c$)。于是,令$Q_i\\left(z^{(i)}\\right)\\propto p\\left(x^{(i)},z^{(i)};\\theta\\right)$即可(令分母与分子保持同一个比例)。\n", 177 | "\n", 178 | "实际上,因为我们知道$Q_i$是一个概率分布,有$\\displaystyle\\sum_zQ_i\\left(z^{(i)}\\right)=1=\\sum_z\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{c}=\\frac{\\sum_zp\\left(x^{(i)},z^{(i)};\\theta\\right)}{c}\\implies c=\\sum_zp\\left(x^{(i)},z^{(i)};\\theta\\right)$,则有:\n", 179 | "\n", 180 | "$$\n", 181 | "\\begin{align}\n", 182 | "Q_i\\left(z^{(i)}\\right)&=\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{\\sum_zp\\left(x^{(i)},z;\\theta\\right)}\\\\\n", 183 | "&=\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{p\\left(x^{(i)};\\theta\\right)}\\\\\n", 184 | "&=p\\left(z^{(i)}\\mid x^{(i)};\\theta\\right)\n", 185 | "\\end{align}\n", 186 | "$$\n", 187 | "\n", 188 | "因此,我们只需要将$Q_i$设置为“对于给定的$x^{(i)}$下$z^{(i)}$的后验概率”即可,然后再此时的$\\theta$就行了。\n", 189 | "\n", 190 | "对于用上面的后验概率确定的$Q_i$,$(3)$式就能给出一个紧贴目标函数$\\mathscr l(\\theta)$的“下界函数”,这就是E步骤,而后面我们会尝试最大化这个“下界函数”,也就是在M步骤中,我们会尝试最大化$(3)$式得出的式子(用前面E步骤的$\\theta$确定的式子),并得到一组新的参数$\\theta$。不断重复这两部就是EM算法了:\n", 191 | "\n", 192 | "重复直到收敛:`{`\n", 193 | " \n", 194 | "* (E步骤)对于每个$i$,令$Q_i\\left(z^{(i)}\\right):=p\\left(z^{(i)}\\mid x^{(i)};\\theta\\right)$\n", 195 | "* (M步骤)更新参数,令$\\displaystyle\\theta:=\\arg\\max_\\theta\\sum_i\\sum_{z^{(i)}}Q_i\\left(z^{(i)}\\right)\\log\\frac{p\\left(x^{(i)},z^{(i)};\\theta\\right)}{Q_i\\left(z^{(i)}\\right)}$\n", 196 | "\n", 197 | "`}`\n", 198 | "\n", 199 | "下一讲将继续EM算法的介绍。" 200 | ] 201 | } 202 | ], 203 | "metadata": { 204 | "kernelspec": { 205 | "display_name": "Python 3", 206 | "language": "python", 207 | "name": "python3" 208 | }, 209 | "language_info": { 210 | "codemirror_mode": { 211 | "name": "ipython", 212 | "version": 3 213 | }, 214 | "file_extension": ".py", 215 | "mimetype": "text/x-python", 216 | "name": "python", 217 | "nbconvert_exporter": "python", 218 | "pygments_lexer": "ipython3", 219 | "version": "3.5.2" 220 | } 221 | }, 222 | "nbformat": 4, 223 | "nbformat_minor": 0 224 | } 225 | -------------------------------------------------------------------------------- /chapter15.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十五讲:PCA的奇异值分解、独立成分分析\n", 8 | "\n", 9 | "回顾一下上一讲的内容——PCA算法,主要有三个步骤:\n", 10 | "1. 将数据正规化为零期望以及单位化方差;\n", 11 | "2. 计算协方差矩阵$\\displaystyle\\varSigma=\\frac{1}{m}x^{(i)}\\left(x^{(i)}\\right)^T$;\n", 12 | "3. 找到$\\varSigma$的前$k$个特征向量。\n", 13 | "\n", 14 | "在上一讲的最后,我们还介绍了PCA在面部识别中的应用。试想一下,在面部识别中$x^{(i)}\\in\\mathbb R^{10000}$,那么$\\varSigma\\in\\mathbb R^{100000000}$,而要求这种亿级别的矩阵的特征向量并不容易,这个问题我们先放一放。\n", 15 | "\n", 16 | "来看另一个例子,在前面([第五讲](chapter05.ipynb))我们讨论过关于垃圾邮件分类的问题,我们会构造一个词汇表向量,其每个分量所对应的单词如果在邮件中出现则置为$1$,反正则置为$0$。当我们对这种数据应用PCA时,产生的算法换了个名字,叫做**潜在语义索引(LSI: latent semantic analysis)**。不过在LSI中,我们通常跳过预处理阶段,因为正规化数据使它们具有相同的方差可能会大幅增加不参加单词的权重。比如说我们拿到了一个文档的内容$x^{(i)}$,现在希望知道这份文档与我们已有文档中的哪个相似度最高,也就是衡量两个高维输入向量所表示的文档的相似性$\\mathrm{sim}\\left(x^{(i)},x^{(j)}\\right), x\\in\\mathbb R^{50000}$。我们通常的做法是衡量这两个向量直接的夹角,如果夹角越小则认为他们越相似,于是$\\displaystyle\\mathrm{sim}\\left(x^{(i)},x^{(j)}\\right)=\\cos\\theta=\\frac{\\left(x^{(i)}\\right)^Tx^{(j)}}{\\left\\lVert x^{(i)}\\right\\rVert\\left\\lVert x^{(j)}\\right\\rVert}$。再来看上面这个分子,$x^{(i)}\\left(x^{(j)}\\right)^T=\\sum_kx_k^{(i)}x_k^{(j)}=\\sum_k1\\{\\textrm{文档i和j都包含词语k}\\}$,如果文档中没有词语重复,则该式结果为$0$。但是,如果文档$j$包含单词“study”而文档$j$包含单词“learn”,那么如果一篇介绍“study strategy”的文章和一篇介绍“method of learning”的文章在这种算法下就是无关的,我们现在想要使它们相关。于是一开始,“learn”向量与“study”向量是相互正交的,它们的内积为零,我们在这两个向量之间再找一个向量$u$,然后将“learn”与“study”投影在$u$上,此时两个向量的投影点在$u$上将相距很近,那么它们做内积时将会得到一个正数,表示它们相关。于是,如果算法再遇到一篇关于“政治”的文章和另一篇包含很多政治家名字的文章时,它会判断这两篇文章是相关的。\n", 17 | "\n", 18 | "## 奇异值分解(SVD: Singular Value Decomposition)\n", 19 | "\n", 20 | "我们引入奇异值分解(可以参考线性代数笔记中的[奇异值分解](http://nbviewer.jupyter.org/github/zlotus/notes-linear-algebra/blob/master/chapter30.ipynb))来解决一开始遇到的大矩阵求特征向量的问题。比如在潜在语义索引中的输入,是一个$50000$维的向量,那么其对应的$\\varSigma\\in\\mathbb R^{50000\\times50000}$,这种规模的矩阵太大了,我们需要使用另一种方法实现PCA。\n", 21 | "\n", 22 | "对矩阵$A\\in\\mathbb R^{m\\times n}$,总有$A=UDV^T,U\\in\\mathbb R^{m\\times m},D\\in\\mathbb R^{m\\times n},V^T\\in\\mathbb R^{n\\times n}$,其中$D=\\begin{bmatrix}\\sigma_1&&&\\\\&\\sigma_2&&\\\\&&\\ddots&\\\\&&&\\sigma_n\\end{bmatrix}$是一个对角矩阵,而$\\sigma_i$称为矩阵的奇异值。分解之后的矩阵为$\\begin{bmatrix}A\\\\m\\times n\\end{bmatrix}=\\begin{bmatrix}U\\\\m\\times m\\end{bmatrix}\\begin{bmatrix}D\\\\m\\times n\\end{bmatrix}\\begin{bmatrix}V^T\\\\n\\times n\\end{bmatrix}$。\n", 23 | "\n", 24 | "现在来观察协方差矩阵的定义式$\\displaystyle\\varSigma=\\sum_{i=1}^mx^{(i)}\\left(x^{(i)}\\right)^T$,在前面的章节中([第二讲](chapter02.ipynb))我们介绍过一种叫做“设计矩阵”的构造方式,也就是将每一个样本向量作为矩阵$X$的一行拼凑一个矩阵:$X=\\begin{bmatrix}—\\left(x^{(1)}\\right)^T—\\\\—\\left(x^{(2)}\\right)^T—\\\\\\vdots\\\\—\\left(x^{(m)}\\right)^T—\\end{bmatrix}$,则我们可以将协方差矩阵用设计矩阵来表示:$\\varSigma=\\begin{bmatrix}\\mid&\\mid&&\\mid\\\\x^{(1)}&x^{(2)}&\\cdots&x^{(m)}\\\\\\mid&\\mid&&\\mid\\end{bmatrix}\\begin{bmatrix}—\\left(x^{(1)}\\right)^T—\\\\—\\left(x^{(2)}\\right)^T—\\\\\\vdots\\\\—\\left(x^{(m)}\\right)^T—\\end{bmatrix}$。\n", 25 | "\n", 26 | "最后就是计算$\\varSigma$的前$k$个特征向量了,我们选择对$X$做奇异值分解$X=UDV^T$,而$X^TX=VDU^TUD^TV^T=VD^2V^T=\\varSigma$,于是在$D$中从大到小排列奇异值并在$V$中取前$k$个奇异值对应的特征向量即可。\n", 27 | "\n", 28 | "容易看出$X\\in\\mathbb R^{m\\times50000}$,做这种规模矩阵的奇异值分解会比直接计算$\\varSigma\\in\\mathbb R^{50000\\times50000}$的特征向量快很多。这就是使用SVD实现PCA算法的计算过程。\n", 29 | "\n", 30 | "(不过,值得注意的是,在不同的计算软件,甚至是在同一种软件的不同版本中,对SVD的计算可能遵循某种默认的维数约定,因为SVD经常会得到带有很多零元素的$U$和$D$,而软件可能会按照某种约定舍弃这些零元素。所以,在使用SVD时,需要注意这样的维数约定。)\n", 31 | "\n", 32 | "## 无监督学习各算法的对比\n", 33 | "\n", 34 | "我们在前面介绍因子分析模型时指出,它是对每个因子$z^{(i)}$进行高斯建模,是一种对概率密度进行估计的算法,它试图对训练样本$X$的概率密度进行建模;而在其后介绍的PCA则有所不同,它并不是一个概率算法,因为它并没有使用任何概率分布拟合训练集,而是直接去寻找子空间。从这里我们可以大致的看到,如何在解决问题时在因子分析与PCA间做取舍:如果目标就是降低数据维数、寻找数据所在的子空间,我们就更倾向于使用PCA;而因子分析会假设数据本来就在某子空间内,如果有维度很高的数据$X$,而我又想对$X$建模,那么就应该使用因子分析算法(比如做异常检测,我们可以建立关于$P(X)$的模型,如果有一个低概率事件,就可以将这个事件分解在各因子分布中,进而估计其异常情况)。这两种算法的共同点就是,它们都会假设数据位于或靠近某个低维的子空间。\n", 35 | "\n", 36 | "再来看回顾一开始介绍的两种无监督学习方法:混合高斯模型以及$k$-means算法。这两种算法的共同点是——它们都会假设数据聚集在位于某几个簇内。不同点是混合高斯模型是一种对概率密度进行估计的算法,而$k$-means则不是。所以,如果我们需要将数据分成簇并对每一个簇建模,那么我们就倾向于使用高斯混合模型;而如我我们只想将数据分簇,并不要求确定每个簇的概率系统,则就更倾向于使用$k$-means算法。\n", 37 | "\n", 38 | "综合上面的观点可以得到表格,便于记忆:\n", 39 | "\n", 40 | "$$\n", 41 | "\\begin{array}\n", 42 | "{c|c|c}\n", 43 | "&\\textbf{Model }P(x)&\\textbf{Not probabilistic}\\\\\\hline\n", 44 | "\\textbf{Subspace}&\\textrm{Factor Analysis}&\\textrm{PCA}\\\\\\hline\n", 45 | "\\textbf{Cluster}&\\textrm{Mixtures of Gaussians}&k\\textrm{-means}\n", 46 | "\\end{array}\n", 47 | "$$\n", 48 | "\n", 49 | "# 第十二部分:独立成分分析(Independent components analysis)\n", 50 | "\n", 51 | "接下来,我们将介绍独立成分分析(ICA: Independent components analysis)。类似于PCA,独立成分分析也会寻找一组新的基,用来重新表示训练样本,然而这两个算法的目标截然不同。\n", 52 | "\n", 53 | "举一个实际问题作为例子,在第一讲,我们介绍了一个在鸡尾酒会上从嘈杂的背景音中分离发言者音频的应用。假设有$n$个发言者在一个舞会上同时说话,而在屋子里的各话筒仅捕捉到这种$n$个发言者的声音叠加在一起的音频。但是,假设我们有$n$个不同的话筒,由于每个话筒到个发言者的距离都不相同,则这些话筒记录下来的是不同形式的发言者声音叠加。那么,通过使用这些话筒的音频记录,我们能否分离出这$n$个发言者各自的音频信号?\n", 54 | "\n", 55 | "为了正式的描述这个问题,我们假设数据$x\\in\\mathbb R^n$,这些数据由$n$个相互独立的来源生成,而我们能够观测到的数据为:\n", 56 | "\n", 57 | "$$\n", 58 | "x=As\n", 59 | "$$\n", 60 | "\n", 61 | "这里的$A$是一个未知的方阵,通常被称为**混合矩阵(mixing matrix)**。通过重复观测,我们得到一个数据集$\\left\\{x^{(i)};i=1,\\cdots,m\\right\\}$,而我们的目标是还原那一组生成“观测到的数据集($x^{(i)}=As^{(i)}$)”的声音源$s^{(i)}$。\n", 62 | "\n", 63 | "在鸡尾酒舞会问题中,$s^{(i)}$是一个$n$维向量,$s_j^{(i)}$表示发言者$j$在第$i$次音频采集时发出的声音。而$x^{(i)}$也是$n$维向量,$x_j^{(i)}$表示话筒$j$在第$i$次音频采样时记录下来的音频。\n", 64 | "\n", 65 | "令$W=A^{-1}$作为**分离矩阵(unmixing matrix)**。我们的目标就是求出$W$,进而使用$s^{(i)}=Wx^{(i)}$从话筒收集的音频中还原出各独立的音源。按照一贯的标记法,我们通常使用$w_i^T$表示$W$矩阵的第$i$行,则有$W=\\begin{bmatrix}—w_1^T—\\\\\\vdots\\\\—w_n^T—\\end{bmatrix}$。那么,对$w_i\\in\\mathbb R^n$,有第$j$个发言者音源可以使用$s_j^{(i)}=w_j^Tx^{(i)}$表示。\n", 66 | "\n", 67 | "## 1. ICA二义性\n", 68 | "\n", 69 | "$W=A^{-1}$能够做出什么程度的还原?如果没有关于音源和混合矩阵的先验经验,不难看出,矩阵$A$存在固有二义性使得它不可能只通过$x^{(i)}$就还原并对应出每一个$s^{(i)}$。\n", 70 | "\n", 71 | "* 令$P$为$n$阶置换矩阵,也就是$P$的每行每列都只有一个$1$,其余元素均为零。举个例子:$P=\\begin{bmatrix}0&1&0\\\\1&0&0\\\\0&0&1\\end{bmatrix},\\ P=\\begin{bmatrix}0&1\\\\1&0\\end{bmatrix},\\ P=\\begin{bmatrix}1&0\\\\0&1\\end{bmatrix}$。其作用是,对向量$z$,$Pz$会产生一个将$z$的各分量重新排列得到的的置换后的向量$z'$。对于给定的$x^{(i)}$,我们无法分辨出$W$和$PW$(也就是无法确定分离矩阵中的每一行向量对应哪一位发言者)。不难预料,音源也存在这种置换二义性,不过这种二义性对于大多数应用而言并不是重要问题。\n", 72 | "\n", 73 | "* 此外,我们也无法确定$w_i$的大小。比如当$A$变为$2A$,而每个$s^{(i)}$变为$0.5s^{(i)}$时,对于我们的观测值$x^{(i)}=2A\\cdot(0.5)s^{(i)}$没有任何影响。更广泛的,如果$A$的某列被加上了缩放因子$\\alpha$,而相应的音源又被缩放因子$\\frac{1}{\\alpha}$调整了大小,那么我们将无法从$x^{(i)}$这一单一条件中还原这次缩放调整。因此,我们无法还原音源的原有大小。不过,对于我们关心的问题(包括鸡尾酒舞会问题),这个二义性也并不重要。特别是在本例中,使用正缩放因子$\\alpha$调整发言者音源$s_j^{(i)}$的大小只会影响到发言者音量的大小。而且即使改变音源的符号也没关系,$s_j^{(i)}$和$-s_j^{(i)}$在扩音器上听起来是完全一样的。综上,如果算法得出的$w_i$被某非零缩放因子影响,那么使用$s_i=w_i^Tx$得到的相应音源也会受到这个缩放因子的影响,然而这种二义性也并不重要。(这个ICA二义性同样适用于后面介绍的脑MEG中。)\n", 74 | "\n", 75 | "我们不禁要问,上面提到的这两种情况是ICA涉及的所有可能的二义性吗?只要源$s_i$不服从高斯分布,那么答案就是肯定的。\n", 76 | "\n", 77 | "* 我们通过一个例子来看高斯分布下的数据会产生什么麻烦,考虑当$n=2$时的$s\\sim\\mathcal N(0,I)$,此处的$I$是一个二阶单位矩阵。注意到标准正态分布$\\mathcal N(0,I)$概率密度的等高线图是一组圆心在原点的正圆,其概率密度具有旋转对称性。假设我们观测到某些$x=As$,$A$是混合矩阵,因为源源服从$\\mathcal N(0,I)$,则混合后的$x$同样服从一个以$0$为期望、以$\\mathrm E\\left[xx^T\\right]=\\mathrm E\\left[Ass^TA^T\\right]=AA^T$为协方差的高斯分布。现在令$R$为任意正交矩阵(非正式的也叫作旋转矩阵或反射矩阵),则有$RR^T=R^TR=I$,并令$A'=AR$。那么如果源被$A'$混合(而不是被$A$混合),则我们会观测到$x'=A's$。而$x'$也服从高斯分布,同样以$0$围棋网、以$\\mathrm E\\left[x'\\left(x'\\right)^T\\right]=\\mathrm E\\left[A'ss^T\\left(A'\\right)^T\\right]=\\mathrm E\\left[ARss^T\\left(AR\\right)^T\\right]=ARR^TA^T=AA^T$。可以看到,不论混合矩阵是$A$还是$A'$,我们观测到的值都会服从同一个高斯分布$\\mathcal N\\left(0,AA^T\\right)$,于是,我们无法辨别观测到的随机变量是来自混合矩阵$A$还是$A'$。因此,混合矩阵中可以包含任意的旋转矩阵,而我们是无法从观测数据中看到这个旋转矩阵的痕迹的,所以我们也就无法完全还原出源了。\n", 78 | "\n", 79 | "上面的这段论述是基于“多元标准正态分布是旋转对称的”这一性质的。尽管ICA对于服从高斯分布的数据存在这样的缺陷,但只要数据不服从高斯分布,在数据充足的情况下,我们还是可以分离出$n$个独立的源的。\n", 80 | "\n", 81 | "## 2. 概率密度与线性变换\n", 82 | "\n", 83 | "在展开ICA算法的推导之前,我们先来简要介绍一下线性变换对概率密度的影响。\n", 84 | "\n", 85 | "假设有一个从$p_s(s)$中抽取的随机变量$s$,为了简约表达,令$s\\in\\mathbb R$为实数。现在按照$x=As$定义随机变量$x$($x\\in\\mathbb R,A\\in\\mathbb R$),令$p_x$为$x$的概率密度。那么,什么是$p_x$?\n", 86 | "\n", 87 | "令$W=A^{-1}$,要计算一个特定$x$的概率,也就是尝试计算$s=Wx$,之后再使用$p_s$估计再点$s$处的概率,从而得出$p_x(x)=p_s(Wx)$的结论——*然而这是一个错误的结论*。比如令$s\\sim\\mathrm{Uniform}[0,1]$服从均匀分布,则$s$的概率密度为$p_s(s)=1\\{0\\leq s\\leq1\\}$;再令$A=2$,则$x=2s$。显然$x$是一个在区间$[0,2]$上的均匀分布,则其概率密度函数为$p_x(x)=(0.5)1\\{0\\leq x\\leq2\\}$。而此时的$W=A^{-1}=0.5$,很明显,$p_s(Wx)$并不等于$p_x(x)$。此时,真正成立的是式子$p_x(x)=p_s(Wx)\\lvert W\\rvert$。\n", 88 | "\n", 89 | "一般的,若$s$是一个向量值,来自以$p_s$为概率密度的某分布,且对于可逆矩阵$A$有$x=As$,$A$的逆矩阵为$W=A^{-1}$,那么$x$的概率密度为:\n", 90 | "\n", 91 | "$$\n", 92 | "p_x(x)=p_s(Wx)\\cdot\\lvert W\\rvert\n", 93 | "$$\n", 94 | "\n", 95 | "**注意:**如果曾经见过$A$将$[0,1]^n$映射到一组体积$\\lvert A\\rvert$的集合上(可以参考[克拉默法则、逆矩阵、体积](http://nbviewer.jupyter.org/github/zlotus/notes-linear-algebra/blob/master/chapter20.ipynb)),则就有另一种记忆上面这个关于$p_x$的公式的方法,这个方法同样可以一般化前面$1$维的例子。令$A\\in\\mathbb R^{n\\times n}$,令$W=A^{-1}$,再令$C_1=[0,1]^n$为$n$维超立方体,并定义$C_2=\\{As:\\ s\\in C_1\\}\\subseteq\\mathbb R^n$(即$C_2$是原像$C_1$在映射$A$作用下得到的像)。按照上面这些条件,在线性代数中有一个现成的标准公式可以使用(同时这也是行列式的一种定义方式):$C_2$的体积为$\\lvert A\\rvert$。假设$s$服从在$[0,1]^n$上的均匀分布,则其概率密度函数为$p_s(s)=1\\{s\\in C_1\\}$。很明显$x$为在$C_2$上的均匀分布,其概率密度为$\\displaystyle p_x(x)=\\frac{1\\{x\\in C_2\\}}{\\mathrm{Vol}(C_2)}$(因为它必须做从$C_2$到$1$的积分)。再利用“逆矩阵的行列式是原矩阵行列式的倒数”这一性质,则有$\\displaystyle\\frac{1}{\\mathrm{Vol}(C_2)}=\\frac{1}{\\lvert A\\rvert}=\\left\\lvert A^{-1}\\right\\rvert=\\lvert W\\rvert$。最终我们又得到$p_x(x)=1\\{x\\in C_2\\}\\lvert W\\rvert=1\\{Wx\\in C_1\\}\\lvert W\\rvert=p_s(Wx)\\lvert W\\rvert$。\n", 96 | "\n", 97 | "## 3. ICA算法\n", 98 | "\n", 99 | "现在我们可以开始推导ICA算法了。这个算法来自Bell和Sejnowski,我们这里给出的关于ICA的理解,会将其看做是一个用来最大化似然估计的算法(这与该算法原本的演绎不同,该演绎涉及到一个称为infomax原则的复杂的概念,不过在现代关于ICA的推导中已经没有必要提及了)。\n", 100 | "\n", 101 | "我们假设每个源$s_i$来自一个由概率密度函数$p_s$定义的分布,而且$s$的联合分布为:\n", 102 | "\n", 103 | "$$\n", 104 | "p(s)=\\prod_{i=1}^np_s(s_i)\n", 105 | "$$\n", 106 | "\n", 107 | "注意到我们使用各源的边缘分布的乘积来对联合分布建模,也就是默认假设每一个源是独立的。使用上一节得到的公式能够得到关于$x=As=W^{-1}s$的概率密度:\n", 108 | "\n", 109 | "$$\n", 110 | "p(x)=\\prod_{i=1}^np_s\\left(w_i^Tx\\right)\\cdot\\lvert W\\rvert\n", 111 | "$$\n", 112 | "\n", 113 | "接下来就剩为每一个独立的源$p_s$估计概率密度了。\n", 114 | "\n", 115 | "以前在概率论中我们学过,对于给定的实随机变量$z$,其累积分布函数(CDF: Cumulative Distribution Function)$F$可以使用概率密度函数(PDF: Probability Density Function)来计算:$F(z_0)=P(z\\leq z_0)=\\int_{-\\infty}^{z_0}p_z(z)\\mathrm dz$。当然,也可以通过对CDF求导得到$z$的概率密度函数$p_z(z)=F'(z)$。\n", 116 | "\n", 117 | "因此,要求出每个$s_i$的PDF,只需要求出它们对应的CDF的即可,而CDF是一个函数值从$0$到$1$的单调增函数。根据上一节的推导,我们知道ICA对服从高斯分布的数据无效,所以不能选择高斯分布的累积分布函数作为CDF。我们现在要选择一个合理的“默认”函数,其函数值也是从$0$缓慢的单调递增至$1$——这就是前面([第三讲](chapter03.ipynb))介绍的逻辑函数(即S型函数)$\\displaystyle g(s)=\\frac{1}{1+e^{-s}}$。于是有$p_s(s)=g'(s)$。\n", 118 | "\n", 119 | "(如果我们有关于源数据集的先验知识,已经知道源的PDF的形式,那么就可以用该PDF对应的CDF来代替上面的逻辑函数。如果不知道PDF的形式,那么逻辑函数就是一个很合理的默认函数,因为在处理很多问题时,逻辑函数都有具有良好的表现。并且,在本例中我们使用的输入观测数据集$x^{(i)}$要么已经被预处理为期望为$0$的数据,要么$x^{(i)}$在自然状态下就是期望为$0$的数据集,如音频信号。而零期望是必须的,因为我们假设了$p_s(s)=g'(s)$,表明$\\mathrm E[s]=0$——这里说明一下,对逻辑函数求导会得到一个对称函数,这也就是PDF,所以这个对称的PDF对应的随机变量必须保证期望为$0$——则有$\\mathrm E[x]=\\mathrm E[As]=0$。顺便再提一点,除了逻辑函数,PDF也经常选用[拉普拉斯分布](https://zh.wikipedia.org/wiki/%E6%8B%89%E6%99%AE%E6%8B%89%E6%96%AF%E5%88%86%E5%B8%83)/[Laplace distribution](https://en.wikipedia.org/wiki/Laplace_distribution) $\\displaystyle p(s)=\\frac{1}{2}e^{-\\lvert s\\rvert}$。)\n", 120 | "\n", 121 | "方阵$W$是模型中的参数,对已给定训练集$\\left\\{x^{(i)};i=1,\\cdots,m\\right\\}$,有对数似然函数为:\n", 122 | "\n", 123 | "$$\n", 124 | "\\mathscr l(W)=\\sum_{i=1}^m\\left(\\sum_{j=1}^n\\log g'\\left(w_j^Tx^{(i)}\\right)+\\log\\lvert W\\rvert\\right)\n", 125 | "$$\n", 126 | "\n", 127 | "我们的目标是用$W$最大化上面的函数,使用性质$\\nabla_W\\lvert W\\rvert=\\lvert W\\rvert\\left(W^{-1}\\right)^T$(参见[第二讲](chapter02.ipynb))对似然函数求导,便可以得到一个以$\\alpha$为学习速率的随机梯度上升的更新规则。对于训练集$x^{(i)}$的更新规则是:\n", 128 | "\n", 129 | "$$\n", 130 | "W:=W+\\alpha\\left(\\begin{bmatrix}\n", 131 | "1-2g\\left(w_1^Tx^{(i)}\\right)\\\\\n", 132 | "1-2g\\left(w_2^Tx^{(i)}\\right)\\\\\n", 133 | "\\vdots\\\\\n", 134 | "1-2g\\left(w_n^Tx^{(i)}\\right)\n", 135 | "\\end{bmatrix}\\left(x^{(i)}\\right)^T+\\left(W^T\\right)^{-1}\\right)\n", 136 | "$$\n", 137 | "\n", 138 | "在算法迭代收敛之后,通过$s^{(i)}=Wx^{(i)}$还原源即可。\n", 139 | "\n", 140 | "**注意:**在构造似然函数时,我们默认假设了各样本$x^{(i)}$是相互独立的(要注意,这不是指样本$x^{(i)}$的各分量间是相互独立的)。于是能够得到训练集的似然函数为$\\prod_ip\\left(x^{(i)};W\\right)$。这个假设在$x^{(i)}$表示演讲音频或其他基于时间序列的数据时是错误的,因为这种样本数据之间并不是相互独立的,不过这一点也可以证明在训练样本充足的前提下,存在相关关系的各样本并不会影响ICA的表现。不过,对于相关的训练样本,当我们使用随机梯度上升时,如果随机改变训练样本载入算法的次序,有时可能会加速算法的收敛过程。(建议准备多组经过乱序的训练集,然后用不同的顺序为模型加载样本,有时有利于快速收敛。)" 141 | ] 142 | } 143 | ], 144 | "metadata": { 145 | "kernelspec": { 146 | "display_name": "Python 3", 147 | "language": "python", 148 | "name": "python3" 149 | }, 150 | "language_info": { 151 | "codemirror_mode": { 152 | "name": "ipython", 153 | "version": 3 154 | }, 155 | "file_extension": ".py", 156 | "mimetype": "text/x-python", 157 | "name": "python", 158 | "nbconvert_exporter": "python", 159 | "pygments_lexer": "ipython3", 160 | "version": "3.5.2" 161 | } 162 | }, 163 | "nbformat": 4, 164 | "nbformat_minor": 0 165 | } 166 | -------------------------------------------------------------------------------- /chapter16.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十六讲:马尔可夫决策过程\n", 8 | "\n", 9 | "# 第十三部分:强化学习及控制\n", 10 | "\n", 11 | "接下来我们将要学习的是**强化学习(RL: Reinforcement Learning)**以及**自适应控制(Adaptive Control)**。\n", 12 | "\n", 13 | "回顾前面学过的内容:\n", 14 | "\n", 15 | "* 在监督学习中,算法尝试模仿训练集中的数据,给新的输入$x$贴上一个合适的标签$y$。在这种情形下,$y$会明确的指出每个输入$x$所对应的那个“正确的”标签;\n", 16 | "* 在无监督学习中,算法尝试发掘数据中潜在的固有结构,使用模型将这种结构表示出来,之后再对数据进行标记,使其存在于某个结构中。\n", 17 | "\n", 18 | "但是在很多需要作出渐进决策及控制的问题中,我们很难提供这种明确的监督,去告诉算法什么是正确、什么是错误。比如我们建造了一个四腿机器人,然后尝试通过编程让它行走。从一开始我们就无法定义对于行走来说,什么是正确的动作。所以也就无法为算法提供一个明确的监督方案令其模仿了。\n", 19 | "\n", 20 | "在强化学习中,我们只会给算法提供一个**奖励函数(reword function)**,这个函数会告诉算法在什么情况下是做的好,在什么情况下是做的不好,比如在四腿机器人的例子中,当机器人向前行走时奖励函数会给算法正面的反馈,而当机器人无故后退或翻倒时函数则会给算法负面的反馈。而学习算法的任务就是自主发现“通过做出怎样的动作才能获得更多的奖励”。\n", 21 | "\n", 22 | "强化学习算法在直升机自动驾驶、机器人腿部移动、手机网络路由、市场策略选择、工厂控制、高效网页索引等领域都有非常成功的应用案例。而我们对强化学习算法的介绍将从**[马尔可夫决策过程](https://zh.wikipedia.org/wiki/%E9%A6%AC%E5%8F%AF%E5%A4%AB%E6%B1%BA%E7%AD%96%E9%81%8E%E7%A8%8B)([MDP: Markov Decision Process](https://en.wikipedia.org/wiki/Markov_decision_process))**开始,MDP将形式化RL算法经常遇到的问题。\n", 23 | "\n", 24 | "## 1. 马尔可夫决策过程\n", 25 | "\n", 26 | "一个马尔可夫决策过程就是一个元组$(S,A,\\{P_{sa},\\gamma,R\\})$,其中:\n", 27 | "\n", 28 | "* $S$是一个**状态(states)**的集合;(在直升机自动驾驶的例子中,就代表了直升机所有可能的位置和姿态。)\n", 29 | "* $A$是一个**动作(action)**的集合;(在直升机自动驾驶的例子中,就代表了通过操作杆可以对直升机做出的所有动作。)\n", 30 | "* $P_{sa}$是状态转换概率,对每个状态$s\\in S$和动作$a\\in A$,$P_{sa}$是一个在状态空间上的分布。在后面我们会详细讨论这一点,简单的说,就是如果在状态$s$下发生了动作$a$,“那么下一步所将变为哪一个状态”的概率分布就由$P_{sa}$确定;\n", 31 | "* $\\gamma\\in[0,1)$称为**折扣因子(discount factor)**,用来调整未来奖励与当作奖励之间的权重;\n", 32 | "* $R:S\\times A\\to\\mathbb R$就是奖励函数。(有时只把奖励函数当做关于状态$S$的函数$R:S\\to\\mathbb R$。)\n", 33 | "\n", 34 | "简要的描述一下MDP的动态过程:首先,我们从状态$s_0$开始,选择在MDP中做一个动作$a_0\\in A$。动作的结果就是产生一个随机的状态转换,转换到下一个状态$s_1$,而$s_1\\sim P_{s_0a_0}$(也就是事件“转换到下一个状态”服从由当前状态$s_0,a_0$确定的分布)。接下来我们继续在MDP中做出下一个动作$a_1$。同样,$a_1$的发生使得MDP转换到下一个状态$s_2\\sim P_{s_1a_0}$。之后我们继续做出动作$a_2$,等等……我们可以用下图描述上面的文字:\n", 35 | "\n", 36 | "$$\n", 37 | "\\require{AMScd}\n", 38 | "\\begin{CD}\n", 39 | "s_0@>{a_0}>>s_1@>{a_1}>>s_2@>{a_2}>>s_3@>{a_3}>>\\cdots\\\\\n", 40 | "\\end{CD}\n", 41 | "$$\n", 42 | "\n", 43 | "MDP在做出动作$a_0,a_1,\\cdots$后从状态$s_0,s_1$中得到的“总收益”为:\n", 44 | "\n", 45 | "$$\n", 46 | "R(s_0,a_0)+\\gamma R(s_1,a_1)+\\gamma^2R(s_2,a_2)+\\cdots\n", 47 | "$$\n", 48 | "\n", 49 | "也可以写成只与状态相关的函数:\n", 50 | "\n", 51 | "$$\n", 52 | "R(s_0)+\\gamma R(s_1)+\\gamma^2R(s_2)+\\cdots\n", 53 | "$$\n", 54 | "\n", 55 | "对于大多数情况,我们都使用较为简单的状态奖励函数$R(s)$,尽管更加一般化的状态-动作奖励函数$R(s,a)$也并没有增加什么计算难度。\n", 56 | "\n", 57 | "在强化学习中,我们的目标是按照时间顺序依次选择动作,使得整个MDP获得的“总收益”最大:\n", 58 | "\n", 59 | "$$\n", 60 | "\\mathrm E\\left[R(s_0)+\\gamma R(s_1)+\\gamma^2R(s_2)+\\cdots\\right]\n", 61 | "$$\n", 62 | "\n", 63 | "注意到第$t$步的奖励被折扣因子$\\gamma^t$降低了(而且随着步数的推移折扣会越来越大),于是,为了保证期望值足够大,我们倾向于尽可能早的获得正反馈(并让负反馈到来的越晚越好)。在经济学应用领域,$R(\\cdot)$代表赚到的钱,$\\gamma$也有自然的解释——利率(也就是今天的美元比明天的美元更值钱)。\n", 64 | "\n", 65 | "**策略(policy)**是一个函数$\\pi:S\\to A$,它是一个从状态到动作的映射。不论何时,只要处于状态$s$,就采用动作$a=\\pi(s)$,我们称这个过程为**执行(executing)**策略$\\pi$(在复杂模型中,策略不止通过当前状态,还可能通过过去的状态及动作,对下一步动作做出判断;而在本课程中,我们仅使用当前状态作为策略的输入)。为策略$\\pi$定义**价值函数(value function)**:\n", 66 | "\n", 67 | "$$\n", 68 | "V^\\pi(s)=\\mathrm E\\left[\\underbrace{R(s_0)}_\\textrm{immediate reward}+\\underbrace{\\gamma R(s_1)+\\gamma^2R(s_2)+\\cdots}_\\textrm{future reward}\\mid s_0=s,\\pi\\right]\n", 69 | "$$\n", 70 | "\n", 71 | "$V^\\pi(s)$是从状态$s$开始依照策略$\\pi$所得到的折扣奖励的预期总收益。(式中的这种标记法理论上说是不正确的,因为$\\pi$并不是随机变量,不过这种写法在文献中是标准记法。)这个式子由两部分组成:\n", 72 | "* 我们通常称前半部分为**即时奖励(immediate reward)**$R(s)$,即从状态$s$开始时直接得到的奖励;\n", 73 | "* 称后半部分为**未来奖励(future reward)**,即当前状态之后的所有步骤决策所产生的折扣奖励的总收益。\n", 74 | "\n", 75 | "容易看出,这个式子可以写成$\\displaystyle V^\\pi(s)=\\mathrm E\\left[R(s_0)+\\gamma\\underbrace{\\left(R(s_1)+\\gamma R(s_2)+\\cdots\\right)}_{V^\\pi\\left(s'\\right)}\\mid s_0=s,\\pi\\right]$(为了方便,我们暂时定义映射$s_0\\to s,\\ s_1\\to s'$),这是一个递归定义,可以按照递归式写作:\n", 76 | "\n", 77 | "$$\n", 78 | "V^\\pi(s)=R(s)+\\gamma\\sum_{s'\\in S}P_{s\\pi(s)}\\left(s'\\right)V^\\pi\\left(s'\\right)\n", 79 | "$$\n", 80 | "\n", 81 | "我们之所以不把后半部分直接写成$\\gamma V^\\pi\\left(s'\\right)$,是因为在位于前一个状态时,下一个状态是一个随机变量。所以上式的未来奖励部分写成了期望的定义式$\\displaystyle\\operatorname*{E}_{s'\\sim P_{s\\pi(s)}}\\left[V^\\pi\\left(s'\\right)\\right]$——即“位于状态$s$时,执行策略$\\pi(s)$,到达状态$s'$的概率:$P_{s\\pi(s)}\\left(s'\\right)$(可以看做是$P_{sa}\\left(s'\\right)$,而$a=\\pi(s)$)”与“状态$s'$下的价值函数:$V^\\pi\\left(s'\\right)$”之积在所有状态$s'\\in S$上求和——这是从状态$s'$开始依照策略$\\pi$所得到的折扣奖励的预期总收益。其中$s'$是一个与概率$P_{s\\pi(s)}$相关的分布,这是一个在MDP中从状态$s$开始,按照策略$\\pi(s)$执行动作后,落在下一个状态$s'$上时对应的分布。因此,第二项就是MDP在执行第一步之后,在未来能够获得的折扣奖励的预期总收益。\n", 82 | "\n", 83 | "上面这个式子也称作**贝尔曼方程(Bellman Equation)**,这是我们在解决MDP问题时用到的主要方程之一。我们可以说,对于给定的策略$\\pi$,其价值函数$V^\\pi$满足贝尔曼方程。\n", 84 | "\n", 85 | "贝尔曼方程可以高效的解出$V^\\pi$,尤其是对有限状态的MDP($\\lvert S\\rvert\\lt\\infty$),我们可以为每一个状态$s$计算一次$V^\\pi(s)$。如此就可以得到一个由“关于$V^\\pi(s)$的有$\\lvert S\\rvert$个变量(每个状态$s\\in S$都需要一个预期总收益$V^\\pi(s)$)同时具有$\\lvert S\\rvert$个方程(每个状态$s\\in S$的价值函数$V^\\pi(s)$都有一个方程)的线性方程”组成线性方程组,进而通过这些方程高效的解出每一个$V^\\pi(s)$。\n", 86 | "\n", 87 | "我们再给出**最优价值函数(optimal value function)**的定义:\n", 88 | "\n", 89 | "$$\n", 90 | "V^*(s)=\\max_\\pi V^\\pi(s)\\tag{1}\n", 91 | "$$\n", 92 | "\n", 93 | "换句话说,这是在状态$s$时,对于所有可能的策略,能够使折扣奖励的总预期收益最大化的策略$\\pi$下,得到的总收益。当然,这个最优价值函数也有一个对应的贝尔曼方程:\n", 94 | "\n", 95 | "$$\n", 96 | "V^*(s)=R(s)+\\max_{a\\in A}\\gamma\\sum_{s'\\in S}P_{s\\pi(s)}\\left(s'\\right)V^*\\left(s'\\right)\\tag{2}\n", 97 | "$$\n", 98 | "\n", 99 | "第一项没有变,仍旧是策略的立即奖励;而第二项是对于所有可能的动作,在选择执行动作$a$后,使获得的未来折扣奖励的预期总收益最大化。\n", 100 | "\n", 101 | "这也引出了最佳策略的定义$\\pi^*:S\\to A$为:\n", 102 | "\n", 103 | "$$\n", 104 | "\\pi^*(s)=\\arg\\max_{a\\in A}\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V^*\\left(s'\\right)\\tag{3}\n", 105 | "$$\n", 106 | "\n", 107 | "也就是说$\\pi^*(s)$给了我们一个使$(2)$式中使$\\max$部分取到最大值时$a$的取值(我们这里省略了$\\gamma$,因为对最大化的式子来说它只是一个常数)。(忘记$\\max f(x)$与$\\arg\\max f(x)$区别的话可以参考[What is the difference between $\\arg\\max$ and $\\max$?](http://math.stackexchange.com/questions/312012/what-is-the-difference-between-arg-max-and-max),简单地说$\\max f(x)$返回函数$f(x)$的极值,而$\\arg\\max f(x)$返回函数取到极值点时参数的取值。)\n", 108 | "\n", 109 | "那么,对于所有状态$s$以及所有策略$\\pi$,有:\n", 110 | "\n", 111 | "$$\n", 112 | "V^*(s)=V^{\\pi^*}(s)\\geq V^\\pi(s)\n", 113 | "$$\n", 114 | "\n", 115 | "前面的等式说明$V^{\\pi^*}$(即策略$\\pi^*$的价值函数)等于“对于所有状态$s$取到最优的价值函数$V^*$”。后面的不等式说明$\\pi^*$的值比任何策略的值都要大。也就是说$(3)$式定义的$\\pi^*$是最优策略。\n", 116 | "\n", 117 | "注意到$\\pi^*$的一个有趣的属性——它是对于所有状态$s$的最优策略。这并不是说,如果从状态$s$开始,就有一个针对$s$的最优策略;如果从状态$s'$开始,就会采取别的针对$s'$的最优策略。而是说令$(1)$式取到最大值的的$\\pi^*$是对所有状态$s$而言的,这意味着不论MDP从什么状态开始,我们都可以用策略$\\pi^*$。\n", 118 | "\n", 119 | "## 2. 值迭代与策略迭代\n", 120 | "\n", 121 | "接下来我们将介绍两种针对有限状态的MDP的高效算法。我们假设MDP具有有限的状态以及有限的动作空间($\\lvert S\\rvert\\leq\\infty,\\lvert A\\rvert\\leq\\infty$)。\n", 122 | "\n", 123 | "要介绍的第一个算法是**值迭代(value iteration)**:\n", 124 | "1. 对于每个状态$s$,以$V(s):=0$初始化;(相当于在内存中创建了大小为$\\lvert S\\rvert$的状态向量,用$\\vec0$初始化。)\n", 125 | "2. 重复直到收敛:`{`\n", 126 | "\n", 127 | " * 对于每个状态,更新$\\displaystyle V(s):=R(s)+\\max_{a\\in A}\\gamma\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$。(注意,本小节介绍的算法都是在状态转换概率$P_{sa}$及奖励函数$R$已知时使用的。)\n", 128 | " \n", 129 | " `}`\n", 130 | "\n", 131 | "这个算法可以看做是不停的尝试使用贝尔曼方程更新价值函数。对于内部的循环,有两种更新方法:\n", 132 | "1. 可以先计算每个$s$的$V(s)$,然后用这些新算出来的值代替所有的旧值(用新计算的状态向量更新第1步中的状态向量),这也称作**同步(synchronous)**更新。这种方法可以看做是一种“Bellman backup operator”的实现,用对当前价值函数的估值映射到新的估值上;\n", 133 | "2. 可以遍历状态$s$(按某种固定顺序),每次更新一个值(每次$V(s)$的计算都从状态向量中取最新的分量,得出结果后直接更新状态向量中想要的分量),这也称作**异步(asynchronous)**更新。\n", 134 | "\n", 135 | "不论是使用同步还是异步的更新(通常异步会快一点),对值的迭代可以使得$V$最终收敛于$V^*$。得到$V^*$后就可以使用$(3)$式计算最优策略了。\n", 136 | "\n", 137 | "在MDP中还有一种用于计算最优策略的标准算法,称为**策略迭代(policy iteration)**:\n", 138 | "1. 随机初始化策略$\\pi$;\n", 139 | "2. 重复直到收敛:`{`\n", 140 | " * (a) 令$V:=V^\\pi$;(通过贝尔曼方程组求解。)\n", 141 | " * (b) 对每一个状态$s$,令$\\displaystyle\\pi(s):=\\arg\\max_{a\\in A}\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$。\n", 142 | " \n", 143 | " `}`\n", 144 | "\n", 145 | "内部的循环会不停的计算当前策略下的价值函数,然后使用当前的价值函数更新策略。((b)步骤中求$\\pi$也称为**关于$V$的贪心策略(greedy with respect to $V$)**)。而步骤(a)可以通过求解贝尔曼方程组得到——也就是在策略$\\pi$给定时,有$\\lvert S\\rvert$个变量$V^\\pi(s)$,以及$\\lvert S\\rvert$个方程的线性方程组。\n", 146 | "\n", 147 | "在有限的迭代之后,$V$会收敛于$V^*$且$\\pi$会收敛于$\\pi^*$。\n", 148 | "\n", 149 | "值迭代与策略迭代都是求解MDP的标准算法,目前大家并没有对于哪个算法更好达成共识。对于小型MDP,策略迭代通常更快并会在很少的几步迭代之后收敛。然而在求解具有很多状态的大型MDP时,对$V^\\pi$的求解将涉及到解大型线性方程组,这通常会很困难。在这种情况下,值迭代可能会是更好的选择。也正是因为这个原因,我们通常在现实中更喜欢使用值迭代。\n", 150 | "\n", 151 | "## 3. MDP的模型估计\n", 152 | "\n", 153 | "到目前为止,我们讨论的MDP以及MDP算法都是建立在状态转换概率以及奖励函数已知的前提下。但是,在现实问题中,状态转换概率和奖励函数可能不是明确的已知条件,那么我们必须从数据中估计这些量。(通常$S,A,\\gamma$都是已知的。)\n", 154 | "\n", 155 | "比如在倒置钟摆问题中(见[问题集4](http://cs229.stanford.edu/materials/ps4.pdf)),我对MDP进行了一系列的试验,过程如下:\n", 156 | "\n", 157 | "$$\n", 158 | "\\require{AMScd}\n", 159 | "\\begin{CD}\n", 160 | "s_0^{(1)} @>{a_0^{(1)}}>> s_1^{(1)} @>{a_1^{(1)}}>> s_2^{(1)} @>{a_2^{(1)}}>> s_3^{(1)} @>{a_3^{(1)}}>> \\cdots\n", 161 | "\\end{CD}\\\\\n", 162 | "\\begin{CD}\n", 163 | "s_0^{(2)} @>{a_0^{(2)}}>> s_1^{(2)} @>{a_1^{(2)}}>> s_2^{(2)} @>{a_2^{(2)}}>> s_3^{(2)} @>{a_3^{(2)}}>> \\cdots\n", 164 | "\\end{CD}\n", 165 | "$$\n", 166 | "\n", 167 | "这里$s_i^{(j)}$表示在第$j$此试验中第$i$步的状态,而$a_i^{(j)}$表示在第$j$此试验中第$i$步的状态下执行的动作。在实际操作中,除非MDP过程终止(比如在倒置钟摆问题中,在钟摆倒下时MDP终止),否则每一个试验将一直运行下去;或者可能运行很多但是有限步后停下。有了这些MDP试验的“经验”,我们就可以推导出状态转换概率的最大似然估计:\n", 168 | "\n", 169 | "$$\n", 170 | "P_{sa}\\left(s'\\right)=\\frac{\\textrm{在状态}s\\textrm{下执行动作}a\\textrm{得到状态}s'\\textrm{的次数}}{\\textrm{状态}s\\textrm{下执行动作}a\\textrm{的次数}}\\tag{4}\n", 171 | "$$\n", 172 | "\n", 173 | "如果在应用上式时得到的比值为$\\displaystyle\\frac{0}{0}$时(比如在状态$s$下从未执行过动作$a$时),我们可以简单的将$P_{sa}\\left(s'\\right)$估计为$\\displaystyle\\frac{1}{\\lvert S\\rvert}$。(即将$P_{sa}$估计为在所有状态上的均匀分布。)\n", 174 | "\n", 175 | "注意到如果能够在MDP中得到更多的“经验”(即进行更多次试验),我们就可以使用一种更高效的方法,拿新“经验”的数据对状态转换概率的估计进行更新:我们可以记录$(4)$式中分子和分布的计数值,当我们拿到新的试验数据时,不停的累加分子和分母的计数值就可以了。最后只需计算一次比值,就能够得到$P_{sa}$。\n", 176 | "\n", 177 | "使用类似的过程也可以处理奖励函数$R$未知的情况,我们可以使用所有状态$s$下的平均奖励来估计状态$s$预期即时奖励$R(s)$。\n", 178 | "\n", 179 | "在得到MDP的模型之后,我们可以带入估计出的状态转换概率和奖励函数,使用值迭代或策略迭代解出MDP的最佳策略。举个例子,联合使用模型估计和值迭代,在状态转换概率未知的情况下学习MDP,可以使用下面的算法:\n", 180 | "1. 随机初始化策略$\\pi$;\n", 181 | "2. 重复 `{`\n", 182 | "\n", 183 | " * (a) 在MDP中按照策略$\\pi$执行一些试验;\n", 184 | " * (b) 使用在MDP的试验中积累的“经验”,更新对$P_{sa}$的估计(如果可以的话也更新$R$);\n", 185 | " * (c) 使用估计的状态转换概率和奖励函数,应用值迭代,估计新的价值函数$V$;\n", 186 | " * (d) 使用关于$V$的贪心策略更新$\\pi$;\n", 187 | "\n", 188 | " `}`\n", 189 | "\n", 190 | "注意到对于上面这个特定算法,有一个能够大幅优化性能的方法:在内部循环使用值迭代的步骤里,我们不像值迭代定义的那样用$V=0$做初始化,而使用算法上一步迭代得到的解做初始化,这样就给值迭代过程了一个更好的起点,能够使值迭代过程收敛更加迅速。" 191 | ] 192 | } 193 | ], 194 | "metadata": { 195 | "kernelspec": { 196 | "display_name": "Python 3", 197 | "language": "python", 198 | "name": "python3" 199 | }, 200 | "language_info": { 201 | "codemirror_mode": { 202 | "name": "ipython", 203 | "version": 3 204 | }, 205 | "file_extension": ".py", 206 | "mimetype": "text/x-python", 207 | "name": "python", 208 | "nbconvert_exporter": "python", 209 | "pygments_lexer": "ipython3", 210 | "version": "3.5.2" 211 | } 212 | }, 213 | "nbformat": 4, 214 | "nbformat_minor": 0 215 | } 216 | -------------------------------------------------------------------------------- /chapter17.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十七讲:解连续状态的MDP\n", 8 | "\n", 9 | "在上一讲,我们给出了强化学习和马尔可夫决策过程的定义。\n", 10 | "\n", 11 | "MDP是一个五元组$\\left(S,A,\\{P_{sa}\\},\\gamma,R\\right)$,上一讲我们一直使用的一个低阶MDP的例子——机器人躲避障碍物到达目的地($+1$):\n", 12 | "\n", 13 | "$$\n", 14 | "\\begin{array}\n", 15 | "{|c|c|c|c|}\n", 16 | "\\hline\n", 17 | "?&?&?&+1\\\\\n", 18 | "\\hline\n", 19 | "?&\\textrm{墙}&?&-1\\\\\n", 20 | "\\hline\n", 21 | "?&?&?&?\\\\\n", 22 | "\\hline\n", 23 | "\\end{array}\n", 24 | "$$\n", 25 | "\n", 26 | "* 在这个例子中,共有$11$个状态——$\\lvert S\\rvert=11$;\n", 27 | "* 机器人能够做出的动作为$A=\\{\\textrm{N, S, E, W}\\}$,即向北、南、东、西移动;\n", 28 | "* 状态转换概率$P_{sa}$为处于状态$s$时,做出动作$a$后状态变为$s'$的概率,比如从状态$(3,1)$开始,做出动作“向北移动”,则机器人模型可能会因为机械传动噪音有$0.1$的概率“向东移动”、有$0.1$的概率的概率“向西移动”、有$0.8$的概率“向北移动”,则真正落在状态$(3.2)$的概率为$0.8$如图:\n", 29 | "\n", 30 | "$$\n", 31 | "\\begin{array}\n", 32 | "{|c|c|c|c|}\n", 33 | "\\hline\n", 34 | "?&?&?&+1\\\\\n", 35 | "\\hline\n", 36 | "?&\\textrm{墙}&0.8\\uparrow&-1\\\\\n", 37 | "\\hline\n", 38 | "?&0.1\\leftarrow&s&0.1\\rightarrow\\\\\n", 39 | "\\hline\n", 40 | "\\end{array}\n", 41 | "$$\n", 42 | "\n", 43 | "* 奖励函数$R=\\begin{cases}\\pm1&\\textrm{absorbing state}\\\\-0.02&\\textrm{else where}\\end{cases}$,即在$(4,2)$时奖励为$-1$,代表任务失败并结束;而在$(4,3)$状态代表奖励$+1$,代表任务成功并结束;其他状态奖励$-0.02$(**吸收状态(absorbing state)**表示进入该状态即时奖励$+1$,并且其他状态奖励均归零,也就是任务结束)。\n", 44 | "\n", 45 | "* 折扣因子$\\gamma=0.99$,这个值代表当前奖励与未来奖励间的权重(当前为$\\gamma^0$,下一步为$\\gamma^1$,再下一步为$\\gamma^2$等等,这一项鼓励模型尽早获得奖励)。\n", 46 | "\n", 47 | "而策略$\\pi:S\\to A$,对本例来说就是一个机器人控制策略,它是一个从状态到动作的映射,也就是告诉机器人在每一种状态下该执行什么动作。我们的目标就是找到一个能够最大化我们预期总收益的策略(即尽可能多的获得奖励)。\n", 48 | "\n", 49 | "我们定义了策略$\\pi$的价值函数$V^\\pi(s)=\\mathrm E\\left[R(s_0)+\\gamma R(s_1)+\\gamma^2R(s_2)+\\cdots\\right]$,解释为“在状态$s$下启动机器人并使其在策略$\\pi$下运行,所得到的折扣奖励之和的期望”。对于目标而言,其中一种方法是找到最大的价值函数:\n", 50 | "\n", 51 | "1. 我们先要计算$\\displaystyle V^*(s)=\\max_\\pi V^\\pi(s)$——这是执行任意策略能够得到的最大收益,比如这个最优价值函数看上去如下图所示:\n", 52 | " $$\n", 53 | " \\begin{array}\n", 54 | " {|c|c|c|c|}\n", 55 | " \\hline\n", 56 | " .86&.90&.95&+1\\\\\n", 57 | " \\hline\n", 58 | " .82&\\textrm{墙}&.69&-1\\\\\n", 59 | " \\hline\n", 60 | " .78&.75&.71&.49\\\\\n", 61 | " \\hline\n", 62 | " \\end{array}\n", 63 | " $$\n", 64 | " 这就是$V^*$,它表示从任意状态开始,能够得到的折扣奖励之和的预期值。\n", 65 | "\n", 66 | "2. 一旦得到了$V^*$,我们就可以使用$\\displaystyle\\pi^*(s)=\\arg\\max_{a\\in A}\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V^*\\left(s'\\right)$计算出最佳策略$\\pi^*$。\n", 67 | " $$\n", 68 | " \\begin{array}\n", 69 | " {|c|c|c|c|}\n", 70 | " \\hline\n", 71 | " \\rightarrow&\\rightarrow&\\rightarrow&+1\\\\\n", 72 | " \\hline\n", 73 | " \\uparrow&\\textrm{墙}&\\uparrow&-1\\\\\n", 74 | " \\hline\n", 75 | " \\uparrow&\\leftarrow&\\leftarrow&\\leftarrow\\\\\n", 76 | " \\hline\n", 77 | " \\end{array}\n", 78 | " $$\n", 79 | "3. 算法的实现就是利用贝尔曼方程$\\displaystyle V^*(s)=R(s)+\\max_{a\\in A}\\gamma\\sum_{s'\\in S}P_{s\\pi(s)}\\left(s'\\right)V^*\\left(s'\\right)$,在状态$s$时的最优折扣奖励之和为“在$s$开始时的即时奖励”加上“所有动作中能够最大化未来折扣奖励总和动作序列对应的未来奖励”。于是我们可以应用一个值迭代算法,也就是利用贝尔曼方程不停的迭代$\\displaystyle V(s):=R(s)+\\max_{a\\in A}\\gamma\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$。这样$V(s)$就会收敛于$V^*(s)$,而有了$V^*(s)$就可以得到$\\pi^*(s)$。\n", 80 | "\n", 81 | "最后,我们还介绍了策略迭代算法:根据随机初始化的策略$\\pi$计算$V^\\pi$并更新$V$(即为特定的策略计算出价值函数,使用贝尔曼方程组计算每个状态的折扣奖励总和),然后假设我们已经找到的策略是最佳策略,根据$\\displaystyle\\pi(s):=\\arg\\max_{a\\in A}\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$带入假设的最优价值函数$V$找到新的策略再更新$\\pi$。重复这两步最终会使得$V$收敛于$V^*$,$\\pi$收敛于$\\pi^*$。如图:\n", 82 | "\n", 83 | "1. 随机初始化一个策略:\n", 84 | " $$\n", 85 | " \\begin{array}\n", 86 | " {|c|c|c|c|}\n", 87 | " \\hline\n", 88 | " \\downarrow&\\rightarrow&\\rightarrow&+1\\\\\n", 89 | " \\hline\n", 90 | " \\rightarrow&\\textrm{墙}&\\rightarrow&-1\\\\\n", 91 | " \\hline\n", 92 | " \\uparrow&\\rightarrow&\\uparrow&\\leftarrow\\\\\n", 93 | " \\hline\n", 94 | " \\end{array}\n", 95 | " $$\n", 96 | "2. 解贝尔曼方程组$\\displaystyle V^\\pi(s)=R(s)+\\gamma\\sum_{s'\\in S}P_{s\\pi(s)}\\left(s'\\right)V^\\pi\\left(s'\\right)$,在本例中有$11$种状态,所以就有由$11$个价值函数组成的线性方程组,解这个方程组就可以得到个状态对应的价值函数的值,再填在图中即可得到一个新的策略。\n", 97 | "\n", 98 | "以上就是上一讲的主要内容,下面我们会接着这两种算法(值迭代与策略迭代)继续MDP的介绍。\n", 99 | "\n", 100 | "## 4. 具有连续状态的MDP\n", 101 | "\n", 102 | "到目前为止,我们介绍的都是具有有限个状态的MDP。接下来,我们要讨论具有无限个状态的MDP。举个例子,对于一辆车,我们会用状态$(x,y,\\theta,\\dot x,\\dot y,\\dot\\theta)$来表示,其中$(x,y)$表示车子的位置;$\\theta$表示车子的方向;车子在$x,y$方向上的速度分量$\\dot x,\\dot y$;以及角速度$\\dot\\theta$。因此,$S=\\mathbb R^6$是一个无限状态集,因为对于一辆车来说,有无限个可能的位置和方向。(理论上讲,车子的方向$\\theta$应该在$\\theta\\in[-\\pi,\\pi)$取值,而不是$\\theta\\in\\mathbb R$,但在我们的例子中,这一点并不重要。)类似的,在[问题集4](http://cs229.stanford.edu/materials/ps4.pdf)中的倒置钟摆问题,钟摆的状态为$(x,\\theta,\\dot x,\\dot\\theta)$,而$\\theta$就是钟摆的角度。再比如我们的遥控直升机,在三维空间中飞行,它的状态为$(x,y,z,\\phi,\\theta,\\psi,\\dot x,\\dot y,\\dot z,\\dot\\phi,\\dot\\theta,\\dot\\psi)$,其中$\\phi$为横滚角、$\\theta$为俯仰角、$\\psi$为航向角。\n", 103 | "\n", 104 | "在本节我们将考虑状态空间为$S=\\mathbb R^n$的情形,并介绍如何解出这种MDP。\n", 105 | "### 4.1 离散化(Discretization)\n", 106 | "\n", 107 | "描述一个连续状态MDP的最简单的方法就是将它的状态空间离散化,然后在对其应用前面介绍的值迭代或策略迭代进行求解。\n", 108 | "\n", 109 | "比如我们有一个二维状态$(s_1,s_2)$,我们就可以使用网格将其状态空间离散化:\n", 110 | "\n", 111 | "\"\"\n", 112 | "\n", 113 | "图中的每一格都代表一个独立的状态$\\bar s$。于是,我们就可以使用一个离散状态的MDP$\\left(\\bar S,A,\\left\\{P_{\\bar sa}\\right\\},\\gamma,R\\right)$去近似原来的连续状态MDP,而$\\left\\{P_{\\bar sa}\\right\\}$是关于离散状态的状态转换概率。然后就可以应用前面介绍过的值迭代或策略迭代解出MDP$\\left(\\bar S,A,\\left\\{P_{\\bar sa}\\right\\},\\gamma,R\\right)$的$V^*\\left(\\bar s\\right)$和$\\pi^*\\left(\\bar s\\right)$。当我们的实际系统处于状态$s\\in S$时,我们需要选择一个动作并执行,此时我们就应该计算连续状态$s$相对应的离散状态$\\bar s$,然后执行动作$\\pi^*(\\bar s)$。\n", 114 | "\n", 115 | "这种基于离散化的实现方法可以应用与很多MDP问题的解决,但是它有两个缺点:\n", 116 | "\n", 117 | "* 首先是该方法对于$V^*$(以及$\\pi^*$)的表达过于纯粹,方法假设价值函数在每一个离散化的区间上取常数值(即价值函数对于每个网格来说是一个分段常数)。\n", 118 | "\n", 119 | " 为了更加形象化的理解这种表达的局限,考虑监督学习问题中使用函数拟合数据集的过程:\n", 120 | "\n", 121 | " \"\"\n", 122 | "\n", 123 | " 很容易看出,做线性回归就可以很好的拟合数据。然而如果我们将$x$坐标离散化,然后使用分段常数来表示离散区间,则对数据的拟合将变成下图中的样子:\n", 124 | "\n", 125 | " \"\"\n", 126 | "\n", 127 | " 相比于平滑的函数,这种分段常数表示法有一些缺陷。对于输入来说它得到的输出不够平滑,而且无法将不同的离散区间归纳在同一个表达式中。对于这种数据表示法,我们需要一个很细的离散化(网格非常细)才能做出较好的近似。\n", 128 | "\n", 129 | "* 另一个缺陷则是**维数灾难(curse of dimensionality)**。设$S=\\mathbb R^n$,我们将$n$维中的每一个维度离散化成$k$个值,那么离散的状态的总数就有$k^n$个之多。对于状态空间的维数$n$来说,这个离散状态总数呈指数增加,所以并不适用于大型问题的解决。对于一个$10$维状态空间,如果我们将每个维度离散化为$100$个值,那么就会得到$100^{10}=10^{20}$个离散状态,这对目前的计算机来说太大了。\n", 130 | "\n", 131 | " 按照实践经验,离散化在解决$1$维或$2$为问题时效果非常好(且实现起来方便快捷)。也许,凭借一些智慧并在离散化方法选择上小心谨慎,那么这种方法也能够处理$4$维问题。如果我们特别智慧又非常幸运的话,可能能够让这种方法撑到解决$6$维问题。但是如果问题复杂度再增加,这种方法就无能为力了。\n", 132 | "\n", 133 | "### 4.2 价值函数近似\n", 134 | "\n", 135 | "我们再来介绍另一种能够求解具有连续状态的MDP的方法,这次我们直接对$V^*$做近似,也就省去了离散化的步骤。这种实现称为**价值函数近似(value function approximation)**,已经应用在很多强化学习问题中了。\n", 136 | "\n", 137 | "#### 4.2.1 使用模型或模拟器\n", 138 | "\n", 139 | "为了实现价值函数近似,我们需要为MDP假设一个**模型(model)**或**模拟器(simulator)**。非正式的定义,模拟器是一个黑盒,能够接受任意的(连续值)状态$s_t$和动作$a_t$作为输入,并按照状态转换概率$P_{s_ta_t}$输出下一个状态$s_{t+1}$:\n", 140 | "\n", 141 | "\"\"\n", 142 | "\n", 143 | "我们有几种得到模型的方法,其中一种就是物理模拟。比如[问题集4](cs229.stanford.edu/materials/ps4.pdf)中倒置钟摆的例子,我们假设系统的所有参数已知,比如杆的长度、杆的质量等等,根据这些输入参数,使用各种物理定律计算位于$t$时刻的当前状态在执行动作$a$之后,系统在$t+1$时刻系统的状态(包括小车的、杆的角度等)。我们也可以使用现成的物理模拟软件,我们只需要在软件中对这个机械系统进行物理建模,并给出当前状态$s_t$和要执行的动作$a_t$,就可以计模拟出未来一小段时间内,处于$t+1$时刻系统的状态。(比如[Open Dynamics Engine](http://www.ode.com)就是一款免费的开源物理模拟器,它完全可以用来模拟“倒置钟摆”问题,并已经在强化学习研究者中建立了良好的口碑。)\n", 144 | "\n", 145 | "另一种方法是从MDP收集到的数据中“学到”一个模型。举个例子,假设我们通过不停的执行动作,在MDP中做了$m$次**试验(trials)**,每一次试验都进行了$T$步。这样的试验可以通过随机选择动作、依照特定的策略或使用其他选择动作的方式。于是我们可以得到$m$个如下的状态序列:\n", 146 | "\n", 147 | "$$\n", 148 | "\\require{AMScd}\n", 149 | "\\begin{CD}\n", 150 | "s_0^{(1)} @>{a_0^{(1)}}>> s_1^{(1)} @>{a_1^{(1)}}>> s_2^{(1)} @>{a_2^{(1)}}>> \\cdots @>{a_{T-1}^{(1)}}>> s_T^{(1)}\n", 151 | "\\end{CD}\\\\\n", 152 | "\\begin{CD}\n", 153 | "s_0^{(2)} @>{a_0^{(2)}}>> s_1^{(2)} @>{a_1^{(2)}}>> s_2^{(2)} @>{a_2^{(2)}}>> \\cdots @>{a_{T-1}^{(2)}}>> s_T^{(2)}\n", 154 | "\\end{CD}\\\\\n", 155 | "\\vdots\\\\\n", 156 | "\\begin{CD}\n", 157 | "s_0^{(m)} @>{a_0^{(m)}}>> s_1^{(m)} @>{a_1^{(m)}}>> s_2^{(m)} @>{a_2^{(m)}}>> \\cdots @>{a_{T-1}^{(m)}}>> s_T^{(m)}\n", 158 | "\\end{CD}\\\\\n", 159 | "$$\n", 160 | "\n", 161 | "接下来,我们就可以应用一种学习算法,类似一个函数,输入是$s_t$和$a_t$,而输出是预测的状态$s_{t+1}$。\n", 162 | "\n", 163 | "比如我们可能会建立一个线性模型:\n", 164 | "\n", 165 | "$$\n", 166 | "s_{t+1}=As_t+Ba_t\\tag{5}\n", 167 | "$$\n", 168 | "\n", 169 | "使用类似于线性回归的算法。此处模型的参数是矩阵$A$和$B$,我们可以使用收集到的$m$次测试数据来估计这两个矩阵:\n", 170 | "\n", 171 | "$$\n", 172 | "\\arg\\min_{A,B}\\sum_{i=1}^m\\sum_{t=0}^{T-1}\\left\\lVert s_{t+1}^{(i)}-\\left(As_t^{(i)}+Ba_t^{(i)}\\right)\\right\\rVert^2\n", 173 | "$$\n", 174 | "\n", 175 | "(也就是求参数的最大似然估计的步骤。)\n", 176 | "\n", 177 | "在算法找出$A,B$之后,其中一种选择是建立一个**确定性(deterministic)**模型,它接受$s_t,a_t$作为输入,并输出一个确定的$s_{t+1}$。比如我们总是使用$(5)$式计算$s_{t+1}$。另一种选择是建立一个**随机性(stochastic)**模型,在这种模型中,$s_{t+1}$是一个关于输入$s_t,a_t$的随机函数:$\\displaystyle s_{t+1}=As_t+Ba_t+\\epsilon_t$,而$\\epsilon_t$是一个噪音项,我们通常令其服从$\\epsilon_t\\sim\\mathcal N(0,\\varSigma)$。(协方差矩阵$\\varSigma$也可以通过测试数据直接估计出来。)\n", 178 | "\n", 179 | "这里举出的例子是将$s_{t+1}$看做是关于当前状态和动作的线性函数,我们当然也可以使用非线性函数对其建模。比如说用函数$s_{t+1}=A\\phi_s(s_t)+B\\phi_a(a_t)$建模,其中$\\phi_s,\\phi_a$是关于状态和动作的某些非线性特征映射。或者,我们也可以使用一些非线性学习算法——比如局部加权回归(参见[第三讲](chapter02.ipynb))——将$s_{t+1}$拟合为关于$s_t,a_t$的函数。这些实现的方法既可以用来构建确定性模拟器,也可以用来构建随机性模拟器。\n", 180 | "\n", 181 | "#### 4.2.2 拟合值迭代(Fitted value iteration)\n", 182 | "\n", 183 | "现在来介绍**拟合值迭代(fitted value iteration)**算法,用于在具有连续状态的MDP上近似值函数。在后面的讨论中我们假设MDP具有连续的状态空间$S=\\mathbb R^n$,但是动作空间$A$规模较小并且是离散的(因为在实践中,通常状态空间的维度要比动作空间大很多,所以动作空间通常比较容易离散化)。\n", 184 | "\n", 185 | "回忆在值迭代中的更新规则:\n", 186 | "\n", 187 | "$$\n", 188 | "\\begin{align}\n", 189 | "V(s)&:=R(s)+\\gamma R\\int_{s'}P_{sa}\\left(s'\\right)V\\left(s'\\right)\\mathrm ds'\\tag{6}\\\\\n", 190 | "&=R(s)+\\gamma\\max_a\\mathrm E_{s'\\sim P_{sa}}\\left[V\\left(s'\\right)\\right]\\tag{7}\n", 191 | "\\end{align}\n", 192 | "$$\n", 193 | "\n", 194 | "(在[上一讲](chapter16.ipynb)第二节中,我们得到的值迭代更新规则$\\displaystyle V(s):=R(s)+\\max_{a\\in A}\\gamma\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$中对状态使用了求和运算,而在这里我们对状态使用的是积分运算,这说明我们现在是在连续状态下(而不是在离散状态下)求解MDP。)\n", 195 | "\n", 196 | "拟合值迭代的核心思想就是在$s^{(1)},\\cdots,s^{(m)}$的有限抽样上进行近似的迭代步骤。我们将使用监督学习算法(在下面的讨论中将使用线性回归),将值函数看做一个关于状态的线性或非线性函数,然后再来近似这个函数:\n", 197 | "\n", 198 | "$$\n", 199 | "V(s)=\\theta^T\\phi(s)\n", 200 | "$$\n", 201 | "\n", 202 | "这里的$\\phi$是某个关于状态的映射。\n", 203 | "\n", 204 | "在$m$个状态的有限样本中,对于每一个状态$s$,算法将先计算一个记为$y^{(i)}$的量(我们在后面会把这个量当做$R(s)+\\gamma\\max_a\\mathrm E_{s'\\sim P_{sa}}\\left[V\\left(s'\\right)\\right]$的近似值,即$(7)$式);然后会应用一个监督学习算法,尝试使$V(s)$靠近$R(s)+\\gamma\\max_a\\mathrm E_{s'\\sim P_{sa}}\\left[V\\left(s'\\right)\\right]$(换句话说,尝试使$V\\left(s^{(i)}\\right)$尽量靠近$y^{(i)}$)。算法的步骤如下:\n", 205 | "\n", 206 | "重复:`{`\n", 207 | "1. 随机抽样$m$个状态$s^{(1)},s^{(2)},\\cdots,s^{(m)}\\in S$;\n", 208 | "2. 初始化$\\theta:=0$;\n", 209 | "3. 对每个状态 $i=1,\\cdots,m$ `{`\n", 210 | " * 对每个动作$a\\in A$ `{`\n", 211 | " * 抽样$s_1',\\cdots,s_k'\\sim P_{s^{(i)}a}$(使用MDP模型根据$s,a$预测$s'$);\n", 212 | " * 令$\\displaystyle q(a)=\\frac{1}{k}\\sum_{j=1}^kR\\left(s^{(i)}\\right)+\\gamma V\\left(s_j'\\right)$ // 因此,$q(a)$就是一个对$\\displaystyle R(s^{(i)})+\\gamma\\mathrm E_{s'\\sim P_{s^{(i)}a}}\\left[V\\left(s'\\right)\\right]$的估计;\n", 213 | "\n", 214 | " `}`\n", 215 | " \n", 216 | " * 令$\\displaystyle y^{(i)}=\\max_aq(a)$ // 因此,$y^{(i)}$就是一个对$\\displaystyle R(s^{(i)})+\\gamma\\max_a\\mathrm E_{s'\\sim P_{s^{(i)}a}}\\left[V\\left(s'\\right)\\right]$的估计;\n", 217 | " \n", 218 | " `}`\n", 219 | " \n", 220 | " // 在原来的(用于解离散状态的)值迭代算法中,我们按照$V\\left(s^{(i)}\\right):=y^{(i)}$更新值函数;\n", 221 | " \n", 222 | " // 而在这个算法中,我们将使用监督学习算法(线性回归)来实现$V\\left(s^{(i)}\\right)\\approx y^{(i)}$,即使$V\\left(s^{(i)}\\right)$尽量靠近$y^{(i)}$;\n", 223 | " * 令$\\displaystyle\\theta:=\\arg\\min_\\theta\\frac{1}{2}\\sum_{i=1}^m\\left(\\theta^T\\phi\\left(s^{(i)}\\right)-y^{(i)}\\right)^2$\n", 224 | "\n", 225 | "`}`\n", 226 | "\n", 227 | "以上就是使用线性回归使$V\\left(s^{(i)}\\right)$靠近$y^{(i)}$的拟合值迭代。类比标准监督学习(回归)算法,在回归算法中我们已知训练集$\\left(x^{(1)},y^{(1)}\\right),\\left(x^{(2)},y^{(2)}\\right),\\cdots,\\left(x^{(m)},y^{(m)}\\right)$,想要学习到一个从$x$到$y$的函数映射,这个算法与回归唯一不同的是$s$代替了$y$的位置。虽然上面的例子中使用的是线性回归,不过显然也可以使用其他回归算法(如局部加权回归等)。\n", 228 | "\n", 229 | "与离散状态上的值迭代不同的是,不能被证明收敛。不过不用担心,在实践中该算法通常收敛(或近达到似收敛的程度),而且对很多问题都非常有效。注意到如果我们使用MDP的确定性模拟器/模型,则就可用$k=1$简化算法。这是因为$(7)$式中的期望变成了关于一个确定性分布的期望(在确定性模型中,我们在给定输入下做的每次抽样将得到同样的输出),于是使用一个样本就可以计算相应的期望值了。如果不是确定性模型,那么我们必须抽取$k$个样本,然后再用均值去近似相应的期望(见算法伪代码中关于$q(a)$的定义)。\n", 230 | "\n", 231 | "最后,拟合值迭代的输出$V$是一个关于$V^*$的近似,这同时暗示了策略的定义。当系统处于状态$s$时,需要选择一个动作,于是我们使用:\n", 232 | "\n", 233 | "$$\n", 234 | "\\arg\\max_a\\mathrm E_{s'\\sim P_{sa}}\\left[V^*\\left(s'\\right)\\right]\\tag{8}\n", 235 | "$$\n", 236 | "\n", 237 | "(由于状态是连续的,我们就无法计算每一个状态的最优价值函数了。所以我们每次在需要做下一个动作时进行计算:在系统处于特定状态时,执行某动作会进入下一个状态$s'$,式子会找到能够使$\\displaystyle\\mathrm E_{s'\\sim P_{sa}}\\left[V^*\\left(s'\\right)\\right]$取到最大的动作。)\n", 238 | "\n", 239 | "这一步计算/近似类似于拟合值迭代里层的循环中用抽样$s_1',\\cdots,s_k'\\sim P_{sa}$近似期望的步骤(同样的,如果模拟器是确定性的,则取$k=1$即可)。\n", 240 | "\n", 241 | "在实践中,我们也经常使用其他方法来近似这个步骤。举个例子:\n", 242 | "* 如果我们正在使用一个确定性模型,则有$s_{t+1}=f(s_t,a_t)$(即有了关于当前状态和动作的函数)。于是上面的式子就可以直接简化为$\\displaystyle\\arg\\max_aV^*\\left(f(s,a)\\right)$(因为$s'=f(s,a)$);\n", 243 | "* 另一种常见的情形是在随机性模型中,当模拟器采用$s_{t+1}=f(s_t,a_t)+\\epsilon_t$,其中$f$是关于状态的确定性函数(比如$f(s_t,a_t)=As_t+Ba_t$),$\\epsilon$是一个服从零期望高斯分布的噪音项。在这种情况下,我们可以通过\n", 244 | "\n", 245 | "$$\n", 246 | "\\arg\\max_aV^*\\left(f(s,a)\\right)\n", 247 | "$$\n", 248 | "\n", 249 | "选择动作。也就是说令$\\epsilon=1$(即忽略模拟器的噪音)并令$k=1$。等价的,这也可以从$(8)$式中利用近似推导出来:\n", 250 | "\n", 251 | "$$\n", 252 | "\\begin{align}\n", 253 | "\\mathrm E_{s'}\\left[V\\left(s'\\right)\\right]&\\approx V\\left(\\mathrm E_{s'}\\left[s'\\right]\\right)\\tag{9}\\\\\n", 254 | "&=V\\left(f(s,a)\\right)\\tag{10}\n", 255 | "\\end{align}\n", 256 | "$$\n", 257 | "\n", 258 | "此处的预期值是在随机的$s'\\sim P_{sa}$上的。只要噪音项$\\epsilon$较小,则这个近似通常都是合理的。\n", 259 | "\n", 260 | "不过,对于不适合做这种近似的问题,使用模型抽样$k\\lvert A\\rvert$个状态以近似上面的期望,可能会使计算的代价非常大。" 261 | ] 262 | } 263 | ], 264 | "metadata": { 265 | "anaconda-cloud": {}, 266 | "kernelspec": { 267 | "display_name": "Python 3", 268 | "language": "python", 269 | "name": "python3" 270 | }, 271 | "language_info": { 272 | "codemirror_mode": { 273 | "name": "ipython", 274 | "version": 3 275 | }, 276 | "file_extension": ".py", 277 | "mimetype": "text/x-python", 278 | "name": "python", 279 | "nbconvert_exporter": "python", 280 | "pygments_lexer": "ipython3", 281 | "version": "3.5.2" 282 | } 283 | }, 284 | "nbformat": 4, 285 | "nbformat_minor": 0 286 | } 287 | -------------------------------------------------------------------------------- /chapter18.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十八讲:线性二次调节\n", 8 | "\n", 9 | "首先回顾一下前面关于马尔可夫决策过程的内容。\n", 10 | "\n", 11 | "* 我们用五元组$\\left(S,A,\\{P_{sa}\\},\\gamma,R\\right)$定义MDP,我介绍了$0\\leq\\gamma\\lt1$、$R:S\\to\\mathbb R$等等……\n", 12 | "* 定义了价值函数,并介绍了使用值迭代算法求价值函数$\\displaystyle V(s):=R(s)+\\max_a\\gamma\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V\\left(s'\\right)$;(经过有限次的迭代会靠近最优解。)\n", 13 | "* 在值迭代后$V$收敛于$V^*$附近,再通过计算$\\displaystyle\\pi^*=\\arg\\max_a\\sum_{s'\\in S}P_{sa}\\left(s'\\right)V^*\\left(s'\\right)$得到最优策略$\\pi^*$。\n", 14 | "\n", 15 | "在[上一讲](chapter17.ipynb)中,我们了解了对无限状态MDP的求解,本讲我们将介绍一些做了轻微改动的MDP的变型形式——首先是修改奖励函数$R$,然后是对折扣因子$\\gamma$的调整。记得在上一讲中,我们提到了无限状态MDP无法直接求解(我们使用了对价值函数的近似来求解);而在本将中,我们将介绍一种特殊的MDP——即使状态空间是连续的(无限状态)依然可以直接对价值函数进行求解。\n", 16 | "\n", 17 | "## 5. 状态-动作奖励(State-action reward)\n", 18 | "\n", 19 | "我们要介绍的第一个MDP的变型形式就是状态动作奖励,我们将奖励函数改为$R:S,A\\to \\mathbb R$,也就是从一对“状态-动作”到实数的映射。此时我们就得到了一个状态-动作序列:\n", 20 | "\n", 21 | "$$\n", 22 | "\\require{AMScd}\n", 23 | "\\begin{CD}\n", 24 | "s_0,a_0 @>>> s_1,a_1 @>>> s_2,a_2 \\cdots \n", 25 | "\\end{CD}\\\\\n", 26 | "$$\n", 27 | "\n", 28 | "根据这个序列,我们的总收益就应该是$R(s_0,a_0)+\\gamma R(s_1,a_1)+\\gamma^2R(s_2,a_2)+\\cdots$,而我们的目标依然是找到一个能够最大化这个总收益的策略。可以看出这里的奖励函数变为一个关于状态和动作的函数(其实我们也可以减少一种变量,使其变回标准的MDP中的只关于状态的函数),使用状态-动作奖励可以使我们更直接的对“在不同动作中有不同成本”的问题进行建模(比如说对一个机器人来说,让机器人动起来的成本会高于让机器人静止的成本,此时给机器人一个静止在原地的指令就会对应更低的成本;或者比如对一个越野车来说,在泥泞道路上行驶比在柏油路上行驶成本更高,此时“在泥泞道路上行驶”的指令就更“贵”)。\n", 29 | "\n", 30 | "这个变动对于MDP来说并不大,我们依然使用贝尔曼方程求解$V^*$:\n", 31 | "\n", 32 | "$$\n", 33 | "V^*(s)=\\max_a\\left(R(s,a)+\\gamma\\sum_{s'}P_{sa}\\left(s'\\right)V^*\\left(s'\\right)\\right)\n", 34 | "$$\n", 35 | "\n", 36 | "在以前的价值函数中,$\\displaystyle\\max_a$的目标是未来收益,而现在因为“状态”奖励函数变为了“状态-动作”奖励函数,所以$\\displaystyle\\max_a$运算符移到了最外面。现在从状态$s$开始求最优价值函数时,最大化的目标分为两个部分:第一部分是新的即时奖励——在状态$s$下执行动作$a$的回报;第二部分是折扣因子$\\gamma$乘以未来的预期总收益。这两个部分合起来就是$V^*$——最优价值函数——也就是取等号右侧的所有动作的最优值。\n", 37 | "\n", 38 | "我们再来看值迭代,基本还是原来的算法$\\displaystyle V(s):=\\max_a\\left(R(s,a)+\\gamma\\sum_{s'}P_{sa}\\left(s'\\right)V\\left(s'\\right)\\right)$(仍然是用贝尔曼方程更新$V(s)$),迭代直到$V(s)$(近似)收敛于$V^*(s)$。\n", 39 | "\n", 40 | "最后一步就是通过$V^*(s)$求最佳策略$\\pi^*(s)$了,基本和以前一样$\\displaystyle\\pi^*(s)=\\arg\\max_a\\left(R(s,a)+\\gamma\\sum_{s'}P_{sa}\\left(s'\\right)V^*\\left(s'\\right)\\right)$\n", 41 | "\n", 42 | "## 6. 有限时域马尔可夫决策过程(Finite horizon MDP)\n", 43 | "\n", 44 | "我们要介绍的第二个MDP的变型形式就是有限时域MDP,这个MDP的五元组为$(S,A,\\{P_{sa}\\},T,R)$,其中$T$称为时域,它限定了MDP的最大步数,也就是在$T$步之后采取的动作将不会得到奖励。\n", 45 | "\n", 46 | "$$\n", 47 | "\\require{AMScd}\n", 48 | "\\begin{CD}\n", 49 | "s_0,a_0 @>>> s_1,a_1 @>>> \\cdots @>>> s_T,a_T\n", 50 | "\\end{CD}\\\\\n", 51 | "$$\n", 52 | "\n", 53 | "那么在这种情形下,预期总收益就变成了$R(s_0,a_0)+R(s_1,a_1)+\\cdots+R(s_T,a_T)$。与以往的目标相同,我们仍需要找到一个策略来最大化这个预期总收益,唯一的不同就是在$T$步之后MDP就结束了。这也说明策略有可能是**非平稳的(non-stationary)**(“平稳的”是指该项不依赖时间相关的变量),也就是说我们对最优动作的选择会根据所处时间的不同而不同。举个例子:\n", 54 | "$\n", 55 | "\\begin{array}\n", 56 | "{|c|c|c|c|c|}\n", 57 | "\\hline\n", 58 | "+1&\\cdot&s&\\cdots&+10\\\\\n", 59 | "\\hline\n", 60 | "\\end{array}\n", 61 | "$,假设机器人现在位于$s$的位置,距离左边的$+1$奖励比较近,距离右边的$+10$奖励比较远,而现在的MDP有个限制条件——不能超过$T$步。则这个例子中的机器人在做关于下一步动作的决策时会考虑:如果MDP刚开始,离结束$T$还比较远,那么它就可能决定向右走去取的$+10$的奖励;而如果已经进行到MDP末尾,剩下的步数并不一定能够到达$+10$奖励,那么它就可能决定向左走去取$+1$的奖励。\n", 62 | "\n", 63 | "再来看非平稳状态转换概率$P_{sa}^{(t)}$,以前的MDP中有$s_{t+1}\\sim P_{sa}$,即通过前一个状态的$s,a$就可以确定这个状态的分布,$P_{sa}$不会随时间变化(不依赖于时间相关的变量)。而在有限时域MDP中,不同的时间下状态转换概率是不同的,也就是说决定状态$s_{t+1}$的不只是$s,a$,同时也取决于它处在什么时间$t$。\n", 64 | "\n", 65 | "再举几个例子:\n", 66 | "\n", 67 | "* 在对于飞行器的建模中,飞行器会随着飞行消耗燃料,于是飞行器的总质量会随着时间的推移而变轻。于是对于飞行器的模型,我们对下一步所做的决定不只是取决于当前状态或动作,同时也取决于烧了多少燃料——即时间;\n", 68 | "* 在飞机航线规划时,天气会随着时间的推移而不断变化,于是在好天气下某条航线的飞行成本与在恶劣天气下飞行成本是相差很大的,所以此模型同样收到时间因素的影响;\n", 69 | "* 在汽车导航规划路线时,同一个区域在不同的时间车流量可能会有很大变化,因此某些区域的形式成本与时间有着直接关系。\n", 70 | "\n", 71 | "最后,奖励函数也可能会随着时间改变,所以预期总收益会变为$R^{(0)}(s_0,a_0)+R^{(1)}(s_1,a_1)+\\cdots+R^{(T)}(s_T,a_T)$。所以现在我们需要一个非平稳的随时间调整的策略。\n", 72 | "\n", 73 | "最优价值函数$V_t^*(s)=\\mathrm E\\left[R^{(t)}(s_t,a_t)+\\cdots+R^{(T)}(s_T,a_T)\\mid\\pi^*,s_t=s\\right]$表示在状态$s$及时刻$t$下启动模型一直到结束步骤$T$期间的预期总收益,所以这个最优价值函数也取决于当前的时间以及所剩的时间。我们现在用贝尔曼方程写出最优价值函数的值迭代算法:\n", 74 | "\n", 75 | "$$\n", 76 | "\\begin{align}\n", 77 | "V_T^*(s)&=\\max_aR^{(T)}(s,a)\\tag{1}\\\\\n", 78 | "V_t^*(s)&=\\max_a\\left(R^{(t)}(s,a)+\\sum_{s'}P_{sa}^{(t)}\\left(s'\\right)V_{t+1}^*\\left(s'\\right)\\right)\\tag{2}\n", 79 | "\\end{align}\n", 80 | "$$\n", 81 | "\n", 82 | "$(2)$式表示,如果从时刻$t$状态$s$开始计算预期总收益,则应为“在$s,a$的即时奖励”加上“未来奖励”(当执行动作$a$后,MDP按照状态转换概率$P_{sa}^{(t)}$进入下一个状态$s'$,那么当MDP进入下一个状态$s'$时间自然应该累加,这时的预期总收益就应该是$V_{t+1}^*\\left(s'\\right)$,可以参考[第十六讲](chapter16.ipynb)由价值函数的递归定义得出贝尔曼方程的过程)的最大值,这个式子将$V_t$表示为$V_{t+1}$的递推式。而$(1)$式就是这个递推算法的启动项,它表示在时刻$T$只能得到该时间点的即时奖励,之后MDP立刻结束,没有未来奖励。计算的时候我们从$(1)$式开始,得到MDP的最后一项,然后使用$(2)$式向后递推依次得到$V_{T-1},V_{T-2},\\cdots,V_0$。\n", 83 | "\n", 84 | "最后再计算最优策略即可:\n", 85 | "\n", 86 | "$$\n", 87 | "\\pi_t^*(s)=\\arg\\max_a\\left(R^{(t)}(s,a)+\\sum_{s'}P_{sa}\\left(s'\\right)V_{t+1}^*\\left(s'\\right)\\right)\n", 88 | "$$\n", 89 | "\n", 90 | "最优策略和上面的最优价值函数一样,使用向后递推依次计算每个时间点对应的策略。\n", 91 | "\n", 92 | "(再提一下折扣因子$\\gamma$,在有限时域MDP模型中并没有出现这个参数,因为这个参数的作用从计算角度来说与参数$T$的作用非常相似。在标准MDP模型中,$\\gamma$保证了MDP在一定步骤后的“未来”中,执行动作的奖励趋近于令;而在有限时域MDP模型中,$T$直接限定了“未来”步骤的总数。所以,我们通常在模型中只挑选这两个参数中的一个。)\n", 93 | "\n", 94 | "接下来我们将结合状态-动作奖励MDP和有限时域MDP,再加上某些合理的假设,得到一个新的MDP模型,它能够优雅、高效的对大型MDP进行求解。\n", 95 | "\n", 96 | "## 7. 线性二次调节(LQR: Linear Quadratic Regulation)\n", 97 | "\n", 98 | "我们想要把状态-动作奖励MDP和有限时域MDP的思想(动态规划算法)应用到连续状态、甚至是连续动作空间中。仍使用五元组$(S,A,\\{P_{sa}\\},T,R)$定义MDP,注意这里我们使用有限时序中的$T$而不是折扣因子$\\gamma$,其中:\n", 99 | "* 状态为$S\\in\\mathbb R^n$;\n", 100 | "* 动作为$A\\in\\mathbb R^d$;\n", 101 | "* 将下一步作为关于当前状态及动作的线性函数$s_{t+1}=A_ts_t+B_ta_t+w_t$,此处的$w_t\\sim\\mathcal N(0,\\varSigma_w)$是一个期望为零、协方差为$\\varSigma_w$的高斯噪音项。$A_t\\in\\mathbb R^{n\\times n}, B_t\\in\\mathbb R^{n\\times d}$。需要留意的是我们在这里复用了符号$A$,这里的$A_t$是一个系数矩阵,在后面出现的$A$基本上都表示这个矩阵,而不是上面的动作集合;(在后面的介绍中,我们会假设$A,B,w$都是已知项,而我们的任务是给MDP找到一个最优策略。另外,在后面的证明中,我们会看到噪音项$w_t$并不十分重要。)\n", 102 | "* $T$就是时域的限制;\n", 103 | "* 奖励函数定义为:\n", 104 | " $$\n", 105 | " \\begin{align}\n", 106 | " R^{(t)}(s_t,a_t)&=-\\left(s_t^TU_ts_t+a^TV_ta_t\\right)\\\\\n", 107 | " U_t&\\in\\mathbb R^{n\\times n},U_t\\geq0\\\\\n", 108 | " V_t&\\in\\mathbb R^{d\\times d},V_t\\geq0\\\\\n", 109 | " \\therefore&\\ s_t^TU_ts_t\\geq0,v_t^TV_ts_t\\geq0\\\\\n", 110 | " \\implies&R^{(t)}(s_t,a_t)\\leq0\n", 111 | " \\end{align}\n", 112 | " $$\n", 113 | " 在上面的定义中,$U_t,V_t$都是半正定矩阵,根据半正定矩阵的性质(可以参考[线性代数第二十八讲](http://nbviewer.jupyter.org/github/zlotus/notes-linear-algebra/blob/master/chapter28.ipynb))就有奖励函数始终是一个非正数,它只会有成本而并没有奖励。举个例子,比如我们想让直升机模型中$s_t\\approx0$,那么可以取$U_t=I,V_t=I$,则$R(s_t,a_t)=-s_t^Ts_t-a_t^Ta_t=-\\lVert s_t\\rVert^2-\\lVert a_t\\rVert^2$,这意味着如果直升机“远离原状态”(保持稳定)或“被来回猛拉”(防止高频率的反复操作),则奖励函数将以二次增长来惩罚模型,当然我们也可以修改矩阵$U,V$对角线上的元素以调整不同状态分量的权重。\n", 114 | " \n", 115 | "(在本节有$A=A_1=A_2=\\cdots,B=B_1=B_2=\\cdots$,我们将假设MDP是静止的。)\n", 116 | "\n", 117 | "### 7.1 非线性函数的线性近似\n", 118 | "\n", 119 | "我们先来讨论线性动态规划的情形,$s_{t+1}=As_t+Ba_t$,其中一种建模方法我们在前面提过,就是做多次试验:\n", 120 | "\n", 121 | "$$\n", 122 | "\\require{AMScd}\n", 123 | "\\begin{CD}\n", 124 | "s_0^{(1)} @>{a_0^{(1)}}>> s_1^{(1)} @>{a_1^{(1)}}>> s_2^{(1)} @>{a_2^{(1)}}>> \\cdots @>{a_{T-1}^{(1)}}>> s_T^{(1)}\n", 125 | "\\end{CD}\\\\\n", 126 | "\\begin{CD}\n", 127 | "s_0^{(2)} @>{a_0^{(2)}}>> s_1^{(2)} @>{a_1^{(2)}}>> s_2^{(2)} @>{a_2^{(2)}}>> \\cdots @>{a_{T-1}^{(2)}}>> s_T^{(2)}\n", 128 | "\\end{CD}\\\\\n", 129 | "\\vdots\\\\\n", 130 | "\\begin{CD}\n", 131 | "s_0^{(m)} @>{a_0^{(m)}}>> s_1^{(m)} @>{a_1^{(m)}}>> s_2^{(m)} @>{a_2^{(m)}}>> \\cdots @>{a_{T-1}^{(m)}}>> s_T^{(m)}\n", 132 | "\\end{CD}\n", 133 | "$$\n", 134 | "\n", 135 | "我们尝试不同的动作,记录测试得出的的各种结果,并使用线性回归拟合参数:\n", 136 | "\n", 137 | "$$\n", 138 | "\\arg\\min_{A,B}\\sum_{i=1}^m\\sum_{t=0}^{T-1}\\left\\lVert s_{t+1}^{(i)}-\\left(As_t^{(i)}+Ba_t^{(i)}\\right)\\right\\rVert^2\n", 139 | "$$\n", 140 | "\n", 141 | "也就是监督学习中的最小化“A,B”对数据的预测的误差。这是一种对线性动态系统的合理建模。我们再来介绍一种线性模型的建模方法——求非线性模型再将其线性化(linearize a non-linear model),仍然用倒置钟摆的例子:\n", 142 | "\n", 143 | "假设有某个非线性模型$s_{t+1}=f(s_t,a_t)\\begin{pmatrix}x_{t+1}\\\\\\dot x_{t+1}\\\\\\theta_{t+1}\\\\\\dot\\theta_{t+1}\\end{pmatrix}=f\\left(\\begin{matrix}x_{t}\\\\\\dot x_{t}\\\\\\theta_{t}\\\\\\dot\\theta_{t}\\end{matrix},a\\right)$($f$是一个非线性函数),也就是说,下一个时间点的状态将是一个关于某些当前状态和当前动作的函数,在本例中的动作就是一个实数,表示小车向左或向右的加速度的大小。 如果将这个式子看做$s_{t+1}$关于$s_t$的函数,那么我们可以做一个横轴为$s_t$,纵轴为$s_{t+1}$的图像,并绘出这个非线性函数。于是,当要对$s_{t+1}$进行预测时,就在横轴上找一个点$\\bar s_t$,并在$\\bar s_t$求函数的导数/梯度,于是就可以做出在点$\\left(\\bar s_t,\\bar s_{t+1}\\right)$处与非线性函数曲线相切的直线,而这条直线就可以近似为非线性函数在该点附近的线性表示。用数学符号表示:\n", 144 | "\n", 145 | "* 假设$s_{t+1}=f(s_t)$(这里为了简化计算先不考虑动作$a_t$),于是有$s_{t+1}\\approx f'\\left(\\bar s_t\\right)\\left(s_t-\\bar s_t\\right)+f\\left(\\bar s_t\\right)$,这就把原来的非线性函数写成了一个关于$s_t$的线性函数,而$\\bar s_t$是一个常数。最后,就是在式子里对应出矩阵$A,B$了。\n", 146 | "\n", 147 | "现在我们再考虑另一个问题——这条直线能够在多大程度上近似原来的非线性函数?很明显,在$\\bar s_t$点附近的近似都可以做到足够好,但是离的越远就差距就可能越大,就会变成一个糟糕的近似。所以,当我们使用LQR线性化非线性函数时,其中一个重要的参数就是用来确定线性化后函数在什么区间上有足够好的近似效果,放在倒置钟摆的例子中就是,我们希望这个系统的绝大部分时间都落在在这个“足够好的近似区间”内,这就是一次“合理的近似”。因此,从经验上讲,我们通常根据“系统大部分时间所在的区间”来确定在哪个状态附近对这个非线性函数做线性化处理。在倒置钟摆系统下,我们希望系统总是处于“零状态”,也就是大部分时间位于轨道的中央附近、小车的速度大约为零、同时杆能够的与轨道近似垂直——这就是一个我们希望做线性化的区间。\n", 148 | "\n", 149 | "写出通用的线性化方程:\n", 150 | "\n", 151 | "$$\n", 152 | "s_{t+1}\\approx f(\\bar s_t,\\bar a_t)+(\\nabla_sf(\\bar s_t,\\bar a_t))^T(s_t-\\bar s_t)+(\\nabla_af(\\bar s_t,\\bar a_t))^T(a_t-\\bar a_t)\n", 153 | "$$\n", 154 | "\n", 155 | "选择合适的$\\bar s_t,\\bar a_t$(在式子里,这两个量是常数)附近的区间做线性化,就可以将$s_{t+1}$近似的表示为关于$s_t,a_t$的线性函数。最后,我们可以将其化为$s_{t+1}=As_t+Ba_t$的形式。\n", 156 | "\n", 157 | "### 7.2 LQR的求解\n", 158 | "\n", 159 | "有了有线性近似非线性函数的思想,回到LQR的目标——在知道矩阵$A,B,U,V$组成的二次型奖励函数后后,找到能够最大化预期收益的策略。\n", 160 | "\n", 161 | "同以前一样,我们要最大化奖励函数$R^{(0)}(s_0,a_0)+R^{(1)}(s_1,a_1)+\\cdots+R^{(T)}(s_T,a_T)$,利用前面介绍过的“有限时域MDP”中动态规划算法的思路:\n", 162 | "* 先计算出MDP的最后一步$V_T^*(s)$:\n", 163 | " $$\n", 164 | " \\begin{align}\n", 165 | " V_T^*(s)&=\\max_{a_T}R^{(T)}(s,a)\\\\\n", 166 | " &=\\max_{a_T}\\left(-s_T^TU_Ts_T-a_T^TV_Ta_T\\right)\\\\\n", 167 | " &=-s_T^TU_Ts_T\n", 168 | " \\end{align}\n", 169 | " $$\n", 170 | " 因为我们定义$V_T$是半正定矩阵($a_T^TV_Ta_T\\geq0$),所以要保证上式取最大值,那么最好的方法就是不做任何动作(使$a_T^TV_Ta_T=0$)\n", 171 | "* 对应的最后一步的策略为$\\pi_T^*(s_T)=\\arg\\max_{a_T}R^{(T)}(s_t,a_t)=0$;\n", 172 | "\n", 173 | "接下来进入动态规划的步骤,先来考虑如何从已知$V_{t+1}^*$向后递推出$V_{t}^*$:\n", 174 | "* 在有限时域MDP的$(2)$式中,我们只需把求和换成积分(因为现在又是求连续状态的情形了)即可:\n", 175 | " $$\n", 176 | " \\begin{align}\n", 177 | " V_t^*(s)&=\\max_{a_t}\\left(R^{(t)}(s_t,a_t)+\\sum_{s_{t+1}}P_{s_ta_t}^{(t)}\\left(s_{t+1}\\right)V_{t+1}^*\\left(s_{t+1}\\right)\\right)\\\\\n", 178 | " &=\\max_{a_t}\\left(R^{(t)}(s_t,a_t)+\\mathrm E_{s_{t+1}\\ \\sim P_{s_ta_t}}\\left[V_{t+1}^*(s_{t+1})\\right]\\right)\n", 179 | " \\end{align}\n", 180 | " $$\n", 181 | " 我们跳过了换成积分的步骤,直接将后面的项写为期望形式。实际上LQR具有性质:每一个价值函数$V_{t+1},V_{t},\\cdots$都可以表为二次函数。\n", 182 | " \n", 183 | " 假设$\\displaystyle V_{t+1}^*(s_{t+1})=s_{t+1}^T\\varPhi_{t+1}s_{t+1}+\\varPsi_{t+1},\\varPhi\\in\\mathbb R^{n\\times n},\\varPsi\\in\\mathbb R$,即$V_{t+1}^*$是一个关于$s_{t+1}$的二次函数,则选择适当的$\\varPhi_t,\\varPsi_t$就可以得到$\\displaystyle V_t^*(s_t)=s_t^T\\varPhi_ts_t+\\varPsi_t$。\n", 184 | " \n", 185 | " 那么在上面的$V_T^*(s)$中,$\\varPhi=-U_T,\\varPsi=0\\to V_T^*(s_T)=s_T^T\\varPhi_Ts_T+\\varPsi_T$。\n", 186 | "* 然后就是向后递推过程:\n", 187 | " $$\n", 188 | " V_t^*(s_t)=\\max_{a_t}\\left(\\underbrace{-s_t^TU_ts_t-a_t^TV_ta_t}_{\\textrm{(a)}}+\\underbrace{\\mathrm E_{s_{t+1}\\ \\sim\\mathcal N(A_ts_t+B_ta_t,\\varSigma_w)}\\left[s_{t+1}^T\\varPhi_{t+1}s_{t+1}+\\varPsi_{t+1}\\right]}_{\\textrm{(b)}}\\right)\n", 189 | " $$\n", 190 | " 式中的$N(A_ts_t+B_ta_t,\\varSigma_w)$就是$P_{s_ta_t}$,而期望中的$s_{t+1}^T\\varPhi_{t+1}s_{t+1}+\\varPsi_{t+1}$就是$V_{t+1}^*(s_{t+1})$。这个式子可以理解为找到动作$a_t$使$\\textrm{(a)}+\\textrm{(b)}$能够取到最大值,其中$\\textrm{(a)}$表示处于状态$s_t$的即时奖励,而$\\textrm{(b)}$表示在$s_ta_t$下$V^*$的期望,而$V^*$是下一步的最优价值函数。这个式子就是将奖励函数、状态转换概率、最优价值函数等带入后的最终结果。\n", 191 | " \n", 192 | " 整个等号右边可以看做是对一个“大型”二次函数极大值的求解过程,我们和以前一样,求这个二次函数关于$a_t$的导数并将导数置为零,最终解出$a_t$。现在省略推导步骤,直接写出结果就有:\n", 193 | " $$\n", 194 | " a_t=\\underbrace{\\left(B_t^T\\varPhi_{t+1}B_t-V_t\\right)^{-1}B_t^T\\varPhi_{t+1}A_t}_{L_t}\\cdot s_t\n", 195 | " $$\n", 196 | " 要留意的是,可以把前面的部分看做是一个“大型”矩阵$L_t$,于是,$a_t$就是$L_t$与$s_t$的乘积,即$a_t$是关于$s_t$的线性函数。\n", 197 | "* 最后是求解最优策略,记得我摸在有限时域MDP中提到,$\\pi^*$计算中$\\arg\\max$的部分就是$V^*$计算中$\\max$的部分,而得到的也就是上面的$a_t$:\n", 198 | "\n", 199 | " $$\n", 200 | " \\begin{align}\n", 201 | " \\displaystyle \\pi_t^*(s_t)&=\\arg\\max_{a_t}\\left(-s_t^TU_ts_t-a_t^TV_ta_t+\\mathrm E_{s_{t+1}\\ \\sim\\mathcal N(A_ts_t+B_ta_t,\\varSigma_w)}\\left[s_{t+1}^T\\varPhi_{t+1}s_{t+1}+\\varPsi_{t+1}\\right]\\right)\\\\\n", 202 | " &=L_ts_t\n", 203 | " \\end{align}\n", 204 | " $$\n", 205 | " 也就是说,要得到最优策略,我摸只需要计算一个矩阵$L_t$,然后再乘以当前状态$s_t$即可。换句话说,最优策略是当前状态的线性函数。需要注意的是,这不是一个近似的函数,我们不会说“找到一个最优线性策略”、“找到最优策略然后用直线拟合该策略”,这不是用直线去近似最优策略,而是说最佳策略就是一条直线、最优动作就是当前状态的一个线性函数。\n", 206 | " \n", 207 | " 而当我们求出$a_t$之后,把它代回$\\displaystyle V_t^*(s_t)=s_t^T\\varPhi_ts_t+\\varPsi_t$,就会发现在这个二次函数中有:\n", 208 | " $$\n", 209 | " \\begin{align}\n", 210 | " \\varPhi_t&=A_t^T\\left(\\varPhi_{t+1}-\\varPhi_{t+1}B_t\\left(B_t^T\\varPhi_{t+1}B_t-V_t\\right)^{-1}B_t\\varPhi_{t+1}\\right)A_t-U_t\\tag{3}\\\\\n", 211 | " \\varPsi_t&=-\\mathrm{tr}\\varSigma_w\\varPhi_{t+1}+\\varPsi_{t+1}\n", 212 | " \\end{align}\n", 213 | " $$\n", 214 | " 即$\\varPhi_t,\\varPsi_t$是关于$\\varPhi_{t+1},\\varPsi_{t+1}$的线性函数,现在就可以计算$V_t^*(s_t)$了。其中$(3)$式也被称作**离散时间Riccati方程(discrete time Riccati equation)**。\n", 215 | "\n", 216 | "对LQR做一个总结,算法如下:\n", 217 | "* 初始化$\\varPhi_t=-U_t,\\varPsi_t=0$;\n", 218 | "* 向后递推计算$\\varPhi_t,\\varPsi_t$,使用离散时间Riccati方程,将其当做关于$\\varPhi_{t+1},\\varPsi_{t+1}$的线性函数;(依次求出$t=T-1,T-2,\\cdots,0$。)\n", 219 | "* 计算$L_t$,这是一个关于$\\varPhi_{t+1},\\varPsi_{t+1}$的函数;\n", 220 | "* 计算$\\pi^*(s_t)$,这是一个关于$s_t$的线性函数,系数是$L_t$。" 221 | ] 222 | } 223 | ], 224 | "metadata": { 225 | "kernelspec": { 226 | "display_name": "Python 3", 227 | "language": "python", 228 | "name": "python3" 229 | }, 230 | "language_info": { 231 | "codemirror_mode": { 232 | "name": "ipython", 233 | "version": 3 234 | }, 235 | "file_extension": ".py", 236 | "mimetype": "text/x-python", 237 | "name": "python", 238 | "nbconvert_exporter": "python", 239 | "pygments_lexer": "ipython3", 240 | "version": "3.5.2" 241 | } 242 | }, 243 | "nbformat": 4, 244 | "nbformat_minor": 0 245 | } 246 | -------------------------------------------------------------------------------- /chapter19.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第十九讲:微分动态规划及线性二次型高斯\n", 8 | "\n", 9 | "在继续学习之前,我们先来回顾一下[上一讲](chapter18.ipynb)的内容:\n", 10 | "* 其目标是$\\displaystyle\\max_a\\mathrm E\\left[R^{(0)}(s_0,a_0)+R^{(1)}(s_1,a_1)+\\cdots+R^{(T)}(s_T,a_T)\\right]$;\n", 11 | "* 之后我们应用了动态规划算法:\n", 12 | " $$\n", 13 | " \\begin{align}\n", 14 | " V_T^*(s)&=\\max_{a_T}R(s_T,a_T)\\tag{1}\\\\\n", 15 | " V_t^*(s)&=\\max_a\\left(R(s,a)+\\sum_{s'}P_{sa}^{(t)}\\left(s'\\right)V_{t+1}^*\\left(s'\\right)\\right)\\tag{2}\\\\\n", 16 | " \\pi_t^*(s)&=\\arg\\max_a\\left(R(s,a)+\\sum_{s'}P_{sa}^{(t)}\\left(s'\\right)V_{t+1}^*\\left(s'\\right)\\right)\\tag{3}\n", 17 | " \\end{align}\n", 18 | " $$\n", 19 | " 其中$(1)$式是有限时域MDP的最后一步;得出最后一步后就可以使用$(2)$式向后递推每一个$V_{T-1},\\cdots,V_{0}$;最后,在使用$\\arg\\max$对每一步价值函数最大化的部分做运算,就可以得到每一步的最优策略。\n", 20 | "* 接下来我们介绍了一个具体的LQR问题:\n", 21 | " * 状态为$S\\in\\mathbb R^n$;\n", 22 | " * 动作为$A\\in\\mathbb R^d$;\n", 23 | " * 将下一步作为关于当前状态及动作的函数$s_{t+1}=A_ts_t+B_ta_t+w_t$,此处的$w_t\\sim\\mathcal N(0,\\varSigma_w)$是一个期望为零、协方差为$\\varSigma_w$的高斯噪音项。\n", 24 | "* 上面定义中有了关于当前状态及动作的函数$s_{t+1}=f(s_t,a_t)$,我们就可以选择一个系统长时间保持的状态(系统通常都会都处于这种状态)$(\\bar s_t,\\bar a_t)$,在该点使用线性函数近似非线性函数$s_{t+1}=f(s_t,a_t)$,进而得到$\\displaystyle s_{t+1}\\approx f(\\bar s_t,\\bar a_t)+(\\nabla_sf(\\bar s_t,\\bar a_t))^T(s_t-\\bar s_t)+(\\nabla_af(\\bar s_t,\\bar a_t))^T(a_t-\\bar a_t)$。最终能够在$(\\bar s_t,\\bar a_t)$附近得到一个线性函数$s_{t+1}=A_ts_t+B_ta_t$。\n", 25 | "* LQR的奖励函数为$\\displaystyle R^{(t)}(s_t,a_t)=-\\left(s_t^TU_ts_t+a^TV_ta_t\\right)$,其中矩阵$U,V$是半正定的,所以这个奖励函数总是非正数;\n", 26 | "* 对LQR使用上面的动态规划得到求解方法:\n", 27 | " * 使用$\\varPhi_t=-U_t,\\varPsi_t=0$初始化$V_T^*$;\n", 28 | " * 向后递推计算$\\varPhi_t,\\varPsi_t$,使用离散时间Riccati方程,将其当做关于$\\varPhi_{t+1},\\varPsi_{t+1}$的线性函数;(依次求出$t=T-1,T-2,\\cdots,0$。)\n", 29 | " $$\n", 30 | " \\begin{align}\n", 31 | " \\varPhi_t&=A_t^T\\left(\\varPhi_{t+1}-\\varPhi_{t+1}B_t\\left(B_t^T\\varPhi_{t+1}B_t-V_t\\right)^{-1}B_t\\varPhi_{t+1}\\right)A_t-U_t\\\\\n", 32 | " \\varPsi_t&=-\\mathrm{tr}\\varSigma_w\\varPhi_{t+1}+\\varPsi_{t+1}\n", 33 | " \\end{align}\n", 34 | " $$\n", 35 | " * 计算$\\displaystyle L_t=\\left(B_t^T\\varPhi_{t+1}B_t-V_t\\right)^{-1}B_t^T\\varPhi_{t+1}A_t$,这是一个关于$\\varPhi_{t+1},\\varPsi_{t+1}$的函数;\n", 36 | " * 计算$\\pi^*(s_t)=L_ts_t$,这是一个关于$s_t$的线性函数,系数是$L_t$。\n", 37 | " \n", 38 | " 这个算法中有趣的一点是,$L_t$不依靠$\\varPsi_t$,$\\varPhi_t$也不依赖于$\\varPsi_t$。所以,即使我们从不考虑$\\varPsi$也不会影响最终的结果。另一个有趣的地方在于$\\varSigma_w$只在$\\varPsi_t$中出现,再看LQR定义中的$s_{t+1}=A_ts_t+B_ta_t+w_t$可以得出,即使在不知道噪音项协方差的前提下,也可以正确的求出最优策略(但不要忘了最优价值函数是受$\\varPsi$影响的)。最后,这两点都是对这个特殊LQR模型(非线性动力系统)独有的,一旦我们对模型做出改变,则这两个特性将不复存在,也就是只有在这个例子中才有“最优策略不受噪音项协方差影响”。在后面讨论Kalman滤波的时候会用到这个性质。\n", 39 | "\n", 40 | "## 8. 强化学习算法的调试\n", 41 | "\n", 42 | "我们在[第十一讲](chapter11.ipynb)中,在关于机器学习算法的调试介绍过直升机模型提到:\n", 43 | "\n", 44 | "1. 搭建一个遥控直升机模拟器,主要是对状态转换概率$P_{sa}$进行建模(比如通过学习物理知识,依照空气动力学原理编写模拟器;或者也可以收集大量试验数据,通过拟合这些数据一个线性或非线性模型,以得到一个用当前状态、当前操作表示下一步状态的函数);\n", 45 | "2. 选择奖励函数,比如$R(s)=\\left\\lVert s-s_\\mathrm{desired}\\right\\rVert^2$($s$代表直升机当前的位置,这里示例的函数表示直升机实际位置与期望位置的平方误差,我们在[上一讲](chapter18.ipynb)的LQR中已经使用过这个奖励函数了);\n", 46 | "3. 在模拟器中运行强化学习算法控制直升机并尝试最大化奖励函数,$\\mathrm E\\left[R(s_0)+R(s_1)+\\cdots+R(s_T)\\right]$,进而求得对应的策略$\\pi_\\mathrm{RL}$。\n", 47 | "\n", 48 | "现在,假设我们已经按照上述步骤得到了控制模型,但是发现该模型比人类直接操作差很多,接下来应该怎么办呢?我们可能会:\n", 49 | "* 改进模拟器(也许模拟器所用的模型不是线性或非线性的;也许需要收集更多数据来拟合模型;也许需要调整拟合模型时所使用的特征值);\n", 50 | "* 修改奖励函数$R$(也许它不只是一个二次函数);\n", 51 | "* 改进学习算法(也许RL并不适合这个问题;也许需要对状态进行更精细的描述;也许在价值函数近似过程中使用的特征值需要调整);\n", 52 | "\n", 53 | "对于调整算法这样的任务,我们有太多的选择方向,如果选择错误,则将会浪费大量的时间精力。\n", 54 | "\n", 55 | "接下来我们假设:\n", 56 | "1. 直升机模拟器足够精确;\n", 57 | "2. RL算法能够在模拟器中正确的控制飞机,因此算法正确的最大化了预期总收益$V_t^{\\pi_\\mathrm{RL}}(s_0)=\\mathrm E\\left[R(s_0)+R(s_1)+\\cdots+R(s_T)\\mid\\pi_\\mathrm{RL},s_t=s_0\\right]$;\n", 58 | "3. 最大化预期总收益与模型正确的操作飞机强相关。\n", 59 | "\n", 60 | "如果上述三条假设均正确,则可以推出$\\pi_\\mathrm{RL}$能够控制好真正的直升机。\n", 61 | "\n", 62 | "于是,我们可以**依次**做出如下诊断:\n", 63 | "1. 首先,如果$\\pi_\\mathrm{RL}$在模拟器中飞的很好,但是在实际飞机上却表现不好,则说明是模拟器的问题;\n", 64 | "2. 然后,用$\\pi_\\mathrm{human}$表示人类操纵者在操纵直升机时使用的策略,比较人类和算法的策略所对应的价值函数,如果$V^{\\pi_\\mathrm{RL}}\\lt V^{\\pi_\\mathrm{human}}$,则说明是RL算法的问题。(算法并没有成功的最大化预期总收益。)\n", 65 | "3. 最后,如果经比较发现$V^{\\pi_\\mathrm{RL}}\\gt V^{\\pi_\\mathrm{human}}$,则说明问题出在奖励函数上。(最大化这个奖励函数并没有使得飞行水平提高。)\n", 66 | "\n", 67 | "以上仅是一个强化学习调试的例子,因为我们恰好找到了一个极优秀的直升机操纵者,如果没有的话则需要想出别的调试方法。在通常的问题中,我们都需要自己找出针对问题的有效的调试方法。\n", 68 | "\n", 69 | "## 9. 微分动态规划(DDP: Differential Dynamic Programming)\n", 70 | "\n", 71 | "继续使用遥控直升机的例子,假设我们已经有模拟器并可以通过模拟器知道$s_{t+1}=f(s_t,a_t)$(即下一个状态是一个关于当前状态及动作的函数),而且这个模拟器是非线性、确定性的,噪音项也比较小。我们现在想要让直升机飞出一些特定轨迹,于是:\n", 72 | "1. 先写出这个轨迹:$(\\bar s_0,\\bar a_0),(\\bar s_1,\\bar a_1),\\cdots,(\\bar s_T,\\bar a_T)$,这也称为**标准轨迹(nominal trajectory)**;(这个轨迹也可能来自一个很粗糙的控制算法,但是虽然粗糙,却也是描述的我们想要做出的动作,比如在空中做$90^\\circ$转弯之类的动作。)\n", 73 | "2. 然后,我们在这个轨迹附近线性化$f$得到:$\\displaystyle s_{t+1}\\approx f(\\bar s_t,\\bar a_t)+(\\nabla_sf(\\bar s_t,\\bar a_t))^T(s_t-\\bar s_t)+(\\nabla_af(\\bar s_t,\\bar a_t))^T(a_t-\\bar a_t)$,也就是说能够得到一个线性函数$s_{t+1}=A_ts_t+B_ta_t$。我们这是在课程中第一次使用LQR来处理有限时域上的非平稳的动态问题,尤其要注意的是这里的$A_t,B_t$是依赖于时间的(也就是这是一系列不相等的矩阵);(即使标准轨迹来自一套很糟糕的控制,但我们仍然希望系统在$t$时刻的状态和动作能够近似于这个糟糕的轨迹。也许这个控制算法做的工作很马虎,但毕竟这个轨迹描述了我们想要得到的动作,也就是希望$(s_t,a_t)\\approx(\\bar s_t,\\bar a_t)$。)\n", 74 | "3. 有了线性模型,再使用LQR计算最优策略$\\pi_t$,于是我们就会得到一个更好的策略;\n", 75 | "4. 在模拟器中按照新的策略实现一个新的轨迹,也就是:\n", 76 | " * 用$\\bar s_0$初始化模拟器;\n", 77 | " * 用刚学到的$\\pi_t$控制每一步的动作$a_t=\\pi_t(\\bar s_t)$;\n", 78 | " * 最终得到一套新的轨迹$\\bar s_{t+1}=f(\\bar s_t,\\bar a_t)$\n", 79 | "5. 得到新的轨迹后,我们就可以继续重复上面的操作,不停的优化这个轨迹(也就是重复步骤2-5)。\n", 80 | "\n", 81 | "在实践中能够知道,这是一个非常有效的算法,DDP实际上是一种局部搜索算法,在每次迭代中,找到一个稍好的点进行线性化,进而得到一个稍好的策略,重复这个动作最终就可以得到一个比较好的策略了。(“微分”指的就是每次迭代我们都会选择一个点并通过求导做线性化。)\n", 82 | "\n", 83 | "## 10. 线性二次型高斯(LQG: Linear Quadratic Gaussian)\n", 84 | "\n", 85 | "### 10.1 Kalman滤波(Kalman Filter)\n", 86 | "\n", 87 | "现在介绍另一种类型的MDP,在这种MDP中,我们并不能直接观察到每一步的状态(在前面的MDP中我们都会假设系统的状态已知,于是可以计算出策略,它是一个关于状态的函数;在LQR中我们也是计算$L_ts_t$,状态都是已知的)。\n", 88 | "\n", 89 | "我们暂时先不谈控制,来说说普通的不能观察到状态信息的动态系统。举个例子,我们对“使用雷达追踪飞行器”的过程进行极其简化的建模:线性模型$s_{t+1}=As_t+w_t$,其中$s_t=\\begin{bmatrix}x_t\\\\\\dot x_t\\\\y_t\\\\\\dot y_t\\end{bmatrix},\\ A=\\begin{bmatrix}1&1&0&0\\\\0&0.9&0&0\\\\0&0&1&1\\\\0&0&0&0.9\\end{bmatrix}$(这是一个非常简化的模型,可以理解为一架在2D空间中移动的飞机)。\n", 90 | "\n", 91 | "在这个简化模型中我们无法观察到每一步的状态,但假设我们可以观察到另一个量——$y_t=Cs_t+v_t,\\ v_t\\sim\\mathcal N(0,\\varSigma_v)$:比如$C=\\begin{bmatrix}1&0&0&0\\\\0&0&1&0\\end{bmatrix}$,则有$Cs_t=\\begin{bmatrix}x_t\\\\y_t\\end{bmatrix}$。这个量可能是雷达追踪到的飞行器的位置(只能得到位置相关的状态,而不能得到加速度相关的状态)。比如说在$\\mathrm{xOy}$平面上,有一个雷达位于$x$轴某点,其视角沿$y$轴正方向大致对着飞行器,并依次观察到一系列飞行器移动过程中的不连续的点,因为雷达视角沿$y$轴正半轴方向,所以得到的点的坐标的纵坐标的噪音(方差)应该大于横坐标的方差,可以说这些点分别位于一个个小的高斯分布中,而这些高斯分布的协方差矩阵应该型为$\\varSigma=\\begin{bmatrix}a&0\\\\0&b\\end{bmatrix},\\ a\\gt b$(即因为在$y$轴方向上的观测结果更容易出现偏差,所以等高线图中椭圆的长轴会沿着$y$轴方向。)而我们想要做的就是通过观测到的一系列坐标估计飞行器在每个观测点的状态$P(s_t\\mid y_1,\\cdots,y_t)$。\n", 92 | "\n", 93 | "$s_0,\\cdots,s_t;\\ y_0,\\cdots,y_t$组成了一个高斯分布的联合分布(多元正态分布),可以用$z=\\begin{bmatrix}s_0\\\\\\vdots\\\\s_t\\\\y_0\\\\\\vdots\\\\y_t\\end{bmatrix},\\ z\\sim\\mathcal N(\\mu,\\varSigma)$表示,再结合[第十三讲](chapter13.ipynb)中了解的多元正态分布的边缘分布与条件分布的计算方法,我们就可以对$P(s_t\\mid y_1,\\cdots,y_t)$进行求解。虽然这个思路在概念上是可行的,但是在实际中跟踪一个飞行器会得到成千上万个位置,于是就会有一个巨大的协方差矩阵(期望向量和协方差矩阵都会随着时间、步数的增长呈线性增长,在计算过程中需要用到的边缘分布、条件分布都可能会使用协方差的逆,而计算协方差的逆的复杂度是矩阵规模的平方级别),所以对于计算来说可行性较低。\n", 94 | "\n", 95 | "于是我们引入**Kalman滤波(Kalman Filter)**算法来解决这个效率问题。这个算法实际上是一个隐式马尔可夫模型,使用递推的方式计算,下面写出算法的步骤,算法的思路可以在[Hidden Markov Models](http://cs229.stanford.edu/section/cs229-hmm.pdf)中找到:\n", 96 | "* 第一步称为**预测(predict)**步骤,使用$P(s_t\\mid y_1,\\cdots,y_t)$对$P(s_{t+1}\\mid y_1,\\cdots,y_t)$进行预测;\n", 97 | " * 有$s_t\\mid y_0,\\cdots,y_t\\sim\\mathcal N\\left(s_{t\\mid t},\\varSigma_{t\\mid t}\\right)$;\n", 98 | " * 则有$s_{t+1}\\mid y_0,\\cdots,y_t\\sim\\mathcal N\\left(s_{t+1\\mid t},\\varSigma_{t+1\\mid t}\\right)$;\n", 99 | " * 其中$\\begin{cases}s_{t+1\\mid t}&=As_{t\\mid t}\\\\ \\varSigma_{t+1\\mid t}&=A\\varSigma_{t\\mid t}A^T+\\varSigma_t\\end{cases}$;\n", 100 | " * 需要说明的是,我们使用诸如$s_t,y_t$表示模型的真实状态(如为观测到的实际状态,已观测到的实际位置),而使用$s_{t\\mid t},s_{t+1\\mid t},\\varSigma_{t\\mid t}$表示由计算得到的值;\n", 101 | "* 第二步称为**更新(update)**步骤,使用上一步预测的$P(s_{t+1}\\mid y_1,\\cdots,y_t)$更新$P(s_{t+1}\\mid y_1,\\cdots,y_{t+1})$,也就是有了预测结果之后再将对应的样本纳入模型:\n", 102 | " * 其中$s_{t+1\\mid t+1}=s_{t+1\\mid t}+K_{t+1}\\cdot\\left(y_{t+1}-Cs_{t+1\\mid t}\\right)$;\n", 103 | " * 而$K_{t+1}=\\varSigma_{t+1\\mid t}C^T\\left(C\\varSigma_{t+1\\mid t}C^T+\\varSigma_t\\right)^{-1}$;\n", 104 | " * $\\varSigma_{t+1\\mid t+1}=\\varSigma_{t+1\\mid t}+\\varSigma_{t+1\\mid t}\\cdot C^T\\left(C\\varSigma_{t+1\\mid t}C^T+\\varSigma_t\\right)^{-1}C\\varSigma_{t+1\\mid t}$\n", 105 | "\n", 106 | " Kalman滤波算法的复杂度比计算协方差矩阵的逆低很多,因为采用了递推的计算过程,每当步骤增加,则只需多执行一步迭代,而且无需保留太多数据在内存中,相比于求一个巨大矩阵的逆而言,算法复杂度低了很多:\n", 107 | " $$\n", 108 | " \\require{AMScd}\n", 109 | " \\begin{CD}\n", 110 | " y_1 @. y_2 @. y_3 \\\\\n", 111 | " @VVV @VVV @VVV \\\\\n", 112 | " P\\left(s_1\\mid y_1\\right) @>>> P\\left(s_2\\mid y_1,y_2\\right) @>>> P\\left(s_3\\mid y_1,y_2,y_3\\right) @>>> \\cdots\n", 113 | " \\end{CD}\n", 114 | " $$\n", 115 | " 从这个草图可以看出来,当计算$P\\left(s_3\\mid y_1,y_2,y_3\\right)$时,我们并不需要$y_1,y_2,P\\left(s_1\\mid y_1\\right)$,每步计算只需要知道最新的观测值和上一步得出的概率估计即可。\n", 116 | "\n", 117 | "### 10.2 LQG\n", 118 | "\n", 119 | "将Kalman滤波与LQR结合起来就可以得到**线性二次高斯(LQG: Linear Quadratic Gaussian)**线性二次高速算法。在LQR问题中,我们将动作$a_t$加回到模型中:设非线性动力学系统为$s_{t+1}=As_t+Ba_t+w_t,\\ w\\sim\\mathcal N(0,\\varSigma_w)$,而且我们无法直接观测到状态,只能观测到$y_t=Cs_t+v_t,\\ v\\sim\\mathcal N(0,\\varSigma_v)$。现在使用Kalman滤波估计状态:\n", 120 | "* 假设初始状态为$s_{0\\mid0}=s_0,\\varSigma_{0\\mid0}=0$;(如果不知道确切初始状态,测可以大致估计初始状态$s_0\\sim\\mathcal N\\left(s_{0\\mid0},\\varSigma_{0\\mid0}\\right)$,即使用初始状态的平均值和协方差的估计。)\n", 121 | "* 预测步骤,$\\begin{cases}s_{t+1\\mid t}&=As_{t\\mid t}+Ba_t\\\\\\varSigma_{t+1\\mid t}&=A\\varSigma_{t\\mid t}A^T+\\varSigma_t\\end{cases}$。如此,我们就“解决”为了状态观测不到的问题(这里的$A,B$都是已知项);\n", 122 | "* 控制步骤,按照LQR算法中的最优动作$a_t=L_ts_t$计算其中的$L_t$,并暂时忽略观测不到状态的问题;得到$L_t$后,选择$a_t=L_ts_{t\\mid t}$作为最优动作(换句话说,因为不知道状态,所以我们对状态的最佳估计就是$s_{t\\mid t}$)。\n", 123 | "\n", 124 | "这个算法实际上是先设计了一个状态估计算法,然后再使用了一个控制算法,把两个算法结合起来就得到了LQG。" 125 | ] 126 | } 127 | ], 128 | "metadata": { 129 | "kernelspec": { 130 | "display_name": "Python 3", 131 | "language": "python", 132 | "name": "python3" 133 | }, 134 | "language_info": { 135 | "codemirror_mode": { 136 | "name": "ipython", 137 | "version": 3 138 | }, 139 | "file_extension": ".py", 140 | "mimetype": "text/x-python", 141 | "name": "python", 142 | "nbconvert_exporter": "python", 143 | "pygments_lexer": "ipython3", 144 | "version": "3.5.2" 145 | } 146 | }, 147 | "nbformat": 4, 148 | "nbformat_minor": 0 149 | } 150 | -------------------------------------------------------------------------------- /chapter20.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第二十讲:策略搜索算法\n", 8 | "\n", 9 | "回忆[上一讲](chapter19.ipynb)的内容,实际上上一讲的例子就是一个部分可观测MDP的特例。\n", 10 | "\n", 11 | "在原LQR问题中有模型$s_{t+1}=As_t+Ba_t+w_t$,我们改变了条件,假设只能观测到$y_t=Cs_t+v_t$(不能直接观测到状态,只能观测到某些关于状态的函数,并需要根据这些观测值对最优动作作出判断)。\n", 12 | "\n", 13 | "在状态完全可观测的情形下,我们可以根据$a_t=L_ts_t$选择动作;而在部分可观测的例子中,我们会使用$s_{t\\mid t}$估计$s_t$,然后使用Kalman滤波的思想$s_{t\\mid y_0,\\cdots,y_t}\\sim\\mathcal N\\left(s_{t\\mid t},\\varSigma_{t\\mid t}\\right)$计算这个估计$s_{t\\mid t}$。\n", 14 | "\n", 15 | "最后,我们使用$a_t=L_ts_{t\\mid t}$选择最优动作。事实上这个算法让我们能够在不完全清楚系统每一个状态的前提下选择尽可能好的策略,而在一个部分可观测MDP中求最优策略是一个NP困难问题。\n", 16 | "\n", 17 | "### 10.3 部分可观测MDP(POMDP: Partial Observed MDP)\n", 18 | "\n", 19 | "我们现在给出POMDP的正式描述——七元组$(S,A,Y,\\{P_{sa}\\},\\{O_s\\},T,R)$:\n", 20 | "* $Y$是可观测到的值的集合;\n", 21 | "* $O$是可观测到的值的分布;\n", 22 | " \n", 23 | " 也就是在每个$s_t$下都能够观测到某个服从$y_t\\sim O_{s_t}$的随机变量。上一讲中我们介绍的在线性动力学系统中的特例可以使用Kalman过滤算法,从观测值中估计状态,再通过状态计算最优策略。然而这个算法仅对上一讲那个的特例(上一讲的例子也是POMDP的特例)有效,不过这个算法对普通的POMDP问题也有一定的效果,只是对该问题这个算法不一定是最优的算法。\n", 24 | "\n", 25 | "## 12. 策略搜索(Policy Search)\n", 26 | "\n", 27 | "再来介绍一个不同的强化学习算法——策略搜索算法,看名字就大概可以猜出,它可以被用于完全可观测MDP(Fully Observed MDP)或部分可观测MDP的最优策略求解。下面我们先来介绍策略搜索算法在完全可观测MDP中的应用。(在后面我们会介绍如何将策略搜索应用在POMDP上,但这并不能保证算法会找到全局最优解,策略搜索通常在POMDP中找到的是局部最优策略。解决POMDP是异常困难的,而策略搜索算法在实践中被证明是最好的POMDP解决算法之一。)\n", 28 | "\n", 29 | "* 首先定义$\\varPi$为策略的集合,而我们的算法就是在$\\varPi$中搜索$\\pi\\in\\varPi$。可以类比前面在监督学习算法中的概念——从假设类$\\mathcal H$中搜索最优假设$h$(参见[第九讲](chapter09.ipynb))。\n", 30 | "\n", 31 | " 在之前的关于MDP的算法中,我们都是通过解出最优价值函数$V^*$进而得到最优策略$\\pi^*$的。而在策略搜索算法中——有时被称作直接搜索算法——我们会“直接”去寻找最优策略(不再通过中间的步骤——计算最优价值函数)。\n", 32 | "\n", 33 | "* 接下来再定义随机策略——是一个函数$\\pi:S\\times A\\to\\mathbb R$,$\\pi(s,a)$表示在状态$s$执行动作$a$的概率。从定义就可以知道,函数$\\pi$实际上是事件“在状态$s$执行动作$a$的概率”的概率密度函数,满足$\\displaystyle\\sum_a\\pi(s,a)=1,\\pi(s,a)\\geq0$。换句话说,对于每一个状态,函数$\\pi$都确定了一个在$a$上的分布。\n", 34 | "\n", 35 | " 举个例子,假设我们要执行随机的策略$\\pi$,而在当前的MDP中有三个动作$a_t\\in\\{a_1,a_2,a_3\\}$,那么我们执行动作$a_1$的概率就是$\\pi(s,a_1)$、执行动作$a_2$的概率就是$\\pi(s,a_2)$、执行动作$a_3$的概率就是$\\pi(s,a_3)$。这个过程就是执行一个随机策略。\n", 36 | "\n", 37 | "下面继续使用倒置钟摆的例子来讲解策略搜索算法,我们定义$\\phi$为钟摆偏离竖直位的角度,$a_1$是向右的加速度,$a_2$是向左的加速度。再找一个奖励函数,杆不论倒向那一边都对模型做出惩罚。提出一类随机策略意味着提出一类函数,这类函数被用来估计在状态$s_t$下将要执行的行动$a_t$。而现在,我们选择逻辑函数作为我们的策略,因为它是我们经常使用的一个很方便的函数:\n", 38 | "$$\n", 39 | "\\begin{align}\n", 40 | "\\pi_\\theta(s,a_1)&=\\frac{1}{1+e^{-\\theta^Ts}}\\\\\n", 41 | "\\pi_\\theta(s,a_2)&=1-\\frac{1}{1+e^{-\\theta^Ts}}\n", 42 | "\\end{align}\n", 43 | "$$\n", 44 | "因为我们不是选择$a_1$就是选择$a_2$,所以选择它们的概率之和为$1$。举个例子解释这个选择的合理性,假设我们的状态向量为$s=\\begin{bmatrix}1\\\\x\\\\\\dot x\\\\\\phi\\\\\\dot\\phi\\end{bmatrix}$(这里添加了$1$作为截距项给逻辑回归一个额外的特征值),如果我们选择$\\theta=\\begin{bmatrix}0\\\\0\\\\0\\\\1\\\\0\\end{bmatrix}$,则有$P\\displaystyle\\left(a=\\textrm{\"right\"}\\right)=\\frac{1}{1+e^{-\\theta^Ts}}=\\frac{1}{1+e^{-\\phi}}$,这说明“向右加速”的概率只取决于“杆的倾角$\\phi$”,所以当的杆向右偏的时候小车就会尝试向右加速以接住杆。当然,这个例子里的参数选择并不是最优的,因为它忽略的别的参数。现在,我们的目标就是调整$\\theta$,使得当执行$\\pi_\\theta$时能够让杆尽可能的保持竖直,也就是说,我们的目标是选择一个参数$\\theta$使得执行$\\pi_\\theta$时的预期总收益最大化。再举个例子,如果有$d$个离散的动作,那么我们也可以用[第四讲](chapter04.ipynb)提到的softmax回归$\\displaystyle\\theta_1,\\cdots,\\theta_d;\\ \\pi_{\\theta_i}(s,a_i)=\\frac{e^{\\theta_i^Ts}}{\\sum_je^{\\theta_j^Ts}}$,策略类型的选择是可以自己确定的,线性函数、使用二次特征值的线性函数、监督学习算法等等。\n", 45 | "\n", 46 | "### 12.1 增强算法(Reinforce algorithm)\n", 47 | "\n", 48 | "设$s_0$是一个固定的初始化状态(即从一个确定的初始状态分布中抽样得到),我们的目标是:\n", 49 | "\n", 50 | "$$\n", 51 | "\\begin{align}\n", 52 | "\\max\\ &\\mathrm E[R(s_0,a_0)+\\cdots+R(s_T,a_T]\\\\\n", 53 | "&=\\sum_{(s_0,a_0),\\cdots,(s_T,a_T)}P(s_0a_0\\cdots s_Ta_T)[R(s_0,a_0)+\\cdots+R(s_T,a_T)]\\tag{1}\\\\\n", 54 | "&=\\sum_{(s_0,a_0),\\cdots,(s_T,a_T)}P(s_0)\\pi_\\theta(s_0,a_0)P_{s_0a_0}(s_1)\\pi_\\theta(s_1,a_1)P_{s_1a_1}(s_2)\\cdots P_{s_{T-1}\\ a_{T-1}}\\ (s_T)\\pi_\\theta(s_T,a_T)\\cdot\\underbrace{[R(s_0,a_0)+\\cdots+R(s_T,a_T)]}_{\\textrm{payoff}}\\tag{2}\n", 55 | "\\end{align}\n", 56 | "$$\n", 57 | "\n", 58 | "在后面我们就将$R(s_0,a_0)+\\cdots+R(s_T,a_T)$部分简称为收益(payoff),先写出算法步骤:\n", 59 | "\n", 60 | "* 重复:`{`\n", 61 | " * 抽样:$s_0,a_0,s_1,a_1,\\cdots,s_T,a_t$\n", 62 | " * 计算收益:$R(s_0,a_0)+\\cdots+R(s_T,a_T)$\n", 63 | " * 更新参数:$\\displaystyle\\theta:=\\theta+\\alpha\\left[\\frac{\\nabla_\\theta\\pi_\\theta(s_0,a_0)}{\\pi_\\theta(s_0,a_0)}+\\cdots+\\frac{\\nabla_\\theta\\pi_\\theta(s_T,a_T)}{\\pi_\\theta(s_T,a_T)}\\right]\\cdot[R(s_0,a_0)+\\cdots+R(s_T,a_T)]$\n", 64 | " \n", 65 | " `}`\n", 66 | "\n", 67 | "算法的第一步就是随机抽样得到一个状态-动作序列,也就是在MDP中执行当前的随机策略——从某个$s_0$开始,根据随机策略选择一个动作$a_0$,然后看状态转换概率给出的下一个状态,继续重复执行策略。第二步就是计算收益。第三步更新参数。\n", 68 | "\n", 69 | "由于这个算法执行的是随机策略,所以我们想知道它为什么这样更新参数。我们可以计算更新参数步骤的期望,只要更新参数后带来的收益呈增长趋势,我们就对算法是满意的。实际上这个算法类似随机梯度上升,它将在局部最优解附近“游荡”,但总趋势是向局部最优解前进。\n", 70 | "\n", 71 | "回顾上面的$(2)$式,它表示概率与收益之积在所有状态上的和,我们现在要做的就是对$(2)$式求关于$\\theta$的导数,因为我们想对这个式子做梯度上升:\n", 72 | "$$\n", 73 | "\\begin{align}\n", 74 | "\\nabla_\\theta\\mathrm E\\left[R(s_0,a_0)+\\cdots+R(s_T,a_T)\\right]\n", 75 | "=\\sum_{(s_0,a_0),\\cdots,(s_T,a_T)}\n", 76 | "&\\Bigg[\\ P(s_0)\\underline{(\\nabla_\\theta\\pi_\\theta(s_0,a_0))}P_{s_0a_0}(s_1)\\pi_\\theta(s_1,a_1)P_{s_1a_1}(s_2)\\cdots P_{s_{T-1}\\ a_{T-1}}\\ (s_T)\\pi_\\theta(s_T,a_T)\\\\\n", 77 | "&+P(s_0)\\pi_\\theta(s_0,a_0)P_{s_0a_0}(s_1)\\underline{(\\nabla_\\theta\\pi_\\theta(s_1,a_1))}P_{s_1a_1}(s_2)\\cdots P_{s_{T-1}\\ a_{T-1}}\\ (s_T)\\pi_\\theta(s_T,a_T)\\\\\n", 78 | "&+\\cdots\\\\\n", 79 | "&+P(s_0)\\pi_\\theta(s_0,a_0)P_{s_0a_0}(s_1)\\pi_\\theta(s_1,a_1)P_{s_1a_1}(s_2)\\cdots P_{s_{T-1}\\ a_{T-1}}\\ (s_T)\\underline{(\\nabla_\\theta\\pi_\\theta(s_T,a_T))}\\ \\Bigg]\\\\\n", 80 | "&\\times[R(s_0,a_0)+\\cdots+R(s_T,a_T)]\\\\\n", 81 | "=\\sum_{(s_0,a_0),\\cdots,(s_T,a_T)}&P(s_0)\\pi_\\theta(s_0,a_0)P_{s_0a_0}(s_1)\\pi_\\theta(s_1,a_1)P_{s_1a_1}(s_2)\\cdots P_{s_{T-1}\\ a_{T-1}}\\ (s_T)\\pi_\\theta(s_T,a_T)\\\\\n", 82 | "&\\times\\left[\\frac{\\nabla_\\theta\\pi_\\theta(s_0,a_0)}{\\pi_\\theta(s_0,a_0)}+\\frac{\\nabla_\\theta\\pi_\\theta(s_1,a_1)}{\\pi_\\theta(s_1,a_1)}+\\cdots+\\frac{\\nabla_\\theta\\pi_\\theta(s_T,a_T)}{\\pi_\\theta(s_T,a_T)}\\right]\\\\\n", 83 | "&\\times[R(s_0,a_0)+\\cdots+R(s_T,a_T)]\\\\\n", 84 | "=\\sum_{(s_0,a_0),\\cdots,(s_T,a_T)}&P(s_0a_0\\cdots s_Ta_T)\\cdot\\left[\\frac{\\nabla_\\theta\\pi_\\theta(s_0,a_0)}{\\pi_\\theta(s_0,a_0)}+\\cdots+\\frac{\\nabla_\\theta\\pi_\\theta(s_T,a_T)}{\\pi_\\theta(s_T,a_T)}\\right]\\\\\n", 85 | "&\\times[R(s_0,a_0)+\\cdots+R(s_T,a_T)]\\\\\n", 86 | "\\end{align}\\\\\n", 87 | "\\Downarrow\\\\\n", 88 | "\\nabla_\\theta\\mathrm E\\left[R(s_0,a_0)+\\cdots+R(s_T,a_T)\\right]=\\mathrm E\\left[\\left(\\frac{\\nabla_\\theta\\pi_\\theta(s_0,a_0)}{\\pi_\\theta(s_0,a_0)}+\\cdots+\\frac{\\nabla_\\theta\\pi_\\theta(s_T,a_T)}{\\pi_\\theta(s_T,a_T)}\\right)\\cdot\\left(R(s_0,a_0)+\\cdots+R(s_T,a_T)\\right)\\right]\n", 89 | "$$\n", 90 | "第一步应用了几个相乘函数的求导法则$\\displaystyle\\frac{\\mathrm d}{\\mathrm d\\theta}f(\\theta)g(\\theta)h(\\theta)=f'(\\theta)g(\\theta)h(\\theta)+f(\\theta)g'(\\theta)h(\\theta)+f(\\theta)g(\\theta)h'(\\theta)$。\n", 91 | "\n", 92 | "但是,使用加强算法的时候,我们通常认为对于待解决的问题,存在一个简单的函数(如线性函数、逻辑函数等),描述了从状态空间到动作空间的映射。对于倒置钟摆这种简单的任务,事实可能就是这样的(杆向右偏时小车就向右加速接住杆)。实际上对于很多低级别的控制任务(如开车时右边有障碍就应该向左转向以避让),人类也是条件反射式的做出“本能”动作。对于这种较为简单的、极短时间内的“本能”判断,通常能够找到一个由简单函数组成的合理的策略类。\n", 93 | "\n", 94 | "与其相反的是复杂任务,需要很长的多步推理的任务,比如象棋、围棋等。在这种活动中做出决策需要多步严密的因果推理,这是一种高级别的控制任务,所以就不能使用“本能”了。在这种任务中我们有时会用前面提到的价值函数的线性近似。另外,在POMDP中如果使用$\\hat s$近似真实状态(比如在Kalman滤波中的$\\hat s=s_{t\\mid t}$),则我们仍然可以使用策略搜索算法$\\displaystyle\\pi_\\theta(\\hat s,a_t)=\\frac{1}{1+e^{-\\theta^T\\hat s}}$。\n", 95 | "\n", 96 | "最后,关于加强算法——这个算法在做上升时本质上是没有明确方向的(虽然其总体期望上是正确的),这可能会导致加强算法需要大量的迭代才到达到最优值附近;而且,在算法中,每次迭代都需要一次抽样,如果对于一个物理实体来说成本可能会很高,比如我们在研究控制一个机器人,那么这个机器人可能就需要做很多次动作(多次迭代,每次都需要抽样),所以这个算法通常运行在模拟器中。\n", 97 | "\n", 98 | "### 12.2 Pegasus算法\n", 99 | "\n", 100 | "在[第十七讲](chapter17.ipynb)我们提到模拟器的应用。模拟器可以接受状态$s_t$和动作$a_t$,输出下一步的状态$s_{t+1}$,$s_{t+1}$通常是一个从随机状态转换概率中抽样的随机状态,也就是说在模拟器中$s_{t+1}$是一个关于$s_t,a_t$的随机函数。比如我们在直升机的例子中,使用线性回归、局部加权回归等监督学习算法,就可以构建一个非线性动力学模型,在这个模型中,$s_{t+1}$就是一个关于$s_t,a_t$的随机函数。我们可以使用模拟器估计任意的状态-动作序列对应的预期总收益(将每个状态的奖励函数值相加即可)。\n", 101 | "\n", 102 | "同样是在[第十七讲](chapter17.ipynb)我们定义了策略,它接受当前状态,输出当前状态下应执行的动作,那么结合模拟器,就可以估计任意策略的预期总收益了(选定初始状态$s_0$后,输入策略$\\pi$得到$a_0$,再将$s_0,a_0$输入模拟器得到$s_1$;将$s_1$带入策略$\\pi$得到$a_1$,再将$s_1,a_1$带入模拟器得到$s_2$……将所有状态带入奖励函数,求和即可估计出该策略的预期总收益)。那么,我们就可以尝试找到使这个由模拟器估计出的总收益最大的策略,也就是找到该策略对应的参数即可。从概念上讲,这是一个不错的思路,但是实际上几乎不可行:由于模拟器的随机性,即使我们对同一个策略做估计时,也会得到有细微的差别两个不同的结果,所以在策略空间中对策略进行估计时,如果策略空间维数较高,那么我们很难知道空间中策略对应的收益的分布趋势。\n", 103 | "\n", 104 | "模拟器会根据输入的状态-动作输出一个带有机性的下一步状态,通常,能够做到这一点的模拟器都会调用一个随机数生成器。那么,为了降低使用模拟器对策略空间进行搜索的难度,我们可以在MDP中每一步调用模拟器时,固定随机数生成器得到的值(也就是让每一步的生成器只生成器只运行一次,然后就固定这个值),如果我们每次估计策略都使用同一组随机数序列,则模拟器就不再是随机的了,此时对同一个策略进行多次估计,得到的也将是相同的值(取消了随机数也就意味着确定了在策略空间上的收益函数,这极大程度上降低了最优策略的求解难度)。虽然我们现在通过模拟器只能得到的策略预期总收益的估计(因为固定了随机数,模拟器不再是原来通过试验数据拟合出来的系统了),但这个估计值离实际的预期总收益相乘不大,所以现在我们就可以使用诸如梯度上升等算法在策略空间中搜索最优策略了。\n", 105 | "\n", 106 | "关于这个随机数,可以举个例子,在直升机模型中,假设随机数是对直升机在风场中的模拟,不同的随机数对应不同的风。在对风场的模拟中,我们不是对每一种模式的风都进行建模估计,而是采样不同模式的风,对它们做平均的估计。在模拟器中,我们对控制策略做收益估计,并不是只做一次,而是做很多次,然后取所有测试的平均收益。这就相当于在不同的风场中做了多次测试,然后得出控制策略在不同风场状况下的平均预期收益。\n", 107 | "\n", 108 | "### 12.3 强化学习算法小结\n", 109 | "\n", 110 | "我们一共介绍了两种强化学习算法,第一种方法是通过求解最优价值函数推导出最优策略,这种方法常被用于解决需要“深思熟虑”才能解决的问题,它涉及的问题一般都会有多步推导,且后面步骤的决策也会影响前面的步骤,常见于诸如俄罗斯方块、象棋等场景;第二种方法是通过策略搜索直接找到最优策略,这种方法通常被用于解决“条件反射”式的问题,比如直升机悬停控制、汽车障碍避让等场景。强化学习算法的核心是根据状态做出的决策序列,它的适用场景为“需要依次根据状态做出决策的问题,而且决策可能具有长期影响”。列出一些RL算法已经应用的场景:医疗决策——根据病人所处的状态选择不同的治疗方案;用于减少排队等待时间——其中包括流水线上的效率提升问题等;用于博弈论中某些场景——比如怎样大量抛售股票同时又将对市场的影响降到最低;也应用于运筹学——最大化工厂的生产效率同时降低成本……。" 111 | ] 112 | } 113 | ], 114 | "metadata": { 115 | "kernelspec": { 116 | "display_name": "Python 3", 117 | "language": "python", 118 | "name": "python3" 119 | }, 120 | "language_info": { 121 | "codemirror_mode": { 122 | "name": "ipython", 123 | "version": 3 124 | }, 125 | "file_extension": ".py", 126 | "mimetype": "text/x-python", 127 | "name": "python", 128 | "nbconvert_exporter": "python", 129 | "pygments_lexer": "ipython3", 130 | "version": "3.5.2" 131 | } 132 | }, 133 | "nbformat": 4, 134 | "nbformat_minor": 0 135 | } 136 | -------------------------------------------------------------------------------- /resource/chapter02_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter02_image01.png -------------------------------------------------------------------------------- /resource/chapter02_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter02_image02.png -------------------------------------------------------------------------------- /resource/chapter02_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter02_image03.png -------------------------------------------------------------------------------- /resource/chapter02_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter02_image04.png -------------------------------------------------------------------------------- /resource/chapter03_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter03_image01.png -------------------------------------------------------------------------------- /resource/chapter03_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter03_image02.png -------------------------------------------------------------------------------- /resource/chapter04_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter04_image01.png -------------------------------------------------------------------------------- /resource/chapter05_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image01.png -------------------------------------------------------------------------------- /resource/chapter05_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image02.png -------------------------------------------------------------------------------- /resource/chapter05_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image03.png -------------------------------------------------------------------------------- /resource/chapter05_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image04.png -------------------------------------------------------------------------------- /resource/chapter05_image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image05.png -------------------------------------------------------------------------------- /resource/chapter05_image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter05_image06.png -------------------------------------------------------------------------------- /resource/chapter06_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter06_image01.png -------------------------------------------------------------------------------- /resource/chapter06_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter06_image02.png -------------------------------------------------------------------------------- /resource/chapter07_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter07_image01.png -------------------------------------------------------------------------------- /resource/chapter08_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter08_image01.png -------------------------------------------------------------------------------- /resource/chapter08_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter08_image02.png -------------------------------------------------------------------------------- /resource/chapter08_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter08_image03.png -------------------------------------------------------------------------------- /resource/chapter08_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter08_image04.png -------------------------------------------------------------------------------- /resource/chapter09_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter09_image01.png -------------------------------------------------------------------------------- /resource/chapter09_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter09_image02.png -------------------------------------------------------------------------------- /resource/chapter10_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter10_image01.png -------------------------------------------------------------------------------- /resource/chapter10_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter10_image02.png -------------------------------------------------------------------------------- /resource/chapter10_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter10_image03.png -------------------------------------------------------------------------------- /resource/chapter11_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter11_image01.png -------------------------------------------------------------------------------- /resource/chapter11_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter11_image02.png -------------------------------------------------------------------------------- /resource/chapter11_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter11_image03.png -------------------------------------------------------------------------------- /resource/chapter11_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter11_image04.png -------------------------------------------------------------------------------- /resource/chapter11_image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter11_image05.png -------------------------------------------------------------------------------- /resource/chapter12_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter12_image01.png -------------------------------------------------------------------------------- /resource/chapter12_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter12_image02.png -------------------------------------------------------------------------------- /resource/chapter14_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter14_image01.png -------------------------------------------------------------------------------- /resource/chapter14_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter14_image02.png -------------------------------------------------------------------------------- /resource/chapter14_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter14_image03.png -------------------------------------------------------------------------------- /resource/chapter14_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter14_image04.png -------------------------------------------------------------------------------- /resource/chapter17_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter17_image01.png -------------------------------------------------------------------------------- /resource/chapter17_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter17_image02.png -------------------------------------------------------------------------------- /resource/chapter17_image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter17_image03.png -------------------------------------------------------------------------------- /resource/chapter17_image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/chapter17_image04.png -------------------------------------------------------------------------------- /resource/sn02_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/sn02_image01.png -------------------------------------------------------------------------------- /resource/sn02_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/sn02_image02.png -------------------------------------------------------------------------------- /resource/sn07_image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/sn07_image01.png -------------------------------------------------------------------------------- /resource/sn07_image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlotus/notes-LSJU-machine-learning/d1a11b1de5e15c6adf4edbdcc25ca6fb6431c76b/resource/sn07_image02.png -------------------------------------------------------------------------------- /sn02.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 概率论复习\n", 8 | "\n", 9 | "这篇笔记将介绍一些推导机器学习算法时用到的概率论相关概念,主要针对本课程CS229中将会使用到的知识。概率论所涉及的数学理论十分复杂,而且已经发展为一门单独的学科——**测度论(measure theory)**。在这篇笔记中,我们将对概率论做最基本的讨论,而并不会涉及那些复杂的理论。\n", 10 | "\n", 11 | "## 1. 概率的基本要素\n", 12 | "\n", 13 | "为了对集合的概率做出定义,我们需要先准备几个基本要素:\n", 14 | "* **样本空间(Sample space)$\\Omega$:**一个由某随机实验的所有输出组成的集合。其中的每个输出$\\omega\\in\\Omega$都可以看做是真实实验最终状态的完全描述。\n", 15 | "* **事件集/事件空间(Set of events/event space)$\\mathcal F$:**集合的元素(也称为事件)$A\\in\\mathcal F$是$\\Omega$的子集(即$A\\subseteq\\Omega$是实验的一组可能的输出集合,$\\mathcal F$满足三个特性,$\\varnothing\\in\\mathcal F$、$A\\in\\mathcal F\\implies \\Omega\\setminus A\\in\\mathcal F$、$A_1,A_2,\\cdots\\in\\mathcal F\\implies\\cup_iA_i\\in\\mathcal F$)。\n", 16 | "* **概率测度(Probability measure):**函数$P:\\mathcal F\\to\\mathbb R$具有一下特性:\n", 17 | " * $\\forall A\\in\\mathcal F, P(A)\\gt0$;\n", 18 | " * $P(\\Omega)=1$;\n", 19 | " * 若$A_1,A_2$为不相交事件(即$A_i\\cap A_j=\\varnothing, i\\neq j$),则有$\\displaystyle P(\\cup_iA_i)=\\sum_iP(A_i)$。\n", 20 | "\n", 21 | "上面这三条特性称为**概率公理(Axioms of Probability)**。\n", 22 | "\n", 23 | "**举例:**掷六面骰子时,其样本空间为$\\Omega={1,2,3,4,5,6}$。我们可以在样本空间上定义各种事件空间。比如最简单的事件空间——平凡事件空间$\\mathcal F=\\{\\varnothing,\\Omega\\}$,另一个事件空间是$\\Omega$的所有子集组成的集合。可以看出第一个事件空间满足上面的概率测度,$P(\\varnothing)=0,P(\\Omega)=1$。对于第二个事件空间,一种有效的概率测度就是给事件空间中的每个集合赋值$\\frac{i}{6}$,其中$i$是该集合中事件的个数,于是有$P(\\{1,2,3,4\\})=\\frac{4}{6}$,$P(\\{1,2,3\\})=\\frac{3}{6}$。\n", 24 | "\n", 25 | "**性质:**\n", 26 | "* $A\\subseteq B\\implies P(A)\\leq P(B)$;\n", 27 | "* $P(A\\cap B)\\leq\\min(P(A),P(B))$;\n", 28 | "* 联合界(Union Bound):$P(A\\cup B)\\leq P(A)+P(B)$;\n", 29 | "* $P(\\Omega\\setminus A)=1-P(A)$;\n", 30 | "* 全概率:若$A_1,\\cdots,A_k$为一组不相交事件,$\\cup_{i=1}^kA_i=\\Omega$,$\\sum_{i=1}^kP(A_k)=1$\n", 31 | "\n", 32 | "### 1.1 条件概率与独立性\n", 33 | "\n", 34 | "令$B$为具有非零概率的事件,则在$B$条件下$A$的概率定义为:\n", 35 | "\n", 36 | "$$\n", 37 | "P(A\\mid B)\\triangleq\\frac{P(A\\cap B)}{P(B)}\n", 38 | "$$\n", 39 | "\n", 40 | "换句话说,$P(A\\mid B)$是观察到事件$B$的结果之后,事件$A$的概率测度。若$P(A\\cap B)=P(A)P(B)$(或等价的$P(A\\mid B)=P(A)$)则称这两个事件相互独立。因此,独立性就是指对事件$B$的观测完全不影响事件$A$的概率。\n", 41 | "\n", 42 | "## 2. 随机变量\n", 43 | "\n", 44 | "考虑一个抛硬币实验,我们抛了10枚硬币,并想要知道面向上有多少枚。此时的样本空间$\\Omega$的元素为长度为$10$的序列,记录每一个硬币$H$或$T$向上的状态。比如我们可能有$\\Omega_0=\\langle H,H,T,H,T,H,H,T,T,T\\rangle\\in\\Omega$。不过在实际实验中,我们并不关心特定的$H,T$序列。我们关系的是关于实验输出的实函数,比如$10$枚硬币中面相上的个数,或是连续最长的底向上的个数。这些函数,在特定语境下(比如现在)也可以称为**随机变量(random variables)**。\n", 45 | "\n", 46 | "更加正式的定义,随机变量$X$是一个函数$X:\\Omega\\to\\mathbb R$(不过,并不是每个函数都可以作为随机变量,从测度的角度出发,随机变量必须是波莱尔可测函数/Borel-measurable functions。直观的说,这个约束保证了对于给定的随机变量及其输出空间,我们可以不严格的将事件空间中的每个事件定义为输出$\\omega\\in\\Omega$的一组集合,其中$X(\\omega)$满足某些性质,如$\\{\\omega:X(\\omega)\\geq3\\}$)。通常,我们用大写字母$X(\\omega)$(表示基于实验输出$\\omega$的随机变量)或简写$X$来表示随机变量。我们使用小写字母$x$来表示随机变量可能取的值。\n", 47 | "\n", 48 | "**举例:**在上面的实验中,假设$X(\\omega)$表示在抛硬币结果序列$\\omega$中得到的面朝上的硬币的个数。因为只抛了$10$枚硬币,所以$X(\\omega)$只能取有限个值,这种随机变量也被称作**离散随机变量(discrete random variable)**。这里,实验结果集合相应的随机变量$X$取到$k$的概率为:\n", 49 | "$$\n", 50 | "P(X=k):=P(\\{\\omega:X(\\omega)=k\\})\n", 51 | "$$\n", 52 | "**举例:**假设随机变量$X(\\omega)$表示某放射性元素原子衰变所需要的时间。在这种情形下,$X(\\omega)$可以取到无数种可能的值,所以也被称作**连续随机变量(continuous random variable)**。我们将随机变量$X$取在实常量$a,b\\ (a\\lt b)$之间的概率记为:\n", 53 | "$$\n", 54 | "P(a\\leq X\\leq b):=P(\\{\\omega:a\\leq X(\\omega)\\leq b\\})\n", 55 | "$$\n", 56 | "\n", 57 | "### 2.1 积累分布函数(Cumulative distribution functions)\n", 58 | "\n", 59 | "为了确定随机变量服的概率测度,通常需要确定其[积累分布函数](https://zh.wikipedia.org/wiki/%E7%B4%AF%E7%A7%AF%E5%88%86%E5%B8%83%E5%87%BD%E6%95%B0)([CDF](https://en.wikipedia.org/wiki/Cumulative_distribution_function))或[概率质量函数](https://zh.wikipedia.org/wiki/%E6%A6%82%E7%8E%87%E8%B4%A8%E9%87%8F%E5%87%BD%E6%95%B0)([PMF](https://en.wikipedia.org/wiki/Probability_mass_function))或[概率密度函数](https://zh.wikipedia.org/wiki/%E6%A9%9F%E7%8E%87%E5%AF%86%E5%BA%A6%E5%87%BD%E6%95%B8)([PDF](https://en.wikipedia.org/wiki/Probability_density_function))中的至少一个。在这个小节及后两个小节中,我们会简要介绍这三种函数。\n", 60 | "\n", 61 | "积累分布函数指$F_X:\\mathbb R\\to[0,1]$,所代表的概率测度为:\n", 62 | "$$\n", 63 | "F_X(x)\\triangleq P(X\\leq x)\\tag{1}\\label{1}\n", 64 | "$$\n", 65 | "\n", 66 | "我们可以通过这个公式计算$\\mathcal F$中的任意事件的概率,下图为某个CDF的图像:\n", 67 | "\n", 68 | "\"\"\n", 69 | "\n", 70 | "**性质:**\n", 71 | "* $0\\lt F_X(x)\\lt1$;\n", 72 | "* $\\displaystyle\\lim_{x\\to-\\infty}F_X(x)=0$;\n", 73 | "* $\\displaystyle\\lim_{x\\to\\infty}F_X(x)=1$;\n", 74 | "* $x\\leq y\\implies F_X(x)\\leq F_Y(y)$。\n", 75 | "\n", 76 | "### 2.2 概率质量函数(Probability mass functions)\n", 77 | "\n", 78 | "对于离散随机变量,可以用一种更简便的方法表示随机变量的概率测度——直接表示出随机变量每个取值的概率。**概率质量函数**就是这样一种函数$p_X:\\Omega\\to\\mathbb R$,其中:\n", 79 | "$$\n", 80 | "p_X(x)\\triangleq P(X=x)\n", 81 | "$$\n", 82 | "\n", 83 | "在离散随机变量的情形下,我们使用$Val(X)$来表示随机变量$X$能够取到的值的集合,比如令随机变量$X(\\omega)$表示抛$10$次硬币面朝上的次数,则$Val(X)=\\{0,1,2,\\cdots,10\\}$。\n", 84 | "\n", 85 | "**性质:**\n", 86 | "* $0\\leq p_X(x)\\leq1$;\n", 87 | "* $\\displaystyle\\sum_{x\\in Val(X)}p_X(x)=1$;\n", 88 | "* $\\displaystyle\\sum_{x\\in A}p_X(x)=P(X\\in A)$。\n", 89 | "\n", 90 | "### 2.3 概率密度函数(Probability density functions)\n", 91 | "\n", 92 | "对于某些连续随机变量来说,它们的积累分布函数$F_X(x)$处处可导。在这种情形下,我们可以定义**概率密度函数**为对积累分布函数求导:\n", 93 | "$$\n", 94 | "f_X(x)\\triangleq\\frac{\\mathrm dF_X(x)}{\\mathrm dx}\\tag{2}\\label{2}\n", 95 | "$$\n", 96 | "这里需要注意的是,并不是所有连续随机变量都有概率密度函数(比如$F_X(x)$并不是处处可导的情形)。\n", 97 | "\n", 98 | "根据求导的性质,对于很小的$\\Delta x$有:\n", 99 | "$$\n", 100 | "P(x\\leq X\\leq x+\\Delta x)\\approx f_X(x)\\Delta x\\tag{3}\\label{3}\n", 101 | "$$\n", 102 | "我们可以使用CDF和PDF(如果存在)来计算不同事件的概率。不过需要强调的是,对于PDF给定任意一点$x$所求出的值并不是一个事件的概率,即$f_X(x)\\neq P(X=x)$。比如$f_X(x)$可以取到比一还大的值,但是$f_X(x)$在$\\mathbb R$上任意子集的积分永远不会超过一。\n", 103 | "\n", 104 | "**性质:**\n", 105 | "* $f_X(x)\\geq0$;\n", 106 | "* $\\displaystyle\\int_{-\\infty}^{\\infty}f_X(x)=1$;\n", 107 | "* $\\displaystyle\\int_{x\\in A}f_X(x)\\mathrm dx=P(X\\in A)$。\n", 108 | "\n" 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": {}, 114 | "source": [ 115 | "### 2.4 期望\n", 116 | "\n", 117 | "假设$X$是一个PMF为$p_X(x)$的离散随机变量,$g:\\mathbb R\\to\\mathbb R$为任意函数。在这样的条件下,可以将$g(X)$看做是一个随机变量,我们定义$g(X)$的**期望(expectation)**或**期望值(expected value)**为:\n", 118 | "$$\n", 119 | "\\mathrm E[g(X)]\\triangleq\\sum_{x\\in Val(X)}g(x)p_X(x)\n", 120 | "$$\n", 121 | "如果$X$是一个PDF为$f_x(X)$的连续随机变量,则$g(X)$的期望值定义为:\n", 122 | "$$\n", 123 | "\\mathrm E[g(X)]\\triangleq\\int_{-\\infty}^{\\infty}g(x)f_X(x)\\mathrm dx\n", 124 | "$$\n", 125 | "直观来看,$g(X)$的期望可以看做是$g(X)$在不同的$x$取值上的平均权重,其中权重由$p_X(x)$或$f_X(x)$给出。作为期望定义的一个特例,我们注意到随机变量本身的期望$\\mathrm E[X]$就是当$g(x)=x$时的情形,这也被称为随机变量$X$的均值。\n", 126 | "\n", 127 | "**性质:**\n", 128 | "* 对任意常数$a\\in\\mathbb R$有$\\mathrm E[a]=a$;\n", 129 | "* 对任意常数$a\\in\\mathbb R$有$\\mathrm E[af(x)]=a\\mathrm E[f(x)]$;\n", 130 | "* 期望的线性性质$\\mathrm E[f(x)+g(x)]=\\mathrm E[f(x)]+\\mathrm E[g(x)]$;\n", 131 | "* 对于离散随机变量$X$有$\\mathrm E[1\\{X=k\\}]=P(X=k)$\n", 132 | "\n", 133 | "### 2.5 方差\n", 134 | "\n", 135 | "随机变量$X$的**方差(variance)**是一个度量随机变量在其均值处集中程度的量。随机变量$X$的方差的公式定义为:\n", 136 | "$$\n", 137 | "\\mathrm{Var}[X]\\triangleq\\mathrm E\\left[(X-\\mathrm E[X])^2\\right]\n", 138 | "$$\n", 139 | "使用上一小节的性质,我们可以从上面的公式推导出另一种方差的表达:\n", 140 | "$$\n", 141 | "\\begin{align}\n", 142 | "\\mathrm E\\left[(X-\\mathrm E[X])^2\\right]&=\\mathrm E\\left[X^2-2\\mathrm E[X]X+\\mathrm E[X]^2\\right]\\\\\n", 143 | "&=\\mathrm E\\left[X^2\\right]-2\\mathrm E[X]\\mathrm E[X]+\\mathrm E[X]^2\\\\\n", 144 | "&=\\mathrm E\\left[X^2\\right]-\\mathrm E[X]^2\n", 145 | "\\end{align}\n", 146 | "$$\n", 147 | "其中第二步使用了“常数的期望仍是常数”这一性质,即$\\mathrm E[\\mathrm E[X]]=\\mathrm E[X]$。\n", 148 | "\n", 149 | "**性质:**\n", 150 | "* 对任意常数$a\\in\\mathbb R$有$\\mathrm{Var}[a]=0$;\n", 151 | "* 对任意常数$a\\in\\mathbb R$有$\\mathrm{Var}[af(x)]=a^2\\mathrm{Var}[f(x)]$。\n", 152 | "\n", 153 | "**举例:**随机变量$X$服从均匀分布,其PDF在$x\\in[0,1]$上为$f_X(x)=1$,其他情况下为$0$,计算$X$的均值及方差:\n", 154 | "$$\n", 155 | "\\begin{align}\n", 156 | "\\mathrm E[X]&=\\int_{-\\infty}^{\\infty}xf_X(x)\\mathrm dx=\\int_0^1x\\mathrm dx=\\frac{1}{2}\\\\\n", 157 | "\\mathrm E\\left[X^2\\right]&=\\int_{-\\infty}^{\\infty}x^2f_X(x)\\mathrm dx=\\int_0^1x^2\\mathrm dx=\\frac{1}{3}\\\\\n", 158 | "\\mathrm{Var}[X]&=\\mathrm E\\left[X^2\\right]-\\mathrm E[X]^2=\\frac{1}{3}-\\frac{1}{4}=\\frac{1}{12}\n", 159 | "\\end{align}\n", 160 | "$$\n", 161 | "\n", 162 | "**举例:**假设$g(x)=1\\{x\\in A\\}, A\\subseteq\\Omega$,求$\\mathrm E[g(x)]$:\n", 163 | "* 离散情况:\n", 164 | "$$\n", 165 | "\\mathrm E[g(X)]=\\sum_{x\\in Val(X)}1\\{x\\in A\\}p_X(x)=\\sum_{x\\in A}p_X(x)=P(x\\in A)\n", 166 | "$$\n", 167 | "* 连续情况:\n", 168 | "$$\n", 169 | "\\mathrm E[g(X)]=\\int_{-\\infty}^{\\infty}1\\{x\\in A\\}f_X(x)\\mathrm dx=\\int_{x\\in A}f_X(x)\\mathrm dx=P(x\\in A)\n", 170 | "$$\n", 171 | "\n", 172 | "### 2.6 一些常见的随机变量\n", 173 | "\n", 174 | "* **离散随机变量**\n", 175 | " * $X\\sim\\mathrm{Bernoulli}(p), 0\\leq p\\leq1$,即将一枚硬币面朝上的概率为$p$的硬币抛一次,观察面向上的实验。\n", 176 | " $$\n", 177 | " p(x)=\\begin{cases}p&\\textrm{if }p=1\\\\1-p&\\textrm{if }p=0\\end{cases}\n", 178 | " $$\n", 179 | " * $X\\sim\\mathrm{Binomial}(n,p), 0\\leq p\\leq1$,即将一枚面朝上概率为$p$的硬币独立的抛$n$次,观察面向上的实验。\n", 180 | " $$\n", 181 | " p(x)=\\binom{n}{k}p^x(1-p)^{n-x}\n", 182 | " $$\n", 183 | " * $X\\sim\\mathrm{Geometric}(p), p\\gt0$,即持续将一枚面朝上概率为$p$的硬币抛出,直到首次出现面向上为止,观察抛出次数的实验。\n", 184 | " $$\n", 185 | " p(x)=p(1-p)^{x-1}\n", 186 | " $$\n", 187 | " * $X\\sim\\mathrm{Poisson}(\\lambda), \\lambda\\gt0$,在非负整数上的概率分布,用于描述小概率事件在一定时长内发生的次数。\n", 188 | " $$\n", 189 | " p(x)=e^{-\\lambda}\\frac{\\lambda^x}{x!}\n", 190 | " $$\n", 191 | "* **离散随机变量**\n", 192 | " * $X\\sim\\mathrm{Uniform}(a,b),a\\lt b$,在区间$(a,b)$上概率密度处处相等的分布。\n", 193 | " $$\n", 194 | " f(x)=\\begin{cases}\\frac{1}{b-a}&\\textrm{if }a\\leq x\\leq b\\\\0&\\textrm{otherwise}\\end{cases}\n", 195 | " $$\n", 196 | " * $X\\sim\\mathrm{Exponential}(\\lambda),\\lambda\\gt0$,一种在非负实轴上呈衰减状的概率分布。\n", 197 | " $$\n", 198 | " f(x)=\\begin{cases}\\lambda e^{-\\lambda x}&\\textrm{if }x\\geq0\\\\0&\\textrm{otherwise}\\end{cases}\n", 199 | " $$\n", 200 | " * $X\\sim\\mathrm{Normal}(\\mu,\\sigma^2)$,也就是著名的高斯分布/正态分布/自然分布。\n", 201 | " $$\n", 202 | " f(x)=\\frac{1}{\\sqrt{2\\pi}\\sigma}\\exp\\left(-\\frac{1}{2\\sigma^2}(x-\\mu)^2\\right)\n", 203 | " $$\n", 204 | "\"\"\n" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": null, 210 | "metadata": { 211 | "collapsed": true 212 | }, 213 | "outputs": [], 214 | "source": [ 215 | "\\begin{align}\\end{align}" 216 | ] 217 | } 218 | ], 219 | "metadata": { 220 | "anaconda-cloud": {}, 221 | "kernelspec": { 222 | "display_name": "Python [default]", 223 | "language": "python", 224 | "name": "python3" 225 | }, 226 | "language_info": { 227 | "codemirror_mode": { 228 | "name": "ipython", 229 | "version": 3 230 | }, 231 | "file_extension": ".py", 232 | "mimetype": "text/x-python", 233 | "name": "python", 234 | "nbconvert_exporter": "python", 235 | "pygments_lexer": "ipython3", 236 | "version": "3.5.2" 237 | } 238 | }, 239 | "nbformat": 4, 240 | "nbformat_minor": 1 241 | } 242 | --------------------------------------------------------------------------------