学习笔记_机器学习 目录

首先,我们会从一个简单的一元函数开始 $y = a \cdot x + b$,它应该是一条直线,我们需要让这条直线尽可能的靠近我们的点数据集。

然后,我们会尝试拟合一条曲线 $y = a \cdot x^2 + b \cdot x + c$,同样的,这条曲线需要尽可能的靠近我们的点数据集。

之后,我们会拟合一个曲面 $z = a \cdot x^2 + b \cdot x^2 + c \cdot x + d \cdot y + e \cdot xy + c$,我们会尽可能的让数据集里所有的点都在这个曲面上,你会看到,梯度下降是如何在曲面上工作的。

最后,我们来考虑一个分类问题,我们有一个数据集,里面有两类点,一类在直线 $y = a \cdot x + b$ 上方,一类在直线的下方。我们要思考该如何拟合这条直线。

我们会在第五篇文章考虑一个简单的神经网络。它具有:一个输入层、一个隐藏层、一个输出层,其中:输入层有2个单元,隐藏层有3个单元、输出层有1个单元。我们会让这个神经网络去拟合之前的曲面。

在第六篇文章里,我们会思考,如何将链式求导转化为矩阵运算;我们会思考,激活函数和误差函数是如何工作的;我们还会思考,梯度消失是如何产生的,以及如何预防梯度消失。

第七篇文章,我们会实现一个简单的机器学习程序——MNIST手写数字识别。我们不想使用tensorflow或者pytorch,我们也不打算使用numpy,对,python我们也不会使用。我们要用c写,用gcc编译,最多使用makefile管理一下代码。

我们将在第八篇文章里考虑如何加速计算。首先我们会使用openmp进行计算加速,然后我们会使用openblas进行计算加速,openblas是一个高性能的线性代数计算库,它针对cpu作了很多优化,使用openblas,我们甚至可以利用AVX指令集进行加速。

第九篇文章,我们将尝试实现一个复杂一点的神经网络——MNIST手写数字生成。同样的,我们将手写这个GAN网络。然后,我们将利用上一片文章的知识,进行计算加速。