跳转至

从线性问题入门

摘要

本章将从线性问题入手,讨论最简单的分类与回归问题。我们将随机生成指定分布的数据,通过理论值,检查实验效果。这些简单的、解析的问题,可以提供读者一个直观的感受,并帮助读者快速上手Tensorflow的基本概念与运用。本章中,我们不会涉及任何数据存取、跟踪测度方面的概念,也不会将训练和测试分开,旨在使读者能集中心思到代码规范和Tensorflow的基本功能上。

漫谈线性问题

在机器学习领域,线性问题既简单也不简单。目前神经网络主要是指多层、非凸的网络结构,常常用来解复杂的、难以推导的问题。但这并不意味着线性问题容易解决。相反,在很多情况下,线性问题是解不唯一的(undetermined),解不稳定的(ill-posed/ill-conditioned),条件的(constrained)。同时,为了得到一个快速收敛的、高质量的解,即使对线性问题,人们也在不断提出、改进解法。例如ISTA, AMP, PGD, LISTA, vAMP等算法,都用来解线性问题。在此不作详细展开。

我们已经知道,一个线性函数具有可加性,和一次齐次性,亦即

\begin{align} f(x_1 + x_2) &= f(x_1) + f(x_2), \\ f(\alpha x) &= \alpha f(x). \end{align}

因此,求解一个线性问题,我们需要将问题纯粹以线性函数进行描述。例如,

\begin{align} \mathbf{y} \sim \mathbf{A}\mathbf{x}. \end{align}

具体而言,\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)”。虽然严格意义上,线性规划才是真正的线性问题,但我们在此处尚不讨论线性规划相关的内容,而是着眼于机器学习应用最普遍的两个领域,分类回归上。实际上,这两种问题虽然求解的是线性函数,但本质上是凸问题。

例如,如果我们要求解回归问题,通常可以表述成

\begin{equation} \begin{aligned} \arg \min_{\mathbf{A}}~& \sum_{i=1}^N \mathcal{L}(\mathbf{A},~\mathbf{x}_i,~\mathbf{y}_i), \\ \mathcal{L}(\mathbf{A},~\mathbf{x},~\mathbf{y}) &= \lVert \mathbf{y} - \mathbf{A}\mathbf{x} \rVert^2_2. \end{aligned} \end{equation}

虽然我们求解的模型\mathbf{A}是线性的,但我们优化的函数对象\mathcal{L}是一个凸函数 (convex function)。在此,我们可以将这个标量函数(同时也是凸函数)表述为

\begin{align} \forall~\alpha,~\beta,~\mathbf{x}_1,~\mathbf{x}_2,~\mathcal{L}(\alpha\mathbf{x}_1 + \beta\mathbf{x}_2) \leqslant \alpha\mathcal{L}(\mathbf{x}_1) + \beta\mathcal{L}(\mathbf{x}_2). \end{align}

我们将这个问题表述为最小二乘问题(Least-square problem)。正是由于\mathbf{A}是线性的,\mathcal{L}才能被确保为一个凸函数,进而,我们才能确保上述问题能得到精确的全局最小值解。

知悉Tensorflow

在本章接下来的内容里,我们将探讨Tensorflow如何求解一些简单的问题。对于初次上手的读者而言,在安装Tensorflow,亲自开始写一些project之前,笔者推荐你到这个游乐场“抢鲜体验”一番,

Tensorflow Playground

在这个在线页面里,用户不需要有任何编程知识,可以通过直观的操作界面,建立一个简单的多层感知机网络(有时也叫做Artificial Neural Network, ANN),并且实时观测网络的性能和测度。它提供了几个简单的二维数据集,供用户体验不同的数据集下,各种分类、回归问题的合宜解法。如果读者已经对神经网络的基本原理有所了解,相信能通过这个小小的实验场达到心有灵犀。我们在本章所做的project和demo,大体不跳出这个试验场的范畴,只是会略微复杂一点而已。

本章要点

下图展示了通过本章学习,能了解到的概念:

graph LR st(Hello world!) --> linclas(线性分类) linclas --> linreg(线性回归) linreg --> nonlinreg(非线性回归) nonlinreg --> ed(非线性分类) lp[感知机] --> linclas sigma[Logsitc回归] --> linclas ce[交叉熵] --> linclas opt[优化器] --> linreg argpar[项目选项] --> linreg para[参数回归] --> nonlinreg sdlayer[自定义层] --> nonlinreg kernel[核函数] --> ed classDef styStart fill:#FAE6A9,stroke:#BA9132; class st,linclas,linreg,nonlinreg,ed styStart
  • Hello world: 首先,在本节,读者将了解Tensorflow的安装方法,并编写通过第一个简单的Tensorflow程序。
  • 线性分类: 本节通过解一个简单的二分类问题,我们将引入单层感知机、Logistic回归和交叉熵的概念,并且实验结果进行可视化。
  • 线性回归: 本节通过解一个与上一节难度相仿的,简单的回归问题,另读者能对比不同优化器的性能、特点,并介绍如何在项目中进行arugument parsing(引入项目的可选项)。
  • 非线性回归: 本节将修改上一节回归问题的激活函数,将线性的回归问题推广到解析函数参数回归的范畴。同时介绍自行编写网络层(类API)的方法。
  • 非线性分类: 本节将通过上一节的参数回归,引入核函数的概念,将线性分类问题推广到非线性空间里。

评论