机器学习与深度学习——入门自用(2.1)
前言
通过机器学习最基础的步骤,引入几个基本概念。
point:这里都是最基础的supervised learning。
一、机器学习的基本步骤
以预测场景为例,已知的数据有:不同日期对应的实际数据,要求能够预测未来某个日期的对应值
- 构建函数,设置未知参数:构建一个函数表达式,定义未知参数weight(w),bias(b)等。
- 训练数据 计算loss:机器计算得到不同数值的w,b得到的结果,与label(实际数据)计算得到loss。最后会得到一个loss(w,b)的函数。
常见的loss计算方法有MAE(绝对值之差)/ MSN(平方和之差) - Optimization:分析loss(w,b),得到loss最小的参数值。
常见方法:Gradient descent,即随机取点,根据所得点的微分与learning rate(与hyperparameters有关,人为设置,其实就是步长)更新位置,直到达到临界条件停止(达到训练次数 or 该点的微分为0)。
这里涉及到一个极小值(区域最优解)与最小值的问题。
如何构建函数表达式
现实生活中,样本形成的曲线是千变万化的,没有一种初等函数可以完全拟合实际的曲线,这里就涉及到一个Model bias的问题。但是,只要划分的区间取得足够多,一条曲线可以看作是多个piecewise linear(分段线性)叠加而后的结果。那么自然而然,可以用多个piecewise linear来拟合曲线。
常见的用来作为piecewise linearl来拟合曲线的函数是sigmoid函数或Relu函数。
以sigmoid函数为例,为了修正model bias, 可以用多个sigmoid函数叠加,来形成更近似的function。涉及多个参数wij bi ci,j代表的是样本有多个参数。可以形成以下类型的映射 ,得到线性方程,将其矩阵向量化。
纠正model bias后,对于新的function,如何进行optimization?
很明显,此时这时候loss的参数个数发生了变化,那么同样的,应该对所有的参数形成的向量进行gradient descent,根据结果,不断的更新参数,直到停止计算。
实际的操作中,样本量通常非常大,通常会分批次进行Epoch,例如10000个example,batch size=10,总共有1000个batch,而轮询1000个batch称为一个Epoch.
也就是每一个Epoch,取batch中的一个数据进行计算,计算1000个数据,update1000次。
Batch size:small batch or large batch?
刻板印象上看,large batch所需的运算时间长,update次数少,small batch 计算时间短,update次数多,方向也比较曲折。但是实际应用,考虑到GPU的平行运算,large batch并不一定比small batch的运算时间长。
另一个反直觉的是,一般来说,我们认为batch size越大,参与运算的数值就越多,计算的应该越精确,但是,在实际计算中,反而是large batch使得我们在testing和traing阶段的loss都变大了,造成这种给原因的问题是Optimization出了问题。
老师解释是,large batch可能会比small batch遇到更多的critical point的问题。而small batch尽管也会遇到critical point,但是layer多,所以当一个layer遭遇critical point,其他的layer可以起作用。
更神奇的是,small batch有可能会引发overfitting的问题,即small 和large training loss差不多,small testing loss反而比较差。
老师解释一个原因是local minima引起的,small batch遇到sharp的点倾向走向峰底,造成loss变大,但是老师也说这个解释还不是完全的被接受。
这里可以大概了解下BDG和SDG,其实就是batch size的两个极端,BDG是所有样本,SDG是随机一个样本。
综上:如何鱼与熊掌兼得……待研究,很多人在研究这个问题
二、什么是深度学习?深度学习和机器学习的关系是什么?
在数学中,除了函数叠加外,还有一个函数嵌套的概念,即让一个函数的输出作为另一个函数的入参使用,那么,如果我们再次修正函数模型,将其视为几个函数的嵌套,是否能模拟到更为准确的图像呢?选择嵌套是否比选择叠加更优?(这里后面补充)
运用嵌套的概念,我们将每一排称作layer,可以看到多个layer形成了类似神经元的图案,这种function的构建就是neural network。
而我们所谓的deep learning,无非就是many hidden layer。所以,在我理解看来,如果说机器学习是构建函数,那么深度学习就是构建函数的一种方法。(深度也不是越深越好,因为涉及到一个overfitting的问题)
在理解以上简单概念之后,那么我们就可以开始从项目开始入手学习如何通过深度学习训练数据,完成一个机器学习的项目,继而通过代码进一步理解如何优化model与optimization。