深度学习预备知识
学习算法
机器学习(包括深度学习分支)是研究“学习算法”的门学问。所谓“学习”是指:对于某类任务和性能度量P,一个计算机程序在T上以P衡量的性能随着经验E自我完善,那么我们称这个计算机程序在从经验E学习。经验E(Experience)其实在我们的算法中就是数据;任务T(Task)就是我们建立的模型,比如说分类任务,聚类任务和回归任务等等;最后一个就是性能度量P(Performance),其实就是我们最后要对这个算法的测量,度量算法的好坏。
记录我的生活
机器学习(包括深度学习分支)是研究“学习算法”的门学问。所谓“学习”是指:对于某类任务和性能度量P,一个计算机程序在T上以P衡量的性能随着经验E自我完善,那么我们称这个计算机程序在从经验E学习。经验E(Experience)其实在我们的算法中就是数据;任务T(Task)就是我们建立的模型,比如说分类任务,聚类任务和回归任务等等;最后一个就是性能度量P(Performance),其实就是我们最后要对这个算法的测量,度量算法的好坏。
常用的降维方法,核心的数学基础就是我们常用的特征分解/奇异值分解(SVD)。
主成分分析(Principal Component Analysis, PCA)是一种统计方法。通过正交变换将一组能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。我们已可以将其看作是一种“投影”的技巧。将高维空间中的数据投影到低维空间。从这个角度来讲,主成分分析的目标就是采用何种方式(哪个方向)投影,才能够在投影之后的结果中保留尽可能多的原空间中的信息(maintains the characteristics of the original object as much as possible)。
$$
A^{*}=\lim _{a 10}\left(A^{T} A+\alpha I\right)^{-1} A^{T}
$$
$$
A^{+}=V D^{+} U^{T}
$$
我们都知道,只有方阵才有逆矩阵,换句话说非方阵(行列数不相同的矩阵)没有严格的逆矩阵。那么方阵的逆矩阵如何才能够推广到$n \times m$的矩阵呢?
首先我们在高中时期就学习过基础的概率论的内容,其中有一部分讲到了条件概率这一概念。下面我们来看一下条件概率的定义式:
$$
P(Y | X)=\frac{P(Y X)}{P(X)}
$$
它表达了在事件X发生的条件下事件Y所发生的概率。
而由条件概率公式我们就可以推出最经典的贝叶斯公式:
$$
P(X | Y)=\frac{P(X Y)}{P(Y)}=\frac{P(Y | X) P(X)}{P(Y)}
$$
下面我们可以假设X是由相互独立的事件组成的概率空间$\left\{X_{1}, X_{2}, \dots,X_{n}\right\}$,则概率$P(Y)$可以用全概率公式展开成$P(Y)=P(Y | X_{1}) P\left(X_{1}\right)+P(Y | X_{2}) P\left(X_{2}\right)+\cdots+P(Y | X_{n}) P\left(X_{n}\right)$所有可能条件下的概率的和的形式,此时贝叶斯公式可以表示为
$$
P\left(X_{i} | Y\right)=\frac{P(Y | X_{i}) P\left(X_{i}\right)}{\sum_{i=1}^{n} P(Y | X_{i}) P\left(X_{i}\right)}
$$
在贝叶斯概率中,我们经常会把$P(X | Y)$与$P(Y|X)$叫做后验概率,将$ P(X)$叫做先验概率,将$P(Y)$叫做基础概率,也叫做标准化常量(normalized constant)。先验概率的含义就是我们在日常生活中通过经验以及一系列的实验所得到的概率。
$$
A=U \Sigma V^{T}
$$
此处,$U=\left(u_{i j}\right)_{m \times m}, \Sigma=\left(\sigma_{i j}\right)_{m \times n}, V^{T}=\left(v_{i j}\right)_{n \times n}$,其中方阵U和V都是实正交矩阵(orthogonal matrix),也就是说,$U^T = U^{-1}, V^T=V^{-1}$, $\Sigma$是类对角矩阵,如下
$$
\begin{align}
\Sigma=
\begin{bmatrix}
{\sigma_{1}} & {0} & {0} & {0} & {\cdots} & {0}\\
{0} & {\ddots} & {0} & {\vdots} & {\cdots} & {0}\\
{0} & {0} & {\sigma_{r}} & {0} & {\cdots} & {0}\\
{0} & {\cdots} & {0} & {0} & {\cdots} & {0}\\
{\vdots} & {\ddots} & {\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{0} & {\cdots} & {0} & {0} & {\cdots} & {0}
\end{bmatrix}
\end{align}
$$
主对角元$\sigma_{i}>0, \quad i=1,2, \ldots, r$,且$\sigma_{r+1}=\cdots \sigma_{p}=0, \quad p=\min \{m, n\}$,称为奇异值(singular values)。注意,SVD的分解不具有唯一性。为了便于应用,我们习惯将奇异值由大到小排列:$\sigma_{1} \geq \sigma_{2} \geq \cdots \geq \sigma_{r}>0$。
在现在的研究和学习中经常会碰到非线性最优化(nonlinear optimization)的问题,这种问题在机器学习以及系统辨识领域比较常见,之前对这一类算法的原理没有学习过,这几天就在网上查找资料,并且整理了一下,争取每一步的推导都尽可能详细。这篇博客中,从前到后分别介绍了牛顿法,拟牛顿条件,秩一校正,DFP算法,BFGS算法以及其改进的L-BFGS算法,其中特别补充了BFGS算法应用Sherman-Morrison-Woodbury公式改进迭代公式的推导。
在《Modern Robotics - Mechanics, Planning and Control》一书中,对于阻抗控制与导纳控制做了比较好的总结。这篇博文就对于这两种控制的提出思路进行总结。
最近在做有关于系统辨识的内容,虽然大学的时候上过系统辨识这门课,但是当时也是囫囵吞枣,并没有深入的研究与应用。现在突然让我拿出来用,还真有点无处下手。
利用这次机会把系统辨识里边的参数估计部分好好的复习一下。(或者说重新学习… …)
题记:君子生非异也,善假于物也。
对于许多任务来说,我们很难知道应该提取哪些特征。例如我们想要编写一个程序来检测照片中的车,在这个任务重就会有很多的变差因素(factors of variation)来干扰我们辨识。例如,落在车上的阴影,车身金属零件的反光,路边的树遮挡住了车身的一部分等等。
线性规划(Linear Programming, LP)中的一种常见的经典的算法之一,而单纯型算法就是非常常用的用来解决这个问题的方法之一。
在中学的时候我们曾经简单的接触过线性规划,当时的做法基本上是在二维平面上做出图形,标出可行域,以固定斜率画直线簇。而往往最优解的地方是通过(凸)可行域的顶点。例如:
$$
\begin{aligned}
\begin{split}
\max& \quad x_3+x_4 \\
s.t.& \quad -x_3+2x_4\leq 2 \\
&\quad 3x_3-2x_4\leq 6 \\
&\quad x_3, x_4\geq 0
\end{split}
\end{aligned}
$$
在二维平面上做可行域,在平面(4,3)点处可以取得目标函数最大值。
之后我们将证明:最优解一定是可行域(凸超几何体)的顶点之一。先假设这个成立,我们使用“改进-停止”(improve-stopping)的方法,即给定一个可行域的顶点,求值,沿一条边到达下一个顶点,判断是否能够改善解,直到达到停止条件。
那么
当可以解答这些问题了之后,我们就可以大致了解单纯型算法的概要了。