从线性问题入门¶
摘要
本章将从线性问题入手,讨论最简单的分类与回归问题。我们将随机生成指定分布的数据,通过理论值,检查实验效果。这些简单的、解析的问题,可以提供读者一个直观的感受,并帮助读者快速上手Tensorflow的基本概念与运用。本章中,我们不会涉及任何数据存取、跟踪测度方面的概念,也不会将训练和测试分开,旨在使读者能集中心思到代码规范和Tensorflow的基本功能上。
漫谈线性问题¶
在机器学习领域,线性问题既简单也不简单。目前神经网络主要是指多层、非凸的网络结构,常常用来解复杂的、难以推导的问题。但这并不意味着线性问题容易解决。相反,在很多情况下,线性问题是解不唯一的(undetermined),解不稳定的(ill-posed/ill-conditioned),条件的(constrained)。同时,为了得到一个快速收敛的、高质量的解,即使对线性问题,人们也在不断提出、改进解法。例如ISTA, AMP, PGD, LISTA, vAMP等算法,都用来解线性问题。在此不作详细展开。
我们已经知道,一个线性函数具有可加性,和一次齐次性,亦即
因此,求解一个线性问题,我们需要将问题纯粹以线性函数进行描述。例如,
具体而言,\mathbf{x}是我们的已知数据,\mathbf{y}是我们的未知量,我们需要找到一个合适的\mathbf{A}来确保\mathbf{x}能拟合到\mathbf{y}。如果此处\mathbf{y} \in \{0,~1\}^p是一个代表p类-分类的向量,那么这就是一个线性分类问题;相反,如果此处\mathbf{y} \in \mathbb{R}^p在连续p维空间取值,那么这就是一个线性回归问题。
线性问题与凸问题¶
请注意,虽然我们在此处提到“线性问题 (Linear problem)”,但我们指的并非“线性规划 (Linear programming)”。虽然严格意义上,线性规划才是真正的线性问题,但我们在此处尚不讨论线性规划相关的内容,而是着眼于机器学习应用最普遍的两个领域,分类和回归上。实际上,这两种问题虽然求解的是线性函数,但本质上是凸问题。
例如,如果我们要求解回归问题,通常可以表述成
虽然我们求解的模型\mathbf{A}是线性的,但我们优化的函数对象\mathcal{L}是一个凸函数 (convex function)。在此,我们可以将这个标量函数(同时也是凸函数)表述为
我们将这个问题表述为最小二乘问题(Least-square problem)。正是由于\mathbf{A}是线性的,\mathcal{L}才能被确保为一个凸函数,进而,我们才能确保上述问题能得到精确的全局最小值解。
知悉Tensorflow¶
在本章接下来的内容里,我们将探讨Tensorflow如何求解一些简单的问题。对于初次上手的读者而言,在安装Tensorflow,亲自开始写一些project之前,笔者推荐你到这个游乐场“抢鲜体验”一番,
在这个在线页面里,用户不需要有任何编程知识,可以通过直观的操作界面,建立一个简单的多层感知机网络(有时也叫做Artificial Neural Network, ANN),并且实时观测网络的性能和测度。它提供了几个简单的二维数据集,供用户体验不同的数据集下,各种分类、回归问题的合宜解法。如果读者已经对神经网络的基本原理有所了解,相信能通过这个小小的实验场达到心有灵犀。我们在本章所做的project和demo,大体不跳出这个试验场的范畴,只是会略微复杂一点而已。
本章要点¶
下图展示了通过本章学习,能了解到的概念:
- Hello world: 首先,在本节,读者将了解Tensorflow的安装方法,并编写通过第一个简单的Tensorflow程序。
- 线性分类: 本节通过解一个简单的二分类问题,我们将引入单层感知机、Logistic回归和交叉熵的概念,并且实验结果进行可视化。
- 线性回归: 本节通过解一个与上一节难度相仿的,简单的回归问题,另读者能对比不同优化器的性能、特点,并介绍如何在项目中进行arugument parsing(引入项目的可选项)。
- 非线性回归: 本节将修改上一节回归问题的激活函数,将线性的回归问题推广到解析函数参数回归的范畴。同时介绍自行编写网络层(类API)的方法。
- 非线性分类: 本节将通过上一节的参数回归,引入核函数的概念,将线性分类问题推广到非线性空间里。